Comment trouver la ville la plus proche pour un POI dans une base de données OpenStreetMap / PostGIS?


9

Je suis intéressé à trouver des données supplémentaires pour les POI dans la base de données OSM.

Actuellement, je peux utiliser le SQL suivant pour obtenir le nom + long + lat pour tous les POI

SELECT name, 
         x(transform(way, 4326)) AS lon, 
         y(transform(way, 4326)) AS lat
  FROM planet_osm_point 
  WHERE tourism='museum'
UNION
  SELECT name, 
         x(centroid(transform(way, 4326))) AS lon, 
         y(centroid(transform(way, 4326))) AS lat
  FROM planet_osm_polygon 
  WHERE tourism='museum'

J'aimerais également connaître le nom de la ville la plus proche ou de la ville dans laquelle le POI est situé.


Avez-vous déjà un système de géocodage inversé (emplacement pour nommer) configuré?
BradHards

Réponses:



0

Réponse tirée d'une question connexe :

Assez facile en supposant que vous avez les lat / lngs.

  1. Convertir lat / lng en srid de données osm
  2. Calculez la distance à tous les POI qui vous intéressent dans la base de données.
  3. Choisissez la ligne avec la plus petite distance.
  4. De plus, vous voudrez peut-être limiter votre recherche à un rayon d'intérêt (disons 5 KM ..)

À titre d'exemple, trouvons 5 stations-service les plus proches près de notre POI.

SELECT osm_id,
       name,
       brand,
OPERATOR,
       ST_Distance(barabara_point.way, st_transform( st_setsrid(st_makepoint(36.768676, -1.289927), 4326), 900913)) AS distance
FROM barabara_point
WHERE ST_DWithin(barabara_point.way, st_transform( st_setsrid(st_makepoint(36.768676, -1.289927), 4326), 900913), 5000)
  AND amenity = 'fuel'
ORDER BY distance;

Ensemble de résultats

-[ RECORD 1 ]--------------
osm_id   | 1334386299
name     |
brand    | Kobil
operator |
distance | 244.544617525396
-[ RECORD 2 ]--------------
osm_id   | 915386940
name     | BP
brand    |
operator |
distance | 1012.76398108684
-[ RECORD 3 ]--------------
osm_id   | 1916188670
name     | Shell
brand    |
operator |
distance | 1160.48349020106
-[ RECORD 4 ]--------------
osm_id   | 558923017
name     | Kenol
brand    |
operator |
distance | 1310.22002620899
-[ RECORD 5 ]--------------
osm_id   | 30092081
name     | Caltex
brand    |
operator |
distance | 1419.61102322244
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.