MySQL 按经纬度排序

MySQL 按经纬度排序

在一些应用程序中,经常会用到地理位置信息,例如在附近的人、附近的商家、地图导航等场景下需要对地理位置进行排序。MySQL作为关系型数据库,也能支持对经纬度进行排序,这就需要使用到MySQL提供的地理位置函数和相关的数据类型。

阅读更多:

经纬度数据类型

MySQL提供了两种数据类型用于表示经纬度,分别为:

(adsbygoogle = window.adsbygoogle || []).push({});

(adsbygoogle = window.adsbygoogle || []).push({});

  • DECIMAL(10,8):这个数据类型用于存储精确到小数点后8位的经纬度数值。可以使用-180.00000000 ~ 180.00000000-90.00000000 ~ 90.00000000表示对应的经纬度范围。例如:
经度:116.40404000
纬度:39.91599000
  • POINT:这个数据类型可用于存储点的几何对象,包括经纬度坐标和其他属性数据。但对于本文主题来说,不涉及其他属性数据。

地理位置函数

MySQL提供了很多地理位置函数,可以用于地理位置计算、几何操作和位置查询,其中有一些用于计算两个坐标点之间的距离和方位角。

ST_GeomFromText

该函数将WKT格式的文本转化为几何坐标点,使用如下:

ST_GeomFromText(WKT);

例如,下面两个SQL语句是等价的:

SELECT ST_GeomFromText('POINT(116.40404000 39.91599000)');
SELECT POINT(116.40404000,39.91599000);

ST_Distance_Sphere

该函数用于计算两个经纬度坐标之间的球面距离,返回值为米。

ST_Distance_Sphere(point1, point2);

例如:

SELECT ST_Distance_Sphere(POINT(116.40404000,39.91599000),POINT(116.40752600,39.90403000));
-- 返回值:1633

ST_Azimuth

该函数用于计算一个点到另一个点之间的方位角,例如:

(adsbygoogle = window.adsbygoogle || []).push({});

(adsbygoogle = window.adsbygoogle || []).push({});

ST_Azimuth(point1,point2);

例如,下面的SQL语句:

SELECT ST_Azimuth(POINT(116.40404000,39.91599000),POINT(116.40752600,39.90403000));

输出结果为241.566618903138

ST_PointFromGeoHash

该函数用于将GeoHash编码转化为几何坐标点,例如:

ST_PointFromGeoHash(str[, max_length]);

其中,str为GeoHash编码,max_length为最大长度(可选,缺省为12)。例如:

SELECT ST_PointFromGeoHash('wx4g');
-- 返回点对象:POINT(-120.37236309051514,47.173812661886454)

排序

当要按照经纬度对数据进行排序时,可以使用ST_Distance_Sphere函数来计算距离,并根据距离进行排序。下面是一些示例SQL语句。

  1. 计算存储在数据库中的所有位置与给定的位置之间的距离,并按照距离升序排序,例如:
SELECT * FROM locations 
ORDER BY ST_Distance_Sphere(POINT(-118.4021, 33.9456), POINT(latitude,longitude)) ASC;
  1. 查找最近的10个位置,并将其按照升序排序,例如:
SELECT * FROM locations 
ORDER BY ST_Distance_Sphere(POINT(-118.4021, 33.9456), POINT(latitude,longitude)) ASC
LIMIT 0,10;
  1. 如果需要与MySQL中存储的GeoHash编码进行排序,可以使用ST_PointFromGeoHash函数来将编码转化为几何坐标点,并使用ST_Distance_Sphere函数计算距离,例如:
SELECT * FROM locations 
ORDER BY ST_Distance_Sphere(
  ST_PointFromGeoHash('9reg'),
  POINT(latitude,longitude)
) ASC;

在上述示例中,将9reg这个GeoHash编码转化为了几何坐标点,并将该点与表中的所有位置计算距离,最后按照距离升序排序。

(adsbygoogle = window.adsbygoogle || []).push({});

(adsbygoogle = window.adsbygoogle || []).push({});

总结

通过本文,我们学习了MySQL中的地理位置函数和数据类型,以及在为了对经纬度进行排序时应该选择哪些函数来计算距离和方位角。不论你是在构建一个附近的人模块、附近的商家模块或是其他需要对地理位置排序的应用程序,希望这些内容对你有所帮助。