【发布时间】:2021-03-27 04:52:25
【问题描述】:
我对 OSM 世界还很陌生,我需要从 OSM 行星文件中提取所有与水相关的多边形,海洋多边形除外。我知道东京的一所大学有一些产品,但它是 2016 年的,我需要它尽可能最新。
我已经使用以下代码提取了其中的一部分。但是,将生成的图层与 QGIS 中的 OSM 底图进行比较,我注意到缺少某些部分。即使它们与提取的其他部分具有相同的标志和关系。我知道河流的某些部分被数字化为线而不是多边形,所以这些丢失没关系。丢失的部分肯定是多边形,因为我可以通过 QGIS 中的 QuickOSM 插件提取具有相同标志的其中一个。 OSM 底图也清楚地表明这些区域必须是多边形(参见screenshot)。
是我的代码有错误还是我的标志有误?但是,我的代码没有抛出任何错误,除了缺少的部分之外,一切似乎都正常工作。
提前致谢!
这是目前为止的代码:
library(gdalUtils)
library(rgdal)
library(sf)
# extracting all layers with flag "natural = water"
path_pbf <- "path/to/planet_file.osm.pbf"
ogr2ogr(src_datasource_name = path_pbf,
"OSM_Waterbodies.gpkg",
f = "GPKG",
sql = "SELECT * FROM multipolygons WHERE natural = 'water'",
progress = T)
# extracting all layers with flag "other_tags LIKE waterway"
ogr2ogr(src_datasource_name = path_pbf,
"OSM_Waterways.gpkg",
f = "GPKG",
sql = "SELECT * FROM multipolygons WHERE other_tags LIKE '%waterway%'",
progress = T)
waterways <- st_read("OSM_Waterways.gpkg")
waterways$rm <- NA
# select only certain polygons since waterways also includes dams etc
check <- "*riverbank*|*river*|*stream*|*tidal channel*|*canal*|*drain*|*ditch*|*lake*"
# mark polygons which are not part of the desired selection with "remove" flag
for(i in 1:nrow(waterways)){
if (!grepl(check, waterways$other_tags[i])){
waterways$rm[i] <- "Remove"
}
}
# drop rows with "remove" flag
index <- which(waterways$rm == "Remove")
waterways <- waterways[-index,]
st_write(waterways, "OSM_Waterways_clean.gpkg", driver = "GPKG")
P.S.:代码可能不是最有效的,但这与效率无关,因为我可能会运行一两次。
【问题讨论】:
标签: r openstreetmap gdal sf