#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
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: 1554
Re: 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
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: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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
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
Rapidement car j'ai une urgence
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
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: 1554
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
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: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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: VALENCE
- Date d'inscription: 6 Aug 2007
- Messages: 617
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: 3199
- 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)
Hors ligne
#23 Thu 04 June 2009 10:53
- ChristopheV
- Membre
- Lieu: Ajaccio
- Date d'inscription: 7 Sep 2005
- Messages: 3199
- 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
Re: posgis grande ligne
Christophe,
Je lance une function récursive [..]
L'anglais n'est pas accepté sur nos forums
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: 3199
- 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: 3199
- 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
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+
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