GeoHash.net est une bibliothèque C # légère et haute performance pour le codage et le décodage de cordes et de géohashes entiers.
FAIRE
Voici un exemple rapide de la façon d'utiliser la bibliothèque geohash.net:
using NetGeohash ;
// Encode latitude and longitude coordinates into a geohash string
string geohash = Geohash . Encode ( 37.421999 , - 122.084057 , 9 ) ;
// Decode the geohash string into latitude and longitude coordinates
( double latitude , double longitude ) = Geohash . Decode ( geohash ) ;
// Encode the geohash string into an integer format
ulong geohashInt = Geohash . EncodeToInt64 ( 37.421999 , - 122.084057 , 9 ) ;
// Decode the integer geohash into latitude and longitude coordinates
( latitude , longitude ) = Geohash . DecodeFromInt64 ( geohashInt ) ; GeoHash est un système de géocodage qui vous permet de représenter une emplacement géographique en utilisant une chaîne ou un entier alphanumérique court. Il a été développé par Gustavo Niemeyer en 2008 et est depuis devenu une méthode populaire pour l'encodage et l'indexation des données spatiales.
Le concept derrière Geohashing est de prendre des coordonnées de latitude et de longitude et de les convertir en une forme plus compacte. Ceci est réalisé en subdivisant récursivement la surface de la Terre en cellules rectangulaires, qui se voient ensuite attribuer un identifiant unique. La longueur du Geohash détermine le niveau de précision, avec des géohashs plus longs représentant des zones plus petites.
Les cellules GeoHash ont quelques propriétés notables:
Par exemple, pour générer une chaîne GeoHash pour l'emplacement avec la latitude 37.7749 et la longitude -122.4194 à un niveau de précision de 12, nous pouvons suivre ces trois étapes:
Quantiser la latitude et la longitude à des entiers 32 bits en mappant à l'intervalle unitaire [0, 1] et en multipliant par 2 ^ 32 ( exp2(32) ):
Latitude prend la gamme [-90, 90], donc la représentation entière de latitude 32 bits est
lat32 = floor ( exp2 ( 32 ) * ( latitude + 90 ) / 180 ) Qui, dans notre cas, équivaut au 3048827870 ( 0b10110101101110010110101111011110 )
De même pour la longitude [-180, 180]:
lng32 = floor ( exp2 ( 32 ) * ( longitude + 180 ) / 360 ) Qui, dans notre cas, équivaut à 686963316 ( 0b101000111100100011101001110100 )
La latitude et la longitude quantifiées 32 bits sont interlinées par bit pour produire une valeur 64 bits (le Geohash entier ).
Le diagramme ci-dessous illustre l'opération.

