Flutter Webメルカトル
緯度、経度から対応するベクトルタイルの座標を取得するコードについて記載します。
Webメルカトル
地球の表面(楕円の球面)を平面に投影する方法の一つです。
国土地理院から取得するベクトルタイルもこの図法として進めます。
緯度、経度をWebメルカトル図上の座標に変換
緯度経度からWebメルカトル図上の座標に変換する数式です。詳細は以下のwikiを参照してください。
https://en.wikipedia.org/wiki/Web_Mercator_projection#Formulas
x = 1/2π * 2^zoom_level * (π + λ)
y = 1/2π * 2^zoom_level * (π - ln(tan(π/4 + φ/2)))
※lnは自然対数eを底とする対数
今回使用するライブラリ内の計算ではyの式が以下の形で使われていました。変形されているだけで計算結果は同じです。
y = 1/2π * 2^zoom_level * (π - ln((1 + sinφ) / (1 - sinφ)) * 1/2 )
変形については以下の資料を参照してください。tanの加法定理、2倍角の公式、累乗の対数あたりを使用して変形できます。
https://zenodo.org/records/35392
P36 式(2.29)~(2.31)
ライブラリを使って計算
ライブラリは以下を使用します。
https://pub.dev/packages/latlng
スカイツリーのマップ座標を計算
スカイツリーの緯度経度を以下とします。
緯度: 35.709529 経度: 139.810713
マップのズームレベルが15のとき、緯度経度からマップの座標を取得するコードです。
実行結果
国土地理院の地図で計算した座標を確認すると、スカイツリーの位置になっていました。
以上です。