rust_algorithms/
geohash.rs1pub fn spread(x: u32) -> u64 {
2 let mut ans = x as u64;
3 ans = (ans | (ans << 16)) & 0x0000ffff0000ffff;
4 ans = (ans | (ans << 8)) & 0x00ff00ff00ff00ff;
5 ans = (ans | (ans << 4)) & 0x0f0f0f0f0f0f0f0f;
6 ans = (ans | (ans << 2)) & 0x3333333333333333;
7 ans = (ans | (ans << 1)) & 0x5555555555555555;
8 ans
9}
10
11pub fn interleave(lat: u32, lng: u32) -> u64 {
12 spread(lat) | (spread(lng) << 1)
13}
14
15pub fn quantize(lat: f64, base: f64) -> u32 {
16 ((lat*base + 1.5).to_bits() >> 20) as u32
17}
18
19pub fn encode(lat: f64, lng: f64) -> u64 {
20 interleave(quantize(lat, 0.005555555555555556), quantize(lng, 0.002777777777777778))
21}