mysql空間函數(shù)計算坐標距離方式
mysql空間函數(shù)計算坐標距離
有一張表,表中有每個人所在位置及經(jīng)緯度,現(xiàn)在求表中所有人離指定經(jīng)緯度的位置。
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, '天壇公園');
假設本人目前在人民 大會堂,經(jīng)度116.393823,緯度39.905024,現(xiàn)在要查詢表中四個人距本人多少米。
現(xiàn)在用Mysql提供的空間函數(shù)演示計算。
1. st_distance函數(shù)
st_distance函數(shù)計算:
SELECT *, ROUND( st_distance ( point ( longitude, latitude ), point ( 116.393823, 39.905024 ))* 111195, 2 ) dis FROM teacher
2. st_distance_sphere函數(shù)
st_distance_sphere函數(shù)計算:
SELECT *, round( st_distance_sphere ( point ( 116.393823, 39.905024 ), point ( `longitude`, `latitude` ) ), 2 ) dis FROM teacher ORDER BY dis
比較兩種查詢結果,距離有不小的偏差。因為第一種st_distance函數(shù)計算的是兩點間的度,所以在計算出度數(shù)后再乘以111195得出米,而每度的長度并不一致所以有誤差。第二種st_distance_sphere函數(shù)直接計算兩點間的距離,更加準確。
對比下地圖測距:
3. st_distance_sphere取值范圍問題(極易踩坑)
在st_distance_sphere 函數(shù)中使用point計算經(jīng)緯度時有限制取值范圍,其中緯度為大于等于-90度小于等于90度,而經(jīng)度卻是大于-180度且小于等于180度。
如下所示:
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
一文帶你搞懂MySQL中的隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換
在mysql中,當操作涉及不同類型的數(shù)據(jù)時,會根據(jù)一定的規(guī)則自動進行類型轉(zhuǎn)換,本文主要來和大家聊聊隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換的相關知識,需要的可以參考一下2025-04-04