Suite

Joindre des données ponctuelles spatiales à des polygones dans R

Joindre des données ponctuelles spatiales à des polygones dans R


J'essaie d'effectuer une jointure spatiale entre les données ponctuelles et les données surfaciques.

J'ai des données qui indiquent les coordonnées spatiales d'un événement dans mon fichier csv A et j'ai un autre fichier, shapefile B, qui contient les limites d'une zone sous forme de polygones.

head(A) mois longitude latitude lsoa_code crime_type 1 2014-09 -1.550626 53.59740 E01007359 Comportement antisocial 2 2014-09 -1.550626 53.59740 E01007359 Ordre public 3 2014-09 -1.865236 53.93678 E01010646 Comportement antisocial head([email protected]) code name altname 0 E05004934 Longfield, New Barn et Southfleet  1 E05000448 Lewisham Central  2 E05003149 Hawcoat 

Je souhaite joindre les données criminelles A à mon fichier de formes B pour cartographier les événements criminels qui se produisent dans ma zone A. Malheureusement, je ne peux pas effectuer une jointure d'attribut basée surcodecar le code en A fait référence à des unités différentes de celles du code en B.

J'ai lu un certain nombre de tutoriels et de messages mais je n'ai pas trouvé de réponse. J'ai essayé:

joint = sur(A, B)

etrecouvrir, mais n'a pas accompli ce que je voulais.

Existe-t-il un moyen de faire cette jointure directement ou une transformation intermédiaire de A vers un autre format serait-elle nécessaire ?

Conceptuellement, je veux sélectionner les points de A qui tombent dans lecodezones de B (similaire à « rejoindre en fonction de la localisation spatiale dans ArcGIS »).

Quelqu'un a-t-il eu ce problème et l'a-t-il résolu ?


La fonction point.in.poly du package spatialEco renvoie un objet SpatialPointsDataFrame des points qui coupent un objet polygone sp et ajoute éventuellement les attributs de polygone.

Tout d'abord, ajoutons les packages requis et créons des exemples de données.

require(spatialEco) require(sp) data(meuse) coordonnées(meuse) = ~x+y sr1=Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409, 180162, 180114) ), c(332349, 332057, 332342, 333250, 333558, 333676, 332618, 332413, 332349)))),'1') sr2=Polygones(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437, 179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683, 331133, 331623, 332152, 332357, 332373)))),'2') sr3=Polygones(list(Polygone (cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875, 179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110), c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004, 329783, 329665, 329720, 329933, 330478, 331062, 331086))),'3') sr4=Polygones(list(Polygon(cbind(c(180304, 180403,179632,179420,180304), c (332791, 333204, 333635, 333058, 332791)))),'4') sr=SpatialPolygons(list(sr1,sr2,sr3,sr4)) srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c( '1','2','3','4'), PIDS=1:4, y= runif(4)))

Maintenant, jetons un coup d'œil rapide aux données et tracez-les.

head([email protected]) # polygones head([email protected]) # points plot(srdf) points(meuse, pch=20)

Enfin, nous pouvons croiser les points avec les polygones. Les résultats seront un objet SpatialPointsDataFrame avec, dans ce cas, deux attributs supplémentaires (PIDS, y) qui étaient contenus dans les données de polygone srdf.

pts.poly <- point.in.poly(meuse, srdf) head([email protected])

S'il n'y a pas de colonne d'identification unique dans les données de polygone, vous pouvez facilement en ajouter une.

[email protected]$poly.ids <- 1:nrow(srdf)

Une fois que nous avons intersecté les points et les polygones, nous pouvons agréger les points en utilisant les identifiants de polygone uniques qui étaient un attribut dans les données de polygone.

# Nombre de points dans chaque tapply de polygone([email protected]$lead, [email protected]$PIDS, FUN=length) # Lead moyen dans chaque tapply de polygone([email protected]$lead, [email protected] $PIDS, FUN=moyen)

plus de()Depuis le paquetsppeut être un peu déroutant mais fonctionne bien. Je suppose que vous avez déjà rendu "A" spatial aveccoordonnées(A) <- ~longitude+latitude:

# Superposez les points et extrayez uniquement la colonne de code : a.data <- over(A, B[,"code"])

Au lieu d'un objet spatial ponctuel, cela vous donne simplement un bloc de données, avec le même numéro. lignes comme A, et une seule variable "code" de chaque polygone d'intersection de B.

# Ajoutez ces données à A : A$bcode <- a.data$code

Voici une solution de type dplyr :

library(spdplyr) ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson", what = "sp") pop <- read_excel("data/SAPE20DT7-mid-2017-parlicon-syoaformatted-estimated-syoa xls",sheet = "data") pop <- concierge::clean_names(pop) ukcounties_pop <- ukcounties %>% inner_join(pop, by = c("pcon18nm" = "pcon11nm"))

Les données démographiques proviennent de : https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates

J'ai dû convertir les fichiers de forme téléchargés à partir de geoJson : https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1

Vous pouvez le faire en :

uk_constituencies <- readOGR("data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC.shp") uk_constituencies # ceci est au format tmerc. nous devons le convertir en WGS84 requis par le format geoJson. # Première conversion en longitude / latitude avec le système de coordonnées WGS84 wgs84 = '+proj=longlat +datum=WGS84' uk_constituencies_trans <- spTransform(uk_constituencies, CRS(wgs84)) # Convertir du cadre de données spatiales en GeoJSON uk_constituencies_json <- geojson_json(uk_constituencies) Enregistrez en tant que fichier GeoJSON sur le système de fichiers. geojson_write(uk_constituencies_json, file = "data/Westminster_Parliamentary_Constituencies_December_2018_UK_BGC/uk_country.geojson") #read back in: ukcounties <- geojsonio::geojson_read("data/Westminster_Parliamentary_Parliamentary_Constituencies_UK_DecemberBsp_Constituencies_DecemberBsp