MySQL 5.7 найти строки, которые находятся близко друг к другу по расстоянию - PullRequest
0 голосов
/ 15 января 2020

У меня есть таблица городов, например:

+----------------------------+-------------------+--------------+
| city_name                  | latitude          | longitude    |
+----------------------------+-------------------+--------------+
| Barrow                     |          71.29058 |   -156.78872 |
| Wainwright                 |            70.638 |    -159.9713 |
| Atqasuk                    |            70.481 |    -157.3835 |
| Clyde River                |          70.46916 |    -68.59143 |
| Prudhoe Bay                |          70.25528 |   -148.33722 |
| Nuiqsut                    |           70.2175 |   -150.97639 |

Как найти все строки, которые находятся в пределах мили от другой строки?

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Вы можете самостоятельно присоединиться к таблице, использовать пространственную функцию st_distance(), чтобы вычислить расстояние между двумя домами, и отфильтровать:

select t1.*, t2.*
from mytable t1
inner join mytable t2
    on st_distance(
        point(t1.latitude, t1.longitude), 
        point(t2.latitude, t2.longitude)
    ) < 1609.34

1609.34 - грубая оценка сколько метров содержится в миле.

0 голосов
/ 19 января 2020

Когда вы строите ТОЧКУ, используя POINT(x, y) - вы получаете декартову точку без SRS, то есть MySQL вычисляет все на плоскости, используя любые единицы измерения, которые вы передали как x и y.

* 1005. * Например,
select st_distance(
        point(-90, 33),
        point(-85, 33));

возвращает ровно 5. Вы можете думать об этом как о расстоянии в градусах (что бесполезно - потому что 5 градусов вдоль меридиана отличается от 5 градусов вдоль параллели). Или вы можете думать об этом как о входных данных в метрах на некоторой плоскости, а также о выходных данных в метрах.

Что вам нужно (в MySQL 5.7 - в 8.0 вы можете использовать реальный SRS) это * Функция 1011 *, например, для приведенного выше примера возвращает 466234 метра.

select st_distance_sphere(
        point(-90, 33),
        point(-85, 33));
...