Maison > développement back-end > tutoriel php > 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

不言
Libérer: 2023-04-02 13:50:02
original
3587 Les gens l'ont consulté

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 <= 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语句
Copier après la connexion
 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) "
Copier après la connexion

Il s'agit d'un code pour générer une fonction de tri basée sur SQL

L'étape suivante consiste à définir les données dans la plage de longitude et de latitude

(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]})"
Copier après la connexion

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);
}
Copier après la connexion

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))
Copier après la connexion

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
Copier après la connexion
 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;
     
    }
Copier après la connexion

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!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal