Suite

Polygones PostGIS en un seul objet sp


J'aimerais pouvoir prendre mes requêtes SQL pour PostGIS et faire de chaque ligne de l'attribut geom une partie d'un objet sp afin de pouvoir le tracer avec les liaisons de feuillet de R. Je ne peux pas vraiment partager ce que ma base de données, mais je vais partager comment j'ai appris à me connecter et ce que j'essaie de faire pour lier chaque ligne avec un geom en un seul objet sp. Lorsque j'utilise readWKT pour une seule ligne, la classe d'objet estSpatialPolygones.

#faire ma requête pour renvoyer plusieurs lignes avec juste la requête d'attribut geom <- "SELECT ST_AsText(geom) FROM assembly" #connecter à la base de données, envoyer la requête, recevoir la table et effacer le résultat drv <- dbDriver("PostgreSQL") con <- dbConnect(drv, host = "localhost", port = "5432", dbname = "anc", user = "postgres") res <- dbSendQuery(con, query) df <- dbFetch(res) ; dbClearResult(res)

C'est ici que je tente de rassembler les lignes dans un objet de liste similaire à ce que j'ai trouvé avec cette réponse.

#preallocate vector pour combiner des objets spatiaux dans une liste n <- dim(df)[1] map_obj <- vector(mode = "list", length = n) for(i in seq(n)) { map_obj[i] < - readWKT(df[i,1]) } #Rassembler les objets spatiaux ? Polygones(map_obj,1:n)

Une sortie destr(readWKT(df[1,1])):

Classe formelle 'SpatialPolygons' [package "sp"] avec 4 slots… @ polygons :Liste de 1… $ :Classe formelle 'Polygons' [package "sp"] avec 5 slots… @ Polygones :Liste de 1… $ :Classe formelle 'Polygon' [package "sp"] avec 5 slots… @ labpt : num [1:2] 1684530 2627594… @ area : num 3.54e+08… @ trou : logi FALSE… @ ringDir: int 1… @ coords : num [1:820, 1:2] 1690044 1690045 1690046 1690046 1690047… - attr(*, "dimnames")=Liste de 2… $ : NULL… $ : chr [1:2] "x" "y"… @ plotOrder : int 1… @ labpt : num [1:2] 1684530 2627594… @ ID : chr "1"… @ area : num 3.54e+08… @ plotOrder : int 1… @ bbox : num [1:2, 1: 2] 1670993 2612705 1698389 2642795… - 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 NA

Vous pouvez le faire avec un ensemble de*appliquerles fonctions:

df<-dbGetQuery(con,'select st_astext(geom) from schema.table where geom n'est pas null;') map_obj<-mapply(function(x) readWKT(x), x=df[,1]) Spol <- SpatialPolygons(lapply(1:length(map_obj), function(i) { pol <- slot(map_obj[[i]], "polygons")[[1]] slot(pol, "ID") <- as.character (i) pol }))

Si vous souhaitez conserver un identifiant unique de la table de base de données, vous pouvez le modifier comme suit :

df<-dbGetQuery(con,'select gid, st_astext(geom) from schema.table où geom n'est pas null;') map_obj<-mapply(function(x,y) readWKT(x,y), x=df[, 2], y=df[,1]) Spol <- SpatialPolygons(lapply(1:length(map_obj), function(i) { pol <- slot(map_obj[[i]], "polygones")[[1] ] slot(pol, "ID") <- slot(slot(map_obj[[i]], "polygons")[[1]],"ID") ##assigner l'ID d'origine au polygone pol }))

Je me suis retrouvé à devoir faire cela beaucoup, j'ai donc écrit un package en R pour envelopper ces fonctions, ainsi que gérer la projection et les données de la table (pour créerSpatial*DataFrames). Vous pouvez l'installer depuis Github avec une fonction du packageoutils de développement:

bibliothèque(devtools) install_github('dnbucklin/pgis2r')

Lepgis2spol()La fonction peut être utilisée après avoir établi votre connexion à la base de données, par exemple :

library(pgis2r) drv <- dbDriver("PostgreSQL") con <- dbConnect(drv, host = "localhost", port = "5432", dbname = "anc", user = "postgres") Spol_df<-pgis2spol(con ,'schema.tablename',geom='geom',gid='unique_id_column',proj=TRUE)


Voir la vidéo: Use Unique Values to color the polygons inside the main polygon shapefile (Octobre 2021).