sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur frågar jag alla rader inom en radie på 5 mil från mina koordinater?

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


  1. Oracle SQL - REGEXP_LIKE innehåller andra tecken än a-z eller A-Z

  2. Hur upptäcker man att transaktionen redan har påbörjats?

  3. Hur man ställer in en WordPress MySQL-databas i molnet

  4. Det gick inte att ladda SqlServerSpatial.dll