programing

지리적 근접도를 계산하는 공식

newsource 2022. 9. 29. 00:21

지리적 근접도를 계산하는 공식

응용 프로그램에 지역 근접 검색을 구현해야 하는데 올바른 수식이 무엇인지 매우 혼란스럽습니다.웹 및 StackOverflow에서 몇 가지 검색한 결과 다음과 같은 솔루션이 있음을 알 수 있었습니다.

  1. Haversine 공식 사용
  2. 대원 거리 공식 사용
  3. 데이터베이스에서 공간 검색 엔진 사용

옵션 #3은 제 ATM기에서는 선택사항이 아닙니다.대원거리 공식과 해버신 공식은 동의어라고 항상 생각했기 때문에 조금 혼란스럽습니다만, 분명히 제가 틀렸습니다.

해버신 포뮬러

위의 스크린샷은 MySQL을 사용놀라운 Geo(근접성) 검색에서 가져온 것으로 다음 기능을 사용합니다.

ASIN, SQRT, POWER, SIN, PI, COS

같은 공식(구면 코사인 법칙)에서 다음과 같은 변형을 본 적도 있습니다.

(3956 * ACOS(COS(RADIANS(o_lat)) * COS(RADIANS(d_lat)) * COS(RADIANS(d_lon) - RADIANS(o_lon)) + SIN(RADIANS(o_lat)) * SIN(RADIANS(d_lat))))

다음 기능을 사용합니다.

ACOS, COS, RADIANS, SIN

저는 수학 전문가는 아니지만, 이 공식들은 같은 건가요?많은 변형과 공식(코사인 구체의 법칙과 빈센티 공식 등)을 발견했는데, 그게 더 혼란스러워...

PHP/MySQL에 구현할 범용 수식을 선택해야 합니다.위에 언급한 공식의 차이점을 설명해 줄 수 있는 사람?

  • 어느 것이 가장 빨리 계산됩니까?
  • 가장 정확한 결과를 제공하는 것은 무엇입니까?
  • 결과의 속도/정확성 측면에서 가장 좋은 것은 무엇입니까?

이 질문들에 대한 당신의 통찰에 감사드립니다.


이론적인 답변을 바탕으로 다음 대원거리 공식을 테스트했습니다.

  • 빈센트 포뮬러
  • 해버신 포뮬러
  • 구면 코사인 법칙

Vincenty Formula는 매우 느리지만 정확합니다(0.5mm까지 감소).

Haversine Formula는 Vincenty Formula보다 훨씬 빠릅니다.약 6초 만에 100만 개의 계산을 실행할 수 있었습니다.이것은 제 요구에 거의 만족할 수 있습니다.

구면 코사인 공식의 법칙은 Haversine 공식보다 거의 두 배 빠른 것으로 밝혀졌으며, 대부분의 사용 사례에서 정밀도 차이는 무시입니다.


테스트 장소는 다음과 같습니다.

  • 구글 본사(37.422045,-122.084347)
  • 샌프란시스코, 캘리포니아 (37.77493,-122.419416)
  • 에펠탑(프랑스)48.8582,2.294407)
  • 오페라 하우스(시드니)-33.856553,151.214696)

Google HQ - 샌프란시스코, 캘리포니아:

  • Vincenty 식 :49 087.066 meters
  • 공식: Haversine 공식:49 103.006 meters
  • : 코사인:49 103.006 meters

Google HQ - 에펠탑, 프랑스:

  • Vincenty 식 :8 989 724.399 meters
  • 공식: Haversine 공식:8 967 042.917 meters
  • : 코사인:8 967 042.917 meters

Google HQ - 오페라 하우스, 시드니:

  • Vincenty 식 :11 939 773.640 meters
  • 공식: Haversine 공식:11 952 717.240 meters
  • : 코사인:11 952 717.240 meters

Haversine 공식과 구면 코사인 공식 사이에는 에 띄는 차이가 없지만, 구면 대신 지구의 타원형 근사치를 사용하기 때문에 둘 다 빈센트 공식에 비해 거리 간격띄우기가 22km나 됩니다.

코사인 법칙과 하버사인 공식은 무한정밀 기계를 가정할 때 동일한 결과를 제공합니다.Haversine 공식은 부동소수점 오류에 대해 더 강력합니다.그러나 오늘날의 기계는 유효 숫자 15개의 두 배의 정밀도를 가지고 있으며 코사인 법칙이 당신에게는 잘 적용될 수 있습니다.두 공식 모두 구면 지구를 가정하는 반면, Vicenty의 반복해(가장 정확한)는 타원형 지구를 가정한다.참고 자료: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html

더 좋아진다: Haversine과 마찬가지로 코사인 법칙에 사용되는 위도는 지구중심 위도로, 측지 위도와는 다르다.구면에서는 이 두 개가 같습니다.

어느 쪽이 계산이 가장 빠릅니까?

가장 빠른 것부터 느린 것까지 순서대로 코사인 법칙(5trig. calls) -> haversine (involves sqrt) -> Vicenty (이 문제를 for 루프에서 반복적으로 해결해야 합니다)

어느 것이 가장 정확할까요?

빈티지.

속도와 정확성을 모두 고려할 때 어느 것이 가장 좋은가?

계산하려는 거리에 대해 지구가 평평하다고 간주할 수 있는 문제 영역인 경우 x = kx * 경도 차이, y = ky * 위도 차이 형식의 공식을 구할 수 있습니다(자세한 내용은 설명하지 않습니다).그런 다음 거리 = sqrt(dxdx + dydy).거리 제곱으로 해결할 수 있는 문제 영역인 경우 평방rt를 구할 필요가 없습니다.이 공식은 가능한 한 빨리 구할 수 있습니다.x는 동쪽 방향의 거리, y는 북쪽 방향의 거리 등 벡터 거리를 계산할 수 있다는 장점이 있습니다.그렇지 않으면 이 세 가지를 실험한 후 상황에 가장 적합한 것을 선택하십시오.

원하는 것은 다음과 같습니다.

  • p0에서 거리를 기준으로 레코드를 정렬하다
  • p0으로부터의 거리가 r보다 작은 레코드만 선택

요령이라면, 그것을 위해 큰 원의 거리를 계산할 필요가 없다는 것입니다! 쌍의 점으로부터 점 사이의 큰 원 거리에 따라 엄밀하게 증가하는 실제 값까지의 함수를 사용할 수 있습니다.이러한 함수는 여러 가지가 있으며 정확한 큰 원 거리에 대한 다양한 공식보다 계산 속도가 훨씬 빠른 것도 있습니다.그러한 함수 중 하나가 3D에서의 유클리드 거리이다.위도와 경도를 구의 3D 지점으로 변환하는 데는 역삼각함수가 필요하지 않습니다.

x, Y, Z가 있으면 p0에서 점까지의 거리가 실제로 필요하지 않다는 것을 알 수 있습니다. p0에서 접선 평면까지의 거리를 사용할 수도 있기 때문입니다.이 거리는 원의 거리가 클수록 엄격히 커지고 X, Y, Z에서 선형 조합으로 계산되며 제곱근도 필요하지 않습니다.원하는 큰 원 거리에 해당하는 계수와 컷오프 거리만 미리 계산하면 됩니다.

언급URL : https://stackoverflow.com/questions/2096385/formulas-to-calculate-geo-proximity