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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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.


...


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9869
Site web

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

 

Pied de page des forums

Powered by FluxBB