Skip to content

Commit f97e8bb

Browse files
author
mhugent
committed
added a method QgsGeometry::fast_intersect. This method does the same as QgsGeometry::intersect, but it uses direct generation of geos geometry with QgsGeometry::geosGeometry(). In contrast, QgsGeometry::intersect uses wkt export of QgsGeometry and wkb import of geos. Therefore it is slower than fast_intersect (but better tested). After 0.8, QgsGeometry::fast_intersect may replace QgsGeometry::intersect
git-svn-id: http://svn.osgeo.org/qgis/trunk@5736 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 10ea5eb commit f97e8bb

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

src/core/qgsgeometry.cpp

+45
Original file line numberDiff line numberDiff line change
@@ -2088,6 +2088,51 @@ bool QgsGeometry::intersects(QgsRect* r) const
20882088
return returnval;
20892089
}
20902090

2091+
bool QgsGeometry::fast_intersects(const QgsRect* r) const
2092+
{
2093+
bool returnval=false;
2094+
2095+
//use the geos export of QgsGeometry
2096+
geos::Geometry *geosGeom = geosGeometry();
2097+
2098+
//write the selection rectangle to wkt by hand
2099+
QString rectwkt="POLYGON((";
2100+
rectwkt+=QString::number(r->xMin(),'f',3);
2101+
rectwkt+=" ";
2102+
rectwkt+=QString::number(r->yMin(),'f',3);
2103+
rectwkt+=",";
2104+
rectwkt+=QString::number(r->xMax(),'f',3);
2105+
rectwkt+=" ";
2106+
rectwkt+=QString::number(r->yMin(),'f',3);
2107+
rectwkt+=",";
2108+
rectwkt+=QString::number(r->xMax(),'f',3);
2109+
rectwkt+=" ";
2110+
rectwkt+=QString::number(r->yMax(),'f',3);
2111+
rectwkt+=",";
2112+
rectwkt+=QString::number(r->xMin(),'f',3);
2113+
rectwkt+=" ";
2114+
rectwkt+=QString::number(r->yMax(),'f',3);
2115+
rectwkt+=",";
2116+
rectwkt+=QString::number(r->xMin(),'f',3);
2117+
rectwkt+=" ";
2118+
rectwkt+=QString::number(r->yMin(),'f',3);
2119+
rectwkt+="))";
2120+
geos::GeometryFactory *gf = new geos::GeometryFactory();
2121+
geos::WKTReader *wktReader = new geos::WKTReader(gf);
2122+
geos::Geometry *geosRect = wktReader->read( qstrdup(rectwkt) );
2123+
2124+
if(geosGeom->intersects(geosRect))
2125+
{
2126+
returnval=true;
2127+
}
2128+
2129+
delete geosGeom;
2130+
delete geosRect;
2131+
delete gf;
2132+
delete wktReader;
2133+
return returnval;
2134+
}
2135+
20912136

20922137
bool QgsGeometry::contains(QgsPoint* p) const
20932138
{

src/core/qgsgeometry.h

+3
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ class QgsGeometry {
181181
/** Test for intersection with a rectangle (uses GEOS) */
182182
bool intersects(QgsRect* r) const;
183183

184+
/**Also tests for intersection, but uses direct geos export of QgsGeometry instead wkb export and geos wkb import. Therefore this method is faster and could replace QgsGeometry::intersects in the future*/
185+
bool fast_intersects(const QgsRect* r) const;
186+
184187
/** Test for containment of a point (uses GEOS) */
185188
bool contains(QgsPoint* p) const;
186189

0 commit comments

Comments
 (0)