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

标签 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)。

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

实际上没有任何投影可以帮助解决这种情况,因为它应该 将地理点映射到几个不同的位置,以处理以下情况 矩形跨越 E 180、W 180、N 90、S 90 以及矩形不跨越这些边界。

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

最佳答案

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

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

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

距离计算可以在这里找到 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

关于algorithm - ST_Within/ST_Contains 如何处理地理数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44801911/

相关文章:

php - 比较多个字符串的文本

java - 删除包含另一个文件中不存在的数据的文件行

sql - 如何在 SQL Server 中将 wgs 84 转换为纬度/经度

language-agnostic - 如何找到多个地理区域的中心?

php - 二维聚类算法

algorithm - Dijkstra 和 Bellman-Ford 算法什么时候都找不到最短路径?

postgresql - 如何在 gorm 中为 Association 请求主体属于并拥有一个

java - hibernate 找不到序列

sql - Postgres SQL 获取某个日期后的数据

html - 在 R 中自定义传单弹出窗口