【问题标题】:MySQL 5.7 find rows that are close to each other by distanceMySQL 5.7 查找按距离彼此接近的行
【发布时间】:2020-01-19 16:40:45
【问题描述】:

我有一个城市表,例如:

+----------------------------+-------------------+--------------+
| 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 |

如何找到距离另一行一英里内的所有行?

【问题讨论】:

标签: mysql sql geospatial


【解决方案1】:

您可以自行加入表格,使用spatial function 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 是对一英里包含多少米的粗略估计。

【讨论】:

  • 没有人期望它会很快,因为表中有很多记录 =)
  • 我应该提到我使用的是 MySQL 5.7。这似乎不适用于该版本。 (编辑的问题标题)
  • @Jafo: st-distance() 是在 MySQL 5.6 中添加的(所以你的版本有它)。您所说的 * 似乎不起作用* 是什么意思?
  • @Jafo: 你能提供一个db fiddle 哪里可以看到问题吗?
  • 好的,给你:dbfiddle.uk/…
【解决方案2】:

当您使用POINT(x, y) 构造一个 POINT 时,您会得到没有 SRS 的笛卡尔点,这意味着 MySQL 使用您作为 xy 传递的任何单位计算平面上的所有内容。

例如

select st_distance(
        point(-90, 33),
        point(-85, 33));

准确地返回 5。您可以将其视为以度为单位的距离(这是没有用的 - 因为沿子午线的 5 度与沿平行线的 5 度不同)。或者你可以把它想象成在某个平面上输入是以米为单位的,而输出也是以米为单位的。

您需要的是st_distance_sphere 函数(在 MySQL 5.7 中 - 在 8.0 中您可以使用真正的 SRS),例如对于上面的示例,这将返回 466234 米。

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

【讨论】:

    猜你喜欢
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2014-09-14
    相关资源
    最近更新 更多