Comment calculer les coordonnées max et min pour plusieurs polygones?

8

Je voudrais calculer les coordonnées latidudinales maximales, médianes et minimales pour un grand ensemble de polygones, en utilisant QGIS ou R. Donc, les points les plus hauts et les plus bas atteints par chaque polygone sur une plage latidudinale. Les coordonnées centrales sont faciles à faire, mais la conversion des polygones en points et l'utilisation d'une matrice de distance dans QGIS font planter mon ordinateur. Existe-t-il une manière plus efficace de procéder?

Il a été demandé sous différentes formes ici, mais soit 1. Pas clair 2. obsolète, je pense que la version est sage ou 3. plante sur mon PC car j'ai environ 2000 polygones.

Guest2345234562
la source

Réponses:

7

Vous pouvez le faire comme ceci:

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

Et continuez comme ceci:

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
la source
Agréable! ---------------------
mdsumner
C'est juste élégant. Toutes les réponses semblent faire l'affaire, mais cela gagne en efficacité et en simplicité. Je vous remercie!
Guest2345234562
5

Dans QGIS, vous pouvez utiliser l' outil Polygone de l'étendue de la couche ... de la barre d'outils ( Vector> Outils de recherche> Polygone de l'étendue de la couche ... ).

Cela génère essentiellement une couche de boîte englobante pour chaque entité (si vous sélectionnez l'option) avec des champs contenant les coordonnées des max, centre et min de X et Y ainsi que quelques autres statistiques:

Polygone à partir de l'étendue de la couche

Exemple de polygone

Tableau d'attributs des résultats

Joseph
la source
1
Je pense que ça fait l'affaire - merci! Cependant, et cela peut être une question générale de QGIS - il ne conserve pas l'ID d'objet. L'ordre des sorties est-il le même que le polygone d'entrée? Existe-t-il un moyen de s'assurer qu'il l'est, c'est-à-dire de faire correspondre chaque boîte de délimitation correcte avec les autres données du fichier de formes d'origine.
Guest2345234562
@ Guest2345234562 - Bienvenu mon pote! Oui, je crois que l'ordre des sorties correspond aux entrées. J'ai fait une vérification rapide en joignant spatialement les couches (par exemple en utilisant l' outil d' attributs Join par emplacement ) et elles semblent bien correspondre.
Joseph
Quelqu'un sait-il où cela se trouve dans QGIS 3? Merci
Ian Allan
5

Dans R

  1. les lire avec à x <- gdal::readOGR(datasource, layername)partir de n'importe quel format

  2. utiliser la as(x, "class")coercition pour convertir des polygones à leurs limites de ligne en leurs points de composants (et enregistrer facilement les ID d'objet et d'anneau)

  3. Utilisez les fonctions récapitulatives de la manière standard pour les X / Y regroupés par ID de polygone

Exemple:

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)

Vous mentionnez «plage de latitude» mais ne spécifiez pas si vos coordonnées sont dans un système de coordonnées projeté, si elles le sont, vous devez vous assurer de ne pas projeter et de classer par latitude (pas seulement Y) si tel est le cas.

Je vous recommande fortement de vérifier dplyrpour le résumé final, les outils intégrés de R sont très puissants mais fastidieux avec le recul. Malheureusement, spvous devez convertir manuellement entre des tableaux de coordonnées et data.frameformer assez régulièrement pour obtenir ce type de réponses, mais tout est faisable.

Enfin, si c'est réellement ce que vous recherchez, cela ne prendra pas de temps du tout, tant que vos ressources de mémoire virtuelle correspondent à l'ensemble de données que vous avez, pour tout lire en même temps et faire le travail en un étape comme ça.

mdsumner
la source
3

Dans QGIS, vous pouvez utiliser des expressions pour ajouter des champs à l'aide de la calculatrice de champs

Les expressions suivantes vous donneront les coordonnées min et max du polygone

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

Pour les coordonnées du centre, vous pouvez utiliser

xmin(centroid($geometry))
ymin(centroid($geometry))
pensées spatiales
la source