Sie möchten "alle Zeilen innerhalb eines 5-Meilen-Radius um eine Koordinate" , also nicht genau ein K-nächster-Nachbar (KNN)-Problem. Verwandte, aber Ihr Fall ist einfacher. "Finde die 10 Reihen, die meinen Koordinaten am nächsten sind" wäre ein KNN-Problem.
Wandeln Sie Ihre Koordinaten in geography
um Werte:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
Alternativ könnten Sie die einfachere geometry
verwenden Typ. Beachten Sie:
4.2.2. Wann der Geographie-Datentyp gegenüber dem Geometrie-Datentyp zu verwenden ist
Dann haben wir eine Tabelle wie:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
Alles, was Sie brauchen, ist ST_DWithin()
- und einen räumlichen Index um es schnell zu machen:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
Abfrage:
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
Oder Sie können Ihre ursprünglichen Spalten verwenden und einen funktionalen Index erstellen ... Dies und andere Details in dieser eng verwandten Antwort auf dba.SE:
- Nach Entfernung bestellen