2012-12-19 3 views
2

기본적으로 사용자 위도 및 경도 값 (각각 $userLat, $userLong)을 사용하여 php 파일로 GET 요청을 보냅니다. (미터)사용자 좌표 및 반지름을 기반으로 테이블에서 데이터를 검색하는 방법

  • LOCATION_NAME
  • 위도
  • LNG
  • 반경

그래서 내 데이터베이스에서
, 나는 다음과 같은 열이있는 테이블 '위치'가 나는 모든 위치 좌표와 사용자의 좌표를 비교하고 Location과 User 사이의 거리가 < = 해당 loc의 반지름인지 확인하는 쿼리를 만들고 싶습니다. ation. 그렇다면 해당 위치의 이름을 반환하십시오.


쿼리는이 (의사 코드) 같은 것이다 :

위치에서

SELECT LOCATION_NAME WHERE distanceBetween (($ userLat, $ userLong) AND (위도, LNG)) < = 반경

+2

매우 유용한 설명 http://de.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL –

+0

중복 된 http://stackoverflow.com/questions/1896213/determine-if- 원 포인트 좌표가 다른 것 –

답변

2

@ socca1157과 같은 쿼리를 사용했지만 쿼리 초기에 3959이라는 작은 설명을 제공 할 수 있다고 생각했습니다.

대신 마일 km에서 검색하기를 원한다면 내 예제는

$address = urlencode($_GET['user-address']); 

$earth_radius = 3959; 
$search_radius = 100; 

$ch = curl_init('https://maps.google.com/maps/api/geocode/json?address='.$address.'&sensor=false'); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$geocode = curl_exec($ch); 
curl_close($ch); 

$output = json_decode($geocode); 

$lat = $output->results[0]->geometry->location->lat; 
$lng = $output->results[0]->geometry->location->lng; 


$sql = "SELECT *, ($earth_radius * acos(cos(radians($lat)) * cos(radians(latitude)) * cos(radians(longitude) - radians($lng)) + sin(radians($lat)) * sin(radians(latitude)))) AS distance FROM table WHERE isActive = 1 HAVING distance < $search_radius ORDER BY distance LIMIT 5"; 
$result = mysql_query($sql); 

때문에 사용자의 주소의 위도와 LNG를 얻을 수

, 예를 들어, 당신은 km에서 지구 반경을 사용하는 것을 , 6,371km입니다.

+0

고마워요! 완벽하게 테스트 해본 결과입니다. 감사합니다 –

+0

아무 문제 없어, 다행 했어! – martincarlin87

2

당신이 찾고있는 쿼리는 다음과 같습니다

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;

Google Map's article에서 가져 왔습니다.

관련 문제