PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie frage ich alle Zeilen innerhalb eines 5-Meilen-Radius um meine Koordinaten ab?

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