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 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: 1537

Re: Découpage d'entités en SQL

Cyril Chat a écrit:

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: 1537

Re: Découpage d'entités en SQL

Cyril Chat a écrit:

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


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

Hors ligne

 

#6 Wed 10 March 2010 14:25

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1537

Re: Découpage d'entités en SQL

Cyril Chat a écrit:

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: 1537

Re: Découpage d'entités en SQL

Floflo49fb a écrit:

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

 

Pied de page des forums

Powered by FluxBB