/** * Finds the Comercio model based on its primary key value. * If the model is not found, a 404 HTTP exception will be thrown. * @param integer $id * @return Comercio the loaded model * @throws NotFoundHttpException if the model cannot be found */ protected function findModel($id) { if (($model = Comercio::findOne($id)) !== null) { return $model; } else { throw new NotFoundHttpException('The requested page does not exist.'); } }
private function calcularRuta($usuario, $comerciosValidos) { //obtenemos las coordenadas del usuario (punto de partida en la ruta) y los comercios. $coordenadasUsuario = ['latitud' => $usuario->latitud, 'longitud' => $usuario->longitud]; $latitudModificada = $usuario->latitud + 0.0001; $longitudModificada = $usuario->longitud + 0.0001; //$coordenadasUsuarioMod = ['latitud'=>$latitudModificada,'longitud'=>$longitudModificada]; $coordenadasComercios = $this->obtenerCoordenadasComercios($comerciosValidos); $request = ['origin' => ['lat' => $coordenadasUsuario['latitud'], 'lng' => $coordenadasUsuario['longitud']], 'travelMode' => 'walking']; $comerciosOrdenados = []; //si tenemos mas de un comercio armamos la ruta con waypoints... if (count($comerciosValidos) > 1) { //armamos la primera url que nos ordena los comercios, de ahi sacamos el ultimo. En esta instancia el user es origen y destino. $comerciosIndexados = []; $url1 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking&waypoints=optimize:true"; $i = 0; //guardamos los comercios por el indice en el cual se agrego en los waypoints. foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) { $comercio = Comercio::findOne($idComercio); $url1 = $url1 . '|' . $coordenadasComercio['latitud'] . ',' . $coordenadasComercio['longitud']; $comerciosIndexados[$i] = $comercio; $i++; } $response = file_get_contents($url1); $json1 = json_decode($response, true); if ($json1['status'] == 'OK') { //obtenemos los waypoints ordenados y armamos la ruta desde el user hasta el ultimo waypoint recibido $ordenComercios = $json1['routes'][0]['waypoint_order']; $comercioDestino = $comerciosIndexados[end($ordenComercios)]; $url2 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $comercioDestino->latitud . "," . $comercioDestino->longitud . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking&waypoints=optimize:true"; foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) { if ($idComercio != $comercioDestino->id) { $url2 = $url2 . '|' . $coordenadasComercio['latitud'] . ',' . $coordenadasComercio['longitud']; } } $response = file_get_contents($url2); $json2 = json_decode($response, true); if ($json2['status'] == 'OK') { $distancia = 0; //calculamos la distancia total de la ruta. $legs = $json2['routes'][0]['legs']; foreach ($legs as $leg) { $distancia = $distancia + $leg['distance']['value']; } if ($distancia <= sysconfigs::DISTANCIA_RELEVADOR) { $request['destination'] = ['lat' => $comercioDestino->latitud, 'lng' => $comercioDestino->longitud]; $request['optimizeWaypoints'] = true; $ordenComercios = $json1['routes'][0]['waypoint_order']; //die("ordenComercios:".var_dump($ordenComercios)); $i = 0; $request['waypoints'] = []; foreach ($ordenComercios as $orden) { if ($comerciosIndexados[$orden]->id != $comercioDestino->id) { $comerciosOrdenados[$i] = $comerciosIndexados[$orden]; $request['waypoints'][$i] = ['lat' => $comerciosIndexados[$orden]->latitud, 'lng' => $comerciosIndexados[$orden]->longitud]; $i++; } } $comerciosOrdenados[$i] = $comercioDestino; return ['jsonRuta' => $json2, 'jsonRequest' => $request, 'comerciosOrdenados' => $comerciosOrdenados]; } else { //desechamos uno de los comercios con menor prioridad que este lo mas cerca del final del recorrido. $keyComercio = null; $comercioDesechable = null; foreach ($comerciosIndexados as $key => $comercio) { if ($keyComercio == null) { $keyComercio = $key; $comercioDesechable = $comercio; } else { if ($comercio->prioridad >= $comercio->prioridad) { $keyComercio = $key; $comercioDesechable = $comercio; } } } unset($comerciosIndexados[$keyComercio]); return $this->calcularRuta($usuario, $comerciosIndexados); } } else { //algo fallo! return false; } } else { return false; } } else { //tenemos solo un comercio, por tanto la ruta generada es solo entre el usuario y el comercio. foreach ($coordenadasComercios as $idComercio => $coordenadasComercio) { $url3 = "https://maps.googleapis.com/maps/api/directions/json?origin=" . $coordenadasUsuario['latitud'] . "," . $coordenadasUsuario['longitud'] . "&destination=" . $coordenadasComercio['latitud'] . "," . $coordenadasComercio['longitud'] . "&key=" . sysconfigs::API_KEY_GMAPS_RUTAS . "&mode=walking"; $response = file_get_contents($url3); $json3 = json_decode($response, true); if ($json3['status'] == 'OK') { //vemos si la ruta generada no se pasa de la distancia $distancia = 0; //calculamos la distancia total de la ruta. $legs = $json3['routes'][0]['legs']; foreach ($legs as $leg) { $distancia = $distancia + $leg['distance']['value']; } if ($distancia <= sysconfigs::DISTANCIA_RELEVADOR) { $request['destination'] = ['lat' => $coordenadasComercio['latitud'], 'lng' => $coordenadasComercio['longitud']]; $comercio = Comercio::findOne($idComercio); $comerciosOrdenados[0] = $comercio; return ['jsonRuta' => $json3, 'jsonRequest' => $request, 'comerciosOrdenados' => $comerciosOrdenados]; } else { //no se puede generar una ruta cumpliendo las reglas, por tanto se retorna false return false; } } else { return false; } } } }