ตัวเข้ารหัสและถอดรหัส Geohash
ออกแบบเพื่อความเป็นส่วนตัว — ทำงานในเบราว์เซอร์ของคุณทั้งหมด
ในโหมด encode ป้อนละติจูดและลองจิจูด (พร้อมตัวเลื่อนความละเอียด) เพื่อรับสตริง geohash ส่วนในโหมด decode ให้วาง hash เพื่อดูพิกัดศูนย์กลางและขอบทิศตะวันตกเฉียงใต้/ตะวันออกเฉียงเหนือของเซลล์ เหมาะกับการสร้างดัชนีเชิงพื้นที่ การค้นหาเพื่อนบ้านใกล้เคียง และการเก็บข้อมูลตำแหน่งแบบนิรนาม
Geohash เข้ารหัสอะไรกันแน่
Geohash นำบิตของลองจิจูดและละติจูดมาสลับสับเปลี่ยน แล้วเข้ารหัสด้วย base32 ที่ใช้ชุดอักษรของตนเอง (0-9 และ b-z ยกเว้น a/i/l/o) อักษรแต่ละตัวมีค่า 5 บิต โดยสลับกันระหว่างปรับลองจิจูดและละติจูด ผลลัพธ์เป็นสตริงสั้น ๆ ที่ปลอดภัยกับ URL และความสัมพันธ์ของคำนำหน้าตรงกับการบรรจุเชิงพื้นที่: geohash ทุกตัวที่ขึ้นต้นด้วย "dr5ru" จะอยู่ในเซลล์ชื่อ dr5ru เสมอ
ความละเอียดและขนาดเซลล์
ที่ความละเอียด 1 โลกถูกแบ่งเป็น 32 เซลล์ใหญ่ราว 5,000 กม. กว้าง ความละเอียด 5 (ใกล้เส้นศูนย์สูตรราว 4.9 กม.) เหมาะกับการจัดกลุ่มระดับย่าน ความละเอียด 9 (ราว 5 ม.) เหมาะกับอาคาร ความละเอียด 12 (ราว 4 ซม.) มักจำเป็นเฉพาะงานสำรวจ และเซลล์จะลดขนาดลงเมื่อเข้าใกล้ขั้วโลก
ทำไมต้องใช้ geohash
คำนำหน้าของสตริงทำดัชนีได้ดีใน PostgreSQL, Redis, DynamoDB และ SQLite หากต้องการหาจุดในรัศมี 5 กม. รอบเป้าหมาย ให้คำนวณ geohash ของเป้าหมายที่ความละเอียด 5 แล้วค้นหาด้วยคำนำหน้า ซึ่งถูกกว่าคิวรีระยะทางตามวงกลมใหญ่ ปัญหาขอบเซลล์มีจริง ดังนั้นในระบบจริงจะคิวรีเซลล์เป้าหมายและเซลล์ข้างเคียงทั้ง 8 ด้วย Geohash เก่ากว่าและเรียบง่ายกว่า S2/H3 และยังเป็นทางเลือกที่เบาที่สุดในงานค้นเพื่อนบ้านบนเส้นทางวิกฤต
คำถามที่พบบ่อย
- ทำไมความละเอียด 5 จึงครอบคลุมทั้งเมือง?
- อักษรแต่ละตัวคือ 5 บิต ความละเอียด 5 จึงเท่ากับ 25 บิตและให้เซลล์ราว 4.9 กม. × 4.9 กม. ใกล้เส้นศูนย์สูตร เมืองขนาดไม่กี่กิโลเมตรอยู่ในเซลล์เดียวกัน นั่นคือเหตุผลที่แอปเรียกรถและส่งอาหารหลายเจ้านำคนขับและออเดอร์มาจัดกลุ่มตาม geohash ความละเอียด 5 เพื่อจับคู่อย่างรวดเร็ว
- จุดสองจุดใกล้กันแต่ได้ geohash ต่างกัน เป็นบั๊กหรือไม่?
- ไม่ใช่บั๊ก แต่เป็นคุณสมบัติของกริด จุดที่อยู่คนละฝั่งของขอบเซลล์อาจไม่มีคำนำหน้าร่วม แม้จะห่างกันเพียง 1 ม. ระบบจริงจึงคิวรีค่า hash เป้าหมายร่วมกับเซลล์ข้างเคียงทั้ง 8 (วงล้อม 3×3) เสมอ
- Geohash ใช้ชุดอักษรอะไร?
- 0-9 และ b-z รวม 32 ตัว ยกเว้น a, i, l, o (อักษรที่สับสนกับ 0/1 ได้ง่าย) นี่คือ base32 ที่ใช้ชุดอักษรเฉพาะตัว ไม่ใช่ base32 ของ RFC 4648
- Geohash ต่างจาก S2 หรือ H3 อย่างไร?
- Geohash เรียบง่ายและเก่ากว่าทั้งสอง ส่วน S2 (ลูกบาศก์ที่ฉายลงบนทรงกลม) และ H3 (ตารางหกเหลี่ยม) จัดการการบิดเบือนที่ขั้วโลกได้ดีกว่าแต่ต้องเขียนโค้ดเยอะกว่า งานค้นเพื่อนบ้านระดับแอปทั่วไปใช้ geohash ก็พอ แต่สำหรับงานนำทาง/หาเส้นทางระดับโลก S2/H3 จะคุ้มกว่า
- สามารถสร้างดัชนี geohash บน PostgreSQL ได้อย่างปลอดภัยไหม?
- ได้ เก็บ hash เป็นคอลัมน์ text พร้อมดัชนี btree แล้วค้นด้วยคำนำหน้า (LIKE 'dr5ru%') จะเร็วมาก หากต้องการคิวรีเชิงพื้นที่ที่ซับซ้อนกว่านี้ใช้ PostGIS เสริมได้ แต่ในส่วนมากการจับคู่คำนำหน้าก็เพียงพอ
- Toova เก็บพิกัดที่ฉันเข้ารหัสไหม?
- ไม่ การเข้ารหัสและถอดรหัสทั้งหมดทำงานใน JavaScript ของหน้านี้ ดังนั้นพิกัดและ hash ที่ได้จะไม่ถูกส่งไปยังเซิร์ฟเวอร์ของ Toova เลย