查找两个地理坐标之间的线是不是穿过陆地

Posted

技术标签:

【中文标题】查找两个地理坐标之间的线是不是穿过陆地【英文标题】:Finding if a line between two geo coordinates crosses land查找两个地理坐标之间的线是否穿过陆地 【发布时间】:2021-09-25 01:46:10 【问题描述】:

目前,我正在使用一个数据集,其中包含环海路线,但其中一些路线要么穿越陆地,要么在陆地上(由于数据的保真度非常低)。我一直在使用来自 toddkarin 的出色 https://github.com/toddkarin/global-land-mask 工具来查找我拥有的哪些坐标在陆地上,以便我可以丢弃它们(最终我可能会找到一种将它们移动到海上最近点的方法)。

我目前的问题是我需要找到一种方法来确定一条线(给定任意两个坐标)是否穿过陆地(想想海中两点之间的一个岛)。

我的业务区域是全球,如果有任何改变,我将使用 WGS84。我对 matplotlib/Basemap 有一些非常基本的经验,但我对它一点信心都没有,我正在努力寻找从哪里开始。我是否尝试以给定的距离/分辨率沿线绘制每个坐标,然后使用 Todd 的工具,还是有更有效的方法?

提前感谢您的帮助。在发布之前我已经做了很多挖掘和阅读,但还没有找到我认为我需要的东西。

理想情况下,我需要该工具在 python 中,但如果我需要调用另一种可以给我 True/False 输出的语言/库/exe,那也很好。

【问题讨论】:

【参考方案1】:

Shapely 是 Python 中用于执行此类操作的可能工具。

如果您能够提取岛屿和其他质量的多边形数据,那么您可以使用 Shapely 执行相交测试(请参阅Line vs. Polygon Intersection Coordinates)。这将用于检查点、线和任意多边形之间的交叉点。

快速而肮脏的方法是按照您自己的建议,离散化两点之间的线并检查每一个。

【讨论】:

感谢托马斯,我坚持划分界限,这就是我想出的......【参考方案2】:

感谢此处答案的一些帮助,我想出了以下现在正在工作的方法。

How to find all coordinates efficiently between two geo points/locations with certain interval using python

from global_land_mask import globe

def crosses_land(x1,y1,x2,y2):

    # your geo points
    #x1, y1 = 13.26077,100.81099
    #x2, y2 = 13.13237,100.82993
    # the increment step (higher = faster)
    STEP = 0.0003

    if x1 > x2:           # x2 must be the bigger one here
        x1, x2 = x2, x1
        y1, y2 = y2, y1

    for i in range(int((x2-x1)/STEP) + 1):
        try:
            x = x1 + i*STEP
            y = (y1-y2)/(x1-x2) * (x - x1) + y1
        except:
            continue
        is_on_land = globe.is_land(float(x), float(y))
        #if not is_on_land:
            #print("in water")
        
        if is_on_land:
            #print("crosses land")
            
            return True
print(crosses_land(x1,y1,x2,y2))

【讨论】:

以上是关于查找两个地理坐标之间的线是不是穿过陆地的主要内容,如果未能解决你的问题,请参考以下文章

在android中查找设备的相对方向

查找 GPS 坐标路径上的所有城市

检查纬度经度是不是位于两个坐标之间的线上

基于地理坐标查找具有最大间距的聚类

通过距离和方位从已知位置查找点坐标的地理算法

Android:查找两个地理点之间的距离