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

Есть ли простой способ преобразовать пространственные линии в объект пространственного многоугольника в 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

Примечания

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

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


person Michael Harper    schedule 06.11.2017    source источник


Ответы (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)
person nebi    schedule 07.11.2017