#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.
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: 3199
- 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)
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)
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: 3199
- 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: 3199
- 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;
Hors ligne