Android Studio - 주소 찾기 with getSubAdminArea(), getSubLocality()
졸업작품하면서 또 역지오코딩의 늪에 잠시 빠졌다가 나와서 쓰는글...
저번 포스팅에도 썼지만, 역지오코딩을 이용해서 Country(String)에 나라이름과 City(String)에 도시이름 써서 서버에 넘겨주는 것을 포스팅했었다. 근데 뭔가 City에 서울특별시 / 경기도 이런식으로 나오는게 너무 이상해서 좀 바꿔주고싶었다. 그래서 Android 공식 사이트의 API문서에서 Address객체의 메소드들을 쭉 찾아봤는데 영어로 나와있어서 ㅋ... 이 한국에서의 xx시 / xx구 / xx동 이런 개념이 어떤 함수와 매핑되는건지, 그리고 다른 나라들이랑 한국이랑 주소체계가 다르다보니 이건 어떻게 되는건지 궁금해서 좀 프린트문 찍으면서 찾아봄...
숙명여자대학교 입력시의 출력문은 이렇다. (시각적 편의를 위해 띄어쓰기를 각 필드별로 했음)
Address[addressLines=[0:"대한민국 서울특별시 용산구 청파동2가 53-12"],
feature=53−12,
admin=서울특별시,
sub-admin=null,
locality=null,
thoroughfare=청파동2가,
postalCode=140-132,
countryCode=KR,
countryName=대한민국,
hasLatitude=true,
latitude=37.5463644,
hasLongitude=true,
longitude=126.96483110000001,
phone=null,
url=null,
extras=null]
타임스퀘어 입력시의 출력문은 이렇다.
Address[addressLines=[0:"Times Square, New York, NY 10036 미국"],
feature=Times Square,
admin=New York,
sub-admin=New York County,
locality=New York,
thoroughfare=null,
postalCode=10036,
countryCode=US,
countryName=미국,
hasLatitude=true,
latitude=40.757999,
hasLongitude=true,
longitude=-73.985553,
phone=null,
url=null,
extras=null]
추가로 출력문을 저장해놓지 않아서(임시로 찍어본거라) 출력된 결과물은 없는데 나리타공항(일본) 찍으면 admin이 치바현 뜬다. 만리장성은 베이징...
* 저 각각 feature, admin등등 각 필드에 대응하는 함수들은 getXX() 꼴로 호출이 가능하다. 자세한건 공식 API문서확인
developer.android.com/reference/android/location/Address#getSubLocality()
Address | Android 개발자 | Android Developers
developer.android.com
그리고 내가 쓴 getAdminArea() 설명을 보면 행정구역의 이름을 반환해준다고 되어있다...
우리나라 : 서울특별시 / 경기도 같은 큰 도시 단위를 리턴해준다.
해외 : 미국 타임스퀘어 입력시 NewYork, 일본의 치바현 등...
근데 이것보다 조금더 상세한거를 원했다. 사실 뭐 해외의 행정단위 이런건 잘 모르다보니 그냥 큰 도시이름(도쿄, 뉴욕 등) 나오면 별로 감흥이 없는데 막 신촌역에서 뭐 먹었음 이라고 했는데 나중에 주소보면 서울특별시까지만 나와있으면 ㅋㅋㅋㅋ 너무 디테일하지 않은것같아서 서치를 좀 해봤다.
그러나 결론부터 말하자면... 한국과 외국 동시에 쓸 수 있는건 Admin이 최선인것같다...(아니면 댓글 부탁드려요..)
약간 한국에서 내가 신촌역 이런식으로 입력하면 대한민국, 서대문구 이런느낌을 원해서 getSubLocality도 써보고 getSubAdminArea도 써서 찍어봤는데 전자는 한국에서만 구 출력이되고 후자는 한국에서 안 된다...
getSubLocality() 를 쓰면 한국에서는 구 단위로 리턴이 된다. (ex 동대문구)
getSubAdminArea( ) 를 쓰면 한국은 null로 리턴된다.
예를 들어 에펠탑을 입력했을때 getSubAdminArea()를 써주면 Paris를 리턴해주고, 이케부쿠로 포켓몬센터(일본)을 입력해서 getSubAdminArea()를 써주면 미나토구를 리턴해준다. 한국에 SubAdminArea라는 행정구역단위가 없는건지 아무튼 우리나라는 안 되었다...
위의 뉴욕 타임스퀘어와 숙명여자대학교 정보를 출력한것을 보면 국가, 국가코드, 위도, 경도, 위도경도 있는지 파악하는 boolean값, admin, feature정도만 둘다 공통적으로 null이 아닌것을 확인할 수 있다. 물론 이것도 나라마다 다르긴 하겠지만, 기본적으로 세계 단위로 역지오코딩을 해야하는거면 위도/경도/국가/admin수준까지만 공통적으로 쓸 수 있는듯 하다. 안 그러면 조건문을 걸든지 아니면 아래의 상세주소에서 띄어쓰기로 파싱하는 방법도 있을것같다...
상세주소 얻는방법
대한민국 서울특별시 용산구 청파동2가 53-12 // 숙명여자대학교
133 Furugome, 芝山町 Narita, Chiba 286-0104 일본 // 나리타공항
위 예시처럼 상세주소만 가지고 오려면 getAddressLine(0);을 해주면 된다.
0번째가 인덱스 값이다. 아까 출력했던 Address객체 전체의 값을 다시 확인해보면
Address[addressLines=[0:"대한민국 서울특별시 용산구 청파동2가 53-12"],
feature=53−12,
admin=서울특별시,
sub-admin=null,
locality=null,
thoroughfare=청파동2가,
postalCode=140-132,
countryCode=KR,
countryName=대한민국,
hasLatitude=true,
latitude=37.5463644,
hasLongitude=true,
longitude=126.96483110000001,
phone=null,
url=null,
extras=null]
addressLines의 0번 인덱스에 "대한민국 서울특별시 용산구 청파동2가 53-12"라고 들어있는걸 확인할 수 있다. 그래서 위의 getAddressLine 함수를 사용해서 뽑아오면 된다. 졸작 코드에서 일부 발췌해온 아래 코드에서는 city라는 String형 변수에 저장했다.
/* 사용 예시 */
//citylist는 Address객체를 담는 리스트 변수
//lat, lon은 double형 변수, 생략된 코드에서 위도 및 경도를 받아왔다고 가정
citylist = geocoder.getFromLocation(lat, lon, 10);
city = citylist.getAddressLine(0);
//city에 대한민국 서울특별시 용산구 청파동2가 53-12 저장됨