Skip to content

Instantly share code, notes, and snippets.

@masuidrive
Created October 18, 2009 12:25
Show Gist options
  • Save masuidrive/212655 to your computer and use it in GitHub Desktop.
Save masuidrive/212655 to your computer and use it in GitHub Desktop.
# リファクタリング前
def encode(latitude, longitude, precision=12)
lat = [-90.0, 90.0]
lng = [-180.0, 180.0]
is_even = true
bit = ch = 0
geohash = ""
while geohash.length < precision do
point = is_even ? lng : lat
mid = (point[0] + point[1]) / 2
if (is_even ? longitude : latitude) > mid
ch |= BITS[bit]
point[0] = mid
else
point[1] = mid
end
is_even = !is_even
if bit < 4
bit += 1
else
geohash << BASE32[ch,1]
ch = bit = 0
end
end
geohash
end
# リファクタリング後
def encode(latitude, longitude, precision=12)
latlng = [latitude, longitude]
points = [[-90.0, 90.0], [-180.0, 180.0]]
is_lng = 1
(0...precision).map {
ch = 0
5.times do |bit|
mid = (points[is_lng][0] + points[is_lng][1]) / 2
points[is_lng][latlng[is_lng] > mid ? 0 : 1] = mid
ch |= BITS[bit] if latlng[is_lng] > mid
is_lng ^= 1
end
BASE32[ch,1]
}.join
end
# 共通
BITS = [16, 8, 4, 2, 1]
BASE32 = "0123456789bcdefghjkmnpqrstuvwxyz"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment