【问题标题】:How to retrieve bbox for osmdata from spatial feature?如何从空间特征中检索 osmdata 的 bbox?
【发布时间】:2026-01-22 23:50:02
【问题描述】:

如何定义bbox以根据空间文件的范围下载OSM数据? 以下示例返回错误消息:

...唯一允许的值是介于 -90.0 和 90.0 之间的浮点数

这表明 bbox 值超出了允许的范围。它还表明 NAD27 和 EPSG:3857 之间的转换没有返回应有的空间数据。 对于其他空间数据,我遇到了类似的问题。即使在允许的范围内,数据也没有出现在预期的位置。下载的 OSM 数据与输入空间文件出现在不同的位置。

library(sf)
library(raster)
library(osmdata)

osm_proj <-("+init=epsg:3857")

nc <- st_read(system.file("shape/nc.shp", package="sf"))

nc <- st_transform(nc, osm_proj)

bbox.nc <- as.vector(extent(nc[22,]))/100000

q <- opq(bbox = bbox.nc) %>%
  add_osm_feature(key = 'natural', value = 'water')

osm.water <- osmdata_sf(q)

如何准备下载的 OSM 数据与输入空间文件的空间扩展匹配的 bbox?

【问题讨论】:

    标签: geospatial openstreetmap sf coordinate-systems


    【解决方案1】:

    OSM 在 lat-lon 中工作,这意味着 EPSG:4326。您需要相应地转换坐标。你也不需要raster::extent()sf::st_bbox() 在这个用例中就足够了。

    或者在你的上下文中考虑这个代码;因为这只是一个玩具示例,所以我没有使用整个 NC 州,而是一个县(否则可能会出现超时错误,这将是一个单独的问题 - 这个问题是关于边界框的)。

    library(sf)
    library(osmdata)
    
    nc <- st_read(system.file("shape/nc.shp", package="sf"))
    
    strelitz <- st_transform(nc, 4326) %>% 
      dplyr::filter(NAME == "Mecklenburg") # as in Charlotte of Mecklenburg-Strelitz
      
    
    q <- opq(bbox = sf::st_bbox(strelitz)) %>%
      add_osm_feature(key = 'natural', value = 'water') %>% 
      osmdata_sf()
    
    plot(st_geometry(strelitz))
    plot(st_geometry(q$osm_lines), col = 'blue', add = T)
    

    一个无耻的插件:我写了关于查询 OSM 的兴趣点的文章,你可能会觉得这篇文章很有趣 :)

    https://www.jla-data.net/eng/finding-pois-along-a-route/

    【讨论】:

    • 你是完全正确的。我只是使用了错误的 CRS ......好吧 :) 我用不同的数据测试了你的解决方案,它真的只是错误的 CRS。 thx 和 ncie 顺便说一句!
    • 是的 - 你快到了。如此接近,然而...... :) 我希望你的代码现在运行得更好