MySQL中从指定MultiPoint对象查找指定Point的最近3个点
嘿,这事儿好办!要从你定义的MultiPoint里找出距离@home最近的3个点,咱们可以借助MySQL的空间函数来实现,下面分情况给你两种可行的方案:
方案一:适合MySQL 8.0+(用递归CTE,更灵活)
先确认你的两个几何对象已经定义好(就是你给出的那两行SET语句),然后用递归CTE把MultiPoint里的每个点拆出来,再计算距离排序:
-- 先定义你的几何对象 SET @multi_point = ST_GeomFromText('MULTIPOINT(-118.2845938 34.0252385, -118.2867610 34.0221188, -118.2905912 34.0227248, -118.284119 34.021846, -118.2864676 34.0186438, -118.2886342 34.0203211, -118.2907290 34.0193680, -118.2831326 34.0192874, -118.2828242 34.0205473)'); SET @home = ST_GeomFromText('POINT(-118.2819136 34.0261177)'); -- 递归CTE拆分MultiPoint并计算距离 WITH RECURSIVE point_list AS ( SELECT 1 AS idx, ST_GeometryN(@multi_point, 1) AS point, ST_Distance_Sphere(@home, ST_GeometryN(@multi_point, 1)) AS distance_meters UNION ALL SELECT idx + 1, ST_GeometryN(@multi_point, idx + 1), ST_Distance_Sphere(@home, ST_GeometryN(@multi_point, idx + 1)) FROM point_list WHERE idx < ST_NumGeometries(@multi_point) ) SELECT ST_AsText(point) AS point_wkt, -- 把点转换成可读的WKT格式 ROUND(distance_meters, 2) AS distance_meters -- 保留两位小数的距离(米) FROM point_list ORDER BY distance_meters ASC -- 按距离从小到大排序 LIMIT 3; -- 取最近的3个
方案二:适合MySQL 8.0以下(用数字列表,简单直接)
如果你的MySQL版本不支持递归CTE,那就手动生成一个和MultiPoint点数匹配的数字列表,逐个取出点计算:
-- 同样先定义几何对象 SET @multi_point = ST_GeomFromText('MULTIPOINT(-118.2845938 34.0252385, -118.2867610 34.0221188, -118.2905912 34.0227248, -118.284119 34.021846, -118.2864676 34.0186438, -118.2886342 34.0203211, -118.2907290 34.0193680, -118.2831326 34.0192874, -118.2828242 34.0205473)'); SET @home = ST_GeomFromText('POINT(-118.2819136 34.0261177)'); -- 用数字列表拆分MultiPoint SELECT ST_AsText(ST_GeometryN(@multi_point, n.n)) AS point_wkt, ROUND(ST_Distance_Sphere(@home, ST_GeometryN(@multi_point, n.n)), 2) AS distance_meters FROM ( -- 生成1到9的数字(因为你的MultiPoint有9个点) SELECT 1 AS n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9 ) n WHERE n.n <= ST_NumGeometries(@multi_point) -- 确保不超出MultiPoint的点数 ORDER BY distance_meters ASC LIMIT 3;
几个关键说明:
ST_Distance_Sphere():因为你用的是经纬度坐标,这个函数会计算球面距离,单位是米,比ST_Distance()(平面距离)更准确。如果是平面坐标系,换成ST_Distance()就行。ST_GeometryN():用来从MultiPoint中取出第N个点,配合ST_NumGeometries()可以知道总共有多少个点。- 排序和LIMIT:通过
ORDER BY distance_meters ASC把最近的点排前面,LIMIT 3直接取前3个。
内容的提问来源于stack exchange,提问作者Ajay H
相关产品推荐
相关产品推荐

