[postgis-devel] Polygon ctors again

Carl Anderson carl.anderson at vadose.org
Sat Dec 10 10:32:03 PST 2005


strk at refractions.net wrote:

>Ok, my mind came helping me.
>This is at least one of the problems:
>
>Input is two linestrings forming 2 closed rings (La,Lb):
>
>	+--La------------+
>	|                |
>	|  +-Lb-------+  |
>	|  |          |  |
>	|  +----------+  |
>	+----------------+
>
>The polygonize function (in JTS/GEOS/PostGIS) returns
>two polygons(Pa,Pb):
>
>	+--Pa_shell------+
>	|                |
>	|  +-Pa_hole--+  |
>	|  |          |  |
>	|  +----------+  |
>	+----------------+
>
>	   +-Pb_shell-+
>	   |          |
>	   +----------+ 
>
>This, as a MultiPolygon is invalid, as the two elements of the
>MultiPolygon touch.
>Topology validation error is "Self-Intersection".
>
>  
>
To convert this example into a valid MultiPolygon
take the  exterior ring of Pa  and symmetric difference it with the 
exterior ring of Pb.

<no particular language>

shp=NULL;
for (i=1; i<=numgeometries(PolygonCollection); i++) {
   if ( shp != NULL and dimension(geometryn(PolygonCollection) == 2 ) {   
      shp = symdifference(shp, 
LinearRingtoPolygon(outerring(geometryn(PolygonCollection,i))));
  } else {
      shp = LinearRingtoPolygon(outerring(geometryn(PolygonCollection,i)));
  }
}

</no particular language>

>JTS/GEOS could choose (in this specific case) to *omit* the Polygon Pb
>and return single Polygon. This would be about the same thing that
>shp2pgsql does when input is a set of closed rings.
>
>In fact, the SFSQL 1.1 specification says that input to BdPolygonFromText
>and BdMPolygonFromText *must* be a set of closed LineStrings, so the
>suggested behaviour would probably be correct in those cases.
>
>Anyway, our polygonize function has a looser requirement on input, and
>tries to give result with any input type (extracting component linework,
>and somehow sewing it).
>
>Thus, we choosed to return a GEOMETRYCOLLECTION, which is a set of
>possible polygons constructed from given input.
>
>Extracting a valid MultiPolygon from the GEOMETRYCOLLECTION would
>not be an easy task. Imagine 4 lines, the two above + other two
>with same topology just disjoint from the original. This would be
>returned as a COLLECTION of 4 polygons from Polygonize: two with
>an hole, two being the holes... what should be kept and what trashed
>by a MultiPolygon constructor ?
>
>To conclude: we'd like to add standard-defined polygon constructors,
>but the polygonize() function does not seem to cleanly address the
>OGC specification. By *requiring* closed linestrings in input
>and use the code for determining what's an hole and what's a shell
>already implemented in shp2pgsql (PIP tests, mainly) we might
>get closer. Still, return could again be invalid in case the provided
>linestrings intersect, but the OGC specs say nothing about this case.
>
>Finally, note that the current return of polygonize() could still
>be reproduced by multiple calls to the new proposed function
>(one call for the polygons-with-holes, one with holes-only and a final
>collect()) while the reverse would not be that easy.
>
>Comments welcome.
>
>--strk;
>
>
>On Sat, Dec 10, 2005 at 06:07:38PM +0100, strk at refractions.net wrote:
>  
>
>>Carl, I've been crawling my archive for this mail.
>>This is where we decided to have polygonize return a COLLECTION
>>rather then a MULTIPOLYGON due to possibly invalid returns.
>>
>>I wanted to take a closer look at this but your testcase
>>is not more online and I can't find a local copy. Do you by
>>any event have a testcase for invalid returns from polygonize ?
>>
>>We'll add a BuildPolygon(any_geometry) returning either
>>Polygon, EMPTY or MultiPolygon, but I wanted to check the
>>invalidity issue to eventually warn about this in the manual.
>>( you suggested a similar thing back in January, btw )
>>
>>TIA
>>
>>--strk;
>>    
>>




More information about the postgis-devel mailing list