Geohash: Difference between revisions

704 bytes added ,  4 years ago
add decoder
m (→‎{{header|Phix}}: added precision 22 test)
(add decoder)
Line 137:
<lang julia>const ch32 = "0123456789bcdefghjkmnpqrstuvwxyz"
const bool2ch = Dict(string(i-1, base=2, pad=5) => ch for (i, ch) in enumerate(ch32))
const ch2bool = Dict(v => k for (k, v) in bool2ch)
 
function bisect(val, mn, mx, bits)
Line 167 ⟶ 168:
geo = [bool2ch[b[i*5+1:i*5+5]] for i in 0:pre-1]
return prod(geo)
end
 
function decoder(geo)
minmaxes, latlong = [[-90.0, 90.0], [-180.0, 180.0]], 2
for s in [ch for ch in geo], bit in ch2bool[s]
minmaxes[latlong][bit == '1' ? 1 : 2] = sum(minmaxes[latlong]) / 2
latlong = 3 - latlong
end
return minmaxes
end
 
Line 173 ⟶ 183:
([57.64911, 10.40744] , 11),
([57.64911, 10.40744] , 22)]
println("encoder(lat=$lat,encoded lng=$lng, pre=$pre) = ", encoder(lat, lng, pre))
println("encoder(lat=$lat, lng=$lng, pre=$pre) = ", encoded)
println("decoded = ", decoder(encoded))
end
</lang>{{out}}
<pre>
encoder(lat=51.433718, lng=-0.214126, pre=2) = gc
decoded = [[50.625, 56.25], [-11.25, 0.0]]
encoder(lat=51.433718, lng=-0.214126, pre=9) = gcpue5hp4
decoded = [[51.43369674682617, 51.43373966217041], [-0.21414756774902344, -0.21410465240478516]]
encoder(lat=57.64911, lng=10.40744, pre=11) = u4pruydqqvj
decoded = [[57.649109959602356, 57.64911130070686], [10.407439023256302, 10.40744036436081]]
encoder(lat=57.64911, lng=10.40744, pre=22) = u4pruydqqvj8pr9yc27rjr
decoded = [[57.64911, 57.64911000000001], [10.407439999999998, 10.407440000000008]]
</pre>
 
 
=={{header|Phix}}==
4,111

edits