Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2021-06-10T11:54:54+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Ai-je besoin de PostGIS ?, message #2351532021-06-10T11:54:54+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235153<p>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 <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"> 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.</p>
<p>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.</p>Ai-je besoin de PostGIS ?, message #2351392021-06-09T21:56:07+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235139<p>Merci pour les réponses <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>
<p>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 <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> Je posterai prochainement pour vous demander votre avis sur l’organisation de mon projet…</p>
<p><a href="/membres/voir/sgble/" rel="nofollow" class="ping ping-link">@<span class="ping-username">sgble</span></a> : 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.</p>Ai-je besoin de PostGIS ?, message #2351302021-06-09T17:54:50+02:00sgble/@sgblehttps://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235130<figure><blockquote>
<p>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.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235121">Moté</a></figcaption></figure>
<p>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 <code>geography</code> (type de PostGIS), ainsi que chaque cabinet médical et ce type était indexé (index <code>GIST</code>) :</p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> station (
<span class="hljs-keyword">id</span> <span class="hljs-built_in">serial</span> <span class="hljs-keyword">unique</span>,
...
geolocation geography
);
<span class="hljs-keyword">create</span> <span class="hljs-keyword">table</span> doctor (
<span class="hljs-keyword">id</span> <span class="hljs-built_in">serial</span> <span class="hljs-keyword">unique</span>,
...
geolocation geography
);
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">INDEX</span> station_geolocation_idx <span class="hljs-keyword">ON</span> public.station <span class="hljs-keyword">USING</span> gist (geolocation);
<span class="hljs-keyword">CREATE</span> <span class="hljs-keyword">INDEX</span> doctor_geolocation_idx <span class="hljs-keyword">ON</span> public.doctor <span class="hljs-keyword">USING</span> gist (geolocation);
</code></pre></div>
<p>Voici l’extrait de code qui peut te donner une idée de ce que je pouvais faire.</p>
<p>Trouver les stations de métro les plus proches d’un certain cabinet médical, et à moins d’une certaine distance prédéfinie <code>max_distance</code> (<code>ST_Distance</code> est une fonction de PostGIS qui calcule la distance entre deux points du globe) :</p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">select</span>
s.id,
s.name,
ST_Distance(s.geolocation, d.geolocation, <span class="hljs-literal">false</span>) <span class="hljs-keyword">as</span> distance
<span class="hljs-keyword">from</span>
station s,
doctor d
<span class="hljs-keyword">where</span>
d.id = :doctor_id <span class="hljs-keyword">and</span>
ST_Distance(s.geolocation, d.geolocation, <span class="hljs-literal">false</span>) <= :max_distance
<span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span>
distance
</code></pre></div>
<p>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".</p>
<p>J’utilisais alors une API de <em>geocoding</em> pour obtenir et enregistrer les coordonnées afin de faire mes recherches en DB. En l’occurrence, c’était celle de Google : <a href="https://developers.google.com/maps/documentation/geocoding/overview">Geocoding API</a>. 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.</p>
<p>Une fois les infos obtenus, il suffisait d’utiliser <code>st_setsrid</code> et <code>st_makepoint</code> dans la requêtes SQL pour indiquer directement des coordonnées :</p>
<div class="hljs-code-div hljs-code-sql"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span></div><pre><code class="hljs language-sql"><span class="hljs-keyword">select</span> ...
<span class="hljs-keyword">from</span> ...
<span class="hljs-keyword">where</span> ...
<span class="hljs-keyword">order</span> <span class="hljs-keyword">by</span> geolocation <-> st_setsrid(st_makepoint(:lat, :lng), <span class="hljs-number">4326</span>)
</code></pre></div>
<p>(L’opérateur <code>A <-> B</code> signifie la même chose que <code>ST_Distance(A, B)</code> si mes souvenirs sont bons.)</p>
<p>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.</p>
<p>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 <a href="https://www.postgresql.org/docs/current/datatype-geometric.html">type géométrique natif de PostgreSQL</a>, je pense.</p>
<p>À toi de voir si tu as besoin de la précision chirurgicale de PostGIS pour ton usage.</p>Ai-je besoin de PostGIS ?, message #2351262021-06-09T17:33:40+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235126<p>Les autres réponses semblent indiquer des optimisations de PostGIS <img src="/static/smileys/svg/1f914.svg" alt="🤔" class="smiley"> 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…</p>Ai-je besoin de PostGIS ?, message #2351242021-06-09T17:14:44+02:00viki53/@viki53https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235124<p>En fait tu as le choix entre <a href="https://gis.stackexchange.com/a/360107">la syntaxe SQL basique</a> et des fonctions qui vont t’abstraire tout ça via une fonction toute prête.</p>
<p>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.</p>Ai-je besoin de PostGIS ?, message #2351232021-06-09T17:09:05+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235123<p>Hmm, une rapide recherche <a href="https://postgis.net/docs/ST_DWithin.html">me donne une fonction PostGIS</a>, ceci dit, faut encore que je creuse.</p>Ai-je besoin de PostGIS ?, message #2351222021-06-09T17:04:16+02:00viki53/@viki53https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235122<p>Pour une simple recherche de distance ça m’a l’air overkill, effectivement.</p>
<p>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. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"> </p>Ai-je besoin de PostGIS ?, message #2351212021-06-09T17:01:03+02:00Moté/@Mot%C3%A9https://zestedesavoir.com/forums/sujet/15433/ai-je-besoin-de-postgis/?page=1#p235121<p>Bonjour,</p>
<p>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 <a href="https://postgis.net/">PostGIS</a>, 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.</p>
<p>Et en fait, ben je suis en train de me dire que j’en ai peut-être pas besoin ?</p>
<p>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.</p>
<p>Vous auriez un avis sur la question svp ? Merci <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>