-
Android Studio - 주소 찾기 with getSubAdminArea(), getSubLocality()Android Studio 2021. 3. 18. 03:05
졸업작품하면서 또 역지오코딩의 늪에 잠시 빠졌다가 나와서 쓰는글...
저번 포스팅에도 썼지만, 역지오코딩을 이용해서 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()
그리고 내가 쓴 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 저장됨
'Android Studio' 카테고리의 다른 글
Android Studio - Retrofit @Multipart 이미지 & @PartMap으로 데이터 전송하기 (6) 2021.04.05 Android Studio EditText 최소 글자 제한하기(최소 N글자 이상 입력하게끔) (0) 2021.03.28 Android Studio - 지오코딩, 역지오코딩(feat.GoogleMapAPI) (0) 2021.03.15 Android Studio - Retrofit 이용한 서버와의 통신 (0) 2021.02.28 Android Studio - Google Map API 협업 / Git에 업로드 (0) 2021.02.01