Heim >Backend-Entwicklung >PHP-Tutorial >Gespeicherte MySQL-Prozedur – Abfrage der qualifizierten Benutzer innerhalb des Radius und der sortierten Entfernung über Baidu-Koordinaten
Ich habe mir heute schon einmal eine ähnliche Anwendung angesehen und fand sie nicht sehr sinnvoll, also habe ich es mir noch einmal überlegt und eine gespeicherte Abfrageprozedur geschrieben. Die
-Tabelle wird nicht beschrieben. Der
-Prozess ist wie folgt:
-- ---------------------------- -- 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 ;
Aufruf:
CALL DIS(_lat,_lng,_ras,@_data);Parameterbeschreibung:
_lat, Längengrad;
_lng, Breitengrad;
_ras, Radius (Einheit: km); akzeptieren und zurückgeben
Im Rückgabewert ist di die sortierte Entfernung, von nah nach fern, die Einheit ist m.
Wenn Sie keine gespeicherten Prozeduren verwenden, können Sie sie in ein PHP-Programm aufteilen:
Erhalten Sie zuerst einen quadratischen Koordinatenbereich und verbinden Sie ihn dann durch den sql in @_sql über der SQL-Anweisung, führen Sie sie einfach aus.
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; }
Das Obige stellt die gespeicherte MySQL-Prozedur vor – die Verwendung von Baidu-Koordinaten zur Abfrage qualifizierter Benutzer innerhalb des Radius und der Entfernung nach der Sortierung, einschließlich Aspekten des Inhalts. Ich hoffe, dass es für Freunde hilfreich sein wird, die an PHP-Tutorials interessiert sind.