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…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...