2018年9月19日水曜日

Pythonで緯度経度をXY座標に変換する方法はいくつかあるらしい

異なる手法で試して値が一致しなくて困惑したのでまとめておきます。

緯度経度をXY座標に変換する


このテーマ自体は調べたら下記二つ分かりやすい記事がありました。


しかし以下のStack Exchangeを試して混乱の時間が始まったのです...
Convert GPS coordinates to Web Mercator EPSG: 3857 using python/pyproj


(メルカトル法で計算した値とpyprojで出てくる値が違うぞ...)

ただ結論から言うと、違ってOKのようですね。
まずはメルカトル法から見ていきます。

Spherical Pseudo-Mercator projection (長い)


Open Street Mapのwikiにpythonコード載ってました。すばらし。
ただこれだと不完全で、上記のStack ExchangeやBokehブログでは地球の半径を基にスケーリングしてます。

何をやっているかというと、
地球を完全な球と仮定して、地球を風呂敷のように広げてX, Yに変換しているイメージです。
これで世界中どこでもX, Yが得られますが、とても簡単で大雑把な仮定なので精度がイマイチというウワサ。

EPSG-based projection


一方最初の記事のEPSGコードに基づく変換は、地球を細かく区切ってエリアごとに風呂敷を広げるイメージ。
そのため、

  • 精度は前のやつより良い
  • エリアごとにEPSGコードが違う
  • 始点(X=Y=0)の位置もエリアごとに違う

というわけでした。そりゃ値違うわ。

さいごに


pythonのコードはGithubで公開してます。
(わざわざレポジトリ作るまでもなかったか。。。)
おしまい。