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

PHP使用经纬度获取两个位置的距离以及范围查询

需求背景:能源运输物流系统中司机加油, 比如加油站列表显示自己与油站相隔距离;根据司机当前位置的经纬度从数据库中取出一定范围内的油站数据。

技术需求:A、提供两个经纬度计算出两个经纬度的距离;B、提供当前位置的经纬度从数据库中取出一定范围内的数据。

A实现方法

    /*** @param $start_lat* @param $start_end* @param $end_lat* @param $end_lng* @return float*/function get_distance_by_coords($start_lat, $start_end, $end_lat, $end_lng){// 将角度转为狐度 deg2rad() 函数将角度转换为弧度$rad_start_lat = deg2rad($start_lat);$rad_end_lat = deg2rad($end_lat);$rad_start_lng = deg2rad($start_end);$rad_end_lng = deg2rad($end_lng);$a_coords = $rad_start_lat - $rad_end_lat;$b_coords = $rad_start_lng - $rad_end_lng;$distance = 2 * asin(sqrt(pow(sin($a_coords / 2),2) + cos($rad_start_lat) * cos($rad_end_lat)* pow(sin($b_coords / 2),2))) * 6378.137 * 1000;return $distance;}//打印调试var_dump(get_distance_by_coords('23.11349200900413', '113.36568827514647',             '23.115386579166856', '113.3728980529785'));

打印结果:

float(767.69700011894)

 B实现方法

    /*** @param $lat* @param $lng* @param $distance* @return array[]*/function get_coord_by_lat_lng($lat, $lng, $distance = 2){// 定义地球的半径define('EARTH_RADIUS', 6371);$new_lng =  2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));$new_lng = rad2deg($new_lng);$new_lat = $distance / EARTH_RADIUS;$new_lat = rad2deg($new_lat);return ['left-top' => ['lat' => $lat + $new_lat,'lng' => $lng-$new_lng],'right-top' => ['lat' => $lat + $new_lat, 'lng' => $lng + $new_lng],'left-bottom' => ['lat' => $lat - $new_lat, 'lng' => $lng - $new_lng],'right-bottom' => ['lat' => $lat - $new_lat, 'lng' => $lng + $new_lng]];}//打印调试var_dump(get_coord_by_lat_lng('23.11349200900413', '113.36568827514647'));

打印结果:


{"left-top": {"lat": "23.131478441122503","lng": "113.34613204664485"},"right-top": {"lat": "23.131478441122503","lng": "113.38524450364808"},"left-bottom": {"lat": "23.095505576885756","lng": "113.34613204664485"},"right-bottom": {"lat": "23.095505576885756","lng": "113.38524450364808"}
}

然后根据这个坐标数据查询数据库取出该范围内的数据记录。

    /*** @param $coord* @return mixed*/public function coordinate_range($coord){return $this->where('lat', '>', $coord['right-bottom']['lat'])->where('lat', '<', $coord['left-top']['lat'])->where('lng', '>', $coord['left-top']['lng'])->where('lng', '<', $coord['right-bottom']['lng'])->paginate();}

http://www.dtcms.com/a/239938.html

相关文章:

  • 高斯列主元消去法——python实现
  • 九、MySQL执行原理
  • vue3 daterange正则踩坑
  • 大疆上云API demo前端代码理解
  • 词法分析器
  • 13.10 LangGraph多轮对话系统实战:Ollama私有部署+情感识别优化全解析
  • 基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究
  • 网站指纹识别
  • BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
  • 微波雷达水位在线监测装置:技术解析与应用价值
  • 淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
  • 通过ESP32开发板,实现NFC卡片控制继电器通断,从而实现多种物联网中设备的通电
  • 基于STM32物联网智能鱼缸智能家居系统
  • Java线上CPU飙高问题排查全指南
  • 如何在服务器上部署 Python Django 应用
  • 接地气的方式认识JVM(二)
  • Linux边缘智能:物联网的终极进化
  • 【最新案例】智能物料称重柜/生鲜称重售卖柜系统, 共享自助管理系统, 物联网应用定制开发
  • 职坐标物联网全栈开发全流程解析
  • VR 技术赋能南锣鼓巷的多元发展潜力与前景​
  • Python ROS2【机器人中间件框架】 简介
  • 【HTML-16】深入理解HTML中的块元素与行内元素
  • 基于江科大stm32屏幕驱动,实现OLED多级菜单(动画效果),结构体链表实现(独创源码)
  • 基于 Spring Boot 策略模式的短信服务提供商动态切换实现
  • delphi安装SAP控件:SAPFunctionsSAPLogonControl
  • Fail2ban开源入侵检测,保护SSH,NGINX等
  • 基于Python的气象数据分析及可视化研究
  • Java性能测试工具列举
  • 【PostgreSQL系列】PostgreSQL连接参数
  • 雷达RCS计算中的旋转矩阵