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

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

不言
풀어 주다: 2023-04-02 13:50:02
원래의
3587명이 탐색했습니다.

이 글은 경도와 위도에 따른 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 <= 45.653769722078)) and ((px_lon >= 105.81826766053) and (px_lon <= 128.22245033947))) order by  distance limit 0,10) location  where (1=1) and (location.distance <= 500)
先忽略上面这条SQL语句。一一解释
根据SQL排序的SQl语句
로그인 후 복사
 distance_sql(,,, = "round(6378.138*2*asin(sqrt(pow(sin( ({}*pi()/180-{}*pi()/180)/2),2)+cos({}*pi()/180)*cos({}*pi()/180)* pow(sin( ({}*pi()/180-{}*pi()/180)/2),2)))*1000) "
로그인 후 복사

SQL을 기반으로 정렬 함수를 생성하는 코드

다음 단계는 경도와 위도 범위 내의 데이터를 설정하는 것입니다

(I("post.location"
             = (",",I("post.location" = [0 = [1
             = getAround(,,1000000.=" and (((px_lat >= {["minLat"]}) and (px_lat <= {[&#39;maxLat&#39;]})) and ((px_lon >= {['minLng']}) and (px_lon <= {[&#39;maxLng&#39;]})))"
            (I("post.distance_sort" = ",".distance_sql(,,"px_lon","px_lat")." as distance" = " distance"(I("post.km" = htmlspecialchars_decode(I("post.km"((,"<") !==  = ("<", .= " and (location.distance <= {[1]})" ((,"-") !==  = ("-", .= " and ((location.distance >= {[0]}) and (location.distance <= {[1]}))" ((,">") !==  = (">", .= " 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 <= {$location[&#39;maxLat&#39;]})) and ((px_lon >= {$location[&#39;minLng&#39;]}) and (px_lon <= {$location[&#39;maxLng&#39;]})))";             // 经纬度距离筛选
            if(I("post.distance_sort")){                
            $distanceSql = ",".distance_sql($userLon,$userLat,"px_lon","px_lat")." as distance";                
            $orderBy = " distance";
            }            if(I("post.km")){                
            $kmStr = htmlspecialchars_decode(I("post.km"));                
            if(strpos($kmStr,"<") !== false){                    
            $km = explode("<",$kmStr);                    
            $wheres2 .= " and (location.distance <= {$km[1]})";
                }else if(strpos($kmStr,"-") !== false){                    
                $km = explode("-",$kmStr);                    
                $wheres2 .= " and ((location.distance >= {$km[0]}) and (location.distance <= {$km[1]}))";
                 }else if(strpos($kmStr,">") !== 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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