私はDBに格納されたデータに基づいてマップタイルを生成し、UrlTemplateImageryProviderを使用してセシウムまで提供しようとしています。マップタイルごとに、一致するデータを見つけるために緯度/経度の境界を知る必要があります。 http://host/tiles/zoom/x/yのようなリクエストで、Googleマップと同じタイルスキームを使用しています。当初、これらのマップタイル座標を方程式を使ってここにある緯度/経度の境界に変換しました:http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Tile_bounding_boxしかし、これが正しい投影法でないかどうか疑問に思っています。セシウムマップタイルの緯度/経度の決定
まず、私が見るWeb Mercatorのすべてのドキュメントでは、タイル0,0 @ zoom lvl 0は世界全体をカバーしていると言われています。それは私がセシウムで見るものではありません(ズームレベル0で2つのタイルがあります)。つまり、私の計算は0,1,2,3のズームレベルで動作するようですが、ズームレベル4に行くと、Latitudeの計算が南に移動し始めます。生成された緯度、経度を2次元Googleマップにプロットすると、正確に見えますが、セシウムから要求されたタイルの境界が異なることがわかります。だから私は今、間違った投影法を使ってタイル境界を計算していると仮定しています。
私はここでも計算を試みました:http://www.maptiler.org/google-maps-coordinates-tile-bounds-projection/ ピクセルからメートルに緯度/経度に変換しましたが、ウェブのメルケータの計算と同じ結果に見えます。
だから誰でも私はセシウムによって要求されたタイルの緯度/経度の境界ボックスを計算する方法を考え出すことができますか?
public static Box getLatLonBoundsForTile(int zoom, int x, int y) {
double longitudeMin = tile2lon(x, zoom);
double longitudeMax = tile2lon(x + 1, zoom);
double latitudeMin = tile2lat(y + 1, zoom);
double latitudeMax = tile2lat(y, zoom);
Point swPoint = new Point(longitudeMin, latitudeMin);
Point nePoint = new Point(longitudeMax, latitudeMax);
return new Box(swPoint, nePoint);
}
public static double getColsForZoomLevel(int zoom) {
if (zoom == 0) return 2;
int noTiles = 8 * (int) (Math.pow(4, zoom - 1));
return noTiles/getRowsForZoomLevel(zoom);
}
public static double getRowsForZoomLevel(int zoom) {
if (zoom == 0) return 1;
return Math.pow(2, zoom);
}
public static double tile2lon(int x, int zoom) {
return x/getColsForZoomLevel(zoom) * 360.0 - 180;
}
public static double tile2lat(int y, int zoom) {
double n = Math.PI - (2.0 * Math.PI * y)/getRowsForZoomLevel(zoom);
return Math.toDegrees(Math.atan(Math.sinh(n)));
}
ありがとうございました。私はWebMercatorTilingSchemeで計算を実装する作業をしていましたが、実際にそのタイルスキームを使用していないことがわかりました。セシウムインスペクタも指摘してくれてありがとう。それは便利なツールです! –