要件:ユーザの現在位置に基づいてビジネスアドレスの周りに取得するための要件、および、近くから遠くまでソートに従い、
方法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)* POW(SiNから($ 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、 年、 LNG、 ROUND ( 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