J'ai un script arcpy simple pour mettre à jour un champ dans un fichier de formes de points avec les informations de l'entité polygonale dans laquelle il se trouve. Il faut 9 minutes pour faire 100 points dans arcpy mais une jointure spatiale dans arcmap est instantanée. Je suis sûr qu'il existe un moyen rapide et établi de résoudre ce problème. Quelqu'un peut me diriger dans la bonne direction?
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
la source
la source
arcpy.da
module (Data Access) avec des versions (beaucoup) plus rapides des curseurs.Réponses:
Si vous devez créer un deuxième curseur pour
parcels.shp
, faites-le en dehors de la boucle de votre premier curseur. En l'état, votre script crée un nouvel objet curseur pour chaque ligne,malls.shp
ce qui vous coûte tout ce temps de traitement.la source
Le problème avec la réponse de @ Jason (et votre approche originale) est qu'elle ne tire pas parti de l'index spatial et nécessite une boucle imbriquée à deux curseurs qui va devenir exponentiellement plus lente à mesure que le nombre de points augmente.
Un flux de travail alternatif qui peut être plus rapide tout en vous permettant de mettre à jour la classe d'entités ponctuelles sur place (Spatial Join ne produit qu'une nouvelle classe d'entités, pas une autre existante), pourrait être de:
la source