Du vill ha "alla rader inom en radie på 5 mil från en koordinat" , så det här är inte exakt ett K-närmaste-granne-problem (KNN). Relaterat, men ditt fall är enklare. "Hitta de 10 raderna närmast mina koordinater" skulle vara ett KNN-problem.
Konvertera dina koordinater till geography
värden:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Alternativt kan du använda den enklare geometry
typ. Tänk på:
4.2.2. När ska man använda Geografidatatyp över Geometridatatyp
Sedan har vi en tabell som:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Allt du behöver är ST_DWithin()
- och ett spatialt index för att göra det snabbt:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Fråga:
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
Eller du kan använda dina ursprungliga kolumner och skapa ett funktionellt index ...Detta och andra detaljer i detta närbesläktade svar på dba.SE:
- Beställ efter avstånd