Mam prosty skrypt arkadowy, aby zaktualizować pole w pliku kształtu punktowego o informacje z funkcji wielokąta, w której on jest. Zebranie 100 punktów w arcpy zajmuje 9 minut, ale połączenie przestrzenne w arcmap jest natychmiastowe. Jestem pewien, że istnieje szybko ustalony sposób rozwiązania tego problemu. Czy ktoś może skierować mnie we właściwym kierunku?
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
źródło
źródło
arcpy.da
moduł (Data Access) z (znacznie) szybszymi wersjami kursorów.Odpowiedzi:
Jeśli chcesz utworzyć drugi kursor
parcels.shp
, zrób to poza pętlą dla pierwszego kursora. W tej chwili skrypt tworzy nowy obiekt kursora dla każdego wiersza, wmalls.shp
którym kosztuje Cię cały ten czas przetwarzania.źródło
Problem z odpowiedzią @ Jasona (i twoim oryginalnym podejściem) polega na tym, że nie wykorzystuje on wskaźnika przestrzennego i wymaga zagnieżdżonej pętli z dwoma kursorami, która będzie wykładniczo wolniejsza wraz ze wzrostem liczby punktów.
Alternatywnym przepływem pracy, który może być szybszy, a jednocześnie pozwala aktualizować punktową klasę obiektów w miejscu (sprzężenie przestrzenne generuje tylko nową klasę elementów, a nie aktualizuje istniejącą), może być:
źródło