Geohash.net ist eine leichte, leistungsstarke C# -Bibliothek für die Codierung und Dekodierung von String und Ganzzahlgeohashes.
Todo
Hier ist ein kurzes Beispiel für die Verwendung der Geohash.net -Bibliothek:
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 ist ein Geokodierungssystem, mit dem Sie einen geografischen Ort mit einer kurzen, alphanumerischen Saite oder Ganzzahl darstellen können. Es wurde 2008 von Gustavo Niemeyer entwickelt und wurde seitdem zu einer beliebten Methode zur Codierung und Indexierung räumlicher Daten.
Das Konzept hinter Geohashing besteht darin, Breiten- und Längengradkoordinaten zu nehmen und sie in eine kompaktere Form umzuwandeln. Dies wird erreicht, indem die Erdoberfläche rekursiv in rechteckige Zellen unterteilt wird, denen dann eine eindeutige Kennung zugeordnet wird. Die Länge des Geohash bestimmt das Präzisionsniveau, wobei längere Geohächen kleinere Bereiche darstellen.
Geohash -Zellen haben einige bemerkenswerte Eigenschaften:
Um beispielsweise eine Geohash -Zeichenfolge für den Ort mit Breitengrad 37.7749 und Längengrad -122.4194 auf einer Präzision von 12 zu generieren, können wir diese drei Stufen folgen:
Quantisieren Sie Breitengrad und Längengrad bis 32-Bit-Ganzzahlen durch Mapping auf das Einheitsintervall [0, 1] und multiplizieren Sie sie mit 2^32 ( exp2(32) ):
Latitude nimmt den Bereich [-90, 90], daher ist die 32-Bit-Ganzzahldarstellung des Breitengrads
lat32 = floor ( exp2 ( 32 ) * ( latitude + 90 ) / 180 ) In unserem Fall entspricht 3048827870 ( 0b10110101101110010110101111011110 )
Ebenso für Längengrad [-180, 180]:
lng32 = floor ( exp2 ( 32 ) * ( longitude + 180 ) / 360 ) Dies entspricht 686963316 ( 0b101000111100100011101001110100 )
Der 32-Bit-quantisierte Breitengrad und der Längengrad sind bitverzinslich, um einen 64-Bit-Wert zu erzeugen (die Ganzzahlgeohash ).
Das folgende Diagramm zeigt die Operation.

HINWEIS: Breitengrad und Längengrad belegen gleichzeitig und seltsame Bits .
In unserem laufenden Beispiel ist der Ganzzahl Geohash: 5589511709871930228 ( 0b0100110110010001111011110100100100011110110011010111101101110100 )
Diese Zahl sollte bei niedrigerer Präzision eingenommen werden. Die Präzision von Ganzzahl Geohash besteht aus den n hohen Teilen, daher müssen wir überschüssige Teile abschneiden. Wir können dies durch Bits Shift Operation tun:
hash = interleaved >> ( sizeof ( ulong ) * BITS_PER_BYTE - log2 ( 32 ) * precision ) // 64 - 5 * precision Das ist 349344481866995639 ( 0b010011011001000111101111010010010001111011001101011110110111 ) für unser Beispiel.
Hinweis: Dieser Schritt bietet letztendlich Geohashs kritische Präfix -Eigenschaft : Die Geohash eines Punktes an einer niedrigeren Präzision ist ein Präfix des Geohash bei einer höheren Präzision. Daher können die Proximity -Suche auf die passenden Geohash -Präfixe reduziert werden (als erster Pass).
Der String Geohash wird aus der Ganzzahl Geohash durch Base32 -Codierung erhalten. Dies ist Standard, mit Ausnahme der Auswahl des Alphabets. Jedes Geohash-Zeichen repräsentiert einen Binärwert von 5-Bit ( log2(32) ), und die gesamte Geohash-Zeichenfolge besteht aus mehreren verketteten 5-Bit-Werten.
0123456789bcdefghjkmnpqrstuvwxyz
Die Codierung beginnt an den hohen Teilen und verbraucht 5 Bit der Ganzzahl für jeden Charakter der Präzision. Infolgedessen beträgt die maximale Präzision 12 Zeichen oder 60 Bit .
Teilen Sie den binären Wert in Gruppen von 5 Bits und konvertieren Sie jede Gruppe in den entsprechenden Basis-32-Zeichen:
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
Verkettieren Sie alle Basis-32-Zeichen zusammen, um die endgültige Geohash-Zeichenfolge zu bilden: 9q8yyk8ytpxr
Für interne Anwendungsfälle reicht ganzzahlige Geohash normalerweise aus. Der Base32 -Schritt wurde hier zur Vollständigkeit enthalten.
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
| Verfahren | Eingang | Bedeuten | Fehler | Stddev | Codegröße | Gen0 | Zugewiesen |
|---|---|---|---|---|---|---|---|
| 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 | 9zefgnuj7dw | 14.265 ns | 0,2997 ns | 0,2803 ns | 1.717 b | - - | - - |
| Netcoregeohash | 9zefgnuj7dw | 455.781 ns | 3.3098 ns | 2.9341 ns | 18 b | 0,0038 | 32 b |
| Ngeohashlib | 9zefgnuj7dw | 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 |

| Verfahren | Breite | Länge | Präzision | Bedeuten | Fehler | Stddev | Codegröße | Gen0 | Zugewiesen |
|---|---|---|---|---|---|---|---|---|---|
| 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 |

Ich ermutige Beiträge zu Geohash.net! Wenn Sie auf einen Fehler stoßen oder einen Vorschlag für eine neue Funktion haben, zögern Sie nicht, ein Problem zu eröffnen oder eine Pull -Anfrage auf GitHub einzureichen. Ich suche ständig nach Wegen, um die Bibliothek zu verbessern und der Community mehr Wert zu bieten.
Geohash.net basiert auf den Forschungen und Ergebnissen von Michael McLoughlin. Seine Arbeiten zum Geohashing und die Umsetzung eines Hochleistungs-Geohashing-Algorithmus in Go finden Sie in diesem Artikel Geohash in der Golang-Versammlung.