Geopy太慢 - 一直超时

时间:2015-07-19 21:47:40

标签: python error-handling geolocation timeout geopy

我正在使用geopy获取城市名称的纬度 - 经度对。 对于单个查询,这很好。我现在尝试做的是迭代 一个大城市名称列表(46.000)并获取每个城市的地理编码。然后,我通过一个检查循环运行它们,该循环将城市(如果它在美国)排序在正确的状态。我的问题是,我得到“GeocoderTimedOut('服务超时')” 一直以来,一切都很慢,我不确定这是我的错,还是只是地方性质。 这是负责的代码段:

for tweetcount in range(number_of_tweets):

#Get the city name from the tweet
city = data_dict[0]['tweetList'][tweetcount]['user']['location']

#Sort out useless tweets
if(len(city)>3 and not(city is None)): 

    # THE RESPONSIBLE LINE, here the error occurs
    location = geolocator.geocode(city);

    # Here the sorting into the state takes place
    if location is not None:
        for statecount in range(len(data)):
            if point_in_poly(location.longitude, location.latitude, data[statecount]['geometry']):

                state_tweets[statecount] += 1;
                break;

不知何故,这一行每2./3会抛出一次超时。呼叫。城市有形式 “曼彻斯特”,“纽约,纽约”或类似的东西。 我已经尝试了 - 除了围绕一切的块,但这并没有真正改变任何问题,所以我现在删除它们......任何想法都会很棒!

2 个答案:

答案 0 :(得分:0)

您将受到您使用的任何地理定位服务的支配。 geopy只是不同Web服务的包装,因此如果服务器繁忙可能会失败。我会围绕geolocator.geocode调用创建一个包装器,如下所示:

def geocode(city, recursion=0):
    try:
        return geolocator.geocode(city)
    except GeocoderTimedOut as e:
        if recursion > 10:      # max recursions
            raise e

        time.sleep(1) # wait a bit
        # try again
        return geocode(city, recursion=recursion + 1)

在延迟1秒后,这将再次尝试10次。根据自己的喜好调整这些数字。

如果你可以重复地要求同一个城市,你应该考虑将它包装成某种记忆,例如: this decorator。 由于您尚未发布可运行的代码,因此我无法对此进行测试。

答案 1 :(得分:0)

您应该更改行:

location = geolocator.geocode(city);

location = geolocator.geocode(city,timeout=None);