MySQL에 대한 Haversine 공식의 역전?
-
20-08-2019 - |
문제
내 DB에서 나는 반경 (미터)과 함께 중심점을 저장합니다.
나는 LAT/LNG를 전달하려고하고, 내가 저장된 MySQL 값이 내가 전달한 요점이 그 원 안에 있는지 알려주는 원을 만들도록합니다. Haversine Forumla와 비슷한 일을 할 수있는 일이 있습니까 (내 요점이 이미 DB에 있다고 가정 할 것입니다).
Haversine Formula : (3959 * ACOS (COS (Radians (40)) * COS (Radians (Lat)) * COS (Radians (Radians) long
) - 라디안 (-110)) + sin (라디안 (40)) * sin (라디안) long
) ) )
DB :
Circlelatcenter, CirclelngCenter, 반경
통과> Foo에서 ID를 선택하여 lat, lng in
해결책
다른 팁
큰 원 거리를 통해 경계 상자를 계산하고 데이터베이스를 쿼리하여 유사한 지리적 검색을 수행했습니다. 응용 프로그램에서 경계 상자에서 원으로 "모서리를 반올림"하는 다른 패스가 여전히 필요합니다.
따라서 포인트 데이터베이스, 검색 지점 (x, y) 및 거리 d가 주어지면 (x, y)의 d 내에서 모든 점을 찾습니다.
- Deltax를 계산합니다. 이것이 Y 축을 따라 거리 D를 이동 한 경우 지점입니다.
- Deltay를 계산합니다. X 축을 따라 거리 D를 이동 한 경우 요점입니다.
- 경계 상자 계산 : (X-Deltax, Y-Deltay), (X+Deltax, Y+Deltay)
- 포인트의 쿼리 데이터베이스는 연산자간에 SQL을 사용합니다 : x-deltax와 x+deltax 사이의 x와 y-deltay와 y+deltay 사이의 테이블에서 선택 * 선택 *
- 사후 처리 된 포인트 목록을 반환하여 실제 큰 원 거리를 계산하여 거리 원 안에 있지 않은 사각형의 코너에있는 점을 제거합니다.
바로 가기로서, 나는 일반적으로 LAT와 LON의 경우 마일 당 마일을 계산합니다 (적도에서 마일 당 마일이 LON의 기둥에서 다르기 때문에), Deltax 및 Deltay를 (d * Degrees로 도출합니다. -마일 당 선수) 또는 마일 당로드 론. SQL 쿼리 후 실제 거리를 이미 계산하고 있기 때문에 적도 대 극의 차이는 중요하지 않습니다.
참고 -0.167469 ~ 0.014564 마일 당-론-마일 및 0.014483도 마일 1도
나는 이것이 오래된 게시물이라는 것을 알고 있지만, 누군가가 이것을 발견 한 경우, 당신은 전혀 "역 haversine 공식"을 만들 필요가 없습니다. Haversine 공식은 지점 A와 점 B 사이의 거리를 제공합니다. 계산을 위해서는 지점 B와 지점 A 사이의 거리가 필요합니다. 이것들은 같은 값입니다.
SELECT *,
( 3959 * acos( cos( radians(40) ) * cos( radians( `circleLatCenter` ) ) * cos( radians( `circleLngCenter` ) - radians(-110) ) + sin( radians(40) ) * sin( radians( `circleLngCenter` ) ) ) as `haversine`
FROM `table` WHERE 1=1
HAVING `haversine` < `Radius`