求证一个点在某方向上的另一个位置坐标

 Mysql数据库实现如下功能,

取得经度值函数:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值