非常常见的场景,存储用户所在的省市区信息。
大家都用哪个?怎样去分析和对比这些实现方法?
解决方案:
暂时使用@saberma 写的china_city
等有时间,准备把国家统计局给的省市区数据导入 postgres 数据库自己实现。 数据地址:国家统计局公布的最新县及县以上行政区划代码(截止 2014 年 10 月 31 日)
有一个官方数据源,但最新更新到 13 年底 还有一个可参考,qq ip 页面,纯 J's 的,已经有人拔下来了,自己拔也不难。第三方 gem 没用过。 还可以拔比如微信,人人的省市区数据,应该比官方还靠谱点。 不在电脑旁,链接回去再补,你可以搜索下,关键词都给了。 P'S 我用的官方数据,存数据库,有错再改。
我一般是直接创建一个 addresses 表,然后 user has_one address.
rails_admin_china_city_field 是 rails_admin 的一个插件而已,没有改进
建一个 address 表,province,city,region 用 level 区分,parentId 建立关联,数据结构统一 id, pid, level, name
自己项目中用到这两个不知道能帮到你么
https://github.com/pobing/mvgeo #自己解析省市 json 数据,遵循 iso3166 标准 https://github.com/pobing/sina_geoip #调用 sina 的接口,通过 IP 获取省市信息
数据去统计局网站抓,省市区 基本不会怎么变 记录也不多 12 年我抓过精确到村/居委会一级的 http://nongmin365.com/ 在用,近 80 万条数据
#7 楼 @317583395 #6 楼 @huobazi #5 楼 @pobing #4 楼 @kai1248 #1 楼 @flowerwrong 取数据的时候,是用自己数据库查询快,还是像@saberma 写的china_city用 json 大表查询快?
#9 楼 @huobazi 有道理! 但我不知道怎样算合适自己啊! 从偷懒角度看,最想用@saberma 写的china_city。 从思路上,肯定是觉得存进 sql,然后我的字段用的是 province_id, city_id 最好,因为我要根据城市筛选只属于这个城市的数据,诸如此类,需要关联关系,而不是像电商那样把地址填上,展示就行。
数据来源:中华人民共和国行政区域规划(国家统计局发布)最新的发布时间为 2014-01-17 15:04
结构存储:
362 市,2850 区,这不是很复杂,自己动手,扩展性和维护性由自己决定...
#1 楼 @flowerwrong #2 楼 @ywjno #6 楼 @huobazi #7 楼 @317583395 #12 楼 @chq
这是国家统计局公布的最新县及县以上行政区划代码(截止 2014 年 10 月 31 日) 可是怎么把它批量导入 postgres 啊?
看到这个使用 chinacity 从国家统计局官网取最新城市数据,还是不会……
而且,按道理来说,难道不是应该存成关联关系么?比如我以后要一级筛选省,再根据省筛选出市。 是不是应该三个表,provinces, cities, districts, 然后 cities 里有一个字段是 province_id,districts 表里有一个字段 city_id……
class CreateChinaCities < ActiveRecord::Migration
def change
create_table :china_cities do |t|
t.integer :area_code
t.string :area
t.integer :parent_code
t.integer :level
t.timestamps null: false
end
end
end
def w_f(f, tmp_arr, code, tail, level)
f.puts tmp_arr[0] + ' ' + tmp_arr[1] + ' ' + code + tail + ' ' + level
end
f = File.new('./china_city_han.txt', 'w')
File.open('./china_city.txt', 'r') do |file|
while line = file.gets
if line[0] != "\n" && line[0] != "\r"
tmp_arr = line.split(' ')
# f.puts tmp_arr[0] + ' ' + tmp_arr[1] 3515
1100.upto(8300).each do |k|
# han_city(tmp_arr, k.to_s[0], k.to_s[1], k.to_s[2..3], f)
a = k.to_s[0]
b = k.to_s[1]
c = k.to_s[2..3]
code = a + b
if tmp_arr[0].start_with?(code + '0000')
f.puts tmp_arr[0] + ' ' + tmp_arr[1] + ' 0' + ' 1'
break
elsif tmp_arr[0].start_with?(code + c) && tmp_arr[0].start_with?(code + c + '00')
w_f(f, tmp_arr, code, '0000', '2')
break
elsif tmp_arr[0].start_with?(code + c)
w_f(f, tmp_arr, code, c + '00', '3')
break
end
end
end
end
end
f.close
# ChinaCity import to seeds.rb
File.open(Rails.root.to_s + '/scripts/china_city_han.txt', 'r') do |file|
while line = file.gets
if line[0] != "\n" && line[0] != "\r"
tmp_arr = line.split(' ')
if tmp_arr.length == 4
cc = ChinaCity.new(
area_code: tmp_arr[0].to_i,
area: tmp_arr[1],
parent_code: tmp_arr[2].to_i,
level: tmp_arr[3].to_i
)
cc.save!
end
end
end
end