Mysql
 sql >> база данни >  >> RDS >> Mysql

Заявка точки в рамките на даден радиус в MySQL

За MySQL 5.7+

Като се има предвид, че имаме следната проста таблица,

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

create spatial index example_lnglat 
    on example (lnglat);

Със следните прости данни,

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));

Ще получите точките в даден диапазон от друга точка (забележка:трябва да търсим вътре в многоъгълник) със следната комбинация от st функции:

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);

В резултат трябва да видите нещо подобно:

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

За справка относно разстоянието, ако премахнем ограничението, резултатът за тестовата точка изглежда така:

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

Забележка 1 :полето се нарича lnglat, тъй като това е правилният ред, ако мислите за точките като (x, y) и също така е редът, в който повечето функции (като точка) приемат параметъра

Забележка 2 :всъщност не можете да се възползвате от пространствените индекси, ако използвате кръгове; също така имайте предвид, че полето за точка може да бъде настроено да приема нула, но пространствените индекси не могат да го индексират, ако е нула (всички полета в индекса трябва да са ненулеви).

Забележка 3 :st_buffer се счита (от документацията) за лош за този случай на употреба

Забележка 4 :функциите по-горе (в частност st_distance_sphere) са документирани като бързи, но не непременно супер точни; ако данните ви са супер чувствителни към това, добавете малко място за въртене към търсенето и направете фина настройка на набора от резултати



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изберете част от MySQL Blob поле

  2. Максимална дължина на колоната на JSON в MySQL

  3. Как да управлявате потребители и удостоверяване в MySQL

  4. Съхранение на маркери в базата данни. Да се ​​съхранява етикет веднъж или много пъти?

  5. Избор на записи по реда на родителския идентификатор