2017-09-17 133 views

回答

2

尝试Hausdorff distance,这是由g1.hausdorff_distance(g2)机能的研究返回:

from shapely.geometry import Polygon, Point 
poly = Polygon([(-1, -1), (-2, 2), (4, 4), (4, -1), (-1, -1)]) 
p = Point(0, 0) 
poly.hausdorff_distance(p) # 5.656854249492381 

请记住,身材匀称只适用于笛卡尔空间。你的问题询问“经度和纬度”,所以这些距离单位是度数。您需要将其投影到合适的坐标参考系统(CRS)中以获得更多常规单位长度。此外,“直路径”的定义根据CRS的选择而变化。

+0

有什么方法可以在Python中用CRS实现? –

+0

你可以使用[pyproj](https://github.com/jswhit/pyproj)([这种方式](https://gis.stackexchange.com/q/127427/1872))来投影几何图形,并找到来自[此地图预测列表](https://en.wikipedia.org/wiki/List_of_map_projections)的良好预测 –

+0

不涉及选择投影的另一种策略是找到反测地距离's12'从[geographiclib](https://geographiclib.sourceforge.io/html/python/)的每一对经纬度点开始。 –

0

一种方法是离散多边形的外观为点的集合,并计算在这组点的点和每个点之间的距离:

def longest(poly, p, num): 

    lr = LinearRing(poly.exterior.coords) 
    dist = 0 
    for i in np.linspace(0, lr.length, num): 
     d = p.distance(lr.interpolate(i)) 
     if d > dist: 
      dist = d 
    return dist 


poly = Polygon([(-1, -1), (-2,2), (4,4), (4, -1), (-1, -1)]) 
p = Point(0,0) 
longest(poly, p, 20) 
# out: 5.428886519426354 
longest(poly, p, 100) 
# out: 5.622291976018042 

当然是不准确的,但它可以对许多情况来说是一个合理的近似值。

备注:你不应该使用lon/lat来调整距离。匀称基于笛卡尔坐标系。一般来说,您应该首先投影您的几何图形(使用pyproj),以便能够使用匀称来测量距离。

+1

两个意见。 1)很容易看出,最大距离实际上是在多边形顶点实现的,所以方法是精确的。 2)在一个数组中存储距离,然后对它进行排序以获得最大值的效率相比将最大值存储在变量中并在计算距离时进行比较效率非常低。在处理内存使用情况。 – eguaio

+0

@eguaio感谢您的提示,我更新了答案。关于你的第一点:最长距离是'math.sqrt((4 ** 2)+(4 ** 2))= 5.656854249492381',而函数返回的内容稍有不同。增加'num'参数可以提高准确性(正如我在示例中试图说明的那样)。 –

相关问题