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 20 March 2012 15:17

macdoc
Participant occasionnel
Date d'inscription: 31 Jan 2012
Messages: 11

Déterminer le nombre de ligne à 1m , et leur longueur

Bonjour,

Je dispose d'une table comprenant un ensemble de lignestring (20 000), et je cherche à déterminer pour chaque ligne de cette table, le nombre de lignes dans un rayon de 1 mètre et leur longueur.

J'ai testé plusieurs solutions sans toutefois aboutir
1er solution
Segmenter les multilignes pour créer des lignes élémentaires constituées de 2 points
Placer un point tous les 2m sur les lignes élémentaires
Faire un buffer de 1 m autour de chaque point
Faire une intersection entre le buffer et les lignes élémentaires

Sur le dernier point, le temps de calcul est énorme (toujours pas de résultat à 130 000ms) et je n'arrive pas à aboutir. Cette solution ne semble donc pas viable

2ieme solution
Segmenter les multilignes pour créer des lignes élémentaires constituées de 2 points
Faire un buffer sur les lignes élémentaires
faire une intersection entre les buffer et les lignes élémentaires

Là encore cela ne fonctionne pas car les extrémités des buffers s'intersect aux angles droits même en mettant une extrémité carrée.

Bref je bloque un peu, avez vous d'autre idées ou des solutions plus radicales

Cordialement,

Dernière modification par macdoc (Tue 20 March 2012 15:20)


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

Hors ligne

 

#2 Tue 20 March 2012 15:37

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

Re: Déterminer le nombre de ligne à 1m , et leur longueur

macdoc a écrit:

Bonjour,

Je dispose d'une table comprenant un ensemble de lignestring (20 000), et je cherche à déterminer pour chaque ligne de cette table, le nombre de lignes dans un rayon de 1 mètre et leur longueur.

J'ai testé plusieurs solutions sans toutefois aboutir
1er solution
Segmenter les multilignes pour créer des lignes élémentaires constituées de 2 points
Placer un point tous les 2m sur les lignes élémentaires
Faire un buffer de 1 m autour de chaque point
Faire une intersection entre le buffer et les lignes élémentaires

Sur le dernier point, le temps de calcul est énorme (toujours pas de résultat à 130 000ms) et je n'arrive pas à aboutir. Cette solution ne semble donc pas viable

2ieme solution
Segmenter les multilignes pour créer des lignes élémentaires constituées de 2 points
Faire un buffer sur les lignes élémentaires
faire une intersection entre les buffer et les lignes élémentaires

Là encore cela ne fonctionne pas car les extrémités des buffers s'intersect aux angles droits même en mettant une extrémité carrée.

Bref je bloque un peu, avez vous d'autre idées ou des solutions plus radicales

Cordialement,


Bonjour,

Quelque chose comme ca:

Code:

select l1.id as idline1, l2.id as idline2, st_length(l2.geom)
from line l1, line l2
where l1.gid <> l2.gid
and st_dwithin(l1.geom, l2.geom, 1);

Attention, ca peut prendre un max de temps s'il y a bcp d'entree.

Une erreur classique est de vouloir creer un buffer qd on cherche des objets proches les uns des autres: c'est lent et souvent inutile de creer une geometrie (buffer)
st_dwithin est tres efficace pour cela.

Nicolas

Dernière modification par Nicolas Ribot (Tue 20 March 2012 15:52)

Hors ligne

 

#3 Tue 20 March 2012 16:15

macdoc
Participant occasionnel
Date d'inscription: 31 Jan 2012
Messages: 11

Re: Déterminer le nombre de ligne à 1m , et leur longueur

merci bien ,
Votre requête  fonctionne j'ai ajouter une colonne pour avoir la longueur de contact et supprimer les lignes qui se touchent aux extrémités


drop table if exists test;
create table test as
select
       st_intersection(st_buffer(l1.the_geom,1), l2.the_geom)as the_geom,
        l1.gid as idline1,
       l2.gid as idline2,
      st_length(l2.the_geom), st_length(ST_intersection(st_buffer(l1.the_geom,1), l2.the_geom)) as long_contact
FROM
    ligne1 as l1,
    ligne1 as l2
where l1.gid <> l2.gid
and st_touches (l1.the_geom, l2.the_geom) is false
and st_dwithin(l1.the_geom, l2.the_geom, 1)


Cdt

Dernière modification par macdoc (Tue 20 March 2012 17:42)

Hors ligne

 

#4 Tue 20 March 2012 17:42

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

Re: Déterminer le nombre de ligne à 1m , et leur longueur

macdoc a écrit:

merci bien ,
cela à l'air de fonctionner par contre cela ne me donne pas la longueur de contact dès lors que j'ai une ligne qui est à un mètre de l'autre.

Cdt


Pardon, j'ai lu un peu vite: vous voulez connaitre la longueur de la ligne située a moins de 1m d'une autre ?
Dans ce cas, oui, il vous faudra un buffer pour pouvoir intersecter les lignes avec ces buffers et determiner la longueur de l'intersection.

Peut etre en creant avant une table des buffers de lignes, pour ne pas faire le calcul en live.

Nicolas

Hors ligne

 

Pied de page des forums

Powered by FluxBB