代码之家  ›  专栏  ›  技术社区  ›  user1244932

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

  •  1
  • user1244932  · 技术社区  · 7 年前

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

    二维平面索引,类似r树,但 那么这些数据库是如何处理靠近南极/北极和/或-180和180经度的点的呢。

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

    如果将矩形映射到 Mercator 然后我们得到:

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

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

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

    将地理点映射到几个不同的位置,以处理以下情况: 矩形穿过E 180、W 180、N 90、S 90,当矩形不穿过此类边界时。

    2 回复  |  直到 7 年前
        1
  •  2
  •   fradal83    7 年前

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

    这是geography\u dwtithin函数,由st\u dwithin调用 https://github.com/gravitystorm/postgis/blob/master/postgis/geography_measurement.c#L107

    然后lwgeom\u distance\u球体 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\u距离计算 http://postgis.net/docs/doxygen/2.1/d2/ddd/lwgeodetic_8c_ab9f003c831c66b723beca7103e811785.html#ab9f003c831c66b723beca7103e811785

    这里的球体距离计算 http://postgis.net/docs/doxygen/2.1/d0/d7a/lwgeodetic_8h_a5c2565cd7f88783c32b777ca58d4dbcc.html#a5c2565cd7f88783c32b777ca58d4dbcc

        2
  •  0
  •   RusArt    7 年前

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

    documentation

    PostGIS几何图形类型的基础是平面。最短路径 平面上两点之间是一条直线。这意味着

    PostGIS地理类型的基础是球体。最短的 球体上两点之间的路径是一条大圆弧。 那个 复杂的数学。