티스토리 뷰

구글 맵을 이용해서 지도에 특정 주소를 마커로 표시해줘야하는 프로젝트가 있었습니다.


위도와 경도를 갖고 있지 않아서

한글 주소(도로명또는 구주소)를 가지고 위도와 경도를 구해야 했습니다.


구글의 Geocoder를 이용했는데, 한글주소가 안나오는 경우가 있었습니다.

그래서 안나오는 주소의 경우 네이버맵 API를 이용해서 주소를 갖고 오게됐습니다.


관련 코드를 포스팅 합니다.


/**
* 지오코더(구글꺼)에서 좌표를 가져온다.
*/
private Point getPointFromGeoCoder(String addr) {
Point point = new Point();
point.addr = addr;

Geocoder geocoder = new Geocoder(context);
List<Address> listAddress;
try {
listAddress = geocoder.getFromLocationName(addr, 1);
} catch (IOException e) {
e.printStackTrace();
point.havePoint = false;
return point;
}

if (listAddress.isEmpty()) {
point.havePoint = false;
return point;
}

point.havePoint = true;
point.x = listAddress.get(0).getLongitude();
point.y = listAddress.get(0).getLatitude();
return point;
}

getPointFromGeocoder는 한글주소를 가지고 구글의 GeoCoder를 통해서 Point클래스의 인스턴스를 리턴합니다.

Point 클래스는 아래와 같습니다.


class Point {
// 위도
public double x;
// 경도
public double y;
public String addr;
// 포인트를 받았는지 여부
public boolean havePoint;

@Override
public String toString() {
StringBuilder builder = new StringBuilder();
builder.append("x : ");
builder.append(x);
builder.append(" y : ");
builder.append(y);
builder.append(" addr : ");
builder.append(addr);

return builder.toString();
}
}

포인터 클래스입니다. 모델로 위도와 경도 필드와 한글 주소를 가지고 있습니다.



/**
* 네이버 맵 api를 통해서 주소를 가져온다.
* https://developers.naver.com/docs/map/overview/
*/
private Point getPointFromNaver(String addr) {
Point point = new Point();
point.addr = addr;

String json = null;
String clientId = NAVER_CLIENT_ID;// 애플리케이션 클라이언트 아이디값";
String clientSecret = NAVER_CLIENT_SECRET;// 애플리케이션 클라이언트 시크릿값";
try {
addr = URLEncoder.encode(addr, "UTF-8");
String apiURL = "https://openapi.naver.com/v1/map/geocode?query=" + addr; // json
URL url = new URL(apiURL);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("X-Naver-Client-Id", clientId);
con.setRequestProperty("X-Naver-Client-Secret", clientSecret);
int responseCode = con.getResponseCode();
BufferedReader br;
if (responseCode == 200) { // 정상 호출
br = new BufferedReader(new InputStreamReader(con.getInputStream()));
} else { // 에러 발생
br = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = br.readLine()) != null) {
response.append(inputLine);
}
br.close();
json = response.toString();
} catch (Exception e) {
e.printStackTrace();
}

if (json == null) {
return point;
}

Log.d("TEST2", "json => " + json);

Gson gson = new Gson();
NaverData data = new NaverData();
try {
data = gson.fromJson(json, NaverData.class);
} catch (Exception e) {
e.printStackTrace();
}

if (data.result != null) {
point.x = data.result.items.get(0).point.x;
point.y = data.result.items.get(0).point.y;
point.havePoint = true;
}

return point;
}

네이버 API를 이용한 주소 가져오기 입니다.

해당 API를 이용하기 위해서는 클라이언트 아이디와 클라이언트 SECRET이 필요한데,

https://developers.naver.com/docs/map/overview/ 에서 발급이 가능합니다.

네이버 주소를 가져온 후에 값을 얻기 위해 Gson을 사용해서

compile 'com.google.code.gson:gson:2.6.1'

gson가져다 써야합니다.


해당 샘플은 아래의 깃헙에 공유해 두었습니다.

https://github.com/karrel84/MapCoordinate2


이상으로 한글주소를 기반한 위도와 경도를 가져오는 포스팅을 마칩니다.

필요하신분들께 공유드리며, 이보다 더 좋은 방법이 있을경우 공유부탁드립니다.

감사합니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크