0

我有一个 CSV 格式的城市列表,我需要为其指定经度和纬度。

这是我的 CSV

GeoSearchString,Title
"New York", "Manhatten"
"Infinite Loop 1, San Francisco", "Apple Headquarter"

现在我正在寻找一种简单的方法来以 JSON 格式获取这些地方的坐标

4

3 回答 3

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是一种上膛的、非常大的口径,枪指着你的脚。你有两个。在这种特殊情况下,它可能是安全的,没有意外的副作用,但一般来说你想非常小心地去那里。

于 2013-05-17T16:31:30.477 回答
2

我想出了以下脚本(要点

#!/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]
于 2013-05-17T13:48:59.143 回答
1

如果您想要自己的城市、州和其他有趣区域(我们称它们为地点)的数据库,您可以从美国地质调查局网站免费获得。它被称为他们的主题地名词典,并且有大量的“地点”以及地理编码。您可以获得 80MB 的完整国家文件或仅 8MB 的人口稠密的地方。此外,您可以只下载您感兴趣的状态。

这些地方包括:

人口稠密的地方 - 具有人类居住地的命名特征 - 城市、城镇、村庄等。上述国家文件的子集。

历史特征——景观中不再存在或不再服务于原始目的的特征。上述国家文件的子集。

简明特征 - 应在比例为 1:250,000 的地图上标记的大型特征。上述国家文件的子集。(最后更新于 2009 年 10 月 2 日)

所有名称 - 国家所有特征的所有名称,包括官方和非官方(变体)。

功能描述/历史 – 包括以下附加功能属性:描述和历史。此文件不是标准的主题地名词典文件。如果您需要这些额外的要素属性,则需要使用要素 id 列将数据与我们其他文件之一中的数据相关联,例如“美国的州、领地、相关地区”部分下的数据.

南极洲特征——美国政府批准使用的南极洲特征。

政府单位——州的官方简称、字母和数字代码

这不是邮政编码,而是实际的城镇。来自 USPS 的数据将具有基于邮政编码(或一组邮政编码,在平均时代表一个城市)的质心的纬度/经度坐标。因为它是基于 ZIP 的,所以纬度/经度将不同于来自 USGS 的数据。他们对邮政编码不感兴趣。还要记住,每当 USPS 需要修改其递送路线时,邮政编码每月都会更改。实际的城市位置真的没有改变。(忽略名义上的构造运动)。因此,确定的中心点纬度/经度最好来自 USGS 数据,而不是基于 USPS ZIP 的加权质心。

于 2013-05-17T17:30:14.743 回答