はじめに
世の中には場所を示す表記方法が多数存在します。日常でよく使われる住所もその1つです。一方でGIS処理を行う際は緯度経度を用いることが多いため、必然的に位置情報を変換する技術が必要になります(これをジオコーディングといいます)。今回は住所から緯度経度に変換する一例を紹介したいと思います。
表現方法 | 用途 |
緯度経度 | 地球上の座標を示す。GPSや地図アプリなどで使用される。 |
住所 | 国、都道府県、市区町村、番地、ビル名、部屋番号などから構成される。 |
郵便番号 | 地域ごとに割り当てられた数字の羅列。 |
施設名・地名 | ランドマーク名として使用される。例えば、ホテル名や公園名など。 |
地番 | 法務局(登記所)が定めた住所。戸籍の本籍地で用いられる。 |
★関連リンク
業務で活用できるAI技集のまとめはこちら
方法①:GoogleMapなどのWebMapで変換する
誰でも思いつきそうなシンプルなやり方です。例えばGoogleMap上で検索ボックスに住所を打ち込むと、対象の場所に移動してくれます。そのときのURLをみると緯度経度の記載がありますので、ここから情報を抽出すれば良いです。下図の例だと、「住所:東京都千代田区丸の内1丁目」から「緯度:35.6808093, 経度:139.7637371」に変換できた形となります。
ただしこの手法だと完全に手作業になるので、変換したい住所が多い場合は推奨できません。
またこの事例に限らずジオコーディングというものは「住所という範囲を表すもの」から「緯度経度という一意に決まる座標」に変換するため、所望の緯度経度を抽出できる保証はありませんのでその点は留意して下さい。
方法②:専用のWebサイトを活用する
ジオコーディング専用のサイトを活用します。今回ご紹介する1つ目は「Geocoding.jp」というサイトです。こちらの検索ボックスに調べたい住所やランドマーク名を入力すると、緯度経度で返してくれます。シンプルな作りなので非常に使い勝手が良いです。
2つ目のサイトは東京大学が提供している「CSV Geocoding Service (u-tokyo.ac.jp)」です。こちらは住所情報が入っているcsvをアップロードすると、緯度経度で返してくれるサービスになっています。住所が入っている列番号(半角数字)を入力して「ファイルの選択」でcsvファイルを選択し、送信ボタンを押せば完了です。複数の住所情報を変換したいときにお勧めのサイトです。
方法③:ジオコーディング用のAPIを利用する
ここからはプログラミングを使って変換する方法です。とはいえAPIを使うだけなので難易度は全然高くないです。まずAPI(Application Programming Interface)を知らない方のためにこの言葉の意味を超簡単に説明すると、「専門性のあるサービスやコンテンツなどを簡単に使えるようにするためのもの」と理解いただければ概ね問題ないかと思います。今回の例でいうと、ジオコーディングという住所を緯度経度に変換する複雑な処理をAPIにお任せすることで、住所(ランドマーク名)さえ正しく入力すれば、緯度経度を出力してくれるようなコードを記載していきたいと思います。
なおプログラミング言語はいずれもPythonを使用しています。Anaconda等のPython環境構築ツールをインストールのうえ実行ください。
Geocoding.jpのAPIを活用
import requests
import xml.etree.ElementTree as ET
payload = {"q": "東京駅"}
url = "https://www.geocoding.jp/api/"
r = requests.get(url, params=payload)
root = ET.fromstring(r.text)
lat = root.find('.//lat').text #緯度
lng = root.find('.//lng').text #経度
print(lat, lng)
先ほども紹介したGeocoding.jpで公開されているAPIを活用してコードを記載しました。これを実行すると「東京駅」のランドマーク名を以下のように緯度経度に変換してくれます。
35.681236 139.767125
「東京駅」の部分を任意のランドマーク名や住所に置き換えれば、その入力に沿った結果が得られますし、For文や外部ファイル(住所情報をもったcsv等)からの読み込みをうまく使えば、複数のジオコーディングも比較的容易にできると思います。ただし集中アクセスはサーバー負荷にも繋がりますので当APIを使う際は必ず事前にGeocoding.jpの利用規約を確認するようにしてください。
ちなみに「requestsのライブラリが存在しない」という方は、以下のコマンド等でインストールするようにしてください。上がAnaconda環境の方にお勧めのコマンド、下が一般的なPythonライブラリをインストールするときに使うコマンドです。
conda install requests
pip install requests
ジオコーディング用のライブラリを活用
import geocoder
place = '東京駅'
ret = geocoder.osm(place, timeout=5.0)
print(place, ret.latlng)
geocoderと呼ばれるライブラリを使って「東京駅」というキーワードを、OpenStreetMapという地図をベースにジオコーディングしますが、上記のとおりたった4行で表現できます。これを実行すると以下のような結果が得られます。
東京駅 [35.6779405, 139.7653866]
ただ恐らくは、geocoderのライブラリはインストールしていない方が多いと思いますので、エラーが出る可能性が高いです。その場合は以下のコマンドで動作環境を構築してください。
conda install geocoder
pip install geocoder
方法④:Google Earth Proを活用する
まずGoogle Earth Proとは何者かということですが、簡単にいうとGoogleが作った3Dマップと理解してもらえれば良いです。下図のように、主要都市であれば結構リアルに色々なエリアが見れるので地図関係に興味のある方はインストールすることをお勧めします。(2023.4.7時点では無料で公開されています)
さて、Google Earth Proをこちらのサイトからインストールができたら、今度はジオコーディングしたいcsvファイルを用意します。今回はこんな感じで山手線の駅名が書いてあるものを準備しました。
これを[ファイル]→[インポート]と進めて、この山手線の駅名が書かれたcsvを選択すると以下のような画面が出てきますので[次へ]を押してください。
そうすると以下の画面に遷移しますので、一番上の部分をチェックして下さい。
あとは以下の図のようにジオコーディングしたい文字列が入った列名(今回は山手線の駅名が入った列)を住所フィールドとして選択してあげれば完了です。
以下の図のように、しっかり山手線の駅がプロットできていそうです。GoogleEarthに表示させる目的でジオコーディングをするのであれば、今回のようにアプリに内蔵されている機能を使ったほうが良いかもしれないです。
ちなみにこのジオコーディングしたファイルはkmlやkmzといったファイル形式で保存することができます。これをcsvに戻すのはひと手間掛かりますが、それはまた別の機会に紹介したいと思います。
Appendix
上記以外にもジオコーディングの手法はあります。何点か列挙しますので、気になるものがあればお試しください。
手法 | 内容 |
Yahoo!ジオコーダAPI | Yahoo! JAPANが提供するAPIです。Yahoo! JAPAN IDを登録する必要があれば無償で使えます。詳細はHP参照。 |
Google Maps API | Googleが提供するAPIです。有料(従量課金)なので要注意です。詳細はこちらもHP参照。 |
外注する | ゼンリン社等のジオコーディング専門のサービスがあります。費用はかかりますが品質を求めるならお勧めです。 |
コメント