PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mendapatkan semua Bangunan dalam jangkauan 5 mil dari koordinat yang ditentukan

Mengapa Anda menyimpan x,y dalam kolom terpisah? Saya sangat menyarankan Anda untuk menyimpannya sebagai geometry atau geography untuk menghindari overhead casting yang tidak perlu dalam waktu kueri.

Karena itu, Anda dapat menghitung dan memeriksa jarak dalam mil menggunakan ST_DWithin atau ST_Distance :

(Data uji)

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_DDalam

ST_DWithin mengembalikan true jika geometri yang diberikan berada dalam jarak yang ditentukan dari yang lain. Kueri berikut menelusuri geometri yang berada dalam radius 5 mil dari 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

Fungsi ST_Distance (dengan geography type parameter) akan mengembalikan jarak dalam meter . Dengan menggunakan fungsi ini, yang harus Anda lakukan adalah mengubah meter menjadi mil pada akhirnya.

Perhatian :Jarak dalam kueri menggunakan ST_Distance dihitung secara waktu nyata dan oleh karena itu jangan gunakan indeks spasial . Jadi, tidak disarankan untuk menggunakan fungsi ini di WHERE ayat! Gunakan lebih baik di SELECT ayat. Namun demikian, contoh di bawah ini menunjukkan bagaimana hal itu dapat dilakukan:

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)
  • Perhatikan urutan parameter dengan ST_MakePoint :Ini bujur, lintang.. bukan sebaliknya.

Demo:db<>fiddle

Setara dengan Amazon Athena (jarak dalam derajat):

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Melarikan diri dari nama kolom seperti kata kunci di Postgres

  2. ClassNotFoundException dengan PostgreSQL dan JDBC

  3. PostgreSQL:Hapus atribut dari kolom JSON

  4. Apa artinya ketika proses PostgreSQL menganggur dalam transaksi?

  5. PostgreSQL - Tambahkan kunci ke setiap objek dari array JSONB