计算 MySQL 坐标并更新行
Calculate MySQL coordinate and update rows
我需要遍历 table 坐标(同一列中的经纬度)并将它们与给定值进行比较。如果距离小于 1 公里,则更新符合条件的行的另一列。
像这样:
Foreach row in Table
if CalculateDistance(lat1,long1,lat2,long2) < 1
Update row.Column2
我找到了一个计算公式,在这里:https://gist.github.com/Usse/4086343
此时我正在尝试测试公式。
谢谢
编辑 1:
所以我创建了程序,但卡住了。
我创建了一个拆分字符串函数:
CREATE DEFINER=`root`@`localhost` FUNCTION `strSplit`(x varchar(255), delim varchar(12), pos int) RETURNS varchar(255) CHARSET utf8
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '')
我更新 table 的存储过程是这样的:
CREATE DEFINER=`root`@`localhost` PROCEDURE `turn_camera_on`(coordonates varchar(50))
BEGIN
DECLARE lat1 varchar(50);
DECLARE long1 varchar(50);
SET lat1 = strSplit(coordonates, ',', 1);
SET long1 = strSplit(coordonates, ',', 2);
UPDATE deviceinfo
SET CameraOn = 1
where CalculateDistance(lat1,long1,**lat2,long2**) < 1;
END
问题是 lat2 和 long2 是连续的字符串,在 table...
大概,这就是你想要的:
DECLARE v_lat1 varchar(50);
DECLARE v_long1 varchar(50);
SET lat1 = strSplit(v_coordinates, ',', 1);
SET long1 = strSplit(v_coordinates, ',', 2);
UPDATE deviceinfo di
SET CameraOn = 1
WHERE CalculateDistance(v_lat1, v_long1, strSplit(di.coordinates, ',', 1), strSplit(di.coordinates, ',', 2)) < 1;
然而,在 MySQL 中定义自己的拆分函数似乎是多余的。你可以只写:
UPDATE deviceinfo di
SET CameraOn = 1
WHERE CalculateDistance(substring_index(v_coordinates, ',', 1),
substring_index(v_coordinates, ',', -1),
substring_index(di.coordinates, ',', 1),
substring_index(di.coordinates, ',', -1);
此外,一些注意事项:
- 始终定义 table 别名(上述查询中的
di
)。
- 始终限定列名称(上述查询中的
di.
)。
- 前缀变量和参数名称,以免它们与上述查询中的列(
v_
)混淆。
我需要遍历 table 坐标(同一列中的经纬度)并将它们与给定值进行比较。如果距离小于 1 公里,则更新符合条件的行的另一列。
像这样:
Foreach row in Table
if CalculateDistance(lat1,long1,lat2,long2) < 1
Update row.Column2
我找到了一个计算公式,在这里:https://gist.github.com/Usse/4086343
此时我正在尝试测试公式。
谢谢
编辑 1:
所以我创建了程序,但卡住了。
我创建了一个拆分字符串函数:
CREATE DEFINER=`root`@`localhost` FUNCTION `strSplit`(x varchar(255), delim varchar(12), pos int) RETURNS varchar(255) CHARSET utf8
return replace(substring(substring_index(x, delim, pos), length(substring_index(x, delim, pos - 1)) + 1), delim, '')
我更新 table 的存储过程是这样的:
CREATE DEFINER=`root`@`localhost` PROCEDURE `turn_camera_on`(coordonates varchar(50))
BEGIN
DECLARE lat1 varchar(50);
DECLARE long1 varchar(50);
SET lat1 = strSplit(coordonates, ',', 1);
SET long1 = strSplit(coordonates, ',', 2);
UPDATE deviceinfo
SET CameraOn = 1
where CalculateDistance(lat1,long1,**lat2,long2**) < 1;
END
问题是 lat2 和 long2 是连续的字符串,在 table...
大概,这就是你想要的:
DECLARE v_lat1 varchar(50);
DECLARE v_long1 varchar(50);
SET lat1 = strSplit(v_coordinates, ',', 1);
SET long1 = strSplit(v_coordinates, ',', 2);
UPDATE deviceinfo di
SET CameraOn = 1
WHERE CalculateDistance(v_lat1, v_long1, strSplit(di.coordinates, ',', 1), strSplit(di.coordinates, ',', 2)) < 1;
然而,在 MySQL 中定义自己的拆分函数似乎是多余的。你可以只写:
UPDATE deviceinfo di
SET CameraOn = 1
WHERE CalculateDistance(substring_index(v_coordinates, ',', 1),
substring_index(v_coordinates, ',', -1),
substring_index(di.coordinates, ',', 1),
substring_index(di.coordinates, ',', -1);
此外,一些注意事项:
- 始终定义 table 别名(上述查询中的
di
)。 - 始终限定列名称(上述查询中的
di.
)。 - 前缀变量和参数名称,以免它们与上述查询中的列(
v_
)混淆。