U wilt "alle rijen binnen een straal van 5 mijl van een coördinaat" , dus dit is niet precies een K-nearest-buur (KNN) probleem. Gerelateerd, maar jouw geval is eenvoudiger. "Vind de 10 rijen die het dichtst bij mijn coördinaten liggen" zou een KNN-probleem zijn.
Converteer uw coördinaten naar geography
waarden:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Als alternatief kunt u de eenvoudigere geometry
. gebruiken type. Denk aan:
4.2.2. Wanneer moet u het gegevenstype Geografie gebruiken in plaats van het gegevenstype Geometrie
Dan hebben we een tabel zoals:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Alles wat je nodig hebt is ST_DWithin()
- en een ruimtelijke index om het snel te maken:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Vraag:
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
Of u kunt uw originele kolommen gebruiken en een functionele index maken ... Deze en andere details in dit nauw verwante antwoord op dba.SE:
- Bestel op afstand