【发布时间】:2019-01-24 14:33:08
【问题描述】:
我有一条线段 AB (2d) 从点 A 到点 B。对于coastline(封闭多边形,3*10^3 个顶点)的表示,我有一个NumPy 数组(2d),它在同一点开始和结束。我想知道,A 和B 点之间的连接是否与海岸线相交。
我的第一种方法是遍历封闭多边形的每个线段,并检查它是否与AB 相交。这里是the underlying method。
即使我使用NumPy 数组或使用cython 翻译函数,它也不够快,因为我必须为不同的As 和Bs 做很多次.
我想,这可能是一个概念问题,我想知道,是否有更智能的方法来检查是否至少存在一个交叉点 (True/False)?
我也尝试使用shapely。但这有点慢。
from shapely.geometry import LineString
import numpy as np
coastline = LineString(np.dstack(x_values,y_values))
def intersection(A,B,Coastline):
AB = LineString([(A[0], A[1]), (B[0], B[1])])
if AB.intersection(coastline).is_empty:
return False
return True
【问题讨论】:
-
那么您的期望是什么?不要这么含糊:现在需要多长时间,快多少会好?
-
您的问题实际上只是一个线段还是您会检查更多的线段?答案可能取决于此,因为这样对海岸线段做一些事情可能是值得的,比如索引或诸如此类。
-
根据 Robert Kerns Line Profiler,我以 numpy-array 方式创建的函数每次命中需要 1583.7 * 10 ^-6 秒(5788 次调用)。
-
有很多关于多边形与线段相交的帖子,试试看。不管你的方法是什么,因为你的多边形上有很多顶点,用更少的顶点制作一个不太详细的多边形可能会很好,这样我们就可以针对这个新的多边形测试这条线。它需要生成,如果它们相交,您将需要检查实际的详细信息,但如果它们不相交,您可以知道它也不与详细信息相交
标签: python algorithm performance numpy cython