[postgis-users] Difficult Problem with Polygons
Nicolas Ribot
nicolas.ribot at gmail.com
Mon Oct 29 09:23:43 PDT 2012
You should filter out the consecutive points. If there are more than 2
points, you can then call st_convexHull() on the point set:
with points as (
select 'POINT (0 0)'::geometry as geom
UNION
select 'POINT (1 0)'::geometry as geom
UNION
select 'POINT (1 1)'::geometry as geom
) select st_convexHull(st_collect(geom))
from points;
If the points are aligned, convexHull will be a linestring, that you
can discard or further process according to your needs.
Nicolas
On 29 October 2012 16:51, Ed Linde <edolinde at gmail.com> wrote:
> Hi Nicolas,
> It seems like sometimes the points are one and the same and I get
> linestrings and not
> actual polygons. I pass these points in from a perl script, so is there a
> way I can just
> give the raw x,y,z coordinates of these points and do a st_convexhull
> function on them?
> Could you please give me a small example?
>
> I tried something like:
> The two coordinates marked in red and marked in orange are the same.
>
> bounds=# insert into vfaces values (1,
> bounds(# ST_GeomFromText('POLYGON((593901 5219610 814,593901 5219610
> 814,593899 5219610 814,593899 5219610 814,593901 5219610 814))') );
> INSERT 0 1
> bounds=# select st_isvalid(geomtext) from vfaces;
> NOTICE: Too few points in geometry component at or near point 593901
> 5219610 814
>
> st_isvalid
> ------------
> f
> (1 row)
>
> Thanks,
> Ed
>
>
>
>
> On Mon, Oct 29, 2012 at 4:26 PM, Ed Linde <edolinde at gmail.com> wrote:
>>
>> Ok thanks, will look into that function. Because I wonder if the s/w I am
>> using is
>> actually outputting the vertices of each face in a cyclical fashion or
>> just
>> arbitrarily.
>>
>> Cheers,
>> Ed
>>
>>
>> On Mon, Oct 29, 2012 at 4:23 PM, Nicolas Ribot <nicolas.ribot at gmail.com>
>> wrote:
>>>
>>> Yes, it looks like some points were not put in the right order before
>>> building a polygon, thus these "butterfly" polygons you generated.
>>> If the formed polygon are expected to be convex, you could use
>>> st_convexhull on the point cloud to generate the polygons.
>>>
>>> On 29 October 2012 16:09, Ed Linde <edolinde at gmail.com> wrote:
>>> > Thanks Nicolas! Will look at the script that generated the polygon
>>> > text..
>>> > must have goofed something up there.
>>> >
>>> >
>>> > On Mon, Oct 29, 2012 at 4:05 PM, Nicolas Ribot
>>> > <nicolas.ribot at gmail.com>
>>> > wrote:
>>> >>
>>> >> Hi,
>>> >>
>>> >> No. this is because some of your polygons are not valid:
>>> >> for instance:
>>> >> select st_isvalid('POLYGON ((593921 5219610 803,593921 5219610
>>> >> 818,593921 5219620 818,593921 5219620 803,593921 5219610
>>> >> 803))'::geometry);
>>> >> NOTICE: Too few points in geometry component at or near point 593921
>>> >> 5219610 803
>>> >> st_isvalid
>>> >> ------------
>>> >> f
>>> >> (1 row)
>>> >>
>>> >> you can control this with st_isvalid, st_isvalidReason and correct
>>> >> them with st_makeValid.
>>> >>
>>> >> Use only valid objects before processing them with Postgis functions.
>>> >>
>>> >> Nicolas
>>> >>
>>> >> On 29 October 2012 16:03, Ed Linde <edolinde at gmail.com> wrote:
>>> >> > Thanks Nicolas. Just about the error, is this because the line
>>> >> > segments
>>> >> > are
>>> >> > too close
>>> >> > and postgis 2.0 could not handle this? If so is there a workaround,
>>> >> > even
>>> >> > if
>>> >> > it means
>>> >> > slightly having to "perturb" each point's position to not run into
>>> >> > this
>>> >> > bug.
>>> >> > I was really hoping that the intersection of two polygonal shapes in
>>> >> > 3D
>>> >> > would be fairly
>>> >> > simple in postgis 2.0 :(
>>> >> >
>>> >> > Ed
>>> >> >
>>> >> >
>>> >> > On Mon, Oct 29, 2012 at 4:00 PM, Nicolas Ribot
>>> >> > <nicolas.ribot at gmail.com>
>>> >> > wrote:
>>> >> >>
>>> >> >> If the points are computed in the right order, you can store them
>>> >> >> and
>>> >> >> pass them to st_makeLine and st_makePolygon.
>>> >> >> If not, you can form a segment between 2 closest points and connect
>>> >> >> it
>>> >> >> to the closest points.
>>> >> >>
>>> >> >> On 29 October 2012 15:37, Ed Linde <edolinde at gmail.com> wrote:
>>> >> >> > Hi All,
>>> >> >> > Thanks for the tips! Just another thing, when I compute the
>>> >> >> > "transition
>>> >> >> > points" on each edge (shown as red points in my pdf).
>>> >> >> > I need to join them to make a polygon. Wondering how I can
>>> >> >> > connect
>>> >> >> > them
>>> >> >> > together so that I start with a point and end on it
>>> >> >> > to form a closed polygon?
>>> >> >> >
>>> >> >> > Cheers,
>>> >> >> > Ed
>>> >> >> >
>>> >> >> >
>>> >> >> > On Mon, Oct 29, 2012 at 3:03 PM, Stephen Woodbridge
>>> >> >> > <woodbri at swoodbridge.com> wrote:
>>> >> >> >>
>>> >> >> >> Hi Ed,
>>> >> >> >>
>>> >> >> >> Well if clarifies one thing at least, you can ignore Mike's
>>> >> >> >> st_Relate
>>> >> >> >> because 5 is not adjacent to a linear edge, it is only adjacent
>>> >> >> >> to a
>>> >> >> >> vertex,
>>> >> >> >> so st_touches should work fine.
>>> >> >> >>
>>> >> >> >> so you are looking for:
>>> >> >> >>
>>> >> >> >> 1. a specific triangle by id
>>> >> >> >> 2. that intersects triangle VC
>>> >> >> >> 3. and the triangles adjacent to triangle by id
>>> >> >> >> 4. and those that are contained in VC
>>> >> >> >> 5. sorted by distance to P1 limit 1
>>> >> >> >>
>>> >> >> >> so something like:
>>> >> >> >>
>>> >> >> >> select id, the_geom
>>> >> >> >> from (select id, the_geom as adjacent
>>> >> >> >> from triangles
>>> >> >> >> where st_touches(the_geom,
>>> >> >> >> (select the_geom
>>> >> >> >> from triangles a,
>>> >> >> >> (select the_geom as vc
>>> >> >> >> from vc_table
>>> >> >> >> where id='p1') b
>>> >> >> >> where a.id=4)) c
>>> >> >> >> order by st_distance(c.the_geom, (select the_geom
>>> >> >> >> from points
>>> >> >> >> where id='p1')) asc limit 1;
>>> >> >> >>
>>> >> >> >> Untested, but should give you a model to work with.
>>> >> >> >>
>>> >> >> >> -Steve W
>>> >> >> >>
>>> >> >> >>
>>> >> >> >>
>>> >> >> >> On 10/29/2012 6:57 AM, Ed Linde wrote:
>>> >> >> >>>
>>> >> >> >>> Attached is a figure. Where the dotted line is the boundary of
>>> >> >> >>> the
>>> >> >> >>> voronoi cell whose
>>> >> >> >>> generator is point P1. So triangle "4" intersects with the
>>> >> >> >>> voronoi
>>> >> >> >>> boundary, but we are
>>> >> >> >>> interested in the adjacent triangles of triangle 4, which are
>>> >> >> >>> closer
>>> >> >> >>> to
>>> >> >> >>> point P1.
>>> >> >> >>> For example, triangle 5.
>>> >> >> >>>
>>> >> >> >>> Hope this helps.
>>> >> >> >>> Cheers,
>>> >> >> >>> Ed
>>> >> >> >>>
>>> >> >> >>> On Mon, Oct 29, 2012 at 11:50 AM, Nicolas Ribot
>>> >> >> >>> <nicolas.ribot at gmail.com
>>> >> >> >>> <mailto:nicolas.ribot at gmail.com>> wrote:
>>> >> >> >>>
>>> >> >> >>> Could you draw a figure ?
>>> >> >> >>>
>>> >> >> >>> Nicolas
>>> >> >> >>>
>>> >> >> >>> On 29 October 2012 11:03, Ed Linde <edolinde at gmail.com
>>> >> >> >>> <mailto:edolinde at gmail.com>> wrote:
>>> >> >> >>> > Hi All,
>>> >> >> >>> > Thanks for the suggestions.
>>> >> >> >>> > For 1) I will look into how ST_touches works and see if
>>> >> >> >>> it
>>> >> >> >>> can
>>> >> >> >>> pick up all
>>> >> >> >>> > the adjacent polygons to
>>> >> >> >>> > the one I have. And also look into Mike's suggestion on
>>> >> >> >>> ST_relate...though I
>>> >> >> >>> > must admit it looks
>>> >> >> >>> > more complex.
>>> >> >> >>> > For 2) I will try to clarify it a bit more... its harder
>>> >> >> >>> to
>>> >> >> >>> do
>>> >> >> >>> without a
>>> >> >> >>> > figure :) but here goes.
>>> >> >> >>> >
>>> >> >> >>> > Lets say we have a point Q which is the generator of a
>>> >> >> >>> voronoi
>>> >> >> >>> cell. Now I
>>> >> >> >>> > compute the
>>> >> >> >>> > intersection between the voronoi cell boundaries and my
>>> >> >> >>> triangulation (Set
>>> >> >> >>> > of polygons)
>>> >> >> >>> > using ST_intersect. Once I have these triangles.. I say
>>> >> >> >>> pick
>>> >> >> >>> one
>>> >> >> >>> triangle T
>>> >> >> >>> > that is
>>> >> >> >>> > intersecting the voronoi cell boundary of Q.
>>> >> >> >>> > For all the triangles adjacent to T, I need to know
>>> >> >> >>> which
>>> >> >> >>> triangles are
>>> >> >> >>> > INSIDE the voronoi
>>> >> >> >>> > boundary (closer to Q) and which adjacent triangles are
>>> >> >> >>> just
>>> >> >> >>> OUTSIDE the
>>> >> >> >>> > voronoi
>>> >> >> >>> > boundary (farther from Q). I am basically testing for a
>>> >> >> >>> certain
>>> >> >> >>> property by
>>> >> >> >>> > "shrinking" the
>>> >> >> >>> > voronoi cell (closer to Q) and another property when
>>> >> >> >>> "expanding"
>>> >> >> >>> the voronoi
>>> >> >> >>> > cell (away from Q).
>>> >> >> >>> > Just need to make this division of triangles. Haven't
>>> >> >> >>> thought
>>> >> >> >>> of
>>> >> >> >>> a nice way
>>> >> >> >>> > to do this in postgis 2.0
>>> >> >> >>> > So any suggestions would greatly help.
>>> >> >> >>> >
>>> >> >> >>> > Thanks,
>>> >> >> >>> > Ed
>>> >> >> >>> >
>>> >> >> >>> > On Mon, Oct 29, 2012 at 10:15 AM, Mike Toews
>>> >> >> >>> <mwtoews at gmail.com
>>> >> >> >>> <mailto:mwtoews at gmail.com>> wrote:
>>> >> >> >>> >>
>>> >> >> >>> >> On 29 October 2012 21:33, Ed Linde <edolinde at gmail.com
>>> >> >> >>> <mailto:edolinde at gmail.com>> wrote:
>>> >> >> >>> >> > Hi All,
>>> >> >> >>> >> > I need help with 2 hard problems. I store triangles
>>> >> >> >>> in a
>>> >> >> >>> table
>>> >> >> >>> as
>>> >> >> >>> >> > POLYGON.
>>> >> >> >>> >> >
>>> >> >> >>> >> > 1. I want to know for a given triangle, which
>>> >> >> >>> triangles
>>> >> >> >>> share
>>> >> >> >>> an edge
>>> >> >> >>> >> > (adjacent) with this triangle.
>>> >> >> >>> >>
>>> >> >> >>> >> Sounds like you have a finite element mesh with nodes
>>> >> >> >>> and
>>> >> >> >>> elements.
>>> >> >> >>> >> You can use ST_Relate with pattern 'FF2F11212' to pick
>>> >> >> >>> out
>>> >> >> >>> elements
>>> >> >> >>> >> that share the same edge. This DE-9-IM is sort-of a
>>> >> >> >>> custom
>>> >> >> >>> ST_Touches,
>>> >> >> >>> >> but only takes linear boundary overlaps. So if you have
>>> >> >> >>> a
>>> >> >> >>> table
>>> >> >> >>> >> "elements", and you want to find ones that touch ID
>>> >> >> >>> 567:
>>> >> >> >>> >>
>>> >> >> >>> >> SELECT elements.*
>>> >> >> >>> >> FROM elements, elements as e
>>> >> >> >>> >> WHERE e.id <http://e.id> = 567 AND
>>> >> >> >>>
>>> >> >> >>> >> ST_Relate(elements.geom, e.geom, 'FF2F11212');
>>> >> >> >>> >>
>>> >> >> >>> >> I'm not certain about your second question.
>>> >> >> >>> >>
>>> >> >> >>> >> -Mike
>>> >> >> >>> >> _______________________________________________
>>> >> >> >>> >> postgis-users mailing list
>>> >> >> >>> >> postgis-users at postgis.refractions.net
>>> >> >> >>> <mailto:postgis-users at postgis.refractions.net>
>>> >> >> >>>
>>> >> >> >>> >>
>>> >> >> >>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >> >>> >
>>> >> >> >>> >
>>> >> >> >>> >
>>> >> >> >>> > _______________________________________________
>>> >> >> >>> > postgis-users mailing list
>>> >> >> >>> > postgis-users at postgis.refractions.net
>>> >> >> >>> <mailto:postgis-users at postgis.refractions.net>
>>> >> >> >>>
>>> >> >> >>> >
>>> >> >> >>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >> >>> >
>>> >> >> >>> _______________________________________________
>>> >> >> >>> postgis-users mailing list
>>> >> >> >>> postgis-users at postgis.refractions.net
>>> >> >> >>> <mailto:postgis-users at postgis.refractions.net>
>>> >> >> >>>
>>> >> >> >>>
>>> >> >> >>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >> >>>
>>> >> >> >>>
>>> >> >> >>>
>>> >> >> >>>
>>> >> >> >>> _______________________________________________
>>> >> >> >>> postgis-users mailing list
>>> >> >> >>> postgis-users at postgis.refractions.net
>>> >> >> >>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >> >>>
>>> >> >> >>
>>> >> >> >> _______________________________________________
>>> >> >> >> postgis-users mailing list
>>> >> >> >> postgis-users at postgis.refractions.net
>>> >> >> >> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >> >
>>> >> >> >
>>> >> >> >
>>> >> >> > _______________________________________________
>>> >> >> > postgis-users mailing list
>>> >> >> > postgis-users at postgis.refractions.net
>>> >> >> > http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >> >
>>> >> >> _______________________________________________
>>> >> >> postgis-users mailing list
>>> >> >> postgis-users at postgis.refractions.net
>>> >> >> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >
>>> >> >
>>> >> >
>>> >> > _______________________________________________
>>> >> > postgis-users mailing list
>>> >> > postgis-users at postgis.refractions.net
>>> >> > http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >> >
>>> >> _______________________________________________
>>> >> postgis-users mailing list
>>> >> postgis-users at postgis.refractions.net
>>> >> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >
>>> >
>>> >
>>> > _______________________________________________
>>> > postgis-users mailing list
>>> > postgis-users at postgis.refractions.net
>>> > http://postgis.refractions.net/mailman/listinfo/postgis-users
>>> >
>>> _______________________________________________
>>> postgis-users mailing list
>>> postgis-users at postgis.refractions.net
>>> http://postgis.refractions.net/mailman/listinfo/postgis-users
>>
>>
>
>
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
>
More information about the postgis-users
mailing list