문제

내 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

도움이 되었습니까?

해결책

MySQL에는 다양한 공간 데이터 기능이 있습니다.

MySQL에 대한 공간 확장

형상 간의 관계 측정에 관한 섹션은 다음과 같은 것입니다.

기하학 간의 관계

다른 팁

큰 원 거리를 통해 경계 상자를 계산하고 데이터베이스를 쿼리하여 유사한 지리적 검색을 수행했습니다. 응용 프로그램에서 경계 상자에서 원으로 "모서리를 반올림"하는 다른 패스가 여전히 필요합니다.

따라서 포인트 데이터베이스, 검색 지점 (x, y) 및 거리 d가 주어지면 (x, y)의 d 내에서 모든 점을 찾습니다.

  1. Deltax를 계산합니다. 이것이 Y 축을 따라 거리 D를 이동 한 경우 지점입니다.
  2. Deltay를 계산합니다. X 축을 따라 거리 D를 이동 한 경우 요점입니다.
  3. 경계 상자 계산 : (X-Deltax, Y-Deltay), (X+Deltax, Y+Deltay)
  4. 포인트의 쿼리 데이터베이스는 연산자간에 SQL을 사용합니다 : x-deltax와 x+deltax 사이의 x와 y-deltay와 y+deltay 사이의 테이블에서 선택 * 선택 *
  5. 사후 처리 된 포인트 목록을 반환하여 실제 큰 원 거리를 계산하여 거리 원 안에 있지 않은 사각형의 코너에있는 점을 제거합니다.

바로 가기로서, 나는 일반적으로 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`
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top