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é ?

#1 Mon 20 April 2009 16:52

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

posgis grande ligne

bonjour,
je dois faire une appli web avec comme bdd postgis
je ne connais pas, voila une semaine que je lis de la doc....et je suis un peu perdue

la demande me paraissait simple au depart...

a partir de gros fichiers texte (donnees meteo) à integrer dans la bdd, permettre a un utilisateur, qui soumet un fichier de coordonnees x,y, d'obtenir ces infos.

j'ai donc parser le fichier et peupler une table de test en creant des objets points pour les coordoonees du fichier
et creation d'un index GIST sur l'objet point.

constat : table trop volumineuse, il faut faire autrement

je pense a decouper ma grille, en rectangle, et stocker ces infos dans une table annexe qui comporterait donc les coord. du rectangle et le nom de table comportant les points de ce rectangle (partitionnement)

ce decoupage est arbitraire, peut être que je peux couper ma grille de maniere plus sementique  : region administrative, geographique, quel demarche dois adopter ? quels sont les outils ? les grnades lignes ?

mais même comme cela j'imagine que les temps de reponse vont etre monstrueux,
ma table test comporte plus de 2 millions de lignes
l'utilisateur upload son fichier de coordonnees x,y (je ne connais pas encore la taille que fera ce fichier)
cela veut dire que pour chaque ligne de fichier il va falloir 1: faire une requete dans la table annexe et savoir dans quel rectangle et donc table il se trouve.2: faire une requete dans la dite table et recuperer les donnees meteo y afferant.


via l'appli web(php) j'ai eu a faire face au time out depassé, je l'ai augmenté et il vaut 120s
cependant je pense que ce n'est pas la bonne solution, je pensais me tourner vers des scripts cgi, qu'en pensez vous ?
avez vous une piste/experience sur le traitement de grosse volumetrie de donnees et delegation, d'optimisation, ...

merci d'avance, toute piste m'aidera vraiment a y voir plus clair!
n

Hors ligne

 

#2 Mon 20 April 2009 17:06

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

Re: posgis grande ligne

Bonjour,

J'ai une table de 15 millions qui est requêté via une appli web et les temps sont corrects. Qu'appelez vous un temps monstrueux ? Quelle est la puissance de la machine: proc, mémoire, vitesse du disque ? Avez vous tenté de faire un EXPLAIN <requete SQL> pour voir où cela met le plus de temps ? Bref, quelle requête SQL réalises tu ?

Au niveau des index, il est possible de définir des index assez spécifique sur d'autres colonnes ou certaine valeurs (GROUP BY) etc.

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

 

#3 Mon 20 April 2009 18:31

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1538

Re: posgis grande ligne

nine a écrit:

bonjour,
je dois faire une appli web avec comme bdd postgis
je ne connais pas, voila une semaine que je lis de la doc....et je suis un peu perdue

la demande me paraissait simple au depart...

a partir de gros fichiers texte (donnees meteo) à integrer dans la bdd, permettre a un utilisateur, qui soumet un fichier de coordonnees x,y, d'obtenir ces infos.

j'ai donc parser le fichier et peupler une table de test en creant des objets points pour les coordoonees du fichier
et creation d'un index GIST sur l'objet point.

constat : table trop volumineuse, il faut faire autrement

je pense a decouper ma grille, en rectangle, et stocker ces infos dans une table annexe qui comporterait donc les coord. du rectangle et le nom de table comportant les points de ce rectangle (partitionnement)

ce decoupage est arbitraire, peut être que je peux couper ma grille de maniere plus sementique  : region administrative, geographique, quel demarche dois adopter ? quels sont les outils ? les grnades lignes ?

mais même comme cela j'imagine que les temps de reponse vont etre monstrueux,
ma table test comporte plus de 2 millions de lignes
l'utilisateur upload son fichier de coordonnees x,y (je ne connais pas encore la taille que fera ce fichier)
cela veut dire que pour chaque ligne de fichier il va falloir 1: faire une requete dans la table annexe et savoir dans quel rectangle et donc table il se trouve.2: faire une requete dans la dite table et recuperer les donnees meteo y afferant.


