Wie berechnet man die Max- und Min-Koordinaten für mehrere Polygone?

8

Ich möchte die maximalen, mittleren und minimalen latidudinalen Koordinaten für einen großen Satz von Polygonen mit QGIS oder R berechnen. Also die höchsten und niedrigsten Punkte, die jedes Polygon über einen latidudinalen Bereich erreicht. Zentrale Koordinaten sind einfach durchzuführen, aber das Konvertieren der Polygone in Punkte und die Verwendung einer Distanzmatrix in QGIS stürzt meinen Computer ab. Gibt es einen effizienteren Weg, dies zu tun?

Es wurde hier in verschiedenen Formen gefragt, aber entweder 1. Unklar 2. Veraltet, denke ich, in Bezug auf die Version oder 3. Abstürze auf meinem PC, da ich ungefähr 2000 Polygone habe.

Gast2345234562
quelle

Antworten:

7

Sie können es so machen:

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

Und so weiter:

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
quelle
Nett! ---------------------
mdsumner
Nun, das ist einfach elegant. Alle Antworten scheinen den Trick zu tun, aber dies gewinnt imo für Effizienz und Einfachheit. Vielen Dank!
Gast2345234562
5

In QGIS können Sie das Werkzeug Polygon aus Ebenenbereich ... in der Symbolleiste verwenden ( Vektor> Forschungswerkzeuge> Polygon aus Ebenenbereich ... ).

Dies gibt im Wesentlichen eine Begrenzungsrahmenebene für jedes Feature aus (wenn Sie die Option auswählen) mit Feldern, die die Koordinaten von max, center und min von X und Y zusammen mit einigen anderen Statistiken enthalten:

Polygon aus Ebenenbereich

Polygon-Beispiel

Attributtabelle der Ergebnisse

Joseph
quelle
1
Ich denke, das macht den Trick - danke! Dies kann jedoch eine allgemeine QGIS-Frage sein - die Objekt-ID wird nicht beibehalten. Entspricht die Reihenfolge der Ausgaben dem Eingabepolygon? Gibt es eine Möglichkeit, dies sicherzustellen, dh jeden korrekten Begrenzungsrahmen mit den anderen Daten im ursprünglichen Shapefile abzugleichen?
Guest2345234562
@ Guest2345234562 - Herzlich willkommen Kumpel! Ja, ich glaube, die Reihenfolge der Ausgänge stimmt mit den Eingängen überein. Ich habe eine schnelle Überprüfung durchgeführt, indem ich die Ebenen räumlich verbunden habe (z. B. mithilfe des Werkzeugs Attribute nach Position verbinden ), und sie scheinen gut zusammen zu passen.
Joseph
Weiß jemand, wo dies in QGIS 3 ist? Vielen Dank
Ian Allan
5

In R.

  1. Lesen Sie sie mit x <- gdal::readOGR(datasource, layername)aus nahezu jedem Format

  2. Verwenden Sie as(x, "class")Zwang, um von Polygonen zu ihren Liniengrenzen zu ihren Komponentenpunkten zu konvertieren (und zeichnen Sie die Objekt- und Ring-IDs auf einfache Weise auf).

  3. Verwenden Sie Zusammenfassungsfunktionen in der Standardmethode für das nach Polygon-ID gruppierte X / Y.

Beispiel:

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)

Sie erwähnen "Breitengradbereich", geben jedoch nicht an, ob sich Ihre Koordinaten in einem projizierten Koordinatensystem befinden. Wenn dies der Fall ist, müssen Sie sicherstellen, dass Sie die Projektion aufheben und nach Breitengrad (nicht nur Y) klassifizieren, wenn dies der Fall ist.

Ich würde sehr Sie überprüfen empfehlen dplyrfür die endgültige Zusammenfassungs, R integrierten Tools sind sehr leistungsfähig , aber ermüdend im Nachhinein. Leider müssen spSie manuell zwischen Koordinatenfeldern konvertieren und data.frameziemlich routinemäßig bilden, um diese Art von Antworten zu erhalten, aber es ist alles machbar.

Wenn dies tatsächlich das ist, wonach Sie suchen, dauert es nicht lange, bis Ihre virtuellen Speicherressourcen mit dem Datensatz übereinstimmen, den Sie haben, um alles auf einmal einzulesen und die Arbeit in einem zu erledigen Schritt so.

mdsumner
quelle
3

In QGIS können Sie Ausdrücke verwenden, um Felder mit dem Feldrechner hinzuzufügen

Die folgenden Ausdrücke geben Ihnen die Min- und Max-Koordinaten für das Polygon an

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

Für Mittelkoordinaten können Sie verwenden

xmin(centroid($geometry))
ymin(centroid($geometry))
räumliche Gedanken
quelle