From f97e8bb2b2e3944ca36a28f8ce91707e41b42b32 Mon Sep 17 00:00:00 2001 From: mhugent Date: Fri, 25 Aug 2006 07:11:49 +0000 Subject: [PATCH] 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 --- src/core/qgsgeometry.cpp | 45 ++++++++++++++++++++++++++++++++++++++++ src/core/qgsgeometry.h | 3 +++ 2 files changed, 48 insertions(+) diff --git a/src/core/qgsgeometry.cpp b/src/core/qgsgeometry.cpp index 1d27ebb0354f..c46d02f01605 100644 --- a/src/core/qgsgeometry.cpp +++ b/src/core/qgsgeometry.cpp @@ -2088,6 +2088,51 @@ bool QgsGeometry::intersects(QgsRect* r) const return returnval; } +bool QgsGeometry::fast_intersects(const QgsRect* r) const +{ + bool returnval=false; + + //use the geos export of QgsGeometry + geos::Geometry *geosGeom = geosGeometry(); + + //write the selection rectangle to wkt by hand + QString rectwkt="POLYGON(("; + rectwkt+=QString::number(r->xMin(),'f',3); + rectwkt+=" "; + rectwkt+=QString::number(r->yMin(),'f',3); + rectwkt+=","; + rectwkt+=QString::number(r->xMax(),'f',3); + rectwkt+=" "; + rectwkt+=QString::number(r->yMin(),'f',3); + rectwkt+=","; + rectwkt+=QString::number(r->xMax(),'f',3); + rectwkt+=" "; + rectwkt+=QString::number(r->yMax(),'f',3); + rectwkt+=","; + rectwkt+=QString::number(r->xMin(),'f',3); + rectwkt+=" "; + rectwkt+=QString::number(r->yMax(),'f',3); + rectwkt+=","; + rectwkt+=QString::number(r->xMin(),'f',3); + rectwkt+=" "; + rectwkt+=QString::number(r->yMin(),'f',3); + rectwkt+="))"; + geos::GeometryFactory *gf = new geos::GeometryFactory(); + geos::WKTReader *wktReader = new geos::WKTReader(gf); + geos::Geometry *geosRect = wktReader->read( qstrdup(rectwkt) ); + + if(geosGeom->intersects(geosRect)) + { + returnval=true; + } + + delete geosGeom; + delete geosRect; + delete gf; + delete wktReader; + return returnval; +} + bool QgsGeometry::contains(QgsPoint* p) const { diff --git a/src/core/qgsgeometry.h b/src/core/qgsgeometry.h index 96ed1ff54ee7..595ea6d6ac20 100644 --- a/src/core/qgsgeometry.h +++ b/src/core/qgsgeometry.h @@ -181,6 +181,9 @@ class QgsGeometry { /** Test for intersection with a rectangle (uses GEOS) */ bool intersects(QgsRect* r) const; + /**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*/ + bool fast_intersects(const QgsRect* r) const; + /** Test for containment of a point (uses GEOS) */ bool contains(QgsPoint* p) const;