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