使用循环查询overpass api

时间:2016-08-09 19:09:55

标签: python api loops pandas overpass-api

我有一个边界框的csv文件,我在python中使用pandas加载。数据框为 df ,列名为 coord 。有谁知道如何创建一个循环来将列表传递给我的overpass api查询?

我试过了:

import time
import overpass
api = overpass.API(timeout=900)

coords = [df['coord'][0:10]]
for coord in coords:
    results =[]
    params =[]
    params = 'node["power"="generator"]'+coord+';out skel;'
    results = api.Get(params, responseformat="json")
    time.sleep(5.0)

但是,我收到了多个请求错误。

我也尝试过:

x={}
x = (api.Get(param) for param in params)

但是返回了一个python对象(<generator object <genexpr> at 0x11755c0f8>),我需要将数据作为json。

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

这里有一些错误,主要是你的方法:

  1. coords = [df['coord'][0:10]]不是必需的。您可以使用更简单的df['coord'].tolist()
  2. 替换它
  3. 您正在使用空列表初始化params,然后立即使用字符串,为什么?
  4. 你的params字符串是造成你困难的原因。我会使用Python字符串的format方法来判断查询中的coords。这样做更安全,因为它自己处理类型转换和正确放置。您不能简单地将一个坐标元组添加到字符串中并期望它能够工作。尝试在代码中打印要分配params的字符串,并从下面的解决方案中打印相同的行,您将看到差异。您的代码会引发错误TypeError: Can't convert 'tuple' object to str implicitly,而我的错误不会。
  5. 这是一个完整的解决方案:

    import time
    import overpass
    api = overpass.API(timeout=900)
    
    for coord in df['coord'].tolist():
        params = 'node["power"="generator"]{c};out skel;'.format(c=coord)
        results = api.Get(params, responseformat="json")
        time.sleep(5.0)
    

    请注意,如果您的请求出错,请在您的问题中提供完整的回溯。这将有助于我们缩小错误的真正原因。