首页 后端开发 php教程 Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离

Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离

Aug 08, 2016 am 09:31 AM
declare range varchar

之前做过一个类似的应用,今天翻出来看了看,觉得写的不是很合理,于是重新考虑后写了一个查询的存储过程。

表就不描述,

过程如下:

-- ----------------------------
-- Procedure structure for DIS
-- ----------------------------
DROP PROCEDURE IF EXISTS `DIS`;
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `DIS`(IN `_lat` varchar(11),IN `_lng` varchar(11),IN `_ras` int,INOUT `_data` text)
BEGIN
	DECLARE _sql text ;
	DECLARE EARTH_RADIUS VARCHAR(10) ;
	DECLARE _range VARCHAR(16);
	DECLARE lngR VARCHAR(16);
	DECLARE maxLat VARCHAR(16);
	DECLARE minLat VARCHAR(16);
	DECLARE maxLng VARCHAR(16);
	DECLARE minLng VARCHAR(16);



	SET EARTH_RADIUS = 6378.137;
	SET _range = 180 / pi() * _ras / EARTH_RADIUS;
	SET lngR = _range / cos(_lat * pi() / 180);
	
	SET maxLat = _lat + _range;
	SET minLat = _lat - _range;
	SET maxLng = _lng + lngR ;
	SET minLng = _lng - lngR ;

	SET @_sql = CONCAT('SELECT 
				*, 
				ceil(
					2 * asin(
						sqrt(
							pow(sin((((',_lat,' * PI() / 180.0) - (',_lat,' * PI() / 180.0))) / 2),2) 
							+ cos(',_lat,' * PI() / 180.0) * cos(lat * PI() / 180.0) * pow(sin(((',_lng,' * PI() / 180.0) - (lng * PI() / 180.0)) / 2),2)
						)
					) * ',EARTH_RADIUS,' * 1000
				) AS di 
			FROM dis 
			WHERE lat BETWEEN ',minLat,' AND ',maxLat,' AND lng BETWEEN ',minLng,' AND ',maxLng,' 
			ORDER BY di
			LIMIT 0,10');
	
	PREPARE stmt FROM @_sql;
	EXECUTE stmt;

END
;;
DELIMITER ;
登录后复制

调用 :

CALL DIS(_lat,_lng,_ras,@_data);
登录后复制
参数说明:

_lat,经度;

_lng,纬度;

_ras,半径(单位为km);

@_data ,接受返回

返回值中di为距离已经排序,由近及远,单位为m。

如果不使用存储过程可以拆分成PHP程序:

define("EARTH_RADIUS",6378.137);
/**
 * 获取距离四个坐标
 * @param $lon
 * @param $lat
 * @param int $distance 默认1KM的距离
 * @return array
*/
function getCoor($lng,$lat,$distance = 1){
	$range = 180 / pi() * $distance / EARTH_RADIUS;
	$lngR = $range / cos($lat * pi() / 180);
	$data = array();
	$data["maxLat"] = $lat + $range;
	$data["minLat"] = $lat - $range;
	$data["maxLng"] = $lng + $lngR ;//最大经度
	$data["minLng"] = $lng - $lngR ;//最小经度
	return $data;
}
登录后复制

首先先获取一个正方型的坐标区域,然后通过上面 @_sql中sql拼接成一个sql语句,执行即可。

备注一下,这里得到的是一个正方型而非圆形半径的结果,可以再后期的时候做一个二次的筛除即可,例如array_filter(),这里就不再多描述了。

以上就介绍了Mysql存储过程——通过百度坐标,查询半径内符合条件的用户以及排序后的距离,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

oracle declare用法有哪些 oracle declare用法有哪些 Sep 15, 2023 pm 01:12 PM

oracle declare用法有变量声明、常量声明、游标声明和子程序声明。详细介绍:1、变量声明,在PL/SQL块中,可以使用DECLARE语句声明变量;2、常量是在PL/SQL块中声明的不可更改的值;3、游标声明,用于在PL/SQL块中处理查询结果集;4、子程序声明,子程序是在PL/SQL块中定义的可重用的代码块。

PHP返回数组所有值,组成一个数组 PHP返回数组所有值,组成一个数组 Mar 21, 2024 am 09:06 AM

这篇文章将为大家详细讲解有关PHP返回数组所有值,组成一个数组,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。使用array_values()函数array_values()函数返回一个数组中所有值的数组。它不会保留原始数组的键。$array=["foo"=>"bar","baz"=>"qux"];$values=array_values($array);//$values将是["bar","qux"]使用循环可以使用循环手动获取数组的所有值并将其添加到一个新

Java中Range函数怎么使用 Java中Range函数怎么使用 Apr 19, 2023 pm 11:49 PM

前言在Java中,Range方法在IntStream和LongStream类中都可用。在IntStream类中,它有助于返回函数参数范围内IntStream的顺序值。在该方法中,startInclusive(inclusive)和endExclusive(exclusive)是与增量步长一起使用的两个参数,如前所述,将包括起始值,并排除结束值。在LongStream的情况下,唯一的区别是添加了LongStream值。Range语法让我们看看Java中range方法的语法。IntStream范围的

深入浅出:透彻理解Go语言range的工作原理 深入浅出:透彻理解Go语言range的工作原理 Mar 12, 2024 pm 02:18 PM

Go语言是一种简洁而强大的编程语言,在许多方面都具有独特的设计和特点。其中一个让人印象深刻的特性就是range关键字,它被用于迭代数组、切片、映射和通道等数据结构。range的灵活性和便捷性使得遍历复杂数据结构变得简单,但其工作原理却有许多人感到困惑。本文将深入浅出地解释range的工作原理,并通过具体代码示例来帮助读者更好地理解。首先,让我们看一个简单的例

mysql中varchar类型如何实现日期进行比较、排序等操作 mysql中varchar类型如何实现日期进行比较、排序等操作 May 31, 2023 pm 01:49 PM

在mysql使用过程中,日期一般都是以datetime、timestamp等格式进行存储的,但有时会因为特殊的需求或历史原因,日期的存储格式是varchar,那么我们该如何处理这个varchar格式的日期数据呢?使用函数:STR_TO_DATE(str,format)STR_TO_DATE(str,format)函数是DATE_FORMAT()函数的反函数。它需要一个字符串str和一个格式字符串格式。STR_TO_DATE()返回一个DATETIME值,如果格式字符串包含日期和时间部分,或如果字

Oracle中declare如何使用 Oracle中declare如何使用 Sep 19, 2023 am 09:44 AM

DECLARE语句是Oracle中用于声明变量、常量和游标的关键字。提供了一种方便的方式来定义和初始化在PL/SQL块中使用的数据对象。通过使用DECLARE语句,可以使PL/SQL代码更加模块化和可读性更强 。

凯迪拉克 Escalade IQ 续航里程高达 460 英里,售价高达 170,000 美元 凯迪拉克 Escalade IQ 续航里程高达 460 英里,售价高达 170,000 美元 Sep 30, 2024 am 06:15 AM

通用汽车对传奇的 Escalade 的电动版本刚刚升级了配置器,激励后价格从 13 万美元到约 17 万美元不等。这比几乎任何其他豪华电动汽车、皮卡或 SUV 都要多,包括特斯拉的 C

mysql中char和varchar有什么区别 mysql中char和varchar有什么区别 Sep 04, 2023 pm 02:16 PM

mysql中char和varchar的区别有:1、CHAR是固定长度的,而VARCHAR是可变长度的;2、CHAR存储和检索效率高,而VARCHAR存储和检索效率不高;3、CHAR占用存储空间,而VARCHAR可以节省存储空间。

See all articles