Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

Printemps des cartes 2024

#1 Tue 28 November 2017 15:11

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Découpage inverse avec postgis

Bonjour à tous,


J'ai une requête qui découpe des lignes par rapport à des buffers et ne gardent que celles qui sont contenues par ces mêmes buffers.
Je souhaiterait réaliser l'opération inverse, c'est à dire sélectionner les lignes qui sont à l'extérieur des buffers, en les découpant par rapport à ces buffers. J'ai intégré un screenshot pour expliciter visuellement mon besoin.

Voici ma requete pour ne garder que les lignes à l'intérieur des buffers (en rouge)


Code:

drop table if exists test.ligne_decoup;
create table test.decoupas 
SELECT
    geom(st_dump(st_intersection(tligne.geom,tpolygone.geom))) AS geom,
    'L'||tligne.gid AS idligne,
    'P'||tpolygone.gid AS idpolygone, 
    tligne.id,
    tligne.type,
    tligne.emprise
    
FROM
    test.tampon_iti as tpolygone,
    test.emprise as tligne
WHERE
    tpolygone.geom && tligne.geom
AND
    st_intersects(tpolygone.geom,tligne.geom)
ORDER BY
    tligne.gid,
    tpolygone.gid
;

Et voici la fonction que je pensais utiliser (ST_SymDifference) pour effectuer l'opération inverse.

Code:

select ST_SymDifference(a.geom,b.geom) as geom
from test.emprise as a , test.decoup as b

Le problème c'est que la requête tourne pendant très longtemps et n'a pour l'instant jamais abouti. Je précise que je travaille sur une zone test (échantillon) et que mon script devra tourner sur plus d'un million d'entités de lignes.

Je suis preneuse de toutes vos remarques, réponses!

Merci d'avance!

Marine.


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

Hors ligne

 

#2 Tue 28 November 2017 18:21

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Découpage inverse avec postgis

Bonjour.
La fonction ST_DIFFERENCE devrait marcher dans ton cas :

Code:

SELECT  (st_dump(st_difference(ligne.geom,buffer.geom))).geom::geometry(linestring,tonSRID)AS la_geom
   FROM ligne, buffer

JP

Hors ligne

 

#3 Tue 28 November 2017 21:14

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: Découpage inverse avec postgis

Bonjour,
Première chose à faire agréger les tampons.
Ce pour limiter le nombre d'éléments de l'ensemble surface.
Puis agréger les lignes en multi avec un tampon. De façon à réduire le nombre d'éléments linéaires.
On colle tout cela dans des tables

Ensuite on met un index sur les géométries.

du coup tpolygone.geom && tligne.geom il y en a moins

Après il faut savoir lire la documentation.
st_symdifference va vous renvoyer union(S,L)-Intersection(S,L)
donc union de (Surface,ligne vertes, lignes rouges) - lignes rouges

st_difference ( Surface,lignes) renvoie lignes vertes

Avec le préalable indiqué et la remarque on ne peut plus juste de JPLLORENS, ça devrait le faire.

NB : pour calculer le domaine non cadastré de la Corse 2 jours et 18 h d’exécution pour la requête.
Le temps d'exécution dépend du nombres d'objets dans chacun des ensembles mais aussi de la compléxité des géométries, nombres de sommets des entités.

Dernière modification par ChristopheV (Tue 28 November 2017 21:15)


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#4 Wed 29 November 2017 11:32

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Re: Découpage inverse avec postgis

Bonjour,

Merci pour vos réponses.
J'ai essayé de reproduire la requete proposée par JP LLORENS mais le résultat n'est pas bon (voir en pj) pour deux raisons:

- Mes lignes passent de 39  à 2001 entités (à cause du st_dump je présume)
- Elles ne sont pas coupées à l'intersection des buffer

Code:

SELECT  (st_dump(st_difference(ligne.geom,buffer.geom))).geom::geometry(linestring,2154)AS la_geom
   FROM test.line as ligne, test.tampon as buffer

