Spark轨迹大数据高效处理_计算两经纬度点间的距离_使用Haversine formula公式
开发背景
接上文我求的两经纬度点之间的方位角,我的需求里还提到了要计算距离,当然这个距离也是为后面的需求做铺垫的,因此需要求两个经纬度电之间的距离。
不要妄想用勾股定理求出来,实际上距离的计算还是稍微复杂些。这里使用的是Haversine公式,用于在给定两个地理坐标点的情况下计算它们之间的球面距离,我直接将这个公式的数学计算实现为一个方法,然后再代码中调用。
生产环境使用(球面短距离计算)
Haversine公式的数学理论基于球面三角学和三角恒等式的推导,通过近似计算大圆航线距离,适用于小距离的球面距离计算。这基本符合我的需求,因为我的计算都是基本是短距离计算的,基本不会跨省,实际效果也不错,如果你是超远距离计算,比如跨国,跨洲了,可以先试试,然后再考虑使用。
来源 https://wikipredia.net/zh/Haversine_formula#Formulation
说完理论部分,我就要开始上代码了,基本上你配置完spark环境,直接把我的代码扔上去就能看到输出结果,因为我是做了很多遍验证的。
spark代码
这个你可以转成python,反正算法基本都一样,不过换了一种写法
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.functions._/*** 增加了多对多的方位角计算以及计算对应距离模型计算方法* 代码实现了计算多个点位对多个点位的方位角计算以及对应的距离计算,基本算是final版本* 基本实现了角度计算和距离计算* 在实际生产中,会出现噪音点,以及点位null值等,还是提前清洗一下数据为好* 2024年8月6日写,几个月前就搞好了,一直没空发博客。。。今天又闲下来了,干就完了,有问题及时联系* @email matrix70@163.com* @author lixh*/
object Angle_MoreToMore_Distance {/*** @author lixh* @param lon1* @param lat1* @param lon2* @param lat2* @return*/// 计算两个经纬度坐标之间的方位角def calculateAzimuth(lon1: Double, lat1: Double, lon2: Double, lat2: Double): Double = {val dx = lon2 - lon1val dy = lat2 - lat1val azimuth = math.atan2(dx, dy) * 180 / math.Pi(azimuth + 360) % 360}//距离算法 Haversine @author lixhdef haversineDistance(lat1: Double, lon1: Double, lat2: Double, lon2: Double): Double = {val toRadians = Math.toRadians(_: Double)val dLat = toRadians(lat2 - lat1)val dLon = toRadians(lon2 - lon1)val a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +Math.cos(toRadians(lat1)) * Math.cos(toRadians(lat2)) *Math.sin(dLon / 2) * Math.sin(dLon / 2)val c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a))val EARTH_RADIUS_KM = 6371.0val distance = EARTH_RADIUS_KM * cdistance}def main(args: Array[String]): Unit = {val spark = SparkSession.builder().appName("Azimuth Calculation") // 设置应用程序名称.master("local[*]") // 运行模式,这里使用本地模式.getOrCreate()import spark.implicits._// DF A 包含地点信息和经纬度信息 @author https://blog.csdn.net/qq_52128187?type=blog val A = Seq((101, "北京", 39.9042, 116.4074),(102, "广州", 23.16, 113.23)).toDF("id1", "name1", "latitudeA", "longitudeA")// DF 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 _)// 执行内连接操作,计算方位角并添加到新列 "azimuth"val azimuthDF = A.join(C, A("id1") === C("id2")).withColumn("azimuth", calculateAzimuthUDF($"longitudeA", $"latitudeA", $"longitudeC", $"latitudeC"))// 计算得到的方位角数据azimuthDF.show(false)val haversineDistanceUDF = udf((lat1: Double, lon1: Double, lat2: Double, lon2: Double) => haversineDistance(lat1, lon1, lat2, lon2))//距离字段添加,@author lixhval resultDf = azimuthDF.withColumn("distance", haversineDistanceUDF($"latitudeA", $"longitudeA", $"latitudeC", $"longitudeC"))resultDf.show()spark.stop()}
}
代码输出结果
到这里基本就完成了,你可以对输出结果进行小数点位限制,一个round函数就解决。
参考资料:
https://wikipredia.net/zh/Haversine_formula
相关文章:

