Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
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

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

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9864
Site web

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9864
Site web

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9864
Site web

Re: mise à jour en fonction

Bien évidement, avec un LIMIT 1 wink

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

 

Pied de page des forums

Powered by FluxBB