Heim >Backend-Entwicklung >PHP-Tutorial >Gespeicherte MySQL-Prozedur – Abfrage der qualifizierten Benutzer innerhalb des Radius und der sortierten Entfernung über Baidu-Koordinaten

Gespeicherte MySQL-Prozedur – Abfrage der qualifizierten Benutzer innerhalb des Radius und der sortierten Entfernung über Baidu-Koordinaten

WBOY
WBOYOriginal
2016-08-08 09:31:361048Durchsuche

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;
}

Hinweise: Das hier erhaltene Ergebnis ist ein quadratischer und kein kreisförmiger Radius. Sie können zu einem späteren Zeitpunkt eine sekundäre Filterung durchführen, z. B. array_filter(), die hier nicht weiter beschrieben wird.

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.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn