Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >PHP 经纬度坐标相关计算方法

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

作者头像
很酷的站长
发布于 2022-12-04 07:36:40
发布于 2022-12-04 07:36:40
74000
代码可运行
举报
运行总次数:0
代码可运行
  • 1. 前言
  • 2. 计算经纬度坐标间的距离
  • 3. 根据经纬度坐标距离排序
  • 4. 经纬度范围查询
1. 前言

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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');

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 深圳市宝安区西乡街道九方广场$longitude = '113.869205';//经度$latitude  = '22.583286';//纬度
2. 计算经纬度坐标间的距离

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** * 计算经纬度坐标间的距离 * @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公里,计算结果还是很准确的

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 深圳市宝安区西乡街道九方广场: 113.869205, 22.583286// 深圳市宝安区西乡街道中海九号公馆: 113.899529, 22.60063$distance = get_distance(113.869205, 22.583286, 113.899529, 22.60063);echo $distance; //3.66km
3. 根据经纬度坐标距离排序

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 当前坐标$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. 经纬度范围查

经纬度范围计算 功能函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/** * 经纬度范围计算 * @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 公里内的经纬度范围,然后带上查询条件查询数据库即可

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$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();

本文来自:编程笔记 源码下载

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
PHP 通过经纬度计算距离
封装的方法: 传递参数: 地址1的纬度:lat1  ,经度:lng1, 地址2的纬度   lat2  ,经度:lng2, /** * 计算两个经纬度距离 */ public function get_distance($lat1, $lng1, $lat2, $lng2){ $earthRadius = 6367000; //approximate radius of earth in meters $lat1 = ($lat1 * pi
超级小可爱
2023/02/20
1.4K0
java 根据两个位置的经纬度,来计算两地的距离 经纬度处理
package com.fh.util; import java.util.HashMap; import java.util.Map; /** * 说明:经纬度处理 * 作者:FH Admin * from:fhadmin.cn */ public class MapDistance { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) {
FHAdmin
2021/09/26
9570
PHP根据经纬度获取周围5公里内的信息
处理上也不是很棘手,针对需求.大致解决办法为.获取现在楼盘坐标.然后获取目标楼盘经纬度,查询距离.如果距离小于前端传来的距离则为在范围.反之不在.
桑先生
2019/12/17
1.5K0
地址转换为经纬度,经纬度距离计算
根据已知地址,将地址经纬度计算出来,不多说直接上代码 import org.apache.commons.lang.StringUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URL; import java.net.URLEncoder; import java.util.HashMap; import java.util
一觉睡到小时候
2019/07/02
2.3K0
php mysql 经纬度_mysql,php和js根据经纬度计算距离
a=Lat1 – Lat2 为两点纬度之差 b=Lung1 -Lung2 为两点经度之差;
全栈程序员站长
2022/11/09
5.8K0
php mysql 经纬度_mysql,php和js根据经纬度计算距离
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
经度 Longitude , 本初子午线 位置 为 0 度经线 , 相当于水平 x 轴 的坐标 , 经度的取值范围 -180 度 ~ +180 度 ;
韩曙亮
2023/10/11
7.1K0
【GIS - 地理信息系统】经纬度计算 ( 经度、纬度概念 | 地球周长计算 | 地球经线周长计算 | 经纬度相关计算 | 经纬度坐标距离计算公式 | 经纬度与实际距离换算 | 相关代码实现 )
PHP之根据经纬度和半径计算范围和距离
根据经纬度和半径计算经纬度范围: /** * 根据经纬度和半径计算出范围 * @param string $lat 纬度 * @param String $lng 经度 * @param float $radius 半径 单位:m * @return Array 范围数组 */ if (!function_exists('calc_scope')){ function calc_scope($lat, $lng, $radius) { $degree = (2490
Petrochor
2022/06/07
9251
Python实践 | 亿级经纬度距离计算代码实现
计算经纬度的代码网上一搜一大把,通常是单点距离的计算,无法实现批量计算,本文将利用pandas实现亿级经纬度距离代码的实现。 最短距离计算建议参考下文,mapinfo能够很好的实现。 MAPINFO 最小站间距统计
披头
2019/12/26
4.4K0
Java 两个经纬度获取方位
今天有一个需求,需要计算两个经纬度的方位,记录一下 package com.wm.fire.backend.tools; /** * @program fire-backend * @description: * @author: Destiny * @create: 2020/08/07 15:32 */ public class LatLngTool { public static double GetJiaoDu(double lat1, double lng1, double
赵哥窟
2020/08/11
1.1K0
Python 优雅地利用两点经纬度计算地理空间距离
处理地理数据时,经常需要用到两个地理位置间的距离。比如 A 点经纬度(30.553949,114.357399),B点经纬度(129.1344,25.5465),求 AB 两点之间的距离。
叶庭云
2021/12/07
12.5K0
Python 优雅地利用两点经纬度计算地理空间距离
原 PHP下的经纬度求距离
/** *  @desc 根据两点间的经纬度计算距离 *  @param float $lat 纬度值 *  @param float $lng 经度值 */  function getDistance($lat1, $lng1, $lat2, $lng2)  {      $earthRadius = 6367000; //approximate radius of earth in meters        /*        Convert these degrees to radians     
霡霂
2018/06/04
8900
两个坐标之间对距离计算
由于项目的需要,所以学习了两个经纬度之间的距离(单位:米) package org.choviwu.movie.test; public class DistanceUtil { private static double EARTH_RADIUS = 6378.137; private static double rad(double d) { return d * Math.PI / 180.0; } /** * 通过经纬度获取距离(单位
简单的程序员
2020/04/18
1.6K0
如何计算经纬度之间的距离_根据经纬度算距离
function getdistance(lng1,lat1,lng2,lat2){
全栈程序员站长
2022/09/28
4.7K0
计算经纬度的距离_经纬度测距
public function GetDistance(lat1, lng1, lat2, lng2)
全栈程序员站长
2022/09/29
3.6K0
计算经纬度的距离_经纬度测距
php根据经纬度计算距离和方向
不过现在有了更多的可选项了,例如geohash,存储geo的服务,mogodb,等等
jerryteng
2018/09/14
2.2K0
php根据经纬度计算距离和方向
geohash实现附近的工作室,php函数实现-tp5
首先,geohash用一个字符串表示经度和纬度两个坐标。某些情况下无法在两列上同时应用索引 (例如MySQL 4之前的版本,Google App Engine的数据层等),利用geohash,只需在一列上应用索引即可。
超级小可爱
2023/02/20
5710
微信小程序----地理围栏实现员工防作弊地图打卡功能
小程序用户(公司员工)需要在小程序选择位置打卡并上传位置,为了保证员工是真实的去指定的地点开展了公司的业务而不是虚假打卡上传的位置,需要进行地理围栏限制,要求打卡上传的位置地点必须和员工的真实位置在一个可接受的距离范围内,防止员工作弊打卡
安德玛
2022/03/07
1.8K0
PHP经纬度距离计算「建议收藏」
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
8090
PHP计算两个经纬度地点之间的距离
function getdistance($lng1, $lat1, $lng2, $lat2) {
lin_zone
2018/08/15
1.3K0
基于GPS与经纬度距离计算
基于GPS与经纬度距离计算 # -*- coding:utf-8 -*- # /usr/bin/python import warnings warnings.filterwarnings("ignore") from math import radians, cos, sin, asin, sqrt # 方法1 def geodistance(lat1,lng1,lat2,lng2): ''''数学转换''' lng1, lat1, lng2, lat2 = map(radians,
AI拉呱
2021/04/23
9980
推荐阅读
相关推荐
PHP 通过经纬度计算距离
更多 >
LV.1
这个人很懒,什么都没有留下~
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验