PHP 经纬度坐标相关计算方法

news2024/9/22 21:23:17

  • 1. 前言

  • 2. 计算经纬度坐标间的距离

  • 3. 根据经纬度坐标距离排序

  • 4. 经纬度范围查询

1. 前言


想要测试本文提供的几个功能函数,可以使用下面这个数据表结构及其数据

CREATE TABLE `user` (  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户id',  `name` varchar(60) DEFAULT NULL COMMENT '昵称',  `longitude` varchar(64) DEFAULT NULL COMMENT '经度',  `latitude` varchar(64) DEFAULT NULL COMMENT '纬度',  `remark` varchar(50) DEFAULT NULL COMMENT '备注',  `distance` varchar(20) DEFAULT NULL COMMENT '距离',  PRIMARY KEY (`id`)) ENGINE=InnoDB COMMENT='用户表';INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('中海九号公馆', '113.899529', '22.60063', '深圳市宝安区中海九号公馆', '3.66km');INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('平峦山公园', '113.876462', '22.608322', '深圳市宝安区平峦山公园', '2.88km');INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('铁仔山公园', '113.86359', '22.592355', '深圳市宝安区铁仔山公园', '1.16km');INSERT INTO `user` (`name`, `longitude`, `latitude`, `remark`, `distance`) VALUES ('宝安公园', '113.902671', '22.58621', '深圳市宝安区宝安公园', '3.45km');

本文内容测试各个功能函数时,使用的当前位置坐标均为:

// 深圳市宝安区西乡街道九方广场$longitude = '113.869205';//经度$latitude  = '22.583286';//纬度

2. 计算经纬度坐标间的距离


计算经纬度坐标间的距离 功能函数 (前四个参数为两组经纬度坐标)

/** * 计算经纬度坐标间的距离 * @param $lng1 经度 * @param $lat1 纬度 * @param $lng2 经度 * @param $lat2 纬度 * @param $lang 语言 */function get_distance($lng1, $lat1, $lng2, $lat2, $lang = 'en'){    // 地球的近似半径(单位:米)    $earthRadius = 6367000;    // 将这些度数转换为弧度以使用公式    $lat1 = ($lat1 * pi()) / 180;    $lng1 = ($lng1 * pi()) / 180;    $lat2 = ($lat2 * pi()) / 180;    $lng2 = ($lng2 * pi()) / 180;    // 使用 Haversine 公示计算距离    // http://en.wikipedia.org/wiki/Haversine_formula    $calcLongitude = $lng2 - $lng1;    $calcLatitude  = $lat2 - $lat1;    $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);    $stepTwo = 2 * asin(min(1, sqrt($stepOne)));    // 两个经纬度坐标的距离(单位: 米)    $calculatedDistance = round($earthRadius * $stepTwo);    // 距离单位    $language = [        'en' => ['m' => 'm', 'km' => 'km'],        'cn' => ['m' => '米', 'km' => '公里'],    ];    if (!isset($language[$lang])) throw new \Exception('不支持的语言:' . $lang);    foreach ($language[$lang] as $key => $value) $$key = $value;    // 两个坐标间的距离,单位:米    $distance = round($calculatedDistance);    // 距离单位转换:超出 1000m 时单位转为km    if ($distance < 1000) {        $distance .= $m;    } else {        $distance = floatval(number_format($distance / 1000, 2)) . $km;    }    return $distance; // 返回单位转换后的距离}

使用示例:

我在 九方广场,手机上的高德地图导航至 中海九号公馆 显示的距离为 3.6公里,计算结果还是很准确的

// 深圳市宝安区西乡街道九方广场: 113.869205, 22.583286// 深圳市宝安区西乡街道中海九号公馆: 113.899529, 22.60063$distance = get_distance(113.869205, 22.583286, 113.899529, 22.60063);echo $distance; //3.66km

3. 根据经纬度坐标距离排序


项目中经常有距离显示数据的场景,根据距离排序,越近越靠前显示;比如: 店铺地址、房源信息等。代码示例:

// 当前坐标$longitude = '113.869205';$latitude  = '22.583286';// 数据库中经纬度字段分别为:longitude、latitude$field = '*,( 2 * 6378.137 * ASIN( SQRT( POW( SIN( PI() * (' . $longitude . ' - longitude) / 360 ), 2 ) + COS(PI() * ' . $latitude . ' / 180) * COS(latitude * PI() / 180) * POW( SIN( PI() * (' . $latitude . ' - latitude) / 360 ), 2 ) ) ) ) AS juli';// 根据距离升序查询(越近越靠前)$order = 'juli asc,id desc';// 查询数据Db::name('user')->field($field)->order($order)->select();

4. 经纬度范围查询


经纬度范围计算 功能函数

/** * 经纬度范围计算 * @param $longitude 经度 * @param $latitude  纬度 * @param $radius    半径(米) * @return array */function get_around($longitude, $latitude,  $radius){    $PI = 3.14159265;    $degree = (24901 * 1609) / 360.0;    $dpmLat = 1 / $degree;    $radiusLat = $dpmLat * $radius;    $minLat = $latitude - $radiusLat;    $maxLat = $latitude + $radiusLat;    $mpdLng = $degree * cos($latitude * ($PI / 180));    $dpmLng = 1 / $mpdLng;    $radiusLng = $dpmLng * $radius;    $minLng = $longitude - $radiusLng;    $maxLng = $longitude + $radiusLng;    return compact('minLat', 'maxLat', 'minLng', 'maxLng');}

使用示例

查询 3 公里内的数据。首先,根据当前位置获取 3 公里内的经纬度范围,然后带上查询条件查询数据库即可

$longitude = 113.869205; //经度$latitude  = 22.583286; //纬度$radius    = 3000; //单位:米// 经纬度范围$around = get_around($longitude, $latitude, $radius);// 构造查询条件// 数据库经纬度字段分别为:longitude,latitude$where = [    ['longitude', '>=', $around['minLng']],    ['longitude', '<=', $around['maxLng']],    ['latitude', '>=', $around['minLat']],    ['latitude', '<=', $around['maxLat']],];// 按照经纬度范围查询数据// 建议使用 where 的闭包查询(TP6.0)// 因为闭包可以生成以下SQL,标明这几个查询条件是一个整体,便于后期维护// SQL语句示例: SELECT * FROM `user` WHERE ( 经纬度查询条件 ) and 其他条件$data = Db::name('user')    ->where(function ($query) use ($where) {        $query->where($where);    })    ->select();

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/59780.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

html静态网站基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

UDS(83服务-AccessTimingParameter)

诊断协议那些事儿 诊断协议那些事儿专栏系列文章,本文介绍诊断和通讯管理功能单元下的83服务AccessTimingParameter,该服务的目的是读取/修改有效通信的计时参数。 文章目录 诊断协议那些事儿一、83服务-AccessTimingParameter二、请求格式子功能参数定义-timingParameterA…

Java并发编程—死锁

文章目录死锁什么叫做加锁&#xff1f;死锁代码理解&#xff1a;如何避免死锁&#xff1f;资源限制的挑战什么是资源限制&#xff1f;资源限制引发的问题&#xff1f;如何解决资源限制的问题&#xff1f;在资源限制情况下进行并发编程————————————————————…

物联网 (IoT) 为何如此重要?哪些技术让物联网成为了可能?

随着社会的进步和科技的发展&#xff0c;定位技术在技术手段、定位精度、可用性等方面均取得质的飞越&#xff0c;并且逐步从航海、航天、航空、测绘、军事、自然灾害预防等“高大上”的领域逐步渗透社会生活的方方面面&#xff0c;成为人们日常中不可或缺的重要应用——比如人…

[附源码]计算机毕业设计基于SpringBoot的剧本杀管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

用Python画出圣诞树,瞧瞧我这简易版的吧

前言 嗨嗨&#xff0c;大家好&#xff0c;我是小圆 今天来实现一下 用python画出圣诞树 代码 模块 源码.点击领取即可 import turtle as t from turtle import * import random as r import time圣诞树细节以及画布大小 画布大小&#xff0c;背景颜色都可以改&#xff0c;…

数据结构——链表

目录 一、链表概述 二、模拟实现链表 1、结点 2、遍历链表 3、获取链表的长度 4、添加元素 &#xff08;1&#xff09;、头插法 &#xff08;2&#xff09;、尾插法 &#xff08;3&#xff09;、在指定位置插入元素 5、删除元素 &#xff08;1&#xff09;、删…

Springboot整合mybatis多数据源

Mybatis中如何配置多数据源 一 什么情况下会用到多数据库&#xff1f; 场景1&#xff1a; 一个商城网站&#xff0c;一个游戏网站&#xff0c;商城网站已经做好&#xff0c;游戏网站正在开发&#xff0c;游戏网站上的很多道具需要用到商城网站的产品数据&#xff0c;这种情况…

[附源码]Python计算机毕业设计Django基于JEE平台springboot技术的订餐系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

wy的leetcode刷题记录_Day57

wy的leetcode刷题记录_Day57 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-12-1 前言 leetcode 每日一题二叉树 1779. 找到最近的有相同 X 或 Y 坐标的点 701. 二叉搜索树中的插入操作 目录wy的leetcode刷题记录_Day57声明前言1…

多目标Jaya优化算法(Matlab代码实现)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭:行百里者,半于九十。 📋📋📋本文目录如下:🎁🎁🎁 💥1 概述 多目标 Jaya 算…

CG-FX 风向传感器 聚碳 浅谈工作原理

产品概述 本产品外型小巧轻便&#xff0c;美观坚固&#xff0c;便于携带和组装&#xff0c;风向标形状设计合理&#xff0c;对自然界大气风向具有准确的定位作用。采用聚碳材质&#xff0c;具有防雨、防腐蚀、坚固实用等优点。 功能特点 ◆体积小&#xff0c;重量轻&#xf…

[附源码]Python计算机毕业设计Django绿色生鲜

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[附源码]JAVA毕业设计酒店管理系统(系统+LW)

[附源码]JAVA毕业设计酒店管理系统&#xff08;系统LW&#xff09; 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

anaconda使用系列教程--3)conda命令详解

管理conda 在任何时候你可以通过在命令后边跟上-help来获得该命令的完整文档。例如&#xff0c;你可以通过如下的命令来学习conda的update命令conda update --help Conda会返回你安装Anaconda软件的版本conda --version 升级当前版本conda update conda 查看当前conda信息cond…

[附源码]计算机毕业设计打印助手平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计基于springboot的旅游景点管理系统的设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

JSP+MySQL基于ssm的主题酒店管理系统

以往的主题酒店管理事务处理主要使用的是传统的人工管理方式,这种管理方式存在着管理效率低、操作流程繁琐、保密性差等缺点,长期的人工管理模式会产生大量的文本餐饮预订与文本数据,这对事务的查询、更新以及维护带来不少困难。随着互联网时代的到来,现如今网络的覆盖率已近非…

【WebRTC】QoS 拥塞控制 GCC 理论 Sender Side BWE 或 REMB

介绍 Sender Side Bandwidth Estimation 发送方带宽预估。Sender Side BWE 是新方案&#xff0c;利用的是 RTCP 中的 TransportCC 协议。 Receiver Estimated Maximum Bitrate 接收端预估最大码率。REMB 是旧方案&#xff0c;利用的是 RTCP 中的 REMB 协议。 背景 WebRTC 中…

C++自动定义的成员函数

C自动提供了下面这些成员函数&#xff1a; 默认构造函数&#xff0c;如果没有定义构造函数默认析构函数&#xff0c;如果没有定义复制构造函数&#xff0c;如果没有定义赋值运算符&#xff0c;如果没有定义地址运算符&#xff0c;如果没有定义 另有移动构造函数和移动赋值运算…