计算逻辑
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()
}
}