[マイクロ]レター開発プログラムは、緯度と経度のPHPコードによって達成2つのマイクロチャネルの小さな距離を算出します

要件:ユーザの現在位置に基づいてビジネスアドレスの周りに取得するための要件、および、近くから遠くまでソートに従い、

 

方法A:実施コードの層

 

梱包方法:

/ * * 
 緯度と経度に応じて2点間の距離を計算する* @Desc 
 * @paramフロート$ LAT緯度
 * @paramフロート$ LNG経度
 * @paramの$状態真KM、M表示;のみ偽のMに戻る
 * / 
関数 system_getdistance(LAT1 $$ LNG 1$ LAT2$のlng2$ステータス = trueに$ SINGLE = trueに
{ 
    $ earthRadius = 6367000 ;
     // 近似RADIUS地球のメートルで
    $ LAT1 =(FLOATVALの$ LAT1)* PI()) / 180 $ lng1 =(FLOATVAL$ lng1)* PI())/ 180 $ LAT2 =(FLOATVAL$ LAT2)* PI())/ 180 $ lng2 =(FLOATVAL$ lng2)* PI())/ 180 $ calcLongitude = $ lng2 - $ lng1 $ calcLatitude = $ LAT2 - $ LAT1 $のは、StepOne = POW$ calcLatitude / 2)、2)+COS$ LAT1)* COS$ LAT2)* POWSiNから$ calcLongitude / 2)、2 );
     $ stepTwo = 2 * ASIN(1、。SQRT$は、StepOne )));
     $ calculatedDistance = $ earthRadius * stepTwo $ ;
     IF(!$ SINGLE ){
         返す ラウンド$ calculatedDistance ;)
         出口; 
    } 
    // 1000以上メートルキロに変換
    IF$ステータス){
         $ M = ラウンド$ calculatedDistance)/ 1000 ;
         リターン $ mの > 1?。ラウンド$ mを、1。。) "キロ":($ mの * 1000) "M" ;
         //は、(ラウンド戻ります$メートル、2); //これは私がプログラムで使用されるもので、その種より便利に、我々はのニーズに応じて選択 
    } {
         返す ラウンド$ calculatedDistance)「M」; 
    } 
}

コール:

    / * * 
     * @Paramリクエストリクエストの$ 
     *の@return配列
     *ソートから店舗分類プレスを取得します
     * / 
    機能 getShop(リクエスト$リクエスト){
         $ C_ID = $リクエスト - > GET( 'C_ID' );
         $ LAT1 = $要求 - > GET( 'LAT' );
         $ LNG 1 = $要求 - > GET( 'LNG' );
         $ lat1U = FLOATVALの$ LAT1)+0.01 ;
         $ lat1D = FLOATVALの$ LAT1)-0.01 ;
         $ lng1U =FLOATVALの$ LNG 1)+0.01 ;
         $ lng1D = FLOATVALの$ LNG 1)-0.01 ;
         $データ = DB( 'ストア'  - >( 'C_ID'、$のC_ID  - > WHERE( 'LAT'、 '<' 、$ lat1Uは// 0.01からの差分商人の緯度と経度を回避 
            >( 'LAT'、 '>'、 - $ lat1D  - >( 'LNG'、 '<'、$ lng1U  - >(「LNG 」、 '>'、$ lng1D  - > ()して下さい。
        $ RES = json_encode($データ)。
        $ ARR1 = json_decode($ RES真の);
        $ ARR = [];
       foreachの$ ARR1  として $ K => $ V ){
             $ RES = $この - > system_getdistance($ LAT1$ lng1$ V [ 'LAT']、$のV [ 'LNG' ])。
            $ ARR1 [ $ K ] [ 'キロ'] = $ RES .'km」;
            $ ARR [ $ K ] = $ RES 
        } 
        ASORT$のARR )。
        $ ARR2 = [];
        foreachの$ ARR  として $ K => $ V ){
             $ ARR2 [] = $ ARR1 [ $ K ]。
        } 
        戻り の$ ARR2 
    }

 

 

方法2:SQL層の実装

SELECT 
    ID
    LNGROUND  6378.138 * 2 * ASIN SQRT POW SIN 
                            $年 * PI()/ 180 -年* PI()/ 180  / 2 
                    2  + COS$年 * PI()/ 180)* COS(年*PI()/ 180)* POW SIN 
                            $のLNGの *のPI()/ 180 - LNGの*のPI()/ 180  / 2 
                    2  * 1000年AS 距離
FROM 
    ストア
BY ORDER 
    距離ASC

 の5キロ以内に取得したSQL

(選択*から
      
SELECT 
    IDを、
    LAT、
    LNG、
    ROUND  6378.138 * 2 * ASIN  SQRT (POW (SIN (($ LAT * PI()/ 180 -緯度* PI()/ 180 )/ 2 )、2 )+ COS($緯度* PI()/ 180)* COS(LAT * PI()/ 180)* POW (SIN (($ LNG * PI()/ 180 - LNGの*のPI()/ 180 )/ 2 )、2 )))* 1000年)AS 距離ASC BYストアORDERからの距離


としてここa.distance <= 5000

 

おすすめ

転載: www.cnblogs.com/richerdyoung/p/11615556.html