Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Poin kueri dalam radius tertentu di MySQL

Untuk MySQL 5.7+

Mengingat kita memiliki tabel sederhana berikut,

create table example (
  id bigint not null auto_increment primary key,
  lnglat point not null
);

create spatial index example_lnglat 
    on example (lnglat);

Dengan data sederhana berikut,

insert into example (lnglat) 
values
(point(-2.990435, 53.409246)),
(point(-2.990037, 53.409471)),
(point(-2.989736, 53.409676)),
(point(-2.989554, 53.409797)),
(point(-2.989350, 53.409906)),
(point(-2.989178, 53.410085)),
(point(-2.988739, 53.410309)),
(point(-2.985874, 53.412656)),
(point(-2.758019, 53.635928));

Anda akan mendapatkan poin dalam rentang tertentu dari titik lain (catatan:kita harus mencari di dalam poligon) dengan kombinasi fungsi st berikut:

set @px = -2.990497;
set @py = 53.410943;
set @range = 150; -- meters
set @rangeKm = @range / 1000;

set @search_area = st_makeEnvelope (
  point((@px + @rangeKm / 111), (@py + @rangeKm / 111)),
  point((@px - @rangeKm / 111), (@py - @rangeKm / 111))
);

select id, 
       st_x(lnglat) lng, 
       st_y(lnglat) lat,
       st_distance_sphere(point(@px, @py), lnglat) as distance
  from example
 where st_contains(@search_area, lnglat);

Anda akan melihat sesuatu seperti ini sebagai hasilnya:

3   -2.989736   53.409676   149.64084252776277
4   -2.989554   53.409797   141.93232714661812
5   -2.98935    53.409906   138.11516275402533
6   -2.989178   53.410085   129.40289289527473

Untuk referensi jarak, jika kita menghilangkan batasan hasil untuk titik uji terlihat seperti ini:

1   -2.990435   53.409246   188.7421181457556
2   -2.990037   53.409471   166.49406509160158
3   -2.989736   53.409676   149.64084252776277
4   -2.989554   53.409797   141.93232714661812
5   -2.98935    53.409906   138.11516275402533
6   -2.989178   53.410085   129.40289289527473
7   -2.988739   53.410309   136.1875540498202
8   -2.985874   53.412656   360.78532732013963
9   -2.758019   53.635928   29360.27797292756

Catatan 1 :bidang ini disebut lnglat karena itu urutan yang benar jika Anda menganggap poin sebagai (x, y) dan juga urutan sebagian besar fungsi (seperti titik) menerima parameter

Catatan 2 :Anda tidak dapat benar-benar memanfaatkan indeks spasial jika Anda menggunakan lingkaran; perhatikan juga bahwa bidang titik dapat disetel untuk menerima null tetapi indeks spasial tidak dapat mengindeksnya jika nullable (semua bidang dalam indeks harus bukan nol).

Catatan 3 :st_buffer dianggap (oleh dokumentasi) buruk untuk kasus penggunaan ini

Catatan 4 :fungsi-fungsi di atas (khususnya st_distance_sphere) didokumentasikan dengan cepat tetapi tidak harus super akurat; jika data Anda sangat sensitif untuk itu, tambahkan sedikit ruang gerak untuk pencarian dan lakukan penyetelan yang bagus untuk kumpulan hasil



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Server MySQL memulai masalah di Mavericks

  2. Cara mendapatkan rata-rata dengan orderBy Desc di Laravel 5

  3. Menggunakan tampilan MySQL

  4. ADDTIME() Contoh – MySQL

  5. Apa yang dimaksud dengan `unsigned` di MySQL dan kapan menggunakannya?