sql >> Database teknologi >  >> RDS >> PostgreSQL

Få alle bygninger inden for en rækkevidde af 5 miles fra specificerede koordinater

Hvorfor gemmer du x,y i adskilte kolonner? Jeg anbefaler kraftigt, at du gemmer dem som geometry eller geography for at undgå unødvendig casting overhead i forespørgselstiden.

Når det er sagt, kan du beregne og kontrollere afstande i miles ved hjælp af ST_DWithin eller ST_Distance :

(Testdata)

CREATE TABLE building (name text, long numeric, lat numeric);
INSERT INTO building VALUES ('Kirk Michael',-4.5896,54.2835);
INSERT INTO building VALUES ('Baldrine',-4.4077,54.2011);
INSERT INTO building VALUES ('Isle of Man Airport',-4.6283,54.0804);

ST_DWithin

ST_DWithin returnerer sand, hvis de givne geometrier er inden for den specificerede afstand fra en anden. Følgende forespørgsel søger efter geometrier, der er i 5 miles radius fra POINT(-4.6314 54.0887) :

SELECT name,long,lat,
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
  ST_DWithin('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(long,lat),8046.72); -- 8046.72 metres = 5 miles;

        name         |  long   |   lat   |     distance      
---------------------+---------+---------+-------------------
 Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)

ST_Distance

Funktionen ST_Distance (med geography type parametre) returnerer afstanden i meter . Ved at bruge denne funktion skal du blot konvertere meter til miles til sidst.

Opmærksomhed :Afstande i forespørgsler ved hjælp af ST_Distance beregnes i realtid og bruger derfor ikke det rumlige indeks . Så det anbefales ikke at bruge denne funktion i WHERE klausul! Brug det hellere i SELECT klausul. Ikke desto mindre viser eksemplet nedenfor, hvordan det kunne gøres:

SELECT name,long,lat,
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE 
  ST_Distance('POINT(-4.6314 54.0887)'::geography,
              ST_MakePoint(long,lat)) * 0.000621371 <= 5;

        name         |  long   |   lat   |     distance      
---------------------+---------+---------+-------------------
 Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
  • Husk parameterrækkefølgen med ST_MakePoint :Det er længdegrad, breddegrad.. ikke den anden vej rundt.

Demo:db<>fiddle

Amazon Athena-ækvivalent (afstand i grader):

SELECT *, ST_DISTANCE(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
      ST_POINT(long,lat)) AS distance
FROM building
WHERE 
  ST_Distance(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
  ST_POINT(long,lat)) <= 5;


  1. Sådan kører du et SQL Server Agent Job ved hjælp af T-SQL

  2. Søgeord ikke understøttet:Metadata

  3. Galera Cluster Recovery 101 - Et dybt dyk ind i netværkspartitionering

  4. Introduktion af afspilning – Nyt tidspunkt diagnose for Spotlight Cloud