Mehr

Kann ich die genauen Bereiche herausfinden, die jede Kategorie abdeckt?

Kann ich die genauen Bereiche herausfinden, die jede Kategorie abdeckt?


Ich habe auf eine Landnutzungskarte zugegriffen und den entsprechenden Bereich ausgeschnitten, den ich analysieren muss. Gibt es eine Möglichkeit, die genauen Bereiche zu finden, die jede Kategorie abdeckt?


1. Bereiche tabellarisch darstellen

Die robustere Methode zum Berechnen von Flächen besteht darin, das Geoverarbeitungswerkzeug Flächen in Tabellenform in Spatial Analyst zu verwenden. Damit soll eine Aufschlüsselung der Gebiete für klassifizierte Rasterdaten für eine Reihe von Zonen berechnet werden. Zum Beispiel, wenn Sie die Fläche jeder Landbedeckungsklasse für jede Stadt oder Gemeinde in Ihrem Untersuchungsgebiet benötigen. Um die Gesamtsumme für alles zu erhalten, übergeben Sie einfach das Polygon, das Sie zum Beschneiden Ihres Rasters verwendet haben, als einzelne Zone.

Die Einheiten der Tabellenbereiche sind lineare Einheiten des Koordinatensystems des Rasters


2. Raster-Attributtabelle

Eine weniger robuste, aber geringfügig schnellere Methode zur Berechnung der Gesamtfläche für jede Landbedeckungsklasse besteht darin, sich die Attributtabelle des Rasters anzusehen. Klicken Sie im Inhaltsverzeichnis mit der rechten Maustaste auf die Ebene und klicken Sie auf "Attributtabelle". Wenn diese Option ausgegraut ist, müssen Sie das Geoverarbeitungswerkzeug Raster-Attributtabelle erstellen ausführen. DasANZAHLFeld in dieser Tabelle beschreibt die Anzahl der Zellen mit diesem Wert. Sie müssen dies mit multiplizieren Bereich jeder Zelle, um die Gesamtfläche zu erhalten.


Ich bin mir nicht sicher, mit wie viel Vertrautheit du bist R, aber ich denke, es gibt die beste und sehr einfache Lösung deines Problems:

library(raster) # read "raster" library setwd("D:/Data/…") # setze dein Arbeitsverzeichnis r<-raster("your_raster.tif") # importiere deine Kategorie-Rasterdatei t<-freq(r) # Berechnen Sie Ihre Rasterfrequenztabelle - # es bedeutet, wie viele Pixel zu 1 # Kategorie gehören und speichern Sie es in einer Tabelle "t" # danach müssen Sie die Fläche von 1 Pixel kennen (nach Ihrem Beispiel nehme ich an, dass es 1 m² ist). # Multiplizieren Sie diesen Wert mit der Anzahl der Pixel in jeder Kategorie - aus der zweiten Spalte Ihrer Tabelle t -> (t[,2]) my.area<-t[,2]*1 # 1 = Fläche von 1 Pixel my .area.fin <- cbind(t, my.area) # Tabelle nach .txt exportieren: write.table(area_fin, file="area_by_category.txt", sep="	")

Wenn Sie Probleme mit diesem Skript haben, können Sie mir Ihre Bild-/Beispieldaten senden und ich werde das Skript anpassen.

Viel Glück ! :)


Obwohl Sie es für Ihre Landnutzungsklassifizierungen mit einem Bild und nicht mit einem Polygon-Layer zu tun haben, würde eine Planungsabteilung diesen Layer normalerweise in einem Polygonformat für zukünftige geplante Landnutzungen verwenden. My County bietet einen solchen Layer zum Download an. Wenn Sie über einen Polygon-Landnutzungs-Layer verfügen, können Sie die Symbologiebeschriftungen Ihres Layers so einrichten, dass die Fläche mithilfe von arcpy angezeigt wird. Dieses Skript kann so angepasst werden, dass es auf jeden Polygon-Layer für jede Einzelfeld-Symbologie-Klassifizierung angewendet wird, nicht nur auf einen Landnutzungs-Layer.

Ich verwende einen Trennzeichensatz, um die Basisbeschriftung von der vom Skript hinzugefügten Flächensumme zu trennen. Ich muss nur sicher sein, dass das Trennzeichen nicht Teil eines Basisetiketts ist. Auf diese Weise kann das Skript mit verschiedenen Auswahlen oder Filtern immer wieder ausgeführt werden und die an die Basisbeschriftungen angehängten Flächenwerte ersetzen.

Für Ihre Kartenlegende möchten Sie wahrscheinlich den Layer auf der Seite Elemente des Dialogfelds Legende auswählen und die Einstellung "Nur Klassen anzeigen, die in der aktuellen Kartenausdehnung sichtbar sind" aktivieren. Auf diese Weise würde jede eindeutige Kategorie, die nur in der Masterebene existierte und die in der aktuellen Ebene nicht existierte, aus der Legende ausgeschlossen. Das folgende Skript berücksichtigt Feature-Definitionsabfragen und Feature-Auswahlen beim Sammeln der Fläche jeder Kategorie. Es wären jedoch einige zusätzliche Änderungen am Skript erforderlich, damit es tatsächlich nur die Bereiche der Polygone nur basierend auf der aktuellen sichtbaren Ausdehnung auswertet, wenn die Features nicht bereits ausgewählt wurden.

Unten finden Sie ein Beispielskript, das Sie zu einem Skriptwerkzeug hinzufügen können. Das Skript funktioniert auch dann, wenn Sie Landnutzungsklassifikationen gruppiert haben:

# Name: ApplySymWithAreaLabels.py # Zweck: Anwenden der Symbologie von einem Layer auf einen anderen und Anzeigen des Bereichs in Beschriftungen # Importieren von Systemmodulen Importieren von arcpy aus arcpy import env #**** PASSEN SIE DIESE INPUT-VARIABLEN AN **** # Legen Sie den aktuellen Arbeitsbereich fest env.workspace = r"C:UsersOWNERDocumentsArcGIS" # Weisen Sie einen String zum Beschriften von Flächeneinheiten zu. areaUnitStr = "Acres" # Weisen Sie einen Umrechnungsfaktor für die Flächeneinheiten zu. Verwenden Sie 1.0, um die nativen Einheiten des Layers in Float-Präzision zu verwenden. # Beispielumwandlungen: # Sq. m zu Quadrat. km = 1,0 / 1000000,0 oder 0,000001 # Quadratkilometer Ft. zu Acre = 1,0 / 43560,0 oder 0,0000229568411386593 # Quadrat. Ft. zum Quadrat Mi.-Nr. = 1.0 / 27878400.0 oder 0.000000035870064279155 areaUnitFactor = 1.0 / 43560.0 # Legen Sie den Namen des Layers in der Karte fest, den Sie symbolisieren möchten layerName = "Land Uses" # Trennzeichenvariable zum Trennen der Basisbeschriftung vom Bereich # Stellen Sie sicher, dass das Trennzeichen . ist nicht Teil der tatsächlichen Basisetikettentrennzeichen = ' - ' # Definieren Sie eine Etikettenvorlagenzeichenfolge. # Setze insbesondere die Anzahl der Dezimalstellen für den zweiten Parameter labelTemplate = '{0}' + Trennzeichen + '{1:,.2f} {2}' #**** SKRIPT UNTEN SOLLTE KEINE ÜBERARBEITUNG BENÖTIGEN **** # Zeigen Sie auf die aktuell aktive Karte mxd = arcpy.mapping.MapDocument("current") # Legen Sie den Layer fest, um die Symbologie auf lyr = arcpy.mapping.ListLayers(mxd, layerName)[0] anzuwenden # Rufen Sie das Feld ab, das den Symbologie-WertField festlegt = lyr.symbology.valueField # Ruft die Liste der eindeutigen Landnutzungskategorien im Layer classValuesList = lyr.symbology.classValues ​​# Ruft die Liste der eindeutigen Landnutzungslabels ohne Fläche classLabelsList = lyr.symbology.classLabels valueDict = {} # Assign all Layer-Feldklassifizierungswerte in ein Wörterbuch mit der kumulativen Summe ihrer Bereiche mit arcpy.da.SearchCursor(lyr, [valueField, "[email protected]"]) as searchRows: für searchRow in searchRows: keyValue = searchRow[0] wenn nicht keyValue in valueDict: # Wenn keyValue nicht im Wörterbuch enthalten ist, füge es ein und speichere seinen Bereich valueDict[keyValue] = searchRow[1] else: # Wenn der Schlüsselwert bereits im Wörterbuch enthalten ist, summieren Sie den Bereich valueDict[keyValue] += searchRow[1] # Erstellen Sie ein Klassenwörterbuch, um die kumulative Summe gruppierter Klassifizierungen zu verfolgen. labelsDict = {} # Durchlaufen Sie alle Klassenwerte in der Ebene für i in range(len(classValuesList)): classValue = classValuesList[i] classLabel = classLabelsList[i].split(separator)[0] falls nicht classLabel in labelsDict: # Initialisieren des Klassenwörterbuchs mit 0 area labelsDict[classLabel] = 0 if classValue in valueDict: # kumulativ Bereiche der tatsächlichen einzelnen Layerklassen zu den gruppierten Klassifikationen summieren. labelsDict[classLabel] += valueDict[classValue] classLabelsList[i] = labelTemplate.format(classLabelsList[i].split(separator)[0], (labelsDict [classLabel] * areaUnitFactor), areaUnitStr) # Ordnen Sie die sortierten Labels den Klassen zu lyr.symbology.classLabels = classLabelsList # Aktualisieren Sie das Inhaltsverzeichnis, um die Änderung widerzuspiegeln arcpy.RefreshTOC() # Aktualisieren Sie die Active View, um die Änderung widerzuspiegeln arcp y.RefreshActiveView()

Das Skript hat die folgende Ausgabe für meinen Landnutzungs-Polygon-Layer erstellt. Es konvertierte meine Heimatgebietseinheiten von Quadratfuß in Morgen. Es hätte alle gruppierten Klassifizierungen behandelt, wenn ich sie in der Master-Ebene eingerichtet hätte.

Sie sollten eine Master-Layer-Datei auf der Festplatte speichern, die die Layer-Symbole, Beschriftungen (ohne Flächenwerte) und die gewünschte Reihenfolge für alle möglichen Klassen von Landnutzungskategorien als Backup enthält, um die Basisbeschriftungen zu erhalten. Leider berücksichtigt das Werkzeug Symbologie aus Layer anwenden nicht die Kategoriereihenfolge des gespeicherten Layers, daher müssen Sie die manuelle Desktop-Symbologie-Importoption verwenden, damit die Symbole die Reihenfolge haben, die Sie in Ihrer Master-Layer-Datei gespeichert haben. Andernfalls würde ich dieses Tool verwenden und nicht die Schaltfläche Desktop-Import verwenden. Unterstützen Sie die Idee, die Quell-Layer-Reihenfolge zu respektieren, wenn Sie das Werkzeug Symbologie aus Layer anwenden und den Dialog Symbologie neu gestalten im Desktop verwenden, um den Umsortierungsprozess zu vereinfachen, da der aktuelle Dialog ab 10 Symbolen mühsam die Standardsortierung überschreiben kann Auftrag.

Möglicherweise möchten Sie das Skript so ändern, dass es Parameter akzeptiert, damit Sie mit dem Skriptwerkzeug Ihren Ausgabe-Layer, den gespeicherten Mastersymbol-Layer und/oder den Flächeneinheitentyp und den Umrechnungsfaktor zur Laufzeit auswählen können. Das Skript könnte leicht geändert werden, um andere Statistiken zu erhalten, wie die Summe der Länge jeder Kategorie für Polylinien oder Polygonumfänge oder die Anzahl der Features für jeden der Geometrietypen.