Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#1 Mon 11 May 2009 14:36

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

automatisation pour les statistiques zonales.

Bonjour,
Je possède plus de 70 tables de données concernants les bassins versants. Je voudrais calculer différentes statistiques à l'aide du module statistiques zonales. Il me faudrait une méthode pour créer automatiquement mes fichiers dbf (automatisation) à partir d'un raster. Pour l'instant je suis obligé de faire table après table car  les bassins se superposent parfois et donc je ne peux joindre les tables en une seule et ensuite appliquer les stats zonales.
J'utilise arcgis9.2
merci d'avance !

Simon

Hors ligne

 

#2 Mon 11 May 2009 22:43

Anais4008
Participant actif
Lieu: France
Date d'inscription: 25 Apr 2007
Messages: 71

Re: automatisation pour les statistiques zonales.

Salut sim

Est ce que tu as essayé avec un model builder? Tu peux mettre tes outils statistiques zonales et jointure spatial dans le model, parametrer ton entrée, tu n'as qu'à changer tes tables à chaque fois et à exécuter...

En espérant t'avoir aider...

Hors ligne

 

#3 Tue 12 May 2009 09:58

freesnowpetrel
Participant assidu
Lieu: Pretoria, Afrique du Sud
Date d'inscription: 1 Mar 2007
Messages: 222

Re: automatisation pour les statistiques zonales.

Salut

Je ne suis pas sur de comprendre...ce que tu appelles des tables sont des tables attributaires dbf ou des couches de donnees geometriques et attributaires (shapefile ou autre). Si tu as 70 shapefiles de bassin versant, pourquoi ne pas les combiner en utilisant l'outil combiner/merge, ce n'est pas un probleme s'ils se superposent, puis utilises l'outil "zonal statistic as table".

A+

Rodolphe

Hors ligne

 

#4 Tue 12 May 2009 10:36

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

Re: automatisation pour les statistiques zonales.

Salut,

Merci pour vos réponses. Anais, je viens de faire le tutorial en ligne pour créer un modèle simple. Je vais maintenant essayer de l'appliquer à mon exemple précis... Je pense qu il faudrait que je mette l'ensemble de mes 70 tables (shapefiles) dans le modèle et ensuite faire varier le raster... mais j'ai peur que le model soit très imposant (il faudrait créer 70 tables différentes en sorties je pense).Donc au niveau temps je ne sais pas si je vais vraiment en gagner...
Rodolphe, comme les bassins se superposent, il me semble que je ne peux pas utiliser combiner merger sans perdre des infos. en fait pour cela j'avais créé une géodatabase mais ensuite je ne pouvais pas utiliser les stats zonales...

Simon

Hors ligne

 

#5 Tue 12 May 2009 10:47

freesnowpetrel
Participant assidu
Lieu: Pretoria, Afrique du Sud
Date d'inscription: 1 Mar 2007
Messages: 222

Re: automatisation pour les statistiques zonales.

Simon,

Bien sur que tu peux utiliser l'outil combiner et sans rien perdre en plus. Tu peux combiner tous tes polygones de bassins versant dans un seul shapefile, meme s'ils se superposent entierement ou partiellement. Bien sur le resultat sera une couche avec une topologie incorrecte, mais ca n'est pas ton probleme et ca repondra parfaitement a ta demande ce qui est l'essentiel.

A+

Rodolphe

Hors ligne

 

#6 Tue 12 May 2009 11:20

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

Re: automatisation pour les statistiques zonales.

