From 60f7822a6e46af1b651260ca18472661f507cbdb Mon Sep 17 00:00:00 2001 From: wonder Date: Fri, 10 Nov 2006 21:36:37 +0000 Subject: [PATCH] Fixed a crash occuring with identify tool which was caused by GEOS throwing TopologyException. This exception might be thrown when GEOS has problems with calculating intersection. git-svn-id: http://svn.osgeo.org/qgis/trunk@6071 c8812cc2-4d05-0410-92ff-de0c093fc19c --- src/core/qgsgeometry.cpp | 24 ++++++++++++++++++++---- src/providers/ogr/qgsogrprovider.cpp | 15 ++++++++++++++- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/core/qgsgeometry.cpp b/src/core/qgsgeometry.cpp index b4c7e26e4e7f..f3137bd99e6c 100644 --- a/src/core/qgsgeometry.cpp +++ b/src/core/qgsgeometry.cpp @@ -2076,9 +2076,17 @@ bool QgsGeometry::intersects(QgsRect* r) const rectwkt+="))"; geos::Geometry *geosRect = wktReader->read( qstrdup(rectwkt) ); - if(geosGeom->intersects(geosRect)) + try // geos might throw exception on error { - returnval=true; + if(geosGeom->intersects(geosRect)) + { + returnval=true; + } + } + catch (geos::TopologyException* e) + { + QString error = e->toString().c_str(); + QgsLogger::warning("GEOS: " + error); } delete geosGeom; @@ -2121,9 +2129,17 @@ bool QgsGeometry::fast_intersects(const QgsRect* r) const geos::WKTReader *wktReader = new geos::WKTReader(gf); geos::Geometry *geosRect = wktReader->read( qstrdup(rectwkt) ); - if(geosGeom->intersects(geosRect)) + try // geos might throw exception on error + { + if(geosGeom->intersects(geosRect)) + { + returnval=true; + } + } + catch (geos::TopologyException* e) { - returnval=true; + QString error = e->toString().c_str(); + QgsLogger::warning("GEOS: " + error); } delete geosGeom; diff --git a/src/providers/ogr/qgsogrprovider.cpp b/src/providers/ogr/qgsogrprovider.cpp index a8693df1095e..d7730d6e25c0 100644 --- a/src/providers/ogr/qgsogrprovider.cpp +++ b/src/providers/ogr/qgsogrprovider.cpp @@ -423,7 +423,20 @@ QgsFeature *QgsOgrProvider::getNextFeature(bool fetchAttributes) mSelectionRectangle->exportToWkt(&sWkt); geos::Geometry *geosRect = wktReader->read(sWkt); assert(geosRect != 0); - if(geosGeom->intersects(geosRect)) + bool intersection = false; + + try // geos might throw exception on error + { + if(geosGeom->intersects(geosRect)) + intersection = true; + } + catch (geos::TopologyException* e) + { + QString error = e->toString().c_str(); + QgsLogger::warning("GEOS: " + error); + } + + if (intersection) { QgsDebugMsg("intersection found"); delete[] sWkt;