Suite

Cadre de données vers SpatialPolygonsDataFrame avec plusieurs polygones


J'ai un bloc de données avec un tas de polygones, plusieurs points par polygone. Comment puis-je le convertir enSpatialPolygonsDataFrameobjet?

Voici mon bloc de données :

> Buildings_df lon lat id 1 96,13597 16,83363 convocation_hall 2 96,13580 16,83315 convocation_hall 3 96,13631 16,83298 convocation_hall 4 96,13656 16,83351 convocation_hall 5 96,13400 16,83104 judson_church 6 96,13392 16,83073 judson_church 7 96,13432 16,83064 judson_church 8 96,13444 16,83085 judson_church 9 96,13596 16,83074 the_library 10 96,13586 16,83044 the_library 11 96,13615 16,83035 the_library 12 96.13626 16.83065 la_bibliothèque 13 96.13599 16.83073 la_bibliothèque

Cela peut être reproduit avec :

> dput(buildings_df) structure(list(lon = c(96.135972, 96.1358, 96.136315, 96.136562, 96.133997, 96.133922, 96.134319, 96.134437, 96.135961, 96.135864, 96.136154, 96.136261, 96.135993), lat = c(16.135961, 96.136154, 96.136261, 96.135993), lat = c(16.135993), 16.833512, 16.831038, 16.830729, 16.830637, 16.830853, 16.83074, 16.830442, 16.83035, 16.830647, 16.830729), id = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 3L, 3L, 3L, 3L , 3L), .Label = c("convocation_hall", "judson_church", "the_library"), class = "factor")), .Names = c("lon", "lat", "id"), row. noms = c(NA, -13L), classe = "data.frame")

À partir de ce data.frame, je le convertis ensuite en liste, puis en polygones, puis en objet SpatialPolygons

# faire une liste building_list <- split(buildings_df, buildings_df$id) # ne veux que lon-lats dans la liste, pas les noms building_list <- lapply(buildings_list, function(x) { x["id"] <- NULL; x }) # transforme data.frame en polygone spatial, cf. http://jwhollister.com/iale_open_science/2015/07/05/03-Spatial-Data-In-R/ # créer un objet SpatialPolygons, convertir les coordonnées en polygones ps <- sapply(buildings_list, Polygon) # ajouter la variable d'identification p1 < - Polygons(ps, ID = 1) # créer un objet SpatialPolygons my_spatial_polys <- SpatialPolygons(list(p1), proj4string = CRS("+proj=longlat +datum=WGS84") ) # voyons-les tracer(my_spatial_polys)

Jusqu'ici tout va bien:

Et chacun des polygones semble être là-dedans…

> str(my_spatial_polys) Classe formelle 'SpatialPolygons' [package "sp"] avec 4 slots… @ polygons :Liste de 1… $ :Classe formelle 'Polygons' [package "sp"] avec 5 slots… @ Polygons :Liste de 3 … $ convocation_hall:Classe formelle 'Polygon' [package "sp"] avec 5 slots… @ labpt : num [1:2] 96.1 16.8… @ area : num 3.08e-07… @ hole : logi FALSE… @ ringDir: int 1… @ coords : num [1:5, 1:2] 96.1 96.1 96.1 96.1 96.1… $ judson_church :Classe formelle 'Polygon' [package "sp"] avec 5 slots… @ labpt : num [1:2] 96.1 43.3 … @ area : num 0.0204… @ hole : logi TRUE… @ ringDir : int -1… @ coords : num [1:5, 1:2] 96.1 96.1 96.1 96.1 96.1… $ the_library :Formal class 'Polygon' [package " sp"] avec 5 slots… @ labpt : num [1:2] 96.1 43.3… @ area : num 0.00512… @ hole : logi TRUE… @ ringDir : int -1… @ coords : num [1:6, 1:2 ] 96,1 96,1 96,1 96,1 96,1… @ plotOrder: int [1:3] 1 2 3… @ labpt : num [1:2] 96,1 16,8… @ ID : chr "1"… @ area : num 0.0302… @ plotOrder : int 1… @ bbox : num [1:2, 1:2] 96,1 16,8 96,1 16,8… - attr(*, " dimnames")=Liste de 2… $ : chr [1:2] "x" "y"… $ : chr [1:2] "min" "max"… @ proj4string:Classe formelle 'CRS' [paquet "sp "] avec 1 slot… @ projargs: chr "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"

