查找两个地理坐标之间的线是不是穿过陆地
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))
【讨论】:
以上是关于查找两个地理坐标之间的线是不是穿过陆地的主要内容,如果未能解决你的问题,请参考以下文章