终于有时间来搞一搞这个专栏了
首先声明一下
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 - lon1val dy = lat2 - lat1val azimuth = math.atan2(dy, dx) * 180 / math.Pi(azimuth + 360) % 360}// udfval 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
注意了啊,看自己的业务范围,我这适合短距离的,如果哪里不懂,评论区见
哦,忘记贴我的执行结果了