Fonction ST_PIXELVALUE

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

Fonction ST_PIXELVALUE

MaudC
Bonjour,

Je souhaiterais à nouveau un renseignement... Pour pouvoir contourner le problème du champ avec comme nom 'value' j'utilise donc la fonction ST_PIXELVALUE. Cela semble fonctionner parfaitement, il n'y a pas de message d'erreur.

Voici mes instructions :

create table Pente as select ST_D8Slope(raster) as raster from MNT1000_L93_FRANCE;

create table PentePolygone as select * from ST_RasterToPolygons(Pente);

CREATE TABLE PentePolygone2 as SELECT a.gid, a.the_geom, ST_PIXELVALUE(b.raster,a.the_geom) as valeur from PentePolygone a, Pente b;

Mais je pense que j'utilise mal cette fonction car quand je compare 'value' et 'valeur', je n'obtiens pas les même résultats..

Cordialement,

Maud
Reply | Threaded
Open this post in threaded view
|

Re: Fonction ST_PIXELVALUE

Gwendall Petit
Administrator
Bonjour Maud,

Je vois déjà une incohérence dans ta requête. Si tu regardes la syntaxe par défaut pour la fonction ST_PIXELVALUE, tu as ceci :
SELECT ST_PixelValue(raster, point) FROM table
Ce qui veut dire que le deuxième paramètre de la fonction doit être un point. Alors que dans ta requête tu fais appel à la géométrie d'un polygone (the_geom de PentePolygone).

Sur le fond du problème, j'ai du mal à voir ou tu veux aller. Tu me corriges si je me trompe :
1/ Tu as un MNT (à un pas de 1000m sur la France)
2/ Tu veux calculer la pente sur ce MNT
3/ Ensuite extraire les pentes inférieures à 30%

Pour cela tu as deux approches en fonction de la version d'OrbisGIS :

Sur la V3.0.2
1/ Tu réalises la pente (avec la fonction ST_D8Slope)
2/ Dans le TOC, via le clic droit sur la couche de pente, tu utilises l'extracteur de pixel --> une nouvelle couche avec les pixels inférieurs à 0.3 est créée dans le TOC
3/ Si besoin tu la vectorises

Sur la V4.0
1/ idem
2/ l'extracteur de pixel n'a pas encore été remis dans cette version, aussi tu peux passer directement à l'étape 3
3/ la vectorisation
4/ renommage du champ value (optionnel)
4/ le filtrage des polygones dont la valeur est inférieure à 0.3
CREATE TABLE Pente AS SELECT ST_D8SLOPE(raster) as raster FROM DEM;
CREATE TABLE PentePolygone AS SELECT * FROM ST_RasterToPolygons(Pente);
ALTER TABLE PentePolygone RENAME COLUMN "value" to valeur;
CREATE TABLE Pente_inf_30 AS SELECT * FROM PentePolygone WHERE valeur<0.3;
Tu noteras au passage que pour renommer "value", je suis obligé de l'encadrer par les " " sinon ça renvoi une erreur.

Je viens de tester sur la france (avec la V4.0) et cela fonctionne bien (même si ça prend un peu de temps / environ 1 minute).



En orange les zones ou la pente est inférieure à 30% (en rose là ou c'est supérieur).

J'espère que ça répond à ta question.

Gwendall

Reply | Threaded
Open this post in threaded view
|

Re: Fonction ST_PIXELVALUE

MaudC
Merci pour la réponse !

En effet en mettant " " le changement de nom se fait tout seul !

En utilisant ST_PIXELVALUE les valeurs me paraissaient incohérentes mais en les affichant sur une carte elles correspondent à la réalité.

En fait je souhaite faire un maillage pour réduire la taille des pixels car j'ai énormément de requêtes à faire et j'obtiens régulièrement le message d'erreur Java Head Space... Je souhaite sélectionner les zones où, en fonction de l'altitude, des pentes, de l'occupation des sols, des températures mensuelles, de la pluviométrie annuelle, l'ont peut faire des cultures de certaines plantes en fonction de conditions d'entrée ! J'ai essayé de ne pas faire de maillage et dès que j'utilise ST_INTERSECTION pour deux couches, je n'ai pas assez d'espace mémoire pour aller au bout du calcul.

D'ailleurs lorsque l'on utilise ST_INTERSECTION on obtient bien une géométrie "exp0". Mais je ne peux pas la réutiliser, car j'obtiens un message d'erreur d'accès à la donnée.

Désolée, cela fait beaucoup de questions. Merci d'avoir pris le temps de répondre à tout précédemment.

Cordialement,

Maud




.
Reply | Threaded
Open this post in threaded view
|

Re: Fonction ST_PIXELVALUE

Gwendall Petit
Administrator
Bonjour Maud,
MaudC wrote
J'ai essayé de ne pas faire de maillage et dès que j'utilise ST_INTERSECTION pour deux couches, je n'ai pas assez d'espace mémoire pour aller au bout du calcul.

D'ailleurs lorsque l'on utilise ST_INTERSECTION on obtient bien une géométrie "exp0". Mais je ne peux pas la réutiliser, car j'obtiens un message d'erreur d'accès à la donnée.
Oui c'est normal. Lorsque tu utilises une fonction qui génère une nouvelle géométrie (ce qui est le cas par exemple pour ST_BUFFER, ST_INTERSECTION, ...) tu dois penser à spécifier le nom du champ qui portera la géométrie.
En clair, si tu écris juste :
SELECT ST_INTERSECTION(a.the_geom, b.the_geom) FROM table1 a, table2 b;
Tu obtiendras un champ exp0.

Alors que si utilises "as the_geom" après ta fonction, alors le champ sera bien nommé "the_geom" et tu pourras y faire référence d'en d'autres requêtes sans soucis.
SELECT ST_INTERSECTION(a.the_geom, b.the_geom) AS the_geom FROM table1 a, table2 b;
Par ailleurs, pour les questions d'optimisation et de temps de traitement, penses à ces deux choses :
1- ajoutes la condition suivante à la fin de ta requête d'intersection
... WHERE ST_INTERSECTS(a.the_geom, b.the_geom)
Grâce à cet ajout, OrbisGIS ne fera un calcul d'intersection QUE si les géométries s'intersectent. Dès lors tu peux diviser par 10 ton temps de traitement.

2- Si jamais tu as des géométries composées (un ensemble de plusieurs polygones, pas forcément mitoyens --> multipolygone) il serait éventuellement bon de les exploser avant de faire le calcul d'intersection.
Pour cela, tu as juste à faire :
CREATE TABLE explod AS SELECT * FROM ST_EXPLODE(my_table);
... et à utiliser "explod" dans ta requête d'intersection.

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Fonction ST_PIXELVALUE

MaudC
Bonjour,

Ok merci beaucoup pour les conseils ! Cela fonctionne beaucoup plus rapidement en effet !

Cordialement,

Maud