Voici un exemple de jouet avec lequel j'ai lutté
# Make points
point1 <- c(.5, .5)
point2 <- c(.6, .6)
point3 <- c(3, 3)
mpt <- st_multipoint(rbind(point1, point2, point3)) # create multipoint
# Make polygons
square1 <- rbind(c(0, 0), c(1, 0), c(1,1), c(0, 1), c(0, 0))
square2 <- rbind(c(0, 0), c(2, 0), c(2,2), c(0, 2), c(0, 0))
square3 <- rbind(c(0, 0), c(-1, 0), c(-1,-1), c(0, -1), c(0, 0))
mpol <- st_multipolygon(list(list(square1), list(square2), list(square2))) # create multipolygon
# Convert to class' sf'
pts <- st_sf(st_sfc(mpt))
polys <- st_sf(st_sfc(mpol))
# Determine which points fall inside which polygons
st_join(pts, polys, join = st_contains)
La dernière ligne produit
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) :
cannot coerce class "c("sfc_MULTIPOINT", "sfc")" to a data.frame
Comment puis-je effectuer une jointure spatiale pour déterminer quels points entrent dans quels polygones?
Je travaille également sur les fonctionnalités du paquetage sf
, donc excuses si cela n’est pas correct ou il existe de meilleures méthodes. Je pense qu'un problème ici est que si vous construisez les géométries comme dans votre exemple, vous n'obtenez pas ce que vous pensez:
> pts
Simple feature collection with 1 feature and 0 fields
geometry type: MULTIPOINT
dimension: XY
bbox: xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3
epsg (SRID): NA
proj4string: NA
st_sfc.mpt.
1 MULTIPOINT(0.5 0.5, 0.6 0.6...
> polys
Simple feature collection with 1 feature and 0 fields
geometry type: MULTIPOLYGON
dimension: XY
bbox: xmin: 0 ymin: 0 xmax: 2 ymax: 2
epsg (SRID): NA
proj4string: NA
st_sfc.mpol.
1 MULTIPOLYGON(((0 0, 1 0, 1 ...
Vous pouvez constater que vous n’avez qu’une "fonctionnalité" à la fois dans pts
et dans polys
. Cela signifie que vous construisez une entité "multipolygone" (c'est-à-dire un polygone constitué de 3 parties) au lieu de trois polygones différents. La même chose vaut pour les points.
Après avoir creusé un peu, j'ai trouvé cette façon différente (et à mon avis plus facile) de construire les géométries, en utilisant la notation WKT:
polys <- st_as_sfc(c("POLYGON((0 0 , 0 1 , 1 1 , 1 0, 0 0))",
"POLYGON((0 0 , 0 2 , 2 2 , 2 0, 0 0 ))",
"POLYGON((0 0 , 0 -1 , -1 -1 , -1 0, 0 0))")) %>%
st_sf(ID = paste0("poly", 1:3))
pts <- st_as_sfc(c("POINT(0.5 0.5)",
"POINT(0.6 0.6)",
"POINT(3 3)")) %>%
st_sf(ID = paste0("point", 1:3))
> polys
Simple feature collection with 3 features and 1 field
geometry type: POLYGON
dimension: XY
bbox: xmin: -1 ymin: -1 xmax: 2 ymax: 2
epsg (SRID): NA
proj4string: NA
ID .
1 poly1 POLYGON((0 0, 0 1, 1 1, 1 0...
2 poly2 POLYGON((0 0, 0 2, 2 2, 2 0...
3 poly3 POLYGON((0 0, 0 -1, -1 -1, ...
> pts
Simple feature collection with 3 features and 1 field
geometry type: POINT
dimension: XY
bbox: xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3
epsg (SRID): NA
proj4string: NA
ID .
1 point1 POINT(0.5 0.5)
2 point2 POINT(0.6 0.6)
3 point3 POINT(3 3)
vous pouvez constater que maintenant polys
et pts
ont trois caractéristiques.
Nous pouvons maintenant trouver la "matrice d'intersection" en utilisant:
# Determine which points fall inside which polygons
pi <- st_contains(polys,pts, sparse = F) %>%
as.data.frame() %>%
mutate(polys = polys$ID) %>%
select(dim(pi)[2],1:dim(pi)[1])
colnames(pi)[2:dim(pi)[2]] = levels(pts$ID)
> pi
polys point1 point2 point3
1 poly1 TRUE TRUE FALSE
2 poly2 TRUE TRUE FALSE
3 poly3 FALSE FALSE FALSE
ce qui signifie (comme l'a souligné @symbolixau dans les commentaires) que les polygones 1 et 2 contiennent les points 1 et 2, alors que le polygone 3 ne contient aucun point. Le point 3 n'est au contraire contenu dans aucun polygone.
HTH.
Je vois une sortie différente:
> # Determine which points fall inside which polygons
> st_join(pts, polys, join = st_contains)
Simple feature collection with 1 feature and 0 fields
geometry type: MULTIPOINT
dimension: XY
bbox: xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3
epsg (SRID): NA
proj4string: NA
geometry
1 MULTIPOINT(0.5 0.5, 0.6 0.6...
Était-ce avec la version CRAN la plus récente de sf
?
Notez que le jeu original de multipoints et de multipolygones peut être converti en un point et un polygone sans créer de nouveaux objets
st_contains(polys %>% st_cast("POLYGON"), pts %>% st_cast("POINT"), sparse = F)
# [,1] [,2] [,3]
#[1,] TRUE TRUE FALSE
#[2,] TRUE TRUE FALSE
#[3,] FALSE FALSE FALSE