我有一个 CSV 格式的城市列表,我需要为其指定经度和纬度。
这是我的 CSV
GeoSearchString,Title
"New York", "Manhatten"
"Infinite Loop 1, San Francisco", "Apple Headquarter"
现在我正在寻找一种简单的方法来以 JSON 格式获取这些地方的坐标
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
是一种上膛的、非常大的口径,枪指着你的脚。你有两个。在这种特殊情况下,它可能是安全的,没有意外的副作用,但一般来说你想非常小心地去那里。
我想出了以下脚本(要点)
#!/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]
如果您想要自己的城市、州和其他有趣区域(我们称它们为地点)的数据库,您可以从美国地质调查局网站免费获得。它被称为他们的主题地名词典,并且有大量的“地点”以及地理编码。您可以获得 80MB 的完整国家文件或仅 8MB 的人口稠密的地方。此外,您可以只下载您感兴趣的状态。
这些地方包括:
人口稠密的地方 - 具有人类居住地的命名特征 - 城市、城镇、村庄等。上述国家文件的子集。
历史特征——景观中不再存在或不再服务于原始目的的特征。上述国家文件的子集。
简明特征 - 应在比例为 1:250,000 的地图上标记的大型特征。上述国家文件的子集。(最后更新于 2009 年 10 月 2 日)
所有名称 - 国家所有特征的所有名称,包括官方和非官方(变体)。
功能描述/历史 – 包括以下附加功能属性:描述和历史。此文件不是标准的主题地名词典文件。如果您需要这些额外的要素属性,则需要使用要素 id 列将数据与我们其他文件之一中的数据相关联,例如“美国的州、领地、相关地区”部分下的数据.
南极洲特征——美国政府批准使用的南极洲特征。
政府单位——州的官方简称、字母和数字代码
这不是邮政编码,而是实际的城镇。来自 USPS 的数据将具有基于邮政编码(或一组邮政编码,在平均时代表一个城市)的质心的纬度/经度坐标。因为它是基于 ZIP 的,所以纬度/经度将不同于来自 USGS 的数据。他们对邮政编码不感兴趣。还要记住,每当 USPS 需要修改其递送路线时,邮政编码每月都会更改。实际的城市位置真的没有改变。(忽略名义上的构造运动)。因此,确定的中心点纬度/经度最好来自 USGS 数据,而不是基于 USPS ZIP 的加权质心。