Je souhaite développer une appli web avec Django et PostgreSQL. D’abord parce que j’ai envie de la faire, cette appli, mais aussi parce que je souhaite me forme à Django et PostgreSQL. Je me disais même que j’allais utiliser PostGIS, vu que c’est un des outils qui vont me servir en M2 géomatique (si je suis pris…). PostGIS, c’est une extension de PostgreSQL pour la gestion des objets géométriques.
Et en fait, ben je suis en train de me dire que j’en ai peut-être pas besoin ?
Sur mon projet, les gens vont faire des recherches dans ma BDD. Ils indiquent une adresse, et moi je ressors toutes les entrées de ma BDD qui correspond à leurs filtres, dans un rayon choisi autour de leur adresse. J’ai l’impression que c’est peut-être un peu trop de sortir PostGIS pour ça ? Mais je n’en suis pas certain.
Pour une simple recherche de distance ça m’a l’air overkill, effectivement.
La formule est déjà relativement simple pour calculer une distance en prenant en compte la courbure de la Terre, mais je suspecte aussi que des fonctions soient disponibles pour le faire directement, vu qu’il y a du GeoJSON dans PostgreSQL.
En fait tu as le choix entre la syntaxe SQL basique et des fonctions qui vont t’abstraire tout ça via une fonction toute prête.
Si tu n’as qu’une ou deux requêtes qui font des calculs du genre ça vaut pas nécessairement le coût/coup d’ajouter une extension, mais si tu trouves ça plus simple et/ou que tu prévois d’ajouter d’autres requêtes plus tard, fais-toi plaisir.
Les autres réponses semblent indiquer des optimisations de PostGIS L’extension nécessite des logiciels spécialisés, donc ça me semble pas déconnant. D’un autte côté, ça me paraît bien compliquer le processus d’installation…
J’ai déjà eu ce cas précis : les gens précisaient une station de métro choisie et le programme sortait tous les cabinets médicaux disponibles dans un rayon de 1500 m. Et naturellement, aussi le contraire : obtenir les stations de métro les plus proches d’un cabinet médical. Chaque station (environ 650) avait ses coordonnées dans le système, de type geography (type de PostGIS), ainsi que chaque cabinet médical et ce type était indexé (index GIST) :
createtable station (
idserialunique,
...
geolocation geography
);
createtable doctor (
idserialunique,
...
geolocation geography
);
CREATEINDEX station_geolocation_idx ON public.station USING gist (geolocation);
CREATEINDEX doctor_geolocation_idx ON public.doctor USING gist (geolocation);
Voici l’extrait de code qui peut te donner une idée de ce que je pouvais faire.
Trouver les stations de métro les plus proches d’un certain cabinet médical, et à moins d’une certaine distance prédéfinie max_distance (ST_Distance est une fonction de PostGIS qui calcule la distance entre deux points du globe) :
select
s.id,
s.name,
ST_Distance(s.geolocation, d.geolocation, false) as distance
from
station s,
doctor d
where
d.id = :doctor_id and
ST_Distance(s.geolocation, d.geolocation, false) <= :max_distance
orderby
distance
J’avais certes déjà toutes les coordonnées (lon, lat) pour les stations de métro. Mais ce n’était pas forcément le cas pour tous les cabinets médicaux pour lesquels j’avais seulement une adresse au format "humain".
J’utilisais alors une API de geocoding pour obtenir et enregistrer les coordonnées afin de faire mes recherches en DB. En l’occurrence, c’était celle de Google : Geocoding API. Cela sort de PostGIS, mais tu auras peut-être besoin d’un tel système toi aussi si tes utilisateurs veulent entrer des adresses "humaines" arbitraires.
Une fois les infos obtenus, il suffisait d’utiliser st_setsrid et st_makepoint dans la requêtes SQL pour indiquer directement des coordonnées :
select ...
from ...
where ...
orderby geolocation <-> st_setsrid(st_makepoint(:lat, :lng), 4326)
(L’opérateur A <-> B signifie la même chose que ST_Distance(A, B) si mes souvenirs sont bons.)
Attention, je ne sais pas si mon utilisation de PostGIS était optimale car j’avoue que j’avais dû implémenter tout ça très rapidement pour un projet, en regardant un peu à droite à gauche sur le Web le code des autres (j’ai honte). Les extraits de code présentés peuvent te donner une idée de ce que PostGIS sait faire, mais en aucun cas je suppose qu’il s’agit là d’exemples de référence. PostGIS est un système sophistiqué présupposant des connaissances en GIS/géomatique que je n’avais pas.
Mais je pense que ce que tu cherches à implémenter est largement faisable par PostGIS. PostGIS prend en compte le calcul de la distance en considérant la courbure du globe terrestre. Dans mon cas, les recherches étaient cantonnées à une ville et j’aurais pu sûrement m’en sortir avec un bête type géométrique natif de PostgreSQL, je pense.
À toi de voir si tu as besoin de la précision chirurgicale de PostGIS pour ton usage.
En regardant, je pense que je vais partir sur PostGIS, ça sera plus propre, et c’est géré par l’ORM de Django, ça m’évitera de galérer à faire la requête SQL Je posterai prochainement pour vous demander votre avis sur l’organisation de mon projet…
@sgble : Tu as bien sûr compris ce que j’allais faire pour les adresses. Ce sera pas du Google par contre, je passerai sûrement par Nominatim. Je ne sais pas encore si les requêtes se feront côté client ou serveur, l’idée étant que la personne puisse choisir la bonne adresse sur son client.
Je suis passé du coup sur les notions avec lesquelles tu as eu du mal, et j’imagine que ça concernait les systèmes de projection géographique En résumé, c’est assez simple : pour faire des vues en plan, on est obligé de projeter la surface de la Terre sur un plan. Y a plein de façon de faire, alors je te passe les détails. Sauf que du coup, c’est pas précis du tout, et on est obligé de le faire spécifiquement sur une zone précise. En France, on utilise la projet Lambert étendue, avant on utilisait 3 projections différentes selon la latitude.
Il y a un système mondial, qui est le WGS84. C’est une projection sphérique, alors les coordonnées sont exprimées en angle. C’est celui dont on a l’habitude, avec les longitudes et latitudes. Sauf que du coup, ça nécessite de faire des calculs sur une géométrie sphérique, et c’est le bazar. Si tu peux, le mieux reste d’utiliser un système de projection local, mais ça implique de faire les conversions et d’être restreint sur une zone spécifique (et par exemple, je vais avoir besoin de coordonnées sur les pays frontaliers). Heureusement, ils indiquent que les performances sur les points sont correctes.
Connectez-vous pour pouvoir poster un message.
Connexion
Pas encore membre ?
Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte