[postgis-users] unable to assign hole to a shell

Kevin Neufeld kneufeld at refractions.net
Mon Sep 17 10:27:40 PDT 2007


Martin Davis wrote:
>>  
>>> I was able to rebuild your polygon this way:
>>> 1. extract the exterior ring - you may want to add to this subquery all
>>> the interior rings if you have any
>>> 2. extract all the points of the ext ring as ordered pairs (ie as
>>> point1-point2, point2-point3, point3-point4, ....)
>>> 3. recreate line segments from all these ordered point pairs, removing
>>> duplicates.
>>> 4. rebuild the polygon using st_buildarea()
>>>     
>>
>> Would this trick work on every polygon? By construction my polygons 
>> have no interior ring.
>>   
> Knowing that you have no holes definitely helps.
>
> Another thing you might be able to try is to:
> - convert the polygon to a linestring
> - call intersection on it with a single point from the linestring 
> (this effectively nodes the linework)
> - polyognize the resulting linework back to a polygon  
Nice. You mean union, not intersection though, right Martin? Because the 
intersection of a point and a line is a point. 

This is better than my solution cuz generate_series actually has issues 
when the number of points in a line is more than a few thousand 
(probably due to internal storage and toast tables).

So, your query would become:
SELECT ST_BuildArea(geom) AS geom
FROM
(
   -- Re-node the linear ring
   SELECT St_Union(geom, St_Startpoint(geom)) AS geom
   FROM
   (
      -- The exterior ring of your polygon
      SELECT ST_ExteriorRing(
        'POLYGON((
            9.50351715087891 47.3943328857422,
            9.50386047363281 47.3943328857422,
            9.50351715087891 47.3943328857422,
            9.50248718261719 47.3943328857422,
            9.50214385986328 47.3939895629883,
            9.50180053710938 47.3943328857422,
            9.50145721435547 47.3939895629883,
            9.50111389160156 47.3936462402344,
            9.50145721435547 47.3936462402344,
            9.50145721435547 47.3939895629883,
            9.50214385986328 47.3939895629883,
            9.50248718261719 47.3939895629883,
            9.50386047363281 47.3943328857422,
            9.50351715087891 47.3943328857422))'::geometry) AS geom
   ) AS ring
) AS fixed_ring

-- Kevin

-------------
Kevin Neufeld
Software Developer
Refractions Research Inc.
300-1207 Douglas St.
Victoria, B.C., V8W 2E7

Phone: (250) 383-3022
Email: kneufeld at refractions.net




More information about the postgis-users mailing list