Comprobando si los puntos caen dentro del polígono Shapefile

19

Zillow tiene un conjunto de archivos de forma para diferentes vecindarios de las principales ciudades de EE. UU. Quería verificar si ciertos edificios estaban presentes en ciertos vecindarios usando R:

library(rgeos)
library(sp)
library(rgdal)

df <- data.frame(Latitude =c(47.591351, 47.62212,47.595152),
                 Longitude = c(-122.332271,-122.353985,-122.331639),
                 names = c("Safeco Field", "Key Arena", "Century Link"))
coordinates(df) <- ~ Latitude + Longitude

wa.map <- readOGR("ZillowNeighborhoods-WA.shp", layer="ZillowNeighborhoods-WA")

sodo <- wa.map[wa.map$CITY == "Seattle"  & wa.map$NAME == "Industrial District", ]

Puedo trazar sin problemas

plot(sodo)
points(df$Latitude ~ df$Longitude, col = "red", cex = 1)

ingrese la descripción de la imagen aquí

proj4Coincido con la cadena del archivo de forma a mi data.frame

CRSobj <- CRS("+proj=longlat +datum=NAD83 +no_defs +ellps=GRS80 +towgs84=0,0,0 ")
df@proj4string <- CRSobj

over(df, sodo)

Esto solo me da un montón de NAvalores. He intentado esta respuesta

spp <- SpatialPoints(df)
spp@proj4string <- CRSobj
over(spp, sodo)

pero aun así solo obtengo NAvalores. ¿Alguna idea de qué más debería probar?

Tacaño
fuente

Respuestas:

20

El espacio data.frameno está formado correctamente. Esto podría funcionar:

library(rgeos)
library(sp)
library(rgdal)

wa.map <- readOGR("ZillowNeighborhoods-WA.shp", layer="ZillowNeighborhoods-WA")

sodo <- wa.map[wa.map$CITY == "Seattle"  & wa.map$NAME == "Industrial District", ]

# Don't use df as name, it is an R function
# Better to set longitudes as the first column and latitudes as the second
dat <- data.frame(Longitude = c(-122.332271,-122.353985,-122.331639),
                  Latitude =c(47.591351, 47.62212,47.595152),
                  names = c("Safeco Field", "Key Arena", "Century Link"))
# Assignment modified according
coordinates(dat) <- ~ Longitude + Latitude
# Set the projection of the SpatialPointsDataFrame using the projection of the shapefile
proj4string(dat) <- proj4string(sodo)

over(dat, sodo)
#  STATE COUNTY    CITY                NAME REGIONID
#1    WA   King Seattle Industrial District   271892
#2  <NA>   <NA>    <NA>                <NA>       NA
#3  <NA>   <NA>    <NA>                <NA>       NA

over(sodo, dat)
#           names
#122 Safeco Field

fuente
7

Acabo de hacer lo mismo. La respuesta de Pascal casi lo cubre, pero es posible que necesite dos pasos adicionales como a continuación.

#After you create your list of latlongs you must set the proj4string to longlat
proj4string(dat) <- CRS("+proj=longlat")

#Before you re-set the proj4string to the one from sodo you must actually convert #your coordinates to the new projection
dat <- spTransform(dat, proj4string(sodo))
John Curry
fuente
No me queda claro en qué casos se necesitan estos pasos adicionales. Para mí, la solución de la respuesta del usuario32309 fue lo suficientemente buena.
djhurio
3
Depende del formato en el que se encuentren sus datos. Si está en la proyección A y solo desea declarar que usa proj4string, debería ser bueno. Pero si está en la proyección B y necesita hacer una conversión a la proyección A, debe usar spTransform.
John Curry
2

Utilicé un enfoque similar a la respuesta aceptada en esta publicación, pero nunca estuve realmente satisfecho con ella, así que busqué alternativas y encontré la biblioteca sf .

Y usando esta biblioteca, puede escribir código como este:

library(sf)
# Shapefile from ABS: 
# https://www.abs.gov.au/AUSSTATS/[email protected]/DetailsPage/1270.0.55.004July%202016?OpenDocument
map = read_sf("data/ABS/shapes/SUA_2016_AUST.shp")

pnts_sf <- st_as_sf(pnts, coords = c('y', 'x'), crs = st_crs(map))

pnts <- pnts_sf %>% mutate(
  intersection = as.integer(st_intersects(geometry, map))
  , area = if_else(is.na(intersection), '', map$SUA_NAME16[intersection])
) 

pnts

Salida:

         geometry intersection area    
*     <POINT [°]>        <int> <chr>   
1 (138.62 -34.92)           79 Adelaide
2 (138.58 -34.93)           79 Adelaide
3 (138.52 -34.95)           79 Adelaide
4 (152.71 -27.63)           60 Brisbane
5 (153.01 -27.57)           60 Brisbane
6  (150.73 -33.9)           31 Sydney  
7 (150.99 -33.92)           31 Sydney 

Publiqué este código en otra publicación que era una pregunta similar, aquí: Identifique el punto que contiene el polígono con el paquete R sf

Michael Gordon
fuente