GeoDeltaというものを考えてみました

 こんにちは。那由多屋の加藤です。

 地球上の座標を示すためのコード「GeoDelta」というものを考えてみました。ちなみに考えてみただけです。実装求む!(笑)

概要

 とても大雑把に言えばGeoHexの三角形バージョンです。世界を入れ子の三角形で分割し、それを符号化します。

特徴

 GeoDeltaには下記のような特徴があります。たぶん。(なにぶん、まだ実装していないので本当かどうか・・・)

  • メルカトル図法で描画された地図を正三角形で分割します。(Googleマップなど)
  • 下位の領域(三角形)は上位の領域に包含されます。
  • 比較的短いコードで領域(面積を持つ座標)を表現することができます。
  • GeoDeltaコードの末尾を削ることで、1レベルまたは2レベル上位の領域を示すことができます。
  • GeoDeltaコードは、口頭での伝達、手書きによる伝達で間違いが生じにくいように設計されています。
  • 三角形を6つ組み合わせて六角形でビジュアライズするのが容易です。
  • およそ北緯82.46度から南緯82.46度の領域を示すことができます。(南極観測隊のみなさん、ごめんなさい!)

 開発者向けには以下のような特徴があります。

  • たぶん、実装が容易です。
  • 正しいGeoDeltaコードかどうか、1つの正規表現で判定できます。
  • 単純な文字列処理で上位の領域が得られます。

仕様

 以下、具体的な仕様です。まだあまり検証されていません。

領域

 GeoDeltaでは、領域のことを「デルタ」と呼びます。地球を8個に分割したデルタを「ワールドデルタ」、入れ子になったデルタを「サブデルタ」と呼びます。

 ワールドデルタには0から7までの番号が振られています。北半球から南半球、西から東の順番で番号が振られます。

 上図における経度0度の北半球に位置するのがデルタ0(ヨーロッパを含む領域)、そこから東方向にデルタ1(主にアジアを含む領域)、デルタ2(日付変更線を含む領域)、デルタ3(北アメリカを含む領域)とします。

 南半球も同様に、経度0度がデルタ4(南極だけを含む領域)、デルタ5(オーストラリアを含む領域)、デルタ6(日付変更線を含む領域)、デルタ7(南アメリカを含む領域)とします。

 ワールドデルタは4つの領域に分割されます。分割されたデルタが「サブデルタ」です。サブデルタを分割したデルタもまた「サブデルタ」です。

 サブデルタには0から3までの番号が振られています。中心を0とし、時計回りに1、2、3とします。上向きの三角形と下向きの三角形があることに気をつけて下さい。

レベル

 領域の大きさは「レベル」と呼ばれる数値で示されます。ワールドデルタがレベル1、それを4分割したサブデルタのそれぞれがレベル2、そのサブデルタをさらに分割したものがレベル3です。

 レベルが1つ大きくなるにつれて、地図上での面積が4分の1になります。実際に表現される領域の面積が4分の1になるわけではないことに気をつけて下さい。

コード体系

 GeoDeltaコードは、下記のような書式で構成されます。

WSSSS....

 「W」は符号化されたワールドデルタ、「S」は符号化されたサブデルタを示します。

 より大きいレベル(狭い面積)を示すGeoDeltaコードほど長くなります。

符号化

 GeoDeltaコードは、数字とアルファベットで構成されます。アルファベットは大文字小文字を区別しませんが、大文字で表記することが推奨されます。

 GeoDeltaコードでは、数字の「0」「1」「9」、アルファベットの「I」「L」「O」「Q」「U」を除く28文字で表現されます。これらの文字が除かれている理由は、下記の通りです。

  • 「0」: アルファベットの「O」と間違える可能性があるため。
  • 「1」: アルファベットの「I」「L」と間違える可能性があるため。特に「L」が小文字の場合。
  • 「9」: アルファベットの「Q」、数字の「6」と間違える可能性があるため。「Q」については日本語特有。
  • 「I」: 数字の「1」、アルファベットの「L」と間違える可能性があるため。特に「L」が小文字の場合。
  • 「L」: 数字の「1」、アルファベットの「I」と間違える可能性があるため。特に「L」が小文字の場合。
  • 「O」: 数字の「0」と間違える可能性があるため。
  • 「Q」: 数字の「9」と間違える可能性があるため。日本語特有。
  • 「U」: アルファベットの「V」と間違える可能性があるため。特に手書きの場合。

 ワールドデルタは1文字に符号化されます。対応表は下記の通りです。

デルタ0 Z
デルタ1 Y
デルタ2 X
デルタ3 W
デルタ4 V
デルタ5 T
デルタ6 S
デルタ7 R

 ワールドデルタに続くサブデルタは、レベルによって文字数が異なります。サブデルタの符号化は、下記の順序で行います。

  1. 4進数(0から3)のシーケンス(例えば0、1、2)を2進数のシーケンス(例えば00、01、10)に変換します。
  2. 2進数のシーケンスをレベルの小さな領域から順番に結合します。
  3. 下記の対応表に従い、4ビット、または2ビットを文字に変換します。

4ビット以上残っている場合は、下記の表で変換します。

0000 2
0001 3
0010 4
0011 5
0100 6
0101 7
0110 8
0111 A
1000 B
1001 C
1010 D
1011 E
1100 F
1101 G
1110 H
1111 J

2ビット残った場合、下記の表で変換します。

00 K
01 M
10 N
11 P
符号化の例

 GeoDeltaコードの符号化の例を下記に示します。

  • アジア大陸を含むデルタ1→「Y」
  • 日本を含む、デルタ1の右下のデルタ→「YP」(Y,11)
  • 「YP」の上側のデルタ→「YG」(Y,11,01)

 ・・・これ以上は実際に実装しないと無理そうです。

実装のお願い

 ここまで考えたのはいいのですが、実装する元気と時間がありません(笑)。実装を求む!

 できることならば、OSIOpen Source Initiative)が認めるオープンソース・ライセンス下での提供を望みます。

 一番最初にエンコーダ、デコーダを実装してくれた方にラーメンを奢ります!(ただし、関西圏、東京23区内に限る)

参考情報

 実装者の参考になるであろう情報を並べておきます。

ライセンス

 この仕様書(笑)のライセンスは、CCライセンスのBY-SA(表示-継承)2.1とします。名前は「Yuya Kato (Nayutaya Inc.)」としてください。