Suite

Automatiser la projection de plusieurs fichiers shp à l'aide d'ArcPy

Automatiser la projection de plusieurs fichiers shp à l'aide d'ArcPy


J'ai essayé de créer un script Python qui convertira tous les fichiers de forme d'un dossier de GCS WGS 84 vers Web Mercator. Vous trouverez ci-dessous le code que j'ai jusqu'à présent, mais ce qui me pose problème, c'est comment parcourir chacun des fichiers tout en créant un nouveau nom pour la sortie (le nouveau fichier projeté dans Web Mercator). Des idées sur la façon dont je pourrais changer ce code pour que cela fonctionne? Je sais que je n'ai pas le bon paramètre de sortie mais je pense que tout le reste est bon.

import arcpy import glob inFCFolder = "C:Data" def projectToWebM(): for f in glob.glob(r""+ inFCFolder + "*.shp"): try: arcpy.Project_management(f, f + r" Project*.shp","PROJCS['WGS_1984_Web_Mercator_Auxiliary_Sphere',GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],UNIMEM[''Green 'Degré',0.0174532925199433]],PROJECTION['Mercator_Auxiliary_Sphere'],PARAMETRE['False_Easting',0.0],PARAMETRE['False_Northing',0.0],PARAMETRE['Central_Meridian',0.0],PARAMETRE['elStandard'_Parall ,PARAMETER['Auxiliary_Sphere_Type',0.0],UNIT['Meter',1.0]]","#","GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]], PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]") sauf : print 'Erreur : Impossible de projeter ' + f if __name__== '__main__' : projectToWebM()

## Votre code : ## ## import arcpy ## import glob ## ## ## inFCFolder = "C:Data" ## def projectToWebM(): ## for f in glob.glob(r""+ inFCFolder + "*.shp") : ## essayez : ## arcpy.Project_management(f, f + r"Project*.shp","PROJCS['WGS_1984_Web_Mercator_Auxiliary_Sphere',GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984 ',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]],PROJECTION['Mercator_Auxiliary_Sphere'],PARAMETER['False_EastingPARAMETER',0.0], ['False_Northing',0.0],PARAMETER['Central_Meridian',0.0],PARAMETER['Standard_Parallel_1',0.0],PARAMETER['Auxiliary_Sphere_Type',0.0],UNIT['Meter',1.0]]","#", "GEOGCS['GCS_WGS_1984',DATUM['D_WGS_1984',SPHEROID['WGS_1984',6378137.0,298.257223563]],PRIMEM['Greenwich',0.0],UNIT['Degree',0.0174532925199433]]") ## sauf : # # print 'Error: Unable to project ' + f ## ## if __name__== '__main__': ## projectToWebM() # Je suggérerais quelque chose comme ceci: import arcpy import glob import os # Normalement le caractère '' er est un caractère d'échappement, vous devrez donc utiliser le format de chaîne brut # r'C:Data' ou utiliser 'C:Data' pour obtenir une "barre oblique inverse" dans votre chaîne # littérale. # # Voir : http://docs.python.org/reference/lexical_analysis.html#literals inFCFolder = r'C:Data' def projectToWebM() : pour f dans glob.glob(inFCFolder + r'*.shp '): essayez: # Laissez arcpy créer un nom de travail et utilisez os.path.basename pour transférer la partie # du nom de fichier d'origine vers le nouveau nom de fichier. scratch_name = arcpy.CreateScratchName('wm_' + os.path.basename(f).replace('.shp',") + '_', ",  'Shapefile',  inFCFolder) # Pour faire simple, Je sors les nouveaux fichiers de formes projetés dans le même répertoire # d'où ils proviennent (garanti d'exister). Il semble que vous voudriez # les mettre dans le dossier "Project" en regardant votre code. De plus, # si vos données sont déjà projetées (comme dans a une référence spatiale définie), # vous n'avez pas besoin de spécifier un cinquième paramètre "in_coor_system". arcpy.Project_management(f, scratch_name,  r"PROJCS['WGS_1984_Web_Mercator_Auxiliary_Sphere'," +  r"GEOGCS['GCS_WGS_1984'," +  r"DATUM['D_WGS_1984'," +  r"SPHEROID[''WGS_1984 6378137.0,298.257223563]]," +  r"PRIMEM['Greenwich',0.0]," +  r"UNIT['Degree',0.0174532925199433]]," +  r"PROJECTION['Mercator_Auxiliary_Sphere']," +  r"PARAMETER['False_Easting',0.0]," +  r"PARAMETER['False_Northing',0.0]," +  r"PARAMETER['Central_Meridian',0.0]," +  r"PARAMETER['Standard_Parallel_1', 0.0]," +  r"PARAMETER['Auxiliary_Sphere_Type',0.0],"+  r"UNIT['Meter',1.0]]") sauf : print 'Erreur : Impossible de projeter ' + f if __name__== ' __main__' : projetVersWebM()

