我需要循环一个带坐标的表(lat,long在同一列中)并将它们与给定值进行比较。如果距离小于1 km,则更新符合条件的行的另一列。
这样的事情:
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, '')
我更新表的存储过程是这样的:
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是一行中的一个字符串,在表格中......
答案 0 :(得分:2)
据推测,这可以满足您的需求:
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);
另外,还有一些注意事项:
di
)。di.
)。v_
)混淆。