ジオハッシュエンコーダー
緯度・経度を短いジオハッシュに変えます。37.7749と-122.4194を9文字で変換すると9q8yyk8ytになり、街区ほどの大きさのセルで近くの場所をまとめられます。ブラウザで無料で使えます。
- 無料
- ブラウザで動作
- 登録不要
- データは端末の外に出ません
無料で実行
計算例
- 緯度(10進度)
- 37.7749
- 経度(10進度)
- -122.4194
- 精度
- 9
- ジオハッシュ
- 9q8yyk8yt
ジオハッシュは、一対の地理座標を地球上の矩形セルを表す短い base32 文字列へと変換する方式です。近い地点どうしは長い共通の接頭辞を共有するため、この符号化は近傍検索、タイルキー、キャッシュの分割、そして人間にも読める位置トークンに適しています。この機能は緯度・経度と精度の長さを受け取り、ジオハッシュ文字列とそのセルの外接矩形を併せて返します。アルゴリズムは純粋な算術演算のみで、ネットワーク通信も、乱数抽出も、時計への依存もありません。精度が不正な場合や座標が範囲外の場合は、誤ったセルを黙って返すのではなく、明確な入力エラーとして拒否いたします。
ジオハッシュが実際に表しているもの
ジオハッシュは、経度と緯度のビットを交互に組み合わせ、それらを 5 ビットずつ、紛らわしい文字をあえて除いた 32 文字のアルファベットに詰め込む、公開された符号化方式です。文字を 1 つ加えるごとに、セルはおおよそ一方の次元、次にもう一方の次元へと半分になっていくため、長い文字列ほど小さな矩形を表します。
1 文字のハッシュは地球上の広大な範囲を覆い、9 文字や 10 文字は緯度にもよりますが、通常は街区や建物の敷地を表すのに十分な細かさです。接頭辞が入れ子になるため、先頭 7 文字が一致する 2 地点は同じ粗いセルに収まり、これこそが接頭辞クエリや地図のクラスタリングを実用的にしています。この文字列は暗号学的ハッシュではありません。
異なる地点が意図的に接頭辞を共有することもあり、同じ精度なら同じ座標に対して常に同じ文字列が得られます。ログの各行やデータベースの各行に完全な浮動小数点の対を持たせる代わりに、場所を表すコンパクトで URL に安全なキーが必要なときにお使いください。
精度の選び方と座標の送り方
WGS84 の地球上の十進度で送信してください。緯度はマイナス 90 度から 90 度、経度はマイナス 180 度から 180 度です。精度は返してほしい base32 文字の数で、1 から 12 までです。
小さい値は国や地域単位のバケットに、中間の値は都市や地区に、大きい値は屋内規模や車両追跡のセルに適しています。応答には、送信した入力、得られたジオハッシュ、そしてその文字列が表すセルの緯度・経度の境界が含まれます。これらの境界は、最後のビットを処理し終えた時点でエンコーダーが保持している区間なので、別途デコードしなくても被覆範囲を検証できます。
単位や方位の文字を含む文字列ではなく、安定した十進数の値をお使いください。DMS やグリッド参照は呼び出す前に変換してください。
符号化されたセルが実際のパイプラインで果たす役割
ジオハッシュのセルは度空間における矩形であって、面積の等しい完全な円ではないことにご留意ください。極付近では、長さの等しいセルでも赤道付近に比べて東西方向のメートル幅がはるかに狭くなります。厳密な半径検索では、依然として元の地点で距離を計算します。
ハッシュはバケット化と候補の抽出に用い、その後に絞り込んでください。
活用例
データベースとキャッシュのパーティションキー
各レコードの横に固定長のジオハッシュを保存すれば、浮動小数点インデックスなしで、範囲スキャンやキャッシュのシャードが近い位置どうしをまとめられます。
地図のクラスタリングとタイルのラベル
選んだズーム相当の精度で共有接頭辞ごとにピンをまとめ、詳細が必要なセルだけを展開します。
URL 内の短い位置トークン
長い座標のクエリ文字列を、他所でデコードしても既知のセルを復元できるコンパクトなジオハッシュに置き換えます。
よくある質問
このジオハッシュエンコーダーは何を返しますか?
ジオハッシュ文字列、送信した緯度と経度、精度の長さ、そしてその文字列が表すセルの外接矩形を返します。
どの精度を使えばよいですか?
広い地域には少ない文字数を、細かいセルには多い文字数をお使いください。街区規模には 7 から 9 程度がよく使われ、12 がこのツールで受け付ける最大値です。
費用はいくらですか?
ページ上のツールはブラウザーで無料です。不正な入力には課金されません。
近い場所のジオハッシュの先頭が同じになるのはなぜですか?
セルが入れ子になっているためです。文字を1つ増やすごとに前のセルが小さく分かれます。最初の7文字が同じ2地点は同じ大きなセルに入るので、前方一致の検索や地図上のまとめ表示ができます。
ジオハッシュのセルは地球上のどこでも同じ大きさですか?
いいえ。セルは度で区切った長方形で、面積の等しい円ではありません。極に近いほど東西方向のメートル幅が赤道付近よりずっと狭くなります。厳密な半径検索では元の座標で距離を測ってください。
関連ツール
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/geo/geohash-encode \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"latitude":37.7749,"longitude":-122.4194,"precision":9}'const res = await fetch("https://api.kit.forhosting.com/geo/geohash-encode", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"latitude": 37.7749,
"longitude": -122.4194,
"precision": 9
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/geo/geohash-encode",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"latitude": 37.7749,
"longitude": -122.4194,
"precision": 9
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/geo/geohash-encode", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"latitude":37.7749,"longitude":-122.4194,"precision":9}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"latitude":37.7749,"longitude":-122.4194,"precision":9}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/geo/geohash-encode", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"latitude": 37.7749,
"longitude": -122.4194,
"precision": 9
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "geo.geohash_encode",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |
技術的な注記
精度の選び方と座標の送り方
精度が 1 未満、またはいずれかの座標がその正当な範囲外にある場合、呼び出しは invalid_input で失敗し、課金されません。欠落したフィールドや非数値も同様に失敗します。
符号化されたセルが実際のパイプラインで果たす役割
チームはジオハッシュを、時系列ストアのパーティションキーとして、クライアントキャッシュの地図タイル識別子として、近傍点フィルターの共有接頭辞として、そして完全な緯度・経度の対が扱いにくいときの URL や QR ペイロード内の短いトークンとして利用します。この変換は決定論的で副作用がないため、ブラウザーでも、ワーカーでも、バッチジョブでも同じキーを再生成でき、同じ入力に対してバイト単位で同一の結果が期待できます。単一の位置を調べるには無料のブラウザーツールをご利用いただき、自動処理の中で同じ符号化が必要な場合は、成功した 1 リクエストあたり $0.002 で API を呼び出してください。
技術的な質問
符号化が失敗するのはどんなときですか。
精度が 1 未満(または 12 超)のとき、緯度が −90…90 の範囲外のとき、経度が −180…180 の範囲外のとき、または必須の数値が欠落もしくは有限でないときに、invalid_input で失敗します。
結果はブラウザーでも API でも同じですか。
はい。どちらも lib.js 内の同じ純粋なエンコーダーを実行するため、同一の入力からは同一のジオハッシュ文字列と外接矩形が得られます。