現在、Google 静的マップの画像を使用しています。特定のズーム レベルの縮尺を計算する方法を知りたいです。Google マップがメルカトル図法を使用していることは知っています。私が作成しているアプリケーションは、Google から衛星地図の画像を取得し、ユーザーはその上に多角形を描画します。このポリゴンの面積を実世界の単位で計算する必要があります。助言がありますか???
2 に答える
Google マップのドキュメントに記載されているとおり:
基本的なメルカトル Google マップ タイルは 256 x 256 ピクセルであるためです。また、すべてのズーム レベルで、マップには 2 n 個のタイル
があることに注意してください。
zoomLevel 2 では、マップのどの方向のピクセルも = 256 * 2² = 1024px であることを意味します。
地球の周長が ~40,000 km であることを考慮すると、ズーム 0 では、すべてのピクセル ~= 40,000 km/256 = 156.25 km
ズーム 9 では、ピクセルは 131072: 1px = 40,000 km / 131072 = 0.305 km ... そしてすぐ。
400px = 1km が必要な場合は、可能な限り最も近い概算を選択する必要があるため、1px = 1km/400 = 0.0025km となります。
zoom = 15 を試してみたところ、1px = 0.00478 が得られ、zoom = 16 で 1px = 0.00238km が得られました。
zoom = 16 を使用する必要があることを意味し、赤道線の400px ごとに 0.955km になり、 x 座標のみになります。
緯度で北または南に移動すると、周長は常に小さくなり、距離が変化します。もちろん、球の射影は難しいため、 y 軸の相関関係も変化します。
関数を使用して正確な距離を計算する場合は、Googleのドキュメントで提供されているものを使用する必要があります。
// Describe the Gall-Peters projection used by these tiles.
gallPetersMapType.projection = {
fromLatLngToPoint: function(latLng) {
var latRadians = latLng.lat() * Math.PI / 180;
return new google.maps.Point(
GALL_PETERS_RANGE_X * (0.5 + latLng.lng() / 360),
GALL_PETERS_RANGE_Y * (0.5 - 0.5 * Math.sin(latRadians)));
},
fromPointToLatLng: function(point, noWrap) {
var x = point.x / GALL_PETERS_RANGE_X;
var y = Math.max(0, Math.min(1, point.y / GALL_PETERS_RANGE_Y));
return new google.maps.LatLng(
Math.asin(1 - 2 * y) * 180 / Math.PI,
-180 + 360 * x,
noWrap);
}
};