Google Static Maps APIに、表示範囲の経緯度を取得できるAPIが無い
表示範囲の経緯度情報はGoogle Maps JavaScript APIでは、google.maps.LatLngBounds
classからgetNorthEast()
やgetSouthWest()
を呼ぶことで簡単に取得可能な情報です。
簡単に取得できる情報ですが、Google Static Maps APIにはありません。代替手段としては、Yahoo!スタティックマップAPIを使うことで解決可能です。出力設定でXMLを指定することで、表示範囲の経緯度情報を取得可能です。その場合、地図画像とXML情報の2回リクエストを投げる必要があります。
代替手段は、無いことはないのです...
それでもGoogle Static Mapsの表示範囲の経緯度を知りたい!
何度見ても、Google Static Maps APIに経緯度取得APIが無いので、[グーグルマップ(Google Maps) の座標間変換式について(1)](http://hosohashi.blog59.fc2.com/blog-entry-5.html"グーグルマップ(Google Maps) の座標間変換式について(1)")の記事に書かれている変換式を利用することで、経緯度情報を入手可能です。
この記事を書かれた方は、[RgoogleMaps: Overlays on Google map tiles in R](http://cran.r-project.org/web/packages/RgoogleMaps/"RgoogleMaps: Overlays on Google map tiles in R")のドキュメントを参考にしたそうです。
経緯度情報取得...
先ほど紹介したサイトの(7)と(8)の式を利用します。これは、取得した地図画像の中心経緯度、ズームサイズと取得したい画像のピクセル位置を式に代入することで、該当する画像のピクセル位置の世界測地系経緯度情報を求められる式です。
Javaでコードを書きました。
int zoom;//取得した画像のズームレベル
int imgXpx,imgYpx;//取得した画像のピクセルサイズ, x座標方向,y座標方向
double this.c_lng, this.c_lat;//取得した画像の中心経緯度
/**
*Google Static Mapsで取得した画像の4辺の経緯度情報を取得する
*/
public void setMapRange() {
this.img_min_lng = (180 / Math.pow(2, this.zoom + 7)) * ((this.imgXpx / 2) * -1) + this.c_lng;
this.img_min_lat = (180 / Math.PI) * Math.asin(Math.tanh((Math.PI / Math.pow(2, this.zoom + 7)) * ((this.imgYpx / 2) * -1) + meaAtanh(Math.sin((Math.PI / 180) * this.c_lat))));
this.img_max_lng = (180 / Math.pow(2, this.zoom + 7)) * (this.imgXpx / 2) + this.c_lng;
this.img_max_lat = (180 / Math.PI) * Math.asin(Math.tanh((Math.PI / Math.pow(2, this.zoom + 7)) * (this.imgYpx / 2) + meaAtanh(Math.sin((Math.PI / 180) * this.c_lat))));
}
/**
*javaのMath.classにタンジェントアークを求めるメソッドが無いので、簡単に実装
*/
private double meaAtanh(double x) {
return 0.5 * Math.log((1.0 + x) / (1.0 - x));
}
無事経緯度情報求めることが出来ました
もしかしたら数ピクセルずれているのかもしれませんが、目視で確認する限りでは問題ありませんでした
以下駄文
経度ってlngを略称として使うのか、lonなのか非常に悩みどころですね。