J'ai fait quelque chose de très similaire (ETRS_1989_To_WGS_1984) ce matin. La clé pour parcourir tous les fichiers de formes dans un répertoire est d'utiliser la fonction ListFeatureClasses pour générer une liste Python de fichiers de formes et pour boucler cette liste. J'espère que cela aide.

# Importer les modules import arcpy from arcpy import env import os # Définir les paramètres d'environnement env.workspace = "C:… ETRS1989" # Définir les variables locales outWorkspace = "C:… WGS84" # Utiliser ListFeatureClasses pour générer une liste de fichiers de formes fcList = arcpy.ListFeatureClasses() # Définir le système de coordonnées uniquement pour les entrées qui ont une référence spatiale définie pour infc dans fcList : # Déterminer si l'entrée a un système de coordonnées défini dsc = arcpy.Describe(infc) sr = dsc.spatialReference if sr.Name == "Unknown": # skip continue else: # Déterminez le nouveau chemin de classe d'entités en sortie et nommez outFeatureClass = os.path.join(outWorkspace, infc.strip(".shp") + "_wgs84.shp") # Définir le système de coordonnées en sortie outCS = "C:/Program Files/ArcGIS/Desktop10.0/Coordinate Systems/Geographic Coordinate Systems/World/WGS 1984.prj" # Définir la méthode de transformation transform_method = "ETRS_1989_To_WGS_1984" arcpy.Project_management(infc, outFeatureClass , outCS, transform_method)

Je ne connais pas glob, mais je viens de le rechercher et il semble que vous l'utilisiez pour parcourir vos dossiers de manière récursive à la recherche de fichiers de formes, ce qui semble être très utile.

Je pense que votre problème est que vous essayez de passer un caractère générique (c'est-à-dire f + r"Project*.shp") dans l'outil Project à chaque itération de la boucle for.

Avant d'accéder à la ligne Project_management, je pense que vous devez déjà avoir défini une variable (peut-être fProjected) sur le nom spécifique de votre fichier de sortie afin que vous puissiez le transmettre à chaque itération de l'outil Project.

Le module os est susceptible d'être utile pour briser l'ancien nom de fichier complet et assembler le nouveau.


OK, ce que vous devez faire, c'est ajouter un randomiseur au nom du fichier d'origine, car cela semble être le problème.

Je désagrégerais également la façon dont vous faites glob. je le fais ainsi :

sNames = r"C:projdataworkingdata*.shp" itFileNames = glob.iglob(sNames) pour vFile dans itFileNames :

J'ajouterais aussi l'aléatoire :

importer aléatoire hld = 'abcdefghijhijklmnopqrstuvwxyz'

pour l'ajouter à l'ancien nom de fichier, pour créer le nouveau nom de fichier.

Ce qu'il faut retenir, c'est la ligne :

arcpy.Project_management(f, f + r"Project*.shp",…

f + r"Project*.shp",… sera ceci (si vous utilisez glob):

"C:inFCFolder
ewfile.shpProject*.shp"

Vous devez avoir un nom de fichier dans le deuxième paramètre.

Donc, supprimez le nom de fichier de f. Supprimez le nom .shp, ajoutez des lettres aléatoires, puis ajoutez .shp et cela fonctionnera.

ÉDITER:

Désolé, mais pour obtenir le nom du fichier, vous devez faire ceci :

import os filename = os.path.basename(f) filename = filename[0:len(filename)-4] + random.choice(hld) + random.choice(hld) + random.choice(hld) + ".shp " arcpy.Project_management(f, "C:PathToProjectProjections" + nom de fichier, etc…

J'espère que cela pourra aider.


Voir la vidéo: GIS Python: Count shape files and Select by Location 2 Real world ArcPy examples