全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

1. Haversine 公式原理

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

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

其中:

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

2. PHP 实现 Haversine 距离计算

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

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

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

// Haversine 公式
$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;

}

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];

$distance_km = calculateDistance( $beijing['lat'], $beijing['lng'], $shanghai['lat'], $shanghai['lng'], 'km' );

echo "距离: " . round($distance_km, 2) . " 公里"; // 输出:距离: 1068.35 公里

4. 单位转换说明

函数支持多种单位输出:

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

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

5. 注意事项与优化建议

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

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

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


# mysql  # php  # redis  # ai  # sql注入  # 上海  # 地理位置  # cos  # php 函数  # 三角函数  # red  # sql  # 封装  # 算法  # 性能优化  # 地球  # 两点  # 适用于  # 之差  # 的人  # 是一个  # 你要  # 几点  # 再用  # 等功能 


相关文章: 美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  网站制作的软件有哪些,制作微信公众号除了秀米还有哪些比较好用的平台?  宝塔建站教程:一键部署配置流程与SEO优化实战指南  如何有效防御Web建站篡改攻击?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  合肥制作网站的公司有哪些,合肥聚美网络科技有限公司介绍?  如何用5美元大硬盘VPS安全高效搭建个人网站?  如何用VPS主机快速搭建个人网站?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何快速登录WAP自助建站平台?  c++怎么用jemalloc c++替换默认内存分配器【性能】  如何快速选择适合个人网站的云服务器配置?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  北京的网站制作公司有哪些,哪个视频网站最好?  Swift开发中switch语句值绑定模式  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  小捣蛋自助建站系统:数据分析与安全设置双核驱动网站优化  道歉网站制作流程,世纪佳缘致歉小吴事件,相亲网站身份信息伪造该如何稽查?  建站主机如何安装配置?新手必看操作指南  如何安全更换建站之星模板并保留数据?  建站之星与建站宝盒如何选择最佳方案?  建站之星安装后界面空白如何解决?  如何快速搭建支持数据库操作的智能建站平台?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何挑选优质建站一级代理提升网站排名?  如何在建站之星绑定自定义域名?  建站10G流量真的够用吗?如何应对访问高峰?  Python路径拼接规范_跨平台处理说明【指导】  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  建站VPS选购需注意哪些关键参数?  佛山网站制作系统,佛山企业变更地址网上办理步骤?  如何快速搭建高效可靠的建站解决方案?  建站之星安装失败:服务器环境不兼容?  建站主机SSH密钥生成步骤及常见问题解答?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  如何用好域名打造高点击率的自主建站?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何快速搭建高效简练网站?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  贸易公司网站制作流程,出口贸易网站设计怎么做?  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  C++时间戳转换成日期时间的步骤和示例代码  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何续费美橙建站之星域名及服务?  在线教育网站制作平台,山西立德教育官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。