Spark轨迹大数据处理_scalaSpark代码实两个GIS点(经纬度点)之间的方位角计算

终于有时间来搞一搞这个专栏了

首先声明一下

        1、我这个代码是基于一个简化方位角模型,忽略了地球的曲率,适用于距离相对较短的距离。因为业务相关,这个方位角两个点的距离计算不会超过1000km。

        2、我这个方位角的计算逻辑:是从一个地点指向另一个地点的方向,以度为单位,从正北方向顺时针测量的角度,具体你可以去实测一下。

        3、这个计算我是经过了生产环境的实测的,而我呈现在这里代码是我本地的测试环境,原理不变,只不过是我做的博客Demo。

        4、如有雷同,纯属巧合Matrix70-CSDN博客,图片如有侵权请及时联系我,我就是发一篇博客,共享一下知识。

先来看方位角的定义:

        方位角(azimuthangle):从某点的指北方向线起,依顺时针方向到目标方向线之间的水平夹角,叫方位角。具体实例如下图

                                        图片来源:方位角-数学百科

废话不多说,直接上代码

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.UserDefinedFunction
import org.apache.spark.sql.functions._

/**
 * 方位角是从一个地点指向另一个地点的方向,通常以度为单位,从正北方向顺时针测量。
 */


  object Angle {
    def main(args: Array[String]): Unit = {
      val spark = SparkSession.builder()
        .appName("Azimuth计算")
        .master("local[*]")
        .getOrCreate()
      import spark.implicits._

      // 搞两个经纬度点转成df,这俩城市都是我搜的
      val A = Seq(("A", "北京", 23.1252, 113.2806)).toDF("id", "name", "longitudeA", "latitudeA")
      val C = Seq(("C", "沈阳", 25.05, 121.50)).toDF("id", "name", "longitudeC", "latitudeC")

      // 定义计算方位角的Scala函数

      /**
       *  这个就是用来计算方位角的udf了
       *  by    https://blog.csdn.net/qq_52128187?type=blog  防伪标识,这是一手的
       *  2024/07/23
       * @param lon1
       * @param lat1
       * @param lon2
       * @param lat2
       * @return
       */
      def getAzimuth(lon1: Double, lat1: Double, lon2: Double, lat2: Double): Double = {
        val dx = lon2 - lon1
        val dy = lat2 - lat1
        val azimuth = math.atan2(dy, dx) * 180 / math.Pi
        (azimuth + 360) % 360
      }

      // udf
      val getAzimuthUDF = udf((lon1: Double, lat1: Double, lon2: Double, lat2: Double) => {
        getAzimuth(lon1, lat1, lon2, lat2)
      })

      // 计算方位角
      val azimuthDF = A.crossJoin(C)
        .withColumn("fangweijiao", getAzimuthUDF($"longitudeA", $"latitudeA", $"longitudeC", $"latitudeC"))
      //
      azimuthDF.show(false)

      spark.stop()
    }
  }
代码运行肯定没问题,回来给兄弟点个赞和收藏吧  https://blog.csdn.net/qq_52128187?type=blog

注意了啊,看自己的业务范围,我这适合短距离的,如果哪里不懂,评论区见

哦,忘记贴我的执行结果了

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值