终于有时间来搞一搞这个专栏了
首先声明一下
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
注意了啊,看自己的业务范围,我这适合短距离的,如果哪里不懂,评论区见
哦,忘记贴我的执行结果了