Geohash.net adalah perpustakaan C# berkinerja tinggi dan berkinerja tinggi untuk penyandian dan decoding string dan integer geohash.
Todo
Berikut adalah contoh singkat tentang cara menggunakan perpustakaan 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 adalah sistem geocoding yang memungkinkan Anda mewakili lokasi geografis menggunakan string atau integer alfanumerik pendek. Ini dikembangkan oleh Gustavo Niemeyer pada tahun 2008 dan sejak itu menjadi metode populer untuk pengkodean dan pengindeksan data spasial.
Konsep di balik geohashing adalah untuk mengambil koordinat lintang dan bujur dan mengubahnya menjadi bentuk yang lebih ringkas. Ini dicapai dengan secara rekursif membagi permukaan bumi menjadi sel persegi panjang, yang kemudian diberi pengidentifikasi yang unik. Panjang geohash menentukan tingkat presisi, dengan geohash yang lebih panjang mewakili area yang lebih kecil.
Sel Geohash memiliki beberapa sifat penting:
Misalnya, untuk menghasilkan string geohash untuk lokasi dengan lintang 37.7749 dan bujur -122.4194 pada tingkat presisi 12, kita dapat mengikuti tiga tahap ini:
Kuantisasi lintang dan bujur ke bilangan bulat 32-bit dengan memetakan ke interval unit [0, 1] dan mengalikan dengan 2^32 ( exp2(32) ):
Latitude mengambil rentang [-90, 90], oleh karena itu representasi integer lintang 32-bit adalah
lat32 = floor ( exp2 ( 32 ) * ( latitude + 90 ) / 180 ) Yang dalam kasus kami sama dengan 3048827870 ( 0b10110101101110010110101111011110 )
Demikian juga untuk bujur [-180, 180]:
lng32 = floor ( exp2 ( 32 ) * ( longitude + 180 ) / 360 ) Yang dalam kasus kami sama dengan 686963316 ( 0b101000111100100011101001110100 )
Latitude dan bujur kuantisasi 32-bit diwakili oleh bit untuk menghasilkan nilai 64-bit ( integer geohash ).
Diagram di bawah ini menggambarkan operasi.

Catatan: Lintang dan bujur masing -masing menempati bit yang aneh dan aneh .
Dalam contoh berjalan kami, integer geohash adalah: 5589511709871930228 ( 0b0100110110010001111011110100100100011110110011010111101101110100 )
Jumlah ini harus diambil pada presisi yang lebih rendah. Ketepatan integer Geohash terdiri dari n bit tinggi , jadi kita perlu memotong kelebihan bit. Kita bisa melakukannya dengan operasi bit shift:
hash = interleaved >> ( sizeof ( ulong ) * BITS_PER_BYTE - log2 ( 32 ) * precision ) // 64 - 5 * precision Yaitu 349344818666995639 ( 0b010011011001000111101111010010010001111011001101011110110111 ) untuk contoh kami.
Catatan: Langkah ini pada akhirnya menyediakan properti awalan kritis Geohash: geohash suatu titik pada presisi yang lebih rendah adalah awalan geohash pada presisi yang lebih tinggi. Oleh karena itu pencarian kedekatan dapat dikurangi menjadi awalan geohash yang cocok (sebagai umpan pertama).
String GeoHash diperoleh dari integer geohash oleh encoding base32. Ini adalah standar kecuali untuk pilihan alfabet. Setiap karakter geohash mewakili nilai biner 5-bit ( log2(32) ), dan seluruh string GeoHash terdiri dari beberapa nilai 5-bit yang digabungkan.
0123456789bcdefghjkmnpqrstuvwxyz
Pengkodean dimulai pada bit tinggi, mengonsumsi 5 bit integer geohash untuk setiap karakter presisi. Akibatnya presisi maksimum adalah 12 karakter atau 60 bit .
Bagilah nilai biner menjadi kelompok 5 bit dan konversi setiap kelompok menjadi karakter basis-32 yang sesuai:
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
Kumpulkan semua karakter basis-32 bersama-sama untuk membentuk string geohash terakhir: 9q8yyk8ytpxr
Untuk kasus penggunaan internal integer geohash biasanya cukup . Langkah Base32 disertakan di sini untuk kelengkapan.
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
| Metode | Masukan | Berarti | Kesalahan | Stddev | Ukuran kode | Gen0 | Dialokasikan |
|---|---|---|---|---|---|---|---|
| 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 |

| Metode | lintang | garis bujur | presisi | Berarti | Kesalahan | Stddev | Ukuran kode | Gen0 | Dialokasikan |
|---|---|---|---|---|---|---|---|---|---|
| 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 |

Saya mendorong kontribusi ke geohash.net! Jika Anda menemukan bug atau memiliki saran untuk fitur baru, jangan ragu untuk membuka masalah atau mengirimkan permintaan tarik di GitHub. Saya terus mencari cara untuk meningkatkan perpustakaan dan memberikan nilai lebih kepada masyarakat.
Geohash.net didasarkan pada penelitian dan temuan Michael McLoughlin. Karyanya tentang Geohashing dan implementasi algoritma geohashing berkinerja tinggi di Go dapat ditemukan dalam artikel ini Geohash di Majelis Golang.