【问题标题】:How to do in-memory search for polygons that contain a given point?如何在内存中搜索包含给定点的多边形?
【发布时间】:2020-02-27 12:27:02
【问题描述】:

我有一个 PostGreSQL 表,它有一个 geometry 类型的列,其中存储了不同的简单多边形(可能相交)。多边形是城市内的所有区域。我收到一个点的输入(经纬度对),需要找到包含给定点的多边形列表。我目前拥有的:

  • 在多边形列上定义的非聚集 GiST 索引。
  • 在整张桌子上使用ST_Contains(@param_Point, table.Polygon)

它很慢,所以我正在寻找一种性能更高的内存替代方案。我有以下想法:

  1. 维护 Redis 中的多边形字典,由其 geohash 键控。具有相同 geohash 的多边形将保存为列表。当我收到该点时,计算它的 geohash 并修剪到所需的水平。然后在 Redis 地图中搜索并不断修剪该点的 geohash,直到找到第一个结果(或足够的结果)。
  2. 尝试从数据库中加载 geohashes。定期或通过接收更新事件更新 trie。计算点的geohash,在trie中搜索直到找到足够的结果。我更喜欢这个,因为考虑到多边形的性质,地图可能有很长的 geohash 列表。
  3. 还有其他方法吗?

我读过GeoTriePolygon Geohasher 之类的库,但似乎无法将它们与数据库和上述想法集成。

请问有什么提示或起点吗?

【问题讨论】:

    标签: postgresql redis polygon point-in-polygon geohashing


    【解决方案1】:

    您是否尝试过使用 ST_Within?不确定它是否符合您的标准,但我相信它应该比 st_contains 更快

    【讨论】:

    • 还没有,但我可以尝试恢复结果。但是,在 Redis 中分层维护整个多边形数据的基于事件的系统将是理想的。
    猜你喜欢
    • 2020-03-11
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 2013-12-08
    • 1970-01-01
    相关资源
    最近更新 更多