2017-09-17 38 views

답변

2

g1.hausdorff_distance(g2) fuction를 반환하는 Hausdorff distance을 시도해보십시오

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' 인수를 늘리면 정확도가 높아집니다 (예제에서 설명하려했듯이). –