Mehr

Führen Sie Feature-to-Point (keine erweiterte Lizenz) mit ArcPy durch?

Führen Sie Feature-to-Point (keine erweiterte Lizenz) mit ArcPy durch?


Ich habe eine Reihe von Polygonen, deren Schwerpunkte ich berechnet habe, habe aber Probleme, eine Möglichkeit zu finden, diese Werte in ein Punkt-Shapefile auszugeben. ich habe mich damit beschäftigtarcpy.MakeXYEvents_management, aber es wird nur eine temporäre Ebenendatei erstellt.


Hier ist eine Arcpy-Lösung:

import os, sys, arcpy InFC = sys.argv[1] OutFC = sys.argv[2] #split the output in directory and name Folder = os.path.dirname(OutFC) Name = os.path.basename(OutFC) # Rufen Sie den vorhandenen Raumbezug ab, da er mit desc = arcpy.Describe(InFC) übereinstimmt SR = desc.spatialReference # erstellen oder anhängen, falls nicht arcpy.Exists(OutFC): arcpy.CreateFeatureclass_management(Folder,Name,"POINT",spatial_reference = SR) # öffne den 'Writer' mit arcpy.da.InsertCursor(OutFC,"[email protected]") als iCur: # öffne den 'Reader' mit arcpy.da.SearchCursor(InFC,"[email protected]") als sCur: # Schleife jedes Polygon in der InFC für sRow in sCur: cent = sRow[0].centroid # Hole das Centroid iCur.insertRow([(cent.X,cent.Y)])# schreibe es in das neue Feature Klasse

Dies erstellt eine neue Feature-Class, öffnet einen Einfügecursor, durchläuft jede Geometrie in der InFC und schreibt die Schwerpunkteigenschaft in die Ausgabe… Beachten Sie, dass mehrteilige Geometrien keinen Schwerpunkt pro Teil haben, sondern einen einzelnen Schwerpunkt für die gesamte Geometrie … es ist nicht viel schwieriger, die Teile durchzuschleifen - halten wir dieses Beispiel jedoch ziemlich einfach, um die Grundlagen zu zeigen.


Das sollte den Trick machen:

import arcpy import os def polysToPoints(in_polys, out_points): """konvertiert Polygone in Schwerpunkte in_polys -- Eingabepolygone out_points -- Ausgabepunkte """ ws, name = os.path.split(out_points) sr = arcpy.Describe( in_polys).spatialReference arcpy.management.CreateFeatureclass(ws, name, 'POINT', template=in_polys, Spatial_reference=sr) # Datensatzfelder ausfüllen = ['[email protected]'] + [f.name für f in arcpy.ListFields(out_points ) if f.type not in ('OID', 'Geometry')] with arcpy.da.InsertCursor(out_points, fields) as irows: with arcpy.da.SearchCursor(in_polys, fields) as rows: for r in rows: irows.insertRow((arcpy.PointGeometry(r[0].centroid),) + r[1:]) return out_points if __name__ == '__main__': polys = r'C:path_to_yourpolys.shp' points = r'C:path_to_yourpoints.shp' polysToPoints(polys, punkte)

Die shapelib-Bibliothek ist für diese Aufgabe ideal.
Keine Abhängigkeiten, nur ein einfaches Modul zum Erstellen von Shapefiles:

import shapefile coord_list = ((20,40), (0,0), ) w = shapefile.Writer(shapefile.POINT) w.field('ID_FIELD','C','40') for id,(x, y) in enumerate(coord_list): w.record(ID_FIELD=id) w.point(x,y) w.save("file	osave")

Es ist ganz einfach, dass Sie die Projektionsdatei später (manuell) hinzufügen möchten.

Weitere Informationen finden Sie im Handbuch


Ich bin immer noch ein ziemlicher Anfänger, also ist das vielleicht nicht so anspruchsvoll, aber ich habe ein Skript-Tool dafür erstellt und es funktioniert für mich. Fügen Sie in Ihrer Toolbox ein neues Skriptwerkzeug hinzu. Erstellen Sie das Python-Skript unter der Quelle. Legen Sie den ersten Parameter des Werkzeugs als Feature-Layer-Eingabe und den zweiten Parameter als Feature-Layer-Ausgabe fest (stellen Sie sicher, dass Sie einen Ausgabeparameter festlegen). Beachten Sie, dass dieses Werkzeug Punkte innerhalb der Eingabeebene und nicht den wahren Schwerpunkt zurückgibt.

import arcpy import os inputFC = arcpy.GetParameterAsText(0) outputPath = arcpy.GetParameterAsText(1) scratchPath = arcpy.env.scratchGDB inputFCSpatialReference = arcpy.Describe(inputFC).spatialReference ##in neue fc in scratchGBD kopieren und neue Ebene erstellen FCCopy = arcpy.CopyFeatures_management(inputFC,os.path.join(scratchPath,"FCCopy")) FCLyr = arcpy.MakeFeatureLayer_management(FCCopy,"FCLyr") arcpy.AddMessage("FC LAYER CREATED") ##Hinzufügen und Berechnen von X und Y Felder arcpy.AddField_management(FCLyr,"Xcoor","DOUBLE") arcpy.CalculateField_management(FCLyr,"Xcoor","!SHAPE!.centroid.X","PYTHON") arcpy.AddField_management(FCLyr,"Ycoor"," DOUBLE") arcpy.CalculateField_management(FCLyr,"Ycoor","!SHAPE!.centroid.Y","PYTHON") arcpy.AddMessage("X,Y FIELDS CREATED") ##Punktlayer aus XY-Feldern erstellen FCTable = arcpy .MakeTableView_management(FCLyr,"FCTable") pointsLyr = arcpy.MakeXYEventLayer_management(FCTable,"Xcoor","Ycoor","pointsLyr",inputFCSpatialReference) arcpy.AddMessage("TABLE LAYER CREATED" ) ##Punkte in Feature-Class exportieren arcpy.CopyFeatures_management(pointsLyr,outputPath) arcpy.AddMessage("POINT LAYER CREATED") ##Daten von Grund auf löschenGBD arcpy.Delete_management(FCCopy)

Schau das Video: Creo Parametric - Publish Geometry Feature - Top Down Design TDD