将空间线转换为空间多边形
Convert Spatial Lines to Spatial Polygons
有没有一种简单的方法可以在 R 中将空间线转换为空间多边形对象?
可重现的例子
我在这里整理了一个可重复使用的数据集,它是通过 overpass
包从 OpenStreetMaps 下载的。这提取了南英格兰几个机场的位置:
devtools::install_github("hrbrmstr/overpass")
library(overpass)
library(raster)
library(sp)
# Write Query
query_airport <- '
(node["aeroway"="aerodrome"](50.8, -1.6,51.1, -1.1);
way["aeroway"="aerodrome"](50.8, -1.6,51.1, -1.1);
relation["aeroway"="aerodrome"](50.8, -1.6,51.1, -1.1);
);
out body;
>;
out skel qt;
'
# Run query
shp_airports <- overpass::overpass_query(query_airport, quiet = TRUE)
crs(shp_airports) <- CRS("+init=epsg:4326") # Add coordinates
shp_airports <- shp_airports[,1]
# Plot Results
plot(shp_airports, axes = T)
但是,数据是class"SpatialLinesDataFrame"的。如果你想做任何形式的空间连接或交叉,这真的会把事情搞砸,因为它只承认区域的边缘。
潜在潜在客户
我正在探索 SpatialLines2PolySet
在 maptools
包中的使用,但在我探索的过程中除了错误代码我什么也没产生,所以我认为包括这些代码没有任何价值在问题中。这里有一些关于这些函数的指导:https://rdrr.io/rforge/maptools/man/SpatialLines2PolySet.html
备注
我已经在网上进行了搜索,所以我发现了类似的问题,但很难找到直接与此相关的任何问题。很多似乎都提到转换 SpatialPoints -> SpatialLineDataFrames ,但不是 SpatialLineDataFrames -> SpatialPolygonDataFrames 。这个问题很相似,但没有任何答案(或可重现的数据集):Close a spatial line into a polygon using a shapefile
此外,这很困难,这似乎很奇怪,因为在 ArcGIS 中使用“Feature to Polygon”工具可以轻松完成。此函数不需要指定额外的参数,并且可以完美运行。
解决问题的一种方法是使用库 sf
。在您查询后
library(sp)
library(raster)
library(sf)
sf_airports <- st_as_sf(shp_airports)
sf_airports_polygons <- st_polygonize(sf_airports)
shp_airports <- as(sf_airports_polygons, "Spatial") # If you want sp
class(shp_airports)
有没有一种简单的方法可以在 R 中将空间线转换为空间多边形对象?
可重现的例子
我在这里整理了一个可重复使用的数据集,它是通过 overpass
包从 OpenStreetMaps 下载的。这提取了南英格兰几个机场的位置:
devtools::install_github("hrbrmstr/overpass")
library(overpass)
library(raster)
library(sp)
# Write Query
query_airport <- '
(node["aeroway"="aerodrome"](50.8, -1.6,51.1, -1.1);
way["aeroway"="aerodrome"](50.8, -1.6,51.1, -1.1);
relation["aeroway"="aerodrome"](50.8, -1.6,51.1, -1.1);
);
out body;
>;
out skel qt;
'
# Run query
shp_airports <- overpass::overpass_query(query_airport, quiet = TRUE)
crs(shp_airports) <- CRS("+init=epsg:4326") # Add coordinates
shp_airports <- shp_airports[,1]
# Plot Results
plot(shp_airports, axes = T)
但是,数据是class"SpatialLinesDataFrame"的。如果你想做任何形式的空间连接或交叉,这真的会把事情搞砸,因为它只承认区域的边缘。
潜在潜在客户
我正在探索 SpatialLines2PolySet
在 maptools
包中的使用,但在我探索的过程中除了错误代码我什么也没产生,所以我认为包括这些代码没有任何价值在问题中。这里有一些关于这些函数的指导:https://rdrr.io/rforge/maptools/man/SpatialLines2PolySet.html
备注
我已经在网上进行了搜索,所以我发现了类似的问题,但很难找到直接与此相关的任何问题。很多似乎都提到转换 SpatialPoints -> SpatialLineDataFrames ,但不是 SpatialLineDataFrames -> SpatialPolygonDataFrames 。这个问题很相似,但没有任何答案(或可重现的数据集):Close a spatial line into a polygon using a shapefile
此外,这很困难,这似乎很奇怪,因为在 ArcGIS 中使用“Feature to Polygon”工具可以轻松完成。此函数不需要指定额外的参数,并且可以完美运行。
解决问题的一种方法是使用库 sf
。在您查询后
library(sp)
library(raster)
library(sf)
sf_airports <- st_as_sf(shp_airports)
sf_airports_polygons <- st_polygonize(sf_airports)
shp_airports <- as(sf_airports_polygons, "Spatial") # If you want sp
class(shp_airports)