[postgis-users] strange query with linestring in one point

Szymon Guz mabewlun at gmail.com
Thu Sep 29 04:22:11 PDT 2011


On 29 September 2011 11:37, Sandro Santilli <strk at keybit.net> wrote:

> On Thu, Sep 29, 2011 at 11:29:51AM +0200, Szymon Guz wrote:
> > On 29 September 2011 11:20, Sandro Santilli <strk at keybit.net> wrote:
> > > On Thu, Sep 29, 2011 at 11:14:52AM +0200, Szymon Guz wrote:
> > > >
> > > > this works OK, returns something:
> > > >
> > > > SELECT ... FROM ... WHERE
> > > > st_intersects(
> > > >   geometry,
> > > >   st_geomfromtext('POINT(3 50)', 4326)
> > > > );
> > > >
> > > > but this returns nothing:
> > > >
> > > > SELECT ... FROM ... WHERE
> > > > st_intersects(
> > > >   geometry,
> > > >   st_geomfromtext('POINT(3 50, 3 50 )', 4326)
> > > > );
> > >
> > > The second should raise an exception due to malformed WKT being used.
> > > Doesn't it ?
> >
> > The second raises exception only if there is exactly one point. When
> there
> > are more points it works OK:
> >
> > SELECT st_geomfromtext('LINESTRING(3  50)', 4326)
> > ERROR:  geometry requires more points
> > HINT:  "LINESTRING(3  50)" <-- parse error at position 17 within geometry
> >
> > SELECT st_astext(st_geomfromtext('LINESTRING(3 50, 3 50)', 4326))
> >
> > 'LINESTRING(3 50,3 50)'
>
> Yes, but you wrote 'POINT(3 50, 3 50)' in your first mail :)
>
> Anyway, you're now saying that while POINT(3 50) is reported
> to intersect something, LINESTRING(3 50, 3 50) isn't. Correct ?
> Can you provide literal data showing this discrepance ?
> That is, a query where both operands are in WKT form ?
>
> --strk;
>

Oh yes, sorry, I meant 'LINESTRING( 3 50, 3 50)' :)

I managed to replicate the error like this:

CREATE TABLE g2(geometry geometry);

insert into g2(geometry)
SELECT ST_Buffer(
 ST_GeomFromText('POINT(3  50)', 4326),
 50, 'quad_segs=8'
);


SELECT
st_astext(
        st_intersection(
          geometry,
          st_geomfromtext('POINT(3  50)', 4326)
        )
) "POINT(3 50)",
st_astext(
        st_intersection(
          geometry,
          st_geomfromtext('LINESTRING(3  50, 3  50)', 4326)
        )
) "LINESTRING(3 50, 3 50)",
(
        SELECT 'POINT'
        FROM g2
        WHERE
        st_intersects(
          geometry,
          st_geomfromtext('POINT(3  50)', 4326)
        )
) "POINT EXISTS",
(
        SELECT 'LINE'
        FROM g2
        WHERE
        st_intersects(
          geometry,
          st_geomfromtext('LINESTRING(3  50, 3  50)', 4326)
        )
) "LINESTRING EXISTS"
FROM g2;

BUT... it turned out that the LINESTRING geometry is not valid:

SELECT
  ST_IsValid(st_geomfromtext('POINT(3  50)', 4326)) "POINT",
  ST_IsValid(st_geomfromtext('LINESTRING(3  50, 3  50)', 4326)) "LINE"
;


I didn't just know that PostGIS is calm when the geometry is not valid and
treats that as empty geometry.
I thought it would just throw some error in such a case.


-- 
*http://simononsoftware.com/* <http://simononsoftware.com/>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20110929/476bb53a/attachment.html>


More information about the postgis-users mailing list