2013-05-17 39 views
0

我有一個CSV格式的城市列表,我需要經度和緯度。輕鬆獲得城市列表的LON LAT

這是我的CSV

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

現在我正在尋找一種簡單的方式來獲得JSON格式的那些地方座標

+0

貝西的答案釘住了曼哈頓的地理編碼,但蘋果總部的第二個結果有一個小問題:蘋果實際上不在舊金山;它在Cupertino(公平地說,與SF有些接近)。在地理編碼之前驗證地址可能有助於避免由於輸入數據問題而導致的錯誤。我工作的SmartyStreets鏈接是地址驗證的一個提供者。 – Michelle

回答

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] 
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是一個裝,非常大的口徑,克不要指向你的腳。你有兩個。在這種特殊情況下,它可能是安全的,沒有意外的副作用,但總的來說,你要非常小心地去那裏。

+0

非常感謝您的意見。我在回答中包含了您的修改以及要點。無可否認,我在分析數據時很樂觀。不過,我只想要可以在我的JSON中解析的結果,並且標題是可選的,所以對於我來說,如果它們是空白的,它不是問題。我確實喜歡「'rescue'-gun」,儘管如此:-) – Besi

1

如果你想要自己的城市,州和其他有趣地區的數據庫(讓我們稱之爲地方),你可以免費獲得美國地質調查局website。它被稱爲它們的地名詞典,並且有大量的「地點」以及地理編碼。你可以得到一個完整的國家文件,這是80MB或只是8MB的人口稠密的地方。與人類居住城市,城鎮,村莊等國家以上文件的子集命名的功能 -

居民點:另外,您也可以下載只是狀態你有興趣

這些地方包括。

歷史功能 - 景觀中不再存在的功能或不再用於原始目的的功能。上面的國家檔案的子集。

簡明特徵 - 應在地圖上用1:250,000比例標註的大特徵。上述國家文件的子集(最後更新日期2009年10月2日)

所有名稱 - 所有的名字,官方和非官方(變體),在全國所有功能。

功能說明/歷史記錄 - 包含以下附加功能屬性:說明和歷史記錄。這個文件不是標準的專題地名詞典文件。如果您需要這些附加功能屬性,則需要使用功能標識列將數據與其他文件中的數據相關聯,例如「美國的州,地區,相關區域」部分中的數據。

南極洲特徵 - 南極洲的特徵被美國政府批准使用。

政府單位 - 官方短名稱,字母和國家

的數字代碼這不會是ZIP代碼,但實際的城鎮。來自USPS的數據將具有基於郵政編碼(或平均代表城市的一組郵政編碼)質心的緯度/經度座標。因爲它是以ZIP爲基礎的,所以緯度/經度將與來自USGS的數據不同。他們對郵政編碼不感興趣。同時請記住,每當USPS需要修改其遞送路線時,郵政編碼每月都會更改。實際的城市地點確實不會改變。 (忽略名義構造運動)。所以一個明確的中心點經緯度可能最好來自美國地調局的數據,而不是美國郵政基於ZIP的加權質心。

+0

謝謝Jeffrey,在我的情況下,這也必須在歐洲國家工作,但它肯定是一個好主意,有一些數據庫或緩存地礦工人限制每分鐘的請求數量等。 – Besi