mysql空間函數計算坐標距離方式
mysql空間函數計算坐標距離
有一張表,表中有每個人所在位置及經緯度,現在求表中所有人離指定經緯度的位置。
DROP TABLE IF EXISTS `teacher`; CREATE TABLE `teacher` ( `id` int NOT NULL AUTO_INCREMENT, `name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `longitude` decimal(9, 6) NULL DEFAULT NULL, `latitude` decimal(9, 6) NULL DEFAULT NULL, `address` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; -- ---------------------------- -- Records of teacher -- ---------------------------- INSERT INTO `teacher` VALUES (1, '張三', 116.397755, 39.903179, '天安門'); INSERT INTO `teacher` VALUES (2, '李四', 116.397029, 39.917840, '故宮'); INSERT INTO `teacher` VALUES (3, '王五', 116.190595, 39.876665, '園博園'); INSERT INTO `teacher` VALUES (4, '趙六', 116.410829, 39.881983, '天壇公園');
假設本人目前在人民 大會堂,經度116.393823,緯度39.905024,現在要查詢表中四個人距本人多少米。
現在用Mysql提供的空間函數演示計算。
1. st_distance函數
st_distance函數計算:
SELECT *, ROUND( st_distance ( point ( longitude, latitude ), point ( 116.393823, 39.905024 ))* 111195, 2 ) dis FROM teacher
2. st_distance_sphere函數
st_distance_sphere函數計算:
SELECT *, round( st_distance_sphere ( point ( 116.393823, 39.905024 ), point ( `longitude`, `latitude` ) ), 2 ) dis FROM teacher ORDER BY dis
比較兩種查詢結果,距離有不小的偏差。因為第一種st_distance函數計算的是兩點間的度,所以在計算出度數后再乘以111195得出米,而每度的長度并不一致所以有誤差。第二種st_distance_sphere函數直接計算兩點間的距離,更加準確。
對比下地圖測距:
3. st_distance_sphere取值范圍問題(極易踩坑)
在st_distance_sphere 函數中使用point計算經緯度時有限制取值范圍,其中緯度為大于等于-90度小于等于90度,而經度卻是大于-180度且小于等于180度。
如下所示:
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。