<p>我希望您超出了nomingm服务(<a href="http://wiki.openstreetmap.org/wiki/Nominatim_usage_policy" rel="noreferrer">http://wiki.openstreetmap.org/wiki/Nominatim_usage_policy</a>)的使用策略。试着在请求和缓存之间放置1秒的睡眠结果,很可能是很多重复的。</p>
<p>睡眠部分:</p>
<pre><code>from time import sleep
### your code
row[14] = location.longitude
sleep(1) # after last line in if
</code></pre>
<p>缓存:</p>
<pre><code>coords = {}
if coords.has_key([row[8], row[12] ]):
row[13] , row[14] = coords[ [ row[8], row[12] ] ]
else:
#geolocate
</code></pre>
<hr/>
<p><strong>更新</strong></p>
<p>性能:1请求/秒-->;3600请求/小时-->;36K请求/10h</p>
<pre><code>import os
from time import sleep
from geopy.geocoders import Nominatim
os.getcwd() #check current working directory
os.chdir("C:\Users\Philip\Documents\HDSDA1\Project\Global Terrorism Database")
#import file as a csv
import csv
gtd=open("gtd_original.csv","r")
csv_f=csv.reader(gtd)
outf=open("r_ready.csv","wb")
writer=csv.writer(outf,dialect='excel')
coords = {}
for row in csv_f:
if row[13] in ("","NA") or row[14] in ("","NA"):
lookup = row[12] + "," + row[8] # creates a city,country
if coords.has_key( (row[8], row[12]) ): ## test if result is already cached
row[13] , row[14] = coords[ (row[8], row[12]) ]
else:
geolocator = Nominatim()
location = geolocator.geocode(lookup, timeout = None) #looks up the city/country on maps
try:
location.latitude
except:
lookup = row[8]
location = geolocator.geocode(lookup)
row[13] = location.latitude
row[14] = location.longitude
coords[ (row[8], row[12]) ] = (row[13] , row[14]) # cache the new coords
sleep(1) # sleep for 1 sec (required by Nominatim usage policy)
writer.writerow(row)
gtd.close()
outf.close()
</code></pre>