'ASC', 'COUNT' => 1, 'WITHDIST' => true]; $redis = Redis::connection(); $stop_bike_stations = $redis->georadius(Parking::REDIS_STOP_BIKE_SITES_TAG . "_{$area_id}", $lng, $lat, 17000, 'm', $options); if (count($stop_bike_stations) !== 1) { //没有找到停车点 return [ 'status' => false, 'distance' => 999999 ]; } $stop_bike_station = $stop_bike_stations[0]; $distance = $stop_bike_station[1]; $park_id = $stop_bike_station[0]; $stop_bike_station_db = Cache::remember("PARKING_" . $park_id, Carbon::now()->addHours(1), function () use ($park_id) { return Parking::where('id', $park_id)->first(); }); // 判断是否在还车点内 $ConverHandler = new ConvertHandler(); $is_in_station = $ConverHandler->is_point_in_polygon([ 'latitude' => $lat, 'longitude' => $lng ], $stop_bike_station_db->parking_fence); if ($is_in_station) { return [ 'status' => true, 'distance' => $distance ]; } // 判断是否在还车点范围内 $is_in_near_station = $ConverHandler->is_point_in_circle([ 'latitude' => $lat, 'longitude' => $lng ], ['center' => $stop_bike_station_db->parking_centre, 'radius' => $stop_bike_station_db->parking_radius]); if ($is_in_near_station) { return [ 'status' => true, 'type' => 'circle', 'distance' => $distance ]; } return [ 'status' => false, 'distance' => $distance ]; } /** * 通过距离获取调度费 * @param $distance * User: Mead */ public function byDistanceGetDistanceMoney($distance, $areaSetting) { if ($distance <= 3000) { // $over_money = bcmul(ceil($distance / 500), 5, 2); // if ($over_money < $areaSetting->min_dispatching_fee) { // return $over_money; // } return $areaSetting->min_dispatching_fee; } $over_distance = $distance - 3000; $over_money = bcadd($areaSetting->min_dispatching_fee, ceil($over_distance / 1000) * 5, 2); if ($over_money < $areaSetting->max_dispatching_fee) { return $over_money; } return $areaSetting->max_dispatching_fee; } }