Mais ils ne semblent pas être regroupés de la façon dont je m'y attends. Lorsque j'essaie de définir trois variables d'ID, j'obtiens une erreur. Comment puis-je obtenir que les SpatialPolygons aient trois polygones, chacun avec son propre ID ?


Une solution est de changerp1 <- Polygones(ps, ID = 1)à unappliquer-comme une fonction de sorte que lePolygones()fonctionne individuellement sur chacun des polygones de lapsobjet.

ps <- lapply(buildings_list, Polygon) # add id variable p1 <- lapply(seq_along(ps), function(i) Polygons(list(ps[[i]]), ID = names(buildings_list)[i] )) # créer un objet SpatialPolygons my_spatial_polys <- SpatialPolygons(p1, proj4string = CRS("+proj=longlat +datum=WGS84") )

Ensuite, nous pouvons créer leSpatialPolygonsDataFrameavec les identifiants comme prévu, un identifiant unique par polygone :

my_spatial_polys_df <- SpatialPolygonsDataFrame(my_spatial_polys, data.frame(id = unique(buildings_df$id), row.names = unique(buildings_df$id))) > str(my_spatial_polys_df) Classe formelle 'SpatialPolygonsDataFrame' [package "sp"] avec slots… @ data :'data.frame' : 3 obs. de 1 variable :… $ id : Facteur avec 3 niveaux "convocation_hall",… : 1 2 3… @ polygons :Liste de 3… $ :Classe formelle 'Polygones' [package "sp"] avec 5 slots… @ Polygones : Liste de 1… $ :Formal class 'Polygon' [package "sp"] avec 5 slots… @ labpt : num [1:2] 96.1 16.8… @ area : num 3.08e-07… @ hole : logi FALSE… @ ringDir : int 1… @ coords : num [1:5, 1:2] 96.1 96.1 96.1 96.1 96.1… @ plotOrder: int 1… @ labpt : num [1:2] 96.1 16.8… @ ID : chr "convocation_hall"… @ area : num 0.0302… $ :Classe formelle 'Polygones' [package "sp"] avec 5 slots… @ Polygons :Liste de 1… $ :Classe formelle 'Polygon' [package "sp"] avec 5 slots… @ labpt : num [1:2] 96.1 16.8… @ zone : num 1.23e-07… @ trou : logi FALSE… @ ringDir : int 1… @ coords : num [1:5, 1:2] 96.1 96.1 96.1 96.1 96.1 96.1… @ plotOrder : int 1… @ labpt : num [1:2] 96.1 16.8… @ ID : chr "judson_church"… @ area : num 0.0204… $ :Classe formelle 'Polygones' [package "sp"] avec 5 slots… @ Polygones : Liste de 1… $ :Classe formelle 'Polygon' [package "sp"] avec 5 slots… @ labpt : n um [1:2] 96,1 16,8… @ zone : num 9.7e-08… @ trou : logi FALSE… @ ringDir : int 1… @ coords : num [1:6, 1:2] 96,1 96,1 96,1 96,1 96,1… @ plotOrder: int 1… @ labpt : num [1:2] 96.1 16.8… @ ID : chr "the_library"… @ area : num 0.00512… @ plotOrder : int [1:3] 1 2 3… @ bbox : num [1 :2, 1:2] 96,1 16,8 96,1 16,8… - attr(*, "dimnames")=Liste de 2… $ : chr [1:2] "x" "y"… $ : chr [1:2] " min" "max"… @ proj4string:Classe formelle 'CRS' [package "sp"] avec 1 slot… @ projargs: chr "+proj=longlat +datum=WGS84 +ellps=WGS84 +towgs84=0,0,0"


Voir la vidéo: GeoMYTNMAC PSQL 13 Ajout dune table spatiale de geometrie Point, Ligne, Polygone via SQL SHELL (Octobre 2021).