mysql距离计算,单位m,以及排序
lon 经度 lat 纬度
一般地图上显示的坐标顺序为,纬度在前(范围-90~90),经度在后(范围-180~180)
首先新建一张表,里面包含经纬度
/*
Navicat Premium Data Transfer
Source Server : localhost
Source Server Type : MySQL
Source Server Version : 50553
Source Host : localhost:3306
Source Schema : fastadmin
Target Server Type : MySQL
Target Server Version : 50553
File Encoding : 65001
Date: 20/08/2018 16:48:32
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for fa_circle
-- ----------------------------
DROP TABLE IF EXISTS `fa_circle`;
CREATE TABLE `fa_circle` (
`circle_id` mediumint(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`cat_id` smallint(5) NULL DEFAULT 0 COMMENT '类别ID',
`content` longtext CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`user_nick` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`user_avatar` varchar(150) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`user_id` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT '' COMMENT '文章作者',
`is_top` tinyint(1) UNSIGNED NOT NULL DEFAULT 1,
`createtime` int(10) UNSIGNED NOT NULL DEFAULT 0,
`link` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '链接地址',
`click` int(11) NULL DEFAULT 0 COMMENT '浏览量',
`publish_time` int(11) NULL DEFAULT NULL COMMENT '文章预告发布时间',
`pics` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '图片',
`circle_type` tinyint(2) NOT NULL COMMENT '1:图文 2文章腾讯视频',
`is_recommend` tinyint(2) NOT NULL DEFAULT 0,
`longitude` double(11, 6) NOT NULL DEFAULT 0.000000,
`latitude` double(11, 6) NOT NULL DEFAULT 0.000000,
`address` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址',
PRIMARY KEY (`circle_id`) USING BTREE,
INDEX `cat_id`(`cat_id`) USING BTREE
) ENGINE = MyISAM AUTO_INCREMENT = 8 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of fa_circle
-- ----------------------------
INSERT INTO `fa_circle` VALUES (1, 2, '测试一个内容', 'test', NULL, '1', 1, 1534747823, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396202, 36.307442, NULL);
INSERT INTO `fa_circle` VALUES (2, 2, '测试一个内容', 'test', NULL, '2', 1, 1534748669, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396201, 36.307441, NULL);
INSERT INTO `fa_circle` VALUES (3, 2, '测试一个内容', 'test', NULL, '3', 1, 1534748670, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396102, 36.307342, NULL);
INSERT INTO `fa_circle` VALUES (4, 2, '测试一个内容', 'test', NULL, '4', 1, 1534748670, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396202, 36.307443, NULL);
INSERT INTO `fa_circle` VALUES (5, 2, '测试一个内容', 'test', NULL, '1', 1, 1534748671, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396190, 36.307444, NULL);
INSERT INTO `fa_circle` VALUES (6, 2, '测试一个内容', 'test', NULL, '1', 1, 1534748671, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396192, 36.307440, NULL);
INSERT INTO `fa_circle` VALUES (7, 2, '测试一个内容', 'test', NULL, '1', 1, 1534748672, 'http://www.baidu.com', 0, NULL, 'http://pic1,http://pic2', 1, 0, 120.396193, 36.307449, NULL);
SET FOREIGN_KEY_CHECKS = 1;
然后我们开始用mysql自带的函数,计算customer表中,每个地方具体。
1 |
|
php 代码: |
$lat=120.396193;
$lng=36.307449;
$sql="select *,(2 * 6378.137* ASIN(SQRT(POW(SIN(3.1415926535898*(".$lat."-latitude)/360),2)+COS(3.1415926535898*".$lat."/180)* COS(lat * 3.1415926535898/180)*POW(SIN(3.1415926535898*(".$lng."-longitude)/360),2)))) as juli from `fa_circle` order by juli asc";
SQL语句:
SELECT
*,
(
2 * 6378.137 * ASIN(
SQRT(
POW( SIN( 3.1415926535898 * ( 120- latitude ) / 360 ), 2 ) + COS( 3.1415926535898 * 120 / 180 ) * COS( latitude * 3.1415926535898 / 180 ) * POW( SIN( 3.1415926535898 * ( 36- longitude ) / 360 ), 2 )
)
)
) AS juli
FROM
`fa_circle`
ORDER BY
juli ASC
至此,我们就能清楚的查看到纬度 36.307449经度 120.396193 距离 fa_circle表中的每个地区的距离(单位 km)