Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Правда она считает, что я из бутово переехал в Александровский сад. Но ничего, нам такая точность не к чему.

require 'geoip'
require 'RMagick'
LAT, LON, WIDTH, HEIGHT, BORDER = 180, 360, 2000, 1200, 70
OFFSET_X = (WIDTH.to_f - BORDER.to_f) / LON.to_f
OFFSET_Y = (HEIGHT.to_f - BORDER.to_f) / LAT.to_f
c = Magick::Image.new(WIDTH, HEIGHT, Magick::GradientFill.new(0, 0, HEIGHT, 0, "#24302F", "#1A2423")) do |img|
#img.background_color = "#1A2423"
end
cache = {}
GeoIP.new(File.dirname(__FILE__) + '/GeoLiteCity.dat').each do |r|
x = (180.to_f + r.longitude.to_f) * OFFSET_X
y = (90.to_f - r.latitude.to_f) * OFFSET_Y
z = x.to_i * y.to_i
cache[z] ||= 0
gc = Magick::Draw.new
gc.fill(cache[z].to_i > 0 ? "#7D762B" : "#EBE3AF")
gc.point x, y
gc.draw c
cache[z] += 1
end
c.write File.dirname(__FILE__) + '/map.png'
GeoIP, попытки нетрадиционного использования