Fonctions de geohashing
La bibliothèque spatio-temporelle inclut des fonctions de géohachage qui permettent d'effectuer des recherches de proximité (encoder la latitude et la longitude et grouper les points aux alentours) dans l'analyse des données de localisation.
Encodage d'un geohash
- Encoder un objet Point avec un emplacement géographique dans une chaîne de lettres ou de chiffres en Base32 :
>>> p = stc.point(37, -74) >>> stc.geohash.string_hash_encode(p) 'dqe6kpdue5btnubpm9npcd0000' >>> stc.geohash.string_hash_encode(p, precision=5) 'dqe6k'
- Encoder un objet Point avec un emplacement géographique dans un BitVector :
>>> p = stc.point(37, -74) >>> bv = stc.geohash.number_hash_encode(p) >>> bv BitVector(01100101100110100110100101010101100110100110100101010101100110100110100101010101100110100110100101010101101100000000000000000000) >>> bv.truncate(10) >>> bv BitVector(0110010110)
- Encoder une paire de coordonnées géographiques (latitude et longitude) directement dans un geohash :
>>> stc.geohash.encode(37, -74, precision=5, mode='base32') 'dqe6k' >>> stc.geohash.encode(37, -74, precision=10, mode='bit') '0110010110'
Décodage d'un geohash
- Décoder un géohash (chaîne de chiffres et de lettres en base 32) en un objet Point contenant la latitude et la longitude au format décimal :
>>> stc.geohash.string_hash_decode('dqeh4') Point(37.265625, -74.443359375)
- Décoder une chaîne de caractères encodée en base 32 en un objet Point :
>>> p = stc.point(37, -74) >>> bv = geohash.number_hash_encode(p) >>> geohash.number_hash_decode(bv) Point(37.0, -74.0)
- Décoder une chaîne en base 32 ou binaire en une paire de coordonnées latitude et longitude :
>>> stc.geohash.decode('dqe6k', mode='base32') (36.9580078125, -74.00390625) >>> stc.geohash.decode('0110010110', mode='bit') (33.75, -78.75)
Voisinage geohash
La fonction de voisinage geohash retourne les codes geohash de points voisins d'un code spécifiés.
Voisins geohash d'un point
-
Obtenir les codes geohash voisins du point dont la latitude et la longitude sont fournies, dans la précision (nombre de bits) demandée :
>>> stc.geohash.get_all_neighbors(70, -40, 25) [BitVector(0111110000001111100101010), BitVector(0111110000001111100101011), BitVector(0111110000001111100101110), BitVector(0111110000001111110000000), BitVector(0111110000001111110000001), BitVector(0111110000001111110000100), BitVector(0111110000001111110000010), BitVector(0111110000001111110000011), BitVector(0111110000001111110000110)]
-
Obtenir les codes geohash voisins du point dont la latitude et la longitude sont fournies, dans la précision (nombre de bits) demandée et en limitant les résultats aux points situés dans les limites de la distance indiquée :
>>>geohash.get_all_neighbors(70, -40, 25, distance_precision=1000) [BitVector(0111110000001111110000001), BitVector(0111110000001111110000100), BitVector(0111110000001111110000011), BitVector(0111110000001111110000110)]
Fonctions de voisinage geohash
expand
: Retourne le code du centre indiqué et celui de ses voisins. Les 9 codes geohash d'un emplacement sont retournés :>>> stc.geohash.expand('ezs42') ['ezefp', 'ezs40', 'ezs41', 'ezefr', 'ezs42', 'ezs43', 'ezefx', 'ezs48', 'ezs49']
neighbors
: Retourne les 8 codes geohash voisins en excluant le geohash du centre lui-même :>>> stc.geohash.neighbors('ezs42') ['ezefp', 'ezs40', 'ezs41', 'ezefr', 'ezs43', 'ezefx', 'ezs48', 'ezs49']
get_east
,get_west
,get_north
,get_south
: Retourne le geohash est, ouest, nord ou sud d'un geohash spécifié :>>> stc.geohash.get_east('ezs42') 'ezs43'
- Encoder un geohash dans un
BitVector
:>>> bv = geohash.number_hash_encode(p) >>> bv.truncate(25) >>> stc.geohash.expand(bv) [BitVector(0110010110011010011000101), BitVector(0110010110011010011010000), BitVector(0110010110011010011010001), BitVector(0110010110011010011000111), BitVector(0110010110011010011010010), BitVector(0110010110011010011010011), BitVector(0110010110011010011001101), BitVector(0110010110011010011011000), BitVector(0110010110011010011011001)] >>> stc.geohash.neighbors(bv) [BitVector(0110010110011010011000101), BitVector(0110010110011010011010000), BitVector(0110010110011010011010001), BitVector(0110010110011010011000111), BitVector(0110010110011010011010011), BitVector(0110010110011010011001101), BitVector(0110010110011010011011000), BitVector(0110010110011010011011001)] >>> stc.geohash.get_north(bv) BitVector(0110010110011010011011000)
Couverture geohash
Pour calculer un ensemble de codes geohash couvrant entièrement la boîte de délimitation :
-
Préparez un exemple de polygone :
test_wkt = 'POLYGON((-73.76223024988917 41.04173285255264,-73.7749331917837 41.04121496082817,-73.78197130823878 41.02748934524744,-73.76476225519923 41.023733725449326,-73.75218805933741 41.031633228865495,-73.7558787789419 41.03752486433286,-73.76223024988917 41.04173285255264))' poly = wkt_reader.read(test_wkt)
-
Calculer la couverture geohash, à une précision (nombre de bits) déterminée, pour une géométrie donnée :
cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36)
Figure 1. Couverture de geohash à une profondeur de bit fixe pour une géométrie donnée -
Calculer la couverture geohash entourée d'une zone tampon, à une précision (nombre de bits) déterminée, pour une géométrie donnée :
buffered_cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36, distance=50)
Figure 2. Couverture geohash en mémoire tampon à une profondeur de bit fixe pour une géométrie donnée -
Calculer une couverture geohash compacte en calculant d'abord la couverture à précision déterminée, puis en la compressant :
raw_cover = stc.geohash.geohash_cover_at_bit_depth(poly, 36) compact_cover = stc.geohash.geohash_compression(raw_cover)
Figure 3. Couverture geohash compacte à une profondeur de bit fixe pour une géométrie donnée