例えば、東京タワーのGeo3x3 E9139659937288 は、東京都港区あたりのメッシュ E913965 で始まります。 周辺を含めるときは1桁削って1から9を足すだけ。地球上、どの場所でも使えます。
緯度経度を持つ多量のデータから検索すると言えばデータベース。 select文でおなじみSQL(エスキューエル)は、主にデータベースからデータを取得するためのクエリー言語として使いますが、プログラムを組み込むことができるので、プログラミング言語でもあります。 ただし、標準化がちょっと遅かったせいで、データベースによって方言があります。
オープンソースでフリーで使える有名2大データベース、PostgreSQLとMariaDB(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」
プログラミング言語を巡る旅は続きます。