Agregando puntos a la cuadrícula usando R

13

Tengo una pregunta con respecto a la agregación espacial en R. Lo que estoy tratando de hacer es agregar un conjunto de datos de puntos a una cuadrícula. Sin embargo, no estoy seguro de cómo hacerlo, ya que tengo poca experiencia con este tipo de cosas. Esperaba que alguno de ustedes pudiera tener alguna orientación útil / una posible solución.

Mi punto de vista es un conjunto de datos que contiene datos georreferenciados sobre eventos de conflicto en África (consulte www.acleddata.com). Los puntos están georreferenciados con coordenadas de latitud / longitud y contienen datos sobre el tipo de evento y la hora. Lo que quiero hacer es agregar estos puntos a una cuadrícula de 1x1 grados.

Por lo tanto, una celda de cuadrícula debe contener la información de los puntos de datos si ocurre un evento dentro de esa celda de cuadrícula. El producto final de esto debería ser un marco de datos o algo que pueda exportar a un archivo csv, ya que los datos se utilizarán en un conjunto de datos de panel para el análisis estadístico.

Hasta ahora, cargué y graficé los datos y el shapefile usando el código a continuación. Creo que debería usar la función sobre del paquete sp para Agregado pero no sé cómo. Espero que alguno de ustedes pueda ayudar.

El código que usé hasta ahora se puede encontrar aquí con el resultado visual correspondiente sobre there .

La sugerencia para hacer esto en QGIS también es bienvenida.

    
pregunta BlankUsername 18.01.2013 - 13:41

2 respuestas

11

Los datos tal como se descargan contienen algunos errores de ubicación francos, por lo que lo primero que debe hacer es limitar las coordenadas a valores razonables:

data.df <- read.csv("f:/temp/All_Africa_1997-2011.csv", header=TRUE, sep=",",row.names=NULL)
data.df <- subset(data.df, subset=(LONGITUDE >= -180 & LATITUDE >= -90))

Calcular coordenadas e identificadores de celdas de la cuadrícula es simplemente una cuestión de truncar los decimales de los valores de latitud y longitud. (De manera más general, para rásteres arbitrarios, primero centre y escale a celdas unitarias, trunque los decimales, y luego vuelva a escalar y vuelva a su posición original, como se muestra en el código para ji a continuación). Podemos combinar estas coordenadas en identificadores únicos, adjúntelos al marco de datos de entrada y escriba el marco de datos aumentado como un archivo CSV. Habrá un registro por punto:

ji <- function(xy, origin=c(0,0), cellsize=c(1,1)) {
  t(apply(xy, 1, function(z) cellsize/2+origin+cellsize*(floor((z - origin)/cellsize))))
}
JI <- ji(cbind(data.df$LONGITUDE, data.df$LATITUDE))
data.df$X <- JI[, 1]
data.df$Y <- JI[, 2]
data.df$Cell <- paste(data.df$X, data.df$Y)

En su lugar, es posible que desee una salida que resuma los eventos dentro de cada celda de la cuadrícula. Para ilustrar esto, vamos a calcular los recuentos por celda y generarlos, un registro por celda:

counts <- by(data.df, data.df$Cell, function(d) c(d$X[1], d$Y[1], nrow(d)))
counts.m <- matrix(unlist(counts), nrow=3)
rownames(counts.m) <- c("X", "Y", "Count")
write.csv(as.data.frame(t(counts.m)), "f:/temp/grid.csv")

Para otros resúmenes, cambie el argumento function en el cálculo de counts . (De manera alternativa, use el software de hoja de cálculo o de base de datos para resumir el primer archivo de salida por identificador de celda).

A modo de verificación, asignemos los recuentos utilizando la cuadrícula centros para ubicar los símbolos del mapa. (Los puntos ubicados en el Mar Mediterráneo, Europa y el Océano Atlántico tienen ubicaciones sospechosas: sospecho que muchos de ellos resultan de la mezcla de latitud y longitud en el proceso de entrada de datos).

count.max <- max(counts.m["Count",])
colors = sapply(counts.m["Count",], function(n) hsv(sqrt(n/count.max), .7, .7, .5))
plot(counts.m["X",] + 1/2, counts.m["Y",] + 1/2, cex=sqrt(counts.m["Count",]/100),
     pch = 19, col=colors,
     xlab="Longitude of cell center", ylab="Latitude of cell center",
     main="Event counts within one-degree grid cells")

Este flujo de trabajo es ahora

  • Completamente documentado (por medio del código R ),

  • Reproducible (mediante la ejecución de este código),

  • Extensible (modificando el código de manera obvia), y

  • Razonablemente rápido (la operación completa toma menos de 10 segundos para procesar estas 53052 observaciones).

respondido por el whuber 18.01.2013 - 16:22
3

Bueno, lo que desea es una llamada básica "Unión espacial", que combina dos shapefiles entre sí y asigna la suma (número de conteo) a la tabla de atributos resultante. Si busca "Unión espacial en R", encontrará numerosos ejemplos incluso aquí en GIS.Stackexchange. Busqué en Google rápidamente y encontré, por ejemplo, este código publicado en una lista de correo.

Si desea lograr una combinación de atributos espaciales en QGIS, haga lo siguiente:

  • Guarde sus formas como archivos .shp (comando writeOGR del paquete rgdal)
  • cargarlos en QGIS. Vuelva a crear su cuadrícula vectorial a través del complemento MMQGIS (Crear - > Crear Capa de Cuadrícula) con la escala adecuada.
  • Use la herramienta "Unir atributos" de Vector - > Menú de gestión de datos. Seleccione un atributo de su capa de puntos (esto podría ser una columna simple que represente los valores de VERDADERO (1) o FALSO (0) para diferentes eventos de conflicto).
  • Selecciona tu cuadrícula y suma todas las ocurrencias y ejecuta. Luego, también recortaría su cuadrícula con una forma del continente africano.

Si la unión falla de alguna manera (no me funciona siempre), apégate a SEXTANTE y busca la caja de herramientas SAGA, que también tiene muy buenas funciones de unión.

    
respondido por el Curlew 18.01.2013 - 14:31

Lea otras preguntas en las etiquetas