목록에서 LAT/Long 사이의 가장 긴 거리
문제
지오 코딩 항목 데이터베이스가 있습니다. 총 항목의 하위 집합과는 다른 두 항목이 가장 먼 두 항목을 결정해야합니다. 예를 들어, 10 개의 항목 목록을 선택한 다음 해당 목록에서 해당 목록 내에서 가장 큰 거리를 나타냅니다.
나는 이것에 접근하는 방법을 둘러싼 머리를 감싸 수 없습니다. 나는 라디안을 사용하는 것을 고려했지만 요구 사항을 충족시키는 것은 없습니다.
참고로 여기로가는 램프 스택 ...
해결책
다음 쿼리는 모든 지점 사이의 거리를 계산하고 가장 큰 거리로 둘을 반환합니다.
SELECT coor1.longitude as lon1,
coor1.latitude as lat1,
coor2.longitude as lon2,
coor2.latitude as lat2,
(ACOS(
COS(RADIANS(coor1.latitude)) *
COS(RADIANS(coor1.longitude)) *
COS(RADIANS(coor2.latitude)) *
COS(RADIANS(coor2.longitude)) +
COS(RADIANS(coor1.latitude)) *
SIN(RADIANS(coor1.longitude)) *
COS(RADIANS(coor2.latitude)) *
SIN(RADIANS(coor2.longitude)) +
SIN(RADIANS(coor1.latitude)) *
SIN(RADIANS(coor2.latitude))
) * 6378 --- Use 3963.1 for miles
)
AS DistanceKM
FROM coordinates coor1,
coordinates coor2
WHERE NOT (coor1.longitude = coor2.longitude AND coor1.latitude = coor2.latitude)
ORDER BY DistanceKM DESC
LIMIT 1; --- Only the biggest
이제 손에 계산을 수행하고 결과를 별도의 테이블에 저장하는 것이 좋습니다.
다른 팁
무차별 힘 접근 :
위도 및 경도 값을 평균하여 10 목록의 중심을 찾으십시오.
데이터베이스의 각 (위도, 경도) 쌍에 대해 Great Circle 공식을 사용하여 단계 (1)에서 중심으로부터의 거리를 계산하십시오.
가장 큰 두 거리를 선택하십시오.
명백한 최적화 : 세상을 N "사각형"(예 : 10도, 10도 위도)으로 끊고 각 페어링의 중심 사이의 큰 원 거리를 미리 압축하십시오. 이것을 데이터베이스에 저장하십시오. 이제 가장 멀리 떨어진 "사각형"을 빨리 찾아서 타일 내부의 위도 (위도, 경도) 쌍 만 확인할 수 있습니다.
여기에 있습니다 알고리즘 위도와 경도를 기반으로 두 지점 사이의 거리에 대해 PHP에서 구현되었습니다.
"총 항목의 하위 집합"이 큰 경우, 몇 가지 계산이 빠르게 제공됩니다. 이 경우 도시 쌍 사이의 사전 계산 거리를 고려할 수 있습니다.
편집 : 10도 최적화가 작동하지 않는 이유 :
아래 그림과 같이 4 개의 사각형을 사용하십시오
-------------------
| | |
| A | B |
| | |
|_______1|________|
| |2 |
| C | D |
| | |
|_______3|________|
사각형의 중심을 측정하고 그 거리를 비교하면 A와 D가 A와 C보다 더 멀어집니다. 그러나 도시 1과 3은 1과 2보다 분명히 더 분명합니다.