经纬度坐标距离最小值符合度sql

需求:
   一个数据表,找出按某一个字段分组,坐标范围最小值不满足要求的数据

描述说明:
1、距离可以用r*arccos[cos(y1)*cos(y2)*cos(x1-x2)+sin(y1)*sin(y2)]来算
2、r是地球半径6371km,x是经度,y是纬度
3、sin和cos函数的参数是以弧度为单位的角度,所以x1、x2、y1、y2要用弧度表示,角度换成弧度公式:换成RADIANS(y1)

4、A、B两点经纬度距离,单位米

    6371 * 1000 * acos(
          cos(radians(cast(A.lat as decimal))) * cos(radians(cast(B.lat as decimal))) * cos(
            radians(cast(B.lon as decimal)) - radians(cast(A.lon as decimal))
          ) + sin(radians(cast(A.lat as decimal))) * sin(radians(cast(B.lat as decimal)))
        )

如果查询,坐标位置为【113.65、34.76】到其他坐标的的距离,sql如下

    SELECT *, ACOS(
        COS(RADIANS(34.76)) *
        COS(RADIANS(cast(lat as decimal))) *
        COS(RADIANS(cast(lon as decimal)) - RADIANS(113.65)) +
        SIN(RADIANS(34.76)) *
        SIN(RADIANS(cast(lat as decimal)))
    ) * 6378 as distance
FROM gse_test_zb

5、查询数据表任意2行数据的差

数据表gse_test_zb(id,pro_num,.....) ,主键是id,按pro_num分组,分组内坐标之间距离小于1000米,找不到不符合要求的数据.

 数据表做自关联,分别计算组内坐标,如果组内坐标最小值大于1000秒,找出分组的pro_num

    select *
   from gse_test_zb
   where project_no in (select  A.project_no
        from gse_test_zb A, gse_test_zb B
      where   A.id ! = B.id and A.project_no = B.project_no
    group by
      A.project_no
     having
      min(
        6371 * 1000 * acos(
          cos(radians(cast(A.lat as decimal))) * cos(radians(cast(B.lat as decimal))) * cos(
            radians(cast(B.lon as decimal)) - radians(cast(A.lon as decimal))
          ) + sin(radians(cast(A.lat as decimal))) * sin(radians(cast(B.lat as decimal)))
        )
      ) > 1000
)
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值