문제

지오 코딩 항목 데이터베이스가 있습니다. 총 항목의 하위 집합과는 다른 두 항목이 가장 먼 두 항목을 결정해야합니다. 예를 들어, 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

이제 손에 계산을 수행하고 결과를 별도의 테이블에 저장하는 것이 좋습니다.

다른 팁

그것의 외관으로, 이것은 먼저 찾아서 해결할 수 있습니다. 볼록한 선체 포인트의 (사용 그레이엄의 스캔, 예를 들어)) 회전 캘리퍼 그것의 직경.

무차별 힘 접근 :

  1. 위도 및 경도 값을 평균하여 10 목록의 중심을 찾으십시오.

  2. 데이터베이스의 각 (위도, 경도) 쌍에 대해 Great Circle 공식을 사용하여 단계 (1)에서 중심으로부터의 거리를 계산하십시오.

  3. 가장 큰 두 거리를 선택하십시오.

명백한 최적화 : 세상을 N "사각형"(예 : 10도, 10도 위도)으로 끊고 각 페어링의 중심 사이의 큰 원 거리를 미리 압축하십시오. 이것을 데이터베이스에 저장하십시오. 이제 가장 멀리 떨어진 "사각형"을 빨리 찾아서 타일 내부의 위도 (위도, 경도) 쌍 만 확인할 수 있습니다.

여기에 있습니다 알고리즘 위도와 경도를 기반으로 두 지점 사이의 거리에 대해 PHP에서 구현되었습니다.

"총 항목의 하위 집합"이 큰 경우, 몇 가지 계산이 빠르게 제공됩니다. 이 경우 도시 쌍 사이의 사전 계산 거리를 고려할 수 있습니다.

편집 : 10도 최적화가 작동하지 않는 이유 :

아래 그림과 같이 4 개의 사각형을 사용하십시오

-------------------
|        |        |
|   A    |   B    |
|        |        |
|_______1|________|
|        |2       |
|   C    |   D    |
|        |        |
|_______3|________|

사각형의 중심을 측정하고 그 거리를 비교하면 A와 D가 A와 C보다 더 멀어집니다. 그러나 도시 1과 3은 1과 2보다 분명히 더 분명합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top