17

iOS アプリを Android に移植しており、Google Maps Android API v2. アプリケーションを使用してヒートマップ オーバーレイをマップに描画する必要があります。

TileOverlayこれまでのところ、 を使用して custom を実装するのが最善の選択肢のようTileProviderです。methodgetTileでは、私のメソッドは x、y、および zoom を与えられ、ビットマップを a の形式で返す必要がありますTile。ここまでは順調ですね。

ビットマップに放射状のグラデーションを描画するために使用するヒートマップ アイテムの配列があり、それぞれに緯度/経度があります。次の2つのタスクに問題があります。

  1. x、y、およびズームで表されるタイルにヒートマップ アイテムの緯度/経度が含まれているかどうかを判断するにはどうすればよいですか?
  2. ヒートマップ アイテムの緯度/経度をビットマップの x/y 座標に変換するにはどうすればよいですか。

ご協力ありがとうございました!

アップデート

以下の MaciejGórski の回答と marcin の実装のおかげで、質問の前半に回答を得ることができましたが、2 番目の部分についてはまだ助けが必要です。明確にするために、指定された緯度/経度のタイルの x/y 座標を返す関数が必要です。MaciejGórski と marcin の答えの計算を逆にしてみましたが、うまくいきませんでした。

public static Point fromLatLng(LatLng latlng, int zoom){
    int noTiles = (1 << zoom);
    double longitudeSpan = 360.0 / noTiles;
    double mercator = fromLatitude(latlng.latitude);
    int y = ((int)(mercator / 360 * noTiles)) + 180;
    int x = (int)(latlng.longitude / longitudeSpan) + 180;
    return new Point(x, y);
}

どんな助けでも大歓迎です!

4

3 に答える 3

9

これは私のために働いた:

double n = Math.pow(2, zoom);
double longitudeMin = x/n * 360 -180;
double lat_rad = Math.atan(Math.sinh(Math.PI * (1 - 2 * y/n)));
double latitudeMin = lat_rad * 180/Math.PI;

double longitudeMax = (x + 1)/n * 360 -180;
lat_rad = Math.atan(Math.sinh(Math.PI * (1 - 2 * (y + 1)/n)));
double latitudeMax = lat_rad * 180/Math.PI;

参考文献: http://wiki.openstreetmap.org/wiki/Slippy_map_tilenames

于 2013-10-01T12:27:15.753 に答える
8

MaciejGórski よろしければ (よろしければ、この投稿を削除します) コードをすぐに使用できるメソッドにコンパイルしました。

private LatLngBounds boundsOfTile(int x, int y, int zoom) {
    int noTiles = (1 << zoom);
    double longitudeSpan = 360.0 / noTiles;
    double longitudeMin = -180.0 + x * longitudeSpan;

    double mercatorMax = 180 - (((double) y) / noTiles) * 360;
    double mercatorMin = 180 - (((double) y + 1) / noTiles) * 360;
    double latitudeMax = toLatitude(mercatorMax);
    double latitudeMin = toLatitude(mercatorMin);

    LatLngBounds bounds = new LatLngBounds(new LatLng(latitudeMin, longitudeMin), new LatLng(latitudeMax, longitudeMin + longitudeSpan));
    return bounds;
}
于 2013-06-05T09:41:02.017 に答える