その後のその後

iOSエンジニア 堤 修一のブログ github.com/shu223

逆ジオコーディングで取得した CLPlacemark の住所情報の内容

先日CLGeocoder を用いた逆ジオコーディングの記事を書きましたが、その結果得られる CLPlacemark 型の addressDictionary プロパティに入っている住所情報について、どのキーがどういう情報なのか、国ごとにどういう違いがあるのか、毎回調べるのが面倒なのでここに書いておきます。


近所で位置情報を取得し逆ジオコーディングし、addressDictionaryの内容をログ出力するとこんな感じでした。(エンコードおかしいですが気にしないでください・・・)

City = "\U938c\U5009\U5e02";
Country = "\U65e5\U672c";
CountryCode = JP;
FormattedAddressLines =     (
                             "\U3012248-0007 \U795e\U5948\U5ddd \U938c\U5009\U5e02 \U5927\U753a 2\U4e01\U76ee6\U756a13\U53f7"
                             );
Name = "\U5927\U753a 2\U4e01\U76ee6\U756a13\U53f7";
State = "\U795e\U5948\U5ddd";
Street = "\U5927\U753a 2\U4e01\U76ee6\U756a13\U53f7";
SubLocality = "\U5927\U753a";
SubThoroughfare = "6\U756a13\U53f7";
Thoroughfare = "\U5927\U753a 2\U4e01\U76ee";
ZIP = "\U3012248-0007";


ここからわかることは、

  • FormattedAddressLines には、"ZIP", "State", "City", "Street"の順に入っている
  • 日本でいうと、"State"は都道府県、"City"は市区町村にあたり、"Street"には「小町 2丁目3番1号」といったような町名地番が入る
  • "Street" は、"Thoroughfare" と "SubThoroughfare" を繋げたもので、"SubLocality" は町名(市区町村以降の地名。"Thoroughfare" にも含まれる)

ただどの国でもこれらの項目が得られるかというとそうではなく、たとえばチュニジアの緯度経度で逆ジオコーディングすると、

Country = "\U30c1\U30e5\U30cb\U30b8\U30a2";
CountryCode = TN;
FormattedAddressLines =     (
"RN 3E",
"\U30c1\U30e5\U30cb\U30b8\U30a2"
);
Name = "RN 3E";
State = "\U30b7\U30c7\U30a3\U30d6\U30b8\U30c3\U30c9";
Street = "RN 3E";
Thoroughfare = "RN 3E";

addressDictionaryにはこういう感じの結果が返ってきました。


"City" や "SubThoroughfare" 、"SubLocality" といった項目がはいっていません。データがないのか、もともと住所の構造がシンプルなのかわかりませんが、日本と同様に市区町村にあたる項目があるという前提で処理を書くとおかしなことになりそうです。



そもそもこういうのは世界共通で規格みたいなものがあるのかもしれないので、こういう場当たり的な調べ方は的外れなのかもしれません。悪しからず・・・