今回は、郵便番号データ内のビル名の処理について紹介します。 データは、記載がない限り2021-05-31のデータを用いています。 ケンオールでどのように郵便番号を処理しているかは、こちらのデモから確認してみてください。
前回はこちらです。
PyData Osaka Meetupの発表スライドと動画はこちらです。
ビル郵便番号
郵便番号データの大半は、ある郵便区画に対して番号を割り当てたレコードとなっていますが、実は一部の高層ビルには階層ごとに郵便番号が割り振られています。 ここでは、このような郵便番号をビル郵便番号と呼びます。
1066101: 東京都港区六本木六本木ヒルズ森タワー(1階)
なお、このビル郵便番号は、個別事業所番号とは別のものであることに注意してください。
このようなビルは、郵便番号データ内には84棟存在し、このようなビルが存在する町域は34地域存在します。 上記の住所のうち、ビル名に相当する部分はどこからどこまでになるでしょうか?
正解は、六本木ヒルズ森タワー
です。
最初の六本木
は町名となります。六本木ヒルズ森タワーの住所は東京都港区六本木6-10-1です。
町名とビル名を分割する
このように、ビル郵便番号の町域は、町名 + ビル名 + 階層
という構造を取っているため、構造化されたデータに変換するにはこの文字列をパースして分割しなければいけません。
しかし、この文字列だけでは、先程の例のように、町名とビル名を分割することはできません。どちらかの名称を外部から与える必要があります。
このデータを遡っていくと、以下のようなレコードを発見できます。
1060032: 東京都 港区 六本木(次のビルを除く)
この郵便番号は、東京都港区六本木
に属する住所のうち、これより下のビル郵便番号に記載されているもの以外の全ての住所に対して用いる郵便番号です。
この郵便番号レコードを使えば、町名六本木
を取得することができます。
ただし、以下の2地域は例外的に、(次のビルを除く)
が存在しません。
東京都 港区 海岸 愛知県 名古屋市中村区 名駅
この地域に関しては明示的に町名を付与する必要があります。(パターン1)
次に、ビル郵便番号の文字列パターンを見てみます。
1066190: 東京都 港区 六本木 六本木ヒルズ森タワー(地階・階層不明) 1066101: 東京都 港区 六本木 六本木ヒルズ森タワー(1階)
ビル郵便番号の町域は、以下の2パターンになっています。(パターン2)
- XX(地階・階層不明)
- XX(N階)
- N: 全角数字で表されている階数
よって、ビル郵便番号の存在する地域及びビル郵便番号のパースは、以下の方針で実施することができます。
- パターン2に該当する町域を持っていたらビル郵便番号であると判断できる (レコード1)
- レコード1がパターン1にマッチする地域に属していた場合は、それに対応する町名を取得する
- レコード1から遡って、最も近い(次のビルを除く)と記載されているレコードを発見する。(レコード2)
- レコード2の町域から(次のビルを除く)を取り除いて町名を取得する
- 取得した町名を使って、レコード1の町域を町名とビル名、階層に分割する
階層と郵便番号
先程登場した階層情報ですが、実は文字列をパースしなくても情報を取得することができます。 郵便番号の下2桁は以下のルールによって付与されています。
- 地階・階層不明: 90
- N階: N (2桁目はゼロパディングされる)
もう一度、先程の例を見てみましょう。このルールに基づいて郵便番号と階層情報が対応していることが分かります。
1066190: 東京都 港区 六本木 六本木ヒルズ森タワー(地階・階層不明) 1066101: 東京都 港区 六本木 六本木ヒルズ森タワー(1階)
現在、日本一階数の多いオフィスビルは横浜ランドマークタワー(高さ日本一はあべのハルカス)で、地上70階まで存在します。もちろん、郵便番号データにも記載されています。
2208170: 神奈川県 横浜市西区 みなとみらい ランドマークタワー(70階)
しかし、世界では90階を超えるビルはいくつも存在します。 日本で90階を超えるオフィスビルが誕生したとき、郵便番号は一体どのように割り振られるのか、楽しみですね。
ケンオールについて
「かゆいところにケンオール」
ケンオールは、郵便番号住所検索APIをはじめとした、システム開発を加速する高品質で安全なAPIサービスです。
(この記事はShodoで執筆されました)