新闻中心
php如何实现地理位置距离计算_php经纬度h*ersine公式与单位转换
使用H*ersine公式可计算两点间球面距离,PHP通过经纬度转弧度、应用公式并结合地球半径实现,支持km/m/mi/nm单位输出,适用于附近的人等场景,需注意输入验证与性能优化。

在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妙多是一款AI驱动的界面设计工具,定位为“AI时代设计工具”
334
查看详情
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小游戏免费秒玩入口


2025-11-27
浏览次数:次
返回列表
1.4737];
<p>$distance_km = calculateDistance(
$beijing['lat'], $beijing['lng'],
$shanghai['lat'], $shanghai['lng'],
'km'
);</p><p>echo "距离: " . round($distance_km, 2) . " 公里";
// 输出:距离: 1068.35 公里</p>