はじめに
緯度・経度がわかっている時、その地点の対応する地理院タイルを取得したい。その座標の変換方法を調べる
計算式
参考サイト によると、以下のようである
Kotlinでの実装
private fun getPixelCoord(lat: Double, lng: Double, zoom: Double): Pair<Int, Int> {
val l = 85.05112878
val x = 2.0.pow(zoom + 7.0) * (lng / 180.0 + 1)
val y = (2.0.pow(zoom + 7.0) / Math.PI) *
(-atanh(sin(Math.PI * lat / 180.0)) + atanh(sin(Math.PI * l / 180.0)))
return x to y
}
検証
上記メソッドを使ってズームレベル16の時の東京駅(緯度:35.680959106959
, 経度:139.76730676352
)の地理院タイルを求めてみる
val pixelCoord = getPixelCoord(35.680959106959, 139.76730676352, 16.0)
println("pixelCoord: $pixelCoord")
計算結果は以下のようになり、
pixelCoord: (14902236, 6606514)
東京駅はズームレベル16の地理院タイル上でX座標: 14902236
, Y座標: 6606514
ということがわかった
タイルは一辺が256ピクセルの正方形であるから、256で割ることで左上から何番目のタイルなのかを求めることができる
14902236 / 256 = 58211 番目
6606514 / 256 = 25806 番目
これを国土地理院の 標準地図 の URL
に当てはめると、、
https://cyberjapandata.gsi.go.jp/xyz/std/16/58211/25806.png
たしかに、東京駅周辺の地理院タイルが取得できている
参考
正方形タイルについては以下が参考になった
https://www.trail-note.net/tech/tile/