본문 바로가기

이상/Server

[Spring Boot] 주소에서 위/경도 가져오기 (with Geocoding API)

반응형

지도에 특정 위치를 표시해주는 기능이 필요할 경우,

 

주소를 위/경도로 변환해주는 기능이 꼭 필요한데

 

그것이 Geocoding이다.

 

앱에서는 원하는 위치를 표시하기 위해

 

서버에게 전달할 정보 중에 쉽게 얻을 수 있는 것은 주소이다.

 

앱에서 서버로 주소를 보내면 주소를 받아

 

Geocoding API를 이용하여 위/경도 값으로 바꾸고 리턴해주면

 

앱에서는 위/경도 값만 지도에 표시해주면 된다.

 

 

 

1. Geocoding API 및 API 키

 

Google Cloud Platform의 API 및 서비스에서 Geocoding API를 검색하여 사용 버튼 클릭.

 

Geocoding API

 

사용자 인증 정보에서 +사용자 인증 정보 만들기 버튼을 누르고 API키 버튼을 클릭하여 키를 생성한다.

 

API 키 생성

 

Android에 Google Maps API를 등록할 때 생성했던 키는

 

API 키를 생성하고나서 제한사항에 대한 설정이 필요했지만

 

지금은 서버를 로컬에서 돌리고 있으므로 서버의 IP가 특정되면 그때 설정해도 된다.

 

 

 

2. Geocoding API 소스

 

소스는 여기.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
private static Map<StringString> getGeoDataByAddress(String completeAddress) {
    try {
        String API_KEY = "구글 API Key";
        String surl = "https://maps.googleapis.com/maps/api/geocode/json?address="+URLEncoder.encode(completeAddress, "UTF-8")+"&key="+API_KEY;
        URL url = new URL(surl);
        InputStream is = url.openConnection().getInputStream();
 
        BufferedReader streamReader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
        
        StringBuilder responseStrBuilder = new StringBuilder();
        String inputStr;
        System.out.println(">>>>>>>>>> >>>>>>>>>> InputStream Start <<<<<<<<<< <<<<<<<<<<");
        while ((inputStr = streamReader.readLine()) != null) {
            System.out.println(">>>>>>>>>>     "+inputStr);
            responseStrBuilder.append(inputStr);
        }
        System.out.println(">>>>>>>>>> >>>>>>>>>> InputStream End <<<<<<<<<< <<<<<<<<<<");
 
        JSONObject jo = new JSONObject(responseStrBuilder.toString());
        JSONArray results = jo.getJSONArray("results");
        String region = null;
        String province = null;
        String zip = null;
        Map<StringString> ret = new HashMap<StringString>();
        if(results.length() > 0) {
            JSONObject jsonObject;
            jsonObject = results.getJSONObject(0);
            Double lat = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lat");
            Double lng = jsonObject.getJSONObject("geometry").getJSONObject("location").getDouble("lng");
            ret.put("lat", lat.toString());
            ret.put("lng", lng.toString());
            System.out.println("LAT:\t\t"+lat);
            System.out.println("LNG:\t\t"+lng);
            JSONArray ja = jsonObject.getJSONArray("address_components");
            for(int l=0; l<ja.length(); l++) {
                JSONObject curjo = ja.getJSONObject(l);
                String type = curjo.getJSONArray("types").getString(0);
                String short_name = curjo.getString("short_name");
                if(type.equals("postal_code")) {
                    System.out.println("POSTAL_CODE: "+short_name);
                    ret.put("zip", short_name);
                }
                else if(type.equals("administrative_area_level_3")) {
                    System.out.println("CITY: "+short_name);
                    ret.put("city", short_name);
                }
                else if(type.equals("administrative_area_level_2")) {
                    System.out.println("PROVINCE: "+short_name);
                    ret.put("province", short_name);
                }
                else if(type.equals("administrative_area_level_1")) {
                    System.out.println("REGION: "+short_name);
                    ret.put("region", short_name);
                }                    
            }
            return ret;
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
cs

 

메소드를 호출하면서 String 주소값을 넘기면 Geocoding API를 통해

 

우편번호부터 상세 주소, 위/경도 값을 받을 수 있다.

 

responseStrBuilder에 담긴 여러 데이터 중에 필요한 부분을 사용하면 된다.

 

 

 

3. 에러

 

이 상태에서 getGeoDataByAddress()를 호출하면

 

이런 에러 메시지가 뜨면서 제대로된 데이터가 들어 오지 않을 수 있다.

 

1
2
3
4
5
{
    "error_message": "This API project is not authorized to use this API. Please ensure that this API is activated in the APIs Console: https://console.developers.google.com/apis/library?project=_",
    "results": [],
    "status": "REQUEST_DENIED"
}
cs

 

This API project is not authorized to use this API.

Please ensure that this API is activated in the APIs Console.

 

이런 에러메시지를 받는 경우가 여러가지 인 것 같은데

 

나의 경우, 해당 Google API 프로젝트를 소유하고 있는 구글 계정에

 

Billing에 대한 데이터가 없어서 였다.

 

이 부분에 대해서는 Google Maps Platform Support에도 나와있다.

 

Google Maps Platform Support

 

만약 Google Console에서 알맞는 API를 선택했고 인증키도 정상적으로 발급됐다면

 

Billing에 대한 데이터가 있는지 확인해보자.

 

Billing 데이터를 입력하고 나서 다시 메소드를 호출하면 아래처럼 정상적인 response가 올 것이다.

 

Geocoding API Response

 

 

끝.

반응형

'이상 > Server' 카테고리의 다른 글

[Spring Boot] Spring Boot 프로젝트 생성  (0) 2020.09.11