'ASC', 'COUNT' => 1, 'WITHDIST' => true]; // $redis = Redis::connection(); // $ban_stop_bike_stations = $redis->georadius(Parking::REDIS_BAN_STOP_BIKE_SITE_TAG . "_{$area_id}", $lng, $lat, 17000, 'm', $options); // // if (count($ban_stop_bike_stations) !== 1) { // //没有找到禁停区 // return false; // } // // $stop_bike_station = $ban_stop_bike_stations[0]; // $park_id = $stop_bike_station[0]; // $stop_bike_station_db = Cache::remember(Parking::REDIS_BAN_STOP_BIKE_SITE_TAG . $park_id, Carbon::now()->addHours(1), function () use ($park_id) { // return Parking::where('id', $park_id)->where('status', Parking::STATUS_OK)->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 true; // } // // //使用用户的定位进行判断 // if ($user_lat != 0) { // $distance = $ConverHandler->distance($lat, $lng, $user_lat, $user_lng); // if (self::BIKE_TO_USER > $distance) { // $is_in_station = $ConverHandler->is_point_in_polygon([ // 'latitude' => $user_lat, // 'longitude' => $user_lng // ], $stop_bike_station_db->parking_fence); // // if ($is_in_station) { // return true; // } // } // } // // // //判断是否在辐射范围 //// $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 true; //// } // // return false; // } /** * 判断是否在禁停区 * @param $lat * @param $lng * @param int $area_id * @return bool * Author: Mead */ public function byLocationCheckIsInBanStopParking($lat, $lng, $area_id = 0, $user_lat = 0, $user_lng = 0) { $stop_bike_all_station_db = Cache::remember(Parking::REDIS_BAN_STOP_BIKE_ALL_SITE_TAG . '_' . $area_id, Carbon::now()->addHours(1), function () use ($area_id) { return Parking::where('area_id', $area_id)->where('type', Parking::TYPE_NO_STOP_BIKE)->where('status', Parking::STATUS_OK)->get(); }); if (count($stop_bike_all_station_db) === 0) { //没有找到禁停区 return false; } $ConverHandler = new ConvertHandler(); $parking_fences = $stop_bike_all_station_db->pluck('parking_fence'); $is_in_station = $ConverHandler->is_point_in_polygons([ 'latitude' => $lat, 'longitude' => $lng ], $parking_fences); if ($is_in_station) { return true; } //使用用户的定位进行判断 if ($user_lat != 0) { $distance = $ConverHandler->distance($lat, $lng, $user_lat, $user_lng); if (self::BIKE_TO_USER > $distance) { $is_in_station = $ConverHandler->is_point_in_polygons([ 'latitude' => $user_lat, 'longitude' => $user_lng ], $parking_fences); if ($is_in_station) { return true; } } } return false; } // /** // * 判断是否在停车点 // * @param $lat // * @param $lng // * @param int $area_id // * @return array // * User: Mead // */ // public function byLocationCheckIsInStopParking($lat, $lng, $area_id = 0, $user_lat = 0, $user_lng = 0) // { // // // 判断是否有还车点 // $options = ['SORT' => 'ASC', 'COUNT' => 1, 'WITHDIST' => true]; // $redis = Redis::connection(); // $stop_bike_stations = $redis->georadius(Parking::REDIS_STOP_BIKE_SITE_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 // ]; // } // // $isOpenStopBikeFushe = Cache::remember(CacheMap::IS_OPEN_STOP_BIKE_FUSHE . ':' . $area_id, Carbon::now()->addSeconds(CacheMap::CACHE_TIME), function () use ($area_id) { // return AreaSetting::where('area_id', $area_id)->value('is_parking_fushe'); // }); // // if (!$isOpenStopBikeFushe) { // //是否启用还车点辐射范围 // return [ // 'status' => false, // '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 // ]; // } // // // //使用用户的定位进行判断 // if ($user_lat != 0) { // $bike_to_user_distance = $ConverHandler->distance($lat, $lng, $user_lat, $user_lng); // if (self::BIKE_TO_USER > $bike_to_user_distance) { // // $is_in_station = $ConverHandler->is_point_in_polygon([ // 'latitude' => $user_lat, // 'longitude' => $user_lng // ], $stop_bike_station_db->parking_fence); // // if ($is_in_station) { // return [ // 'status' => true, // 'distance' => $distance // ]; // } // // //辐射范围 // if ($isOpenStopBikeFushe) { // $is_in_near_station = $ConverHandler->is_point_in_circle([ // 'latitude' => $user_lat, // 'longitude' => $user_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 $lat * @param $lng * @param int $area_id * @return array * User: Mead */ public function byLocationCheckIsInStopParking($lat, $lng, $area_id = 0, $user_lat = 0, $user_lng = 0) { // 判断是否有还车点 $options = ['SORT' => 'ASC', 'COUNT' => 1, 'WITHDIST' => true]; $redis = Redis::connection(); $stop_bike_stations = $redis->georadius(Parking::REDIS_STOP_BIKE_SITE_TAG . "_{$area_id}", $lng, $lat, 20000, 'm', $options); if (!count($stop_bike_stations)) { //没有找到停车点 return [ 'status' => false, 'distance' => 999999 ]; } $stop_bike_station = $stop_bike_stations[0]; $distance = $stop_bike_station[1]; $park_id = $stop_bike_station[0]; $isOpenStopBikeFushe = Cache::remember(CacheMap::IS_OPEN_STOP_BIKE_FUSHE . ':' . $area_id, Carbon::now()->addSeconds(CacheMap::CACHE_TIME), function () use ($area_id) { return AreaSetting::where('area_id', $area_id)->value('is_parking_fushe'); }); $ids = array_column($stop_bike_stations, 0); // $stop_bike_station_db = Cache::remember("PARKING_" . $park_id . '_' . arr2str($ids, '_'), Carbon::now()->addHours(1), function () use ($ids, $area_id) { $stop_bike_station_db = Cache::remember("PARKINGS_" . $area_id, Carbon::now()->addHours(1), function () use ($ids, $area_id) { // return Parking::whereIn('id', $ids)->where('area_id', $area_id)->where('status', Parking::STATUS_OK)->get(['id', 'parking_fence', 'parking_centre', 'parking_radius'])->keyBy('id'); return Parking::where('area_id', $area_id)->where('type', Parking::TYPE_STOP_BIKE)->where('status', Parking::STATUS_OK)->get(['id', 'parking_fence', 'parking_centre', 'parking_radius'])->keyBy('id'); }); $ConverHandler = new ConvertHandler(); $CheckAreaHandler = ''; if ($isOpenStopBikeFushe) { //有辐射范围 // 判断是否在还车点范围内 $is_in_near_station = $ConverHandler->is_point_in_circles([ 'latitude' => $lat, 'longitude' => $lng ], $stop_bike_station_db); if ($is_in_near_station) { return [ 'status' => true, 'type' => 'circle', 'distance' => $distance, ]; } //用户定位判断 if ($user_lat != 0) { $bike_to_user_distance = $ConverHandler->distance($lat, $lng, $user_lat, $user_lng); if (self::BIKE_TO_USER > $bike_to_user_distance) { $is_in_near_station = $ConverHandler->is_point_in_circles([ 'latitude' => $user_lat, 'longitude' => $user_lng ], $stop_bike_station_db); if ($is_in_near_station) { return [ 'status' => true, 'type' => 'circle', 'distance' => $distance ]; } } } } else { //没有辐射范围 $prakings = $stop_bike_station_db->pluck('parking_fence', 'id'); // $CheckAreaHandler = new CheckAreaHandler($stop_bike_station_db->pluck('parking_fence')); // $is_in_station = $CheckAreaHandler->checkPoint($lng, $lat); $is_in_station = $ConverHandler->is_point_in_polygons([ 'latitude' => $lat, 'longitude' => $lng ], $prakings); if ($is_in_station) { return [ 'status' => true, 'distance' => $distance ]; } //用户定位判断 if ($user_lat != 0) { $bike_to_user_distance = $ConverHandler->distance($lat, $lng, $user_lat, $user_lng); if (self::BIKE_TO_USER > $bike_to_user_distance) { // $is_in_near_station = $CheckAreaHandler->checkPoint($user_lng, $user_lat); $is_in_near_station = $ConverHandler->is_point_in_polygons([ 'latitude' => $user_lat, 'longitude' => $user_lng ], $prakings); if ($is_in_near_station) { return [ 'status' => true, 'distance' => $distance ]; } } } } return [ 'status' => false, 'distance' => $distance ]; } /** * 通过距离获取调度费 * @param $distance * User: Mead */ public function byDistanceGetDistanceMoney($distance, $areaSetting) { $gl = $areaSetting->min_limit_km * 1000; if ($distance <= $gl) { return $areaSetting->min_dispatching_fee; } $over_distance = $distance - $gl; $over_money = bcadd($areaSetting->min_dispatching_fee, ceil($over_distance / (1000 * $areaSetting->over_limit_per_km)) * $areaSetting->over_limit_per_km_money, 2); if ($over_money < $areaSetting->max_dispatching_fee) { return $over_money; } return $areaSetting->max_dispatching_fee; } }