Suite

Instruction conditionnelle python pour autoriser deux entrées ou une seule entrée dans une fusion

Instruction conditionnelle python pour autoriser deux entrées ou une seule entrée dans une fusion


J'ai un processus ModelBuilder que je convertis en python pour une édition supplémentaire. Au cours du processus, des entités ponctuelles et linéaires (variables d'entrée) sont mises en mémoire tampon, puis les polygones résultants sont fusionnés en une seule entité pour des processus supplémentaires. Mais je veux rendre le modèle plus polyvalent afin qu'il puisse fonctionner si une seule des entrées (point OU lignes) est fournie. Actuellement, il plante si une seule entrée est fournie. Existe-t-il un moyen de diriger le modèle de sorte que si une seule entrée est fournie, il saute l'étape de fusion (ou fusionne avec succès avec null) puis passe aux étapes suivantes.

Voici mon code :

# Process : Buffer (6) arcpy.Buffer_analysis(in_points_shp, point_buffer_shp, "buffer", "FULL", "ROUND", "NONE", "", "PLANAR") # Process : Buffer (11) arcpy.Buffer_analysis(in_LINE_shp , line_buffer_shp, "buffer", "FULL", "ROUND", "NONE", "", "PLANAR") # Processus : Fusionner (2) arcpy.Merge_management("Z:supporting_docspoint_buffer.shp;Z :supporting_docsline_buffer.shp", merge_output_shp,

… la sortie de fusion passe ensuite à d'autres processus. Mes compétences en python sont actuellement nulles.


Il y a au moins deux choses que vous pourriez faire.

Vous pouvez définir des valeurs par défaut pour vos paramètres, puis, si la valeur par défaut ne se produit pas vous exécuterez un certain morceau de code.

Par exemple, disons que le premier paramètre demande un point. Si le premier paramètre a été saisi, il ne sera pas défaut, vous pouvez donc exécuter un morceau de code (je viens d'utiliser imprimer instructions pour plus de simplicité, bien sûr, vous incluriez votre code réel à la place):

def printSomething(a="default", b="default"): if a != "default" and b != "default": print a + b elif a != "default": print a else: print b

Ou vous pouvez utiliser quelque chose comme *args. C'est peut-être la "meilleure" approche, mais cela pourrait être un peu plus difficile à mettre en place.

Il y aura sûrement d'autres moyens, mais je pense que le premier devrait être facile à mettre en œuvre et fonctionnerait bien.


OK, je vois que vous avez révisé un peu votre question.

Ce script devrait vous mener à bien. Le script prendra une liste de fichiers de formes et s'il y en a plus d'un dans la liste, il mettra en mémoire tampon chaque fichier de formes et effectuera une fusion. Si un seul est trouvé, il ne fera que le tampon.

Insérez simplement votre propre liste de fichiers de formes dans la fonction principale.

import arcpy import sys import os def multibuffer(shapefile_list): if len(shapefile_list) == 1: dirname = os.path.dirname(shapefile_list[0]) basename = os.path.basename(shapefile_list[0]) output_basename = os .path.splitext(basename)[0] + '_buffer' + os.path.splitext(basename)[1] output_filename = os.path.join(dirname, output_basename) # Vous feriez votre tampon ici, définissez votre distance de tampon sur un champ ou une valeur arcpy.Buffer_analysis(shapefile_list[0], output_filename, 5) arcpy.AddMessage('Output : {0}'.format(output_filename)) print 'Output :', output_filename elif len(shapefile_list) > 1 : buffered_shapefile_list = [] pour shapefile dans shapefile_list : dirname = os.path.dirname(shapefile) basename = os.path.basename(shapefile) output_basename = os.path.splitext(basename)[0] + '_buffer' + os.path. splitext(basename)[1] output_filename = os.path.join(dirname, output_basename) # Vous feriez votre tampon ici, définissez votre distance de tampon sur un champ ou une valeur arcpy.Buffer_analysis(shapefile, output_f ilename, 5) # Ajoute les sorties à une liste. buffered_shapefile_list.append(output_filename) arcpy.AddMessage('Output : {0}'.format(output_filename)) print 'Output :', output_filename # Fusionner les fichiers de formes mis en mémoire tampon # Passer dans la liste des fichiers de formes mis en mémoire tampon # Le fichier de fusion sera créé dans le répertoire de dernier fichier de formes mis en mémoire tampon arcpy.Merge_management(buffered_shapefile_list, os.path.join(dirname, 'merged_buffer.shp')) arcpy.AddMessage('Fichiers mis en mémoire tampon à fusionner : {0}'.format(str(buffered_shapefile_list))) arcpy.AddMessage ('Fichier fusionné : {0} : '.format(os.path.join(dirname, 'merged_buffer.shp'))) print 'Fichiers tamponnés à fusionner : {0}'.format(str(buffered_shapefile_list)) print ' Fichier fusionné : {0} : '.format(os.path.join(dirname, 'merged_buffer.shp')) else : print 'No shapefilesspecific' def main() : #put in list of shapefiles with fill paths shapefile_list = ['C:/data/point.shp', 'C:/data/line.shp', 'C:/data/point_2.shp'] multibuffer(shapefile_list) if __name__ == '__main__': main()

Dans la lignée de ce que BritishSteel a suggéré avec *args :

Vous pouvez transmettre un ensemble de valeurs-clés. Écrivez une fonction qui accepte **kwargs et transmettez un dict avec vos paires clé-valeur.

# modules intertools requis import itertools # fonction qui accepte les paires clé-valeur def show_elevation_temperature(**kwargs) : pour la clé, valeur dans kwargs.iteritems() : print 'Clé :{0} Valeur :{1}'.format(clé , value) def main(): key_values ​​= {'1700': '0', '2500': '-1', '4000': '-2' } # appelle la fonction et passe le dict show_elevation_temperature(** key_values) si __name__ == '__main__': main()

La sortie de la fonction ci-dessus doit afficher :

Clé:1700 Valeur:0 Clé:4000 Valeur:-2 Clé:2500 Valeur:-1

Voir la vidéo: Utiliser linstruction conditionnelle - Tutoriel Python #37