#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)
Hors ligne
#2 Tue 20 March 2012 15:37
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: 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,
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: 1554
Re: Déterminer le nombre de ligne à 1m , et leur longueur
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