Geo3x3 is a simple geo-coding system for WGS84
Geo3x3はシンプルなWGS84向けジオコーディングです
divide the earth to two (West or East), recursive divisiton 3x3(9th). longer is more in detail.
地球を東(E)と西(W)に分け、再帰的に3x3の9エリアで分割します。長いほど精度が上がります。
East | West | |||||
---|---|---|---|---|---|---|
North | 1 | 2 | 3 | 1 | 2 | 3 |
4 | 5 | 6 | 4 | 5 | 6 | |
South | 7 | 8 | 9 | 7 | 8 | 9 |
W5555555 = level 8
E1384700 = level 6 (postfix 0 = dummy)
* origin = lat 90, lng 0 -> lat -90, lng 90(E) -90(W)
https://taisukef.github.io/Geo3x3/
36 programming languages supported now
現在36のプログラミング言語対応しています
(JavaScript / TypeScript / C / C++ / C# / Swift / Java / Python / Ruby / PHP / Go / Kotlin / Dart / Rust / Haskell / OpenVBS / Scala / R / GAS / Nim / Lua / Perl / Elixir / Groovy / D / Julia / Racket / OCaml / Erlang / Clojure / F# / Haxe / Scheme / Common Lisp / Elm / Hack)
https://taisukef.github.io/Geo3x3/langlist.html
level | location | Geo3x3 |
---|---|---|
3 | 日本 | E37 |
5 | 中部 | E3792 |
6 | 福井県 | E37924 |
8 | 福井県鯖江市 | E3792198 |
10 | 鯖江市西山公園 | E379219883 |
13 | 鯖江市西山公園のトイレ | E379219883294 |
※範囲が狭くなるほどコードが長くなり、範囲が含まれるかどうか前方一致で分かります
These codes are licensed under CC0 (Public Domain)
ライセンスはCC0(パブリックドメイン)です
Geo3x3.mjs, simple_geo3x3.html
<script type=module>
import { Geo3x3 } from "https://taisukef.github.io/Geo3x3/Geo3x3.mjs";
console.log(Geo3x3.decode("W28644"));
</script>
import { Geo3x3 } from "https://taisukef.github.io/Geo3x3/Geo3x3.mjs";
console.log(Geo3x3.decode("W28644"));
to run:
$ deno run -A simple_geo3x3.mjs
import { Geo3x3 } from "./Geo3x3.mjs";
console.log(Geo3x3.decode("W28644"));
to run:
$ node simple_geo3x3.mjs
import { Geo3x3 } from "https://taisukef.github.io/Geo3x3/Geo3x3.ts";
console.log(Geo3x3.decode("W28644"));
to run:
$ deno run simple_geo3x3.ts
import geo3x3
## get Geo3x3 code from latitude / longitude / level
code = geo3x3.encode(35.65858, 139.745433, 14)
print(code) # E3793653391822
## get location from Geo3x3 code
pos = geo3x3.decode('E3793653391822')
print(pos) # (35.658633790016204, 139.74546563023935, 14, 0.00011290058538953522)
to run:
$ python3 simple_geo3x3.py
require "./geo3x3"
code = Geo3x3.encode(35.65858, 139.745433, 14)
p code # "E3793653391822"
pos = Geo3x3.decode('E3793653391822')
p pos # [35.658633790016204, 139.74546563023935, 14, 0.00011290058538953522]
to run:
$ ruby simple_geo3x3.rb
public class simple_geo3x3 {
public static void main(String[] args) {
String code = Geo3x3.encode(35.65858, 139.745433, 14);
System.out.println(code);
double[] res = Geo3x3.decode("E3793653391822");
System.out.println(res[0] + " " + res[1] + " " + res[2] + " " + res[3]);
}
}
to run:
$ javac simple_geo3x3.java Geo3x3.java
$ java simple_geo3x3
#include <stdio.h> /**< printf */
#include <stdlib.h> /**< exit */
#include "geo3x3.h"
int main() {
enum GEO3X3_RES err;
char enc_buf[16];
struct geo3x3_wgs84 res;
if ((err = geo3x3_from_wgs84_str(35.36053512254623, 138.72724901129274, 9, enc_buf, sizeof(enc_buf)))) {
// handle errors
exit(1);
}
printf("geo3x3: %s\n", enc_buf); // geo3x3: E37935738
if ((err = geo3x3_to_wgs84_str(enc_buf, &res))) {
// handle errors
exit(1);
}
// wgs84: 35.363512 138.724280 9 0.027435
printf(" wgs84: %f %f %u %f\n", res.lat, res.lng, res.level, res.unit);
return 0;
}
to run:
$ cc simple_geo3x3.c; ./a.out
geo3x3.r.hpp, simple_geo3x3.r.cpp
#include <stdio.h>
#include "geo3x3.r.hpp"
int main() {
Geo3x3::Encoder<14> enc(35.65858, 139.745433);
printf("%s\n", (const char*)enc);
Geo3x3::Decoder dec("E3793653391822");
printf("%f %f (%d)\n", dec.lat(), dec.lng(), dec.level());
return 0;
}
to run:
$ g++ simple_geo3x3.cpp
using System;
public class HelloWorld {
static public void Main() {
String code = Geo3x3.encode(35.65858, 139.745433, 14);
Console.WriteLine(code);
double[] res = Geo3x3.decode("E3793653391822");
Console.WriteLine(res[0] + " " + res[1] + " " + res[2] + " " + res[3]);
}
}
to run:
$ mcs simple_geo3x3.cs Geo3x3.cs
$ mono ./simple_geo3x3.exe
<?php
require('Geo3x3.php');
$code = Geo3x3::encode(35.65858, 139.745433, 14);
echo $code . "\n";
$pos = Geo3x3::decode('E3793653391822');
echo $pos[0] . " " . $pos[1] . " " . $pos[2] . " " . $pos[3] . "\n";
?>
to run:
$ php simple_geo3x3.php
Geo3x3.swift, simple_geo3x3.swift
import Geo3x3
let code = Geo3x3.encode(lat: 35.65858, lng: 139.745433, level: 14)
print(code)
let pos = Geo3x3.decode(code: "E3793653391822")
print(pos)
to run: (Swift)
$ swiftc -emit-module -parse-as-library Geo3x3.swift -module-name Geo3x3
$ swiftc -emit-object -parse-as-library Geo3x3.swift -module-name Geo3x3
$ swiftc simple_geo3x3.swift Geo3x3.o -I .
$ ./main
package main
import "fmt"
import "./geo3x3"
func main() {
code := geo3x3.Encode(35.65858, 139.745433, 14)
fmt.Printf("%s\n", code) // E3793653391822
pos := geo3x3.Decode("E3793653391822")
fmt.Printf("%f %f %f %f\n", pos[0], pos[1], pos[2], pos[3]); // 35.658634 139.745466 14.000000 0.000113
}
to run:
$ go build simple_geo3x3.go
$ ./simple_geo3x3
fun main() {
val code = Geo3x3.encode(35.65858, 139.745433, 14)
println(code)
val res = Geo3x3.decode("E3793653391822")
println("${res[0]} ${res[1]} ${res[2]} ${res[3]}")
}
to run:
$ kotlinc simple_geo3x3.kt Geo3x3.kt -include-runtime -d simple_geo3x3.jar
$ kotlin simple_geo3x3.jar
Geo3x3.dart, simple_geo3x3.dart
import "./Geo3x3.dart";
main() {
final code = Geo3x3.encode(35.65858, 139.745433, 14);
print(code);
final res = Geo3x3.decode("E3793653391822");
print("${res[0]} ${res[1]} ${res[2]} ${res[3]}");
}
to run:
$ dart simple_geo3x3.dart
mod geo3x3;
fn main() {
let res = geo3x3::encode(35.65858, 139.745433, 14);
println!("{}", res);
let pos = geo3x3::decode("E3793653391822".to_string());
println!("{} {} {} {}", pos.0, pos.1, pos.2, pos.3); // 35.658634 139.745466 14.000000 0.000113
}
to run:
$ rustc simple_geo3x3.rs; ./simple_geo3x3
import Geo3x3
main :: IO ()
main = do
let code = Geo3x3.encode 35.65858 139.745433 14
putStrLn code
let res = Geo3x3.decode "E3793653391822"
print res
to run:
$ runghc simple_geo3x3.hs
WScript.Echo Geo3x3_encode(35.65858, 139.745433, 14)
WScript.Echo Geo3x3_decode("E3793653391822")
to run:
$ oscript Geo3x3.obs
Geo3x3.scala, simple_geo3x3.scala
def main(args: Array[String]): Unit = {
val code = encode(35.65858, 139.745433, 14)
println(code)
val (lat, lng, level, unit) = decode("E3793653391822")
println(s"${lat} ${lng} ${level} ${unit}")
}
to run:
$ scala Geo3x3.scala
source("Geo3x3.R")
code <- Geo3x3_encode(35.65858, 139.745433, 14)
print(code)
pos <- Geo3x3_decode("E3793653391822")
print(pos)
to run:
$ r --no-save < simple_geo3x3.R
function myFunction() {
Logger.log(Geo3x3.encode(35.65858, 139.745433, 14));
Logger.log(Geo3x3.decode("E3793653391822"));
}
import geo3x3
echo geo3x3.encode(35.65858, 139.745433, 14)
echo geo3x3.decode("E3793653391822")
to run:
$ nim r simple_geo3x3.nim
Code.require_file("geo3x3.ex")
Geo3x3.encode(35.65858, 139.745433, 14) |> IO.inspect()
Geo3x3.decode("E3793653391822") |> IO.inspect()
to run:
$ elixir simple_geo3x3.exs
local geo3x3 = require("geo3x3")
print(geo3x3.encode(35.65858, 139.745433, 14))
pos = geo3x3.decode("E3793653391822")
print(pos[1], pos[2], pos[3], pos[4])
to run:
$ lua simple_geo3x3.lua
#!/usr/bin/perl
use lib qw(./);
use geo3x3;
my $code = geo3x3::encode(35.65858, 139.745433, 14);
print $code . "\n";
my ($lat, $lng, $level, $unit) = geo3x3::decode("E3793653391822");
print $lat . " " . $lng . " " . $level . " " . $unit . "\n";
to run:
$ perl simple_geo3x3.pl
Geo3x3.groovy, simple_geo3x3.groovy
final code = Geo3x3.encode(35.65858, 139.745433, 14)
println code
final res = Geo3x3.decode("E3793653391822")
println(res[0] + " " + res[1] + " " + res[2] + " " + res[3])
to run:
$ groovy simple_geo3x3.groovy
import std.stdio;
import Geo3x3;
void main() {
// get Geo3x3 code from latitude / longitude / level
char[14] code;
if (Geo3x3.encode(35.65858, 139.745433, 14, code)) {
writeln(code);
}
// get location from Geo3x3 code
auto pos = Geo3x3.decode("E3793653391822");
writeln(pos);
}
setup:
$ brew install dmd
to run:
$ dmd simple_geo3x3.d Geo3x3.d
$ ./simple_geo3x3
include("Geo3x3.jl")
code = Geo3x3.encode(35.65858, 139.745433, 14)
println(code)
pos = Geo3x3.decode("E3793653391822")
println(pos)
setup:
$ brew install julia
to run:
$ julia simple_geo3x3.jl
#lang racket
(require "geo3x3.rkt")
(encode 35.65858 139.745433 14)
(decode "E3793653391822")
;"E3793653391822"
;'(35.658633790016204 139.7454656302393 14 0.00011290058538953525)
setup:
$ brew install racket
to run:
$ racket simple_geo3x3.rkt
open String;;
let code = Geo3x3.encode 35.65858 139.745433 14;;
print_endline code;;
let (lat, lng, level, unit) = Geo3x3.decode "E3793653391822";;
print_endline (String.concat " " [string_of_float lat; string_of_float lng; string_of_int level; string_of_float unit]);;
setup:
$ brew install ocaml
to run:
$ ocamlopt -c geo3x3.ml; ocamlopt -c simple_geo3x3.ml; ocamlopt -o a.out geo3x3.cmx simple_geo3x3.cmx; ./a.out
-module(simple_geo3x3).
-export([main/0]).
main() ->
io:format("~s~n", [geo3x3:encode(35.65858, 139.745433, 14)]),
{Lat, Lng, Level, Unit} = geo3x3:decode("E3793653391822"),
io:format("~w ~w ~w ~w~n", [Lat, Lng, Level, Unit]).
setup:
$ brew install erlang
to run:
$ erlc simple_geo3x3.erl geo3x3.erl; erl -noshell -noinput -s simple_geo3x3 main -s init stop
(ns simple_geo3x3
(:require [geo3x3])
)
(defn -main []
(println (geo3x3/encode 35.65858 139.745433 14))
(println (geo3x3/decode "E3793653391822"))
)
setup:
$ brew install leiningen
to run:
$ lein run
module simple_geo3x3
open Geo3x3
let code = Geo3x3.encode 35.65858 139.745433 14
printfn "%s" code
let (lat, lng, level, unit) = Geo3x3.decode "E3793653391822"
printfn "%f %f %d %f" lat lng level unit
to run:
$ dotnet fsi Geo3x3.fs simple_geo3x3.fs
class Simple_geo3x3 {
static public function main(): Void {
final code = Geo3x3.encode(35.65858, 139.745433, 14);
Sys.println(code);
final pos = Geo3x3.decode("E3793653391822");
Sys.println(pos);
}
}
setup:
$ brew install haxe
to run:
$ haxe -main Simple_geo3x3.hx --interp
#!r6rs
(import (rnrs)
(geo3x3))
(write (encode 35.65858 139.745433 14))
(newline)
(let-values ((result (decode "E3793653391822")))
(write result))
(newline)
setup:
$ brew install chezscheme
to run:
$ chez --program simple_geo3x3.scm
geo3x3.lisp, simple_geo3x3.lisp
(load "geo3x3.lisp")
(defun main ()
(progn
(print (geo3x3::encode 35.65858 139.745433 14))
(print (geo3x3::decode "E3793653391822"))
)
)
setup:
$ brew install roswell
to run:
$ ros simple_geo3x3.lisp
module Main exposing (main)
import Geo3x3 exposing (decode, encode)
import Html exposing (Html, div, text)
main : Html msg
main =
div []
[
div [] [ text (encode 35.65858 139.745433 14) ],
div [] [ text (
let
pos = decode "E3793653391822"
in
(String.fromFloat pos.lat ++ " " ++ String.fromFloat pos.lng ++ " " ++ String.fromInt pos.level)
)]
]
setup:
$ brew install elm
to run:
$ cd elm
$ elm make src/Main.elm
$ open index.html
Geo3x3.hack, simple_geo3x3.hack
<<__EntryPoint>>
function main(): void {
require('Geo3x3.hack');
$code = Geo3x3::encode(35.65858, 139.745433, 14);
echo $code . "\n";
$pos = Geo3x3::decode('E3793653391822');
echo $pos[0] . " " . $pos[1] . " " . $pos[2] . " " . $pos[3] . "\n";
}
setup:
$ brew tap hhvm/hhvm
$ brew install hhvm
to run:
$ hhvm simple_geo3x3.hack
ver 1.04 2021.2.22 fixed WGS84
ver 1.03 2021.2.20 support int encoded, license CC BY -> CC0 (Public Domain)
ver 1.02 2013.2.18 write in Java, lincense CC BY-ND -> CC BY
ver 1.01 2012.1.15 change coding
ver 1.00 2012.1.15 first release
Taisuke Fukuno
https://twitter.com/taisukef
https://fukuno.jig.jp/139
https://fukuno.jig.jp/205
https://fukuno.jig.jp/3131