Suite

Solution de contournement pour l'entrée de données raster dans ArcGIS Server Geoprocessing Service

Solution de contournement pour l'entrée de données raster dans ArcGIS Server Geoprocessing Service


METTRE À JOUR

J'ai accompli le script Python, mais uniquement testé dans un environnement de bureau, c'est-à-dire ArcMap.

#Importer le module de package de site ArcPy importer arcpy depuis arcpy importer env depuis arcpy import Etendue depuis arcpy import Raster depuis arcpy.sa importer ZonalStatistics depuis arcpy.sa importer CreateConstantRaster # Consulter la licence d'extension ArcGIS Spatial Analyst arcpy.CheckOutExtension("Spatial") # Définir Environnement Workspace ws = env.workspace = "WORKSPACE_PATHData.gdb" # Définir la taille de la cellule raster de l'environnement cellSize = env.cellSize = 10 # Définir l'étendue du traitement de l'environnement processingExtent = Extent(602560.330672585, 3827530.65305605, 746490.330672585, 3966810.65305605) = environProcessingExtent extend = processingExtent # Valeur constante pour Constant Raster constantValue = 0 # Obtenir les paramètres sous forme de texte # Chaînes représentant les rasters dans l'espace de travail rasters = arcpy.GetParameterAsText(0).split(";") # Le jeu de données qui définit les zones dansZoneData = arcpy. GetParameterAsText(1) # La variable zoneField sera déterminée sur une instruction conditionnelle, mais la logique n'a pas encore été implémentée. # Champ qui contient les valeurs qui définissent chaque zone zoneField = "TRACTCE10" # Emplacement de sortie out = arcpy.GetParameterAsText(2) outputLocation = ws + "" + out # Crée un raster à valeur constante, où value = 0 addedRaster = CreateConstantRaster (constantValue, "FLOAT", cellSize, processingExtent) # Traiter chaque chaîne raster pour le raster dans les rasters : addRaster = addedRaster + Raster(ws + "" + raster) # Exécuter les statistiques zonales zoneStats = ZonalStatistics(inZoneData, zoneField, addedRaster, "MAXIMUM", "DONNÉES") # Sauvegarder la sortie zoneStats.save(outputLocation)

QUESTION ORIGINALE

Un certain nombre de mes questions sur GIS.SE ont été liées à la résolution d'un problème unique et global que j'ai rencontré. En un mot, je souhaite permettre à un utilisateur d'une application cliente Flex (utilisant l'API ArcGIS pour Flex) de pouvoir sélectionner (via des cases à cocher) des données raster à utiliser dans une tâche de géotraitement qui effectue les opérations suivantes : génère une algèbre cartographique expression à utiliser dans une opération de calculatrice raster, puis effectue des statistiques de zone (l'utilisateur peut également sélectionner l'attribut de données de zone), puis renvoie un service de carte de résultat avec une symbologie prédéfinie.

Les deux principaux défis de cette tâche ont été doubles :
1) Création d'une expression d'algèbre cartographique dynamique qui dépend des rasters sélectionnés par l'utilisateur. De plus, la documentation indique que l'outil Raster Calculator ne doit pas être utilisé en dehors d'ArcMap et n'est pas disponible dans ArcPy. J'ai constaté que cette tâche similaire peut être accomplie avec le module Spatial Analyst et en utilisant l'opérateur d'addition, mais pour accomplir ce que j'ai en tête, cela semblerait nécessiter plus de temps de traitement, c'est-à-dire

rasOne + rasTwo = rasThree… rasThree + rasFour = rasFive… rasFive + ras6 = ras7… etc

2) Et le défi principal et apparemment insurmontable : utiliser des données raster comme entrée. J'ai essayé différentes approches [1], [2] et [3].

La documentation ESRI indique que les données raster ne peuvent pas être utilisées comme entrée pour un service/une tâche de géotraitement. Cependant, j'ai trouvé que la société Azavea a accompli cela via son produit Decision Tree [4], [5]. J'ai également trouvé ce livre blanc qui indique ce qui suit sur les solutions de contournement possibles pour l'utilisation de données raster comme entrées :

Ce que je recherche dans une réponse est un exemple concret de l'une de ces solutions de contournement pour l'entrée raster implémentée dans Flex et un exemple Python pour l'expression de carte dynamique. Veuillez me faire savoir si le code d'application Flex que j'ai développé, la structure de notre architecture informatique ou une élaboration des modèles que nous essayons de mettre en œuvre seront utiles.


D'un point de vue technique, je ne pense pas que cela semble trop difficile.

Un problème auquel vous serez confronté est que Python est lent et que les E/S raster avec les services de géotraitement sont également lentes. Si l'analyse est effectuée de manière synchrone (et n'est pas envoyée par courrier électronique à l'utilisateur une heure plus tard), je recommanderais vraiment de vérifier les extensions d'objet serveur (C#/Java).

Je pourrais imaginer le flux de travail de base comme suit :

  1. Chargez tous les rasters que les utilisateurs pourront sélectionner dans un service de carte standard avec votre symbologie prédéfinie et fournissez une table de recherche (XML / Analyser JSON à partir du point de terminaison REST, etc.) au client Flex afin qu'il connaisse l'index du service de carte associé à chaque de vos cases à cocher.

  2. Créez un SOE basé sur REST qui prend l'index de service de carte raster, l'expression d'algèbre cartographique et la géométrie (json) numérisés par l'utilisateur. Un avantage majeur que vous aurez est que vous pouvez charger des rasters en mémoire à l'avance, ce qui améliorera vraiment les performances. L'algèbre cartographique est certainement possible dans le SOE, mais j'en éviterais une tonne. Faites vraiment l'effort de pré-construire autant que vous le pouvez et exécutez simplement l'opération de statistiques zonales sur les rasters prédéfinis. Je pense que votre utilisateur vous remerciera.

J'adore Python, mais mon sentiment est que les services de géotraitement avec rasters / arcpy sont lents. Je pense juste qu'il y a trop de surcharge dans l'instanciation de l'objet gp et le chargement des rasters en mémoire.

J'ai rédigé un article de blog rapide pour vous aider à démarrer sur le SOE si vous êtes intéressé.

Je espère que vous allez bien.


Voir la vidéo: How to Open ArcGIS File gdb in QGIS 2021.