我有一个CSV格式的城市列表,我需要经度和纬度。
这是我的CSV
GeoSearchString,Title
"New York", "Manhatten"
"Infinite Loop 1, San Francisco", "Apple Headquarter"
现在我正在寻找一种简单的方法来获取JSON格式的那些地方的坐标
答案 0 :(得分:2)
我想出了以下脚本(gist)
#!/usr/bin/env ruby
# encoding: utf-8
require 'geocoder'
require 'csv'
require 'json'
require 'yaml'
abort 'Usage ruby Geocoder.rb cities.csv' unless ARGV[0]
def main(file)
puts "Loading file #{file}"
csv = CSV.parse(File.read(file), :headers => true)
results = []
CSV.foreach(File.read(file), :headers => true) do |row|
# Hacky way to skip the current search string if no result is found
search = row['GeoSearchString'] rescue continue
# The title is optional
title = row['Title'] rescue ''
geo = Geocoder.search(search).first
if geo
results << {search: search, title: title, lon: geo.longitude, lat: geo.latitude}
end
end
puts JSON.pretty_generate(results)
end
main ARGV[0]
答案 1 :(得分:2)
unless ARGV[0]
puts 'Usage ruby Geocoder.rb cities.csv' unless ARGV[0]
exit
end
可以改写为:
abort 'Usage ruby Geocoder.rb cities.csv' unless ARGV[0]
我会替换:
CSV.foreach(File.read(file), :headers => true) do |row|
results = []
csv.each do |row|
使用:
results = []
CSV.foreach(File.read(file), :headers => true) do |row|
非常小心:
search = row['GeoSearchString'] rescue continue
title = row['Title'] rescue ''
单个直列式rescue
是一个装满的,非常大的口径枪,指向你的脚。你有两个。在这种特殊情况下,它可能是安全的,没有意外的副作用,但一般来说,你想要非常小心地去那里。
答案 2 :(得分:1)
如果您想拥有自己的城市,州和其他有趣区域的数据库(让我们称之为地方),您可以免费从美国地质调查局website获取。它被称为他们的Topical Gazetteer并且拥有大量的&#34;地点&#34;以及地理编码。您可以获得80MB的完整国家文件或8MB的填充位置。此外,您只能下载您感兴趣的州。
这些地方包括:
人口稠密的地方 - 人类居住的名称特征 - 城市,城镇,村庄等。上面的国家档案子集。
历史特征 - 景观中不再存在或不再用于原始目的的特征。上面国家档案的子集。
简洁功能 - 应在地图上标注的大型功能,比例为1:250,000。上面国家档案的子集。(最后更新于2009年10月2日)
所有名称 - 所有名称,包括官方和非官方(变体),适用于全国所有功能。
功能描述/历史记录 - 包括以下附加功能属性:描述和历史记录。此文件不是标准的主题地名词典文件。如果您需要这些附加功能属性,则需要使用功能ID列将数据与我们其他文件中的数据相关联,例如美国,地区,联合相关区域下的数据。国&#34;部分。
南极洲特征 - 南极洲的特征被美国政府批准使用。
政府单位 - 各州的官方短名称,字母和数字代码
这不是邮政编码,而是实际的城镇。来自USPS的数据将具有基于邮政编码的质心的纬度/经度坐标(或者当平均时代表城市的邮政编码组)。因为它是基于ZIP的,所以lat / lon将与来自USGS的数据不同。他们对邮政编码不感兴趣。另请注意,每当USPS需要修改其递送路线时,邮政编码每月都会更改。实际的城市位置确实没有变化。 (忽略名义上的构造运动)。因此,确定的中心点lat / lon可能最好来自USGS数据,而不是基于USPS ZIP的加权质心。