[postgis-tickets] [PostGIS] #4943: st_equals fails on invalid geometry with GEOS error

PostGIS trac at osgeo.org
Wed Jul 7 01:30:41 PDT 2021


#4943: st_equals fails on invalid geometry with GEOS error
--------------------------------------+---------------------------
 Reporter:  mschott                   |      Owner:  pramsey
     Type:  defect                    |     Status:  new
 Priority:  medium                    |  Milestone:  PostGIS 3.1.3
Component:  postgis                   |    Version:  3.1.x
 Keywords:  st_equals, GEOS, invalid  |
--------------------------------------+---------------------------
 To my understanding the documentation of `st_equals` implies that it can
 handle (any) invalid geometry:

 `This function will return false if either geometry is invalid except in
 the case where they are binary equal.`

 It does well for some invalidities but yet it seems there are some
 invalidities it cannot handle (`ERROR: GEOSEquals: TopologyException: side
 location conflict at`):

 (Please excuse the complex geometries, that is what I have at hand.)


 {{{
 WITH geoms AS (
     SELECT
         st_geomfromtext('MULTIPOLYGON(((14.711908999999999
 46.175287799999985,14.7119403 46.17528399999999,14.712043699999999
 46.17527129999999,14.712023999999998 46.17515749999998,14.711904699999998
 46.1748776,14.711897200000001 46.17485999999999,14.7119029
 46.174857499999995,14.711919700000001 46.1748503,14.711959199999997
 46.174827,14.7120661 46.174817499999996,14.7120608
 46.174768599999986,14.7122971 46.174734,14.712238999999999
 46.174561999999995,14.712192000000002 46.17439979999999,14.7121222
 46.1741564,14.712056299999997 46.174006000000006,14.7120263
 46.17394689999999,14.7120451 46.1739321,14.712129399999998
 46.173891399999995,14.7122754 46.17383729999999,14.712357299999999
 46.173807599999996,14.7123322 46.173750899999995,14.712368999999999
 46.1737399,14.7123427 46.17366809999999,14.7121531
 46.17327459999999,14.712130499999999 46.17324029999999,14.7120963
 46.17324879999999,14.7119517 46.17325830000001,14.711925999999998
 46.173229500000005,14.7120755 46.173199499999996,14.712074200000002
 46.1730594,14.712032899999999 46.1730325,14.712009499999999
 46.172948899999994,14.7119561 46.172940999999994,14.7118971
 46.1728275,14.7117781 46.1728756,14.711801000000001
 46.17292769999999,14.7117356 46.172946299999985,14.711682000000001
 46.1729615,14.711538399999998 46.1727602,14.7115076
 46.17272059999999,14.711494799999997 46.17270499999999,14.7114768
 46.17268289999999,14.711366600000002 46.1725103,14.711145799999999
 46.17216689999999,14.711139699999999 46.17212899999999,14.7111287
 46.17207719999999,14.711133 46.17205119999999,14.7112039
 46.17201279999999,14.7113616 46.1719598,14.7113496
 46.17185769999999,14.7113159 46.171853699999986,14.711257
 46.1718184,14.711195499999999 46.171753800000005,14.711153800000002
 46.17168949999999,14.711139600000001 46.1716931,14.7109884
 46.171721600000005,14.710844199999997 46.1717354,14.710749999999999
 46.1717489,14.7108627 46.17196779999999,14.710812299999999
 46.171982400000005,14.710813799999999 46.17199859999999,14.7108034
 46.172016499999984,14.710631500000002 46.1720903,14.710596400000002
 46.1720921,14.7105497 46.17212920000001,14.710518599999997
 46.1721529,14.710184799999999 46.1722633,14.7100399
 46.1723096,14.709667300000001 46.172414499999995,14.7092561
 46.172506799999994,14.7089821 46.17255459999999,14.708867
 46.17257,14.7088886 46.1726602,14.7089738
 46.172674799999996,14.709225799999999 46.17269699999999,14.7093456
 46.1727044,14.709396000000002 46.172713599999994,14.709478399999998
 46.1727371,14.709643499999997 46.17275359999999,14.7098084
 46.1727917,14.709956900000002 46.172876499999994,14.7100807
 46.172921599999995,14.710359200000001
 46.173070899999985,14.710397599999999 46.17311939999999,14.710477099999999
 46.17321639999999,14.710693099999997 46.17335499999999,14.7108192
 46.17342699999998,14.710888599999997 46.1734621,14.7109351
 46.1734667,14.711037699999999 46.17343909999999,14.711065699999999
 46.173454799999995,14.710973599999999 46.1734991,14.710882400000001
 46.1735696,14.710893599999999 46.173603,14.7109552
 46.17364339999999,14.711024300000002 46.173689200000005,14.711145599999998
 46.17376949999999,14.711179399999997 46.173854000000006,14.7112159
 46.17405539999999,14.7112336 46.17416419999999,14.711363899999998
 46.174357099999995,14.7113994 46.174346999999976,14.7114614
 46.17431789999999,14.7115851 46.174326,14.711647099999997
 46.174296799999986,14.711803199999999 46.1745492,14.711628699999999
 46.17458909999999,14.711710699999998 46.17476070000001,14.711728899999999
 46.1747593,14.7118483 46.175072799999995,14.711825999999999
 46.17514149999999,14.711859599999999 46.1752496,14.7119036
 46.17524869999999,14.711908999999999
 46.175287799999985),(14.711754799999998 46.17316590000001,14.7118191
 46.17324839999999,14.711830099999998 46.17329750000001,14.7117808
 46.1733315,14.711769900000002 46.173338500000014,14.711719999999998
 46.17337089999999,14.7115953 46.173447299999985,14.7115415
 46.1734717,14.711524599999999 46.173471699999986,14.711439299999997
 46.17342929999999,14.7113556 46.17338719999999,14.7112634
 46.173338199999996,14.711184900000001 46.17326829999999,14.711171499999999
 46.17323090000001,14.711110399999999 46.173115900000006,14.7110679
 46.1730466,14.711295999999999 46.1729729,14.711145299999998
 46.17276739999999,14.7114072 46.1726841,14.711466
 46.172779699999985,14.711578799999998
 46.172939699999986,14.711754799999998 46.17316590000001)))') AS a,
         st_geomfromtext('MULTIPOLYGON(((14.711909 46.1752878,14.7119403
 46.175284,14.7120437 46.1752713,14.712024 46.1751575,14.7119047
 46.1748776,14.7118972 46.17486,14.7119029 46.1748575,14.7119197
 46.1748503,14.7119592 46.174827,14.7120661 46.1748175,14.7120608
 46.1747686,14.7122971 46.174734,14.712239 46.174562,14.712192
 46.1743998,14.7121222 46.1741564,14.7120563 46.174006,14.7120263
 46.1739469,14.7120451 46.1739321,14.7121294 46.1738914,14.7122754
 46.1738373,14.7123573 46.1738076,14.7123322 46.1737509,14.712369
 46.1737399,14.7123427 46.1736681,14.7121531 46.1732746,14.7121305
 46.1732403,14.7120963 46.1732488,14.7119517 46.1732583,14.711926
 46.1732295,14.7120755 46.1731995,14.7120742 46.1730594,14.7120329
 46.1730325,14.7120095 46.1729489,14.7119561 46.172941,14.7118971
 46.1728275,14.7117781 46.1728756,14.711801 46.1729277,14.7117356
 46.1729463,14.711682 46.1729615,14.7115384 46.1727602,14.7115076
 46.1727206,14.7114948 46.172705,14.7114768 46.1726829,14.7113666
 46.1725103,14.7111458 46.1721669,14.7111397 46.172129,14.7111287
 46.1720772,14.711133 46.1720512,14.7112039 46.1720128,14.7113616
 46.1719598,14.7113496 46.1718577,14.7113159 46.1718537,14.711257
 46.1718184,14.7111955 46.1717538,14.7111538 46.1716895,14.7111396
 46.1716931,14.7109884 46.1717216,14.7108442 46.1717354,14.71075
 46.1717489,14.7108627 46.1719678,14.7108123 46.1719824,14.7108138
 46.1719986,14.7108034 46.1720165,14.7106315 46.1720903,14.7105964
 46.1720921,14.7105497 46.1721292,14.7105186 46.1721529,14.7101848
 46.1722633,14.7100399 46.1723096,14.7096673 46.1724145,14.7092561
 46.1725068,14.7089821 46.1725546,14.708867 46.17257,14.7088886
 46.1726602,14.7089738 46.1726748,14.7092258 46.172697,14.7093456
 46.1727044,14.709396 46.1727136,14.7094784 46.1727371,14.7096435
 46.1727536,14.7098084 46.1727917,14.7099569 46.1728765,14.7100807
 46.1729216,14.7103592 46.1730709,14.7103976 46.1731194,14.7104771
 46.1732164,14.7106931 46.173355,14.7108192 46.173427,14.7108886
 46.1734621,14.7109351 46.1734667,14.7110377 46.1734391,14.7110657
 46.1734548,14.7109736 46.1734991,14.7108824 46.1735696,14.7108936
 46.173603,14.7109552 46.1736434,14.7110243 46.1736892,14.7111456
 46.1737695,14.7111794 46.173854,14.7112159 46.1740554,14.7112336
 46.1741642,14.7113639 46.1743571,14.7113994 46.174347,14.7114614
 46.1743179,14.7115851 46.174326,14.7116471 46.1742968,14.7118032
 46.1745492,14.7116287 46.1745891,14.7117107 46.1747607,14.7117289
 46.1747593,14.7118483 46.1750728,14.711826 46.1751415,14.7118596
 46.1752496,14.7119036 46.1752487,14.711909 46.1752878),(14.7117808
 46.1733315,14.7118301 46.1732975,14.7118191 46.1732484,14.7117548
 46.1731659,14.7117684 46.1733204,14.7117699 46.1733385,14.7117808
 46.1733315),(14.711296 46.1729729,14.7110679 46.1730466,14.7111104
 46.1731159,14.7111715 46.1732309,14.7111849 46.1732683,14.7112634
 46.1733382,14.7113556 46.1733872,14.7114393 46.1734293,14.7115246
 46.1734717,14.7115415 46.1734717,14.7115953 46.1734473,14.71172
 46.1733709,14.7117699 46.1733385,14.7117684 46.1733204,14.7117548
 46.1731659,14.7115788 46.1729397,14.711466 46.1727797,14.7114072
 46.1726841,14.7111453 46.1727674,14.711296 46.1729729)))') AS b
 )
 SELECT
     st_isvalid(a),
     st_isvalid(b),
     st_isvalid(st_snaptogrid(a,0.0000001)),
     st_isvalid(st_snaptogrid(b,0.0000001)),
     st_equals(a,b)
     --,st_equals(st_snaptogrid(a,0.0000001),st_snaptogrid(b,0.0000001))
 --this line will fail with ERROR: GEOSEquals: TopologyException: side
 location conflict at 14.7117548 46.173165900000001
 FROM
     geoms;
 }}}

 Side note: The st_snaptogrid is necessary for me as some geometries that
 are in fact equal are perceived as not equal due to rounding errors.

-- 
Ticket URL: <https://trac.osgeo.org/postgis/ticket/4943>
PostGIS <http://trac.osgeo.org/postgis/>
The PostGIS Trac is used for bug, enhancement & task tracking, a user and developer wiki, and a view into the subversion code repository of PostGIS project.


More information about the postgis-tickets mailing list