google_elevation() 调用时出现 HTTP 错误 400

HTTP error 400 on google_elevation() call

我正在使用 R 包 googleway 使用 decode_pl 解码折线,然后使用 google_elevation 在相应的 lat/lon 坐标处获取高程数据。我从 Strava, using the rStrava 包中获取多段线。

折线示例:

pl1 <- "q{|aHknlv@n@Mt@IxAGb@B\Eb@AZGRG^W`AyAPQF?NHDJFZBz@FVNPn@D`@C|@DjACv@@h@Dh@Ll@Zj@^\`@fAx@j@r@d@n@\ZJPNd@NbANzAFhANb@JNLHD?PKHMRGPSr@UPMXGDGJELMFCPAbBWROpAm@h@YZe@dAaC@Of@aAb@a@t@iALg@LWNQROf@IjAJnFbAv@Dr@Aj@BpBx@fFdCd@HlAHd@Pp@b@|@d@~@j@n@R~@n@\NTCXBNEZCZKbB]rAKpDK~BO\?NCd@?`DMz@SLO`@URCR@XLRRRVHd@NXNP\RXf@JHXN\Xn@ZD@Z?\NvArA~BxA"
pl2 <- "uipaHmmcv@iBoFm@{AKQy@}B}AoDyA_CASEMGKKI]y@i@y@EOi@q@kAw@KEMAu@M]?[@WDkAZiB~@]H_@PUF]TUL_@XkAn@}CzAyAx@e@P_@JSNGROPa@Fu@[UOc@IOAu@_@WIUMIIWGu@]YEk@SoBiAc@_@gAeAg@{@]mAMq@YmBA]Oq@YuBKYUg@UQa@QiAOI@QIm@EiA[w@BSFYZ_@h@]t@o@bAOb@}@zAWn@_@jAGf@SbAKbAKXSpAS`@ICa@FSHICQ@gAHq@KSAa@I[CQ@k@KOGMKYg@aBkEs@u@k@g@_@a@{@o@W]IAYQYAsDIODc@LW\GRKn@Ch@WtAO`BCzAIj@Wh@SRc@NS@a@KaAg@kCgAm@]iBo@w@_@UQc@S}@Ww@e@MCa@Sm@Sk@WYI{@g@IIMAMIIIm@QuBaAIGu@_@SQiAqA_AmASSYIUEqAKQBm@Im@Qe@i@k@UQBSCe@NO?[FKFYBSH_ADa@GQIw@OOSKF[b@M@gAl@i@b@{@b@OLwAj@KLWRI@yBvAuAd@m@F_@@qAEk@Kc@Oi@_@_@e@oAeBc@u@SSi@]i@We@Im@Q}@k@w@_@i@a@w@a@SQ[Qy@OeCSUGg@WSOa@e@W]MK_@i@CMMWIEMWa@m@[QEIICK@QHUTe@n@ELKFa@l@u@t@WNYLYXO?IBGHc@Tc@Ja@@{@Q{@]s@a@kBq@YOcAYs@IU?_@NU@GAu@^a@LSPg@X]^YJc@h@]PKHI@w@n@]h@AXEJMTCZc@|AS`@OVg@j@_Av@{@bA"

解码正常:

decoded_pl1 <- decode_pl(pl1)
decoded_pl2 <- decode_pl(pl2)

但是当我尝试获取高程时,我在第二条折线上遇到错误,我无法真正理解它:

# This one works fine
google_elevation(decode_pl(pl1), key=gmap_key)

# This one gives HTTP error 400
google_elevation(decode_pl(pl2), key=gmap_key)

我检查了来自 decode_pl 的 lat/lon 数据,它们看起来很好。我真的无法理解它...

我对一整套坐标进行了完全相同的调用,这是唯一一个出错的调用。

2017 年 3 月 14 日更新

我已经发出 fix to the development version 以便 google_elevation() 现在接受编码折线作为参数。如果 URL 长度大于 8192 个字符,它也会发出警告。

## install the development version
devtools::install_github("SymbolixAU/googleway")
library(googleway)

api_key <- "your_api_key"
map_key <- "your_map_key" ## for plotting the lines