via l'appli web(php) j'ai eu a faire face au time out depassé, je l'ai augmenté et il vaut 120s
cependant je pense que ce n'est pas la bonne solution, je pensais me tourner vers des scripts cgi, qu'en pensez vous ?
avez vous une piste/experience sur le traitement de grosse volumetrie de donnees et delegation, d'optimisation, ...

merci d'avance, toute piste m'aidera vraiment a y voir plus clair!
n


Bonjour,

Je vais dans le sens d'Yves pour confirmer que des bases avec des centaines de millions d'enregistrements tournent sans problemes (plusieurs tera octets de données au total).

Quand vous dites: "constat : table trop volumineuse, il faut faire autrement", quelle limite avez-vous rencontré ? insertion impossible, ou requetes longues sur la table créée ?

Il faut egalement savoir qu'une installation classique de Postgresql ne convient pas trop pour des bases volumineuses: en effet, la configuration par defaut est pour le moins minimaliste. Il faut donc régler la base pour l'utilisation qu'on souhaite en faire (memoire, espaces temporaires, nombre de connexion, partitionnement des tables sur des disques rapides, etc.)

Nicolas

Hors ligne

 

#4 Mon 20 April 2009 22:00

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

Merci Yves et Nicolas, cela me soulage de savoir que c'est largement faisable.

je dois donc focaliser sur l'optimisation/configuration de ma bdd et des tables.

j'ai déjà une piste concernant la lenteur d'exécution : j'utilisais mdb2 comme passerelle entre l'appli et la bdd.
en utilisant directement les fonctions de php : pg_connect ... je constate une sacrée différence.

pour l'instant je travaille sur un simple pc. je souhaite appréhender suffisamment postgis avant de travailler sur le serveur de prod (je n'ai pas en tête les caractéristiques du serveur, je sais que c'est une debian avec une installation "par defaut" de posgres/postgis et que c'est un serveur virtuel vmware).

pour l'instant mes requêtes sont vraiment basiques : select id, asText(pluvio_geom) as geom, pr, tx, tn from pluvio.

pour trouver un point précis, comment procédez vous ? j'ai vu 2 choses :

- la fonction distance : lancer une requete en mettant un critere de distance = 0, mais peu performant ;
- d'après mes lectures il est préférable de créer un index GIST sur le geom et d'utiliser && 3DBOX,
je n'ai pas encore testé, est -ce la bonne pratique dans mon cas ?

je pensais encore a une solution : intégrer le fichier utilisateur (contenant les coordonnées à retrouver) dans une table temporaire et faire une intersection, qu'en pensez vous ?

je pousse un peu plus loin pour vous donner des chiffres précis et vous tiens informés. Merci grandement a vous.

n

pour intégrer un fichier de 500 MO via php, j'ai du le couper en tronçon de 15 MO, ensuite j'ai parsé les fichiers un à un pour faire des insert dans la bdd, sachant que je devrais aussi automatiser le peuplement de la bdd, connaissez vous un autre moyen de faire ? je pense notamment a ce que fait Mysql pour les dump de fichier où l'on peut préciser le séparateur de champs, etc mais je n'ai pas trouvé pour postgres

Hors ligne

 

#5 Mon 20 April 2009 22:47

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

Re: posgis grande ligne

pour intégrer un fichier de 500 MO via php, j'ai du le couper en tronçon de 15 MO, ensuite j'ai parsé les fichiers un à un pour faire des insert dans la bdd, sachant que je devrais aussi automatiser le peuplement de la bdd, connaissez vous un autre moyen de faire ? je pense notamment a ce que fait Mysql pour les dump de fichier où l'on peut préciser le séparateur de champs, etc mais je n'ai pas trouvé pour postgres


As-tu essayé la fonction COPY pour integrer les fichiers texte?
C'est un fonction qui marche bien. Mais il faut créer la table vide avant et définir les types des champs.

