SELECT regionId, provinceName, cityName, districtName, lon, lat, ST_Distance_Sphere(location, POINT(103.0, 31.0)) AS distance_meters FROM t_region WHERE deleted =0 ORDERBY distance_meters ASC;
情况二:数据库中只有经度和纬度字段
数据库:有经度、纬度字段,但是没有 POINT 字段 实体类:有经纬度字段(double)
1 2 3 4 5 6 7 8 9 10 11
SELECT regionId, provinceName, cityName, districtName, lon, lat, ST_Distance_Sphere(POINT(lon, lat), POINT(103.0, 31.0)) AS distance_meters FROM t_region WHERE deleted =0 ORDERBY distance_meters ASC;
如果需要按公里展示,可以在查询结果外层除以 1000:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
SELECT t.*, ROUND(t.distance_meters /1000, 3) AS distance_km FROM ( SELECT regionId, provinceName, cityName, districtName, lon, lat, ST_Distance_Sphere(POINT(lon, lat), POINT(103.0, 31.0)) AS distance_meters FROM t_region WHERE deleted =0 ) AS t ORDERBY t.distance_meters ASC;
附:建表语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
CREATE TABLE `t_region` ( `id` bigintNOT NULL AUTO_INCREMENT, `regionId` intNOT NULLDEFAULT0 COMMENT '编号规则6位有符号整数,例如110000。', `provinceName` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULLDEFAULT'' COMMENT '省编号', `cityName` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULLDEFAULT'' COMMENT '市编号', `districtName` varchar(32) CHARACTER SET utf8 COLLATE utf8_bin NOT NULLDEFAULT'' COMMENT '区县编号', `lon` doubleNOT NULLDEFAULT0 COMMENT '经度', `lat` doubleNOT NULLDEFAULT0 COMMENT '纬度', `location` point NOT NULL COMMENT '经纬度 POINT,POINT(x,y) 中 x 为经度、y 为纬度', `parentRegionId` intNOT NULLDEFAULT0 COMMENT '父节点', `createTime` datetime NOT NULLDEFAULTCURRENT_TIMESTAMP COMMENT '创建时间', `createUser` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULLDEFAULT'sys' COMMENT '创建人', `updateTime` datetime NOT NULLDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP COMMENT '修改时间', `updateUser` varchar(20) CHARACTER SET utf8 COLLATE utf8_bin NOT NULLDEFAULT'sys' COMMENT '修改人', `deleted` intNOT NULLDEFAULT0 COMMENT '删除状态 0 正常 1 已删除', `version` intNOT NULLDEFAULT0 COMMENT '修改序号', PRIMARY KEY (`id`) USING BTREE, SPATIAL INDEX `idx_location` (`location`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;