У меня есть простой скрипт arcpy, чтобы обновить поле в точечном шейп-файле с помощью информации из объекта многоугольника, в котором оно находится. Для создания 100 точек в arcpy требуется 9 минут, но пространственное соединение в arcmap происходит мгновенно. Я уверен, что есть быстрый способ решить эту проблему. Может ли кто-нибудь указать мне правильное направление?
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
источник
источник
arcpy.da
модуль (Доступ к данным) с (намного) более быстрыми версиями курсоров.Ответы:
Если вам нужно создать второй курсор для
parcels.shp
, сделайте это вне цикла для вашего первого курсора. В настоящее время ваш сценарий создает новый объект курсора для каждой строки,malls.shp
который стоит вам все это время обработки.источник
Проблема с ответом @ Jason (и вашим оригинальным подходом) заключается в том, что он не использует пространственный индекс и требует вложенного цикла с двумя курсорами, который будет экспоненциально медленнее по мере увеличения числа точек.
Альтернативный рабочий процесс, который может быть более быстрым, но при этом позволяет обновлять класс точечных объектов на месте (Spatial Join выводит только новый класс пространственных объектов, а не обновляет существующий), может быть следующим:
источник