#1 Tue 15 July 2008 17:05
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
mise à jour en fonction
Bonjour,
Je travail sur postgis/winXP.
Je souhaite créer une table basée sur deux autres (couches de points) en associant aux objets de la première une propriété de l'objet le plus proche dans la deuxième.
J'utilise une requête :
Code:
select a.*, b.alti from tmp_pts a,mnt b where Distance(a.the_geom,b.the_geom)=(select min(foo.valeur) from (select d.alti as z,distance(d.the_geom,c.the_geom) as valeur from tmp_pts c, mnt d)foo);
basée sur les publications de Jean David Techer (merci à lui ).
http://www.davidgis.fr/documentation/wi … #id2508149
Cependant le traitement est très long (une couche >1.5millions de points/1>50000points), en attendant le résultat pouvais vous me faire vos remarques éventuelles sur la pertinence (ou la bonne adaptation) de cette requête.
Merci
(desole pour le titre...)
En fait il s'agit de faire l'élévation d'un couche par rapport à un MNT (c'est vrai que c'est plus clair comme ca).
Je n'ai pour l'instant pas eu de résultat probant...
Dernière modification par jonathan (Thu 17 July 2008 14:55)
Hors ligne
#2 Thu 17 July 2008 16:29
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
J'ai créé des index gist et adapté ma requête. Cependant j'obtiens toujours une erreur.
Code:
create table result as select a.*, b."X", b."Y", b."Z" from tmp_pts_aep a,mnt_lg b where Distance(a.the_geom,b.the_geom)=(select min(distance(d.the_geom,c.the_geom)) from tmp_pts_aep c, mnt_lg d where d.the_geom && 'BOX3D(x(c.the_geom)-30 y(c.the_geom)-30, x(c.the_geom)+30 y(c.the_geom)+30)'::box3d);
erreur :
Code:
ERREUR: BOX3D parser - couldnt parse. It should look like: BOX3D(xmin ymin zmin,xmax ymax zmax) or BOX3D(xmin ymin,xmax ymax) ********** Erreur ********** ERREUR: BOX3D parser - couldnt parse. It should look like: BOX3D(xmin ymin zmin,xmax ymax zmax) or BOX3D(xmin ymin,xmax ymax) État SQL :XX000
Merci d'avance pour votre aide.
Dernière modification par jonathan (Thu 17 July 2008 16:33)
Hors ligne
#3 Fri 18 July 2008 08:33
- ranalisolofo.larrys
- Participant occasionnel
- Lieu: Ambolonkandrina
- Date d'inscription: 19 Jul 2007
- Messages: 40
- Site web
Re: mise à jour en fonction
Au lieu d'utiliser BOX3D utilise plutôt BOX2D parce que tu n'as que le x et y.
Hors ligne
#4 Fri 18 July 2008 08:48
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Bonjour,
Je me suis aussi fais cette réflexion mais il semble qu'on puisse utiliser la box3d de cette façon.
Sinon :
Code:
....'BOX2D(x(c.the_geom)-25 y(c.the_geom)-25, x(c.the_geom)+25 y(c.the_geom)+25)'::box2d);
erreur :
Code:
ERREUR: BOX2DFLOAT4 parser - doesnt start with BOX(
et
Code:
....'BOX(x(c.the_geom)-25 y(c.the_geom)-25, x(c.the_geom)+25 y(c.the_geom)+25)'::box2d);
erreur :
Code:
ERREUR: BOX2DFLOAT4 parser - couldnt parse. It should look like: BOX(xmin ymin,xmax ymax)
Merci.
Dernière modification par jonathan (Fri 18 July 2008 08:49)
Hors ligne
#5 Fri 18 July 2008 10:14
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Le problème, c'est ce qu'il y a dans les box3D : x(a.the_geom)+30...
Peut on utiliser une fonction à cette endroit ? Si oui comment ?
Merci
Hors ligne
#6 Fri 18 July 2008 10:28
- Guillaume Sueur
- Participant assidu
- Lieu: Toulouse
- Date d'inscription: 23 Sep 2005
- Messages: 331
- Site web
Re: mise à jour en fonction
et pourquoi pas ST_expand(geometry, float) ?
cela permet de définir une BBOX à partir de l'extent d'une géométrie augmentée dans tous les sens de la valeur du deuxième paramètre.
Guillaume
Hors ligne
#7 Fri 18 July 2008 11:03
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Super !!!
La requête est partie. J'attends le résultat.
Merci.
Hors ligne
#8 Mon 21 July 2008 08:50
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
La requête ne m'a retourné que deux lignes : celles pour lesquelles les points d'une couche avaient les coordonnées x et y égales (sur la partie entière) aux points de l'autre couche.
2 points sur environ 20000 !
Hors ligne
#9 Wed 23 July 2008 08:44
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Code:
SELECT a.*, b.gid, b."X",b."Y",b."Z" FROM tmp_pts_aep a,mnt_lg b WHERE b.gid=(SELECT d.gid FROM tmp_pts_aep c, mnt_lg d WHERE d.the_geom && buffer(c.the_geom,30) ORDER BY distance(a.the_geom,b.the_geom) LIMIT 1) ;
La requête tourne depuis plus de 20 heures sans résultat...
Au secours
Hors ligne
#10 Wed 23 July 2008 09:27
Re: mise à jour en fonction
Bonjour,
Quels sont les index créés sur cette requête ?
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#11 Wed 23 July 2008 10:58
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Des index gist sont créés sur chacune des tables.
Hors ligne
#12 Wed 23 July 2008 11:37
Re: mise à jour en fonction
Bonjour,
Je pense pas que la manière dont tu t'y prennes soit la meilleur. Les Buffer, ORDER BY, distance() sont des fonctions/commandes qui demandent pas mal de ressource !
Voici les améliorations que je te propose :
1/ créer un champ buffer dans ta table tmp_pts_aep
2/ Créer une table temporaire :
Code:
CREATE TABLE tmp AS SELECT d.gid FROM tmp_pts_aep c, mnt_lg d WHERE d.the_geom && c.buffer ORDER BY distance(a.the_geom,b.the_geom) LIMIT 1
3/ faire ta requête finale :
Code:
SELECT a.*, b.gid, b."X",b."Y",b."Z" FROM tmp_pts_aep a,mnt_lg b INNER JOIN tmp USING(gid);
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#13 Wed 23 July 2008 13:52
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Merci,
Le problème, c'est que cette requête retourne une table d'une seule ligne.
Code:
CREATE TABLE tmp AS SELECT b.gid FROM tmp_pts_aep a, mnt_lg b WHERE b.the_geom && a.buffer ORDER BY distance(a.the_geom,b.the_geom) LIMIT 1
Hors ligne
#14 Wed 23 July 2008 15:13
Re: mise à jour en fonction
Bien évidement, avec un LIMIT 1
La clause LIMIT est constituée de deux sous-clauses indépendantes :
LIMIT { nombre | ALL }
OFFSET début
nombre spécifie le nombre maximum de lignes à renvoyer alors que début spécifie le nombre de lignes à passer avant de commencer à renvoyer des lignes. Lorsque les deux clauses sont spécifiées, début lignes sont passées avant de commencer à compter les nombre lignes à renvoyer.
[source : http://docs.postgresqlfr.org/8.2/sql-se … #sql-limit]
Y.
Dernière modification par Yves (Wed 23 July 2008 15:14)
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#15 Wed 23 July 2008 16:27
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Je voyais plustot ca comme un seul point retourné par point de reference. (le point le plus pres de chaque point d'une autre couche (20000pts)
GRASS sait-il faire cette élévation.
Merci
Hors ligne
#16 Mon 28 July 2008 08:42
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: mise à jour en fonction
Bonjour,
J'ai résolu mon problème sans fonctionnalité spatiale (en partie seulement).
-création d'une table (ID_DIST) avec les identifiants des points des deux tables et la distance qu'il y a entre chacun deux (dans la limite d'un buffer).
-auto jointure qui retourne l'occurrence ayant la distance minimale pour chaque identifiant d'une des couches.
-mise à jour d'une des tables en fonction de ID_DIST.
(L'élévation que je souhaite obtenir sera possible grâce à une macro fournie par le logiciel que j'utilise.)
Hors ligne