计算逻辑
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()
  }
}
爷们代码运行结果












![红黑树的概念和模拟实现[C++]](https://i-blog.csdnimg.cn/direct/ae5b2fe97a5045d6a70a45681aaac08a.png)







