我有一个二维的地理坐标数组,像这样

coords = np.array(
[[[54.496163, 21.770491],
  [54.495438, 21.755107],
  [54.494713, 21.739723],
  [54.493988, 21.724339],
  [54.493263, 21.708955]],
 [[54.504881, 21.769271],
  [54.504157, 21.753884],
  [54.503432, 21.738497],
  [54.502707, 21.72311 ],
  [54.501983, 21.707723]],
 [[54.5136, 21.768052],
  [54.512875, 21.752661],
  [54.512151, 21.737271],
  [54.511426, 21.72188 ],
  [54.510702, 21.70649 ]],
 [[54.522318, 21.766832],
  [54.521594, 21.751439],
  [54.52087, 21.736045],
  [54.520145, 21.720651],
  [54.519421, 21.705257]],
 [[54.531037, 21.765613],
  [54.530312, 21.750216],
  [54.529588, 21.734819],
  [54.528864, 21.719421],
  [54.52814, 21.704024]]]
)


在空间中,它定义了一个多边形


我想在某个点的coords中找到最近点的索引,例如pt = [54.5, 21.7]

coords在这里看起来像是一个平行四边形,但实际上它是形状为(1200, 1500, 2)的多边形。出于明显的原因,我在这里显示coords[0:5,0:5]
多边形的真实形状可以在此question中找到。

现在,我正在计算整个coords数组相对于点pt的欧几里得距离,以找到最接近的点,在[r1,c1]

flidx = ((coords - pt) ** 2).sum(2).argmin()
r1 = int(flidx / coords.shape[1])
c1 = flidx % coords.shape[1]


但这需要太多时间。

我正在考虑在多边形中实现二进制搜索,我可以将其分为4部分,检查点在其中的哪个部分,然后循环直到得到相对较小的点数组,例如16乘16。然后应用欧氏距离法。

问题是我不知道如何检查点是否在多边形内。矩形将相当容易,但这不是一个。

此方法或任何其他方法来找到最接近的点的任何帮助将不胜感激。

谢谢

最佳答案

如果重新排列点数组,我认为您可以使用shapely

from shapely.geometry import Point
from shapely.geometry.polygon import Polygon

point = Point(0.5, 0.5)
polygon = Polygon([(0, 0), (0, 1), (1, 1), (1, 0)])
print(polygon.contains(point))


我不太确定速度,但是应该很简单。

08-26 20:22
查看更多