경도 위도를 이용한 기준 반경 내 업체 구하기 [PHP, MySQL 이용]
이번에 작업 중인 사이트.. 수시로 정책이 바뀌어서 고생하고 있는.. 사이트에서 반경을 이용한 업체 검색 기능이 필요해서 구글링 좀 하고 잔머리를 좀 굴려서 원하는 기능을 구현했다. 각 지점의 경도와 위도는 네이버 지도API를 이용해 얻어온다. 그런 다음 경도 위도를 DB에 저장하고 Query를 이용해 기준 반경 내 업체를 구하는 식이다.
1. 네이버 지도 API에서 경도, 위도 받아오기
우선 네이버 지도 API를 이용하기 위해서는 Key를 등록해야 한다. http://dev.naver.com/openapi/register 에 접속한다. 로그인이 되어야 정상적으로 이용할 수 있다. 그런 다음 아래 화면처럼 지도키 발급에서 사이트 주소를 입력하고 키를 발급받도록 한다.
그런 다음 경도 위도를 확인하기 위해서 아래 주소로 접속한다. test_key 부분은 위에서 발급 받은 키로 변경한다. 좌표확인URL은 아래와 같다.
http://openapi.map.naver.com/api/geocode.php?key=test_key&encoding=utf-8&coord=latlng&query=서울 강남구 논현1동
더 자세한 사용법은 http://dev.naver.com/openapi/apis/map/javascript_2_0/reference#CT_URL 에서 확인 가능.
아래는 결과 화면이다.
결과는 XML 포맷으로 전달되는 데 x, y 값이 우리가 원하는 값이다. XML 파싱 부분은 검색을 통해서.. ^^;
간단히 내가 사용한 XML Parser는 http://www.criticaldevelopment.net/xml/ 에서 얻을 수 있으며 파서 파일을 PHP 파일에 include 한 후 아래 코드를 이용해 XML에서 좌표를 얻어낸다.
<?php
$source ="http://openapi.map.naver.com/api/geocode.php?key=test_key&encoding=utf-8&coord=latlng&query=";
$address = urlencode($address);
$query = $source . $address;
$xml = file_get_contents($query);
$parser = new XMLParser($xml);
$parser->Parse();
$lng = $parser->document->item[0]->point[0]->x[0]->tagData;
$lat = $parser->document->item[0]->point[0]->y[0]->tagData;
?>
test_key 부분은 위에서 발급받은 키로 변경해야 한다. 그리고 php 파일이 위치한 서버의 도메인과 발급받은 키의 도메인이 일치하지 않으면 실행되지 않는다. www가 붙은 도메인과 붙지 않은 도메인은 서로 다르게 인식되는 듯 하다.
2. MySQL Query를 이용해 기준 반경내 업체 검색
우선 경도 위도를 저장할 필드를 추가해줘야 한다. DATA 타입은 아래와 같이 하면 된다. 필드 명은 적당히 변경.
이제 기준점 (127.0000000, 37.0000000)에서 DB에 저장된 지점의 거리를 계산하는 Query를 작성해보자.
SELECT id, ( 6371 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(127) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM TEST_TABLE HAVING distance < 5 ORDER BY distance LIMIT 0 , 5;
위의 쿼리는 TEST_TABLE에서 기준점에서 반경 5Km 이내의 id를 거리가 가까운 순서로 5개 가져오는 것이다.
참고 : http://code.google.com/intl/ko/apis/maps/articles/phpsqlsearch_v3.html
결과 값이 얻어지면 이제 원하는 기능을 하도록 코드를 작성하면 된다.
위도 경도 계산법 잘봤습니다.
지금같은 경우에는 위도 경도를 계싼해서 조건으로 걸리는건데
데이터가 많은경우엔 인덱스를 타지 못해서 문제가되는데
사용자가 위 경도를 통하여 예로 4키로 이내의 위도 범위 경도 범위를 구할수있나영?
and 위도 between 반경시작 adn 반경종료
and 경도 between 반경시작 adn 반경종료
이렇게 하려고하는데..계산법을모르겠네영.
블로그 방문해 주셔서 감사합니다.
테스트를 해본 것은 아니지만 아래처럼 하면 어떨까 싶습니다.
FROM TEST_TABLE WHERE 조건 HAVING distance < 5조건 부분에 말씀하신 내용을 넣으시고 테스트해보시면 될 것 같습니다.
편리님을 sir이 아닌곳에서 보는건 첨이네요
이번에 지도 작업때문에 여기저기 검색하다 왔는데
좋은 자료 감사드립니다 ^^
방문해 주시고 댓글 남겨주셔서 감사합니다.
감사 감사 또 감사드립니다. 사용자의 위도와 경도를 둘 다 근접하는 코드를 생각하고 있었는데 여기서 도움을 받네요. 감사합니다~
방문해주시고 댓글 남겨주셔서 감사합니다.