예와 해당 이미지를 참조하십시오.
다음을 달성하고 싶습니다 . 아래에 A 및 B 로 표시된 두 위치 (lat / lng)를 제공하십시오 . 이것으로부터 가상 선이 그려지고이 선과 C 사이의 거리 가 계산됩니다 (모든 측정에서).
나는 현재 Google Maps API v3에서 이것을 달성했지만 원하는 언어로 무대 뒤에서 이것을 수행 할 수 있기를 원합니다. 모든 팁 / 아이디어는 대단히 감사하겠습니다!
예와 해당 이미지를 참조하십시오.
다음을 달성하고 싶습니다 . 아래에 A 및 B 로 표시된 두 위치 (lat / lng)를 제공하십시오 . 이것으로부터 가상 선이 그려지고이 선과 C 사이의 거리 가 계산됩니다 (모든 측정에서).
나는 현재 Google Maps API v3에서 이것을 달성했지만 원하는 언어로 무대 뒤에서 이것을 수행 할 수 있기를 원합니다. 모든 팁 / 아이디어는 대단히 감사하겠습니다!
답변:
def get_perp( X1, Y1, X2, Y2, X3, Y3):
"""************************************************************************************************
Purpose - X1,Y1,X2,Y2 = Two points representing the ends of the line segment
X3,Y3 = The offset point
'Returns - X4,Y4 = Returns the Point on the line perpendicular to the offset or None if no such
point exists
'************************************************************************************************ """
XX = X2 - X1
YY = Y2 - Y1
ShortestLength = ((XX * (X3 - X1)) + (YY * (Y3 - Y1))) / ((XX * XX) + (YY * YY))
X4 = X1 + XX * ShortestLength
Y4 = Y1 + YY * ShortestLength
if X4 < X2 and X4 > X1 and Y4 < Y2 and Y4 > Y1:
return X4,Y4
return None
내가 실수하지 않는 한 가장 짧은 길이는 필요한 거리입니까?
None
, 합법적 인 솔루션이 존재할 때이 코드가 너무 자주 반환 되는 것 같습니다 . 문제는 마지막 조건이 항상 보장 할 수없는 X1 <X2 및 Y1 <Y2를 가정한다는 것입니다. 사이의 더 나은 테스트가 필요합니다.
어쩌면 나는 그것을 너무 복잡하게 만들지 만, 원하는 것은 점에서 선까지의 거리입니다. 그것은 AB와 직교하는 선으로 AB와 C를 연결하는 AB를 따른 점으로부터의 거리입니다. AB에 수직 인이 벡터는
v=[x2-x1, -(y2-y1)] # Point A is [x1,y1] Point B is [x2,y2]
(대괄호를 사용하여 벡터 또는 두 요소 배열을 정의했습니다). C [xp, yp]와 점 A 사이의 거리는
u=[x1-xp, y1-xp]
선과 C 사이의 거리는 u를 v에 투영 한 것입니다. mod (v) = 1이라고 가정하면 (정규화)
distance = u*v = abs( (x2-x1)*(y1-yp) - (x1-xp)*(y2-y1) )
유일한 합병증은 좌표가 WGS84 위도 / 로그 쌍이 아니라 투영 (또는 측지 좌표 사용)하는지 확인하려는 것입니다. 이를 위해 OGR 또는 Proj4 를 사용할 수 있습니다 .
이 모든 수학에 약간의 역점을두기 때문에 다른 각도에서 나올 것입니다. 가상 라인이 아닌 '실제'라인으로 만든 다음 기존 도구를 사용합니다.
A와 B가 속성을 공유하는 경우 선을 그려서 연결할 수 있습니다 (Kosmo GIS에는 점에서 선을 만드는 도구가 있으며 QGIS 플러그인도 있다고 생각합니다). 선이 있으면 'C'포인트 레이어의 '가까이'기능이 선까지의 거리를 제공합니다. 소프트웨어가 당신을 위해 수학을 처리하자!
Android에서 Java를 사용하는 경우 라이브러리 함수가있는 유일한 한 줄
import static com.google.maps.android.PolyUtil.distanceToLine;
distanceToLine :
public static double distanceToLine(LatLng p, LatLng start,LatLng end)
점 p와 선분 시작점 사이의 구에서 거리를 계산합니다.
매개 변수 : p-측정점
start-선분의 시작
end-선분의 끝
반환 : 미터 단위의 거리 (구면 지구를 가정)
라이브러리를 추가하십시오.
dependencies {
compile 'com.google.maps.android:android-maps-utils:0.5+'
}