spark编程10——经纬度和距离之间的转化:由两个经纬度点求它们之间的距离

该博客介绍了如何在Spark中编写一个UDF(用户定义函数)来计算两个经纬度之间的距离,采用haversine公式。同时,通过广播较小的数据集来提高效率,对数据进行匹配,当距离小于100米时认为匹配成功。这个过程对于地理数据处理和分析具有实际应用价值。
摘要由CSDN通过智能技术生成
 //TODO 计算经纬度之间距离的函数
    def Distance(x1: Double, y1: Double, x2: Double, y2: Double): Double = { //用haversine公式计算球面两点间的距离。
      //经纬度转换成弧度
      val lon1: Double = x1 * math.Pi / 180//经度(大)
      val lat1: Double = y1 * math.Pi / 180//纬度(小)
      val lon2: Double = x2 * math.Pi / 180//经度
      val lat2: Double = y2 * math.Pi / 180//纬度

      //差值
      val vLon = math.abs(lon1 - lon2)
      val vLat = math.abs(lat1 - lat2)
      //h is the great circle distance in radians, great circle就是一个球体上的切面,它的圆心即是球心的一个周长最大的圆。
      val h = (math.sin(vLat / 2))*(math.sin(vLat / 2)) + math.cos(lat1) * math.cos(lat2) * (math.sin(vLon / 2))*(math.sin(vLon / 2))
      val distance = 2 * 6371.0 * math.atan2(math.sqrt(h), math.sqrt(1 - h))
      distance*1000
    }
    spark.udf.register("Distance",Distance(_:Double,_:Double,_:Double,_:Double))

一定,一定,一定不要把经纬度输反了。

 val rdd01=df04.rdd.map(x=>(x(0).toString,x(1).toString,x(2).toString,x(3).toString,x(4).toString,x(5).toString,x(6).toString))
    val rdd02=df05.rdd.map(x=>(x(0).toString,x(1).toString,x(2).toString,x(3).toString))
    val broad=sc.broadcast(rdd02.collect())
    val rdd03=rdd01.flatMap{
      x=>{
        broad.value.map{
          y=>{
            var station="badStation"
            var distance1=Distance(x._4.toDouble,x._3.toDouble,y._4.toDouble,y._3.toDouble)
            if(distance1 <= 100.0)
              (x._1,x._5,x._6,y._2,y._1)
            else
              (x._1,x._5,x._6,station,y._1)
          }
        }
      }
    }

将小的数据表进行广播,小于100米的断定为匹配成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值