Skip to content

Instantly share code, notes, and snippets.

@kentatogashi
Created June 6, 2016 04:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kentatogashi/dcfac7362b847aba9b11998e33e9e3b3 to your computer and use it in GitHub Desktop.
Save kentatogashi/dcfac7362b847aba9b11998e33e9e3b3 to your computer and use it in GitHub Desktop.
IPアドレスから、緯度、経度を取得するスクリプト
#!/usr/bin/env ruby
require 'rubygems'
require 'geoip'
require 'optparse'
require 'pp'
GEOIP_REGION_TO_JAPAN_PREFECTURE = {
JP01: 23, JP02: 5, JP03: 2, JP04: 12, JP05: 38, JP06: 18,
JP07: 40, JP08: 7, JP09: 21, JP10: 10, JP11: 34, JP12: 1,
JP13: 28, JP14: 8, JP15: 17, JP16: 3, JP17: 37, JP18: 46,
JP19: 14, JP20: 39, JP21: 43, JP22: 26, JP23: 24, JP24: 4,
JP25: 45, JP26: 20, JP27: 42, JP28: 29, JP29: 15, JP30: 44,
JP31: 33, JP32: 27, JP33: 41, JP34: 11, JP35: 25, JP36: 32,
JP37: 22, JP38: 9, JP39: 36, JP40: 13, JP41: 31, JP42: 16,
JP43: 30, JP44: 6, JP45: 35, JP46: 19, JP47: 47,
}
PREFECTURES = {
1 => '北海道', 2 => '青森県', 3 => '岩手県', 4 => '宮城県', 5 => '秋田県', 6 => '山形県',
7 => '福島県', 8 => '茨城県', 9 => '栃木県', 10 => '群馬県', 11 => '埼玉県', 12 => '千葉県',
13 => '東京都', 14 => '神奈川県', 15 => '新潟県', 16 => '富山県', 17 => '石川県', 18 => '福井県',
19 => '山梨県', 20 => '長野県', 21 => '岐阜県', 22 => '静岡県', 23 => '愛知県', 24 => '三重県',
25 => '滋賀県', 26 => '京都府', 27 => '大阪府', 28 => '兵庫県', 29 => '奈良県', 30 => '和歌山県',
31 => '鳥取県', 32 => '島根県', 33 => '岡山県', 34 => '広島県', 35 => '山口県', 36 => '徳島県',
37 => '香川県', 38 => '愛媛県', 39 => '高知県', 40 => '福岡県', 41 => '佐賀県', 42 => '長崎県',
43 => '熊本県', 44 => '大分県', 45 => '宮崎県', 46 => '鹿児島県', 47 => '沖縄県',
}
PREFECTURES_LON_LAT = {
1 => [[141,20,49],[43,3,51]],
2 => [[140,44,24],[40,49,28]],
3 => [[141,9,9],[39,42,13]],
4 => [[140,52,19],[38,16,8]],
5 => [[140,6,9],[39,43,7]],
6 => [[140,21,48],[38,14,26]],
7 => [[140,28,4],[37,45,0]],
8 => [[140,26,48],[36,20,29]],
9 => [[139,53,1],[36,33,57]],
10 => [[139,03,39],[36,23,28]],
11 => [[139,38,56],[35,51,25]],
12 => [[140,7,24],[35,36,17]],
13 => [[139,41,30],[35,41,22]],
14 => [[139,38,33],[35,26,52]],
15 => [[139,1,25],[37,54,8]],
16 => [[137,12,41],[36,41,43]],
17 => [[136,37,32],[36,35,40]],
18 => [[136,13,19],[36,3,55]],
19 => [[138,34,6],[35,39,50]],
20 => [[138,10,52],[36,39,5]],
21 => [[136,43,20],[35,23,28]],
22 => [[138,22,59],[34,58,37]],
23 => [[136,54,24],[35,10,49]],
24 => [[136,30,31],[34,43,49]],
25 => [[135,52,6],[35,0,16]],
26 => [[135,45,20],[35,1,17]],
27 => [[135,31,12],[34,41,11]],
28 => [[135,10,59],[34,41,29]],
29 => [[135,49,58],[34,41,7]],
30 => [[135,10,3],[34,13,34]],
31 => [[134,14,18],[35,30,13]],
32 => [[133,3,2],[35,28,20]],
33 => [[133,56,6],[34,39,42]],
34 => [[132,27,34],[34,23,47]],
35 => [[131,28,17],[34,11,9]],
36 => [[134,33,34],[34,3,57]],
37 => [[134,2,36],[34,20,25]],
38 => [[132,45,58],[33,50,30]],
39 => [[133,31,52],[33,33,35]],
40 => [[130,25,5],[33,36,23]],
41 => [[130,17,56],[33,14,58]],
42 => [[129,52,25],[32,44,41]],
43 => [[130,44,30],[32,47,23]],
44 => [[131,36,45],[33,14,17]],
45 => [[131,25,26],[31,54,40]],
46 => [[130,33,29],[31,33,37]],
47 => [[127,40,52],[26,12,45]]
}
def sexsig_to_decim arr
a = arr[0].to_f + (arr[1].to_f / 60) + (arr[2].to_f / 3600)
a.round(3)
end
options = {
dat_path: './GeoLiteCity.dat'
}
OptionParser.new do |opt|
opt.on('-f'){|v| options[:dat_path] = v }
end
unless File.exists? options[:dat_path]
raise ArgumentError, "No such file: #{options[:dat_path]}"
end
ip_or_hostname = ARGV.shift
geoip = GeoIP.new(options[:dat_path]).city(ip_or_hostname)
key = geoip.country_code2 + geoip.region_name
if prefecture_code = GEOIP_REGION_TO_JAPAN_PREFECTURE[key.to_sym]
lon = sexsig_to_decim(PREFECTURES_LON_LAT[prefecture_code][0])
lat = sexsig_to_decim(PREFECTURES_LON_LAT[prefecture_code][1])
puts "#{ip_or_hostname} -> #{prefecture_code}:#{PREFECTURES[prefecture_code]} (#{lon}, #{lat})"
else
puts "#{ip_or_hostname} -> UNKNOWN"
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment