とある変人のお道具箱

技術系のことにについて幅広く触れていくブログです

【Python】pyprojを使ってGPSの緯度経度座標を平面直角座標系に変換する

pyprojのインストール

pipで簡単に入ります。

pip install pyproj

今回の動作確認はpython3.7, pyproj=3.0.0.post1で行っています。

この記事で解説していないpyprojの情報は公式ドキュメントを参照してください。 pyproj4.github.io

座標系について

現在の日本では19種類の平面直角座標系が使われています。以下の表のように変換したい地域から座標系を選びます。

EPSG (JGD2011) 区域
1 6669 長崎県、鹿児島県の一部
2 6670 福岡県、佐賀県、熊本県、大分県、宮崎県、鹿児島県の一部
3 6671 山口県、島根県、広島県
4 6672 香川県、愛媛県、徳島県、高知県
5 6673 兵庫県、鳥取県、岡山県
6 6674 京都府、大阪府、福井県、滋賀県、三重県、奈良県、和歌山県
7 6675 石川県、富山県、岐阜県、愛知県
8 6676 新潟県、長野県、山梨県、静岡県
9 6677 東京都の一部、福島県、栃木県、茨城県、埼玉県、千葉県、群馬県、神祭川県
10 6678 青森県、秋田県、山形県、岩手県、宮城県
11 6679 北海道の一部
12 6680 北海道の一部
13 6681 北海道の一部
14 6682 東京都の一部
15 6683 沖縄県の一部
16 6684 沖縄県の一部
17 6685 沖縄県の一部
18 6686 東京都の一部
19 6687 東京都の一部

詳しい分類方法は国土地理院のわかりやすい解説(https://www.gsi.go.jp/sokuchikijun/jpc.html) を参考にしてください。

緯度経度から変換

from pyproj import Transformer

epsg4326_to_epsg6677 = Transformer.from_crs("epsg:4326", "epsg:6677")
latitude, longitude = 35.6802117, 139.7576692
x, y = epsg4326_to_epsg6677.transform(latitude, longitude)
print(x, y)   #-35476.257587129105 -6848.909311035857

例として皇居の緯度経度情報を変換しました。 変換するWebアプリでも同じ結果が返ってくることが確認できます。

Web版TKY2JGD

平面直角座標から変換

epsg6677_to_epsg4326 = Transformer.from_crs("epsg:6677", "epsg:4326")
x, y = -35476.257587129105, -6848.909311035857
lat, lon = epsg6677_to_epsg4326.transform(x, y)
print(lat, lon)   #35.68021170000001 139.75766920000004

元の緯度経度に戻せました。

実行速度について

pyprojは遅いといった意見を目にしたことがあるので、実行速度についても検証してみました。

検証してみた結果、

epsg4326_to_epsg6677 = Transformer.from_crs("epsg:4326", "epsg:6677")

というインスタンス作成のところが遅いことがわかりました。何度も座標変換を行う場合でも一度インスタンスを作成してしまえばいいのでさほど問題ではない気がします。numpyを使って自前で座標変換を実装してみましたが変換だけで比較するとpyprojの変換のほうが高速でした。