[OSM-dev-fr] Requêtes SQL spatiale
sly (sylvain letuffe)
sylvain at letuffe.org
Ven 15 Juil 16:33:11 BST 2011
> SELECT Y(ST_AsText(ST_Transform(way, 4326))),
> X(ST_AsText(ST_Transform(way, 4326))),
> Distance(way, (SELECT way FROM planet_osm_point WHERE
osm_id=582505865))::int,
> amenity || ' ' || name, 'icon.png', '16,16', '0,0'
> FROM planet_osm_point P WHERE (amenity ILIKE 'res%' OR amenity ILIKE
> 'caf%') AND Distance(way, (SELECT way FROM planet_osm_point WHERE
> osm_id=582505865)) < 10000
> ORDER BY 3;
>
> Ca me retourne des données directement exploitable avec Openlayer mais
> il est certainement possible de faire 100x mieux.
> Suggestions bienvenues
grosso modo c'est pas mal, mais je te conseille :
- de ne pas faire de mise en forme au niveau SQL, fais le au niveau de ton
langage afin de générer le fichier pour openlayers sans quoi on n'y comprend
rien
- limite le nombre de requête imbriquées, on doit pouvoir faire ce que tu veux
faire sans aucune requête imbriquée
En plus là, elle ne servent pas puisque j'imagine que "chez toi" est un
concept pas nécessairement dans la base OSM, donc plutôt que de galérer à
trouver le feu le plus proche de chez toi (582505865) donne directement les
coordonnées GPS dans ta requête
Sinon, tu peux passer par une requête sur deux fois la même table style :
select name
from planet_osm_point as p1, planet_osm_point as p2
where
p1.osm_id=l'id du point choisi
and
st_distance(p1.way,p2.way)<bidule
Sinon, voilà ce que j'ai fais en plaçant (6.6 46.52) comme origine des
recherches :
select name,
round(st_distance(st_transform(way,2154),st_transform('SRID=4326;POINT(6.62
46.52)',2154)))
as distance_m
from planet_osm_point as p where p.amenity='cafe'
and st_distance(st_transform(way,2154),st_transform('SRID=4326;POINT(6.62
46.52)',2154))<5000
order by distance_m
limit 5;
name | distance_m
------------------+------------
| 800
Le Petit-Chene | 818
Starbucks | 833
Café de Beaulieu | 939
Starbucks | 970
(5 lignes)
C'est juste triste que je ne puisse récupérer distance_m comme condition et
être obligé de répéter mon st_distance (à factoriser dans le langage qui fait
l'appel à la requête)
--
sly
qui suis-je : http://sly.letuffe.org
Plus d'informations sur la liste de diffusion dev-fr