>백엔드 개발 >PHP 튜토리얼 >PHP는 경도와 위도에 따라 정렬하고 경도와 위도에 따라 거리 세그먼트를 필터링합니다.

PHP는 경도와 위도에 따라 정렬하고 경도와 위도에 따라 거리 세그먼트를 필터링합니다.

不言
不言원래의
2018-07-05 11:17:053630검색

이 글은 경도와 위도에 따른 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는 경도와 위도에 따라 정렬하고 경도와 위도에 따라 거리 세그먼트를 필터링합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.