[geos-devel] no outgoing dirEdge found error
Martin Davis
mbdavis at refractions.net
Wed Sep 19 14:55:25 EDT 2007
This computation works fine in the current version of JTS. This may
indicate a porting bug in GEOS, or a slightly different choice of
tolerances.
This is a classic case which causes robustness problems - overlaying two
geometries with linework which is almost coincident.
The only suggestion I can make is to reduce the precision of your data
slightly in cases which fail. Presumably your source data isn't
actually accurate to 16 decimal places? It could be a while before we
can look at the GEOS code for this.
Stuart C Sides wrote:
>
> Hi GEOS devels,
>
> We are writing a C++ application which is looking for areas of overlap
> between 1000's of polygons. The app is being
> developed on Linux with g++ 4.1.0.
>
> We first tried the stable release of GEOS 2.2.3 and received this
> error after processing several polygons:
>
> TopologyException: found non-noded intersection between 87.9595
> -40.3145, 87.9484 -40.2598 and 87.9857 -40.3126, 87.9575 -40.3146
> 87.9595 -40.3145
>
> While reviewing the list archives we found references to major code
> changes that might fix some of these errors, so we
> upgraded to RC3 and eventually to an SVN version from 2007-09-18. We
> got through a lot more polygons without errors,
> but finally received this error:
>
> TopologyException: no outgoing dirEdge found 87.957 -40.1615
>
> Note: this coordinate is from the first segment of the second polygon
> of the first multi-polygon below.
>
> In the original code, before I converted the multipolygons to strings
> to create the example, we received this error:
>
> TopologyException: no outgoing dirEdge found 87.7184 -40.3315
>
> Note: this coordinate is from the first segment of the second
> multi-polygon below:
>
> I've boiled the error down to just a few lines of code, and would
> appreciate any suggestions. The error is thrown at the
> difference.
>
> Thanks
> Stuart
>
>
>
> #include <string>
> #include <iostream>
>
> #include <geos/geom/PrecisionModel.h>
> #include <geos/geom/GeometryFactory.h>
> #include <geos/geom/Geometry.h>
> #include <geos/geom/MultiPolygon.h>
> #include <geos/io/WKTReader.h>
>
> int main (int argc, char *argv[])
> {
> std::string mp1s = "MULTIPOLYGON (((88.0541300495810049
> -40.3914336120775417,"
> " 88.0013586636740683 -40.3952580652168507,"
> " 87.9856522556763849 -40.3125682141688557,"
> " 88.0410955427405639 -40.3084853410231361,"
> " 88.0447770149226727 -40.3320733430391556,"
> " 88.0541300495810049 -40.3914336120775417)),"
> " ((87.9569549228361041 -40.1614847724049824,"
> " 87.9856522556763849 -40.3125682141688557,"
> " 87.9594803530699494 -40.3144955269957563,"
> " 87.9484023890450430 -40.2597855714132962,"
> " 87.9236385364479673 -40.1638760511710515,"
> " 87.9569549228361041 -40.1614847724049824)))";
>
> std::string mp2s = "MULTIPOLYGON (((87.7184147523609425
> -40.3314878875577705,"
> " 87.7106409229361930 -40.2916861830969211,"
> " 87.6363928113999862 -39.9074815079801084,"
> " 87.8588765594887349 -39.8933226300382628,"
> " 88.3245648150878964 -39.8616404104367064,"
> " 88.3252910982550503 -39.8653834273614933,"
> " 88.4058355104796334 -40.2774282017416283,"
> " 88.4066631207306273 -40.2815647501607259,"
> " 87.9574816223991007 -40.3146427145853394,"
> " 87.7184147523609425 -40.3314878875577705)))";
>
> try {
> geos::geom::PrecisionModel *model =
> new
> geos::geom::PrecisionModel(geos::geom::PrecisionModel::FLOATING);
> geos::geom::GeometryFactory *factory = new
> geos::geom::GeometryFactory(model);
>
> geos::io::WKTReader *wkt = new geos::io::WKTReader();
> geos::geom::MultiPolygon *mp1 = (geos::geom::MultiPolygon
> *)wkt->read(mp1s);
> geos::geom::MultiPolygon *mp2 = (geos::geom::MultiPolygon
> *)wkt->read(mp2s);
>
> std::cout << "Is valid of one = " << mp1->isValid() << std::endl;
> std::cout << "Is valid of two = " << mp2->isValid() << std::endl;
>
> geos::geom::Geometry *diff = mp1->difference(mp2);
>
> std::cout << mp1->toString() << std::endl;
> std::cout << mp2->toString() << std::endl;
> std::cout << diff->toString() << std::endl;
>
> }
> catch (std::exception const &se) {
> std::cout << "ERROR - " << se.what() << std::endl;
> }
> catch (...) {
> std::cout << "General error" << std::endl;
> }
>
> }
> ------------------------------------------------------------------------
>
> _______________________________________________
> geos-devel mailing list
> geos-devel at geos.refractions.net
> http://geos.refractions.net/mailman/listinfo/geos-devel
>
--
Martin Davis
Senior Technical Architect
Refractions Research, Inc.
(250) 383-3022
More information about the geos-devel
mailing list