技术文摘
MySQL 如何计算两坐标距离并进行排序
2025-01-15 02:21:05 小编
MySQL 如何计算两坐标距离并进行排序
在地理信息相关的应用开发中,经常需要计算两个坐标之间的距离,并依据距离对数据进行排序。MySQL 提供了强大的功能来实现这一需求。
要计算两坐标距离,我们需要了解地理坐标的表示方式,常见的是经纬度(经度 longitude,维度 latitude)。在 MySQL 中,计算距离通常使用球体表面距离公式,其中常用的是 Haversine 公式。
假设我们有一个表 locations,包含字段 id、latitude(纬度)、longitude(经度)。要计算某一给定坐标(如纬度 lat1,经度 lon1)与表中各坐标的距离,我们可以这样写查询语句:
SELECT
id,
latitude,
longitude,
6371 * 2 * ASIN(SQRT(
POWER(SIN((lat1 - latitude) * PI() / 180 / 2), 2) +
COS(lat1 * PI() / 180) * COS(latitude * PI() / 180) *
POWER(SIN((lon1 - longitude) * PI() / 180 / 2), 2)
)) AS distance
FROM
locations;
这里 6371 是地球的平均半径(单位为千米)。上述公式通过三角函数计算出给定坐标与表中各坐标的距离,结果存储在 distance 字段中。
接下来是排序。如果要按照计算出的距离对结果进行升序排序(距离最近的排在前面),只需在查询语句末尾添加 ORDER BY distance ASC。完整的查询语句如下:
SELECT
id,
latitude,
longitude,
6371 * 2 * ASIN(SQRT(
POWER(SIN((lat1 - latitude) * PI() / 180 / 2), 2) +
COS(lat1 * PI() / 180) * COS(latitude * PI() / 180) *
POWER(SIN((lon1 - longitude) * PI() / 180 / 2), 2)
)) AS distance
FROM
locations
ORDER BY
distance ASC;
如果要降序排序,将 ASC 改为 DESC 即可。
在实际应用中,我们还可以结合其他条件,如只查询距离在一定范围内的数据。可以在 WHERE 子句中添加条件,例如:
SELECT
id,
latitude,
longitude,
6371 * 2 * ASIN(SQRT(
POWER(SIN((lat1 - latitude) * PI() / 180 / 2), 2) +
COS(lat1 * PI() / 180) * COS(latitude * PI() / 180) *
POWER(SIN((lon1 - longitude) * PI() / 180 / 2), 2)
)) AS distance
FROM
locations
WHERE
6371 * 2 * ASIN(SQRT(
POWER(SIN((lat1 - latitude) * PI() / 180 / 2), 2) +
COS(lat1 * PI() / 180) * COS(latitude * PI() / 180) *
POWER(SIN((lon1 - longitude) * PI() / 180 / 2), 2)
)) <= 100
ORDER BY
distance ASC;
以上代码表示只查询距离给定坐标 100 千米以内的数据,并按照距离升序排序。通过这些操作,在 MySQL 中实现计算两坐标距离并排序就变得简单高效,能很好地满足地理信息相关业务的需求。
- HTML图片链接是HTTP打开却变HTTPS原因
- Sass 中优雅使用函数:支持传参且避免重复
- 高德地图添加 marker 标记后无法加载:加载异常原因探究
- Vue项目中使用ClickHouse JS实现增删改查的方法
- 不使用爬虫和接口,用JavaScript获取淘宝页面SKU价格的方法
- 绝对定位元素相对内容框的偏移方法
- HTTP POST请求获取视频文件流后转化为视频文件并下载的方法
- 高德地图原生开发地图无法加载,或与Mock.js有关
- CSS类名命名中串行命名与小驼峰命名的选择问题
- 侧边栏展开收起时如何避免页面内容超前伸
- 谷歌搜索框自动补齐功能的实现原理
- CSS 中 height、max-height、min-height 优先级的确定方法
- 怎样打造网页与控制台的不同表现
- 怎样借助 Performance 面板找出阻塞页面渲染的任务
- Vue 文件无法从 HTML 文件返回的原因