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 です。ここで、テーブルにいる 4 人の人々が私から何メートル離れているかを確認したいと思います。
次に、Mysql が提供する空間関数を使用して計算を示します。
st_ distance 関数の計算:
ここに画像の説明を挿入

SELECT
	*,
	ROUND( st_distance ( point ( longitude, latitude ), point ( 116.393823, 39.905024 ))* 111195, 2 ) dis 
FROM
	teacher

st_ distance_sphere 関数は次を計算します。

ここに画像の説明を挿入

SELECT
	*,
	round( st_distance_sphere ( point ( 116.393823, 39.905024 ), point ( `longitude`, `latitude` ) ), 2 ) dis 
FROM
	teacher 
ORDER BY
	dis

2 つのクエリ結果を比較すると、距離に少なからず偏差があります。st_ distance 関数の最初のタイプは 2 点間の度数を計算するため、度数を計算してから 111195 を乗じてメートルを取得すると、各度の長さが一貫していないため、エラーが発生します。2 番目の st_ distance_sphere 関数は、2 点間の距離を直接計算するため、より正確です。

距離を地図と比較します。
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/worilb/article/details/124976921