新闻中心

php如何实现地理位置距离计算_php经纬度h*ersine公式与单位转换

2025-11-27
浏览次数:
返回列表
使用H*ersine公式可计算两点间球面距离,PHP通过经纬度转弧度、应用公式并结合地球半径实现,支持km/m/mi/nm单位输出,适用于附近的人等场景,需注意输入验证与性能优化。

php如何实现地理位置距离计算_php经纬度haversine公式与单位转换

在PHP中计算两个地理位置之间的距离,常用的方法是使用H*ersine公式。该公式基于地球的球面模型,通过两点的经纬度来计算它们之间的最短球面距离,适用于大多数地理距离计算场景,比如“附近的人”、“门店距离”等功能。

1. H*ersine 公式原理

H*ersine 公式用于计算地球上两点间的弧长,考虑了地球曲率。其数学表达如下:

a = sin²(Δφ/2) + cos φ₁ ⋅ cos φ₂ ⋅ sin²(Δλ/2)
c = 2 ⋅ atan2(√a, √(1−a))
d = R ⋅ c

其中:

  • φ₁, φ₂:两点的纬度(以弧度为单位)
  • Δφ:纬度之差
  • Δλ:经度之差
  • R:地球半径,平均约为 6371 公里

2. PHP 实现 H*ersine 距离计算

以下是一个封装好的 PHP 函数,用于计算两个经纬度坐标之间的距离:

function calculateDistance($lat1, $lon1, $lat2, $lon2, $unit = 'km') {
    $earthRadius = [
        'km' => 6371,
        'm'  => 6371000,
        'mi' => 3959, // 英里
        'nm' => 3440  // 海里
    ];
<pre class='brush:php;toolbar:false;'>// 转换为弧度
$lat1 = deg2rad($lat1);
$lon1 = deg2rad($lon1);
$lat2 = deg2rad($lat2);
$lon2 = deg2rad($lon2);

// 纬度和经度差
$deltaLat = $lat2 - $lat1;
$deltaLon = $lon2 - $lon1;

// H*ersine 公式
$a = sin($deltaLat / 2) * sin($deltaLat / 2) +
     cos($lat1) * cos($lat2) *
     sin($deltaLon / 2) * sin($deltaLon / 2);
$c = 2 * atan2(sqrt($a), sqrt(1 - $a));
$distance = $earthRadius[$unit] * $c;

return $distance;

}

Motiff妙多 Motiff妙多

Motiff妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”

Motiff妙多 334 查看详情 Motiff妙多

3. 使用示例

假设你要计算北京(39.9042° N, 116.4074° E)到上海(31.2304° N, 121.4737° E)的距离:

$beijing = ['lat' => 39.9042, 'lng' => 116.4074];
$shanghai = ['lat' => 31.2304, 'lng' => 121.4737];
<p>$distance_km = calculateDistance(
$beijing['lat'], $beijing['lng'],
$shanghai['lat'], $shanghai['lng'],
'km'
);</p><p>echo "距离: " . round($distance_km, 2) . " 公里";
// 输出:距离: 1068.35 公里</p>

4. 单位转换说明

函数支持多种单位输出:

  • km:公里(默认)
  • m:米(适合近距离,如百米内)
  • mi:英里(常用于美国系统)
  • nm:海里(航海或航空领域)

根据业务需求选择合适的单位传入即可。

5. 注意事项与优化建议

实际开发中还需注意以下几点:

  • 确保输入的经纬度是有效的浮点数,避免SQL注入或非法坐标
  • 若需批量计算“附近N公里内的用户”,建议先用MySQL的ST_Distance_Sphere等空间函数做初步筛选,再用PHP精算
  • 对性能要求高时可考虑使用Redis GEO 或 MySQL GIS 功能
  • 该公式假设地球为完美球体,精度足够日常使用,但高精度场景需用Vincenty等更复杂算法

基本上就这些。H*ersine 公式简单高效,配合 PHP 的三角函数支持,能快速实现地理距离计算功能。

以上就是php如何实现地理位置距离计算_php经纬度h*ersine公式与单位转换的详细内容,更多请关注其它相关文章!


