2017-08-15 118 views
-1

返回的JSON我有一个定义,它看起来像下面的块。我想我遇到了同样的问题。我认为api已经更新了,因此经纬度坐标的提取可能处于稍微不同的位置。我通过输入一个示例地址作为参数成功地发出了请求,但是我无法在def中工作(http://docs.python-requests.org/en/master/user/quickstart/#make-a-request)。我希望我的定义使用for循环从地址返回经纬度。我不熟悉解析json:/任何帮助表示赞赏!提取纬度/龙从通过谷歌API(地理编码)

此外,将geocode_result需要从我的请求结果的代码块json_results

def geocode_address(loc): 
     gmaps = googlemaps.Client(key= creds.GOOGLE_MAPS['api_key']) 
     geocode_result = gmaps.geocode(loc) 
     lat = json_results[0]["geometry"]["location"]["lat"] 
     lon = json_results[0]["geometry"]["location"]["lng"] 
     print (lat,lon) 

wanted lat/long from this position for a list of addresses I pass in in my definition

enter image description here enter image description here

回答

2

我看不出之间这是什么一样,什么你的代码做一个差异。希望这对你有一些用处。

>>> import requests 
>>> payload = {'key':} 
>>> base_url = 'https://maps.googleapis.com/maps/api/geocode/json' 
>>> payload = {'address': '1845 E. Broadway Road Ste. 102, Tempe, AE, 85282'} 
>>> r = requests.get(base_url, params=payload) 
>>> r 
<Response [200]> 
>>> coords = r.json()['results'][0]['geometry']['location'] 
>>> coords['lat'] 
33.406601 
>>> coords['lng'] 
-111.9075196 

编辑

开始两列,一个与兽医院的名称的数据帧,一个与他们的地址。

>>> import pandas as pd 
>>> df 
          0 \ 
0   The Animal Clinic 
1 Sherbourne Animal Hospital 
2  Spadina Animal Hospital 
3 Wellesley Animal Hospital 
4  Cabbagetown Pet Clinic 

                1 
0   106 Mutual St Toronto Ontario M5B 2R7 
1 320 Richmond Street East Unit 8 Toronto Onta... 
2  125 Spadina Avenue Toronto Ontario M5V 2K8 
3   8 Wellesley St W Toronto Ontario M4Y 1E7 
4   239 Gerrard St E Toronto Ontario M5A 2G1 

使用.tolist()获得地址的列表的形式,使他们能够被传递一次一个谷歌为自己的纬度和经度被存储在同名的名单。显示结果。

>>> import requests 
>>> base_url = 'https://maps.googleapis.com/maps/api/geocode/json' 
>>> latitudes = [] 
>>> longitudes = [] 
>>> for address in df[1].tolist(): 
...  payload = {'address': address} 
...  r = requests.get(base_url, params=payload) 
...  coords = r.json()['results'][0]['geometry']['location'] 
...  latitudes.append(coords['lat']) 
...  longitudes.append(coords['lng']) 
...  
>>> latitudes 
[43.6572571, 43.6535161, 43.6472168, 43.6650199, 43.6617416] 
>>> longitudes 
[-79.37609119999999, -79.3688681, -79.39527749999999, -79.3851912, -79.369494] 

现在将结果放入数据框并显示完整的结果。

>>> df['latitudes'] = latitudes 
>>> df['longitudes'] = longitudes 
>>> df 
          0 \ 
0   The Animal Clinic 
1 Sherbourne Animal Hospital 
2  Spadina Animal Hospital 
3 Wellesley Animal Hospital 
4  Cabbagetown Pet Clinic 

                1 lat latitudes \ 
0   106 Mutual St Toronto Ontario M5B 2R7 -31 43.657257 
1 320 Richmond Street East Unit 8 Toronto Onta... -42 43.653516 
2  125 Spadina Avenue Toronto Ontario M5V 2K8 -20 43.647217 
3   8 Wellesley St W Toronto Ontario M4Y 1E7 19 43.665020 
4   239 Gerrard St E Toronto Ontario M5A 2G1 50 43.661742 

    longitudes 
0 -79.376091 
1 -79.368868 
2 -79.395277 
3 -79.385191 
4 -79.369494 
+0

谢谢!你完全正确@Bill Bell。我看到了名称到输出的映射。你碰巧知道为什么我的基本循环不会打印(lat,lng),但是如果我只是做'location ['lat'],location ['lng']呢?我添加了我的字符串列表的照片,以及没有for循环的所需输出。 –

+0

你如何定义'api_list'? –

+0

api_list是第二张照片。这是一个数据帧列,我将其转换为我想要传入循环的列表。问题是,有效载荷是硬编码为单个地址,所以我需要我的dictionairy保持一个键,但具有独特的地址,每个键值对(这将来自api_list我试图这样的事情: '''有效载荷= {} 键= API_KEY api_list 因为我在按键:。 有效载荷[i] = api_list [I]''' –

相关问题