モートンコード復号:Z-orderインデックスをx・yへ変換
このモートンコード復号器は、2次元のZ-orderマッピングを逆変換します。符号なしの10進インデックスを入力すると、交互に配置されたビットを分離し、元のx座標とy座標を復元します。64ビットのMorton範囲全体に対応するため、各座標で符号なし32ビットをすべて利用できます。処理は厳密かつ決定的であり、空間インデックスの調査、エンコーダーのデバッグ、タイル識別子の読解、データベースやグラフィックス処理の検証に適しています。専用のビット操作スクリプトを書く必要はありません。
無料で実行
Morton復号で2つの座標を復元する仕組み
2次元Mortonコードは、2本の座標ビット列を1つの整数に格納します。最下位側から、位置0はx、位置1はy、位置2は再びxとなり、この配置が続きます。そのため、復号時に位置を推測したり、近似や除算を行ったりしません。偶数位置の各ビットをxの対応位置へ、奇数位置の各ビットをyへ移します。たとえばMorton位置6のビットはxのビット3に、位置7のビットはyのビット3になります。この規則を利用可能な64ビットすべてに適用し、符号なし32ビット座標を2つ生成します。返されるコードは10進文字列として正規化されるため、先頭のゼロによる曖昧さがなく、元の数値を正確に保てます。これはxを偶数位置に置く一般的な2次元方式です。上流システムがyを先に交互配置する場合は、結果の2座標を入れ替えるか、比較前にエンコーダー側の規則を調整してください。
精度を失わずに大きなコードを入力する方法
Mortonインデックスは、codeフィールドへ符号なし10進整数の文字列として送信してください。例は"39"や"18446744073709551615"です。通常のJSON数値とJavaScript数値では、符号なし64ビット範囲の全整数を正確に表せないため、大きな値には文字列が必要です。本機能は厳密な整数演算で文字列を解析し、結合されたMortonコードを浮動小数点数へ変換しません。符号、小数点、指数表記、空白、カンマ、16進接頭辞、2^64から1を引いた値を超える入力は、暗黙に丸めず拒否します。実装上は安全な小整数も受理しますが、公開仕様はどのSDKや転送方式でも精度を保つ文字列です。xとyは4,294,967,295を超えず、JSON数値で厳密に表せるため数値フィールドで返します。コード0はxとyがともに0、最大コードは両軸が最大値になります。
空間システムの検証に結果を利用する方法
Morton順序は、空間データベース、四分木、タイルストア、ボクセルやテクスチャの配置、キャッシュ効率のよい配列、グラフィックスパイプラインで使われます。デバッグ時には疑わしいインデックスを復号し、返された点をエンコーダーへ渡した座標ペアと比較してください。同じx優先規則なら、正しい往復変換は両座標を厳密に再現します。境界テストでは、0、Mortonビットが1つだけ立つ値、座標の2の累乗、最大コードをお試しください。単一ビットの例は、軸の入れ替わりや1ビットのずれをすぐ示します。本機能が返すのは座標であり、緯度・経度ではありません。Mortonはビット配置だけを定義し、投影、縮尺、符号表現、座標参照系を定めません。符号付き座標のオフセット、浮動小数位置の量子化、地理投影を事前に行った場合は、復号後にアプリ固有の処理を逆に適用してください。APIはネットワーク、乱数、保存状態を使わず、上限のある処理を1回実行します。
活用例
空間インデックスをデバッグ
予期しないZ-orderキーをxとyへ戻し、エンコーダー、軸順序、ビット位置の不具合を特定します。
四分木とタイルIDを調査
アプリの縮尺や投影を適用する前に、コンパクトなMortonキーから整数グリッド位置を復元します。
エンコードの往復を検証
データベース、シミュレーション、ゲーム、グラフィックス、キャッシュ向け配置のテストへ決定的な復号検査を追加します。
よくある質問
各座標にはどのビットが割り当てられますか?
Morton位置0、2、4と残りの偶数位置はxへ、位置1、3、5と残りの奇数位置はyへ復号されます。
対応する最大のMortonコードはいくつですか?
最大値は18446744073709551615、つまり2^64から1を引いた値です。x = 4294967295、y = 4294967295になります。
コードを文字列で送る必要があるのはなぜですか?
10進文字列なら、JSONとJavaScriptで64ビット整数を厳密に保持できます。大きなJSON数値は丸められる場合があります。
結果は緯度と経度へ変換されますか?
いいえ。符号なし整数座標だけを復元します。投影、縮尺、オフセット、符号規則はコード生成元のシステムに依存します。
APIリクエストの料金はいくらですか?
APIリクエスト1件の料金は$0.002です。このアルゴリズムはネットワークサービスや確率モデルを利用しません。
開発者向け — APIアクセス
このページの機能はすべてAPIからも利用できます。自社システムに組み込みたいチーム向けのセクションです。それ以外の方は上のツールをそのままお使いください。
エンドポイント
Bearerトークンで認証し、POST1回でタスクをキューに登録します。結果はWebhookまたは署名付きリンクで受け取れます。
お使いのスタックから呼び出す
curl -X POST https://api.kit.forhosting.com/dev/morton-decode \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"code":"39"}'const res = await fetch("https://api.kit.forhosting.com/dev/morton-decode", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"code": "39"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/dev/morton-decode",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"code": "39"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/dev/morton-decode", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"code":"39"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"code":"39"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/dev/morton-decode", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)リクエスト例
{
"code": "39"
}レスポンス例
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "dev.morton_decode",
"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 | リクエストが多すぎます。しばらく待ってから再度お試しください。 |