Geohash.net เป็นไลบรารี C# ที่มีน้ำหนักเบาและมีประสิทธิภาพสูงสำหรับการเข้ารหัสและถอดรหัสสตริงและ Geohashes จำนวนเต็ม
สิ่งที่ต้องทำ
นี่คือตัวอย่างอย่างรวดเร็วของวิธีการใช้ไลบรารี 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 เป็นระบบ GEOCODING ที่ช่วยให้คุณเป็นตัวแทนที่ตั้งทางภูมิศาสตร์โดยใช้สตริงสั้น ๆ ตัวอักษรและตัวเลขหรือจำนวนเต็ม มันได้รับการพัฒนาโดย Gustavo Niemeyer ในปี 2008 และได้กลายเป็นวิธีที่ได้รับความนิยมในการเข้ารหัสและจัดทำดัชนีข้อมูลเชิงพื้นที่
แนวคิดที่อยู่เบื้องหลัง Geohashing คือการใช้พิกัดละติจูดและลองจิจูดและแปลงเป็นรูปแบบที่กะทัดรัดมากขึ้น นี่คือความสำเร็จโดยการแบ่งพื้นผิวโลกซ้ำ ๆ ลงในเซลล์รูปสี่เหลี่ยมผืนผ้าซึ่งได้รับการกำหนดตัวระบุที่ไม่ซ้ำกัน ความยาวของ geohash กำหนดระดับความแม่นยำโดยมี geohashes ที่ยาวขึ้นเป็นตัวแทนของพื้นที่ขนาดเล็ก
เซลล์ Geohash มีคุณสมบัติที่โดดเด่นไม่กี่:
ตัวอย่างเช่นในการสร้างสตริง geohash สำหรับตำแหน่งที่มีละติจูด 37.7749 และลองจิจูด -122.4194 ในระดับความแม่นยำ 12 เราสามารถติดตามสามขั้นตอนเหล่านี้:
ปริมาณละติจูดและลองจิจูดกับจำนวนเต็ม 32 บิตโดยการแมปกับช่วงเวลาของหน่วย [0, 1] และคูณด้วย 2^32 ( exp2(32) )::
ละติจูดใช้ช่วง [-90, 90] ดังนั้นการแสดงจำนวนเต็ม 32 บิตของละติจูดคือ
lat32 = floor ( exp2 ( 32 ) * ( latitude + 90 ) / 180 ) ซึ่งในกรณีของเราเท่ากับ 3048827870 ( 0b10110101101110010110101111011110 )
ในทำนองเดียวกันสำหรับลองจิจูด [-180, 180]:
lng32 = floor ( exp2 ( 32 ) * ( longitude + 180 ) / 360 ) ซึ่งในกรณีของเราเท่ากับ 686963316 ( 0b101000111100100011101001110100 )
ละติจูดและลองจิจูดเชิงปริมาณ 32 บิตนั้นมี การผสมบิต เพื่อสร้างค่า 64 บิต ( จำนวนเต็ม geohash )
แผนภาพด้านล่างแสดงให้เห็นถึงการดำเนินการ

หมายเหตุ: ละติจูดและลองจิจูดครอบครองและบิตแปลก ๆ ตามลำดับ
ในตัวอย่างการทำงานของเราจำนวนเต็ม geohash คือ: 5589511709871930228 ( 0b0100110110010001111011110100100100011110110011010111101101110100
หมายเลขนี้ควรดำเนินการที่ความแม่นยำต่ำกว่า ความแม่นยำของจำนวนเต็ม geohash ประกอบด้วยบิต สูง n ดังนั้นเราต้องตัดทอนบิตส่วนเกิน เราสามารถทำได้โดย BITS Shift Operation:
hash = interleaved >> ( sizeof ( ulong ) * BITS_PER_BYTE - log2 ( 32 ) * precision ) // 64 - 5 * precision ซึ่งคือ 349344481866995639 ( 0b010011011001000111101111010010010001111011001101011110110111
หมายเหตุ: ขั้นตอนนี้ในที่สุดให้ คุณสมบัติคำนำหน้า วิกฤตของ Geohash: Geohash ของจุดที่ความแม่นยำต่ำกว่าเป็นคำนำหน้าของ geohash ที่ความแม่นยำสูงกว่า ดังนั้นการค้นหาความใกล้ชิดสามารถลดลงเป็นคำนำหน้า geohash ที่ตรงกัน (เป็นผ่านครั้งแรก)
Geohash สตริงนั้นได้มาจากการเข้ารหัส Geohash Base32 นี่คือมาตรฐานยกเว้นตัวเลือกตัวอักษร ตัวละคร GeoHash แต่ละตัวแสดงค่าไบนารี 5 บิต ( log2(32) ) และสตริง geohash ทั้งหมดประกอบด้วยค่า 5 บิตที่ต่อกันหลายตัว
0123456789bcdefghjkmnpqrstuvwxyz
การเข้ารหัสเริ่มต้นที่บิตสูงใช้ 5 บิตของจำนวนเต็ม geohash สำหรับแต่ละตัวละครของความแม่นยำ เป็นผลให้ความแม่นยำสูงสุดคือ 12 อักขระหรือ 60 บิต
แบ่งค่าไบนารีออกเป็นกลุ่ม 5 บิตและแปลงแต่ละกลุ่มเป็นอักขระฐาน -32 ที่สอดคล้องกัน:
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
เชื่อมต่ออักขระฐาน -32 ทั้งหมดเข้าด้วยกันเพื่อสร้างสตริง geohash สุดท้าย: 9q8yyk8ytpxr
สำหรับกรณีการใช้งานภายในจำนวนเต็ม geohash มักจะ เพียงพอ ขั้นตอน Base32 รวมอยู่ที่นี่เพื่อความสมบูรณ์
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
| วิธี | ป้อนข้อมูล | หมายถึง | ข้อผิดพลาด | stddev | ขนาดรหัส | Gen0 | จัดสรร |
|---|---|---|---|---|---|---|---|
| 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 |

| วิธี | ละติจูด | ลองจิจูด | ความแม่นยำ | หมายถึง | ข้อผิดพลาด | stddev | ขนาดรหัส | Gen0 | จัดสรร |
|---|---|---|---|---|---|---|---|---|---|
| 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 |

ฉันสนับสนุนให้มีส่วนร่วมใน geohash.net! หากคุณเจอข้อผิดพลาดหรือมีข้อเสนอแนะสำหรับคุณสมบัติใหม่อย่าลังเลที่จะเปิดปัญหาหรือส่งคำขอดึงบน GitHub ฉันค้นหาวิธีปรับปรุงห้องสมุดอย่างต่อเนื่องและให้คุณค่ากับชุมชนมากขึ้น
Geohash.net ขึ้นอยู่กับการวิจัยและผลการวิจัยของ Michael McLoughlin งานของเขาเกี่ยวกับ Geohashing และการดำเนินการตามอัลกอริทึม Geohashing ที่มีประสิทธิภาพสูงใน GO สามารถพบได้ในบทความนี้ Geohash ใน Assembly Golang