Geohash: Difference between revisions

1,655 bytes added ,  3 years ago
julia example
(julia example)
Line 131:
geohash for [51.433718, -0.214126], precision 9 = gcpue5hp4
geohash for [57.649110, 10.407440], precision 11 = u4pruydqqvj
</pre>
 
=={{header|Julia}}==
{{trans|Python}}
<lang julia>const ch32 = "0123456789bcdefghjkmnpqrstuvwxyz"
const bool2ch = Dict(string(i-1, base=2, pad=5) => ch for (i, ch) in enumerate(ch32))
 
function bisect(val, mn, mx, bits)
mid = (mn + mx) / 2
if val < mid
bits <<= 1 # push 0
mx = mid # range lower half
else
bits = (bits << 1) | 1 # push 1
mn = mid # range upper half
end
return mn, mx, bits
end
 
function encoder(lat, lng, pre)
latmin, latmax = -90, 90
lngmin, lngmax = -180, 180
bits = Int128(0)
for i in 0:5*pre-1
if i % 2 != 0
# odd bit: bisect latitude
latmin, latmax, bits = bisect(lat, latmin, latmax, bits)
else
# even bit: bisect longitude
lngmin, lngmax, bits = bisect(lng, lngmin, lngmax, bits)
end
end
# Bits to characters
b = string(bits, base=2, pad=5*pre)
geo = [bool2ch[b[i*5+1:i*5+5]] for i in 0:pre-1]
return prod(geo)
end
 
for ((lat, lng), pre) in [([51.433718, -0.214126], 2),
([51.433718, -0.214126], 9),
([57.64911, 10.40744] , 11),
([57.64911, 10.40744] , 22)]
println("encoder(lat=$lat, lng=$lng, pre=$pre) = ", encoder(lat, lng, pre))
end
</lang>{{out}}
<pre>
encoder(lat=51.433718, lng=-0.214126, pre=2) = gc
encoder(lat=51.433718, lng=-0.214126, pre=9) = gcpue5hp4
encoder(lat=57.64911, lng=10.40744, pre=11) = u4pruydqqvj
encoder(lat=57.64911, lng=10.40744, pre=22) = u4pruydqqvj8pr9yc27rjr
</pre>
 
4,103

edits