6 votos

Estadísticas de puntos individuales de la red más cercana de vecinos

He shp de puntos, donde cada punto es el centro de gravedad de las células individuales de un 1*a 1 km de la cuadrícula (~ 500 000 puntos). Para cada uno de estos puntos, que tienen sus coordenadas y elevación.

Lo que yo quiero: para cada uno de estos puntos, quiero calcular la media, std dev, min, max y mediana elevación de la más cercana 8 puntos circundantes.

Lo que hice hasta ahora: escribí un R script para identificar cada uno de los puntos más próximos de cada uno de los puntos de la rejilla. Pero teniendo en cuenta el tamaño de la dbf y el general de la lentitud de R, se tarda una eternidad.

Mis herramientas: QGIS, ArcGIS, SAS, R, o cualquier otro software libre si es necesario.

¿Alguno tiene alguna sugerencia para hacer esto (1 - identificar a los vecinos directos, 2 - calcular estadísticas de resumen de la elevación de estos vecinos) en una forma más eficiente, la utilización de los SIG?

2voto

Robert J. Walker Puntos 3712

Hay el spdep paquete de R, que tiene un algoritmo de vecino K-más cercano a implementado. No estoy seguro si su más eficiente que lo que tienes, pero puede ser vale la pena intentarlo.

Aquí es un script de ejemplo para mostrar cómo puede calcular los valores quería y ponerlos en un marco de datos.

# Load spdep package
library(spdep)

# Load example data
# (replace this by loading your shapefile)
example(columbus)

# Extract coordinates from shape
coords <- coordinates(columbus)

# Use the area of the example data as a replacement for elevation
# (select column with elevation value from attribute table here)
area.vector <- columbus$AREA

# Calculate K nearest neighbors using spdep package
col.knn <- knearneigh(coords, k=8)

# Extract neighbor index matrix
neighbors <- col.knn$nn

# Prepare empty dataframe for calculations
output<-data.frame(area.vector, mean=NA, sd=NA, min=NA, max=NA, median=NA)

# Loop over neighbors matrix, calculate values
for(i in 1:nrow(columbus)){
    values <- area.vector[neighbors[i,]]
    output[i,2:6] <- c(mean(values), sd(values), min(values), max(values), median(values))
}

# View head of output to see if it worked
head(output)

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