def obtenerPuntosArea(self,request,radio): punto1 = Punto() puntosFiltrados = [] try: # Se obtiene la ubicacion del cliente latitudOrigen = float(request.get('latitudOrigen')) longitudOrigen = float(request.get('longitudOrigen')) # se asigna la informacion al punto punto1.latitud = latitudOrigen punto1.longitud = longitudOrigen #Se ejecuta la consulta con los parametros obtenidos, primero se filtra la latitud latitudMaxima = latitudOrigen + radio longitudMaxima = longitudOrigen + radio # latitudMinima = latitudOrigen - radio longitudMinima = longitudOrigen - radio puntosFiltro1 = PuntoClave.query(PuntoClave.latitud <= latitudMaxima, PuntoClave.latitud >= latitudMinima).fetch(100) #Se aplica un segundo filtro, limitantes de Datastore (NoSQL) por razones de indices. puntosFiltrados = filter( lambda punto: punto.longitud <= longitudMaxima and punto.longitud >= longitudMinima, puntosFiltro1) return puntosFiltrados except Exception as e: logger.error("No se pudieron obtener los puntos") logger.error(e) return puntosFiltrados
def obtenerPuntos(self, request): punto1 = Punto() punto2 = Punto() puntosFiltrados = [] puntosOrdenadosPorTipo = [] try: # Se obtiene la ubicacion del cliente latitudOrigen = float(request.get('latitudOrigen')) longitudOrigen = float(request.get('longitudOrigen')) # se asigna la informacion al punto punto1.latitud = latitudOrigen punto1.longitud = longitudOrigen #Se obtiene el punto al que el cliente desea llegar latitudDestino = float(request.get('latitudDestino')) longitudDestino = float(request.get('longitudDestino')) #se asigna la informacion al punto punto2.latitud = latitudDestino punto2.longitud = longitudDestino #Se calculan las latitudes maximas y minimas llamando al metodo generado previamente rangos = self.obtenerAreaDeBusqueda(punto1, punto2) #Se ejecuta la consulta con los parametros obtenidos, primero se filtra la latitud puntosFiltro1 = PuntoClave.query(PuntoClave.latitud <= rangos['latitudMaxima'], PuntoClave.latitud >= rangos['latitudMinima']).fetch(100) #Se aplica un segundo filtro, limitantes de Datastore (NoSQL) por razones de indices. puntosFiltrados = filter( lambda punto: punto.longitud <= rangos['longitudMaxima'] and punto.longitud >= rangos['longitudMinima'], puntosFiltro1) puntosOrdenadosPorTipo = sorted(puntosFiltrados, key=attrgetter('tipo', 'valoracion'), reverse=True) return puntosOrdenadosPorTipo except Exception as e: logger.error("No se pudieron obtener los puntos") logger.error(e) return puntosOrdenadosPorTipo
def esPuntoSemejante(self, puntoAComparar): diferencia = 0.0001 # Se generan las diferencias latitudMaxima = puntoAComparar.latitud + diferencia latitudMinima = puntoAComparar.latitud - diferencia longitudMaxima = puntoAComparar.longitud + diferencia longitudMinima = puntoAComparar.longitud - diferencia #Se hace la consulta 1 listaPuntosFiltro1 = PuntoClave.query() listaPuntosFiltro2 = listaPuntosFiltro1.filter(PuntoClave.latitud <= latitudMaxima, PuntoClave.latitud >= latitudMinima).fetch(100) #listaPuntosFiltro3 = listaPuntosFiltro2.filter(PuntoClave.longitud<=longitudMaxima,PuntoClave.longitud>=longitudMinima).fetch(1) listaPuntosFiltro3 = filter(lambda punto: punto.longitud >= longitudMaxima and punto.longitud <= longitudMinima, listaPuntosFiltro2) if len(listaPuntosFiltro3): return listaPuntosFiltro3[0] else: return False
def get(self): mensajeExito = 'Guardaro Correctamente!' try: puntoAGuardar = PuntoClave() puntoAGuardar.latitud = float(self.request.get('latitud')) puntoAGuardar.longitud = float(self.request.get('longitud')) puntoAGuardar.tipo = int(self.request.get('tipo')) puntoAGuardar.valoracion = 0.0 puntoAGuardar.numeroValoraciones = 1 puntoEncontrado = utileria.esPuntoSemejante(puntoAGuardar) logger.error(puntoEncontrado) logger.error(puntoEncontrado) logger.error(puntoEncontrado) if not (puntoEncontrado): logger.error("No existe el punto, se guarda uno nuevo!!") puntoAGuardar.put() else: logger.error("Existe, solo se actualiza!") puntoEncontrado.tipo = int(self.request.get('tipo')) #puntoEncontrado.numeroValoraciones = puntoEncontrado.numeroValoraciones + 1 puntoEncontrado.put() if bool(self.request.get('dev')): #Si existe el parametro debug!, se genera la pagina web print("Guardado!!!!") self.response.write( MAIN_PAGE.substitute(mensaje=mensajeExito, formularioACargar=GUARDAR_PUNTOS_CLAVE_FORM, formularioConsulta=OBTENER_PUNTOS_ENTRE_AREA_FORM)) #significa que solo necesitan la respuesta en JSON, posiblemente en produccion else: mapaRespuesta = {'mensaje': 'Guardado Correctamente!'} self.response.headers['Content-Type'] = 'application/json' self.response.out.write(json.dumps(mapaRespuesta)) #self.redirect('/test') except Exception as e: self.response.write(MAIN_PAGE.substitute(mensaje=e, formularioACargar=GUARDAR_PUNTOS_CLAVE_FORM, formularioConsulta=OBTENER_PUNTOS_ENTRE_AREA_FORM))