ST_Within / ST_Contains如何处理地理数据?

时间:2017-06-28 12:04:16

标签: algorithm postgresql gis geospatial postgis

问题:什么算法/算法 s 使用spatial databases检查地理点(纬度和经度)是否属于" geo rect" (由经络和平行线连接的4个地理点)?

起初我认为它是简单的投影加算法 二维平面索引,如r-tree,但是 那么这些数据库如何处理南/北极和/或-180和180经度附近的点。

例如,我们的点为(0, E 180),矩形为(N 1, W 179), (N 1, E 179), (S 1, E 179), (S 1, E 179)

其中N =北,E =东,W =西,S =南。

如果将矩形映射到Mercator,那么我们得到:

( - 126799830,5434036), (139214148,6832332),
(-126799830,-16488164) (139214148,-17886459),

我们的观点是(142452996,-5527064)。

并且在这样的投影点不属于矩形, 虽然它实际上属于。

实际上没有任何一个投影可以帮助这种情况,因为它应该 map geo指向几个不同的位置,处理时的情况 矩形交叉E 180,W 180,N 90,S 90,当矩形不跨越这些边界时。

那么空间数据库如何检查地理点是否属于地理直方?

2 个答案:

答案 0 :(得分:2)

查看postgis源代码,计算地理类型的“内部”计算,计算对象之间的距离。

这是geography_dwtithin函数,由st_dwithin https://github.com/gravitystorm/postgis/blob/master/postgis/geography_measurement.c#L107调用

然后在测量距离之前比较bbox的lwgeom_distance_spheroid http://postgis.net/docs/doxygen/2.1/da/de7/liblwgeom_8h_a2aac0f91b6dfd27873ab828a1874805b.html

距离计算可在此处找到 http://postgis.net/docs/doxygen/2.1/d2/ddd/lwgeodetic_8c_a56339ad4a240527a078249dc8e56b082.html#a56339ad4a240527a078249dc8e56b082

在第1756 - 1764行,您可以找到最简单情况(点对点)的计算。其他情况使用相同的逻辑,但寻找最近的点。

然后你可以在这里找到sphere_distance计算 http://postgis.net/docs/doxygen/2.1/d2/ddd/lwgeodetic_8c_ab9f003c831c66b723beca7103e811785.html#ab9f003c831c66b723beca7103e811785

和此处的spheroid_distance计算 http://postgis.net/docs/doxygen/2.1/d0/d7a/lwgeodetic_8h_a5c2565cd7f88783c32b777ca58d4dbcc.html#a5c2565cd7f88783c32b777ca58d4dbcc

答案 1 :(得分:0)

在PostGIS中,几何与地理之间存在差异。

看看他们的documentation

  

PostGIS几何类型的基础是平面。最短的路径   飞机上两点之间是一条直线。这意味着   几何计算(面积,距离,长度,交叉点,   等)可以用笛卡尔数学和直线计算   载体

     

PostGIS地理类型的基础是一个球体。最短的   球体上两点之间的路径是一个很大的圆弧。的即   意味着在地理上的计算(区域,距离,长度,   交叉点等)必须在球体上计算,使用更多   复杂的数学。

墨卡托是基于几何的投影。如果需要使用lat-lon坐标,请使用地理投影WGS-84。