Convert Spatial Lines to Spatial Polygons

非 Y 不嫁゛ 提交于 2019-12-13 00:35:58

问题


Is there an easy way to convert a Spatial Lines into a Spatial Polygon object within R?

Reproducible Example

I have put together a reusable dataset here, which is downloaded from OpenStreetMaps through the overpass package. This extracts the locations of a few airports in South England:

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)

However, the data is of the class "SpatialLinesDataFrame". This really messes things up if you want to do any form of spatial joins or intersections, as it only acknowledges the edge of the region.

Potential Leads

I was exploring the use of SpatialLines2PolySet within the maptools package, but in my time exploring I produced nothing but error codes, so I didn't think there would be any worth including these within the question. There is some guidance about these functions here: https://rdrr.io/rforge/maptools/man/SpatialLines2PolySet.html

Notes

I have searched the web and SO to see find similar questions and struggled to find any questions directly referring to this. A lot seem to reference converting SpatialPoints -> SpatialLineDataFrames , but not SpatialLineDataFrames -> SpatialPolygonDataFrames. This question is similar but lacks any answers (or a reproducible dataset): Close a spatial line into a polygon using a shapefile

In addition, it seems strange that this would be difficult as it is something which can be done so easily in ArcGIS using the "Feature to Polygon" tool. This function requires no additional arguments specified and it works perfectly.


回答1:


A way to solve the problem would be to use the library sf. After your query

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)


来源:https://stackoverflow.com/questions/47147242/convert-spatial-lines-to-spatial-polygons

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!