Mysql預存程序-透過百度座標,查詢半徑內符合條件的使用者以及排序後的距離
之前做過一個類似的應用,今天翻出來看了看,覺得寫的不是很合理,於是重新考慮後寫了一個查詢的存儲過程。
表就不描述,
過程如下:
-- ---------------------------- -- 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; }
以上就介紹了Mysql預存程序-透過百度座標,查詢半徑內符合條件的使用者以及排序後的距離,包括了方面的內容,希望對PHP教學有興趣的朋友有所幫助。

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

oracle declare用法有變數宣告、常數宣告、遊標宣告和子程式宣告。詳細介紹:1、變數聲明,在PL/SQL區塊中,可以使用DECLARE語句聲明變數;2、常數是在PL/SQL區塊中聲明的不可更改的值;3、遊標聲明,用於在PL/SQL在區塊中處理查詢結果集;4、子程序聲明,子程序是在PL/SQL區塊中定義的可重複使用的程式碼區塊。

這篇文章將為大家詳細講解有關PHP返回數組所有值,組成一個數組,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章後可以有所收穫。使用array_values()函數array_values()函數傳回陣列中所有值的陣列。它不會保留原始數組的鍵。 $array=["foo"=>"bar","baz"=>"qux"];$values=array_values($array);//$values將是["bar","qux"]使用迴圈可以使用循環手動獲取數組的所有值並將其新增至一個新

前言在Java中,Range方法在IntStream和LongStream類別中都可用。在IntStream類別中,它有助於傳回函數參數範圍內IntStream的順序值。在這個方法中,startInclusive(inclusive)和endExclusive(exclusive)是與增量步長一起使用的兩個參數,如前所述,將包括起始值,並排除結束值。在LongStream的情況下,唯一的區別是增加了LongStream值。 Range語法讓我們來看看Java中range方法的語法。 IntStream範圍的

Go語言是一種簡潔而強大的程式語言,在許多方面都具有獨特的設計和特點。其中一個令人印象深刻的特性就是range關鍵字,它被用來迭代數組、切片、映射和通道等資料結構。 range的靈活性和便利性使得遍歷複雜資料結構變得簡單,但其運作方式卻有許多人感到困惑。本文將深入淺出地解釋range的工作原理,並透過具體程式碼範例來幫助讀者更好地理解。首先,讓我們來看一個簡單的例

在mysql使用過程中,日期一般都是以datetime、timestamp等格式進行儲存的,但有時會因為特殊的需求或歷史原因,日期的儲存格式是varchar,那麼我們該如何處理這個varchar格式的日期資料呢?使用函數:STR_TO_DATE(str,format)STR_TO_DATE(str,format)函數是DATE_FORMAT()函數的反函數。它需要一個字串str和一個格式字串格式。 STR_TO_DATE()傳回一個DATETIME值,如果格式字串包含日期和時間部分,或如果字

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

通用汽車對傳奇的 Escalade 的電動版本剛剛升級了配置器,激勵後價格從 13 萬美元到約 17 萬美元不等。這比幾乎任何其他豪華電動車、皮卡或 SUV 都要多,包括特斯拉的 C

mysql中char和varchar的差異有:1、CHAR是固定長度的,而VARCHAR是可變長度的;2、CHAR儲存和檢索效率高,而VARCHAR儲存和檢索效率不高;3、CHAR佔用儲存空間,而VARCHAR可以節省儲存空間。
