Soustraction de couches vecteurs entre elles

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

Soustraction de couches vecteurs entre elles

MaudC
ReBonjour,

Je souhaiterais savoir s'il existe une solution simple pour soustraire une couche vecteur à une autre. En effet dans ma modélisation je souhaite ne garder que les zones propices à la culture de biocarburant.
A partir d'une couche où j'ai sélectionner les bonnes conditions topographiques et climatiques, je souhaite soustraire les zones protégées, les zones urbaines...
Dois-je pour toutes les couches effectuer une union de ces dernières en utilisant WHERE NOT ? Si je reproduis ce schéma plusieurs fois (pour toutes les différentes couches) cela me parait utiliser énormément d'espace mémoire. Je ne suis pas sûre de la façon dont je pourrais procéder, auriez vous une idée ? Merci d'avance,

Cordialement,

Maud
Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

Gwendall Petit
Administrator
Maud,

Qu'entends-tu par "soustraire" ?

Si j'ai bien compris, tu souhaites conserver uniquement les zones protégées ou urbaines qui intersectent tes zones d'étude (déterminées selon tes critères) ?

Si oui, alors tu peux envisager quelques chose du type :
SELECT DISTINCT a.* FROM zone_protegee a, zone_etude b WHERE ST_INTERSECTS(a.the_geom, b.the_geom);
Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

MaudC
En fait sur toute la France j'ai sélectionné toutes les zones climatiques et topographiques propices aux développement des cultures dans une table que j'ai appelé Cond. Mais sur ces zones existent des terres où il n'est pas possible de cultiver, j'ai plusieurs tables de ce type : ForetsPrimaires, City, ZonesProtegees... Je souhaite donc modifier ma table Cond en enlevant les géométries correspondants aux ForetsPrimaires, City, ZonesProtegees...
Je ne sais pas si je suis plus claire !

Cordialement,

Maud

Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

Gwendall Petit
Administrator
Ok, donc tu souhaites sélectionner tout les objets de Cond qui n'intersectent pas les objets présents dans d'autres tables ?

Dans ce cas, tu aurais quelque chose comme suit
SELECT DISTINCT a.* FROM zone_protegee a, zone_etude b WHERE NOT ST_INTERSECTS(a.the_geom, b.the_geom);
et tu auras autant d'étapes que tu as de couches.

ça c'est pour la théorie. En pratique ça risque :
  - soit de passer, mais après un long et gourmand (en mémoire) traitement
  - soit de planter.

De manière globale, les requêtes avec conditions négatives (where not) sont assez mal gérées par le SQL (OrbisGIS est en partie dédouané sur ce point).
Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

MaudC
Oui c'est ce que je souhaitais effectuer. Mais en effet dès la première requête cela plante...

Je vais donc essayer de diminuer la précisions des données. La création d'un maillage permettrait-elle de réduire le nombre de données ? Mais je me demande ensuite jusqu'à quel pourcentage de précision on peut considérer les données. Par exemple si dans un carré du maillage 10% concerne les Zones Protegées, dois je prendre en compte ce carré comme une zones protégées ? J'imagine que c'est plus ou moins subjectif.. Mais existe-il un moyen de connaitre ce pourcentage ?

Cela fait beaucoup de questions, désolée ! Mais je tourne en rond depuis quelques temps du à des problèmes de mémoire lors de mes requêtes.

Cordialement,

Maud
Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

MaudC
Je reviens sur ce post. Pour pouvoir fonctionner les requêtes, je travaille désormais département par département.
Je n'arrive pas en utilisant les requêtes suggérées a parvenir a mes fins.

J'ai un premier polygone (je vais prendre ici l'exemple de la Vendée) qui contient d'autres polygones (des zones de forêt). Je souhaite a l'aide d'une requête ne garder que les zones du polygone Vendée qui ne contiennent pas de forêt. J'ai tenté plusieurs méthodes, en voici un exemple:

--Forets dans le 85
CREATE TABLE Forest85 as select st_intersection (a.the_geom, b.the_geom) AS the_geom, ST_Area(a.the_geom) AS Area from Forest a, DEPARTEMENT b WHERE ST_Intersects(a.the_geom, b.the_geom) and b.CODE_DEPT='85';

--Zone sans forets dans le 85
CREATE TABLE test as SELECT DISTINCT a.* FROM Forest85 a, DEPARTEMENT b WHERE NOT ST_within(a.the_geom, b.the_geom) and b.CODE_DEPT='85';

--ou encore
CREATE TABLE test as SELECT DISTINCT ST_INTERSECTION(a.the_geom,b.the_geom) FROM Forest85 a, DEPARTEMENT b WHERE ST_INTERSECTS(a.the_geom,b.the_geom) and b.CODE_DEPT='85';

J'obtiens une table vide. Est-ce lié au fait que DEPARTEMENT where CODE_DEPT='85' est un seul polygone ? Mais c'est surement lié a une erreur de ma part !! L'opération me parait pourtant assez simple mais je ne vois plus comment faire ! Merci d'avance pour votre aide !

Bonne soirée,

Maud
Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

Gwendall Petit
Administrator
Bonjour Maud,

Je te propose l'approche suivante :
1- tu sélectionnes tes forêts
2- tu les unifies --> plus qu'une seule géométrie (par département)
3- tu calcule la différence entre ta forêt unifiée et le département d'étude

Voici le script correspondant :
-- 1- sélection des forêts (ici dans mon cas, à partir de la BD MOS du CG 44)
CREATE TABLE foret AS SELECT * FROM BDMOS_2009_1 WHERE C_NIVEAU=3;

-- 2- Unification
CREATE TABLE foret_union AS SELECT ST_UNION(the_geom) as the_geom FROM foret;

3- Différence avec le département 44
CREATE TABLE no_foret AS SELECT ST_DIFFERENCE(a.the_geom, b.the_geom) as the_geom FROM DEPARTEMENT a, foret_union b WHERE a.CODE_DEPT='44';
Voici le résultat :



Attention, les opérations d'union et de différence sont assez gourmandes

En espérant que ça t'aide

Cordialement,

Gwendall
Reply | Threaded
Open this post in threaded view
|

Re: Soustraction de couches vecteurs entre elles

MaudC
Merci beaucoup !
C'est parfait cela a marché en quelques secondes ! Je ne connaissais pas la fonction ST_DIFFERENCE, cela va m’être d'une grande aide !
Bonne fin de journée,

Maud