Web Mercator地上解像度計算
赤道でズーム0のとき、一般的なウェブ地図の1ピクセルは156,543.033928 m、256ピクセルのタイル1枚は40,075,016.6856 mに当たります。ズームが1段上がるごとに半分になり、高緯度ではさらに小さくなります。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 緯度
- 0
- ズームレベル
- 0
- 1ピクセルあたりのメートル数
- 156,543.033928
- 1タイルあたりのメートル数
- 40,075,016.6856
- タイルサイズ (px)
- 256
- 地球の半径 (m)
- 6,378,137
この計算ツールは、指定した緯度とスリッピーマップのズームで、Web Mercatorの1ピクセルが地上の何メートルに相当するかを求めます。EPSG:3857の球体、256ピクセルのタイル、一般的なXYZタイルピラミッドを使用します。画面上の距離の換算、記号の大きさの決定、スケールバーの作成、必要な詳細度に合う画像の選択に役立ちます。計算は決定的でネットワークを使用せず、タイル1枚分の地上幅も返します。
地上解像度が表す内容
地上解像度は、地図上の1ピクセルが覆う実世界のおおよその距離を示し、通常はメートル毎ピクセルで表します。モニターの解像度、GPSの精度、航空画像が本来持つ細かさとは異なります。特定の緯度におけるWeb Mercatorのデジタル格子と地上距離を結び付ける尺度です。
ズーム0では、投影された世界全体が256ピクセルのタイル1枚に収まります。ズームが1段階上がるごとに各方向のタイル数が倍になり、1ピクセル当たりの距離は半分になります。Web Mercatorは極に近づくほど縮尺を拡大するため、緯度も重要です。
同じズームでも、赤道から離れたピクセルほど東西方向の地上距離が短くなります。
Web Mercatorの計算式
このツールはEPSG:3857が採用する赤道半径6,378,137メートルを使用します。最初に、半径へ2とpiを掛けて球の赤道周長を求めます。それを256で割ると、赤道かつズーム0での初期解像度になります。
続いて2のズーム乗で割り、ラジアンへ変換した緯度の余弦を掛けます。簡潔に表すと、解像度はcos(緯度) × 2πR ÷ (256 × 2^zoom)です。応答は一般的な論理タイルサイズである256ピクセルを前提とします。
512ピクセル画像を配信するレンダラーでは、タイルとズームの規約をご確認ください。入力できるズームは0から30までの整数、緯度はWeb Mercatorの実用限界である約±85.05112878度以内です。この制限により、有限のスリッピーマップ世界の外側を有効な位置として扱うことを防ぎます。
精度を過大評価しない使い方
地上解像度は縮尺の換算値としてお使いください。元データが同じ精度を持つという保証ではありません。たとえば2メートル毎ピクセルなら、10ピクセルの線は指定緯度付近で約20メートルに相当しますが、道路形状、画像、端末位置にはそれ以上の誤差があり得ます。
表示範囲の上端と下端では緯度が異なるため、縮尺も変化します。通常の対話型地図では中心緯度で十分ですが、南北に長い地域の出力では複数緯度での計算が適切です。クラスタリング半径、クリック許容範囲、ラスター出力範囲、スケールバーの表示にご利用いただけます。
整数ズームが1段上がるたびに値は半分になります。同じズームなら絶対緯度が高いほど余弦補正により値が小さくなります。
活用例
正確なスケールバーの作成
地図中心の緯度で、指定したピクセル幅を表示用のおおよその地上距離へ換算します。
クラスタと選択半径の決定
画面上のピクセル閾値を、指定したズームと緯度でのメートル値へ変換します。
ラスター出力の計画
地図画像を取得または処理する前に、タイルやピクセルが覆う地上幅を見積もります。
よくある質問
どの計算式を使用しますか?
cos(緯度) × 2π × 6378137 ÷ (256 × 2^zoom)を使用し、緯度は先にラジアンへ変換します。
緯度によって解像度が変わるのはなぜですか?
Web Mercatorは極に近いほど縮尺を拡大するため、高緯度では投影上の1ピクセルが表す地上距離が短くなります。
想定するタイルサイズはいくつですか?
一般的なスリッピーマップの論理タイルサイズである256ピクセルを想定しています。
小数のズーム値を使えますか?
いいえ。 0から30までの整数のタイルピラミッド階層に対応しています。
画面上の距離を地上のメートルに直すにはどうしますか?
1ピクセル当たりのメートル値に、地図上で測ったピクセル数を掛けてください。値は入力した緯度の近くで有効なので、南北に大きく離れたら計算し直してください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/web-mercator-ground-resolution \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"latitude":40.7128,"zoom":12}'const res = await fetch("https://api.kit.forhosting.com/geo/web-mercator-ground-resolution", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"latitude": 40.7128,
"zoom": 12
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/web-mercator-ground-resolution",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"latitude": 40.7128,
"zoom": 12
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/web-mercator-ground-resolution", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"latitude":40.7128,"zoom":12}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"latitude":40.7128,"zoom":12}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/web-mercator-ground-resolution", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"latitude": 40.7128,
"zoom": 12
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.web_mercator_ground_resolution",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}非同期APIです。task_idは即時に返ります。ポーリングは1秒あたり1リクエストまでです。
料金
単価はすべて公開しています。トークン換算や独自クレジットはありません。失敗したタスクは課金されません。
エラー
| HTTP | コード | 意味 |
|---|---|---|
401 | unauthorized | APIキーが無効か、指定されていません。Authorizationヘッダーを確認してください。 |
402 | insufficient_balance | 残高が不足しています。チャージ後に再度お試しください。 |
404 | unknown_type | 指定されたタスクタイプは存在しません。タイプ名を確認してください。 |
429 | rate_limited | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
地上解像度が表す内容
指定緯度付近の換算にはmeters_per_pixelを使い、画面幅や記号幅のピクセル数を掛けてください。meters_per_tileは標準XYZタイル1枚の幅に同じ解像度を適用した値です。
精度を過大評価しない使い方
APIは正常な1項目につき$0.002で、ブラウザーと同じ決定的計算を実行します。
技術的な質問
APIリクエストの料金はいくらですか?
正常に処理された1項目は$0.002です。無効な入力にはinvalid_inputエラーを返します。