Remarque: la latitude et la longitude occupent respectivement des bits uniques et étranges .
Dans notre exemple en cours d'exécution, le GeoHash entier est: 5589511709871930228 ( 0b0100110110010001111011110100100100011110110011010111101101110100 )
Ce nombre doit être pris à une précision inférieure. La précision de Geohash entier se compose des N élevés , nous devons donc tronquer des bits en excès. Nous pouvons le faire par des opérations de décalage des bits:
hash = interleaved >> ( sizeof ( ulong ) * BITS_PER_BYTE - log2 ( 32 ) * precision ) // 64 - 5 * precision Qui est 349344481866995639 ( 0b010011011001000111101111010010010001111011001101011110110111 ) pour notre exemple.
Remarque: Cette étape fournit finalement la propriété de préfixe critique de Geohash: le geohash d'un point à une précision inférieure est un préfixe du Geohash à une précision plus élevée. Par conséquent, les recherches de proximité peuvent être réduites à la correspondance des préfixes GeoHash (comme première passe).
La corde Geohash est obtenue à partir de l'encodage GeoHash entier par base32. Ceci est standard à l'exception du choix de l'alphabet. Chaque caractère GeoHash représente une valeur binaire 5 bits ( log2(32) ), et la chaîne GeoHash entière est composée de plusieurs valeurs de 5 bits concaténées.
0123456789bcdefghjkmnpqrstuvwxyz
L'encodage commence aux bits élevés, consommant 5 bits de Geohash entier pour chaque caractère de précision. En conséquence, la précision maximale est de 12 caractères ou 60 bits .
Divisez la valeur binaire en groupes de 5 bits et convertissez chaque groupe en son caractère de base-32 correspondant:
01001 ( 9) - 9
10110 (22) - q
01000 ( 8) - 8
11110 (30) - y
11110 (30) - y
10010 (18) - k
01000 ( 8) - 8
11110 (30) - y
11001 (25) - t
10101 (21) - p
11101 (29) - x
10111 (23) - r
Concatéralement tous les caractères de base-32 pour former la chaîne GeoHash finale: 9q8yyk8ytpxr
Pour les cas d'utilisation interne, entier GeoHash est généralement suffisant . L'étape de base32 a été incluse ici pour l'exhaustivité.
BenchmarkDotNet =v0.13.5, OS =Windows 11 (10.0.22000.1696/21H2/SunValley)
AMD Ryzen 9 3900X, 1 CPU, 24 logical and 12 physical cores
.NET SDK =8.0.100-preview.1.23115.2
[Host] : .NET 8.0.0 (8.0.23.11008), X64 RyuJIT AVX2
Job-KKMPKU : .NET 8.0.0 (8.0.23.11008), X64 RyuJIT AVX2
Jit =RyuJit Platform =X64 Runtime =.NET 8.0
| Méthode | Saisir | Signifier | Erreur | Stddev | Taille du code | Gen0 | Alloué |
|---|---|---|---|---|---|---|---|
| Netgeohash | k | 8.112 ns | 0,1881 ns | 0,2090 ns | 1 717 b | - | - |
| Netcoregeohash | k | 145.271 ns | 0,8736 ns | 0,7295 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | k | 143.414 ns | 0,8529 ns | 0,7561 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | yd | 8.442 ns | 0,1032 ns | 0,0965 ns | 1 717 b | - | - |
| Netcoregeohash | yd | 166.305 ns | 0,8682 ns | 0,8121 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | yd | 169.663 ns | 1.0957 ns | 1.0249 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | 6N3 | 9.442 ns | 0,1746 ns | 0,1633 ns | 1 717 b | - | - |
| Netcoregeohash | 6N3 | 192.502 ns | 2.0566 ns | 1,9238 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | 6N3 | 202.150 ns | 1,9676 ns | 1,8405 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | zvgk | 10.183 ns | 0,1023 ns | 0,0907 ns | 1 717 b | - | - |
| Netcoregeohash | zvgk | 218.244 ns | 1.4455 ns | 1.3521 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | zvgk | 223,580 ns | 0,7643 ns | 0,6776 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | T05KH | 10.726 ns | 0,2016 ns | 0,1886 ns | 1 717 b | - | - |
| Netcoregeohash | T05KH | 310.208 ns | 0,9773 ns | 0,8663 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | T05KH | 263.364 ns | 2.2418 ns | 2.0970 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | b5cv2h | 11.413 ns | 0,0796 ns | 0,0706 ns | 1 717 b | - | - |
| Netcoregeohash | b5cv2h | 328.490 ns | 2.4518 ns | 2.1735 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | b5cv2h | 283.862 ns | 2.9657 ns | 2.7741 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | vveyj80 | 12.114 ns | 0,1749 ns | 0,1636 ns | 1 717 b | - | - |
| Netcoregeohash | vveyj80 | 358.143 ns | 0,9470 ns | 0,7908 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | vveyj80 | 318.725 ns | 1,7533 ns | 1,6400 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | F7Y53XJT | 12.676 ns | 0,2287 ns | 0,2140 ns | 1 717 b | - | - |
| Netcoregeohash | F7Y53XJT | 380.157 ns | 2.2520 ns | 2.1065 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | F7Y53XJT | 334.277 ns | 1.0733 ns | 1,0039 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | trm92jkbv | 12.990 ns | 0,1217 ns | 0,1139 ns | 1 717 b | - | - |
| Netcoregeohash | trm92jkbv | 404.136 ns | 1,9322 ns | 1.7128 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | trm92jkbv | 374.209 ns | 1.0807 ns | 1.0109 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | drmq3gx6zt | 13.861 ns | 0,1824 ns | 0,1706 ns | 1 717 b | - | - |
| Netcoregeohash | drmq3gx6zt | 429.735 ns | 1.6946 ns | 1.4151 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | drmq3gx6zt | 400,585 ns | 1.9080 ns | 1,7847 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | 9ZEFGUJ7DW | 14.265 ns | 0,2997 ns | 0,2803 ns | 1 717 b | - | - |
| Netcoregeohash | 9ZEFGUJ7DW | 455.781 ns | 3.3098 ns | 2.9341 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | 9ZEFGUJ7DW | 416.747 ns | 2.7821 ns | 2.6023 ns | 9 b | 0,0229 | 192 b |
| Netgeohash | K9M2H7T1N0C2 | 14.864 ns | 0,3210 ns | 0,3153 ns | 1 717 b | - | - |
| Netcoregeohash | K9M2H7T1N0C2 | 479.624 ns | 1,5628 ns | 1.3854 ns | 18 B | 0,0038 | 32 b |
| Ngeohashlib | K9M2H7T1N0C2 | 467.252 ns | 1.3795 ns | 1.2904 ns | 9 b | 0,0229 | 192 b |

