[postgis-users] polygons of data type geography showing strange behaviour in combination with the date line
Christian.Strobl at dlr.de
Christian.Strobl at dlr.de
Mon Jul 10 14:53:18 PDT 2017
Dear all,
I define a polygon (Poly 1) which extends over the date line. Point 1 clearly is inside Poly 1.
geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(180 0)'), ST_GeogFromText('POLYGON((170 -1, 190 -1, 190 1, 170 1, 170 -1))'), 0);
NOTICE: Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
st_dwithin
------------
t
(1 row)
If I have a closer look at this polygon it shows the representation below.
geoDB=> SELECT ST_ASEWKT(ST_GeogFromText('POLYGON((170 -1, 190 -1, 190 1, 170 1, 170 -1))'));
NOTICE: Coordinate values were coerced into range [-180 -90, 180 90] for GEOGRAPHY
st_asewkt
---------------------------------------------------------
SRID=4326;POLYGON((170 -1,-170 -1,-170 1,170 1,170 -1))
(1 row)
-180 0 180
| | |
| | |
90 -----|--------------|----------------|----- 90
| | |
| | |
| | |
| | Point2 (0/0) | Point1 (180/0)
| ____________|______________ ____
0 -----|-|____________*______________|_*__|-- 0
| | |
| | Poly 2 | Poly 1
| | |
| | |
| | |
-90-----|--------------|----------------|----- -90
| | |
| | |
-180 0 180
If I look at the order of the coordinates it looks like Poly 2.
geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(0 0)'), ST_GeogFromText('POLYGON((170 -1,-170 -1,-170 1,170 1,170 -1))'),0);
st_dwithin
------------
f
(1 row)
The test with Point 2 shows that this assumption is wrong. Again Point 1 is inside.
geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(180 0)'), ST_GeogFromText('POLYGON((170 -1,-170 -1,-170 1,170 1,170 -1))'),0);
st_dwithin
------------
t
(1 row)
If I use the geometry data type instead of the geography data type Point 2 is clearly inside Poly 2.
geoDB=> SELECT ST_DWITHIN(ST_GeomFromText('POINT(0 0)'), ST_GeomFromText('POLYGON((170 -1,-170 -1,-170 1,170 1,170 -1))'),0);
st_dwithin
------------
t
(1 row)
And finally here is my question: How do I construct Poly 2 from these geographic points?
geoDB=> SELECT ST_ASEWKT(ST_GeogFromText('POLYGON((170 -1,-170 -1,-170 1,170 1,170 -1))'));
st_asewkt
---------------------------------------------------------
SRID=4326;POLYGON((170 -1,-170 -1,-170 1,170 1,170 -1))
Best regards and thanks for your help
Christian
P.S. A possible workaround is the use of vertices between the corner points, e.g.
SELECT ST_ASEWKT(ST_GeogFromText('POLYGON((170 -1, 0 -1, -170 -1, -170 1, 0 1, 170 1, 170 -1))'));
geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(0 0)'), ST_GeogFromText('POLYGON((170 -1, 0 -1, -170 -1, -170 1, 0 1, 170 1, 170 -1))'),0);
st_dwithin
------------
t
(1 row)
For me this seems like a possible workaround, but not like a answer to the question above
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/postgis-users/attachments/20170710/fa307787/attachment.html>
More information about the postgis-users
mailing list