首頁 後端開發 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,經度;

@_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中d​​eclare如何使用 Oracle中d​​eclare如何使用 Sep 19, 2023 am 09:44 AM

DECLARE語句是Oracle中用來宣告變數、常數和遊標的關鍵字。提供了一種方便的方式來定義和初始化在PL/SQL區塊中使用的資料物件。透過使用DECLARE語句,可以使PL/SQL程式碼更加模組化和可讀性更強 。

凱迪拉克 Escalade IQ 續航里程高達 460 英里,售價高達 17 萬美元 凱迪拉克 Escalade IQ 續航里程高達 460 英里,售價高達 17 萬美元 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