| Méthode | latitude | longitude | précision | Signifier | Erreur | Stddev | Taille du code | Gen0 | Alloué |
|---|---|---|---|---|---|---|---|---|---|
| Netgeohash | -89.127865 | -179.438962 | 7 | 20,69 ns | 0,146 ns | 0,129 ns | 906 b | 0,0048 | 40 b |
| Netcoregeohash | -89.127865 | -179.438962 | 7 | 195.04 ns | 0,632 ns | 0,528 ns | 14 B | 0,0172 | 144 b |
| Ngeohashlib | -89.127865 | -179.438962 | 7 | 324,45 ns | 3.044 ns | 2,848 ns | 19 b | 0,0458 | 384 b |
| Netgeohash | -41.2858 | 174.7868 | 12 | 24.77 ns | 0,352 ns | 0,329 ns | 906 b | 0,0057 | 48 b |
| Netcoregeohash | -41.2858 | 174.7868 | 12 | 318.08 ns | 2.079 ns | 1,944 ns | 14 B | 0,0181 | 152 b |
| Ngeohashlib | -41.2858 | 174.7868 | 12 | 493,78 ns | 2.879 ns | 2,552 ns | 19 b | 0,0687 | 576 b |
| Netgeohash | -12.347856 | 34.890273 | 3 | 17,95 ns | 0,215 ns | 0,201 ns | 906 b | 0,0038 | 32 b |
| Netcoregeohash | -12.347856 | 34.890273 | 3 | 104.91 ns | 0,616 ns | 0,546 ns | 14 B | 0,0162 | 136 b |
| Ngeohashlib | -12.347856 | 34.890273 | 3 | 167,74 ns | 2,523 ns | 2.360 ns | 19 b | 0,0277 | 232 b |
| Netgeohash | 45.678912 | 92.45236 | 4 | 18,39 ns | 0,313 ns | 0,293 ns | 906 b | 0,0038 | 32 b |
| Netcoregeohash | 45.678912 | 92.45236 | 4 | 127.05 ns | 1.053 ns | 0,985 ns | 14 B | 0,0162 | 136 b |
| Ngeohashlib | 45.678912 | 92.45236 | 4 | 209.17 ns | 1,549 ns | 1.449 ns | 19 b | 0,0305 | 256 b |
| Netgeohash | 52.5174 | 13.409 | 12 | 24,64 ns | 0,299 ns | 0,280 ns | 906 b | 0,0057 | 48 b |
| Netcoregeohash | 52.5174 | 13.409 | 12 | 310.05 ns | 1,637 ns | 1,451 ns | 14 B | 0,0181 | 152 b |
| Ngeohashlib | 52.5174 | 13.409 | 12 | 498,72 ns | 5.374 ns | 5.027 ns | 19 b | 0,0687 | 576 b |
| Netgeohash | 80.294617 | 19.543821 | 5 | 18,82 ns | 0,228 ns | 0,191 ns | 906 b | 0,0038 | 32 b |
| Netcoregeohash | 80.294617 | 19.543821 | 5 | 152.24 ns | 0,561 ns | 0,498 ns | 14 B | 0,0162 | 136 b |
| Ngeohashlib | 80.294617 | 19.543821 | 5 | 242.98 ns | 2.265 ns | 2,008 ns | 19 b | 0,0391 | 328 b |

J'encourage les contributions à geohash.net! Si vous rencontrez un bogue ou avez une suggestion pour une nouvelle fonctionnalité, n'hésitez pas à ouvrir un problème ou à soumettre une demande de traction sur GitHub. Je cherche constamment des moyens d'améliorer la bibliothèque et de fournir plus de valeur à la communauté.
Geohash.net est basé sur la recherche et les résultats de Michael McLoughlin. Son travail sur le géohashing et la mise en œuvre d'un algorithme de géohashing haute performance dans GO peuvent être trouvés dans cet article Geohash dans l'assemblée de Golang.