Réduisez le temps de traitement dans la fonction Effacer en utilisant Arcpy dans IDLE

8

Je traite 18000 classes d'entités (enregistrées dans un fichier GDB), chacune avec environ 500 enregistrements (entités polygonales) dans les zones océaniques, et j'exécute un script pour supprimer les zones chevauchant la côte, en utilisant la fonction Effacer. Le script s'exécute avec succès, mais prend littéralement des jours. Certains fichiers prennent quelques secondes à traiter (je suppose que cela est dû au fait, que j'ai vérifié, qu'ils ne se chevauchent pas avec le littoral) tandis que certaines classes d'entités prennent plus d'une heure à traiter.

Je travaille localement sur ma machine, exécutant le script dans IDLE, avec ArcGIS 10.1 (toutes les licences) sur un ordinateur Windows 7 32 bits, Intel DuoCore 3,33 GHz, 4 Go de RAM.

J'apprends les cordes avec Python et j'apprécierais vraiment des conseils sur mon script s'il y a des mesures que je peux prendre pour accélérer le temps de traitement. Je vous remercie!

# Import modules
import arcpy
import sys
import os
from arcpy import env

arcpy.env.overwriteOutput = True
print arcpy.env.overwriteOutput

#Erase coastline from selected buffers.
workspace = "C:\\DIR\\points_buff\\"
arcpy.env.workspace = workspace
erase_output = workspace+"erased.gdb\\"
erasedirectorypath = "C:\\DIR\\points_buff\\selectedbuff.gdb"
fileList = []

for dirpath, dirnames, erases in arcpy.da.Walk(erasedirectorypath,
                                              datatype="FeatureClass",
                                              type="Polygon"):
    for erase in erases:
        fileList.append(os.path.join(dirpath, erase))
        filenameparts = erase.split('_')
        if int(filenameparts[1]) > int(1967):

            try:
        #Set variables for Erase tool
                in_features = erasedirectorypath+"\\"+erase
                coastline_feat = "C:\\DIR\\Basic_NE.gdb\\Coastline_Eastern_US"
                out_erase_feat = erase_output+erase[:-4]+"_er"
                arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
                print arcpy.GetMessages()
                print "Coastline has been erased from " + erase + " and saved to " + erase_output

            except:
                print arcpy.GetMessages()
SharonB
la source

Réponses:

7

Bien qu'il soit difficile de dépanner votre script sans voir les données spatiales, quelques astuces et idées peuvent aider votre flux de travail. Pour commencer, sous-ensemble de votre ensemble de données et expérimentez différentes approches. Intégrez une horloge dans votre script pour avoir une idée précise de la rapidité ou de la lenteur des opérations. Essayez d'encapsuler vos commandes avec un time.clock. Par exemple:

import time
StartTime = time.clock()
arcpy.Erase_analysis(in_features, coastline_feat, out_erase_feat, '')
EndTime = time.clock()
print "Erase finished in %s hours" % ((EndTime - StartTime)/3600)
time.sleep(2.5)
  • Essayez d'utiliser la puissance de l' espace de travail in_memory . Généralement, les opérations effectuées in_memorysont plus rapides que celles qui sont écrites sur le disque. À utiliser in_memorypour toutes les opérations intermédiaires.

  • Plutôt que d'utiliser la commande Effacer, utilisez l'ensemble de commandes suivant pour effectuer un flux de travail similaire:

Créer une couche d'entités (gestion des données)

Sélectionner la couche par emplacement (gestion des données)

Supprimer des fonctionnalités (gestion des données)

Fonctions de copie (gestion des données)

Aaron
la source
2
Le calcul du temps peut être inestimable pour comparer des méthodes, surtout si vous essayez de nombreuses approches différentes sur un petit sous-ensemble de données.
Aaron
2
Oui, gardez à l'esprit que vous pouvez facilement supprimer les fichiers in_memory dans votre script en utilisant Supprimer (Gestion des données).
Aaron
4
Combien d'entités se trouvent dans le fichier littoral et quel est le nombre typique de sommets dans une entité? Quelle est la superficie couverte? Quelle est la superficie d'une zone couverte par vos classes d'entités? Si vous avez des fonctionnalités très volumineuses et compliquées dans votre fichier littoral, cela pourrait être la source du ralentissement. Il y a quelques méthodes à utiliser pour régler cela si c'est le problème.
blord-castillo
2
J'irais en fait dans la direction opposée. Dissolvez d'abord les entités, puis divisez le grand polygone en plusieurs classes d'entités distinctes d'un polygone chacune. Essayez d'exécuter une seule de ces classes d'entités littorales à sous-ensembles avec l'une de vos classes d'entités qui a pris du temps (et s'est croisée). Voyez si cela vous apporte une amélioration. Je pense que vos enveloppes d'intersection sont peut-être tout simplement trop grandes, supprimant les ajustements de performances déjà intégrés aux analyses de superposition.
blord-castillo
4
Un autre workflow à tester. Exécutez Minimum Bounding Geometrysur votre classe d'entités cible à l'aide de l'option de groupe ALLet du type de géométrie ENVELOPE. Effacez la classe d'entités enveloppes résultante à l'aide de votre immense littoral. Utilisez cette sortie de cet effacement pour effectuer une Clipsur votre classe d'entités cible d'origine. Cela simplifie l'étape complexe, l'effacement et le remplace par un clip moins coûteux par rapport à une fonctionnalité plus petite.
blord-castillo