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

计算逻辑

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

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

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

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

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

                   

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

废话不多说,直接上代码

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions.udf

/**
 * 增加了多堆多的方位角计算模型计算方法
 */
object Angle_MoreToMore {
  // 计算两个经纬度坐标之间的方位角
  def calculateAzimuth(lon1: Double, lat1: Double, lon2: Double, lat2: Double): Double = {
    val dx = lon2 - lon1
    val dy = lat2 - lat1
    val azimuth = math.atan2(dx, dy) * 180 / math.Pi
    (azimuth + 360) % 360
  }

  def main(args: Array[String]): Unit = {
    // 创建一个 SparkSession
    val spark = SparkSession.builder()
      .appName("Azimuth Calculation") 
      .master("local[*]") 
      .getOrCreate()

    import spark.implicits._

    // 创建 DataFrame A 包含地点信息和经纬度信息
    val A = Seq((101, "北京", 39.9042, 116.4074),
      (102, "广州", 23.16, 113.23)
    ).toDF("id1", "name1", "latitudeA", "longitudeA")

    // 创建 DataFrame C 包含地点信息和经纬度信息
    val C = Seq(
      (101, "吉林", 43.8171, 125.3235),
      (101, "黑龙江", 45.8023, 126.5350),
      (102, "江苏", 32.0603, 118.7969),
      (102, "浙江", 30.2875, 120.1536),
      (101,"新疆", 43.77, 87.68),
      (102, "台湾省", 25.05, 121.50)
    ).toDF("id2", "name2", "latitudeC", "longitudeC")

    
    val calculateAzimuthUDF = udf(calculateAzimuth _)

    // 
    val azimuthDF = A.join(C, A("id1") === C("id2"))
      .withColumn("azimuth", calculateAzimuthUDF($"longitudeA", $"latitudeA", $"longitudeC", $"latitudeC"))

    // 方位角数据
    azimuthDF.show(false)

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

    spark.stop()
  }
}

爷们代码运行结果

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值