R 我怎样才能从 Overpass API 获得唯一的方式并减少数据量
R how can I get only ways from Overpass API and reduce the amount of data
我正在尝试减少查询天桥服务器所需的数据量和时间。
我只对使用 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 提取。如果您在德国处理数据,那么我建议您检查 geofabrik
和 bbbike
提供商:
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",
provider = "bbbike",
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",
provider = "bbbike",
vectortranslate_options = c(
"-f", "GPKG",
"-overwrite",
"-where", "highway IN ('primary', 'secondary', 'tertiary')",
"-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-03-31 创建
总结:
- 如果您需要多次导入 OSM 数据,那么您应该 persistent download directory。这也意味着您不需要每次 运行 新查询时都下载 OSM 提取(除非请求的数据不包含在任何现有提取中)。
- 如果您需要导入覆盖 medium/small 地理区域的 OSM 线路,我建议采用“查询”方法(即 lines_v1)。
- 第二种方法有几个好处(即它比另一种方法更快,特别是对于较大的提取物,而且,正如您从上一个图中看到的那样,它剪裁线而不是选择与框相交的道路) .另一方面,从头开始编写 vectortranslate 选项是相当困难的(我们正在研究更直观的 API,但目前还处于开发阶段)。此外,该选项修改了
.gpkg
文件(可能有 relevant consequences)的底层结构。我们正在努力解决这两个问题,但您需要等到 0.3 或 0.4 版本。
查看 here, here, and here 了解 osmextract 背后的更多详细信息。
如有任何问题或评论,请随时在此处添加。
我正在尝试减少查询天桥服务器所需的数据量和时间。 我只对使用 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 提取。如果您在德国处理数据,那么我建议您检查 geofabrik
和 bbbike
提供商:
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
.
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",
provider = "bbbike",
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",
provider = "bbbike",
vectortranslate_options = c(
"-f", "GPKG",
"-overwrite",
"-where", "highway IN ('primary', 'secondary', 'tertiary')",
"-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-03-31 创建总结:
- 如果您需要多次导入 OSM 数据,那么您应该 persistent download directory。这也意味着您不需要每次 运行 新查询时都下载 OSM 提取(除非请求的数据不包含在任何现有提取中)。
- 如果您需要导入覆盖 medium/small 地理区域的 OSM 线路,我建议采用“查询”方法(即 lines_v1)。
- 第二种方法有几个好处(即它比另一种方法更快,特别是对于较大的提取物,而且,正如您从上一个图中看到的那样,它剪裁线而不是选择与框相交的道路) .另一方面,从头开始编写 vectortranslate 选项是相当困难的(我们正在研究更直观的 API,但目前还处于开发阶段)。此外,该选项修改了
.gpkg
文件(可能有 relevant consequences)的底层结构。我们正在努力解决这两个问题,但您需要等到 0.3 或 0.4 版本。
查看 here, here, and here 了解 osmextract 背后的更多详细信息。
如有任何问题或评论,请随时在此处添加。