#1 Tue 09 March 2010 09:52
- Cyril Chat
- Participant actif
- Lieu: Niort
- Date d'inscription: 14 Feb 2010
- Messages: 90
Découpage d'entités en SQL
Bonjour à tous,
Dans le cadre d'un projet, je travaille sur PgAdminIII, et je dois découper une multiline complexe par des points.
Dans la table, cela doit donner plusieurs polylines ayant pour extrémité les points de découpe. Je ne souhaite voir apparaitre, dans la table, que les polylines, donc pas d'union ou autres, simplement un découpage.
Connaitrez vous une fonction en SQL qui permet de faire ceci.
Merci pour vos aides,
A bientôt
Hors ligne
#2 Tue 09 March 2010 10:20
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Découpage d'entités en SQL
Bonjour à tous,
Dans le cadre d'un projet, je travaille sur PgAdminIII, et je dois découper une multiline complexe par des points.
Dans la table, cela doit donner plusieurs polylines ayant pour extrémité les points de découpe. Je ne souhaite voir apparaitre, dans la table, que les polylines, donc pas d'union ou autres, simplement un découpage.
Connaitrez vous une fonction en SQL qui permet de faire ceci.
Merci pour vos aides,
A bientôt
Vous travaillez sur pgadmin ET postgis ?
Pourriez-vous decrire un peu plus precisement ce que vous souhaitez faire ? ces points existent ou representent des positions particulieres sur la ligne ?
Les fonctions de referencement lineaire remplissent cette tache, notamment st_line_interpolate_point():
http://www.postgis.org/documentation/ma … eferencing
Ainsi que les fonction d'intersection ou de difference.
Nicolas
Hors ligne
#3 Tue 09 March 2010 11:02
- Cyril Chat
- Participant actif
- Lieu: Niort
- Date d'inscription: 14 Feb 2010
- Messages: 90
Re: Découpage d'entités en SQL
Oui c'est bien pgAdmin et postgis.
J'ai une table1 comprenant une multiligne complexe et une table2 comprenant des points qui se situent sur la multiligne. La but est que la multiligne soit découper par les points de la table2.
Ce qui fait que les points correspondent aux extrémités des lignes.
Avez vous une solution???
Merci
Hors ligne
#4 Tue 09 March 2010 12:15
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Découpage d'entités en SQL
Oui c'est bien pgAdmin et postgis.
J'ai une table1 comprenant une multiligne complexe et une table2 comprenant des points qui se situent sur la multiligne. La but est que la multiligne soit découper par les points de la table2.
Ce qui fait que les points correspondent aux extrémités des lignes.
Avez vous une solution???
Merci
Un hack rapide:
select astext(st_snaptogrid(st_difference(
geomfromtext('LINESTRING(0 0, 2 2)', -1),
st_expand(geomfromtext('POINT (1 1)', -1)::geometry, 0.00001)
), 0.1));
renvoie:
MULTILINESTRING((0 0,1 1),(1 1,2 2))
Decouper les lignes avec des points legerements etendus (petits rectangles), puis "resnapper" les geometries obtenues sur une grille plus grande pour supprimer les imprecisions.
faire un expand tres petit, en deca de la precisions des données, puis revenir a la precision des données (1 decimale apres la virgule, ici).
Sinon, plus robuste: utiliser st_line_interpolate_point pour calculer le point d'intersection entre une ligne et un point, puis reconstruire les lignes avec ce nouveau point d'intersection.
Nicolas
Hors ligne
#5 Wed 10 March 2010 08:43
- Cyril Chat
- Participant actif
- Lieu: Niort
- Date d'inscription: 14 Feb 2010
- Messages: 90
Re: Découpage d'entités en SQL
Bonjour,
j'ai essayé l'indication donnée par Nicolas Ribot, mais le résultat obtenu ne correspond pas à mes attentes.
Je ne me suis peut être mal expliqué, c'est pour cela que je vous joins un document expliquant clairement mes attentes.
Une aide serait vraiment la bienvenue, merci à tous.
Cyril
Hors ligne
#6 Wed 10 March 2010 14:25
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Découpage d'entités en SQL
Bonjour,
j'ai essayé l'indication donnée par Nicolas Ribot, mais le résultat obtenu ne correspond pas à mes attentes.
Je ne me suis peut être mal expliqué, c'est pour cela que je vous joins un document expliquant clairement mes attentes.
Une aide serait vraiment la bienvenue, merci à tous.
Cyril
Quelque chose comme ca:
create table lignes (id serial primary key, geom geometry);
create table points (id serial primary key, geom geometry);
insert into points(geom) values (geomfromtext('POINT (0 0)'));
insert into points(geom) values (geomfromtext('POINT (6 0)'));
insert into points(geom) values (geomfromtext('POINT (3 3)'));
insert into lignes(geom) values (geomfromtext('MULTILINESTRING ((-1 0, 7 0), (3 0, 3 4))'));
select astext(snapToGrid(st_difference(lignes.geom, st_expand(points.geom, 0.001)), 0.1))
from lignes, points
where st_intersects(lignes.geom, points.geom);
create table resultat as
select lignes.id idlignes, points.id idpoints, snapToGrid(st_difference(lignes.geom, st_expand(points.geom, 0.001)), 0.1) geom
from lignes, points
where st_intersects(lignes.geom, points.geom);
avec une clause where un peu plus subtile pour eviter les segments redondants, ou un traitement apres le snaptogrid pour exploser les multilinestring en linestring et virer les doublons.
Nicolas
Hors ligne
#7 Thu 11 March 2010 12:00
- Cyril Chat
- Participant actif
- Lieu: Niort
- Date d'inscription: 14 Feb 2010
- Messages: 90
Re: Découpage d'entités en SQL
Bonjour,
Merci pour les conseils, mon problème est résolu.
Bonne journée,
Cyril
Hors ligne
#8 Mon 15 March 2010 17:06
- Floflo49fb
- Participant assidu
- Lieu: Montpellier
- Date d'inscription: 29 Aug 2009
- Messages: 250
- Site web
Re: Découpage d'entités en SQL
Bonjour à tous j'ai lu les postes précédents et je me suis renseigné sur le net sur le découpage d'une ligne par un point.
J'arrive bien à découper une ligne avec un point (voir requête jointe) mais je souhaiterais maintenant réaliser une fonction qui permettrait de découper l'ensemble des lignes au niveau des points. Je viens donc par ici pour chercher un peu d'aide sur la réalisation d'une fonction qui réitérerait le découpage en utilisant le gid de chaque vanne (dans la requête jointe je découpe au niveau du gid n°6).
Merci d'avance
Code:
DROP TABLE IF EXISTS coupe; CREATE TABLE coupe(gid int4) with oids; ALTER TABLE coupe ADD COLUMN the_geom geometry; INSERT INTO coupe(the_geom) /*INSERE LA PREMIERE PARTIE DE LA GEOMETRIE*/ (SELECT (ST_SnapToGrid(ST_Line_Substring(ln_geom, 0.0, location), 0)) /*CALCUL DE 0 A LOCATION %, ATTENTION A LA PRECISION*/ FROM ( SELECT (SELECT reseau.the_geom FROM reseau WHERE reseau.gid=(SELECT a.gid FROM (SELECT reseau.gid AS gid, Distance((SELECT vannes.the_geom FROM vannes WHERE vannes.gid =6 ),reseau.the_geom) AS distance FROM reseau ORDER BY distance ASC limit 1) AS a )) AS ln_geom, ST_Line_Locate_Point((SELECT reseau.the_geom FROM reseau WHERE reseau.gid= /*SELECTION DE LA POLYLIGNE LA PLUS PROCHE DU POINT*/ (SELECT a.gid FROM (SELECT reseau.gid AS gid, Distance((SELECT vannes.the_geom FROM vannes WHERE vannes.gid =6 ),reseau.the_geom) AS distance FROM reseau ORDER BY distance ASC limit 1) AS a )), (SELECT vannes.the_geom FROM vannes WHERE vannes.gid =6))AS location /*ST_LINE_LOCATE_POINT QUI CORRESPOND A LOCATION*/ ) AS foo); ------------------------------------------------------------------------------------------------------------------------------------------- INSERT INTO coupe(the_geom) /*INSERE LA SECONDE PARTIE DE LA GEOMETRIE*/ (SELECT (ST_SnapToGrid(ST_Line_Substring(ln_geom,location, 1.0), 0) ) /*CALCUL DE LOCATION % A 1 DE LA LIGNE, ATTENTION A LA PRECISION*/ FROM ( SELECT (SELECT reseau.the_geom FROM reseau WHERE reseau.gid=(SELECT a.gid FROM (SELECT reseau.gid AS gid, Distance((SELECT vannes.the_geom FROM vannes WHERE vannes.gid =6 ),reseau.the_geom) AS distance FROM reseau ORDER BY distance ASC limit 1) AS a )) AS ln_geom, ST_Line_Locate_Point((SELECT reseau.the_geom FROM reseau WHERE reseau.gid= /*JE DEBUTE LA SELECTION DE LA POLYLIGNE LA PLUS PROCHE DU POINT*/ (SELECT a.gid FROM (SELECT reseau.gid as gid, Distance((SELECT vannes.the_geom FROM vannes WHERE vannes.gid =6 ),reseau.the_geom) AS distance FROM reseau ORDER BY distance ASC LIMIT 1) AS a )), (SELECT vannes.the_geom FROM vannes WHERE vannes.gid =6))AS location /*ST_LINE_LOCATE_POINT QUI CORRESPOND A LOCATION*/ ) AS foo);
Florian Boret
Dream it, Make it, Share it
Hors ligne
#9 Tue 16 March 2010 10:09
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Découpage d'entités en SQL
Bonjour à tous j'ai lu les postes précédents et je me suis renseigné sur le net sur le découpage d'une ligne par un point.
J'arrive bien à découper une ligne avec un point (voir requête jointe) mais je souhaiterais maintenant réaliser une fonction qui permettrait de découper l'ensemble des lignes au niveau des points. Je viens donc par ici pour chercher un peu d'aide sur la réalisation d'une fonction qui réitérerait le découpage en utilisant le gid de chaque vanne (dans la requête jointe je découpe au niveau du gid n°6).
Merci d'avance
Bonjour
Et le meme code sans préciser le gid, mais en utilisant une jointure sur la table pour iterer parmi les gid ?
quelque chose comme:
(SELECT reseau.gid AS gid, Distance(vannes.the_geom),reseau.the_geom) AS distance FROM reseau, vannes
Nicolas
Hors ligne