Maison  >  Article  >  développement back-end  >  PHP trie selon la longitude et la latitude et filtre les segments de distance selon la longitude et la latitude

PHP trie selon la longitude et la latitude et filtre les segments de distance selon la longitude et la latitude

不言
不言original
2018-07-05 11:17:053522parcourir

Cet article présente principalement le tri php en fonction de la longitude et de la latitude, et le filtrage des segments de distance en fonction de la longitude et de la latitude. Il a une certaine valeur de référence. Maintenant, je le partage avec tout le monde. Les amis dans le besoin peuvent s'y référer.

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 e0870ecc454c2fe77908ede254a2bb61= {["minLat"]}) and (px_lat 71322fc885cb7c46ea769eb6fff02986= {['minLng']}) and (px_lon 4615b1a699ff3838c5fbc301a9257e34= {[0]}) and (location.distance 12b943c66ffff944f0d062a653df4b62") !==  = (">", .= " and (location.distance >= {[1]})"

Le ce qui suit est de calculer la fonction de contrôle des données dans la plage de longitude et de latitude

/**
 * 
 * @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);
}

Pour mettre en œuvre le tri en fonction de la longitude et de la latitude

Appelez simplement distance_sql(lon1,lat1,lon2,lat2) directement pour transmettre les paramètres et comme alias tels que la distance, puis trier par dans l'instruction SQL est trié en fonction de la distance

Si vous filtrez les données dans un segment de distance de 1000 mètres à 2000 mètres

Ensuite, imbriquez l'instruction sql dans 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))

Si vous implémentez le tri SQL en fonction de l'emplacement le plus proche

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;
     
    }

Ce qui précède représente l'intégralité du contenu de cet article .J'espère que cela sera utile à l'étude de tout le monde. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois !

Recommandations associées :

Introduction à curl demandant d'autres interfaces dans l'interface PHP

Introduction initiale à la programmation multi-processus PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn