Mehr

Wie berechne ich gruppierte Perzentile oder Batch-Perzentile in ArcMap?

Wie berechne ich gruppierte Perzentile oder Batch-Perzentile in ArcMap?


Meine Frage ähnelt dieser, die erfolgreich beantwortet wurde: Berechnen von Perzentilen in ArcMap?

Meine Ergänzung ist, wie kann ich diese Lösung für mehrere Dateien stapeln oder eine Gruppierungsfunktion auf diesen Code anwenden?

Ich habe einen großen Datensatz mit HUC14-Wassereinzugsgebieten und Grundwasserneubildungswerten. Ich möchte das Quintil bestimmen, in dem sich jeder Datensatz für jeden HUC14 befindet. Daher müssen die Daten zuerst nach HUC14 gruppiert und dann das Perzentil berechnet werden. Im Moment habe ich die Daten als einzelne Feature-Class (Feature-Layer) und auch als separate Dateien (Shapefiles), sodass entweder eine Batch-Lösung oder eine Gruppierungslösung in Ordnung wäre.

BEARBEITEN: Ich wollte den Code hinzufügen, den ich schließlich basierend auf der Antwort von @Farid Cher verwendet habe.

import arcpy import numpy as np import os #loop durch alle Shapefiles in einem Ordner und rufe die CalcPercentile-Methode auf workspace = "X:JocelynGWRHUC14b" walk = arcpy.da.Walk(workspace, datatype="FeatureClass") for dirpath, dirnames, filenames in walk: for filename in filenames: featureClass = os.path.join(dirpath, filename) #Zuerst das Perzentil-Rank-Feld hinzufügen arcpy.AddField_management(featureClass, "PercRank", "LONG", 5, "" , "","", "NULLABLE") inputFeatureClass = featureClass #Erstellt einen Feature-Layer, um die Auswahl und Entfernung (mittels Schalterauswahl) von Datensätzen zu ermöglichen, die einen GSR-Code von 999 (Wasser und Feuchtgebiete) oder keine zugeordnete Bodengruppe haben damit. #Diese Datensätze sollten bei der Berechnung des Perzentilrangs nicht verwendet werden. FeatureLayer = arcpy.MakeFeatureLayer_management (inputFeatureClass, "temp_lyr") FL_Selection1 = arcpy.SelectLayerByAttribute_management (FeatureLayer,"NEW_SELECTION", """ "SoilGroup" ="OR "GSR32_code" = 999""") FL_Selection2 = arcpy.SelectLayerBySelecte1 "SWITCH_SELECTION") #Verwendet nur die ausgewählten Features in der CalcPercentile-Funktion CalcPercentile(inputFeatureClass) #Löscht den temporären Feature-Layer, um Unordnung und Platzprobleme zu vermeiden. arcpy.Delete_management(FeatureLayer) def CalcPercentile(inputFeatureClass): arrp = arcpy.da.FeatureClassToNumPyArray (FL_Selection2, ('GWR_V')) arr = np.array(arrp,np.float) #um 5 Ränge zu erstellen p1 = np.percentile(arr, 20) # rank = 1 (Länder, die die geringste Volumenaufladung innerhalb der HUC14) p2 = np.Perzentil(arr, 40) # Rang = 2 p3 = np.Perzentil(arr, 60) # Rang = 3 p4 = np.Perzentil(arr, 80) # Rang = 4 p5 = np.Perzentil( arr, 100)+1 # Rang = 5 (Länder, die das höchste Aufladevolumen innerhalb des HUC bieten14) #P rint die berechneten Quintilbrüche. drucke "p1=%s" % p1 drucke "p2=%s" % p2 drucke "p3=%s" % p3 drucke "p4=%s" % p4 drucke "p5=%s" % p5 #mit Cursor aktualisieren das neue Rangfeld mit arcpy.da.UpdateCursor(inputFeatureClass , ['GWR_V','PercRank']) als Cursor: für Zeile im Cursor: if row[0] < p1: row[1] = 1 #rank 1 elif p1 <= row[0] und row[0] < p2: row[1] = 2 elif p2 <= row[0] und row[0] < p3: row[1] = 3 elif p3 <= row[0] und row[0] < p4: row[1] = 4 else: row[1] = 5 cursor.updateRow(row)

Ich würde die Batch-Lösung empfehlen, da keine Datenauswahl (Group By) notwendig ist und schneller läuft. Durch die Integration der Antwort auf diese Frage und Loop-over-Shapefiles können Sie Ihr Ziel erreichen.

Ändern Sie einfach den Code nach Bedarf: - Bearbeiten Sie die Anzahl der Ränge, - den Shapefile-Ordner und so weiter

Code:

import arcpy import numpy as np import os #loop durch alle Shapefiles in einem Ordner und rufe die CalcPercentile-Methode auf shpFolder = "c:/data/MyShapeFiles" walk = arcpy.da.Walk(workspace, datatype="FeatureClass") für dirpath, dirnames, filenames in walk: for filename in filenames: featureClass = os.path.join(dirpath, filename) #Zuerst das Perzentil-Rank-Feld hinzufügen arcpy.AddField_management(featureClass, "PerRank", "LONG", 5, "", " ","", "NULLABLE") CalcPercentile(inputFeatureClass) def CalcPercentile(inputFeatureClass): arr = arcpy.da.FeatureClassToNumPyArray(inputFeatureClass, ('population_density')) ##um zum Beispiel 3 Rang zu erstellen p1 = np.percentile(arr , 33) # rank = 0 p2 = np.percentile(arr, 67) # rank = 1 p3 = np.percentile(arr, 100) #rank = 2 #benutze den Cursor, um das neue Rangfeld mit arcpy.da.UpdateCursor . zu aktualisieren (inputFeatureClass , ['population_density','PerRank']) als Cursor: für Zeile im Cursor: if row[0] < p1: row[1] = 0 #rank 0 elif p1 <= row[0] and row[0 ] < p2: Reihe[1] = 1 sonst: Reihe[1] = 2 Cursor.updateRow(Zeile)

Schau das Video: GIS Tools: ArcMapArcGIS Tool for counting inside features. points