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

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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.


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

Hors ligne

 

#2 Tue 05 September 2017 16:03

tumasgiu
Membre
Lieu: Ajaccio
Date d'inscription: 5 Jul 2010
Messages: 1159

Re: Postgresql/Postgis

Salut,

vous le dites vous même :

decibel a écrit:

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

 

Pied de page des forums

Powered by FluxBB