Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

classic Classic list List threaded Threaded
6 messages Options
MD
Reply | Threaded
Open this post in threaded view
|

Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

MD
Bonjour à tous,

Je souhaite déterminer un bassin versant  à partir de son exutoire, plus précisément déterminer la zone contributive (bassin versant) d'un bassin d'orage (exutoire). J'utilise la version 4.0.

J'expérimente la délimitation avec l'algorithme D8 dans un premier temps.
J'utilise donc les commandes SQL suivantes:

create table filled as select ST_FillSinks(raster, 0.001) as raster from MNT_etude;
create table dir as select ST_D8Direction(raster) as raster from filled;
create table acc as select ST_D8Accumulation(raster) as raster from dir;
create table strahler1500 as select ST_D8StrahlerStreamOrder(d.raster, a.raster, 1500) from dir d, acc a;
create table allrivers as select * from ST_Vectorizeline(strahler1500);
create table reseau_hydro as select * from allrivers where gid < 6;


Jusqu'ici aucun problème, j'obtiens bien un réseau hydrogaphique cohérent.

Cela ce complique avec la ligne suivante, qui tente d'identifier le bassin versant à partir des coordonnées géographiques de l'exutoire:
create table BV as select ST_D8Watershed(raster, ST_GeomFromText ('POINT (352895.6052760085 6683864.196424716)')) as the_geom from dir ;

(J'ai trouvé cette commande dans "Geospatial Free and Open Source Software in the 21st Century" par E. Bocher et M. Neteler, 2012)

J'obtiens le message d'erreur suivant:
ERROR [Thread-15] (ExecuteScriptProcess.java:198) - Erreur d'accès à la donnée :
org.gdms.driver.DriverException: java.lang.ArrayIndexOutOfBoundsException: 1536472263
        at org.gdms.sql.engine.SQLStatement.execute(SQLStatement.scala:186)
        at org.orbisgis.view.sqlconsole.actions.ExecuteScriptProcess.run(ExecuteScriptProcess.java:173)
        at org.orbisgis.view.background.Job.run(Job.java:74)
        at org.orbisgis.view.background.RunnableBackgroundJob.run(RunnableBackgroundJob.java:71)
        at java.lang.Thread.run(Unknown Source)..........


J'ai également tenté la ligne de commande suivante (à l'aide de la liste de fonction SQL: select ST_D8Watershed(dir.raster[, acc.raster, value | GeomFromText("POINT(x y)")]) from dir, acc;):
create table BV as select ST_D8Watershed(dir.raster, ST_GeomFromText('POINT(352895.6052760085 6683864.196424716)')) from dir, acc;

J'obtiens  le même message d'erreur.
J'ai testé d'autres combinaisons et j'ai toujours un message d'erreur.

Une idée du problème rencontré ?

Merci d'avance!

Mélissa

MD
Reply | Threaded
Open this post in threaded view
|

Re: Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

MD
Bonjour à tous,

Pas d'idées ?

Je pense qu'il pourrait s'agir d'un problème dans l'écriture du code ou que la requête ne fonctionne pas sur la version 4.0. J'essaierai avec la version 3.0...

Mélissa
Reply | Threaded
Open this post in threaded view
|

Re: Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

Gwendall Petit
Administrator
Bonjour Mélissa,

Il y a effectivement un soucis, que nous n'avons pas encore réussi à identifier. Nous sommes dessus.

En attendant, je te propose de réaliser une opération un peu moins orthodoxe mais qui fonctionne si tu veux repérer le BV pour un point donné.

Après avoir exécuté ta première partie de script, avec notamment la grille de direction ("dir"), tu peux exécuter le script ci-dessous:
-- Génération de l'ensemble des bassins versants à partir de la grille de direction
DROP TABLE IF EXISTS BV_all;
CREATE TABLE BV_all AS SELECT ST_D8Watershed(dir.raster) as raster FROM dir;

-- Vectorisation de ce raster (cette étape est longue)
DROP TABLE IF EXISTS BV_VECTO;
CREATE TABLE BV_VECTO AS SELECT * FROM ST_RasterToPolygons(BV_all);

-- Définition du point désiré
DROP TABLE IF EXISTS point;
CREATE TABLE point AS SELECT ST_GeomFromText('POINT (334574.8620695961 6692020.601074284)') as the_geom FROM allrivers limit 1;

-- Sélection du bassin versant (précédemment vectorisé) qui intersecte le point défini juste avant
DROP TABLE IF EXISTS BV_study;
CREATE TABLE BV_study AS SELECT a.* FROM BV_VECTO a, point b where ST_INTERSECTS(a.the_geom, b.the_geom);
Dans ce script tu n'as donc qu'à te focaliser sur la 3ème requête pour définir les coordonnées de ton point.
Si jamais tu veux tester d'autres zones, tu peux mettre en commentaire les deux premières étapes (pour ne pas refaire les bv et la vectorisation).



Encore une fois, ce n'est pas super optimisé mais ça devrait te permettre d'attendre une réponse plus claire.

Cordialement,

Gwendall
MD
Reply | Threaded
Open this post in threaded view
|

Re: Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

MD
Bonjour Gwendall,

Merci beaucoup!
Je vais donc tester cette solution en attendant que le problème soit identifié.

Bonne journée.

Mélissa
MD
Reply | Threaded
Open this post in threaded view
|

Re: Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

MD
Bonjour à tous !

Finalement la méthode alternative sur la V4.0 (en attendant que le bug sur la fonction D8Watershed pour un exutoire donné soit corrigé) ne donne pas le résultat escompté.

Afin d'avancer quand même, j'ai voulu utiliser la fonction D8Watershed (pour un exutoire donné) sur la version 3.0.2. Cela ne semble pas fonctionner, j'ai des messages d'erreur.

Test 1:
create table BV as select ST_D8Watershed(d.raster, a.raster, ST_GeomFromText('POINT (364256 6696684)')) from dir d, acc a;

=> Bad number of arguments. Function: ST_D8Watershed
Caused by: Bad number of arguments. Function: ST_D8Watershed

Test 2:
create table BV as select ST_D8Watershed(dir.raster, ST_GeomFromText('POINT(364256 6696684)')) from dir ;

=> Cannot evaluate: 1555905924
Caused by: 1555905924

Test 3:
create table BV as select ST_D8Watershed(dir.raster, acc. raster, ST_GeomFromText('POINT(364256 6696684)')) from dir, acc;

=> Bad number of arguments. Function: ST_D8Watershed
Caused by: Bad number of arguments. Function: ST_D8Watershed


Mélissa
MD
Reply | Threaded
Open this post in threaded view
|

Re: Extraire un bassin versant à partir de son exutoire - ST_D8Watershed

MD
Re bonjour,

On m'a montré sur la Version 3 des icônes au niveau de la barre d'outils qui permettent de déterminer les bassins versants: "compute a watershed" et l'icône "baguette magique". Dans un premier temps, je vais faire des tests sur des bassins versants que l'on connait déjà.  

Dans l'attente de la correction du bug sur la version 4.

Bonne journée à tous.

Mélissa