取得经度值函数:
DROP FUNCTION IF EXISTS `fn_getLon`$$
CREATE DEFINER=`root`@`%` FUNCTION `fn_getLon`(lat1 DOUBLE, lon1 DOUBLE,azimuth DOUBLE,distance DOUBLE) RETURNS DOUBLE
BEGIN
DECLARE Lon2,lat2 DOUBLE;
DECLARE RADIUS DOUBLE DEFAULT 6371;
DECLARE P_I DOUBLE DEFAULT 3.1415926;
SET RADIUS = 6371.1;
SET P_I= 3.1415926;
SET lat1 = lat1 * P_I/180;
SET lon1 = lon1 * P_I/180;
SET azimuth = azimuth * P_I/180;
SET lat2 = ASIN( SIN(lat1)*COS(distance/radius) + COS(lat1)*SIN(distance/radius)*COS(azimuth) );
SET lon2 = lon1 + ATAN2(SIN(azimuth)*SIN(distance/radius)*COS(lat1), COS(distance/radius)-SIN(lat1)*SIN(lat2));
-- 计算的结果为弧度,需转换到浮点经纬度。
SET lon2 = lon2 * 180/P_I;
RETURN lon2;
END$$
取得纬度值函数:
DROP FUNCTION IF EXISTS `fn_getLat`$$
CREATE DEFINER=`root`@`%` FUNCTION `fn_getLat`(lat1 DOUBLE, azimuth DOUBLE,distance DOUBLE) RETURNS DOUBLE
BEGIN
DECLARE lat2 DOUBLE;
DECLARE RADIUS DOUBLE DEFAULT 6371;
DECLARE P_I DOUBLE DEFAULT 3.1415926;
SET RADIUS = 6371.1;
SET P_I= 3.1415926;
SET lat1 = lat1 * P_I/180;
SET azimuth = azimuth * P_I/180;
SET lat2 = ASIN( SIN(lat1)*COS(distance/radius) + COS(lat1)*SIN(distance/radius)*COS(azimuth) );
-- 计算的结果为弧度,需转换到浮点经纬度。
SET lat2 = lat2 * 180/P_I;
RETURN lat2;
END$$
使用示例:
取得某点在一个方向上延伸10m后的坐标值,更新相关字段。
UPDATE (SELECT f_cellID,fn_getLat(b.f_LatY,a.f_Direction,0.001) exlaty,fn_getLon(b.f_LatY,b.f_LongX,a.f_Direction,0.001) exLongx
FROM t_cell a,t_node b
WHERE a.f_NodeID=b.f_NodeID )AS t1, t_cell AS t2
SET f_exLatY=exlaty,f_exLongX=exlongx
WHERE t1.f_cellID= t2.f_cellID