#1 Tue 05 September 2017 12:58
- decibel
- Juste Inscrit !
- Date d'inscription: 5 Dec 2016
- Messages: 7
Postgresql/Postgis
Bonjour,
Je dispose d'un shapefile de lignes et de 2 shapefiles de points 'points' et 'points_bis'. Je les ai tous les 3 importé dans une base de données sur Postgresql. Dans ma table de lignes, j'ai le champ 'id', le champ 'point_1', le champ 'point_2', le champ 'point_bis1' et le champ 'point_bis2'. Je souhaite récupérer le nom des points de part et d'autre de chaque ligne. Une ligne peut commencer par un point de 'points' et se terminer par un point de 'points_bis' ou bien être reliée aux extrémités par les points d'une même couche de points ou bien commencer par un point et se terminer par rien.
J'ai d'abord transformé le type de géométrie des lignes de MultiLinestring en LineString.
Je précise qu'il peut y avoir des lignes qui ont été doublées ou triplées. Les points ne touchent pas forcément les lignes.
Voici mes requêtes :
--Forcer la géométrie en 3d à se transformer en 2d--
ALTER TABLE polylignes
ALTER COLUMN geom TYPE geometry(MultiLineString)
USING ST_Force_2D(geom);
--Transformer la géométrie Multilinestring en Linestring--
ALTER TABLE polylignes
ALTER COLUMN geom TYPE geometry(linestring,27572) USING ST_GeometryN(geom, 1);
--Sélectionner les noms des noeuds de départ et d'arrivée qui s'intersectent avec les lignes--
select gid,
(select nom from points_bis n where st_within(st_startpoint(p.geom), st_buffer(n.geom, 1))) n_deb,
(select nom from points_bis where st_within(st_endpoint(p.geom), st_buffer(n.geom, 1))) n_fin
from polylignes p;
J'obtiens 473 lignes dont la plupart sont vides, juste 4 cellules sont remplies.
En faisant une intersection entre les lignes et le buffer des points_bis avec le résultats des identifiants dans une table temporaires, j'ai 6 lignes, alors que je devrais en avoir plus d'un centaine.
Requête :
SELECT
(st_intersection(polylignes.geom,st_buffer(points_bis.geom, 2))) AS geom,
points_bis.id_app,
polylignes.id_tro
INTO t_temp
FROM
points_bis,
polylignes
WHERE
points_bis.geom && polylignes.geom
AND
st_intersects(points_bis.geom,polylignes.geom);
J'ai joint mes 3 shapefiles, ci-joints.
Merci pour votre aide.
Hors ligne
#2 Tue 05 September 2017 16:03
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1160
Re: Postgresql/Postgis
Salut,
vous le dites vous même :
Les points ne touchent pas forcément les lignes.
Normal que le st_intersects ne renvoie pas grand chose, dans le cas de votre seconde requête.
Il ne vous reste plus qu'à déterminer la distance maximale à laquelle
vous considérez que deux points sont <<égaux>>.
Hors ligne