如何使用 geopy 检索位置地址?

时间:2021-04-29 12:23:20

标签: python

我有以下数据框并使用了来自 here

的代码
from geopy.geocoders import Nominatim

data = {'lat1': [116.51172,116.51135,116.51135,116.51627,116.47186],
        'lon1': [39.92123,39.93883,39.93883,39.91034,39.91248]}  
  
# Create DataFrame  
df_test = pd.DataFrame(data)  
geolocator = Nominatim(user_agent="geoapiExercises")
location = geolocator.reverse(df_test['lat']+","+ df_test['lon'], language='en')

address = location.raw['address']

df_test['suburb']= address.get('suburb', '')
df_test['postcode']= address.get('postcode', '')
df_test['road']= address.get('road', '')

我想从该位置获取 3 个特征,但是出现错误

<块引用>

ufunc 'add' 不包含具有签名匹配类型 (dtype(' dtype('

你能帮忙获取必要的信息吗?

1 个答案:

答案 0 :(得分:0)

使用 pd.applygeolocator.reverse 函数应用于数据框的每一行。

geopy 给出了 latitude coordinates must be in the range [-90, 90] 的错误,所以我添加了纬度和经度标准化

import pandas as pd
from geopy.geocoders import Nominatim
from math import sin, asin, fmod, pi
geolocator = Nominatim(user_agent="geoapiExercises")

data = {'lat1': [116.51172,116.51135,116.51135,116.51627,116.47186],
        'lon1': [39.92123,39.93883,39.93883,39.91034,39.91248]}  
        
# Create DataFrame  
df = pd.DataFrame(data)  

# latitude and longitude normalization according to formulas found at
# https://stackoverflow.com/a/31119445/50065
df['lat'] = df['lat1'].apply(lambda lat: asin(sin((lat/180.0)*pi)) * (180.0/pi))
df['lon'] = df['lon1'].apply(lambda lon: fmod(lon - 180.0, 360.0) + 180.0)

df['lat_lon'] = df['lat'].astype(str) + ',' + df['lon'].astype(str)

df['location'] = df['lat_lon'].apply(lambda lat_lon:  geolocator.reverse(lat_lon, language='en'))

df['address'] = df['location'].apply(lambda loc: loc.raw['address'])

df['postcode'] = df['address'].apply(lambda addr: addr.get('postcode', 'no postcode'))

输出:

<头>
lat1 lon1 lat lon lat_lon 位置 地址 邮政编码
0 116.512 39.9212 63.4883 39.9212 63.488280000000024,39.92123000000001 Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} 164254
1 116.511 39.9388 63.4887 39.9388 63.488650000000014,39.938829999999996 Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} 164254
2 116.511 39.9388 63.4887 39.9388 63.488650000000014,39.938829999999996 Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} 164254
3 116.516 39.9103 63.4837 39.9103 63.48373,39.91033999999999 Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} 164254
4 116.472 39.9125 63.5281 39.9125 63.52813999999999,39.912480000000016 Обозерское городское поселение, 普列谢茨基区, 阿尔汉格尔斯克州, 西北联邦区, 164254, 俄罗斯 {'municipality': 'Обозерское городское поселение', 'county': 'Plesetsky District', 'state': 'Arkhangelsk Oblast', 'region': 'Northwestern Federal District' ', 'postcode': '164254', 'country': '俄罗斯', 'country_code': 'ru'} 164254
相关问题