🗾

逆ジオコーディングを実装するアイデア

に公開

ジオコーディングとは

ジオコーディングは一般に「住所を緯度経度に変換する」技術やそのシステムのことをいいます。
逆ジオコーディングはその逆で「緯度経度を住所に変換する」ことをいいます。
(広義にはジオコーディングが逆ジオコーディングを含むこともあるらしい)

既往手法

  • Yahoo!リバースジオコーダAPI(LINEヤフー)
    • LINEヤフー社が提供するAPIです
    • 商用利用には制限がありそうです
    • 精度は高いと思われます(未検証)
  • Nominatim(OpenStreetMap)
    • OpenStreetMapのAPIです
    • 少なくとも日本の住所においては精度が低いように感じました。
    • 元データであるOSMがユーザーコントリビューション型の地図である点と日本の住所構造に最適化されていないことが原因と思います。
  • 位置参照情報 ダウンロードサービス(国土交通省)
    • 国土交通省が提供している住所と緯度経度のペアデータです
    • ご自身で解析することで住所から緯度経度にも変換することができます。
    • 逆ジオコーディングはクエリ緯度経度の最近傍の住所を返す仕組みで実装できますが、精度については要検証です。(おそらく境界部での精度は低いと思われます)
  • シンプル ジオコーディング 実験(CSIS)
    • 東京大学の空間情報科学研究センター(CSIS)が提供しているAPIです
    • APIで住所から緯度経度に変換することができます
    • 逆ジオコーディングには非対応です
  • その他
    • 有償のサービスもいくつかあります。

提案手法

概要:GISデータ(行政界ポリゴンデータ)に重なるクエリ緯度経度を空間演算することで緯度経度を住所に変換する。

行政界データ

GISデータと呼ばれるもの(緯度経度などの位置情報と何らかの属性データが結びつくデータ)として、地図的にこの緯度経度に囲まれるエリアが○○市だよというようなデータが存在します。
有名なものとして公的機関が提供する2つのデータがあります。

  1. 国勢調査の境界データ(e-Stat)
    統計局のe-Statにおいて国勢調査データを可視化するのに使う境界データが配布されています。
    こちらは町丁・字レベルで境界データが整備されています。
    (例えば、デジタル庁の住所は東京都千代田区紀尾井町1-3ですが、この境界データには東京都千代田区紀尾井町までのレベルで整備されています)
    ただ、データの完全性に若干疑問があり、私が検証した範囲では領域データの重複があったように見えました。
    e-Stat

  2. 国土数値情報の行政区域データ
    国土交通省も国土数値情報として境界データを配布しています。
    これは市区町村(政令指定都市は行政区)レベルで境界データが整備されています。
    (例えば、デジタル庁の住所は東京都千代田区紀尾井町1-3ですが、この境界データには東京都千代田区までのレベルで整備されています)
    こちらは、私が検証した範囲では重複などがない精度の高いデータに見えました。
    国土数値情報

実装方法

  1. どちらかのデータについて必要なエリアのポリゴンデータをダウンロードします
  2. 複数の県にまたがる場合は結合をします(QGISで結合するとよいでしょう)
    ※ 世界測地系(平面直角座標系)は日本を19エリアに分割しそれぞれに原点を持つため、系をまたいで使う場合には注意が必要かもしれません。
  3. Python等で処理を行います
    4. 読み込み
      - ポリゴンデータは一般にシェイプファイルという形式で表現されます。そのデータを読み込むのにライブラリを用いると容易です。 pyshpなどが使えると思います。
    5. 座標系変換
      - 投影座標と地理座標の変換をしたい場合はこの処理が必要です。pyprojと、もしかするとshapelyでもできたかも。
      - 投影座標:丸い地球を地図として見やすく平面に投影したもの。原点が設定され原点から遠いと投影誤差が大きくなるため、場所によりエリアが分割されます。日本は東西方向に大きいため、投影誤差が一定の基準に収まるように19エリアに分割されています。エリア(系)をまたぐ際には原点が変わるため条件分岐や地理座標系への変換が必要です。
      - 地理座標:緯度経度で表現される地球の丸いまま表現した座標系です。ただし、空間演算時の精度低下が懸念された気がします。
    6. 空間演算
      - 地理空間情報の距離測定、近傍探索、重なり検出、バッファリングなどの操作を空間演算と言います。
      - ここで実際に逆ジオコーディングを行います。shapelyなどが使えると思います。
      - ここでは、クエリ緯度経度(ポイントデータ)に対して重なる行政界データ(ポリゴンデータ)を検索します。intersectsメソッドやcontainsメソッドが使えると思います。
    8. 住所取得
      - 重なっている行政界データが得られたらそのポリゴンデータの属性情報を取得し、住所を得ます。たしか再びpyshpを使った気がします。

まとめ

という感じで

  • ローカルで実装することでAPI制限等気にせずに実行できる
  • OSMのAPIと比較して精度が高いこと
  • 国が提供するデータであることからライセンスが緩め

な点が良い点だと思います。
議論があればコメントいただけるとありがたいです!

Discussion