반응형

Naver 지도 API를 이용한 위도, 경도 구하기

개인적으로 업무를 처리하다보면 주소지의 위치를 찾아보는 일이 많다보니, 1천 여개의 주소를 네이버지도 API를 이용해서 위도, 경도 값을 찾아내는 일을 주기적으로 하고 있습니다. 그동안 파이썬으로 해오던 것을 Golang으로 변환하면서 기록차 코드를 남깁니다.

 

아래의 코드는 단순하게 주소 string을 받아서 "경도 값, 위도 값" string을 반환하는 코드입니다. string으로 반환하지 않고 float으로 변환하시려면 strcov 등을 사용하시면 될 것으로 보입니다.

 

본래 API에서 얻어진 것은 json형태라 구조체를 만들고 구조체에 json을 담는 것이 정석이겠지만, 위경도 값만 받아내면 되는 일인지라  굳이 구조체를 안 만들고 코드 뒷부분에 문자열을 자르고 x와 y를 찾는 이상한 코드가 있습니다.

 

import (
	"net/http"
	"net/url"
	"log"
	"strings"
)

var clientId string = "NAVER MAP API ID"
var clientSecret string = "NAVER MAP API SECRET"

// 주소를 이용하여 위도, 경도 값 받아오기 (NAVER API 이용)
func FindLocation(address string) (string, error) {
	var tAddress string = strings.TrimSpace(address)
    
	value := url.Values{}
	value.Set("query", tAddress)
	naverMapUrl := &url.URL{
		Scheme:   "https",
		Host:     "naveropenapi.apigw.ntruss.com",
		Path:     "map-geocode/v2/geocode",
		RawQuery: value.Encode(),
	}
	request, err := http.NewRequest("GET", naverMapUrl.String(), nil)
	if err != nil {
		log.Panic(err)
	}

	request.Header.Add("X-NCP-APIGW-API-KEY-ID", clientId)
	request.Header.Add("X-NCP-APIGW-API-KEY", clientSecret)

	client := &http.Client{}
	response, err := client.Do(request)
	if err != nil {
		log.Panic(err)
	}
	defer response.Body.Close()
	if response.StatusCode != 200 { // 요청 실패시
		return "", fmt.Errorf("StatusCode : %d", response.StatusCode)
	}
	bytes, err := ioutil.ReadAll(response.Body)
	str := string(bytes)
	
	x := ""
	y := ""
	coordinate := ""
	strList := strings.Split(str, ",")
	for i := 0; i < len(strList); i++ {
		if len(strList[i]) > 5 && strList[i][:3] == "\"x\"" {
			tmp := strings.Split(strList[i], "\"")
			x = tmp[3]
		} else if len(strList[i]) > 5 && strList[i][:3] == "\"y\"" {
			tmp := strings.Split(strList[i], "\"")
			y = tmp[3]
		}
	}
	coordinate = x + "," + y

	return coordinate, nil
}
반응형

+ Recent posts