【问题标题】:How ST_Within/ST_Contains works with geo data?ST_Within/ST_Contains 如何处理地理数据?
【发布时间】:2017-12-01 18:49:14
【问题描述】:

问题:什么算法/或算法s 使用spatial databases 来检查地理点(纬度和经度)是否属于“地理矩形”(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 以及矩形不跨越这些边界时。

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

【问题讨论】:

  • 通过投影:proj4.org/faq.html(例如)
  • @wildplasser 但是在这种情况下到底使用了什么样的投影?

标签: algorithm postgresql gis geospatial postgis


【解决方案1】:

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

这是 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 在测量距离之前比较 bbox。

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

【讨论】:

  • 如果是这样,那么在 postgis 中有什么意义呢?如果你有一个点和10000 rects,那么你必须做10000 * 4 距离计算,所以它是没有索引的数据库,因为线性依赖于数据集的大小,所以 postgis 是无用的数据库?
  • 在计算之前评估索引。
  • 如果索引参与了计算,那么索引算法就是我要求的一部分。
  • 实际上参考ptarray_distance_spheroid 没有回答任何问题,因为好的,我们计算距离,例如矩形的4个点和测试点之间的距离,接下来,我们如何回答矩形内的点还是不行?
  • 我已经用距离计算之前的部分编辑了答案
【解决方案2】:

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

看看他们的documentation:

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

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

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

【讨论】:

  • 抱歉有误会,其实是想问一下这种情况下using more complicated mathematics postgis 用的是什么类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多