Mehr

Attributfeld basierend auf sich schneidendem Polygon

Attributfeld basierend auf sich schneidendem Polygon


Ich muss für jedes Lesezeichen ein Polygon hinzufügen (was gut funktioniert) und dann ein Feld zuordnen, basierend auf den Postleitzahlen, die das Lesezeichenpolygon schneidet.

Ich weiß nicht, ob ich auf dem richtigen Weg bin. Der Code wird abgeschlossen, sodass Ihnen kein Fehler angezeigt wird, aber das Feld für jedes Polygon ist leer.

cur = arcpy.da.InsertCursor(outFC, ["[email protected]", "ZipCode"]) array = arcpy.Array() für bkmk in arcpy.mapping.ListBookmarks(mxd): array.add(arcpy.Point(bkmk. Umfang.XMin, bkmk.extent.YMin)) array.add(arcpy.Point(bkmk.extent.XMin, bkmk.extent.YMax)) array.add(arcpy.Point(bkmk.extent.XMax, bkmk.extent. YMax)) array.add(arcpy.Point(bkmk.extent.XMax, bkmk.extent.YMin)) array.add(arcpy.Point(bkmk.extent.XMin, bkmk.extent.YMin)) polygon = arcpy.Polygon (array) # Postleitzahl berechnen arcpy.MakeFeatureLayer_management(zipCodesSHP, "zipCodesLYR") arcpy.SelectLayerByLocation_management("zipCodesLYR", "INTERSECT", polygon, "", "NEW_SELECTION") zipCodes = [row[0] für Zeile in arcpy. da.SearchCursor ("zipCodesLYR", "Zip_Code")] zipCode = ", ".join(""" + str(zipCodes) + """) # Polygon und Informationen einfügen cur.insertRow([polygon, zipCode] ) array.removeAll()

Diese Zeile ist dein Fehler:

zipCode = ", ".join(""" + str(zipCodes) + """)

Kurz gesagt, 'join' erwartet eine iterierbare Sequenz und Sie zerstören diese mit str(zipCodes). Stattdessen sollte die Zeile etwa so lauten:

zipCode = ', '.join([str(i) für i in zipCodes])

[Hinweis: str(zipCodes) ist tatsächlich iterierbar, aber in Ihrem Fall ist es Unsinn, da der Join durch "Slicen" der resultierenden Zeichenfolge statt der beabsichtigten Sequenz (Liste) von Postleitzahlen iteriert.]


Ich habe Ihr Problem grob getestet und der folgende Code hat bei mir funktioniert. Ändern Sie einfach den Pfad. Endgültige Ausgabe ist Name bookmark_joined Löschen Sie unnötige Felder daraus. Ich habe einen Begrenzungsrahmen von Lesezeichen und dann einen Schwerpunkt davon generiert, um die vollständige Positionierung der Lesezeichen in Zip-Formen sicherzustellen. Bitte reinigen Sie den PC, dh löschen Sie Zwischendaten, nachdem das Skript ausgeführt wurde.

import arcpy, os arcpy.env.overwriteOutput = True # Die Karte mit den Lesezeichen mxd = arcpy.mapping.MapDocument(r"C:UsersUSER_NAMEDesktopgissta
kws.mxd") outFC = r'C: UsersUSER_NAMEDocumentsArcGISDefault.gdbookmark' bookmark_centroid = r'C:UsersUSER_NAMEDocumentsArcGISDefault.gdbookmark_centroid' bookmark_joined = r'C:UsersUSER_NAMEDocumentsArcGIS Default.gdbookmark_joined' template = r'C:UsersUSER_NAMEDocumentsArcGISDefault.gdb	emplate' if arcpy.Exists(outFC): arcpy.Delete_management(outFC) arcpy.CreateFeatureclass_management(os.path.dirname (outFC), os.path.basename(outFC), "POLYGON", template, Spatial_reference=template) cur = arcpy.da.InsertCursor(outFC, ["[email protected]", "Name"]) array = arcpy.Array( ) für bkmk in arcpy.mapping.ListBookmarks(mxd): array.add(arcpy.Point(bkmk.extent.XMin, bkmk.extent.YMin)) array.add(arcpy.Point(bkmk.extent.XMin, bkmk. Umfang.YMax)) array.add(arcpy.Point(bkmk.extent.XMax, bkmk.extent.YMax)) array.add(arcpy.Point(bkmk.extent.XMax, bkmk.extent.YMin)) # Um das Polygon zu schließen, fügen Sie den ersten Punkt erneut hinzu array.add(arcpy.Point(bkmk.extent.XMin, bkmk.extent.YMin)) cur.insertRow([arcpy.Polygon(array) , bkmk.name]) array.removeAll() del cur arcpy.FeatureToPoint_management(outFC,bookmark_centroid,"CENTROID") arcpy.Intersect_analysis ([bookmark_centroid, template], bookmark_joined)

Schau das Video: ArcGIS - Dissolve polygon layer to identify slivers or gaps between polygons