mysql和java获取经纬度的距离的两种方式

news/2025/10/30 18:10:01/文章来源:https://www.cnblogs.com/oktokeep/p/19177852

mysql和java获取经纬度的距离的两种方式

mysql和java获取经纬度的距离的两种方式

T713802819052   取车距离:40333   还车距离:15303      根据订单号vlookup关联一下,单位是 米

1.java与mysql的计算公式是一一对应的:

Haversine公式 标准公式:这是传统计算方法,兼容所有MySQL版本

SELECT ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN((目标纬度 * PI()/180 - latitude * PI()/180)/2), 2) +COS(目标纬度 * PI()/180) * COS(latitude * PI()/180) *POW(SIN((目标经度 * PI()/180 - longitude * PI()/180)/2), 2))) * 1000) AS distance

DEMO

SELECT ROUND(6378.137 * 2 * ASIN(SQRT(POW(SIN((39.852546 * PI()/180 - 39.755703 * PI()/180)/2), 2) +COS(39.852546 * PI()/180) * COS(39.755703 * PI()/180) *POW(SIN((116.45462 * PI()/180 - 116.142223 * PI()/180)/2), 2)))) AS distance
计算结果:29

JAVA实现代码:

package com.example.core.mydemo.calc2;import java.math.BigDecimal;public class TestDistance {public static void main(String[] args) {String ss = String.valueOf(Math.round(calcDistance(116.142223,39.755703,116.45462,39.852546)));System.out.println(ss);}//计算方法/*** carLon            longitude    116.142223* carLat            latitude    39.755703* origionCarLon        目标经度    116.45462* originCarLat      目标纬度    39.852546**/public static double calcDistance(double carLon,double carLat,double origionCarLon,double originCarLat){return new BigDecimal(6378.137*2*Math.asin(Math.sqrt(Math.pow(Math.sin( (originCarLat*Math.PI/180-carLat*Math.PI/180)/2),2)+Math.cos(originCarLat*Math.PI/180)*Math.cos(carLat*Math.PI/180)*Math.pow(Math.sin( (origionCarLon*Math.PI/180-carLon*Math.PI/180)/2),2)))).doubleValue();}}
计算结果:29

2.扩展其他的mysql函数
使用ST_DISTANCE_SPHERE函数 这是最推荐的方法,适用于MySQL 5.7及以上版本,直接返回以米为单位的距离

SELECT ST_DISTANCE_SPHERE(POINT(目标经度, 目标纬度),POINT(longitude, latitude)) AS distance 

DEMO

       SELECT ST_DISTANCE_SPHERE(POINT(116.45462, 39.852546),POINT(116.142223, 39.755703)) AS distance 计算结果:28776.896048499308

使用ST_DISTANCE函数 适用于MySQL 5.6及以上版本,返回单位是度,需要转换为米

SELECT ST_DISTANCE(POINT(目标经度, 目标纬度),POINT(longitude, latitude)) AS distance 

DEMO

SELECT ST_DISTANCE(POINT(116.45462, 39.852546),POINT(116.142223, 39.755703)) AS distance 计算结果:0.3270633765159325

度转米的基本公式‌:距离(米) = 度 × 111195
其中111195是地球平均半径6371000米乘以π再除以180得出的换算系数

DEMO

SELECT ST_DISTANCE(POINT(116.45462, 39.852546),POINT(116.142223, 39.755703)) * 111195 AS distance 计算结果:36367.81215168911       误差比较大

3.方法选择建议‌:
优先使用ST_DISTANCE_SPHERE函数,它计算最准确且性能最佳。对于旧版本MySQL,可选择Haversine公式或创建自定义函数来实现距离计算
精度差异‌:ST_DISTANCE_SPHERE采用球面计算,比平面转换更准确
对于新项目,强烈建议使用MySQL 5.7+的ST_DISTANCE_SPHERE函数,可避免单位转换带来的误差和复杂性

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/951057.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQL索引及调优

SQL索引及调优一:索引的含义及用法 ● 索引index:一种特殊的查找结构,它存储了表中特定列的值,并对这些值进行排序,同时保存了指向原表行数据的物理地址指针。 ● 先查索引,通过索引查表,提高查询效率。 ● 优点…

Sequence2Sequence - -一叶知秋

Sequence2SequenceSequence-to-Sequence(简称 Seq2Seq) 是一种用于序列到序列(Sequence → Sequence)映射任务的深度学习模型结构。 它最早由 Google 在 2014 年提出,用于 机器翻译(Machine Translation),后来…

Python列表 _ 创一个购物清单

Python列表 _ 创一个购物清单shopping_list = []shopping_list.append("键盘")shopping_list.append("键帽")print(shopping_list)print(shopping_list[0])print(len(shopping_list))price = [1,2…

如何在Golang项目中集成Prometheus进行监控?

本文将带大家学习如何在 Golang 项目中集成 Prometheus 进行监控,包括安装客户端库、定义和注册指标、暴露指标端点、更新指标值、配置标签和注册表,以及生产环境的建议配置。 添加 Prometheus 客户端库依赖 在 Go 项…

第177天:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound

工具信息收集 内网中 个人用机的角色 账号密码存储 1,浏览器自动存储 2,自己创建文件记录 3,某些工具自动存储 今天的这些工具就是可以对以上这些进行信息进行提取,如果是web服务器或者数据库服务器,用这些工具收…

如何在Linux中,为Flatpak版本的Edge浏览器导入证书

当使用 Flatpak 版本的 Edge 浏览器时,可能会遇到缺少证书管理功能的问题。本文提供了两种解决方案:1)通过 edge://certificate-manager/localcerts 内部链接图形化导入证书;2)将证书文件复制到系统信任目录 /etc…

2025年防火HPL板厂家权威推荐榜单:耐刮防火板/耐高温防火板 /阻燃高压装饰板源头厂家精选

在建筑装饰与工业应用领域,防火HPL板(热固性树脂浸渍纸高压层积板)作为关键的表面装饰耐火材料,其性能直接关系到工程安全与使用寿命。据行业数据显示,2025年全球防火板市场规模预计将以9.74%的年复合增长率持续扩…

Java 集合 “Map(1)”面试清单(含超通俗生活案例与深度理解) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年铸铁井盖生产厂家最新推荐榜,技术实力与市场口碑深度解析防沉降球墨/防沉降/电力/双层铸铁井盖公司推荐

引言 在城市基础设施建设持续推进的背景下,铸铁井盖的质量与性能对市政安全、道路通行效率至关重要。为助力采购方精准筛选优质供应商,中国市政工程协会联合建筑材料测试中心于 2024 年第四季度开展了铸铁井盖行业专…

smss!SmpStartCsr函数分析之SmpLoadSubSystemsForMuSession3389远程桌面新进程csrss.exe的由来 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

220kv数字化变电站保护解决方案综述[期刊理解]

220kv数字化变电站保护解决方案综述[期刊理解] 本文围绕双母接线型 220kV 数字化变电站,系统阐述了继电保护的实施方案、配置逻辑、故障处理机制及配合关系,核心重点可从以下五大维度梳理:重点内容:核心背景与数字…

2025年10月VI设计公司权威推荐排行榜:排名依据包括项目交付质量、客户满意度、创新能力和市场影响力

摘要 VI设计行业近年来随着品牌竞争加剧而快速发展,企业越来越重视视觉识别系统以提升市场竞争力。2025年,行业趋势聚焦于数字化整合和极简主义设计,帮助企业实现品牌焕新。本文基于权威数据和用户口碑,提供一份VI…

2025年0糖苏打水厂家权威推荐榜单:带帽苏打水/茉莉苏打水 /蜜桃苏打水源头厂家精选

随着健康饮食观念的普及,0糖苏打水市场呈现快速增长态势。行业数据显示,2025年中国无糖饮料市场规模预计突破800亿元,其中0糖苏打水品类年均增长率达25%以上。在这一市场背景下,生产企业的技术实力与品质管控能力成…

Bilidown Setup 1.2.7下载

软件已停更,目前能用,且用且珍惜 Bilidown Setup 1.2.7下载

rpm因依赖安装失败的一次检查记录

rpm安装rpm -i --test XaoS-3.0-1.i386.rpm 出现错误:error: failed dependencies:libslang.so.0 is needed by XaoS-3.0-1libpng.so.0 is needed by XaoS-3.0-1libaa.so.1 is needed by XaoS-3.0-但是,libslang.so.…

0296-Nand-机器语言

环境Time 2023-07-07前言 说明 参考:https://www.nand2tetris.org/ 目标 接上一节,通过模拟的 CPU 实现 mult 和 fill 程序。 mult // r2 = 0 @2 M=0// loop r1 > 0 (LOOP) @1 D=M @END D;JLE// r1 = r1 - 1 D=D-…

0295-Nand-时序逻辑

环境Time 2023-07-07前言 说明 参考:https://www.nand2tetris.org/ 参考:《编码:隐匿在计算机背后的语言》 目标 接上一节,实现 Bit、Register、RAM8、RAM64、RAM512、RAM4K、RAM16K、PC。 Bit /*** 1-bit registe…

[apt update docker 密钥问题]

问题输出 Get:26 http://mirrors.aliyun.com/ubuntu focal-backports/restricted amd64 DEP-11 Metadata [212 B] Get:27 http://mirrors.aliyun.com/ubuntu focal-backports/universe amd64 DEP-11 Metadata [30.5 kB…

0300-Nand-表示代码

环境Time 2023-07-09 Java 17前言 说明 参考:https://craftinginterpreters.com/contents.html https://github.com/GuoYaxiang/craftinginterpreters_zh https://space.bilibili.com/44550904目标 使用 Java 语言脚本…

Python逻辑运算 _ 今年过节能收礼吗

Python逻辑运算 _ 今年过节能收礼吗house_work_count = int(input("house_work_count:"))red_envelope_count = int(input("red_envelope_count:"))shopping_count = int(input("shopping_co…