antecedentes
- Obtener información de los alrededores; ¿personas cercanas? Empresa cercana? Restaurante cercano? ¿Starbucks cerca?
- ¿Obtener la distancia entre dos posiciones de coordenadas?
lograr
Puede usar redis, mongo, mysql para realizar la recuperación y conversión de coordenadas. La versión aplicable de redis:> = 3.2.0
Algoritmo GEO
wiki: https://en.wikipedia.org/wiki/Geohash
Redis utiliza el algoritmo GeoHash general para el procesamiento, primero asuma que hay coordenadas de la estación de Shanghai ( 121.455708 , 31.249574 ), y luego de acuerdo con la dicotomía (marca izquierda 0; marca derecha 1)
- La latitud [-90,90], dividida en [-90,0), [0,90], se denomina intervalo izquierdo y derecho. Se puede determinar que 31.249574 pertenece al intervalo derecho [0,90] y se marca como 1;
- A continuación, divida el intervalo derecho [0,90] en [0,45), [45,90] intervalos izquierdo y derecho, puede determinar que 31.249574 pertenece al intervalo izquierdo [0,90] y marcarlo como 0;
- Por analogía, finalmente puede estar infinitamente cerca de la coordenada específica 31.249574 , y la longitud es la misma.
- Supongamos que el último: el pv de latitud es : 10101 10001, el pv de longitud es: 11010 11001 , la longitud de pv está relacionada con el número de divisiones del intervalo dado.
- Ponga números pares en longitud y números impares en latitud, reorganice y combine el resultado final: 11011 00110 11010 00011
- Los resultados reorganizados se convierten a números decimales: 27, 6, 2, 3, y luego usan las 32 letras 0-9, bz (eliminar a, i, l, o) para la codificación base32. El resultado es: v6u3 ( Nota: consulte el código de referencia a continuación)
- En Redis, la longitud y la latitud se codifican con números enteros de 52 bits y luego se almacenan en zset. El valor de zset es la clave del elemento y la puntuación es el valor entero de 52 bits de GeoHash. Aunque la puntuación de zset es un número de punto flotante, se puede almacenar sin pérdidas para valores enteros de 52 bits.
Cálculo de la división pv de longitud:
pv | min | medio | max |
1 | -90 | 0 | 90 |
0 | 0 | 45 | 90 |
1 | 0.000 | 22,5 | 45 |
0 | 22,5 | 33,75 | 45 |
1 | 22,5 | 28.125 | 33,75 |
1 | 28.125 | 30,9375 | 33,75 |
0 | 30,9375 | 32.34375 | 33,75 |
0 | 30,9375 | 31.640625 | 32.34375 |
0 | 30,9375 | 31.2890625 | 31.640625 |
1 | 30,9375 | 31.11328125 | 31.2890625 |
Cálculo de la división pv de latitud:
pv | min | medio | max |
1 | -180 | 0 | 180 |
1 | 0 | 90 | 180 |
0 | 90 | 135 | 180 |
1 | 90 | 112,5 | 135 |
0 | 112,5 | 123,75 | 135 |
1 | 112,5 | 118.125 | 123,75 |
1 | 118.125 | 120,9375 | 123,75 |
0 | 120,9375 | 122.34375 | 123,75 |
0 | 120,9375 | 121.640625 | 122.34375 |
1 | 120,9375 | 121.2890625 | 121.640625 |
Referencia de codificación Base32-bit :
Comandos de Redis Shell
Nota: Complejidad de tiempo: la complejidad de cada elemento agregado es O (log (N)), donde N es el número de elementos posicionales contenidos en la clave.
1. GEOADD ----- Agregar comando de coordenadas ( primero longitud, luego latitud )
GEOADD key longitude latitude member [longitude latitude member …]
p.ej:
192.168.0.102:4>geoadd coordinate 121.455708 31.249574 "上海站" 121.475164 31.228816 "上海人民广场"
"2"
192.168.0.102:4>geoadd coordinate 121.499717 31.239702 "东方明珠塔"
"1"
2. GEOPOS ----- consultar información de coordenadas
GEOPOS key member [member …]
p.ej:
192.168.0.102:4>geopos coordinate "东方明珠塔"
1) 1) "121.49971514940261841"
2) "31.23970195235578018"
192.168.0.102:4>geopos coordinate "东方明珠塔" "上海站"
1) 1) "121.49971514940261841"
2) "31.23970195235578018"
2) 1) "121.45570546388626099"
2) "31.24957469127141252"
3. GEODISTA ----- consulta la distancia entre posiciones dadas
Nota: El parámetro de la unidad especificada unit
debe ser una de las siguientes unidades, el valor predeterminado es m:
-
m
La unidad es el metro (predeterminado). -
km
La unidad son kilómetros. -
mi
La unidad son millas. -
ft
La unidad son pies.
GEODIST key member1 member2 [unit]
p.ej:
192.168.0.102:4>geodist coordinate "上海站" "东方明珠塔"
"4326.7279"
192.168.0.102:4>geodist coordinate "上海站" "东方明珠塔" km
"4.3267"
4. GEORADIUS ----- consulta de información circundante
Nota: Tomando la longitud y latitud dadas como centro, devuelva todos los elementos de ubicación cuya distancia al centro no exceda la distancia máxima dada entre los elementos de ubicación contenidos en la clave.
GEORADIUS key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
p.ej:
192.168.0.102:4>georadius coordinate 121.458175 31.242564 3 km WITHDIST asc count 5
1) 1) "上海站"
2) "0.8144"
2) 1) "上海人民广场"
2) "2.2245"
192.168.0.102:4>georadius coordinate 121.458175 31.242564 5 km WITHDIST asc count 5
1) 1) "上海站"
2) "0.8144"
2) 1) "上海人民广场"
2) "2.2245"
3) 1) "东方明珠塔"
2) "3.9632"
192.168.0.102:4>
5. GEORADIUS BYMEMBER ----- consulta de información circundante
Nota: Similar a GEORADIUS, solo las coordenadas se trasponen a elementos específicos
GEORADIUSBYMEMBER key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [ASC|DESC] [COUNT count]
p.ej:
192.168.0.102:4>georadiusbymember coordinate "上海站" 5 km WITHDIST asc count 5
1) 1) "上海站"
2) "0.0000"
2) 1) "上海人民广场"
2) "2.9589"
3) 1) "东方明珠塔"
2) "4.3267"
6. GEOHASH ----- valor hash de la consulta
Nota: generalmente solo se usa para desarrollo y depuración
GEOHASH key member [member …]
p.ej:
192.168.0.102:4>geohash coordinate "上海站"
1) "wtw3gbc3gn0"
¿No es fácil? ^ _ ^