Ich habe ein einfaches Arcpy-Skript, um ein Feld in einem Punkt-Shapefile mit Informationen aus dem darin enthaltenen Polygon-Feature zu aktualisieren. Es dauert 9 Minuten, um 100 Punkte in arcpy zu erstellen, aber eine räumliche Verknüpfung in arcmap erfolgt sofort. Ich bin sicher, es gibt einen schnell etablierten Weg, um dieses Problem zu lösen. Kann mich jemand in die richtige Richtung weisen?
import took 0:00:07.085000
extent took 0:00:05.991000
one pt loop took 0:00:03.780000
one pt loop took 0:00:03.850000
one pt loop took 0:00:03.791000
import datetime
t1 = datetime.datetime.now()
import arcpy
t2 = datetime.datetime.now()
print "import took %s" % ( t2-t1)
#set up environment
arcpy.env.workspace = "data\\"
arcpy.env.overwriteOutput = True
desc = arcpy.Describe("parcels.shp")
ext = desc.Extent
extent = (ext.XMin,ext.XMax,ext.YMin,ext.YMax)
t3 = datetime.datetime.now()
print "extent took %s" % (t3 -t2)
fc = arcpy.CreateRandomPoints_management("", "malls.shp", "", ext, 100, "", "POINT", "")
arcpy.AddField_management("malls.shp", 'ParcelID', 'LONG')
rows = arcpy.UpdateCursor('malls.shp',"","",'ParcelID')
for row in rows:
t4 = datetime.datetime.now()
pt = row.Shape.getPart()
for polyrow in arcpy.SearchCursor('parcels.shp'):
t6 = datetime.datetime.now()
poly = polyrow.getValue('Shape')
if extent[0]<pt.X<extent[1] and extent[2]<pt.Y<extent[3]:
if poly.contains(pt):
print "works"
row.ParcelID = polyrow.Parcels_ID
rows.updateRow(row)
break #we can stop looking for matches since
t7 = datetime.datetime.now()
"a full poly loop took %s" % (t7-t6)
t5 = datetime.datetime.now()
print "one pt loop took %s" % (t5-t4)
print datetime.datetime.now() -t1
arcpy
performance
EmdyP
quelle
quelle
arcpy.da
Modul (Datenzugriff) mit (viel) schnelleren Versionen der Cursor hinzu.Antworten:
Wenn Sie einen zweiten Cursor für erstellen müssen
parcels.shp
, tun Sie dies außerhalb der Schleife für Ihren ersten Cursor. Derzeit erstellt Ihr Skript für jede Zeile ein neues Cursorobjektmalls.shp
, das Sie die gesamte Verarbeitungszeit kostet.quelle
Das Problem mit der Antwort von @ Jason (und Ihrem ursprünglichen Ansatz) besteht darin, dass der räumliche Index nicht ausgenutzt wird und eine verschachtelte Zwei-Cursor-Schleife erforderlich ist, die mit zunehmender Anzahl von Punkten exponentiell langsamer wird.
Ein alternativer Workflow, der möglicherweise schneller ist, während Sie die Punkt-Feature-Class weiterhin direkt aktualisieren können (Spatial Join gibt nur eine neue Feature-Class aus, keine vorhandene zu aktualisieren), könnte sein:
quelle