sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik alle rijen opvragen binnen een straal van 5 mijl van mijn coördinaten?

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


  1. DatabaseError:huidige transactie is afgebroken, opdrachten genegeerd tot einde transactieblok?

  2. MySQL ATAN() Functie - Retourneer de boogtangens van een waarde (of waarden)

  3. Plannen van schijfruimte voor databases

  4. Gegevens opvragen uit XML