본문 바로가기
나의 정보/정보

구글맵 API, 좌표로 주소 구하기(Reverse Geocoding)

by 상오기™ 2009. 7. 28.
구글맵 API를 이용하여 좌표를 넘기면 좌표에 해당하는 주소가 전달이 됩니다.


처음엔 스누피 클래스를 이용하여 반환값을 읽어 왔는데 계속 영문 주소로만 나오는 것이었습니다.

찾아보니 HTTP 헤더를 어떻게 해주면 된다고 하길래 전에 사용하던 소켓 함수를 사용해서 반환값을 읽어오니 계속 영문으로 나옵니다 ㅡㅡ

혹시나 싶어서 maps.google.com 대신 maps.google.co.kr 을 사용하니 한글로 나옵니다~!

maps.google.com => 영문 주소를 던져줌

maps.google.com => 영문 주소를 던져줌


maps.google.co.kr => 한글 주소를 던져줌

maps.google.co.kr => 한글 주소를 던져줌


스누피 클래스로 테스트할때도 co.kr을 사용해봤는데 영문으로 나왔던걸 보면 HTTP 헤더와 관련이있긴 있나 봅니다 ^^;

HTTP 해더에 자세히 아는게 없으니 패스~~~~~ ㅡㅡ



참고로 야후 API에서도 좌표로 주소를 구하는 API가 제공이 됩니다.


구글맵 API를 이용시 계속 영문으로 나와서 야후 API를 사용 했는데 처음엔 잘 나오다가 몇번 테스트를 하다보니 주소가 나오질 않습니다.

전달되는 값을보니 "limit" 어쩌고 뜨는걸 보니 IP가 차단을 당했더군요~!

예전에 야후 사전을 클리핑 할때도 한번에 많이 긁어오면 아이피 차단으로 하루동안 사용을하지 못했었는데이게 API에서도 같이 적용이 되나 봅니다.

많이도 아니고 10번 이하로 테스트 했는데 바로 차단이 되었습니다.

야후에서 IP 차단하는건 일정 시간에 일정 횟수 이상을 접속하면 DDOS 공격으로 판단하고 차단하는게 아닌가 싶었는데 그 조건이 더 강화가 되었나 봅니다 ^^;

많이(자주) 사용(접속)한다고 IP를 차단할거면 API는 왜 제공해? ㅡㅡ

최소한 IP당 5만회라고 명시한 수준의 반이라도 봐줘야 하는거 아니니?

야후! 주소 ↔ 좌표 변환 API는 한 IP당 1일 50,000회의 질의로 제한되어 있습니다.

5만회는 고사하고 100회도 안썼는데 너무 빡빡하잖아~^^:;

API 이용해서 프로그램을 만들면 짧은 시간에 여러번 쿼리를 날릴수도 있는건데.... ㅡㅡ




야후에 대한 불만은 이만 접고 구글맵 API로 어떻게 해결이 된건지는 모르겠지만 일단 잘 동작하고 있는 소스를 첨부 합니다 ^^;

PHP 예제 소스

function ReadSocket($url, $check) {
    $info = parse_url($url);
    $host = $info["host"];
    $port = $info["port"];
    $path = $info["path"];
    
    if ($port == 0) $port = 80;
    if(empty($path)) $path = "/";
    if(empty($host)) {
        return false;
    }
    
    if ($info["query"] != "") $path .= "?" . $info["query"];
    
    if ($check =="GET") {
        $out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";
    } else {
        $out = "POST $path HTTP/1.0\r\nHost: $host\r\n\r\n";
    }
    
    $fp = @fsockopen($host, $port, $errno, $errstr, 30);
    usleep(50);
    
    if ($fp) {
        socket_set_timeout($fp, 30);
        fputs($fp, $out);
        $start = false;
        $retVal = "";
    
        while(!feof($fp)) {
            $tmp = fgets($fp, 1024);
            if ($start == true) $retVal .= $tmp;
            if ($tmp == "\r\n") $start = true;
        }
    
        fclose($fp);
        
        return $retVal;
    }
}

function ReverseGeocoding($lat, $lon) { //좌표를 주소로 변환
    $api_key = "구글맵 API 키를 발급받아 사용";
    $url = "http://maps.google.co.kr/maps/geo?q=".$lat.",".$lon."&output=xml&oe=utf8&sensor=false&key=".$api_key;
    
    $data = ReadSocket($url, "GET"); //POST시 에러 ㅡㅡ
    $xml = simplexml_load_string($data);
    $address = $xml->Response->Placemark->address;
    
    return $address;
}

그냥 간단하게 file_get_contents 함수를 이용해도 되겠군요 ㅡㅡ



이 글은 '상오기 : 자전거 여행과 GPS~!' 의 "상오기™ (sangogi@gmai.com)" 이 작성 하였습니다.
"상업적 이용 금지, 원본 출처(링크 포함) 및 저작자 표시, 내용 변경 금지"의 조건으로 자유롭게 사용하실 수 있으며 저작권에 대한 자세한 내용은 "저작권 안내를 참고 하시기 바랍니다.