- Guillermo Estrada -
Staff Software Engineer @ Brightcove, Inc
Photo by Andrew Stutesman on Unsplash
Photo by Ashim D’Silva on Unsplash
CTO @ Canonical
Parte del equipo de Canonical desde septiembre del 2005. Colaborador de proyectos como Landscape, Juju y Snap.
Es el algoritmo de una función hash que consume coordenadas geográficas (latitud, longitud), y produce hashes (cadenas de caracteres) de precisión variable que corresponden a esa ubicación.
El algoritmo funciona subdividiendo el "mapa" y codificando la región resultante en una versión modificada de base32 (dígitos del 0 al 9 y el alfabeto en minúsculas, excluyendo [a,i,l,o]). Los geohashes representan regiones de un mapa, y la precisión juega un papel importante en la búsqueda por proximidad.
Coordenadas: (20.644275, -103.415962)
Comenzamos con las coordenadas que queremos codificar. (20.644275, -103.415962)
Mapa cortesía de: https://simplemaps.com/resources/svg-worldPartimos el mapa en 2 por su longitud y tomamos la región que corresponde. 0 si es menor y 1 si es mayor.
Ahora partimos la sección por su latitud y tomamos región la que corresponde. 0 si es menor y 1 si es mayor.
Repetimos el algoritmo con la siguiente sección por longitud. (bits pares [0, 2, 4, 6, 8, ... ])
Y una vez más por latitud. (bits impares [1, 3, 5, 7, 9, ... ])
Con una última vez por su longitud juntamos 5 bits.
Y codificamos esos 5 bits en base32.
9 | e | w | m | q | w | n |
01001 | 01101 | 11100 | 10011 | 10110 | 11100 | 10100 |
Aproximadamente: ( 20.644 , -103.4164 )
Cada 5 bits nos dan un símbolo extra en base32 y mayor precisión.Length | Cell width | Cell height |
---|---|---|
1 | ≤ 5,000km | 5,000km |
2 | ≤ 1,250km | 625km |
3 | ≤ 156km | 156km |
4 | ≤ 39.1km | 19.5km |
5 | ≤ 4.89km | 4.89km |
6 | ≤ 1.22km | 0.61km |
7 | ≤ 153m | 153m |
8 | ≤ 38.2m | 19.1m |
9 | ≤ 4.77m | 4.77m |
10 | ≤ 1.19m | 0.596m |
11 | ≤ 149mm | 149mm |
12 | ≤ 37.2mm | 18.6mm |
Brightcove | 9ewmyf0g1 |
La Tequila - Landmark | 9ewmycbck |
Estadio 3 de Marzo - UAG | 9ewmwxnwj |
Estadio Akron | 9ewmtthck |
La Minerva | 9ewmx7et7 |
Catedral de Guadalajara | 9ewt8k1h8 |
Aeropuerto Miguel Hidalgo | 9ewsc29cj |
Malecón de Chapala | 9ewe7v4j0 |
Photo by Matthew Hamilton on Unsplash
Photo by Nina Strehl on Unsplash
Búsqueda de vecinos (regiones adyacentes) por precisión variable.
9ewmt | 9ewmw | 9ewmx |
9ewmm | 9ewmq | 9ewmr |
9ewmj | 9ewmn | 9ewmp |
Eficiente búsqueda espacial por proximidad con bases de datos.
Photo by Samuel Zeller Unsplash
y servidor en Golang
Photo by Chris Ried on Unsplash
type Location struct {
lat, lon float64
}
type Region struct {
min, max Location
}
func (r Region) Center() Location {
return NewLocation(
(r.min.lat+r.max.lat)/2,
(r.min.lon+r.max.lon)/2
)
}
func Encode(latitude, longitude float64, precision int) string {
...
}
func Decode(geohash string) Region {
...
}
func Neighbours(geohash string) map[string]string {
...
}
func Validate(geohash string) bool {
...
}
Construiremos una REST JSON API para una key/value store basada en geohash.
GET /:geohash
POST /:geohash
GET /:geohash/region
GET /:geohash/neighbours
OPTIONS /:geohash*
-------------------------------
PUT /:geohash
DELETE /:geohash
Photo by Jade Masri on Unsplash
https://github.com/mmcloughlin/geohash
Photo by Camylla Battani on Unsplash
o... ¿a poco hay preguntas?