Comment effectuer une recherche de proximité avec Postgis?

9

J'ai téléchargé la base de données Geonames (cities1000) et écrit un petit programme Ruby pour les importer dans ma table ( geo_cities). J'ai ensuite ajouté une colonne de géographie appelée geog.

Ensuite, j'ai converti tous les nombres lat / lon dans la colonne geog en utilisant:

update public.geo_cities set geog = st_GeogFromText('SRID=4326;POINT(' || longitude || ' ' || latitude || ')');

Les choses vont bien. Maintenant, ce que je veux faire, c'est trouver toutes les villes à moins de 100 miles de Prague.

Je peux donc obtenir Prague comme:

select * from geo_cities where asciiname = 'Prague' and countrycode = 'CZ';

J'apprends toujours les SIG et Postgres, alors quelqu'un pourrait-il m'aider avec la simple requête?

cbmeeks
la source

Réponses:

13

Tout d'abord, assurez-vous d'avoir un index sur votre colonne géographique. Cela accélérera les recherches spatiales:

CREATE INDEX geo_cities_geog_idx ON geo_cities USING GIST geog;
VACUUM ANALYZE geo_cities(geog);

Ensuite, vous pouvez utiliser ST_DWithin (avec des conversions de miles en mètres) sur une requête auto-jointe:

SELECT gc.*, ST_Distance(gc.geog, pt.geog)/1609.344 AS distance_miles
FROM geo_cities gc, geo_cities pt
WHERE pt.asciiname = 'Prague' and pt.countrycode = 'CZ'
  AND ST_DWithin(gc.geog, pt.geog, 160934.4)
ORDER BY ST_Distance(gc.geog, pt.geog);

Si vous êtes à la recherche d'un bon livre, consultez PostGIS en action .

Mike T
la source