#1 Fri 04 September 2009 20:42
- af
- Participant occasionnel
- Date d'inscription: 6 Sep 2005
- Messages: 28
[POSTGIS] Requête Intersects et Buffer
Bonjour,
J'ai une couche de cours d'eau et une couche de points GPS relevés sur le terrain.
Je cherche donc à connaître le linéaire en mètres effectué sur le terrain en déterminant le point d'entrée et de sortie sur chaque tronçon. Les points GPS ne sont évidemment pas calés sur le linéaire de cours d'eau.
Ma 1ère requête fut la suivante :
SELECT Astext(ST_line_interpolate_point(L.the_geom, ST_line_locate_point(L.the_geom, P.the_geom))) FROM ref_vecteur.res_hydro as L, metiers_png.mpvr_gps as P;
Or il me rapporte des centaines de points dont certains en double ?
J'ai ensuite testé avec couche contenant une ligne et autre couche avec deux points, dans ce cas la même requête fonctionne bien. J'ai donc pensé qu'il me fallait d'abord sélectionner les tronçons en créant un buffer autour des points, puis lancer la requête initiale sur cette sélection.
Je bloque maintenant sur la requête de buffer :
SELECT * from ref_vecteur.test_line where ST_Intersects(the_geom, (SELECT st_buffer(the_geom,100000) as buffer from ref_vecteur.test_point));
ERROR : more than one row returned by a subquery used as an expression
Si qq a une idée d'une part sur la requête de buffer et d'autre part sur son intégration dans la requête intiale, je suis preneur. Merci d'avance
Alain Ferchal
Hors ligne
#2 Fri 11 September 2009 23:38
- af
- Participant occasionnel
- Date d'inscription: 6 Sep 2005
- Messages: 28
Re: [POSTGIS] Requête Intersects et Buffer
je réponds à moi même et pour ceux que ça peut intéresser.
J'ai résolu une partie du pb, à savoir le fait qu'il me rapporte des centaines de points. En fait la requête lance le calcul de point le plus proche sur chaque point et sur chaque ligne de l'ensemble de la couche !!
1 ligne - 2 points = 2 points recalculés
2 lignes - 2 points = 4 points recalculés
...
Il suffit donc de rajouter une condition avec une jointure entre les 2 couches (ex un id commun) pour limiter les calculs des points au cours d'eau concerné.
SELECT Astext(ST_line_interpolate_point(L.the_geom, ST_line_locate_point(L.the_geom, P.the_geom))) FROM ref_vecteur.res_hydro as L, metiers_png.mpvr_gps as P WHERE L.id = P.id;
+
AF
Hors ligne