Google マップ ユーティリティ ライブラリを使用した Google マップのマップ タイル サーバーと座標変換について質問があります。
私のタイル サーバーは、何千もの GPS 座標 (緯度、経度) を持つデータベースにアクセスし、(緯度、経度) ポイントごとに、そのポイントがタイルの地理的境界内にあるかどうかを確認します。存在する場合は、座標変換 (WGS84 -> メルカトル -> タイル内の X、Y オフセット) を行い、GoogleMapsUtility ライブラリを使用して、タイル内の対応するピクセルをペイントします。
コードに関しては、次のことを行います。
$point = GoogleMapUtility::getOffsetPixelCoords((float)$row['lat'], (float)$row['lng'], $zoom, $X, $Y);
これはgetOffsetPixelCoords
、ライブラリから関数 (および以下の関数)を呼び出します。
public static function getOffsetPixelCoords($lat,$lng,$zoom, $X, $Y)
{
$pixelCoords = GoogleMapUtility::getPixelCoords($lat, $lng, $zoom);
return new Point(
$pixelCoords->x - $X * GoogleMapUtility::TILE_SIZE,
$pixelCoords->y - $Y * GoogleMapUtility::TILE_SIZE
);
}
public static function getPixelCoords($lat, $lng, $zoom)
{
$normalised = GoogleMapUtility::_toNormalisedMercatorCoords(GoogleMapUtility::_toMercatorCoords($lat, $lng));
$scale = (1 << ($zoom)) * GoogleMapUtility::TILE_SIZE;
return new Point(
(int)($normalised->x * $scale),
(int)($normalised->y * $scale)
);
}
private static function _toNormalisedMercatorCoords($point)
{
$point->x += 0.5;
$point->y = abs($point->y-0.5);
return $point;
}
さて、結果です。ズーム レベルが 13 未満の場合、うまく機能します。ズーム レベル 11 のタイルの例を次に示します。
ただし、ズーム レベルが 13 を超えるタイルの場合は、次のようになります。
これはとても奇妙です...ピクセルが完全に整列しているように見えますか? 最初は小数の解像度の問題だと思っていましたが、データの解像度はかなり良いです (たとえば、mysql データベースでは 35.6185989379883、139.731994628906 のように double として格納され、php では float と double は同じものです...)
誰かがこの問題を解決する方法について私を助けてくれますか?
前もって感謝します...