先日紹介した、GoogleMapsAPI のリバースジオコーディングについて、もう少し詳しく調査したので報告します。
APIのレスポンス情報を解析してみたところ、実は結構込み入ったオブジェクト(配列)であることがわかりました。
詳しくは次の表をご覧ください。
ここで注目すべきは、Placemark という配列です。
施設情報が、それぞれPlacemark[0]からPlacemark[9]という要素としてセットされます。(10個より少ない場合もあります。)
前回は固定的に Placemark[0] のみを参照し、残りの要素は無視していたのですが、10個のPlacemarkの中身を個々に取り出してみると、建物、店舗、通り名など、結構有用な施設情報がセットされていることがわかりました。
その反対に、ただ単に住所を取得したいと思っても、必ずしも先頭の要素(Placemark[0])に目的の情報がセットされているとは限りません。
では、具体的に見てみましょう。
例として、緯度:43.064615、経度:141.346807 について、リバースジオコーディングを実施した場合、レスポンスデータのPlacemarkのaddress要素は次の通りでした。
Placemark[0].address = "Japan北海道庁"
Placemark[1].address = "Japan北洋銀行・道庁支店"
Placemark[2].address = "6丁目1北3条西,中央区札幌市Hokkaido,Japan"
Placemark[3].address = "Japan北海道庁内郵便局"
Placemark[4].address = "Japanゆうちょ銀行札幌支店北海道庁内出張所"
Placemark[5].address = "Japan(株)北海道職員厚済会"
Placemark[6].address = "Japan道友薬品"
Placemark[7].address = "Japan,〒060-8588"
Placemark[8].address = "Japanドトールコーヒー北海道庁支店"
Placemark[9].address = "Japan石狩支庁"
上から3つめが「住所」、下から3つめが「郵便番号」、それ以外は施設名であることがわかります。
しかし、次のような課題が残ります。
【課題1】住所や郵便番号をダイレクトに取得するにはどうしたら良いか。
【課題2】住所の文字列を本来の姿に並べ変えるにはどうしたらよいか。
そこで、さきほどの表(レスポンスデータのフォーマット)をご覧ください。
脚注(*1、*2)に示したように、住所や郵便番号のデータ要素の場合は、他の施設情報とは異なる特徴があります。
この特徴に着目して、Placemarkの要素データを順に調べれば(for ... in ...)、住所や郵便番号を見つけ出すことが可能です。
(1)郵便番号の取得
PostalCodeという要素が存在するとき、その配下のPostalCodeNumberを取得すればOK。
(2)住所の取得
AddministrativeAreaという要素が存在するとき、その配下にある次の3要素を取得します。
・市区名 Locality.LocalityName
・町名等 Locality.DependentLocality.DependentLocalityName
・番地等 Locality.DependentLocality.Thoroughfare.ThoroughfareName
あとはこの3項目を結合すればいいはずですが、なんと「ThoroughfareName」に罠が待っていました。
「1△6丁目」のように、丁目と番地が空白(△)で、しかも逆順に結合されているではありませんか。
仕方ないので、一旦、空白文字をデリミタとして分割(split)した後、逆順に結合します。
ただし、このロジックがすべての住所パターンに適合するかどうかは未確認です。
以上が今日現在までの調査結果です。
こうして見ると、以上のことを開発者に個別にコーディングさせるのは不条理なので、住所や郵便番号を簡単に取得するための専用のメソッドが用意されている(これから追加される?)ような気もします。
見つけた方は、ぜひこちらのページからご連絡を!