Skip to content

scrwnl/Geo3x3

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Geo3x3 ver 1.04

What is Geo3x3

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)  

Sample app

https://taisukef.github.io/Geo3x3/

Supported Languages

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

Sample code

level location Geo3x3
3 日本 E37
5 中部 E3792
6 福井県 E37924
8 福井県鯖江市 E3792198
10 鯖江市西山公園 E379219883
13 鯖江市西山公園のトイレ E379219883294

※範囲が狭くなるほどコードが長くなり、範囲が含まれるかどうか前方一致で分かります

Licence

These codes are licensed under CC0 (Public Domain)
ライセンスはCC0(パブリックドメイン)です
CC0

How to use (encode / decode)

in JavaScript (HTML)

Geo3x3.mjs, simple_geo3x3.html

<script type=module>
import { Geo3x3 } from "https://taisukef.github.io/Geo3x3/Geo3x3.mjs";
console.log(Geo3x3.decode("W28644"));
</script>

in JavaScript (Deno)

Geo3x3.mjs, simple_geo3x3.mjs

import { Geo3x3 } from "https://taisukef.github.io/Geo3x3/Geo3x3.mjs";
console.log(Geo3x3.decode("W28644"));

to run:

$ deno run -A simple_geo3x3.mjs

in JavaScript (Node.js)

Geo3x3.mjs, simple_geo3x3.mjs

import { Geo3x3 } from "./Geo3x3.mjs";
console.log(Geo3x3.decode("W28644"));

to run:

$ node simple_geo3x3.mjs

in TypeScript (Deno)

Geo3x3.ts, simple_geo3x3.ts

import { Geo3x3 } from "https://taisukef.github.io/Geo3x3/Geo3x3.ts";
console.log(Geo3x3.decode("W28644"));

to run:

$ deno run simple_geo3x3.ts

in Python

geo3x3.py, simple_geo3x3.py

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

in Ruby

geo3x3.rb, simple_geo3x3.rb

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

in Java

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

in C

geo3x3.h, simple_geo3x3.c

#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

in C++

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

in C#

Geo3x3.cs, simple_geo3x3.cs

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

in PHP

Geo3x3.php, simple_geo3x3.php

<?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

in Swift

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

in Go

Geo3x3.go, simple_geo3x3.go

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

in Kotlin

Geo3x3.kt, simple_geo3x3.kt

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

in Dart

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

in Rust

geo3x3.rs, simple_geo3x3.rs

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

in Haskell (GHC 8.4.x or later)

Geo3x3.hs, simple_geo3x3.hs

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

in OpenVBS

Geo3x3.obs,

WScript.Echo Geo3x3_encode(35.65858, 139.745433, 14)
WScript.Echo Geo3x3_decode("E3793653391822")

to run:

$ oscript Geo3x3.obs

in Scala

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

in R

Geo3x3.R, simple_geo3x3.R

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

in GAS (Google App Script)

Geo3x3.gs, simple_geo3x3.gs

function myFunction() {
  Logger.log(Geo3x3.encode(35.65858, 139.745433, 14));
  Logger.log(Geo3x3.decode("E3793653391822"));
}

in Nim

geo3x3.nim, simple_geo3x3.nim

import geo3x3

echo geo3x3.encode(35.65858, 139.745433, 14)
echo geo3x3.decode("E3793653391822")

to run:

$ nim r simple_geo3x3.nim

in Elixir

geo3x3.ex, simple_geo3x3.exs

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

in Lua

geo3x3.lua, simple_geo3x3.lua

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

in Perl

geo3x3.pm, simple_geo3x3.pl

#!/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

in Groovy

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

in D

Geo3x3.d, simple_geo3x3.d

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

in Julia

Geo3x3.jl, simple_geo3x3.jl

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

in Racket

geo3x3.rkt, simple_geo3x3.rkt

#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

in OCaml

geo3x3.ml, simple_geo3x3.ml

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

in Erlang

geo3x3.erl, simple_geo3x3.erl

-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

in Clojure

geo3x3.clj, simple_geo3x3.clj

(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

in F#

Geo3x3.fs, simple_geo3x3.fs

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

in Haxe

Geo3x3.hx, Simple_geo3x3.hx

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

in Scheme (R6RS)

geo3x3.sls, simple_geo3x3.scm

#!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

in Common Lisp

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

in Elm

Geo3x3.elm, Mail.elm

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

in Hack

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

History

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

Creator

Taisuke Fukuno
https://twitter.com/taisukef
https://fukuno.jig.jp/139
https://fukuno.jig.jp/205
https://fukuno.jig.jp/3131

About

a simple geo-coding system for WGS84

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • HTML 34.9%
  • JavaScript 6.8%
  • LLVM 2.4%
  • COBOL 2.4%
  • C 2.4%
  • Haskell 2.4%
  • Other 48.7%