Il y a surement quelque chose que je n'ai pas compris....

Merci pour vos retours!

Dernière modification par bruhnild (Wed 29 November 2017 11:33)


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

Hors ligne

 

#5 Wed 29 November 2017 12:22

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Découpage inverse avec postgis

Bonjour
Le test que j'ai effectué hier fonctionnait :

Code:

 SELECT
       sup_n_voie_alignement.ogc_fid
      ,(st_dump(st_difference(sup_n_voie_alignement.the_geom, opah.wkb_geometry))).geom::geometry(LineString,3944) AS st_difference
FROM 
      opah
     , sup_n_voie_alignement

En entrée j'ai une couche de linestring et polygon.
Le résultat en pièce jointe : en tireté bleu c'est la couche linéaire en entrée, et en orange le résultat du st_difference
Est-ce que vos géométries sont valides ?
Si vous êtes en multilinestring en entrée, cela peut expliquer le nombre important de lignes en sortie (st_dump !)
Cordialement

Dernière modification par JP LLORENS (Wed 29 November 2017 12:24)


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

Hors ligne

 

#6 Wed 29 November 2017 12:43

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Découpage inverse avec postgis

Par contre il y a un souci avec une couche en multipolygon en entrée :

multilinestring croisé avec polygon => ça marche
linestring croisé avec multipolygon => ne marche pas
multilinestring croisé avec multipolygon => ne marche pas

J'ai testé la validité de ma couche multipoly et c'est ok

Hors ligne

 

#7 Wed 29 November 2017 14:00

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: Découpage inverse avec postgis

Bonjour,

JP quelle version pg/postgis ?


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#8 Wed 29 November 2017 14:21

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Découpage inverse avec postgis

Bonjour Christophe

postgis = 2.01
postgresql = 9.1.24

Dernière modification par JP LLORENS (Wed 29 November 2017 14:21)

Hors ligne

 

#9 Thu 30 November 2017 10:56

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: Découpage inverse avec postgis

Bonjour,

Je mettrais déjà à jour postgis après j'ai pas cette version encore sous la main pour faire le test.

http://download.osgeo.org/postgis/docs/ … -2.4.1.pdf page 369 ne donne pas de contre indications ... ?


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#10 Thu 30 November 2017 11:46

JP LLORENS
Participant assidu
Date d'inscription: 12 Nov 2008
Messages: 231

Re: Découpage inverse avec postgis

Bonjour.
Une migration postgres/postgis est prévue mi-décembre.
On devrait basculer sur du 9.4 pour postgres, quand à la version postgis je dois caler ça avec le presta.
Peut-être mon thème en multipoly a un souci, je vais refaire des tests avec d'autres couches.
Cordialement

Hors ligne

 

#11 Fri 01 December 2017 08:36

bruhnild
Participant actif
Lieu: Lyon
Date d'inscription: 7 Jun 2014
Messages: 130

Re: Découpage inverse avec postgis

Bonjour,

Merci à tous pour vos réponses!
Je suis parvenue à un résultat avec cette requete:

Code:

    
create table test.ligne_union as
select a.gid, a.id, a.type, a.emprise, st_difference(a.geom, b.geom)
from test.line a, test.tampon b
where st_intersects(b.geom, a.geom) ;

Après avoir fait l'union de mes lignes à l'intérieur de mes buffer et mes lignes à l'extérieur, je me suis aperçue qu'il me manquait des lignes! Sur la pièce jointe il s'agit des tronçons en vert.

Je vais essayer de lancer une requete pour obtenir toutes les lignes de la table ligne_total dont les gid ne se trouvent pas dans la table ligne_union.

SELECT
  hp.gid,
  hp.geom
FROM
  test.ligne_union AS hp LEFT JOIN
  test.ligne_total AS par ON
  ST_Intersects(hp.geom,par.geom)
WHERE par.gid IS NULL;


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

Hors ligne

 

Pied de page des forums

Powered by FluxBB