Como calcular coordenadas max e min para vários polígonos?

8

Gostaria de calcular as coordenadas latidudinal máxima, mediana e mínima para um grande conjunto de polígonos, usando QGIS ou R. Portanto, os pontos mais altos e mais baixos alcançados por cada polígono em um intervalo latidudinal. As cordas centrais são fáceis de fazer, mas a conversão dos polígonos em pontos e o uso de uma matriz de distância no QGIS trava meu computador. Existe uma maneira mais eficiente de fazer isso?

Já foi perguntado de várias formas aqui, mas 1. Não está claro 2. Desatualizado, acho a versão sensata ou 3. trava no meu PC, pois tenho cerca de 2000 polígonos.

Convidado2345234562
fonte

Respostas:

7

Você pode fazer assim:

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

E continue assim:

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
fonte
Agradável! ---------------------
mdsumner
Bem, isso é apenas elegante. Todas as respostas parecem fazer o truque, mas isso ganha imo por eficiência e simplicidade. Obrigado!
precisa saber é o seguinte
5

No QGIS, você pode usar a ferramenta Polígono da extensão da camada ... na barra de ferramentas ( Vetor> Ferramentas de pesquisa> Polígono da extensão da camada ... ).

Isso gera essencialmente uma camada de caixa delimitadora para cada recurso (se você selecionar a opção) com campos contendo as coordenadas do máximo, centro e min de X e Y, juntamente com algumas outras estatísticas:

Polígono da extensão da camada

Exemplo de polígono

Tabela de Atributos de Resultados

Joseph
fonte
1
Eu acho que faz o truque - obrigado! No entanto, e isso pode ser uma pergunta geral do QGIS - ele não conserva o ID do objeto. A ordem das saídas é igual ao polígono de entrada? Existe uma maneira de garantir que sim, ou seja, combinando cada caixa delimitadora correta com os outros dados no shapefile original.
Guest2345234562
@ Guest2345234562 - Muito bem-vindo amigo! Sim, acredito que a ordem das saídas corresponde às entradas. Eu fiz uma verificação rápida juntando espacialmente as camadas (por exemplo, usando os atributos Join por ferramenta de localização ) e elas parecem se encaixar perfeitamente.
Joseph
Alguém sabe onde isso está no QGIS 3? Obrigado
Ian Allan
5

Em R

  1. leia-os com x <- gdal::readOGR(datasource, layername)praticamente qualquer formato

  2. use as(x, "class")coerção para converter de polígonos em seus limites de linha em seus pontos componentes (e com facilidade, registre os IDs de objeto e anel)

  3. Use funções de resumo da maneira padrão para o X / Y agrupado por ID de polígono

Exemplo:

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)

Você menciona "intervalo de latitude", mas não especifica se suas coordenadas estão em um sistema de coordenadas projetadas; se houver, é necessário garantir que você não projete e classifique por latitude (não apenas Y), se for o caso.

Eu altamente recomendo que você verifique dplyrpara o resumindo final, de R built-in ferramentas são muito poderoso, mas cansativo em retrospectiva. Infelizmente, spvocê precisa converter manualmente entre matrizes de coordenadas e data.frameformar bastante rotineiramente para obter esse tipo de resposta, mas tudo é possível.

Por fim, se é realmente isso que você procura, não demorará nada, desde que seus recursos de memória virtual correspondam ao conjunto de dados que você possui, para ler tudo de uma vez e fazer o trabalho de uma só vez. passo assim.

mdsumner
fonte
3

No QGIS, você pode usar expressões para adicionar campos usando a Calculadora de Campos

As seguintes expressões fornecerão as coordenadas mínima e máxima do polígono

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

Para coordenadas centrais, você pode usar

xmin(centroid($geometry))
ymin(centroid($geometry))
pensamentos espaciais
fonte