3x3の領域で再帰的に分割する「Geo3x3」のいいところは、単純な前方一致で絞り込めるところ。

例えば、東京タワーのGeo3x3 E9139659937288 は、東京都港区あたりのメッシュ E913965 で始まります。 周辺を含めるときは1桁削って1から9を足すだけ。地球上、どの場所でも使えます。

緯度経度を持つ多量のデータから検索すると言えばデータベース。 select文でおなじみSQL(エスキューエル)は、主にデータベースからデータを取得するためのクエリー言語として使いますが、プログラムを組み込むことができるので、プログラミング言語でもあります。 ただし、標準化がちょっと遅かったせいで、データベースによって方言があります。

オープンソースでフリーで使える有名2大データベース、PostgreSQLMariaDB(MySQL互換)に対応しました。

Geo3x3 対応言語、58!

こちらがPostgreSQLのGeo3x3のエンコードのストアドファンクション(データベースに組み込めるストアドプロシージャーの関数版) src on GitHub

create or replace function Geo3x3_encode(lat real, lng real, level int) returns text as $$ declare result text; i int = 1; unit real = 180.0; x int = 0; y int = 0; begin if lng >= 0.0 then result = 'E'; else lng = lng + 180.0; result = 'W'; end if; lat = lat + 90.0; while i < level loop unit = unit / 3.0; x = floor(lng / unit); y = floor(lat / unit); result = concat(result, x + y * 3 + 1); lng = lng - x * unit; lat = lat - y * unit; i = i + 1; end loop; return result; end; $$ language plpgsql;

結構、普通に書けますね!

select Geo3x3_encode(35.65858, 139.745433, 14);

このように、select文内で利用できます。
エンコードは両SQLにあまり差はありませんが、緯度、経度、レベル、範囲を返すデコードの実装はまとめて値を返せるPostgreSQLとOUTを使って参照変数で返すMariaDB版(src on GitHub)とでちょっと違います。

問題、この言語は何でしょう?

module geo3x3 implicit none contains character(50) function geo3x3_encode(lat, lng, level) real lat real lng integer level real flat real flng real unit integer i, x, y flat = lat flng = lng if (lng >= 0.0) then geo3x3_encode = "E" else geo3x3_encode = "W" flng = flng + 180.0 end if flat = flat + 90.0 unit = 180.0 do i = 1, level - 1 unit = unit / 3 x = floor(flng / unit) y = floor(flat / unit) geo3x3_encode(i + 1: i + 1) = char(x + y * 3 + 1 + 48) flng = flng - x * unit flat = flat - y * unit end do end end

使う変数を関数の先頭で定義する感じがSQLと似てますね。 正解は1954年生まれ、高級言語のご先祖様、Fortran(フォートラン)! C言語も昔はこんな書き方してました。 なんと、スパコンの世界ではC++と並んで現役言語とか!
スパコンプログラマ日常 ~スパコンを使うのって難しいの?~ 東京大学物性研究所 物質設計評価施設 渡辺宙志

数値計算と言えば、名前は見たことあるMATLABとそのオープンソース版であるOctaveにも対応!
taisukef/Geo3x3: geo zone encoding, serialize latitude and longitude
プログラミング言語を巡る旅は続きます。

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / RSS