Parfois, quand j'ai un gros fichier texte avec beaucoup de champs, je passe par le logiciels R et le package RODBC.

Je n'ai jamais eu de problème que ce soit avec la fonction COPY pour integrer des très gros fichiers txt (de quelques Go).
Avec R et le lien ODBC, j'ai parfois quelques soucis si la base est très lourde.

Il m'arrivait aussi de passer par MS ACCESS (et lien ODBC) mais c'est un peu plus lent et le nombre de champs est limité.

Pour les requêtes via php(pg_connect, pg_query...), elles sont quasi aussi rapides que directement sous postgis.
Je ne connais pas les caractéristuqes de notre serveur (où est apache et postgis) mais c'est je pense que c'est une bonne bête!


pour certaines requetes spatiales, il faut effectivement faire un index et des conditions de superposition des box avec &&.

A bientot,


Pascal PLUVINET

Hors ligne

 

#6 Tue 21 April 2009 12:55

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

Re: posgis grande ligne

nine a écrit:

pour intégrer un fichier de 500 MO via php, j'ai du le couper en tronçon de 15 MO, ensuite j'ai parsé les fichiers un à un pour faire des insert dans la bdd, sachant que je devrais aussi automatiser le peuplement de la bdd, connaissez vous un autre moyen de faire ? je pense notamment a ce que fait Mysql pour les dump de fichier où l'on peut préciser le séparateur de champs, etc mais je n'ai pas trouvé pour postgres


Rapidement car j'ai une urgence wink

SpatialDataIntegrator permet d'importer des données en grande quantité shp => postgis et de restructurer ces données si nécessaire (GeoKettle doit permettre aussi de réaliser ce genre de chose mais je ne l'ai pas vraiment utiliser).

Pour l'optimisation de la base de données, voici une propo  de méthodo : http://softlibre.gloobe.org/doku.php/fo … ationpgsql

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

 

#7 Tue 21 April 2009 13:47

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

merci encore,
effectivement hier soir j'ai pu testé la commande copy, voici les resultats (sur mon portable, j'espere mieux sur serveur)

tuto url : http://www.bostongis.com/?content_name=postgis_tut03

Importing the Data into PostGreSQL :

Create the table to import to :

CREATE TABLE pluvio2
(
  mois integer,
  x double precision,
  y double precision,
  pr double precision
)
WITH (OIDS=FALSE);


The COPY command :

COPY pluvio2 FROM 'C:/Users/naima/Documents/STAGE/AURELHY/RR.txt'  USING DELIMITERS ';' ;

RR.txt looks like that :
month;x,y,Pluviometry
1;670;23960;81.9
1;680;23970;82.7
....

La requête a été exécutée avec succés : 7172308 lignes modifiées. La requête a été exécutée en 156247 ms.

Creating and Populating the Geometry Field :

Create the Geometry Field :

SELECT AddGeometryColumn( 'public', 'pluvio2', 'pluvio_geom', 27582, 'POINT', 2 );

temps d'execution : 19633 ms.

Populate the Geometry Field using the Longitude and Latitude fields :

UPDATE pluvio2 SET pluvio_geom = setsrid(makepoint(x, y),27582);

La requête a été exécutée avec succés : 7172308 lignes modifiées. La requête a été exécutée en 156950 ms.

Index your spatial fields :

CREATE INDEX idx_pluvio2_geom ON pluvio2 USING GIST (pluvio_geom);

La requête a été exécutée avec succès en 405315 ms, mais ne renvoie aucun résultat.

une autre question : modelisation bdd
-------------------------------------------------------

la structure du fichier (pluvio) importé est la suivante :
mois;x;y;pluvio;

pour chaque mois 550 000 lignes env.

