【发布时间】:2020-02-15 07:43:45
【问题描述】:
我有两个多边形,P 和 Q,其中多边形的外部线性环由两个封闭的点集定义,存储为 numpy 数组,以逆时针方向连接。 P 和 Q 的格式如下:
P['x_coords'] = [299398.56 299402.16 299410.25 299419.7 299434.97 299443.75 299454.1 299465.3 299477. 299488.25 299496.8 299499.5 299501.28 299504. 299511.62 299520.62 299527.8 299530.06 299530.06 299525.12 299520.2 299513.88 299508.5 299500.84 299487.34 299474.78 299458.6 299444.66 299429.8 299415.4 299404.84 299399.47 299398.56 299398.56]
P['y_coords'] = [822975.2 822989.56 823001.25 823005.3 823006.7 823005.06 823001.06 822993.4 822977.2 822961. 822943.94 822933.6 822925.06 822919.7 822916.94 822912.94 822906.6 822897.6 822886.8 822869.75 822860.75 822855.8 822855.4 822857.2 822863.44 822866.6 822870.6 822876.94 822886.8 822903. 822920.3 822937.44 822954.94 822975.2]
Q['x_coords'] = [292316.94 292317.94 292319.44 292322.47 292327.47 292337.72 292345.75 292350. 292352.75 292353.5 292352.25 292348.75 292345.75 292342.5 292338.97 292335.97 292333.22 292331.22 292329.72 292324.72 292319.44 292317.2 292316.2 292316.94]
Q['y_coords'] = [663781. 663788.25 663794. 663798.06 663800.06 663799.3 663796.56 663792.75 663788.5 663782. 663773.25 663766. 663762. 663758.25 663756.5 663756.25 663757.5 663761. 663763.75 663767.5 663769.5 663772.25 663777.5 663781. ]
## SIMPLIFIED AND FORMATTED FOR EASY TESTING:
import numpy as np
px_coords = np.array([299398,299402,299410.25,299419.7,299398])
py_coords = np.array([822975.2,822920.3,822937.44,822954.94,822975.2])
qx_coords = np.array([292316,292331.22,292329.72,292324.72,292319.44,292317.2,292316])
qy_coords = np.array([663781,663788.25,663794,663798.06,663800.06,663799.3,663781])
P的外环由P['x_coords'][0], P['y_coords'][0] -> P['x_coords'][1], P['y_coords'][1]等连接而成。每个数组的最后一个坐标与第一个相同,表示形状是拓扑闭合的。
是否可以使用 numpy 以几何方式计算 P 和 Q 的外环之间的简单最小距离?我在 SO 上进行了高低搜索,但没有找到任何明确的内容,所以我怀疑这可能是对一个非常复杂的问题的过度简化。我知道距离计算可以使用 GDAL 或 Shapely 等开箱即用的空间库来完成,但我很想通过在 numpy 中从头开始构建一些东西来了解这些是如何工作的。
我考虑过或尝试过的一些事情:
- 计算两个阵列中每个点之间的距离。这不起作用,因为 P 和 Q 之间的最近点可以是边-顶点对。使用每个形状的凸包,使用
scipy.spatial计算有同样的问题。 - 一种低效的蛮力方法计算每对点之间的距离,以及边缘点对的每个组合
有没有更好的方法来解决这个问题?
【问题讨论】:
-
有很多方法可以做到这一点,但首先你需要确定你所说的“距离”是什么意思。可能最常见的方法是计算每个多边形的质心在哪里,然后计算质心之间的距离或找到质心之间的向量,然后计算边缘与该向量相交的位置。
-
好点 - 我正在寻找两组外环之间的最小距离。我已经更新了我的问题以反映这一点
-
哈!看到您的编辑后,我才更新了我的评论
-
我认为你需要点点距离和线点距离,见stackoverflow.com/a/56634290/7916438的中间部分(水平线下方)
-
有没有关于凸性和交集的假设?