Преобразовать пространственные линии в пространственные многоугольники

Есть ли простой способ преобразовать пространственные линии в объект пространственного полигона в R?

Воспроизводимый пример

Я собрал здесь повторно используемый набор данных, который загружается из OpenStreetMaps через overpass пакет. Это извлекает местоположения нескольких аэропортов в Южной Англии:

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)

Однако данные относятся к классу "SpatialLinesDataFrame". Это действительно запутывает вещи, если вы хотите делать какие-либо формы пространственных соединений или пересечений, поскольку это только признает край области.

Потенциальные потенциальные клиенты

Я изучал использование SpatialLines2PolySet в пределах maptools пакет, но в свое время изучения я не произвел ничего, кроме кодов ошибок, так что я не думал, что будет целесообразно включить их в вопрос. Вот несколько советов об этих функциях: https://rdrr.io/rforge/maptools/man/SpatialLines2PolySet.html

Заметки

Я искал в Интернете и SO, чтобы увидеть найти похожие вопросы и изо всех сил пытался найти какие-либо вопросы, непосредственно относящиеся к этому. Кажется, что многие ссылаются на преобразование SpatialPoints -> SpatialLineDataFrames, но не SpatialLineDataFrames -> SpatialPolygonDataFrames. Этот вопрос похож, но в нем отсутствуют какие-либо ответы (или воспроизводимый набор данных): закройте пространственную линию в многоугольник, используя шейп-файл

Кроме того, кажется странным, что это будет сложно, так как это легко сделать в ArcGIS с помощью инструмента " Feature to Polygon". Эта функция не требует дополнительных аргументов и работает отлично.

1 ответ

Решение

Одним из способов решения этой проблемы было бы использование библиотеки. 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)
Другие вопросы по тегам