on se trouve avec une redondance au niveau des points (on a le même point pour les 12 mois de l'année)

j'aimerai optimisé cela :

1- soit je crée 12 tables pour les 12 mois
2- soit je crée 1 table avec 12 colonnes pour les 12 mois dans lesquelles je stocke la pluvio
3- y'a t'il une autre possibilité ?

en tenant compte de plusieurs paramètres :

1- en entree sera soumis le fichier de l'utilisateur final, celui ci comporte des coordonnées x et y
    ces coordonnées pourront correspondre à des points concentrés dans la même région ou éparpillés dans toute la France.
2- dans un second temps, je devrais remonter le point le plus proche (j'imagine que le calcul est un petit peu plus complexe et gourment en cpu et qu'il faut prévoir/optimiser la table dans cette perspective)

je fais les tests pour ces 2 solutions, je vous donneria le temps d'execution plus tard.

Croisement des donnees utilisateurs et la bdd :
---------------------------------------------------------

pour croiser les données utilisateurs , je stocke le fichier dnsa une table temporaire et fais une requete comme ceci :

select t1.pr, t2.x, t2.y, s.mois from pluvio2 t2, user_data t2 where t1.x = t2.x and t1.x = t2.y

(pluvio2 etnat la table possedant tous les mois :  soit au total env 7 million de lignes)

(user_data possede une quarantaine de lignes)

temps d'execution = 26016 ms

merci d'avance pour tous les conseils,

n

Hors ligne

 

#8 Wed 22 April 2009 10:33

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

bonjour a tous

tout d'abord merci ! c'est grace a vous que je progresse dans la realisation et comprehension de ce qu'il m'est demandé .

pour resumer, la trame du traitement :

depot des 3 fichiers (500 MO / fichier) sur le serveur. (librairie curl de php) OK . tps execution (de memoire!) 1'30''/par fichier

integration de ces fichiers dans les tables --> copy OK . tps execution 156247 ms pour le premier fichier (pluvio).

restructuration de ces tables --> OK . tps execution 176093 ms

INSERT INTO table1 (x, y, i_pr, ii_pr, ... xii_pr)
SELECT
    x, y,
    sum(case mois when 1 then pr else 0 end) AS i_pr,
    sum(case mois when 2 then pr else 0 end) AS ii_pr,
...
    sum(case mois when 12 then pr else 0 end) AS xii_pr,
FROM table2
GROUP BY x, y
ORDER BY x, y;


creation du geom point.


prise une à une je realise la totalité des taches sans depasser le time out de la page web.
dans le cas contraire....j'obtient un beau message d'erreur.

comment procedez vous de maniere generale pour de gros traitement de donnees ? je ne pense pas que la maniere interactive (web client/serveur) soit judicieuse, j'aimerai faire quelque chose comme ca :

l'administrateur via l'appli depose son gros fichier, il clique sur un bouton "traiter" et il reprend la main.
derriere un script s'executerai en faisant tout le travail et peu importe le temps que ca prendra. une fois le traitement fini, l'utilisateur en est informé d'une manière ou d'une autre (mail ?)

est-ce faisable ?

les scripts cgi sont ils capables de ca ? j'ai lu certain post et/ou doc mais je ne suis pas sure de bien comprendre comment ça marche.

mais peut etre suis je hors sujet maintenant. mais j'aimerai beucoup avoir le retour sur ce forum de personnes travaillant avec de gros volumes et leur maniere de faire, experience, ...

merci d'avance pour votre aide,

n

Hors ligne

 

#9 Wed 22 April 2009 10:38

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

Re: posgis grande ligne

Bonjour,

Regarde du côté de spatialDataIntegrator dont j'ai déjà parlé plus haut. Il te permettra soit d'utiliser le projet sous forme de webservice soit avec une pseudo interface graphique qui demande le chemin du fichier pour traitement. Il est capable d'envoyer des mails lorsqu'il y a un problème ou non, de restructurer les données, etc.

Outils un peu complexe à prendre en main, mais quand on a compris comment il fonctionne, cela permet d'industrialiser des tâches qui sont aussi complexe à mettre en place sous forme de script php, python ou autre.

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

 

#10 Wed 22 April 2009 11:22

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

ok je vais regarder, webservice ça m'interresse!

mais je suis contrainte de fournir une application qui tourne alors si la prise en main est difficile...je prefere gérer en php.

merci, a+

n

Hors ligne

 

#11 Wed 22 April 2009 12:10

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1538

Re: posgis grande ligne

nine a écrit:

bonjour a tous

tout d'abord merci ! c'est grace a vous que je progresse dans la realisation et comprehension de ce qu'il m'est demandé .

pour resumer, la trame du traitement :

depot des 3 fichiers (500 MO / fichier) sur le serveur. (librairie curl de php) OK . tps execution (de memoire!) 1'30''/par fichier

integration de ces fichiers dans les tables --> copy OK . tps execution 156247 ms pour le premier fichier (pluvio).

restructuration de ces tables --> OK . tps execution 176093 ms

INSERT INTO table1 (x, y, i_pr, ii_pr, ... xii_pr)
SELECT
    x, y,
    sum(case mois when 1 then pr else 0 end) AS i_pr,
    sum(case mois when 2 then pr else 0 end) AS ii_pr,
...
    sum(case mois when 12 then pr else 0 end) AS xii_pr,
FROM table2
GROUP BY x, y
ORDER BY x, y;


creation du geom point.


prise une à une je realise la totalité des taches sans depasser le time out de la page web.
dans le cas contraire....j'obtient un beau message d'erreur.

comment procedez vous de maniere generale pour de gros traitement de donnees ? je ne pense pas que la maniere interactive (web client/serveur) soit judicieuse, j'aimerai faire quelque chose comme ca :

l'administrateur via l'appli depose son gros fichier, il clique sur un bouton "traiter" et il reprend la main.
derriere un script s'executerai en faisant tout le travail et peu importe le temps que ca prendra. une fois le traitement fini, l'utilisateur en est informé d'une manière ou d'une autre (mail ?)

est-ce faisable ?

les scripts cgi sont ils capables de ca ? j'ai lu certain post et/ou doc mais je ne suis pas sure de bien comprendre comment ça marche.

mais peut etre suis je hors sujet maintenant. mais j'aimerai beucoup avoir le retour sur ce forum de personnes travaillant avec de gros volumes et leur maniere de faire, experience, ...

merci d'avance pour votre aide,

n


Bonjour,

Effectivement, le mode web pour des gros traitements, ce n'est pas le plus simple a mettre en oeuvre, sachant que http attend une reponse correspondant a une requete, dans un temps limité.

Le principe que tu évoques peut etre mis en place en lacant une commande  (shell ou autrre) qui effectue le traitement Postgis et "ecrit" qqpart si le traitement est en cours ou terminé (par exemple en créant un fichier au debut du traitement et en supprimant ce fichier a la fin.)

L'interface Web permet de declencher ce traitement et permet egalement de suivre l'avancement du traitement (temps entre la creation du fichier et l'heure actuelle). Elle peut dire si le traitement est terminé (plus de fichier présent).

Un autre mode operatoire pourrait etre de deposer les fichiers en question dans un repertoire, régulierement scanné (cron ou tache windows) par le programme de traitement, qui traite les fichiers présent et les deplace dans un autre repertoire une fois le traitement effectué. Effectivement, un mail peut etre envoyé en fin de traitement.

Nicolas

Hors ligne

 

#12 Wed 22 April 2009 13:17

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

c'est super, c'est exactement ce vers quoi je voulais aller.

j'ai mis en place de petit script cgi en perl mais je ne savais comment avoir la fin de traitement...

je me tourne vers cette solution,

un grand merci !

n

Hors ligne

 

#13 Wed 03 June 2009 15:15

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

Bonjour,

je reviens vers vous après avoir passe un certain temps sur cette appli. ça avance!

j'ai finalement opté pour la solution de Nicolas (Merci!) :
en php j'exécute un script shell chargé de lancer la procédure stockée, en tache de fond.

et ça marche plutôt bien.

mais j'ai un autre soucis et j'avoue que j'avais reussi a biaiser jusqu'a present : le calcul des distances!

soit en entrée un fichier avec des coordonnes x,y. que je stocke temporairement dans la base de donnees :

Code:

--creation de la table temporaire 
CREATE TABLE tmp_user_data
(
  x double precision,
  y double precision
);


--integration du fichier dans la table temporaire
cp := 'COPY tmp_user_data FROM ' || QUOTE_LITERAL(file) || ' USING DELIMITERS ' || QUOTE_LITERAL(delim);
EXECUTE cp;

RAISE NOTICE 'cp=%', cp;

CREATE TABLE tmp_user (
  id serial,
  x_ori double precision,
  y_ori double precision,
  x_cal double precision,
  y_cal double precision  
);

--calcul du point le plus proche
INSERT INTO tmp_user (x_ori,y_ori,x_cal,y_cal) SELECT x,y, round(x/10)*10 , round(y/10)*10 from tmp_user_data;

je croise ces x,y avec les couches stockées dans la base. (les couches sont stockes  en : mois, x,y,val_jan, val_fevr,..val_dec)
OK

ce que je souhaiterai faire maintenant concerne les poitns qui ne tombe pas dans la maille :
comment calculer la distance de ces points vers le point le plus proche de la maille ?

merci d'avance

Hors ligne

 

#14 Wed 03 June 2009 16:37

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

Re: posgis grande ligne

J'ai peut-être pas tout compris car j'ai lu rapidement.
Il me semble que tu peux faire un truc qui se rapprocherai de cela pour créer une table qui, pour chaque point, indique la maille la plus proche :

Code:

select distinct a.id, b.id, distance(a.the_geom,b.the_geom) as distance
from point a, maille b
where a.the_geom && expand(the_geom,500)
order by distance;

La condition Where permet d'éviter à postgis de calculer entièrement la matrice des distance point/maille. Le "500", c'est à toi de juger
Si ta maille est un polygone, il faudra faire
where a.the_geom && expand(centroid(the_geom),500)

C'était bien cela ta demande?


Pascal PLUVINET

Hors ligne

 

#15 Wed 03 June 2009 16:56

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

en fait je n'ai pas de geom...que des x et y en metre.
(je connais le srid et il est stocke dans une table metadata pour l'instant.)

d'un cote j'ai mes couches : pluvio, t min, ...
d'un autre les x et y (en metre) que soumet l'utilisateur pour avoir des donnees meteo.

le calcul cité correspond en fait au calcul de la maille la plus proche (puisque on connait le pas =  1point tous les 1km)
pour les 550 000 points que represente la France, c plus rapide de faire ce calcul que d'utiliser les fonctions spatails de pgis.
(que je ne matrise pas bien)

pour remonter les donnees je fais une requete basique : jointure de mes 2 tables where a.x=b.x ....

le probleme concerne les points non remontes : je souhaiterai connaitre la distance de chacun d'eux vers la maille la plus proche.

je ne sais pas si c plus clair ?

a+

Hors ligne

 

#16 Wed 03 June 2009 17:37

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

Re: posgis grande ligne

Si tu n'a pas de the_geom, alors utilise la formule ( pythagore, je crois?) :

Code:

 distance = ((yb-ya)²+(xb-xa)²)^(1/2)

mais ca risque d'être un peu long, non?


Pascal PLUVINET

Hors ligne

 

#17 Wed 03 June 2009 17:58

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

oui c ce que je pensais faire mais...ca risque d'etre un peu long en effet
je pensais faire un truc comme :

a partir de ma collection de points (ie mes couches)
transformation en geom point
ou
definir un contour, une peripherie (polygone?) a partir de point

et ensuite pouvoir definir la distance la plus proche entre le point demandé et le polygone tracé

mais je ne sais pas si c'est faisable ?

merci d'avance,

n

Hors ligne

 

#18 Wed 03 June 2009 21:07

ppluvinet
Participant assidu
Lieu: LYON
Date d'inscription: 6 Aug 2007
Messages: 608

Re: posgis grande ligne

A partir des X et Y, il est possible de créer une couche spatiale de point.
Je pense que cest la fonction:

Code:

PointFromText(text,[<srid>]) :
    Construit une géométrie à partir d'un WKT et d'un SRID donné. Si aucun SRID n'est passé en paramètre, la valeur utilisée sera -1.

A vérifier tout de même.



Si c'est pas cela, tu peux eventuellement regarder ce doc:
http://www.postgis.fr/book/print/217#223223223


Pascal PLUVINET

Hors ligne

 

#19 Wed 03 June 2009 22:52

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

ok je regarde si ça fonctionne, encore merci

a+

N

Hors ligne

 

#20 Wed 03 June 2009 23:45

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

ok, j'ai déjà essayé cette solution en suivant ce tuto : http://www.bostongis.com/PrinterFriendl … tgis_tut03

mais je ne vois pas en quoi transformer les points X et Y en point GEOM peut m'aider ?

je ne me suis pas bien expliqué.

pour les donnees meteo : j'ai une table pluviometrie qui est la representation d'une grille sur toute la France au pas de 1km :

Code:

X Y VAL_janv VAL_fev VAL_avril ...VAL_dec
67000 2396000 81.9 78.4 59.5 40.8 46.1 33.9 27 37.9 58.7 72.4 79.8 77.3
68000 2397000 ...
72000 2404000
73000 2398000

d'un autre cote un utilisateur envois ses points, ca peut ressembler a ceci :

Code:

X Y
67000.45 2396000
68001 2397000
72000 2404000
73000.67 2398009.10

je calcule donc les X et Y pour qu'il tombe pile poil sur une maille :

Code:

INSERT INTO tmp_user (x_ori,y_ori,x_cal,y_cal) SELECT x,y, round(x/10)*10 , round(y/10)*10 from tmp_user_data;

et j'obtient le resultat suivant :

Code:

X_ORI Y_ORI X_CAL Y_CAL
67000.45 2396000 67000 2396000
68001 2397000 68000 2397000
72000 2404000 72000 2404000
73000.67 2398009.10 73000 2398000

ensuite je recupere les donnees de pluvio :

Code:

SELECT * FROM tmp_user_data a, pluvio b where a.x_cal = b.x and a.y_cal = b.y

cette manière de faire m'evite de passer par les GEOM car les temps de reponse n'etaient pas du tout satisfaisants.

je souhaite maintenant traiter les rejets, qui sont soit des erreurs de saisies soit des points extrement proches de la "frontière".
la distance si elle est infime, permettra de recuperer les donnees meteo.

mon idee etait de dire si je peut facilement obtenir un tracé delimitant l'ensemble des points, je n'aurais qu'a comparer 2 objets entre eux et dans ce cas uniquement l'utilisation d'objet geom devient interessant (?)

a+
n

Hors ligne

 

#21 Thu 04 June 2009 06:39

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: posgis grande ligne

Bonjour,

Pas sur d'avoir tout compris!

Si le problème est :
J'ai une grille avec des points tous les Km. J'ai un point aléatoire P(x,y) et je souhaite connaître le point de la grille le plus proche:

Je défini un carré de 1km*1km de centre P . J'obtiens par requête l'ensemble des points appartenant au carré (maximum 4) et j'applique Pythagore sur le résultat de la requête.

A+


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#22 Thu 04 June 2009 09:59

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

Bonjour,

Merci Christophe de ta reponse.

Quand le point aléatoire tombe dans la grille je n'ai pas de probleme, puisque effectivement on sait retrouver le point de la grille le plus proche, a ta manière ou avec celle que j'ai citée.

Mon souci se pose quand un point aléatoire P(x,y) se trouve en dehors de la grille. cf image jointe .

sur ce lien : http://www.concavehull.com/home.php?main_menu=1 , il y a exactement ce que je souhaiterai mais il semblerait que PGIS ne sache pas faire ça.

a+

Dernière modification par nine (Thu 04 June 2009 10:10)


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

Hors ligne

 

#23 Thu 04 June 2009 10:53

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: posgis grande ligne

Bonjour,

Soit un nuage de point, MaxX, MinX, MaxY et MinY définissent un rectangle englobant le nuage.

1) Si mon Carré de 1km^2 et ce rectangle n'ont pas d'intersection :
- je considère les points comme abbérants: éliminés.

Si il existe une intersection et que l'intersection avec la grille est nulle:

Je lance une [Ediot] "fonction" [/Edit] function récursive qui augmente la taille de mon carré de n kilomètre, qui effectue la requête , le point d'arrêt étant intersection non vide.

A+


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#24 Thu 04 June 2009 11:08

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

merci, je n'avais pas bien compris ton point de vue. L'idee me va tres bien, par contre je ne sais pas du tout faire ça.

peut tu me dire quelles fonctions PGIS tu utilises pour :

créér un rectangle autour du nuage de  point (etendu geographique ?)
dessiner un carré autour de ton point (bbox ? )
une intersection entre carre et rectangle

encore merci, la liste des fonctions PGIS me semble interminable et je ne suis pas sure de toujours en comprendre le sens.

a+

Hors ligne

 

#25 Thu 04 June 2009 11:24

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

Re: posgis grande ligne

Christophe,

Christophe V. a écrit:

Je lance une function récursive [..]


L'anglais n'est pas accepté sur nos forums tongue

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

 

#26 Thu 04 June 2009 12:01

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: posgis grande ligne

Désolé mais pour les fonctions géomètrique de postgis c'est pas mon fort!

Par contre pour une intersection de rectangle j'utilise ceci sous access

Code:

PARAMETERS xsh IEEEDouble, ysh IEEEDouble, xsb IEEEDouble, ysb IEEEDouble;
SELECT Commune.ID_Commune, Commune.NomCom, Commune.CodeInsee, Commune.Raster, Commune.XB, Commune.YB, Commune.XH, Commune.YH, Commune.Affiche
FROM Commune
WHERE (((Commune.Raster)=False) AND ((Commune.XB)<[xsh]) AND ((Commune.YB)<[ysh]) AND ((Commune.XH)>[xsb]) AND ((Commune.YH)>[ysb]));

Je suppose qu'il existe des fonctions Min() et Max() dans postgis, ce qui te permet de récupérer les valeurs MaxX, Y et Min X, Y


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#27 Thu 04 June 2009 12:05

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3169
Site web

Re: posgis grande ligne

Yves,

Je suis toute la journée en bataille avec Visual Studio 2008, alors des "function" j'en écris ...


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#28 Thu 04 June 2009 12:07

nine
Participant occasionnel
Date d'inscription: 20 Apr 2009
Messages: 14

Re: posgis grande ligne

bon pas grave !

je viens de découvrir la fonction st_convexeHull (concave pas encore supporté)
couplé avec st_collect je devrais pouvoir obtenir des résultats.

merci encore!

a+

Hors ligne

 

#29 Thu 04 June 2009 12:09

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

Re: posgis grande ligne

nine a écrit:

merci, je n'avais pas bien compris ton point de vue. L'idee me va tres bien, par contre je ne sais pas du tout faire ça.

peut tu me dire quelles fonctions PGIS tu utilises pour :

créér un rectangle autour du nuage de  point (etendu geographique ?)
dessiner un carré autour de ton point (bbox ? )
une intersection entre carre et rectangle

encore merci, la liste des fonctions PGIS me semble interminable et je ne suis pas sure de toujours en comprendre le sens.

a+


Bonjour,

Box2D(geometry) ou extent(geometry set)  devraient convenir pour le rectangle, cela dépend de ce que tu lui envoies.

MakexBox2D(ll,ur) pour créer un rectangle (point en bas à gauche : lower left et point en haut à droite : upper right)

xmin(), ymin(), zmin(), xmax(), ymax() et zmax() pour les min des x, y et z et les max des x, y et z.

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

 

Pied de page des forums

Powered by FluxBB