sql >> Databáze >  >> RDS >> PostgreSQL

Získání všech budov v rozsahu 5 mil od zadaných souřadnic

Proč ukládáte x,y v oddělených sloupcích? Důrazně vám doporučuji uložit je jako geometry nebo geography abyste se vyhnuli zbytečné režii přetypování v době dotazu.

Jak již bylo řečeno, můžete vypočítat a zkontrolovat vzdálenosti v mílích pomocí ST_DWithin nebo ST_Distance :

(Testovací data)

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 vrátí hodnotu true, pokud jsou dané geometrie v zadané vzdálenosti od jiné. Následující dotaz vyhledává geometrie v okruhu 5 mil od 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

Funkce ST_Distance (s geography parametry typu) vrátí vzdálenost v metrech . Pomocí této funkce vše, co musíte udělat, je nakonec převést metry na míle.

Pozor :Vzdálenosti v dotazech pomocí ST_Distance se počítají v reálném čase, a proto nepoužívejte prostorový index . Proto se nedoporučuje používat tuto funkci v WHERE doložka! Použijte jej spíše v SELECT doložka. Nicméně níže uvedený příklad ukazuje, jak to lze provést:

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)
  • Dbejte na pořadí parametrů pomocí ST_MakePoint :Je to zeměpisná délka, šířka... ne naopak.

Demo:db<>fiddle

Ekvivalent Amazon Athena (vzdálenost ve stupních):

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. Existuje SQL Server Profiler pro SQL Server Express?

  2. změnit sloupec přejmenování tabulky v databázi Oracle

  3. Optimalizace databáze:Indexy

  4. Vazba parametrů dotazu podle názvu s ODP.NET