Spark轨迹大数据高效处理_计算两经纬度点间的距离_使用Haversine formula公式
开发背景 接上文我求的两经纬度点之间的方位角,我的需求里还提到了要计算距离,当然这个距离也是为后面的需求做铺垫的,因此需要求两个经纬度电之间的距离。 不要妄想用勾股定理求出来,实际上距离的计算还是稍微复杂些。这里使用的…...
[C++] : std::copy_n
std::copy_n 是 C 标准库中的一个算法,用于将指定数量的元素从一个输入范围复制到一个输出范围。那这就提供了很灵活的用法了。下面我们举例说明。 语法 template< class InputIt, class Size, class OutputIt > OutputIt copy_n(InputIt first, Size count…...

centos上传工具
yum install lrzsz 安装完成之后 作用是 输入 rz 可以本地上传文件...

【C++】vector习题
一、杨辉三角 class Solution { public:vector<vector<int>> generate(int numRows) {} }; 这里给你一个vector<vector<int>>类型 也就是说vector中的各个数据,存的是各个不同的vector 思路:先给vector开空间,然后…...
Webpack Bundle Analysis:减少包体积的技巧
Webpack 是一个流行的 JavaScript 模块打包器,它能够将项目中各种类型的模块和资源打包成一个或多个 bundle。然而,随着项目的复杂性增加,bundle 的体积也会随之增大,这可能导致加载时间变长,影响用户体验。 Webpack …...

如何利用 ChatGPT 提高工作效率?
内容创作与总结: 写作辅助:可以帮助撰写文章、报告、邮件等各种文本,如为招商银行写宣传文案、写论文、写故事等。学习材料生成:能够生成学习材料,如摘要、抽认卡和测验,帮助学生复习和学习课程。评估和考核…...
使用 Redisson 、Redis实现分布式锁
Redisson 是基于 Redis 实现的一个 Java 框架,为开发者提供了更方便、更高级的 API 和功能。 Redisson 优点: 简单易用的 API:简化了 Redis 操作的代码编写,使开发者能够更专注于业务逻辑。 分布式特性支持:如分布式…...

Typro + PicGo 图床 + Docsify + GitHub Pages,玩转个人知识库搭建,写给小白的建站入门课
自动开了这个号以后,陆陆续续写了很多干货文章,一方面是可以帮助自己梳理思路,另一方面也方便日后查找相关内容。 但是,我想检索某个关键词是在之前哪篇文章写过的,就有点捉急了。CSDN 还好,可以检索到相关…...

多角度文字识别:应对复杂环境的智能解决方案
多角度文字识别(Multi-Angle Text Recognition)是指在不同视角、不同光照条件和不同背景下对文本进行识别的技术。这项技术在许多应用场景中都非常重要,例如自动驾驶、智能监控、文档数字化等。以下是关于多角度文字识别的一些关键点和摘要&a…...
笔记:简单介绍WPF中RenderTransform,LayoutTransform, VisualTransform区别
一、目的:简单介绍WPF中RenderTransform,LayoutTransform, VisualTransform区别 在 WPF 中,RenderTransform、LayoutTransform 和 VisualTransform 是用于对控件进行变换的属性,他们的主要区别是什么,如何选…...

【AI大模型】LangChain框架:示例选择器与输出解析器携手,编织NLP高效精准之网
文章目录 前言一、示例选择器1.介绍及应用2.自定义示例选择器案例:AI点评姓名 3.基于长度的示例选择器案例:对输入内容取反 4.基于最大边际相关性(MMR)的示例选择器案例:得到输入的反义词 5.基于n-gram重叠的示例选择器6.综合案例 二、输出解…...

苹果电脑玩的游戏有哪些 Mac电脑怎么玩Windows游戏 苹果电脑可以装模拟器玩游戏吗
苹果电脑虽然在游戏生态上可能不及Windows平台那么广泛,但其强大的硬件和macOS系统的优化,足以支持一系列高质量游戏的流畅运行。从策略游戏《文明VI》到动作冒险游戏《黑暗之魂III》,再到解谜游戏《传送门2》和角色扮演游戏《神界࿱…...

【mathtype】word中如何输入4×4的矩阵,甚至阶数更多
在写论文或者使用word操作的时候,我们可能会使用矩阵插入我们所写的word中,今天小编就分享一下如何在word中输入矩阵。首先,我们word中需要安装mathtype的插件。 ①打开word,鼠标点击mathtype,再点击内联 ② 出现以下…...
ByteArrayOutputStream
ByteArrayOutputStream 是 Java 中的一个类,它属于 java.io 包。这个类实现了一个字节输出流,其中数据被写入到一个字节数组中。这个缓冲区在数据写入时会自动增长,以适应需要存储的数据量。下面是对 ByteArrayOutputStream 的详细解释: 构造函数 ByteArrayOutputStream…...

使用CLIP模型进行零样本图像分类的分步指南
零样本学习允许AI系统对未明确训练过的类别进行图像分类,标志着计算机视觉和机器学习的重大进步。本文将介绍使用CLIP实现零样本图像分类的详细分步指南,从环境设置到最终的图像处理和分类。我们首先介绍零样本学习的概念及其在现代AI应用中的重要性。然后深入探讨CLIP模型的概…...

Llama 3.1用了1.6万个英伟达H100 GPU,耗费......
目录 Llama 3.1发布简介 Llama 3.1模型规模与训练 大模型企业发展面临的问题与困境 算力和能耗算力方面 数据和资金方面 技术和人才方面 Llama 3.1发布简介 当地时间 2024年 7月 23号,Meta 公司发布了迄今为止最强大的开源 AI 模型 Llama 3.1。该模型不仅规模…...

学习c语言第24天(练习)
编程题 第一题 最大公约数最小公倍数求和 //求最大公约数和最小公倍数之和 //暴力求解 //int main() //{ // int n 0; // int m 0; // while (scanf("%d %d", &n, &m)2) // { // int min n < m ? n : m; // int max n > m ? n : m; //…...

【微信小程序开发】——奶茶点餐小程序的制作(一)
👨💻个人主页:开发者-曼亿点 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 曼亿点 原创 👨💻 收录于专栏:…...
鱼眼相机去畸变和矫正
基于smart3D计算完空三进行导出opt文件 xx.opt文件,类似于xml文件 <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <OpticalProperties version="1.0"><Id>0</Id><Name>201空三任务_1_…...

Llama 3.1论文中文对照翻译
The Llama 3 Herd of Models 模型群 Llama 3 Llama Team, Al Meta 1 {}^{1} 1 Llama 团队,Meta Al 1 {}^{1} 1 1 {}^{1} 1 A detailed contributor list can be found in the appendix of this paper. 1 {}^{1} 1 详细的贡献者名单可在本文附录中找到。 Mod…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...

什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...