【问题标题】:Loop that restarts for rate limit为速率限制重新启动的循环
【发布时间】:2018-08-14 13:29:01
【问题描述】:

我正在查询Google Maps Roads API,每个请求最多只能接受 100 个坐标对。但是,我来自routes 的一些输入线串包含超过 100 个段。

我编写了一个示例循环,该循环向 API 发送请求,但仅限于带有 if (nrow(routes$mat) <= 100) {...} 的 100 段以下的行,其中 routes$mat 是坐标对矩阵。

for (i in 1:length(routes)) {

  if (nrow(routes$mat) <= 100) {
    mat <- paste(apply(mat, 1, paste, collapse=","), collapse="|")

    a <- "https://roads.googleapis.com/v1/snapToRoads?path="
    b <- mat
    c <- "&interpolate=false&key=YOUR_API_KEY"

    request <- paste(a,b,c, sep="")

    con <- curl(request)
    open(con)
    out <- readLines(con)
    mydf <- fromJSON(out)

    close(con)

output <- cbind(mydf$snappedPoints$location$longitude, mydf$snappedPoints$location$latitude)

}

我的目标是将所有行发送到 API - 无论它们的长度如何,但这意味着将它们逐个发送。

如何调整此循环以一次仅发送 100 个 如果 mat 大于 100,然后将结果连接到单个 output 中?

例如,如果nrow(mat) = 250,将有 3 个输出,第一个输出为 100,第二个输出为 100,第三个输出为 50。

【问题讨论】:

    标签: r google-maps loops while-loop


    【解决方案1】:

    我总是觉得做这种循环有点乱,但有时是需要的。

    对于这个答案,我正在使用我的 googleway 包来处理 API 调用。我也在使用它附带的tram_route 数据。有 55 行,所以我每 10 行迭代一次,但是对于更大的数据集,您只需增加 by = 10 值。

    library(googleway)
    
    set_key("roads_api_key", api = "roads")
    
    n <- nrow(tram_route)
    subsets <- c(seq(1, n, by = 10), n)
    iters <- length(subsets) - 1
    
    ## set up a data.frame to store the results
    df_result <- data.frame(latitude = numeric(n), 
                            longitude = numeric(n))
    
    for (i in 1:(length(subsets)-1) ) {
    
        if (i == iters[length(iters)]) {
            idx <- subsets[i]:subsets[i+1]
        } else {
            idx <- subsets[i]:(subsets[i+1] -1)
        }
        print(idx)
        res <- google_snapToRoads(df_path = tram_route[idx, ], 
                  lat = "shape_pt_lat", 
                  lon = "shape_pt_lon")
    
        df_result[idx, ] <- res$snappedPoints$location
    }
    
    head(df_result)
    #    latitude longitude
    # 1 -37.81436  144.9386
    # 2 -37.81330  144.9415
    # 3 -37.81274  144.9429
    # 4 -37.81268  144.9430
    # 5 -37.81314  144.9439
    # 6 -37.81351  144.9443
    

    如果需要证明就证明

    set_key("map_api_key")
    
    df_result$colour <- "blue"
    
    google_map() %>%
        add_markers(tram_route, lat = "shape_pt_lat", lon = "shape_pt_lon") %>%
        add_markers(df_result, colour = "colour")
    

    【讨论】:

    • 感谢您创建该软件包 - 但是即使我完全按照说明进行操作,我也会收到以下错误 Error: lexical error: invalid char in json text. https://roads.googleapis.com/v1 (right here) ------^ 我遇到过其他具有相同问题的帖子。你能解释一下解决方法吗?使用较小的数据框是可行的,但根据其文档,API 似乎接受 100 个坐标对。为什么表观限制是 25 对?
    • @the_darkside - 我没有看到对您问题的修改。另外,您是通过使用我的代码还是您的代码获得 lexical error 的?
    • 你的 - 但我发现速率限制是 25 个坐标对,如果数据框的行数不超过 25 行,它就可以工作
    • @the_darkside api docs 说它“最多需要 100 个 GPS 点”,所以不清楚 25 个限制来自哪里。
    猜你喜欢
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多