#1 Wed 07 May 2008 11:33
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
découpage d'une couche sur une autre sous postgis
Bonjour,
J'utilise postgis sous windows.
Je souhaite faire l'intersection d'une couche multilinestring avec une couche polygone dont j'en précise un en particulier. J'utilise la fonction "intersects". Cela fonctionne cependant les lignes situées sur plusieurs polygones ne sont pas coupées.
Est il possible qu'elles le soient ?
Hors ligne
#2 Wed 07 May 2008 11:51
- Lionel B
- Participant actif
- Lieu: Macon
- Date d'inscription: 5 Sep 2005
- Messages: 83
Re: découpage d'une couche sur une autre sous postgis
Bonjour,
intersects ne fait que renvoyer vrai ou faut. Il réalise un test sur l'intersection entre les objets de vos deux couches.
Pour faire une intersection :
select a.id, b.id, intersection(a.geom, b.geom) from a, b where intersects(a.geom, b.geom).
Pour restreindre à un seul polygone si a est la table des polygones :
select a.id, b.id, intersection(a.geom, b.geom) from a, b where a.id=VotreId and intersects(a.geom, b.geom).
Si votre table est volumineuse, pour aller plus vite il faudra utiliser les index spatiaux.
Cordialement
Hors ligne
#3 Wed 07 May 2008 14:01
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: découpage d'une couche sur une autre sous postgis
Je n'ai pas de problème au niveau de la requête. Cependant, les lignes qui se situent sur deux polygones ne sont pas coupées. Je voudrais savoir s'il est possible qu'elles le soient.
Merci
Hors ligne
#4 Wed 07 May 2008 16:02
- Lionel B
- Participant actif
- Lieu: Macon
- Date d'inscription: 5 Sep 2005
- Messages: 83
Re: découpage d'une couche sur une autre sous postgis
oups, j'ai lu la question trop vite. désolé.
Il n'est pas possible que vos lignes ne soient pas coupées après votre calcul d'intersection. Ce qui est possible, c'est qu'un polygon au moins englobe toute votre ligne et que du coup l'intersection soit cette ligne.
Comment faites vous pour visualiser vos résultats ? juste la sortie de la requête ou avec un visualisateur comme Qgis ?
Hors ligne
#5 Wed 07 May 2008 16:43
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: découpage d'une couche sur une autre sous postgis
Voila la requête utilisée. Le résultat est visible sur la pièce jointe.
Code:
create table resultat as select lignes.* from lignes, polygones where intersects(lignes.the_geom,polygones.the_geom) and polygones.code = 'XXXXXXX';
Pour visualiser j'utilise open jump, qgis, gvsig.
...
Hors ligne
#6 Wed 18 June 2008 15:01
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: découpage d'une couche sur une autre sous postgis
Une aide....
Hors ligne
#7 Wed 18 June 2008 16:13
Re: découpage d'une couche sur une autre sous postgis
Bonjour,
Il faut utiliser la fonction intersection() mais je ne suis pas sur que cela corresponde à votre besoin. Il y a d'autres fonctions aussi : Difference() et SymDifference().
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#8 Wed 18 June 2008 18:00
- cedricd
- Participant occasionnel
- Lieu: Dijon
- Date d'inscription: 20 Mar 2006
- Messages: 19
Re: découpage d'une couche sur une autre sous postgis
Bonjour,
Normalement, la fonction intersection fonctionne selon le principe proposé par Lionel. J'ai réalisé quelques tests à partir d'un jeu de données sources visible en image1 (6 polylignes simples ou composées et 5 polygones) :
Requête 1 : Calcul des intersections sans éclatement des polylignes initiales
Code:
SELECT intersection(tligne.geom,tpolygone.geom) AS geom, 'L'||tligne.id AS idligne, 'P'||tpolygone.id AS idpolygone FROM tpolygone, tligne WHERE tpolygone.geom && tligne.geom AND intersects(tpolygone.geom,tligne.geom) ORDER BY tligne.id, tpolygone.id;
Les intersections sont bien calculées par polygone mais au sein d'un même polygone, les polylignes initiales sont conservées.
8 polylignes créees. Résultat visible en image2
Requête 2 : Calcul des intersections avec éclatement des polylignes initiales
Code:
SELECT geom(dump(intersection(tligne.geom,tpolygone.geom))) AS geom, 'L'||tligne.id AS idligne, 'P'||tpolygone.id AS idpolygone FROM tpolygone, tligne WHERE tpolygone.geom && tligne.geom AND intersects(tpolygone.geom,tligne.geom) ORDER BY tligne.id, tpolygone.id;
Les intersections sont bien calculées par polygone mais au sein d'un même polygone, les polylignes initiales sont "éclatées".
12 polylignes créees. Résultat visible en image3
Les versions de Posgres et Postgis utilisées :
"PostgreSQL 8.2.5 on i686-pc-mingw32, compiled by GCC gcc.exe (GCC) 3.4.2 (mingw-special)"
"POSTGIS="1.3.1" GEOS="3.0.0rc4-CAPI-1.3.3" PROJ="Rel. 4.5.0, 22 Oct 2006" USE_STATS"
Images et données de test dans le ZIP
Cordialement
Dernière modification par cedricd (Wed 18 June 2008 18:11)
Hors ligne
#9 Thu 19 June 2008 11:12
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: découpage d'une couche sur une autre sous postgis
Merci,
Est-ce le :
Code:
WHERE tpolygone.geom && tligne.geom
qui fait que cela coupe les lignes ?
Hors ligne
#10 Thu 19 June 2008 11:39
Re: découpage d'une couche sur une autre sous postgis
Bonjour,
Non Jonathan, cela active l'utilisation des index des deux couches. ces index sont des bbox (boites englobantes) des géométries, elles doivent se superposer pour que la requête les prennent en compte.
C'est cette partie là qui créera la géométrie :
Code:
geom(dump(intersection(tligne.geom,tpolygone.geom))) AS geom,
et
Code:
intersects(tpolygone.geom,tligne.geom)
qui teste si les deux géométries se recoupent.
en gros l'index chercher les géométries qui se superposent mais d'une manière grossière, puis la fonction intersects() affinent le filtre et la fonction intersection() créer la géométrie.
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#11 Tue 01 July 2008 10:25
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: découpage d'une couche sur une autre sous postgis
Bonjour,
j'ai effectué un "découpage" de deux couches A et B de type polygone sous postgis avec la fonction intersection (). Tout semble marcher mais quand je regarde de plus près :
Au départ : Certains polygones de la couche A englobent complètement des petits polygones de la couche B
A l'arrivée : ma couche intersection contient bien les petits polygones de ma couche B mais ceux de la couche A n'ont pas été découpés par ces petits polygones. En d'autres termes, ces polygones de la couche A devrait être "troués" !
Pour plus de clarté voici mon script :
drop table evol_zonage_tm1;
create table evol_zonage_tm1 as
select av.gid as av_gid, ap.gid as ap_gid, av.id_insee, av.niv2 as av_niv2, av.annee as av_annee, ap.niv2 as ap_niv2, ap.annee as ap_annee, intersection(av.the_geom,ap.the_geom) as the_geom, area2d(intersection(av.the_geom,ap.the_geom)) as aire_m2
from posrec as ap, posprec as av
where (av.the_geom && ap.the_geom or av.the_geom ~ ap.the_geom or av.the_geom @ ap.the_geom) and (not disjoint(av.the_geom,ap.the_geom));
Dans le "where" j'ai essayé de mettre toute les conditions pour que le calcul aille plus vite.
Merci d'avance pour vos réponses.
Dernière modification par ppluvinet (Tue 01 July 2008 10:25)
Pascal PLUVINET
Hors ligne
#12 Tue 01 July 2008 12:16
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: découpage d'une couche sur une autre sous postgis
Je suis désolé, après plus d'acharnement avec le même script, mes polygones sont bien troués.
C'est qgis qui m'a fait croire qu'ils n'étaient pas troués car lorsque j'utilisai la flèche avec le "i" (identifier les données), qgis grisait également les polygones situés à l'intérieur mais lorsque je fais une sélection, les polygones à l'intérieur d'autres polygones ne sont pas mis en jaune!
Pascal PLUVINET
Hors ligne
#13 Tue 01 July 2008 14:12
- Guillaume Sueur
- Participant assidu
- Lieu: Toulouse
- Date d'inscription: 23 Sep 2005
- Messages: 331
- Site web
Re: découpage d'une couche sur une autre sous postgis
je crois que tu confonds les fonctions spatiales. L'intersection te
renvoie les polygones communs aux deux ensembles considérés. donc si tu
as une grosse patate A avec à l'intérieur des petits pois B,
l'intersection sera égale à B. Pour trouer A, il faut faire la
difference en A et B.
Par ailleurs, ton WHERE me semble inutilement complexe. l'opérateur &&
suffit généralement à optimiser la requête en n'effectuant le traitement
que sur les extents s'intersectant.
Guillaume
Hors ligne
#14 Tue 01 July 2008 14:28
- ppluvinet
- Participant assidu
- Lieu: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
Re: découpage d'une couche sur une autre sous postgis
Oui, mon where me semblait un peu gros, c'est vrai mais est-ce que ca change quelque chose en terme de vitesse de calcul?
Pour la fonction spatiale "intersection", mes couches A et B se superpose totalement. il s'agit des même communes mais dont le zonage à l'intérieur est différent. Avec "intersection" je découpe mes communes en de multiples zonages où j'ai pour chaque petite zone, l'identifiant de ma couche A et l'identifiant de ma couche B.
Bon c'est un peu compliqué à expliquer.........
A+
Pascal PLUVINET
Hors ligne