large polygons of data type geography showing strange behaviour

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

large polygons of data type geography showing strange behaviour

Christian.Strobl

Dear all,

we have some problems / questions concerning the use of geography data with PostGIS. As far as I understood, it is not possible to use the latitude span from -90 to 90 in polygons / bounding boxes (https://trac.osgeo.org/postgis/ticket/2495), if you want to construct a polygon. Otherwise you get the follwing message

geoDB=> select ST_GeogFromText('POLYGON((-1 -90, 1 -90, 1 90, -1 90, -1 -90))');
ERROR:  Antipodal (180 degrees long) edge detected!

This is not nice but can be treated by clients with the defintion of these boundary conditions.

But we get also strange results for ST_DWITHIN, ST_INTERSECTS with longitude spans larger than 180.

-- E-W-extension of 180

geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(0 0)'), ST_GeogFromText('POLYGON((-90 -1, 90 -1, 90 1, -90 1, -90 -1))'), 0);
 st_dwithin 
------------
 t
(1 row)

geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(180 0)'), ST_GeogFromText('POLYGON((-90 -1, 90 -1, 90 1, -90 1, -90 -1))'), 0);
 st_dwithin 
------------
 f
(1 row)

-- E-W-extension of 182

geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(0 0)'), ST_GeogFromText('POLYGON((-91 -1, 91 -1, 91 1, -91 1, -91 -1))'), 0);
 st_dwithin 
------------
 f
(1 row)

geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(180 0)'), ST_GeogFromText('POLYGON((-91 -1, 91 -1, 91 1, -91 1, -91 -1))'), 0);
 st_dwithin 
------------
 t
(1 row)


The result is, that, if you enlarge the polygon, the one point (0,0) goes outside, the other point goes (180,0) inside. The only explanation, I can imagine, is, that PostGIS choose always the polygon, which has a longitude extension which is smaller/equal 180. If this is true, this is a real problem. If you are using the geography type, it is not possible to use polygons, which has a longitude extension larger than 180. Normally this should be solved with the orientation of the poylgon, but the orientation has obviously no effect.


--Clockwise Orientation

geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(0 0)'), ST_GeogFromText('POLYGON((-91 -1, -91 1, 91 1, 91 -1, -91 -1))'), 0);
st_dwithin 
------------
 f
(1 row)

geoDB=> select ST_Orientation(ST_GeomFromText('POLYGON((-91 -1, -91 1, 91 1, 91 -1, -91 -1))'));
 st_orientation 
----------------
              1
(1 row)


--Counterclockwise Orientation

geoDB=> SELECT ST_DWITHIN(ST_GeogFromText('POINT(0 0)'), ST_GeogFromText('POLYGON((-91 -1, 91 -1, 91 1, -91 1, -91 -1))'), 0);
 st_dwithin 
------------
 f
(1 row)

geoDB=> select ST_Orientation(ST_GeomFromText('POLYGON((-91 -1, 91 -1, 91 1, -91 1, -91 -1))'));
 st_orientation 
----------------
             -1
(1 row)

Has anybody found a workaround for this? Or did I misunderstood the concept behind this behaviour?

Best regards
Christian

_______________________________________________
postgis-users mailing list
[hidden email]
https://lists.osgeo.org/mailman/listinfo/postgis-users
Loading...