je viens de tester le fait de combiner les shapefiles sur un exemple précis. Par exemple pour la bretagne j'ai 41 bassins versants dans 5 shapefiles différents (dans chaque shapefiles différent les bv ne se superposent pas). J'applique ensuite merge. J'obtiens une table associée au shapefile avec 41 lignes. la représentation n'est plus bonne mais en effet ce n'est pas le probleme. j'applique ensuite les statistiques zonales avec le raster bd alti par exemple. Résultat : je n'obtiens que 28 lignes de résultats. Si j'applique les stats zonales en 5 fois j'aurai eu 41 lignes de résultats... donc malheureusement je pense que les chevauchements rendent impossible la bonne application des stats zonales pour les réaliser mon travail....
Donc le model simple me semble la seule solution (ou utilisation du langage java mais je n'y connais rien)

Hors ligne

 

#7 Tue 12 May 2009 11:40

freesnowpetrel
Participant assidu
Lieu: Pretoria, Afrique du Sud
Date d'inscription: 1 Mar 2007
Messages: 222

Re: automatisation pour les statistiques zonales.

Simon,

OK, desole ! C'est vrai qu'en y regardant de pres, en fait l'outil statistique zonale rasterize le shapefile en un grid qu'il utilise comme raster de zones d'ou le fait que ca ne marche pas pour les polygones qui se superposent...
Une solution est d'utiliser un script python.
Voici un script que j'ai fait il y a quelques temps pour faire ce genre de choses.

Code:

#Script for Miguel to extract zonal
# statistics as table in batch from a folder
# path even if this one contain subfolders
# and a raster list
#created on: Tue 16 Sept 2008
#By Rodolphe Bernard
#From Imperial College
#     Silwood park Campus
 
#container for boolbox path list
tbx_path = []
 
#--variables to change before running this script to suits your needs and your computer settings--
#---------------------Make sure that all pathes contains slash instead of backslash------------------------
 
#COMPUTER SETTINGS
#Data management toolbox path
tbx_path.append("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Data Management Tools.tbx")
#Spatial Analyst toolbox path
tbx_path.append("C:/Program Files/ArcGIS/ArcToolbox/Toolboxes/Spatial Analyst Tools.tbx")  
 
#YOUR SETTINGS
#path to the root folder containing all folders with shapefiles
folderpath = "C:/Documents and Settings/rbernard/My Documents/DATA/GIS_data/temp/Miguel_files/test"
#common shapefiles fieldname to use to identify the entity to group within your shapefile (like if you do a dissolve) if necessary  before performing zonal statistics
fieldname = "SHAPENAME"
#raster path list like ["rasterpath1","rasterpath2",...]
rasterpathlist = ["C:/Documents and Settings/rbernard/My Documents/DATA/GIS_data/temp/Miguel_files/ataet00"]
#scratch folder
scratch_folder = "C:/Documents and Settings/rbernard/My Documents/DATA/GIS_data/temp/Miguel_files/scratch"
#final output table
final_output = "C:/Documents and Settings/rbernard/My Documents/DATA/GIS_data/temp/Miguel_files/final_ouput_table.dbf"
 
#-------------------------------------------------------------------------------------------------
 
# Import system modules
import sys, string, os, arcgisscripting
 
# Create the Geoprocessor object
gp = arcgisscripting.create()
 
# Check out ArcGIS Spatial Analyst extension license
gp.CheckOutExtension("Spatial")
 
# Load required toolboxes...
for tbx in tbx_path:
    gp.AddToolbox(tbx)
 
#extension file to look for
searched_extension = "shp"
  
#container for filepath
fileslist = []
 
#go through all folders and subfolders and return a list of shapefiles path
for root, dirs, files in os.walk(folderpath):
    for name in files:
        if name.endswith(searched_extension) or name.endswith(searched_extension.upper()):
                #root is the dir path, root + os.sep + name is the absolute path
                fileslist.append(root + "/" + name)
#container for string list of tables
tablelist=""
#for each shapefile
for shapefile in fileslist:
    #for each raster in rasterpathlist
    for raster in rasterpathlist:
        #perform zonal statistics as table between shapefile and raster
        output_table = scratch_folder + "/" + shapefile[shapefile.rfind("/")+1:len(shapefile)-4] + "_x_" + raster[raster.rfind("/")+1:len(raster)] + ".dbf"
        try:
            #gp.ZonalStatisticsAsTable_sa(outputshapefile, fieldname, raster, output_table, "DATA")
            gp.ZonalStatisticsAsTable_sa(shapefile, fieldname, raster, output_table, "DATA")
            # Add a field to this table to be able to know with wich raster the statistics have been calculated, of type TEXT
            gp.addfield (output_table, "rastername", "TEXT", "20")
            gp.CalculateField_management(output_table, "rastername", "\""+raster[raster.rfind("/")+1:len(raster)]+"\"", "VB")
            #create a list of output table for the next operation in the following format: "table1;table2;table3;..."
            if tablelist == "":
                tablelist = output_table
            else:
                tablelist = tablelist + ";" + output_table
 
        except:
            print "Error:",
            print "could not perform the zonal statistic calculation between layers:" + shapefile[shapefile.rfind("/")+1:len(shapefile)] + " and " + raster[raster.rfind("/")+1:len(raster)]
            print "n"
        
#copy row of the first table of the list to a new table and create this table (final output table)
gp.maketableview(tablelist[0:tablelist.find(";")], "temp_table")
gp.copyrows(tablelist[0:tablelist.find(";")],final_output,"temp_table")        
#Append all other tables rows into the final output table
gp.Append_management(tablelist[tablelist.find(";")+1:len(tablelist)], final_output, "NO_TEST")

Copies et colles ce script dans un editeur de texte, sauve le avec l'extension .py. Tu as juste a changer les parametres au debut du script, mettre les bon chemins vers tes donnees, puis l'ouvrir dans Python IDLE et l'executer.
Il te faut le chemin vers ton dossier contenant tes shapefiles, le champ commun a tous tes shapefile qui identifie tes bassins versants, le chemin complet d'acces a ton raster, le chemin vers un dossier temporaire pour stocker les dbf temp (ce dossier doit exister) et pour finir le chemin vers la table dbf finale.
Le script execute ensuite en boucle le zonal stat pour chacun de tes shapefiles puis rassemble le tout dans un dbf final. Le script  est livre tel quel sans erreur handling sauf si un zonal stat ne peux etre realiser entre un shapefile et un raster (different datum, differentes emprises,...) la un message s'affiche.

A+

Rodolphe

Hors ligne

 

#8 Tue 12 May 2009 11:48

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

Re: automatisation pour les statistiques zonales.

Merci beaucoup Rodolphe !
Je n'ai jamais appliqué de script mais je vais essayer ça tout de suite. Je pense que c'est exactement ce que je cherchais !
Encore merci.

Simon

Hors ligne

 

#9 Tue 12 May 2009 15:24

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

Re: automatisation pour les statistiques zonales.

Désolé de relancer cette dscussion...j ai lancé le script sur plusieurs bassins versants mais j'obtiens toujours ce type d'erreur :

"Error: could not perform the zonal statistic calculation between layers:bretagne5.shp and mass_mvt
n

Traceback (most recent call last):
  File "C:\Documents and Settings\barreau\Bureau\breta.py", line 87, in -toplevel-
    gp.maketableview(tablelist[0:tablelist.find(";")], "temp_table")
RuntimeError:
Echec de l'exécution. Les paramètres ne sont pas valides.
Table en entrée: valeur requise
Echec de l'exécution de (MakeTableView)."

dans le script voici les éléments que j'ai modifiés :

#YOUR SETTINGS
#path to the root folder containing all folders with shapefiles
folderpath = "D:/Donnees-sig/bassins_cotiers/bretagne"
#common shapefiles fieldname to use to identify the entity to group within your shapefile (like if you do a dissolve) if necessary  before performing zonal statistics
fieldname = "CD_STATION"
#raster path list like ["rasterpath1","rasterpath2",...]
rasterpathlist = ["D:/Donnees-sig/indicateurs/mass_mvt"]
#scratch folder
scratch_folder = "D:/Donnees-sig/bassins_cotiers/bretagne/script"
#final output table
final_output = "D:/Donnees-sig/bassins_cotiers/bretagne/script/essai.dbf"

je ne vois pas du tout pourquoi ça ne marche pas...CD station à un format texte (erreur?) j'ai créé le dossier script pour le srcatch folder mais il est vide, faut il créer la table essai.dbf même si elle est vide et ensuite lancer le script???
Donc pour résumer merci d'avance si vous avez quelques idées qui pourrait expliquer pourquoi ça ne fonctionne pas...

Simon

Hors ligne

 

#10 Tue 12 May 2009 16:12

freesnowpetrel
Participant assidu
Lieu: Pretoria, Afrique du Sud
Date d'inscription: 1 Mar 2007
Messages: 222

Re: automatisation pour les statistiques zonales.

re

Tous tes shapefiles et tes rasters doivent avoir un systeme de coordonnees definie sinon ca ne marche pas et deplus ils doivent utiliser le meme datum.
Essayes l'outil zonal stat entre ta couche qui pose probleme et ton raster pour voir si ca marche ou identifier l'erreur.

A+

Rodolphe

Hors ligne

 

#11 Tue 12 May 2009 17:08

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

Re: automatisation pour les statistiques zonales.

encore une fois merci pour l'aide,

pour le shape files j'ai :
Projection: Lambert_Conformal_Conic
Geographic Coordinate System: GCS_User_Defined
Datum: D_User_Defined

pour le raster j'ai :
Référence_spatiale>User_Defined_Lambert_Conformal_Conic
<Datum>D_User_Defined

donc je sais pas trop si c'est correct...
je précise que les stats zonales fonctionnait correctement avec le raster et les shapefiles que j'ai choisis pour le test...

@+
Simon

Hors ligne

 

#12 Tue 12 May 2009 17:24

Pierre Dolez
Participant assidu
Lieu: Proville
Date d'inscription: 14 Aug 2008
Messages: 519
Site web

Re: automatisation pour les statistiques zonales.

Bonjour,

J'interviens avec une approche complètement différente.
J'ai l'impression que le problème posé entre dans un cadre non directement prévu par Esri, c'est à dire qu'il est nécessaire de trouver des astuces, et à lire les allers et retour, ça n'a pas l'air simple.
Donc, ma proposition est de faire un outil spécialisé pour cette question précise.

Cordialement

Hors ligne

 

#13 Tue 12 May 2009 23:46

Jeirhome
Membre
Lieu: Liverion
Date d'inscription: 22 Aug 2006
Messages: 4298
Site web

Re: automatisation pour les statistiques zonales.

Pierre, ESRI a prévu les cas non directement prévu. C'est pour ça que dans ArcGIS il y a des "Model Builder" et des "langages de scripts". Cela permet de réaliser un outil spécialisé, ce n'est pas exactement une astuce, c'est juste une utilisation avancée.

Utiliser ces outils de programmation haut niveau permet de bénéficier du moteur SIG qu'est ArcGIS.

Il est très rare que pour une tache de géomatique il faut se décider à abandonner une solution SIG bureautique du style d'ArcGIS et créer un outil ex nihilo.


Jérôme Cuinet
L'avantage de la Chine, c'est que le soleil se couche plus tard !

Hors ligne

 

#14 Wed 13 May 2009 11:06

freesnowpetrel
Participant assidu
Lieu: Pretoria, Afrique du Sud
Date d'inscription: 1 Mar 2007
Messages: 222

Re: automatisation pour les statistiques zonales.

Simon,

Desole, je comprend pas pourquoi ca ne marche pas alors, si ca marche avec l'outil zonal stat avec les memes donnees...
Difficile de te depanner a distance...en plus j'ai pas le temps aujourd'hui. Peut-etre demain si j'ai un peu plus de temps et si personne d'autre n'as pu t'aider.

L'erreur sur le maketableview est normale si les autres tables temporaires n'ont pu etre crees auparavant.
As-tu une ligne d'erreur "Error: could not perform the zonal statistic..." pour chacun de tes shapefiles?
Une autre piste une fois que tu as lance ton script une fois,  essayes dans la fenetre d'execution de python IDLE d'executer cette ligne:

Code:

gp.ZonalStatisticsAsTable_sa(shapefile, fieldname, raster, output_table, "DATA")

Si ca ne marche pas essayes a nouveau mais en remplacant les variables par les chemins complet des fichiers entre "".
Qu'est ce qui se passe dans ces different cas? message d'erreur, table dbf temp cree ou pas?

A+
Rodolphe

Hors ligne

 

#15 Wed 13 May 2009 16:00

sim
Participant occasionnel
Date d'inscription: 5 May 2009
Messages: 21

Re: automatisation pour les statistiques zonales.

Grace à l'aide d un collègue j'ai enfin trouvé d'où venait le problème...
la ligne output_table = scratch_folder + "/" + shapefile[shapefile.rfind("/")+1:len(shapefile)-4] + "_x_" + raster[raster.rfind("/")+1:len(raster)] + ".dbf"
bloquait les calculs car la taille du fichier dbf crée était trop longue.
Donc encore merci à Rodolphe pour son script et ses conseils !

@+

Simon

Hors ligne

 

Pied de page des forums

Powered by FluxBB