> 백엔드 개발 > PHP 튜토리얼 > Mysql 저장 프로시저 - Baidu 좌표를 통해 반경 및 정렬된 거리 내의 자격을 갖춘 사용자를 쿼리합니다.

Mysql 저장 프로시저 - Baidu 좌표를 통해 반경 및 정렬된 거리 내의 자격을 갖춘 사용자를 쿼리합니다.

WBOY
풀어 주다: 2016-08-08 09:31:36
원래의
1055명이 탐색했습니다.

예전에 비슷한 적용을 해본 적이 있는데 오늘 확인해 보니 별로 타당하지 않은 것 같아서 다시 생각해서 쿼리 저장 프로시저를 작성했습니다.

테이블은 설명되지 않습니다.

프로세스는

-- ----------------------------
-- 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); 수락 및 반환

반환 값에서 di는 정렬된 거리이며, 가까운 것부터 먼 것까지 단위는 m입니다.

저장 프로시저를 사용하지 않는 경우 PHP 프로그램으로 분할할 수 있습니다.

먼저 정사각형 좌표 영역을 얻은 다음 다음을 통해 하나로 접합합니다. sql문 위의 @_sql에 sql을 넣어서 실행하면 됩니다.

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;
}
로그인 후 복사

여기서 얻은 결과는 원형 반경이 아닌 정사각형입니다. 여기서는 더 이상 설명하지 않는 array_filter()와 같은 2차 필터링을 나중에 수행할 수 있습니다.

위 내용은 콘텐츠 측면을 포함하여 Baidu 좌표를 사용하여 반경 및 거리 내의 자격 있는 사용자를 쿼리하는 Mysql 저장 프로시저를 소개합니다. PHP 튜토리얼에 관심이 있는 친구에게 도움이 되기를 바랍니다.

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