2016-06-13 4 views
0

주어진 위도/경도에서 주어진 반경 내에서 지구상의 특정 점을 찾는 다른 수식을 테스트하고 있습니다. 저는 '코사인의 구형 법칙 (spherical law of cosines)'과 Haversine의 구현이라고 생각하는 것을 사용했습니다. 하기 화학식 들어SQL 쿼리의 코사인/빈센트 haversine/spherical 법칙

, 이들의 변수 :

[$ 위도/$의 경도 = 원점

[위도/경도 = 두 번째 점의 포인트

[$ 반경 = 코사인

3959 * acos(cos(radians('.$lat.')) * cos(radians(latitude)) * cos(radians(longitude) - radians('.$lon.')) + sin(radians('.$lat.')) * sin(radians(latitude)))) <= '.$radius.'; 

하버 사인의 반경

구형 법 (적어도 나는 그것이라고 생각한다!)

3959*3.1415926*sqrt((latitude-'.$lat.')*(latitude-'.$lat.') + cos(latitude/57.29578)*cos('.$lat.'/57.29578)*(longitude-'.$lon.')*(longitude-'.$lon.'))/180) <= '.$radius.';'; 

처음에는 Haversine이 정확성만큼이나 중요한 표준이라고 말하는 많은 정보를 접하게되었다. 그러나 코사인의 구형 법칙이 측정되는 거리가 5 미터 이상인 한 Haversine보다 더 정확하다는 의견도 있습니다. 게다가, 어떤 사람들은 Vincenty가 정확도에서이 둘을 모두 능가한다고 말합니다.

세 가지 질문 :

내 하버 사인 공식 실제로 하버 사인 또는 뭔가 다른

인가?

어떤 아이디어가 가장 정확합니까?

누구나 위 포럼의 라인을 따라 Vincenty의 공식을 제게 제공 할 수 있습니까?

감사합니다.

답변

-1

내 대답은 제 1 및 제 2 대답

Q1에 대한 더 구체적인 될 것입니다 : 그것은 뭔가 다른 내 하버 사인 공식 실제로 하버 사인 아니면?

나는 돈이 귀하의 하버 사인 공식을 이해하지 당신은 쓰기 하나 그것을 만든 정확히 하버 사인 수식에 대한 SQL 쿼리는 구글 개발자 사이트에서 그 Click Here For Details

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20; 

가장 가까운을 찾을 수이 SQL 문을 37, -122 좌표에 반경 25 마일 이내의 20 개 위치. 해당 행의 위도/경도와 대상 위도/경도를 기반으로 거리를 계산 한 다음 거리 값이 25보다 작은 행만 묻고 전체 쿼리를 거리별로 정렬하고 20 개의 결과로 제한합니다. 마일 대신 킬로미터 단위로 검색하려면 3959를 6371로 바꿉니다.

이 SQL 쿼리에 대한 변경 사항을 정확히 수행 할 수 있습니다.

질문 2 : 어떤 아이디어가 가장 정확합니까?

누가 이길 수 있는지에 대한 최종 답이 없습니다.하지만 우리는 해결할 수 :

1.Haversine가 더 빠릅니다. 코사인의

2.Spherical 법은 작은 거리를 더 정확합니다.

는 그리고 Q3에 대해 나는 vincenty 수식이 가장 정확하다는 것을 알고 있지만 그것은 가장 느린 하나

+0

Q1 : 귀하의 추천 수식이 'SELECT ID로 시작합니다 (3959 * ACOS ('... 코사인 공식의 구형 법으로'acos' 브랜드는, 확실히하지 하버 사인 식 Q2.1 코사인의 구형 법칙은 작은 차이에 비해 정확하지 않습니다. –

0

귀하의 소위 하버 사인 공식이 완전히 잘못이다.

첫째는 7 개 왼쪽 괄호와 8 바로 괄호가 포함되어 있습니다. 라디안에서

둘째 변환 후 일정한 PI까지 표리 다운 상수 180있다 57.29578로 나눈 경우에 행해진 다.

셋째 haversine(x) = sin(x/2) ** 2 나는 어디서나 / 2 표시되지 않습니다.

넷째는 전방 근처 asin 함수 호출이 있어야한다.

올바른 식 here