当前位置: 首页 > news >正文

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

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.jsqmd.com/news/26803/

相关文章:

  • Sequence2Sequence - -一叶知秋
  • SQL索引及调优
  • Python列表 _ 创一个购物清单
  • 如何在Golang项目中集成Prometheus进行监控?
  • 第177天:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound
  • 如何在Linux中,为Flatpak版本的Edge浏览器导入证书
  • 2025年防火HPL板厂家权威推荐榜单:耐刮防火板/耐高温防火板 /阻燃高压装饰板源头厂家精选
  • Java 集合 “Map(1)”面试清单(含超通俗生活案例与深度理解) - 教程
  • 2025 年铸铁井盖生产厂家最新推荐榜,技术实力与市场口碑深度解析防沉降球墨/防沉降/电力/双层铸铁井盖公司推荐
  • 220kv数字化变电站保护解决方案综述[期刊理解]
  • 2025年10月VI设计公司权威推荐排行榜:排名依据包括项目交付质量、客户满意度、创新能力和市场影响力
  • 2025年0糖苏打水厂家权威推荐榜单:带帽苏打水/茉莉苏打水 /蜜桃苏打水源头厂家精选
  • Bilidown Setup 1.2.7下载
  • rpm因依赖安装失败的一次检查记录
  • 0296-Nand-机器语言
  • 0295-Nand-时序逻辑
  • [apt update docker 密钥问题]
  • 0300-Nand-表示代码
  • Python逻辑运算 _ 今年过节能收礼吗
  • ENGG5301 Information Theory 2025 Midterm Exam P3:Causal Encoding
  • 0291-Nand-实现基础逻辑门(一)
  • NASM下载和安装教程(附安装包)
  • 0292-Nand-实现基础逻辑门(二)
  • 单点登录SSO是怎么实现的?
  • 赋能智慧货运:视频汇聚平台EasyCVR打造货运汽车安全互联网视频监控与管理方案
  • 2025年上海房产继承律师权威推荐榜单:继承律师/离婚律师/婚姻律师事务所精选
  • 【SPIE出版、往届已EI检索】第二届遥感技术与图像处理国际学术会议(RSTIP 2025)
  • autotiny下载_v3.0.0.2
  • 2025 年井盖篦子最新推荐榜,技术实力与市场口碑深度解析铸铁套/树围/球墨铸铁单/溢流井/雨水井盖篦子公司推荐
  • Python嵌套_多条件判断 _ 对象今天会生气吗 II