Message posté par : Nicolas Ribot
----------------------------------------
Bonjour,
Ce n'est pas la peine de créer physiquement un buffer pour faire ce que vous voulez
faire: c'est une opération très coûteuse.
Il existe la fonction st_dwithin(geom1, geom2, distance) (distance within) qui permet de
répondre à votre question.
Avec des index spatiaux sur les colonnes geom, c'est très rapide et ca supporte le
type geography que vous semblez stocker dans votre table
(
http://postgis.net/docs/ST_DWithin.html).
Votre requête deviendrait:
-----------------
Code :
SELECT a.lon,a.lat,a.code_insee, b.geometry
FROM public.commune a join public.polygones b on ST_dwithin(b.geometry::geography,
ST_Point( a.lon, a.lat, 4326)::geography,15000)
where a.code_insee = '21231';
-----------------
Il faudrait alors ajouter un index spatial sur polygones.geom::geography, ou directement
stocker une geography dans cette table (ce qui est mieux si le srid = 4326).
ca serait bien aussi pour la performance de créer une colonne geography sur les communes
avec long/lat)
De ce que je vois, la clause andwhere de DQL ne fait qu'injecter une constante
(:codeinsee) dans la requete.
Vous pouvez logger les requêtes dans PG et ainsi voir la vraie requête lancée par
Symfony.
Nicolas
ps. c'est pour ce genre de comportement que je ne suis pas fan des ORM ;)
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=349920#p349920
Pour y répondre : geobd(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net