ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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()

     

    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 저장됨

     

Designed by Tistory.