[NEWBIE EN SIG] Utilisation de PostGIS pour un besoin précis

Bonjour,

Etudiant en informatique et completement nouveau dans le domaine des SIG, je dois mettre en place dans le cadre d'un projet scolaire un SIG. Et je n'y comprend pas grand choses.

Mon SIG doit répondre aux fonctionnalités suivantes:
1) Le SIG possède une base de donnée de sites géographiques (latitude, longitude, nom)
2) Lorsqu'on entre les coordonnées géographiques (latitude, longitude) d'un point, le SIG doit pouvoir nous renvoyer une liste des sites (nom, distance par rapport au point entré) dans un rayon donné autour du point entré.

L'ajout des sites dans la base de donnée devrait se faire de préférence en sélectionnant un point sur une carte.

PostGIS répond il a mes besoins et y'a t'il besoin d'y ajouter d'autres logiciels?

En vous remerciant de votre aide

Posted in Généraliste Vous devez vous connecter ou vous enregistrer pour écrire des commentaires | sujet précédent | sujet suivant | printer friendly version | 6510 lectures

Posté par spade le 12 Juillet, 2006 - 11:31.

david | 16 Juillet, 2006 - 12:54

Bonjour,

Tout d'abord milles excuses pour ma réponse tardive mais des ennuis de santé m'ont contraint à ne pas suivre le site cette semaine.

Oui ce que tu demande dans le cahier des charges de ton projet est amplement faisable avec PostGIS.

Un petit tuto valant mieux qu'une longue réponse!

Alors let's go!

Pour commencer je ne sais pas dans quel système sont fournies les points de tes sites...Je vais par exemple supposer que celà provient de données GPS par exemple.

Dans PostGIS, celà se réfère au système de latitude/longitude ayant pour srid= 4326 (= WGS 84 WGS84 (World Geodesic Datum) [source = http://atlas.nrcan.gc.ca/site/francais/dataservices)

Supposons pour la forme que j'ai une table test qui ressemble à ta table de test avec ses coordonnées latitude,longitude saisies en Degré Minute Décimale par exemple

latitude = 54° 05.6298 longitude = 10° 47.1342 [Degré Minute décimale]

Par exemple pour les 10 premières lignes de ma table j'ai

gps=# select latitude,longitude from test limit 10; latitude | longitude
-----------+-----------
5405.6298 | 1047.1342
5405.6255 | 1047.0722
5405.5982 | 1047.0358
5405.5373 | 1046.9382
5405.4637 | 1046.8294
5405.3542 | 1046.7878
5405.2649 | 1046.6943
5405.1725 | 1046.5783
5405.0423 | 1046.5537
5404.9063 | 1046.5737
(10 lignes)

Je dois ajouter la colonne géométrique the_geom à ma table en faisant

select addgeometrycolumn('test','the_geom',4326,'POINT',2);

la requête ci-dessus me permet d'ajouter la colonne the_geom à ma table en lui précisant que le système de projection utilisé est le WGS84 (srid=4326)

Pour ajouter les points attendus je peux par exemple faire

update test set the_geom=geometryfromtext('POINT('||trunc((trunc(longitude/100)+(longitude-1000)/60)::numeric,6)||' '||trunc((trunc(latitude/100)::int+(latitude-5400)/60)::numeric,6)||')',4326);

Ok...Maintenant ma table test contient les points attendus qui sont en latitude, longitude

Pour voir mes points, je peux par exemple faire

gps=# select latitude,longitude,astext(the_geom) from test limit 10;
latitude | longitude | astext
-----------+-----------+----------------------------
5405.6298 | 1047.1342 | POINT(10.78557 54.09383)
5405.6255 | 1047.0722 | POINT(10.784536 54.093758)
5405.5982 | 1047.0358 | POINT(10.78393 54.093303)
5405.5373 | 1046.9382 | POINT(10.782303 54.092288)
5405.4637 | 1046.8294 | POINT(10.78049 54.091061)
5405.3542 | 1046.7878 | POINT(10.779796 54.089236)
5405.2649 | 1046.6943 | POINT(10.778238 54.087748)
5405.1725 | 1046.5783 | POINT(10.776305 54.086208)
5405.0423 | 1046.5537 | POINT(10.775895 54.084038)
5404.9063 | 1046.5737 | POINT(10.776228 54.081771)
(10 lignes)

Supposons pour la suite que le point qu'on ait saisi depuis la carte soit le premier point c-a-d POINT(10.78557 54.09383)...

Remarque: Ce genre de saisie dynamique sur une carte peut se faire avec des scritps javascript que tu trouveras par toi-même sur internet

Je veux pour la suite vérifier l'ensemble des points se trouvant à moins de 5 mètres du point saisi en faisant par exemple

select count(*) from test where distance_spheroid(geometryfromtext('POINT(10.634971 54.123783)',4326),the_geom,'SPHEROID["GRS_1980",6378137,298.257222101]')<5;

qui me renvoit

count
-------
45
(1 ligne)

Donc j'ai 45 points dans ma table test qui se trouve à moins de 5 mètres (toute proportion d'unité gardé de mon point)

Remarque: j'ai ici utilisé la fonction distance_spheroid() de PostGIS dont tu trouveras un meilleur descriptif à ce lien http://www.postgis.fr/book/print/217#227227227

Si ta table référant les sites contient beaucoup d'enregistrement, il est alors nécessaire de créer des index spatiaux sur la table des sites.

par exemple pour ma table test, je peux faire

create index the_geom_index_gist on test using gist(the_geom gist_geometry_ops);

Et améliorer ma requête en utilsant l'opérateur de chevauchement de PostGIS '&&' et pour pouvoir bien sûr accélérer le résutlat attendu

Je peux aussi faire le vérification que les index seront utilisés on mettant le mot-clé explain devant ma requête

explain select count(*) from test where distance_spheroid(geometryfromtext('POINT(10.634971 54.123783)',4326),the_geom,'SPHEROID["GRS_1980",6378137,298.257222101]')<5 and the_geom && geometryfromtext('POINT(10.634971 54.123783)',4326);

qui me renverra

-> Index Scan using the_geom_index_gist on test (cost=0.00..5.57 rows=1 width=0)

Voilà!

En espérant avoir répondu à tes question!

--david;

spade | 30 Juillet, 2006 - 14:53

Bonjour,

Désolé de répondre aussi tard, je n'avais pas de connexion Internet durant ces 2 dernières semaines.

Je te remercie pour ces expliquations détaillées. PostGIS répond donc bien à mon besoin en y ajoutant mapserver, je suppose, pour l'insertion de points à partir d'une carte.

Julien

Accéder aux archives

« Novembre 2024  
Lun Mar Mer Jeu Ven Sam Dim
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30  

Ouverture de session

Qui est en ligne

Il y a actuellement 1 utilisateur et 57 invités en ligne.
Locations of visitors to this page
Drupal Top Sites - Ultimate Drupal Exposure