PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment puis-je interroger toutes les lignes dans un rayon de 5 miles autour de mes coordonnées ?

Vous voulez "toutes les lignes dans un rayon de 5 miles autour d'une coordonnée" , donc ce n'est pas exactement un problème K-plus proche voisin (KNN). Connexe, mais votre cas est plus simple. "Trouver les 10 lignes les plus proches de mes coordonnées" serait un problème KNN.

Convertissez vos coordonnées en geography valeurs :

ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography

Vous pouvez également utiliser la geometry plus simple taper. Considérez :
4.2.2. Quand utiliser le type de données Géographie plutôt que le type de données Géométrie

Ensuite, nous avons un tableau comme :

CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);

Tout ce dont vous avez besoin est ST_DWithin() - et un index spatial pour faire vite :

CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);

Requête :

SELECT *, ST_Distance(c.x, geog) AS distance  -- distance is optional
FROM   tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE  ST_DWithin(c.x, geog, 8045)  -- distance in meter
ORDER  BY distance; -- order is optional, you did not ask for that

Ou vous pouvez utiliser vos colonnes d'origine et créer un index fonctionnel ... Ceci et d'autres détails dans cette réponse étroitement liée sur dba.SE :

  • Trier par distance