¿Cómo calcular las coordenadas máximas y mínimas para múltiples polígonos?

8

Me gustaría calcular las coordenadas latidudinales máximas, medias y mínimas para un gran conjunto de polígonos, usando QGIS o R. Entonces, los puntos más altos y más bajos alcanzados por cada polígono a través de un rango latidudinal. Las coordenadas centrales son fáciles de hacer, pero convertir los polígonos en puntos y usar una matriz de distancia en QGIS bloquea mi computadora. ¿Hay una manera más eficiente de hacer esto?

Se ha preguntado de varias formas aquí, pero 1. No está claro 2. Desactualizado Creo que es una versión inteligente o 3. Se bloquea en mi PC ya que tengo alrededor de 2000 polígonos.

Invitado2345234562
fuente

Respuestas:

7

Puedes hacerlo así:

library(raster)
# example data
g <- getData('GADM', country='BRA', level=1)

ext <- t(sapply(1:length(g), function(i) as.vector(extent(g[i,]))))
colnames(ext) <- c('xmin', 'xmax', 'ymin', 'ymax')

head(ext)
#          xmin      xmax       ymin      ymax
#[1,] -73.98971 -66.58875 -11.145161 -7.121320
#[2,] -38.23634 -35.15182 -10.501529 -8.814987
#[3,] -54.87619 -49.86681  -1.236008  4.442360
#[4,] -73.79568 -56.09750  -9.814520  2.246201
#[5,] -46.61705 -37.34903 -18.349859 -8.533636
#[6,] -41.42347 -37.25208  -7.858196 -2.784583

Y continúa así:

d <- data.frame(state=g$NAME_1, ext)
head(d)

#     state      xmin      xmax       ymin      ymax
#1     Acre -73.98971 -66.58875 -11.145161 -7.121320
#2  Alagoas -38.23634 -35.15182 -10.501529 -8.814987
#3    Amapá -54.87619 -49.86681  -1.236008  4.442360
#4 Amazonas -73.79568 -56.09750  -9.814520  2.246201
#5    Bahia -46.61705 -37.34903 -18.349859 -8.533636
#6    Ceará -41.42347 -37.25208  -7.858196 -2.784583
Robert Hijmans
fuente
¡Agradable! ---------------------
mdsumner
Bueno, eso es simplemente elegante. Todas las respuestas parecen hacer el truco, pero esto gana imo por su eficiencia y simplicidad. ¡Gracias!
Guest2345234562
5

En QGIS, puede usar la herramienta Polígono de extensión de capa ... de la barra de herramientas ( Vector> Herramientas de investigación> Polígono de extensión de capa ... ).

Básicamente, esto genera una capa de cuadro delimitador para cada entidad (si selecciona la opción) con campos que contienen las coordenadas del máximo, centro y mínimo de X e Y junto con algunas otras estadísticas:

Polígono de extensión de capa

Ejemplo de polígono

Tabla de atributos de resultados

José
fuente
1
Creo que eso funciona, ¡gracias! Sin embargo, y esta puede ser una pregunta general de QGIS: no conserva la identificación del objeto. ¿Es el orden de las salidas el mismo que el polígono de entrada? ¿Hay alguna manera de asegurarse de que es así, es decir, hacer coincidir cada cuadro delimitador correcto con los otros datos en el archivo de forma original.
Guest2345234562
@ Guest2345234562 - ¡Bienvenido amigo! Sí, creo que el orden de las salidas coincide con las entradas. Hice una comprobación rápida uniendo espacialmente las capas (por ejemplo, usando la herramienta Unir atributos por ubicación ) y parecen coincidir muy bien.
Joseph
¿Alguien sabe dónde está esto en QGIS 3? Gracias
Ian Allan
5

En R

  1. léelos con x <- gdal::readOGR(datasource, layername)casi cualquier formato

  2. use la as(x, "class")coerción para convertir de polígonos a sus límites de línea a sus puntos componentes (y, de manera práctica, registre las identificaciones de objeto y anillo)

  3. Use funciones de resumen de la manera estándar para X / Y agrupadas por ID de polígono

Ejemplo:

library(rgdal)
dsn <- system.file("vectors/ps_cant_31.MIF", package = "rgdal")[1]
ogrInfo(dsn=dsn, layer="ps_cant_31")
ps_cant_31 <- readOGR(dsn=dsn, layer="ps_cant_31")

## cast to lines and then to points (creates columns  Lines.NR, Lines.ID,     Line.NR to identify pieces)

p <-  as(as(ps_cant_31, "SpatialLinesDataFrame"), "SpatialPointsDataFrame")
coords <- coordinates(p)
## see that Lines.NR groups your original polygons (nrow(ps_cant_31))
#spplot(p["Lines.NR"])

## summarize the Y-coordinate into groups defined by original polygon object
tapply(coords[,2], p$Lines.NR, median)
tapply(coords[,2], p$Lines.NR, max)
tapply(coords[,2], p$Lines.NR, min)

Usted menciona "rango de latitud" pero no especifica si sus coordenadas están en un sistema de coordenadas proyectadas, si es así, debe asegurarse de que se desproyecta y clasifica por latitud (no solo Y) si ese es el caso.

Me altamente recomiendo que echa un vistazo dplyra la última resumir, de R incorporado en las herramientas son muy potentes, pero tedioso en retrospectiva. Desafortunadamente sp, necesita convertir manualmente entre matrices de coordenadas y data.frameformar de manera bastante rutinaria para obtener este tipo de respuestas, pero todo es factible.

Finalmente, si esto es realmente lo que busca, no tomará ningún tiempo en absoluto, siempre que sus recursos de memoria virtual coincidan con el conjunto de datos que tiene, para leerlo todo de una vez y hacer el trabajo en uno paso como este

mdsumner
fuente
3

En QGIS, puede usar expresiones para agregar campos usando la Calculadora de campo

Las siguientes expresiones le darán las coordenadas mínimas y máximas para el polígono.

xmin($geometry)
xmax($geometry)
ymin($geometry)
ymax($geometry)

Para las coordenadas centrales, puede usar

xmin(centroid($geometry))
ymin(centroid($geometry))
pensamientos espaciales
fuente