【问题标题】: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,那也很好。

【问题讨论】:

    标签: python python-3.x qgis geo


    【解决方案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))
    

    【讨论】:

      猜你喜欢
      • 2018-06-02
      • 2011-05-09
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 2012-06-10
      相关资源
      最近更新 更多