pl1 <- "q{|aHknlv@n@Mt@IxAGb@B\Eb@AZGRG^W`AyAPQF?NHDJFZBz@FVNPn@D`@C|@DjACv@@h@Dh@Ll@Zj@^\`@fAx@j@r@d@n@\ZJPNd@NbANzAFhANb@JNLHD?PKHMRGPSr@UPMXGDGJELMFCPAbBWROpAm@h@YZe@dAaC@Of@aAb@a@t@iALg@LWNQROf@IjAJnFbAv@Dr@Aj@BpBx@fFdCd@HlAHd@Pp@b@|@d@~@j@n@R~@n@\NTCXBNEZCZKbB]rAKpDK~BO\?NCd@?`DMz@SLO`@URCR@XLRRRVHd@NXNP\RXf@JHXN\Xn@ZD@Z?\NvArA~BxA"
pl2 <- "uipaHmmcv@iBoFm@{AKQy@}B}AoDyA_CASEMGKKI]y@i@y@EOi@q@kAw@KEMAu@M]?[@WDkAZiB~@]H_@PUF]TUL_@XkAn@}CzAyAx@e@P_@JSNGROPa@Fu@[UOc@IOAu@_@WIUMIIWGu@]YEk@SoBiAc@_@gAeAg@{@]mAMq@YmBA]Oq@YuBKYUg@UQa@QiAOI@QIm@EiA[w@BSFYZ_@h@]t@o@bAOb@}@zAWn@_@jAGf@SbAKbAKXSpAS`@ICa@FSHICQ@gAHq@KSAa@I[CQ@k@KOGMKYg@aBkEs@u@k@g@_@a@{@o@W]IAYQYAsDIODc@LW\GRKn@Ch@WtAO`BCzAIj@Wh@SRc@NS@a@KaAg@kCgAm@]iBo@w@_@UQc@S}@Ww@e@MCa@Sm@Sk@WYI{@g@IIMAMIIIm@QuBaAIGu@_@SQiAqA_AmASSYIUEqAKQBm@Im@Qe@i@k@UQBSCe@NO?[FKFYBSH_ADa@GQIw@OOSKF[b@M@gAl@i@b@{@b@OLwAj@KLWRI@yBvAuAd@m@F_@@qAEk@Kc@Oi@_@_@e@oAeBc@u@SSi@]i@We@Im@Q}@k@w@_@i@a@w@a@SQ[Qy@OeCSUGg@WSOa@e@W]MK_@i@CMMWIEMWa@m@[QEIICK@QHUTe@n@ELKFa@l@u@t@WNYLYXO?IBGHc@Tc@Ja@@{@Q{@]s@a@kBq@YOcAYs@IU?_@NU@GAu@^a@LSPg@X]^YJc@h@]PKHI@w@n@]h@AXEJMTCZc@|AS`@OVg@j@_Av@{@bA"


df_elevation <- google_elevation(polyline = pl2, key = api_key)

head(df_elevation$results)
# elevation location.lat location.lng resolution
# 1  418.8341     47.60235      9.03399    19.0879
# 2  420.8099     47.60288      9.03519    19.0879
# 3  421.0847     47.60311      9.03565    19.0879
# 4  421.1900     47.60317      9.03574    19.0879
# 5  422.5887     47.60346      9.03637    19.0879
# 6  445.3051     47.60393      9.03725    19.0879

看到我们在开发版本中,我们可以在 google 地图上绘制线条

df <- data.frame(pl = c(pl1, pl2))

google_map(key = map_key) %>%
    add_polylines(data = df, polyline = "pl")


旧答案

您无意中发现了可以传入 API

的数据量限制

Google API documentation

You may pass any number of multiple coordinates within an array or encoded polyline, as long as you don't exceed the service quotas, while still constructing a valid URL

看来你已经找到了那个极限。

如果您减少从第二条折线发送的 lat/lons 的数量,您会得到返回的结果。在您的示例中,限制为 239 对坐标。

# head(google_elevation(decode_pl(pl2)[1:239,], key=gmap_key)$results)
# elevation location.lat location.lng resolution
# 1  418.8218     47.60235     9.033990    19.0879
# 2  420.8087     47.60288     9.035190    19.0879
# 3  421.0829     47.60311     9.035649    19.0879
# 4  421.1866     47.60317     9.035740    19.0879
# 5  422.5816     47.60346     9.036369    19.0879
# 6  445.2881     47.60393     9.037250    19.0879


google_elevation(decode_pl(pl2)[1:240,], key=gmap_key)
# Error in open.connection(con, "rb") : HTTP error 400.

我已经filed this as an issue所以在下一次更新中这将通过更有用的错误来处理,或者它会自动分解data.frame

目前的解决方案是先解码折线,然后一次找到 data.frame 子集的高程。


我已经回到 Google Elevation API documentaition,看来您也可以将编码的多段线发送到 API;如果你能等几天,我会发布一个开发版本的修复程序,这样你就可以直接发送折线


免责声明:我是 googleway 作者