【问题标题】:How do you ID GeoHash points that are NOT over land?您如何识别不在陆地上的 GeoHash 点?
【发布时间】:2019-11-04 14:34:44
【问题描述】:

我有一个已转换为 GeoHash 的纬度/经度坐标列表。我的目标是识别被报告在水面上的点(任何国家边界之外的海洋、海洋等)。我还有一个数据集,其中所有世界国家边界的纬度/经度边界的所有形状也转换为 GeoHash。

因此,对于给定的 GeoHash 点,我试图将其分类为是否超过(国际)水域。我曾想过在海洋中手动选择点,并使用一个简短的 GeoHash 前缀在海洋中创建一个大盒子,但这是相当有限的。

也许通常有一种方法可以理解在任何国家边界之外成为 GeoHash 点意味着什么?

【问题讨论】:

    标签: geospatial latitude-longitude geohashing


    【解决方案1】:

    geohash 不好用。 Geohash 擅长识别特定点,但不擅长描述国家边界或海洋等复杂形状。

    我曾想过在海洋中手动选择点,然后 使用一个简短的 GeoHash 前缀在海洋中创建一个大盒子,但是 这是相当有限的。

    是的,这将给出非常不精确的结果。您需要测试每个点,是否属于任何国家的多边形。你如何做到这一点取决于你使用的平台,例如。在 SQL 中,您运行 ST_Intersects(point, country) 查询。

    我只需将 geohash 转换回 lat/lon 对并检查它们。

    如果您确实想使用 geohash 或者如果您有太多(数十亿)点,您可以使用简短的 GeoHash 前缀技巧 - 但您需要使用许多前缀来表示每个海洋。类似于以下内容,使用前缀树:

    • 以一对字母的 GeoHash 长度开始,
    • 对于每个可能的 GeoHash 字符串,计算其框是否完全包含在海洋或陆地中(使用 ST_Intersects 或类似的精确方法)。
    • 如果整个盒子属于一个类 - 将它添加到前缀树。
    • 如果没有 - 添加更多字母(同样,所有可能的组合)并继续递归直到您需要停止的某个限制。

    一旦你建立了这样的树 - 你可以使用 GeoHash 在这棵树中快速查找你的答案。

    【讨论】:

    • 感谢您的输入,但要详细说明/回复一些项目:现在我有 Redshift 上的数据(因此使用 SQL)。据我所知,Redshift 中没有本地地理空间工具可以在多边形类型的计算中做点。它在 Redshift 中,因为大约有 320 亿个点。这就是我使用 GeoHash 的原因。我不明白如何应用“对于每个可能的 GeoHash 字符串,计算它的盒子是否完全被海洋或陆地包含(使用 ST_Intersects 或类似的精确方法)。”因为这似乎是问题的症结所在(?)。谢谢。
    • 首先,生成所有可能的 3 字母 geohash 值,大约有 30k 个。在一些具有空间支持的数据库中,例如带有 PostGIS 或 Google BigQuery 的 Postgres,测试与这些值对应的点是否属于海洋。将结果导出到 Redshift 并加入 3 字母前缀。这将为您提供大约 78 公里的误差范围。您可以通过使用更长的前缀来改进它,其中 geohash 框解析为陆地和海洋的混合。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多