이 글은 경도와 위도에 따른 PHP 정렬과 경도와 위도에 따른 거리 세그먼트 필터링에 대해 주로 소개합니다. 이제는 필요한 친구들과 공유할 수 있습니다
SQL 语句: select location.* from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance from bsx_training where (px_state = 1) and (type_id != '') and (((px_lat >= 27.683290277922) and (px_lat 008b0d02af5e880524b45e5a244da4e2= 105.81826766053) and (px_lon 000246c7e2a1a14480c0c97b8ecf5534= {["minLat"]}) and (px_lat 71322fc885cb7c46ea769eb6fff02986= {['minLng']}) and (px_lon 4615b1a699ff3838c5fbc301a9257e34= {[0]}) and (location.distance 12b943c66ffff944f0d062a653df4b62") !== = (">", .= " and (location.distance >= {[1]})"
다음은 경도와 위도 범위 내의 데이터 제어 함수를 계산하는 것입니다
/** * * @param $latitude 纬度 * @param $longitude 经度 * @param $raidus 半径范围(单位:米) * @return multitype:number */ function getAround($latitude,$longitude,$raidus) { $PI = 3.14159265; $degree = (24901*1609)/360.0; $dpmLat = 1/$degree; $radiusLat = $dpmLat*$raidus; $minLat = $latitude - $radiusLat; $maxLat = $latitude + $radiusLat; $mpdLng = $degree*cos($latitude * ($PI/180)); $dpmLng = 1 / $mpdLng; $radiusLng = $dpmLng*$raidus; $minLng = $longitude - $radiusLng; $maxLng = $longitude + $radiusLng; return array (minLat=>$minLat, maxLat=>$maxLat, minLng=>$minLng, maxLng=>$maxLng); }
To 경도와 위도를 기준으로 정렬을 구현합니다
distance_sql(lon1,lat1,lon2,lat2)을 호출하여 매개변수와 거리와 같은 별칭을 전달하면 SQL 문에서 정렬 순서가 거리에 따라 정렬됩니다.
거리 구간 1000미터~2000미터
데이터를 필터링한 후 sql에 sql 문을 중첩하면
select *.loation from (select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance) from table location where (location.distance >= 1000) and (location.distance <= 2000))
가장 가까운 위치를 기준으로 sql 정렬을 구현하는 경우
select *,round(6378.138*2*asin(sqrt(pow(sin( (36.668530*pi()/180-px_lat*pi()/180)/2),2)+cos(36.668530*pi()/180)*cos(px_lat*pi()/180)* pow(sin( (117.020359*pi()/180-px_lon*pi()/180)/2),2)))*1000) as distance order by distance
public function training_list() { $wheres1 = "(px_state = 1)"; $wheres2 = " where (1=1)"; $orderBy = " px_id desc"; if(I("post.location")){ // 用户经纬度 $location = explode(",",I("post.location")); $userLon = $location[0]; $userLat = $location[1]; // 经纬度筛选 $location = getAround($userLat,$userLon,1000000); $wheres1.=" and (((px_lat >= {$location["minLat"]}) and (px_lat e0e3adc5b1d21874bd68194c923dd33d= {$location['minLng']}) and (px_lon 26073fa122ec5ad079810924d812a7cf= {$km[0]}) and (location.distance 24d4f35e0098b2dac5d018927d5071cc") !== false){ $km = explode(">",$kmStr); $wheres2 .= " and (location.distance >= {$km[1]})"; } } } $showNum = 10; if(I("post.page")){ $page = I("post.page"); }else{ $page = 1; } $n = ($page-1)*$showNum; $field = "*{$distanceSql}"; $sql = "select location.* from (select {$field} from bsx_training where {$wheres1} order by {$orderBy} limit {$n},{$showNum}) location {$wheres2}"; $training = M()->query($sql); dump(M()->getlastsql());die; }
위 내용은 이 글의 전체 내용입니다. . 모든 분들의 학습에 도움이 되었으면 좋겠습니다. 더 많은 관련 내용을 보시려면 PHP 중국어 홈페이지를 주목해주세요!
관련 권장 사항:
PHP 인터페이스에서 다른 인터페이스를 요청하는 컬 소개
위 내용은 PHP는 경도와 위도에 따라 정렬하고 경도와 위도에 따라 거리 세그먼트를 필터링합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!