예전에 비슷한 적용을 해본 적이 있는데 오늘 확인해 보니 별로 타당하지 않은 것 같아서 다시 생각해서 쿼리 저장 프로시저를 작성했습니다.
테이블은 설명되지 않습니다.
프로세스는
-- ---------------------------- -- 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; }
위 내용은 콘텐츠 측면을 포함하여 Baidu 좌표를 사용하여 반경 및 거리 내의 자격 있는 사용자를 쿼리하는 Mysql 저장 프로시저를 소개합니다. PHP 튜토리얼에 관심이 있는 친구에게 도움이 되기를 바랍니다.