23 votos

equivalente del paquete sp punto en polígono / overing usando sf

Estoy migrando código del paquete sp al más nuevo paquete sf. Mi código anterior tenía un polígono SpatialDataFrame (censimentoMap) y un SpatialPointDataFrame (indirizzi.sp) y obtuve el id de celda del polígono ("Cell110") para cada punto que yacía dentro con la siguiente instrucción:

points.data <- over(indirizzi.sp, censimentoMap[,"Cell110"])

En realidad he creado dos objetos sf:

shape_sf <- st_read(dsn = shape_dsn) shape_sf <- st_transform(x=shape_sf, crs=crs_string) y indirizzi_sf = st_as_sf(df, coords = c("lng", "lat"), crs = crs_string)

Y estoy buscando el equivalente en sf de la instrucción anterior... ¿Podría ser?

ids<-sapply(st_intersects(x=indirizzi_sf,y=shshape_sfpeCrif), function(z) if (length(z)==0) NA_integer_ else z[1]) cell_ids <- shape_sf[ids,"Cell110"]

24voto

sebdalgarno Puntos 266

Puede obtener el mismo resultado utilizando st_join: Primero cree un polígono de demostración y algunos puntos con sf.

library(sf)
library(magrittr)

poly <- st_as_sfc(c("POLYGON((0 0 , 0 1 , 1 1 , 1 0, 0 0))")) %>% 
  st_sf(ID = "poly1")    

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))

ahora vea el resultado usando over en objetos sp

over(as(pts, "Spatial"), as(polys, "Spatial"))
>#      ID
># 1 poly1
># 2 poly1
># 3  <NA>

ahora equivalente con sf st_join

st_join(pts, poly, join = st_intersects)
># Simple feature collection with 3 features and 2 fields
># geometry type:  POINT
># dimension:      XY
># bbox:           xmin: 0.5 ymin: 0.5 xmax: 3 ymax: 3
># epsg (SRID):    NA
># proj4string:    NA
>#     ID.x  ID.y               .
># 1 point1 poly1 POINT (0.5 0.5)
># 2 point2 poly1 POINT (0.6 0.6)
># 3 point3  <NA>     POINT (3 3)

o para obtener exactamente el mismo resultado

as.data.frame(st_join(pts, poly, join = st_intersects))[2] %>% setNames("ID")

>#    ID
># 1 poly1
># 2 poly1
># 3  <NA>

3voto

cgross Puntos 146

En lugar de utilizar

st_join(pts, poly, join = st_intersects)

puede utilizar

st_intersection(pts, poly)

Es más rápido y sólo da los puntos que están dentro del polígono.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X