[postgis-users] Issue with ST_WITHIN

Tumasgiu Rossini rossini.t at gmail.com
Thu Aug 8 00:35:04 PDT 2019


Postgis functions often outputs unexpected results
when used with invalid geometries.

Your polygon have a self intesection at (5, 5).

The correct graphic representation of your polygon :

 (0, 10)         (10,10)
| \   /|
|  \/  |
|  /\  |
/    \ |
(0, 0)           (10, 0)

Le jeu. 8 août 2019 à 09:26, Tumasgiu Rossini <rossini.t at gmail.com> a
écrit :

> Your geometry is invalid, as the vertex (10, 0)
> occurs before (10, 10).
>
>     select
> st_isvalid('((0,0),(0,10),(10,0),(10,10),(0,0))'::polygon::geometry);
>     --returns false
>
> Your polygon looks like this :
>   _
> |\  /
> |/_\
>
> (Sorry for the bad ascii art)
>
> Le jeu. 8 août 2019 à 03:30, Michael Lubinsky <mlubinsky at hotmail.com> a
> écrit :
>
>> The following two select statements  return  FALSE:
>>
>> SELECT ST_WITHIN(CAST(bounds as GEOMETRY) , ST_MakePoint(1, 1) ) FROM
>> m_polygon;
>>
>> SELECT ST_WITHIN( ST_MakePoint(1, 1), CAST(bounds as GEOMETRY)  ) FROM
>> m_polygon;
>>
>>
>>
>> Why it is so? I think what the point (1,1) inside the given polygon:
>>
>>
>> SELECT bounds FROM m_polygon;
>> ((0,0),(0,10),(10,0),(10,10),(0,0))
>>
>> ------------------------------
>> *From:* postgis-users <postgis-users-bounces at lists.osgeo.org> on behalf
>> of Michael Lubinsky <mlubinsky at hotmail.com>
>> *Sent:* Wednesday, August 7, 2019 6:08 PM
>> *To:* PostGIS Users Discussion <postgis-users at lists.osgeo.org>
>> *Subject:* Re: [postgis-users] Issue with ST_WITHIN
>>
>> I understand now what the core issue is what I am trying feed POLYGON
>> type to ST_WITHIN which expects the GEOMETRY type.
>> Given what I cannot change the table column type from POLYGON to GEOMETRY
>> is it possible to cast POLYGON to GEOMETRY inside SQL:
>>
>> SELECT ST_WITHIN(CAST(bounds as GEOMETRY) , CAST(bounds as GEOMETRY) ) FROM m_polygon;
>>
>> Thanks!
>>
>>
>>
>> ------------------------------
>> *From:* postgis-users <postgis-users-bounces at lists.osgeo.org> on behalf
>> of Darafei "Komяpa" Praliaskouski <me at komzpa.net>
>> *Sent:* Monday, August 5, 2019 11:57 PM
>> *To:* PostGIS Users Discussion <postgis-users at lists.osgeo.org>
>> *Subject:* Re: [postgis-users] Issue with ST_WITHIN
>>
>> Hi,
>>
>> The issue is indeed you are using Postgres polygons instead of PostGIS
>> polygons. ST_MakePoint (note ST_ prefix) builds a postgis point.
>> Non-working countertpart would be this:
>> SELECT ST_WITHIN('(1,1)'::point, '(1,1)'::point ) ;
>>
>>
>> On Tue, Aug 6, 2019 at 7:37 AM Michael Lubinsky <mlubinsky at hotmail.com>
>> wrote:
>>
>> Environment: PostgreSQL 11.4 with PostGIS 2.5.2
>>
>> CREATE TABLE m_polygon (id SERIAL PRIMARY KEY, bounds POLYGON);
>> INSERT INTO m_polygon(bounds) VALUES(
>>   '(0.0, 0.0),  (0.0, 10.0), (10.0, 0.0), (10.0, 10.0), (0,0)'
>> );
>>
>> SELECT ST_WITHIN(m_polygon.bounds , m_polygon.bounds ) FROM m_polygon;
>>
>> I am getting the error message for SELECT statement above:
>>
>> ERROR:  function st_within(polygon, polygon) does not exist
>> HINT:  No function matches the given name and argument types. You might
>> need to add explicit type casts
>>
>> I was thinking what the reason for the error is: the ST_WITHIN arguments
>> types should be GEOMETRY, but I am passing the POLYGONs.
>>
>> However the following works:
>>
>> SELECT ST_WITHIN(ST_MakePoint(1,1), ST_MakePoint(1,1) ) ;
>>
>> Thanks!
>> Michael
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/postgis-users
>>
>>
>>
>> --
>> Darafei Praliaskouski
>> Support me: http://patreon.com/komzpa
>> _______________________________________________
>> postgis-users mailing list
>> postgis-users at lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/postgis-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20190808/a2414a2c/attachment.html>


More information about the postgis-users mailing list