首页 > 解决方案 > 反向地理编码 geopy 时出现“`address` must not be None”错误

问题描述

有没有人遇到过以下问题?我有一个包含可再生能源装置坐标的 pandas DataFrame,我尝试使用反向地理编码来获取相关的地址数据。我为此使用了geopy。该代码在我使用的测试样本上运行良好,但是当我尝试将它应用于它抛出的完整数据和错误时,它显示 TypeError:'address' must not be None。

所以我有一个名为 xml_data 的 pandas DataFrame,其中有一个“坐标”列,其中坐标的形式为:52.06192、4.53075

代码是:

import pandas as pd
import geopy
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
import tqdm



#Create an extra column in the xml data to put the coordinates in as 'lat,lon'
xml_data['coordinates'] = xml_data['lat'].map(str) + ',' + xml_data['lon'].map(str)

#Create service provicder and pass timeout to be 10 minutes to prevent timeout errors
locator = Nominatim(user_agent='myGeocoder', timeout=10)
rgeocode = RateLimiter(locator.reverse, min_delay_seconds=0.001)

#Use the reverse code. Add tqdm to monitor progress.
tqdm.tqdm.pandas(desc="progress-bar")
xml_data['address'] = xml_data['coordinates'].progress_apply(rgeocode)

如果特定坐标的地址不存在,我认为,基于文档,将返回 None 值而不是错误。关于可能是什么问题的任何想法?

ps:抱歉,如果我的问题表述不够清楚,如果有什么我应该补充的,请告诉我。

标签: reversegeocodinggeopy

解决方案


您为 52.06192、4.53075 坐标给出的示例对我有用,我尝试将纬度更改为 89.06192 以重现类似的错误。我第一次得到“地址不能是无”,当我添加 Try except 时,它完美无缺。

import pandas as pd
import numpy as np
import geopy
from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter
df = pd.DataFrame({'latitude': [89.06192],
               'longitude': [4.53075]
               })

locator = Nominatim(user_agent="myGeocoder", timeout=10)
df["geom"] =  df["latitude"].map(str)  + ',' + df['longitude'].map(str)
def rg(x):
    try:
        rgeocode = RateLimiter(locator.reverse, min_delay_seconds=1, max_retries=2) 
    except:
        return None
df['address'] = df['geom'].progress_apply(rg)

推荐阅读