根据已知坐标查询附近坐标分页排序

  • 52
/**
   * 计算某个经纬度的周围某段距离的正方形的四个点
   * @param $lng  经度
   * @param $lat  纬度
   * @param float $distance 该点所在圆的半径,该圆与此正方形内切,默认值为0.5km
   * @return array
   */
  public static function squarePoint($lat,$lng,$distance=0.5){
    define('EARTH_RADIUS', 6371);//地球半径,平均半径为6371km
    $dlng = 2 * asin(sin($distance / (2 * EARTH_RADIUS)) / cos(deg2rad($lat)));
    $dlng = rad2deg($dlng);
    $dlat = $distance/EARTH_RADIUS;
    $dlat = rad2deg($dlat);
    return array(
        'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
        'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
        'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
        'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
    );
  }
  /**
   * 计算两点之间的距离
   * @param $lng1 经度1
   * @param $lat1 纬度1
   * @param $lng2 经度2
   * @param $lat2 纬度2
   * @param int $unit m,km
   * @param int $decimal 位数
   * @return float
   */
  public static function getDistance($lat1, $lng1,$lat2, $lng2,$unit = 2, $decimal = 2)
  {
    $EARTH_RADIUS = 6370.996; // 地球半径系数
    $PI           = 3.1415926535898;
    $radLat1 = $lat1 * $PI / 180.0;
    $radLat2 = $lat2 * $PI / 180.0;
    $radLng1 = $lng1 * $PI / 180.0;
    $radLng2 = $lng2 * $PI / 180.0;
    $a = $radLat1 - $radLat2;
    $b = $radLng1 - $radLng2;
    $distance = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2)));
    $distance = $distance * $EARTH_RADIUS * 1000;
    if ($unit === 2) {
      $distance /= 1000;
    }
    return round($distance, $decimal);
  }
public function getAllCarWashApi(){
      $carWashApi = new CA();
      try {
        $carWashApiCommon = new ApiCommon($this->uniacid);
        $this->price = $carWashApiCommon->setting['price'];
        //筛选条件
        $condition = [];
        //方圆KM筛选
        if(!input('lat') || !input('lng')) return Result::Error(1,'暂未获取到你的位置');
        $lat=input('lat');
        $lng=input('lng');
        $squares = Map::squarePoint($lat,$lng,50);
        $condition = [
            ['uniacid','=',$this->uniacid],
            ['latitude','>',$squares['right-bottom']['lat']],
            ['latitude','<',$squares['left-top']['lat']],
            ['longitude','>',$squares['left-top']['lng']],
            ['longitude','<',$squares['right-bottom']['lng']],
        ];
        $EARTH=6378.137; //地球半径
        $PI=3.1415926535898; //PI值   //将要和数据库经纬度对比的坐标
        //根据已知坐标查询 排序 start【重点】
        $list = $carWashApi
            ->where($condition)
            ->field("*,(2 * $EARTH* ASIN(SQRT(POW(SIN($PI*(".$lat."-latitude)/360),2)+COS($PI*".$lat."/180)* COS(latitude * $PI/180)*POW(SIN($PI*(".$lng."-longitude)/360),2)))) as distance")
            ->order('juli asc')
            ->paginate(10)->each(function($item,$key){
            //无视
              $item['price'] = $this->price;
              //公里数
              $item['km'] = sprintf('%.2f', $item['distance']);
              return $item;
            });
            //end.  latitude longitude 经纬度
        return Result::Success($list);
      }  catch (\Exception $e) {
        return Result::Error(1,$e->getMessage());
      }
    }
weinxin
我的微信
这是我的微信扫一扫
开拓者博主
  • 本文由 发表于 2021年9月11日14:47:03
  • 转载请务必保留本文链接:https://www.150643.com/560.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: