Estoy tratando de realizar una unión espacial entre datos de puntos y datos de polígonos.
Tengo datos que indican las coordenadas espaciales de un evento en mi archivo csv A y tengo otro archivo, shapefile B, que contiene los límites de un área como polígonos.
head(A)
month longitude latitude lsoa_code crime_type
1 2014-09 -1.550626 53.59740 E01007359 Anti-social behaviour
2 2014-09 -1.550626 53.59740 E01007359 Public order
3 2014-09 -1.865236 53.93678 E01010646 Anti-social behaviour
head(B@data)
code name altname
0 E05004934 Longfield, New Barn and Southfleet <NA>
1 E05000448 Lewisham Central <NA>
2 E05003149 Hawcoat <NA>
Quiero unir los datos del crimen A a mi archivo de forma B para mapear los eventos del crimen que suceden en mi área A. Lamentablemente, no puedo realizar una unión de atributos basada en code
que el código en A se refiere a unidades diferentes al código en B.
He leído varios tutoriales y publicaciones, pero no pude encontrar una respuesta. Lo intenté:
joined = over(A, B)
y overlay
, pero no logró lo que quería.
¿Hay alguna manera de hacer esta unión directamente o sería necesaria una transformación intermedia de A a otro formato?
Conceptualmente, quiero seleccionar aquellos puntos de A que caen en las code
áreas de B (similar a "unirse según la ubicación espacial en ArcGIS").
¿Alguien tuvo este problema y lo resolvió?
fuente
point.in.polygon()
en el paquetesp
?point.in.polygon
si esto preservaría las variablesmonth
ycrime_type
. ¿Sabe usted acerca de eso?point.in.poly
y finalmente he seleccionado los puntos que se encuentran en los polígonos relevantes. Gracias.Respuestas:
La función point.in.poly en el paquete spatialEco devuelve un objeto SpatialPointsDataFrame de los puntos que se cruzan con un objeto de polígono sp y opcionalmente agrega los atributos de polígono.
Primero agreguemos los paquetes requeridos y creemos algunos datos de ejemplo.
Ahora, echemos un vistazo rápido a los datos y tracémoslos.
Finalmente, podemos intersecar los puntos con los polígonos. Los resultados serán un objeto SpatialPointsDataFrame con, en este caso, dos atributos adicionales (PIDS, y) contenidos en los datos del polígono srdf.
Si no hay una columna de identificación única en los datos del polígono, puede agregar fácilmente una.
Una vez que tenemos los puntos y los polígonos intersectados, podemos agregar los puntos utilizando las ID de polígono únicas que eran un atributo en los datos del polígono.
fuente
sp::point.in.polygon
en realidad devuelve un valor numérico (0 = el punto está afuera, 1 = adentro, 2 = en el borde, 3 = en el vértice). Podría ser lo correcto para algunas circunstancias. Pensé que era útil tener en cuenta aquí, ya que este es un resultado superior de Google para términos relacionadosover()
del paquetesp
puede ser un poco confuso pero funciona bien. Supongo que ya has hecho "A" espacial concoordinates(A) <- ~longitude+latitude
:En lugar de un objeto espacial puntual, esto simplemente le da un marco de datos, con el mismo no. filas como A y un único "código" variable de cada polígono de intersección de B.
fuente
over()
que tengo problemas con los puntos en los vértices de los polígonos, aunque creo que esta es la solución más fácil que he encontrado hasta ahora.Aquí hay una solución como dplyr:
Los datos de población provienen de: https://www.ons.gov.uk/peoplepopulationandcommunity/populationandmigration/populationestimates/datasets/parliamentaryconstituencymidyearpopulationestimates
Tuve que convertir los archivos de forma descargados de geoJson: https://geoportal.statistics.gov.uk/datasets/westminster-parliamentary-constituencies-december-2018-uk-bgc/data?page=1
Puedes hacerlo de la siguiente manera:
fuente