Joh*_*nie 5 python google-maps numpy latitude-longitude pandas
我有一个以下格式的Pandas 数据框:dataframe。

现在我想把所有的起始纬度和起始经度对放到原点,把所有的结束纬度和结束经度对放到目的地。我想得到每一行的距离和持续时间,如下所示。预期输出:
Rental Id | Distance | Duration | Status
0 51649420 0 0 OK
1 51649421 959 214 OK
2
...
15
Run Code Online (Sandbox Code Playgroud)
我尝试遵循两种方法,但它们都给了我超时错误。
方法一:
import googlemaps
from pandas.io.json import json_normalize
gmaps = googlemaps.Client(key='my API key')
for i in range (0,15):
origins = (journeydf['Start Latitude'][i], journeydf['Start Longitude'][i])
destinations = (journeydf['End Latitude'][i], journeydf['End Longitude'][i])
matrix = gmaps.distance_matrix(origins, destinations, mode="bicycling")
matrixdf = json_normalize(matrix,['rows','elements'])
matrixdf['Rental Id']=journeydf['Rental Id']
Run Code Online (Sandbox Code Playgroud)
方法二:
import urllib, json, time
import pandas as pd
def google(lato, lono, latd, lond):
url = """http://maps.googleapis.com/maps/api/distancematrix/json?origins=%s,%s"""%(lato, lono)+ \
"""&destinations=%s,%s&mode=driving&language=en-EN&sensor=false"""% (latd, lond)
#CHANGE THIS FOR PYTHON 3.X TO urllib.request.urlopen(url)...
response = urllib.urlopen(url).read().decode('utf8')
#Wait a second so you don't overwhelm the API if doing lots of calls
time.sleep(1)
obj = json.loads(response)
try:
minutes = obj['rows'][0]['elements'][0]['duration']['value']/60
miles = (obj['rows'][0]['elements'][0]['distance']['value']/100)*.62137 #kilometers per mile
return minutes, miles
except IndexError:
#something went wrong, the result was not found
print (url)
#return the error code
return obj['Status'], obj['Status']
def ApplyGoogle(row):
lato, lono = row['Start Latitude'], row['Start Longitude']
latd, lond = row['End Latitude'], row['End Longitude']
return google(lato, lono, latd, lond)
journeydf['Minutes'], journeydf['Miles'] = zip(*journeydf.apply(ApplyGoogle, axis = 1))
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?提前致谢。
我很惊讶您使用方法 1 时遇到超时错误。您能确认输出吗?
您是否创建了 Google 地图 API 密钥?标准使用是免费的(每天 2,500 次距离计算,每次查询限制 100 次,每 10 秒限制 100 次) https://developers.google.com/maps/documentation/distance-matrix/get-api-key 该密钥需要写在你的代码有“我的 API 密钥”的地方
for 循环上的缩进以及起点和终点的分配也可能存在问题。试试这个:
# make sure you can connect to Google's server
import requests
try:
response = requests.get('http://www.google.com')
except:
print 'Can\'t connect to Google\'s server'
raw_input('Press any key to exit.')
quit()
# use the Google Maps API
import googlemaps
gmaps = googlemaps.Client(key='YOUR KEY')
origins = []
destinations = []
for i in range (0,15):
origins.append(str(journeydf['Start Latitude'][i]) + ' ' + str(journeydf['Start Longitude'][i]))
destinations.append(str(journeydf['End Latitude'][i]) + ' ' + str(journeydf['End Longitude'][i]))
matrix = gmaps.distance_matrix(origins, destinations, mode="bicycling")
print matrix
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9367 次 |
| 最近记录: |