2025-01-06
2021年に考案、開発した緯度経度精度を1文字列にエンコードする「Geo3x3(ジオスリーバイスリー)」の特徴は、対応言語の多さ。


「Geo3x3」

今回、開発した2025年新登場の構造化プログラミング言語「Wirth(ヴィルト)」に対応して、対応言語数が109となりました。


「Geo3x3 in Wirth」

Wirthを使ったエンコード「geo3x3.wirth」はこちら

function encode(lat, lng, level) res = "E" if lng < 0 res = "W" lng = lng + 180 endif lat = lat + 90 # 180:the North Pole, 0:the South Pole unit = 180 for i = 1 to level - 1 unit = unit / 3 x = lng // unit y = lat // unit res = res + (x + y * 3 + 1) lng = lng - x * unit lat = lat - y * unit next return res end

ちなみに、Wirth氏が開発したPascalでの記述「geo3x3.pas」はこちら

function Geo3x3_encode(lat: real; lng: real; level: integer): string; var unitsize: real; i: integer; x: integer; y: integer; begin result := 'E'; if lng < 0.0 then begin result := 'W'; lng := lng + 180.0; end; lat := lat + 90.0; { 180:the North Pole, 0:the South Pole } unitsize := 180.0; for i := 1 to level - 1 do begin unitsize := unitsize / 3.0; x := Floor(lng / unitsize); y := Floor(lat / unitsize); result := result + IntToStr(x + y * 3 + 1); lng := lng - x * unitsize; lat := lat - y * unitsize; end end;

型宣言が不要で、then、begin、セミコロンなどなくていいものを極力省いてよりシンプルにしています。

Pythonでの記述「geo3x3.py」はこちら

def encode(lat: float, lng: float, level: int): res = "" if lng >= 0: res += "E" else: res += "W" lng += 180 lat += 90 # 180:the North Pole, 0:the South Pole unit = 180 for i in range(1, level): unit /= 3 x = int(lng / unit) y = int(lat / unit) res += chr(ord('0') + x + y * 3 + 1) lng -= x * unit lat -= y * unit return res

一番お気に入りのオブジェクト指向言語、JavaScriptの「geo3x3.js」はこちら

const encode = (lat, lng, level) => { let res = "E"; if (lng < 0.0) { res = "W"; lng += 180.0; } lat += 90.0; // 180:the North Pole, 0:the South Pole let unit = 180.0; for (let i = 1; i < level; i++) { unit /= 3.0; const x = Math.floor(lng / unit); const y = Math.floor(lat / unit); res += x + y * 3 + 1; lng -= x * unit; lat -= y * unit; } return res; };

どれも似てますが、ちょっとずつ違うのがおもしろいですね!

links
- Pascalリスペクトの教育用構造化プログラミング言語「Wirth」

Tweet
クリエイティブ・コモンズ・ライセンス
本ブログの記事や写真は「Creative Commons — CC BY 4.0」の下に提供します。記事内で紹介するプログラムや作品は、それぞれに記載されたライセンスを参照ください。
CC BY / @taisukef / アイコン画像 / プロフィール画像 / 「一日一創」画像 / RSS