oshdb icon indicating copy to clipboard operation
oshdb copied to clipboard

Incorrect geometry for Multipolygons with shells which share a single point!

Open rtroilo opened this issue 2 years ago • 0 comments

Wrong and inconsistent geometries for multipolygon with multiple outer shells which share a common node. In JTS this is a valid multipolygon. Simplified case:

   lat
    ^
    |
    4 a--d
    3 |  |
    2 b--c--e
    1    |  |
    0    g--f
      0123456 -> lon
  
   A: (a,b,c)\
              one shell (a,b,c,d,a)
   B: (c,d,a)/
  
   C: (c,e,f)\
              one shell (c,e,f,g,c)
   D: (f,g,c)/
   

Expected behaviour

Either

  • MULTIPOLYGON (((0 4, 0 2, 3 2, 3 4, 0 4)), ((3 2, 6 2, 6 0, 3 0, 3 2)))
  • MULTIPOLYGON (((3 2, 6 2, 6 0, 3 0, 3 2)), ((0 4, 0 2, 3 2, 3 4, 0 4)))
  • or similar

for different member permutations we got different results. According to the osm wiki "The order of the relation members does not matter".

ABCD - GEOMETRYCOLLECTION (LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 3 4, 0 4), LINESTRING (3 2, 6 2, 6 0), LINESTRING (6 0, 3 0, 3 2))
ABDC - GEOMETRYCOLLECTION (LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 3 4, 0 4), LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 6 2, 6 0))
ACBD - GEOMETRYCOLLECTION (LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 6 2, 6 0), LINESTRING (3 2, 3 4, 0 4), LINESTRING (6 0, 3 0, 3 2))
ACDB - POLYGON ((0 4, 0 2, 3 2, 6 2, 6 0, 3 0, 6 0, 3 4, 0 4))
ADBC - GEOMETRYCOLLECTION (LINESTRING (0 4, 0 2, 3 2), LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 3 4, 0 4), LINESTRING (3 2, 6 2, 6 0))
ADCB - POLYGON ((0 4, 0 2, 3 2, 3 0, 6 0, 6 2, 6 0, 3 4, 0 4))

BACD - GEOMETRYCOLLECTION (LINESTRING (3 2, 3 4, 0 4), LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 6 2, 6 0), LINESTRING (6 0, 3 0, 3 2))
BADC - GEOMETRYCOLLECTION (LINESTRING (3 2, 3 4, 0 4), LINESTRING (0 4, 0 2, 3 2), LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 6 2, 6 0))
BCAD - GEOMETRYCOLLECTION (LINESTRING (3 2, 3 4, 0 4), LINESTRING (3 2, 6 2, 6 0), LINESTRING (0 4, 0 2, 3 2), LINESTRING (6 0, 3 0, 3 2))
BDAC - GEOMETRYCOLLECTION (LINESTRING (3 2, 3 4, 0 4), LINESTRING (6 0, 3 0, 3 2), LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 6 2, 6 0))
BDCA - GEOMETRYCOLLECTION (LINESTRING (3 2, 3 4, 0 4), LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 6 2, 6 0), LINESTRING (0 4, 0 2, 3 2))
BCDA - GEOMETRYCOLLECTION (LINESTRING (3 2, 3 4, 0 4), LINESTRING (3 2, 6 2, 6 0), LINESTRING (6 0, 3 0, 3 2), LINESTRING (0 4, 0 2, 3 2))

CABD - GEOMETRYCOLLECTION (LINESTRING (3 2, 6 2, 6 0), LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 3 4, 0 4), LINESTRING (6 0, 3 0, 3 2))
CADB - GEOMETRYCOLLECTION (LINESTRING (3 2, 6 2, 6 0), LINESTRING (0 4, 0 2, 3 2), LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 3 4, 0 4))
CBAD - GEOMETRYCOLLECTION (LINESTRING (3 2, 6 2, 6 0), LINESTRING (3 2, 3 4, 0 4), LINESTRING (0 4, 0 2, 3 2), LINESTRING (6 0, 3 0, 3 2))
CBDA - GEOMETRYCOLLECTION (LINESTRING (3 2, 6 2, 6 0), LINESTRING (3 2, 3 4, 0 4), LINESTRING (6 0, 3 0, 3 2), LINESTRING (0 4, 0 2, 3 2))
CDAB - GEOMETRYCOLLECTION (LINESTRING (3 2, 6 2, 6 0), LINESTRING (6 0, 3 0, 3 2), LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 3 4, 0 4))
CDBA - GEOMETRYCOLLECTION (LINESTRING (3 2, 6 2, 6 0), LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 3 4, 0 4), LINESTRING (0 4, 0 2, 3 2))

DABC - POLYGON ((6 0, 3 0, 3 2, 0 2, 0 4, 3 4, 0 4, 6 2, 6 0))
DACB - GEOMETRYCOLLECTION (LINESTRING (6 0, 3 0, 3 2), LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 6 2, 6 0), LINESTRING (3 2, 3 4, 0 4))
DBAC - POLYGON ((6 0, 3 0, 3 2, 3 4, 0 4, 0 2, 0 4, 6 2, 6 0))
DBCA - GEOMETRYCOLLECTION (LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 3 4, 0 4), LINESTRING (3 2, 6 2, 6 0), LINESTRING (0 4, 0 2, 3 2))
DCAB - GEOMETRYCOLLECTION (LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 6 2, 6 0), LINESTRING (0 4, 0 2, 3 2), LINESTRING (3 2, 3 4, 0 4))
DCBA - GEOMETRYCOLLECTION (LINESTRING (6 0, 3 0, 3 2), LINESTRING (3 2, 6 2, 6 0), LINESTRING (3 2, 3 4, 0 4), LINESTRING (0 4, 0 2, 3 2))

rtroilo avatar Aug 28 '21 13:08 rtroilo