微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R 我怎样才能从 Overpass API 获得唯一的方法并减少数据量

如何解决R 我怎样才能从 Overpass API 获得唯一的方法并减少数据量

我正在尝试减少通过服务器的查询所需的数据量和时间。 我只对方法和使用 osmdata 包感兴趣,这是我目前的方法

library(osmdata)

bBox_dimensions <-c(xmin=11.2360151977671,ymin= 47.8047832575026,xmax= 11.8886729361838,ymax=48.2426118570748)

my_osm_data <- opq(bBox = bBox_dimensions,timeout = 180,memsize = 104857600) %>%
    add_osm_feature(
      key = 'highway',value = c("primary","secondary","tertiary")
      
    ) %>% 
  osmdata_sf(quiet = FALSE)

是否可以减少这个查询的数据量? 我只对方式感兴趣,而不是沿途的节点。

解决方法

正如我在评论中所写,如果您需要对属于同一地理区域的 OSM 数据运行多个查询,我会建议采用以下方法。

首先加载包

library(sf)
#> Linking to GEOS 3.9.0,GDAL 3.2.1,PROJ 7.2.1
library(osmextract)
#> Data (c) OpenStreetMap contributors,ODbL 1.0. https://www.openstreetmap.org/copyright.
#> Check the package website,https://docs.ropensci.org/osmextract/,for more details.
library(tmap)
tmap_mode("view")
#> tmap mode set to interactive viewing

定义 bbox 并转换为 sfc 对象(参见关于 github 的讨论):

my_bbox <- st_bbox(
  c(xmin = 11.2360151977671,ymin = 47.8047832575026,xmax = 11.8886729361838,ymax = 48.2426118570748),crs = 4326
)
my_bbox_poly <- st_as_sfc(my_bbox)

然后我们需要下载特定地理区域的 OSM 提取,该提取应涵盖您的所有查询。如果您在德国处理数据,那么我建议您检查 geofabrikbbbike 提供商:

oe_match(my_bbox_poly,provider = "geofabrik")
#> The input place was matched with multiple geographical areas.
#> Selecting the smallest administrative unit. Check ?oe_match for more details.
#> $url
#> [1] "https://download.geofabrik.de/europe/germany/bayern/oberbayern-latest.osm.pbf"
#> 
#> $file_size
#> [1] 185338670
oe_match(my_bbox_poly,provider = "bbbike")
#> $url
#> [1] "https://download.bbbike.org/osm/bbbike/Muenchen/Muenchen.osm.pbf"
#> 
#> $file_size
#> [1] 58400897

bbbike 提供者返回的提取物远小于 geofabrik 返回的提取物;因此,我将使用 bbbike 返回的 OSM 数据运行以下步骤。

oe_get("Muenchen",provider = "bbbike",download_only = TRUE,skip_vectortranslate = TRUE)
#> The input place was matched with: Muenchen
#> File downloaded!
#> [1] "C:\\Users\\Utente\\Documents\\osm-data\\bbbike_Muenchen.osm.pbf"

然后,如果您想读入属于特定 bbox 且具有某些特征的行数据,那么我建议采用以下方法:

lines_v1 <- oe_get(
  place = "Muenchen",# or place = my_bbox_poly
  layer = "lines",query = "SELECT * FROM lines WHERE highway IN ('primary','secondary','tertiary')",wkt_filter = st_as_text(my_bbox_poly) 
)
#> The input place was matched with: Muenchen
#> The chosen file was already detected in the download directory. Skip downloading.
#> Start with the vectortranslate operations on the input file!
#> 0...10...20...30...40...50...60...70...80...90...100 - done.
#> Finished the vectortranslate operations on the input file!
#> Reading layer `lines' from data source `C:\Users\Utente\Documents\osm-data\bbbike_Muenchen.gpkg' using driver `GPKG'
#> Simple feature collection with 13032 features and 9 fields
#> Geometry type: LINESTRING
#> Dimension:     XY
#> Bounding box:  xmin: 11.19608 ymin: 47.80002 xmax: 11.89542 ymax: 48.25359
#> Geodetic CRS:  WGS 84

请注意,该功能会识别您已经下载了 OSM 提取并跳过再次下载相同的文件。如果您设置了持久下载目录,则可以优化此过程。有关详情,请参阅 here

# Check result
tm_shape(my_bbox_poly) + 
  tm_borders(col = "darkred") + 
tm_shape(lines_v1) + 
  tm_lines(lwd = 2)

更有效(但更棘手)的方法如下:

lines_v2 <- oe_get(
  place = "Muenches",layer = "lines",vectortranslate_options = c(
    "-f","GPKG","-overwrite","-where","highway IN ('primary',"-clipsrc",st_as_text(my_bbox_poly),"-nlt","PROMOTE_TO_MULTI","lines"
  )
)
#> The input place was matched with: Muenchen
#> The chosen file was already detected in the download directory. Skip downloading.
#> Start with the vectortranslate operations on the input file!
#> 0...10...20...30...40...50...60...70...80...90...100 - done.
#> Finished the vectortranslate operations on the input file!
#> Reading layer `lines' from data source `C:\Users\Utente\Documents\osm-data\bbbike_Muenchen.gpkg' using driver `GPKG'
#> Simple feature collection with 13027 features and 9 fields
#> Geometry type: MULTILINESTRING
#> Dimension:     XY
#> Bounding box:  xmin: 11.23602 ymin: 47.80478 xmax: 11.88867 ymax: 48.24261
#> Geodetic CRS:  WGS 84

图形检查

# Check result
tm_shape(my_bbox_poly) + 
  tm_borders(col = "darkred") + 
tm_shape(lines_v2) + 
  tm_lines(lwd = 2)

reprex package (v1.0.0) 于 2021 年 3 月 31 日创建

总结:

  1. 如果您需要多次导入 OSM 数据,那么您应该persistent download directory。这也意味着您无需在每次运行新查询时都下载 OSM 数据提取(除非请求的数据未包含在任何现有数据提取中)。
  2. 如果您需要导入覆盖中/小型地理区域的 OSM 线路,我建议采用“查询”方法(即lines_v1)。
  3. 第二种方法有几个好处(即它比另一种方法更快,尤其是对于较大的提取物,并且,正如您从上图中看到的那样,它会裁剪线条而不是选择与框相交的道路)。另一方面,从头开始编写 vectortranslate 选项非常困难(我们正在开发更直观的 API,但目前正在开发中)。此外,该选项修改了 .gpkg 文件(可能有 relevant consequences)的底层结构。我们正在研究这两个问题的解决方案,但您需要等到 0.3 或 0.4 版本。

查看 hereherehere 以了解有关 osmextract 的更多详细信息。

请随时在此处添加任何问题或评论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。