# 适用于  # 海南seo培训怎么引流  # 南沙网站推广品牌  # 个人怎么优化网站关键词  # 怎么上推广热门的网站  # 温州整合营销推广是什么  # 珠海网站建设开发团队  # 吉安网络推广员招聘网站  # 宁波网站搭建团队推广  # 海宁怎么做网站优化  # b2b网站推广联系方式  # 正确处理  # 多条  # 表单  # 怎么做  # mysql  # 如何实现  # 两点  # 地球  # 转换为  # red  # 三角函数  # php 函数  # cos  # 地理位置  # 上海  # sql注入  # ai  # redis  # php 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 一加 14R 快充无反应_一加 14R 充电优化  J*aScript类型检查_j*ascript代码规范  韩小圈电脑版在线入口_网页版免费登录地址  C++如何操作大型数据集_使用C++流式处理(Streaming)技术避免一次性加载大文件  C#使用XPath查询节点时出错? 常见语法错误与调试技巧  俄罗斯浏览器官网直达链接 俄罗斯浏览器最新在线入口导航  动漫花园资源网使用步骤_动漫花园资源网下载流程  ArrayList与LinkedList操作复杂度详解:遍历与修改  照顾宝贝2小游戏点击立即在线玩  PS5 Pro有点优势但不多! 《燕云十六声》PS5平台与PC性能画面对比  Golang如何测试channel通信行为_Golang channel通信测试与分析方法  创客贴用户入口官网登录 创客贴网页版电脑版系统  Python类型检查:优化关联可选属性的Mypy推断策略  Go语言HTML解析:利用Goquery精准获取指定元素内容  J*a编写用户注册与登录功能_掌握字符串与验证逻辑  Excel文件在线转换快速入口 Excel在线格式转换网站  vivo浏览器怎么扫描二维码 vivo浏览器内置扫一扫功能使用方法  圆通快递查询实时追踪 圆通物流包裹状态快速查看  FullCalendar 自定义按钮样式定制指南  Mac怎么查看崩溃日志_Mac控制台错误报告分析  PHP中SSG-WSG API的AES加密实践:正确使用初始化向量  漫蛙2在线漫画入口 漫蛙正版漫画网页版直达  树莓派传感器触发:通过Twilio API发送WhatsApp消息教程  1688商家版怎样分析买家画像精准供货_1688商家版分析买家画像精准供货【供货策略】  LINQ to XML为何解析失败? 深入理解C# XDocument的异常处理  不同用户不同价格! 索尼开启账户个性化定价测试  优化LangChain文档加载与ChromaDB集成:解决多文档处理与分块问题  React Router v6 教程:构建认证保护的私有路由与重定向策略  蛙漫官方正版入口 蛙漫网页在线全集免费观看  taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】  如何在 Windows 11 中启动游戏手柄设置  Web Components中自定义开关组件状态同步的常见陷阱与解决方案  ArrayList与LinkedList核心操作的Big-O复杂度分析  Win11如何使用Windows Sandbox Win11沙盒功能开启与使用教程【详解】  Python Socket多播通信中指定源IP地址的实践指南  邮编格式怎么匹配地址_根据邮编格式快速匹配详细地址的技巧  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  邮政快递单号查询入口 邮政快递物流信息在线查询入口  神庙逃亡小游戏在线玩 神庙逃亡小游戏入口  2026春节假期票务安排_2026春节放假购票指南  J*aScript动态修改指定div内所有a标签样式指南  处理Kafka消费者会话超时:深入理解消息处理语义与幂等性  uc手机浏览器网页版入口 uc浏览器手机版便捷登录首页  解决Django多数据库/多Schema环境下外键迁移问题  微博网页版官方账号登录 微博网页版内容浏览使用指南  Composer如何处理Git子模块(submodule)依赖_Composer与Git Submodule的对比与选择  mysql如何设置表访问权限_mysql表访问权限配置  c++ 获取系统当前时间 c++时间戳获取方法  age动漫网站入口 age动漫官网直接访问入口  我的世界mc.js免费游戏直接能玩 我的世界mc.js小游戏免费秒玩入口 

搜索