Análisis y aplicación GEO del algoritmo geográfico de Redis

antecedentes

  1. Obtener información de los alrededores; ¿personas cercanas? Empresa cercana? Restaurante cercano? ¿Starbucks cerca?
  2. ¿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? ^ _ ^

 

 

Supongo que te gusta

Origin blog.csdn.net/qq_31150503/article/details/107380100
Recomendado
Clasificación