Suite

Lire le contenu du fichier de couche à l'aide d'ArcPy ?


J'ai une collection de rasters (tous dans des géodatabases distinctes) que j'essaie de mettre dans une MOSAIC à l'aide d'un script python. J'en ai un tas à faire, donc je pensais que le moyen le plus simple de le faire serait de créer un fichier .lyr contenant tous les rasters que je veux ajouter, puis de lire un script dans ce fichier de couche et d'ajouter les rasters à l'aide AddRastersToMosaicDataset_management. Le problème est que je n'ai pas pu lire le contenu d'un fichier de couche. Cette ligne semble casser mon code :layerfile=arcpy.mapping.MapDocument(r"S:path_to_layer.lyr"). J'essaye d'attraper le message d'erreur avecsauf : print arcpy.GetMessages()mais rien ne s'imprime.

J'ai pensé essayer l'autre approche et utiliser un mxd au lieu d'un fichier de couche. J'ai créé un mxd avec uniquement les rasters que je voulais ajouter, mais je ne pouvais pas lire le chemin du raster (les fichiers de forme fonctionnaient cependant). Voici mon code :

import arcpy mxd=arcpy.mapping.MapDocument(r"S:path_to_mxd.mxd") dataframes=arcpy.mapping.ListDataFrames(mxd) pour dataframe dans dataframes : pour lyr dans arcpy.mapping.ListLayers(mxd, "", dataframe ): desc = arcpy.Describe(lyr) print desc.catalogPath #print(arcpy.Describe(lyr).catalogPath)

Cela imprimera un chemin vers un fichier de formes, mais donneraIOError : "Raster_Name" n'existe paslorsque la couche est un raster.

Pour le moment, ma seule solution de travail consiste à générer manuellement un fichier texte avec le chemin d'accès à chacun des rasters et à le lire ligne par ligne. Je ne veux pas avoir à générer un fichier texte pour chaque MOSAICQUE que je dois créer. J'ai l'impression d'avoir 4 chemins possibles que je pourrais emprunter et je suis bloqué sur chacun d'eux. Quelqu'un peut-il m'aider non plus;

  • lire un fichier .lyr ou un mxd et extraire les chemins des jeux de données raster ; ou alors
  • convertir un .lyr ou un mxd en un fichier texte listant les chemins des jeux de données contenus ?

Votre code essaie d'obtenir leChemin du cataloguepropriété du groupe de couches contenant vos rasters, qui n'existe pas. Au lieu de cela, je récupérerais lela source de donnéespropriété de la couche, après avoir testé qu'elle est bien applicable avec leles soutiens()méthode (les couches de groupe ne prennent pas en charge cette propriété).

Votre code ressemblerait à ceci :

import arcpy mxd=arcpy.mapping.MapDocument(r"S:path_to_mxd.mxd") dataframes=arcpy.mapping.ListDataFrames(mxd) pour dataframe dans dataframes : pour lyr dans arcpy.mapping.ListLayers(mxd, "", dataframe ): if lyr.supports(dataSource): print lyr.dataSource

Voir la page d'aide pour les propriétés et les méthodes de la couche pour plus de détails.

Si vous souhaitez suivre la suggestion de @Hélène et lister tous les rasters dans un gdb, utilisez la fonction arcpy.ListRasters(). Si tous vos rasters sont dans le même espace de travail, ce serait en effet plus simple que de tout mettre dans un mxd pour obtenir votre liste.


en fait, vous pouvez réellement utiliser les bases de données source comme chemin d'entrée vers l'outil AddRastersToMosaicDataset - cela simplifie énormément les choses, car vous n'avez "que" besoin de parcourir le ou les dossiers contenant les bases de données, par exemple, en supposant que vous chargez des rasters de géodatabase fichier seulement:

import os, arcpy, sys path_geodata = r"CHEMIN VERS LE DOSSIER PARENT CONTENANT VOS BASES DE DONNÉES" path_mosaic = r"CHEMIN VERS VOTRE MOSAIQUE" pour le chemin, les sous-répertoires, les fichiers dans os.walk(path_geodata): affiche le chemin si path.lower(). endswith(".gdb") == True: raster_type = "Raster Dataset" try: arcpy.AddRastersToMosaicDataset_management(path_mosaic, raster_type, path, "UPDATE_CELL_SIZES","UPDATE_BOUNDARY", "UPDATE_OVERVIEWS","#","0"," 1500","#", "#","SUBFOLDERS","EXCLUDE_DUPLICATES", "BUILD_PYRAMIDS","CALCULATE_STATISTICS", "BUILD_THUMBNAILS","#", "NO_FORCE_SPATIAL_REFERENCE") sauf : type, valeur, traceback = sys.exc_info () print "error value", str(value) for msg in range(0, arcpy.GetMessageCount()): if arcpy.GetSeverity(msg) == 2: print msg


Voir la vidéo: Operations Dashboard for ArcGIS: An Introduction (Octobre 2021).