開発者向け情報

ここでは、ジオポを利用したサービスを検討されている開発者向けにジオポの仕様や実装方法などを提供します。

1. ジオポについて

ジオポ(英字名称:GeoPo)は位置情報を圧縮する技術及び、それに付随するウェブサービスを総称した名称です。

http://geopo.creco.net/Z4RHXX
上記のURLをジオポURLと呼び、中でもhttp://geopo.creco.net/に続く赤い文字のZ4RHXXジオポコードと呼びます。

2. ジオポコード

ジオポコードの構成

ジオポコードは、『0』~『9』の数字、『a』~『z』の英子文字、『A』~『Z』の英大文字と『-(ハイフン)』『_(アンダースコア)』の記号を合わせた64種類の文字が1文字から10文字まで連続した文字列で構成されます。これらの文字種はURLで使用可能な文字となっています(参考:RFC1738)。

ただし、ジオポは英大文字と英子文字が混在しているため、大文字と小文字を区別しないアプリケーション(Windowsのサーバは区別できるように設定できる場合もあります)などに用いる場合は注意してください。

ジオポはジオポコードの長さによって、縮尺が決定されます。長さが増えるほど大縮尺(縮尺分母が小さい)となっていきます。

符号化(エンコード)


これより説明のために正距円筒図法を用います。正距円筒図法は、球体(正確には楕円体)である地球を円筒に投影したもので、緯度と経度の扱いが簡単にはなりますが、距離や面積などは正しくなりません。

正距円筒図法で縦に緯度(北緯はプラス、南緯はマイナス)、横に経度(東経はプラス、西経はマイナス)を取り、それぞれ8分割したグリッドを重ね合わせた地図が以下となります。

ジオポはそれぞれ8分割されたグリッドの中に構成されたエリアに文字を振ることにより符号化します。

図上で、白く中抜きされた文字が符号を表しており、南緯90度・西経180度(東経180度)を原点とし、南緯から北緯へ、西経から東経へといった順番で符号が割り振られます。

こうして緯度・経度がどの範囲に含まれているかを判断することにより、ジオポの1文字目が決定されます。

2文字目以降の符号化

2文字目以降も同様の方法で符号化していきます。

上はRXというジオポコードが詳細になっていく様子を表した図です。まず、地球を64分割したメッシュから1文字目のRが表すエリア(R)を選択。次にRを64分割したメッシュから2文字目のXが表すエリア(X)を選択するというようになります。

このようにジオポコードの文字数が長くなるにつれて、分割される回数も増え、より詳細な位置情報を得られることがわかります。

符号化パターン

符号化の仕組みについては上で説明しましたが、実際に実装するための仕様について説明します。

符号化パターン及び緯度・経度をそれぞれ8分割していき64分割した図を十進数(白抜き数字)と八進数(黒数字)で表した図です。
緯度は八進数での1桁目、経度は八進数での2桁目にあたり、十進数では0~63の数値を取ることになります。

符号化パターンは、『0』『1』『2』『3』『4』『5』『6』『7』『8』『9』『a』『b』『c』『d』『e』『f』『g』『h』『i』『j』『k』『l』『m』『n』『o』『p』『q』『r』『s』『t』『u』『v』『w』『x』『y』『z』『A』『B』『C』『D』『E』『F』『G』『H』『I』『J』『K』『L』『M』『N』『O』『P』『Q』『R』『S』『T』『U』『V』『W』『X』『Y』『Z』『-』『_』の順番です。数字、英子文字、英大文字、ハイフン、アンダースコアの順となります。

実際の緯度・経度、八進数、十進数とジオポの符号が対応の一部分を表にすると次のようになります。

緯度の順 経度の順 八進数 十進数 ジオポの符号
0 0 00 0 0
1 0 01 1 1
0 1 010 8 8
2 1 012 10 a
4 4 044 36 A
6 7 076 62 -
7 7 077 63 _
ジオポの符号化の実装

ジオポの符号化方法ですが、こちらで紹介する方法以外にもアルゴリズム(8進数化してビット演算など)はあると思います。ここでは、一番わかりやすいアルゴリズムを紹介します。また、文字ではわかりにくいと思いますので、実際にいろいろな言語で実装したコードは、付録をご覧ください。

変換する緯度・経度は度数法での度(D)表記での数値です。もし、度分(DM)表記や度分秒(DMS)表記の場合は、前もって度へと変換してください。
また、南緯と西経はそれぞれマイナス値となります。

緯度・経度からジオポへの符号化を実装するには、まず度数法で与えられる緯度・経度を十進数に変換します。
緯度と経度をそれぞれ90と180を足して正の値とします。それから、それぞれ90と180で割り、0から1までの値になります。最後に、8の10乗をかけます。

続いて、十進数化した緯度・経度がジオポ符号でのどのエリアにあたるかを算出します。
緯度は、8を9から縮尺を引いた回数だけ乗じた数字で割ってやり、さらに、その数値を8で割ったあまりを取り出します。経度も同様に、8を9から縮尺を引いた回数だけ乗じた数字で割ってやり、さらに、その数値を8で割ったあまりを取り出し、経度には8をかけてやります。その2つの数値を足すと0から63の数値となり、それに対応する文字がジオポ符号ということになります。

次の符号を上のルーチンを繰り返しますが、8を9から縮尺を引いた回数だけ乗じた数字という部分が変化する点に注意してください。この繰り返す回数により、ジオポコードの縮尺(Scale)を決定することができます。

復号化(デコード)

復号化する方法は符号化の逆をすることで実装できます(ジオポコードは可逆性を持ちます)。

ただし、ジオポは小縮尺にも対応しているため、小縮尺になるほど符号化した位置情報との誤差が大きくなります。その誤差をできるだけ平均にするため、緯度・経度をエリアの代表緯度・経度(エリアの真ん中の緯度・経度)へと変換する式が含まれています。

ジオポをクライアントソフト側で独自に復号化して緯度・経度を取り出したい場合は、ジオポURLからジオポコードを抽出する必要があります。
下記の正規表現を用いれば、ジオポコードを抽出することができます。


http:\/\/geopo\.at\/([\w-_]{1,10})

3. ライセンスについて

ジオポURL及びジオポコードは商用・非商用に問わず自由に利用することができます。
大規模に利用する場合は、サーバのスケーラビリティを考慮する必要がありますので、ご連絡いただけると嬉しいです。

また、ジオポを用いたアプリケーションなどを開発された方も、もしよろしければご連絡ください。こちらからも紹介させていただきます(クローズドなサイト、公序良俗に反するサイトの場合は掲載を見合わせますので、あらかじめご了承ください)。

付録. サンプルコード

サンプルコード
サンプルコードはこちらのページへ移動しました。