def find_water_path(): proximity = [0.002, 0.002] min_number_of_rive = 10 name_of_rive_as_poi = "vincolo" html_water_file = html_file # usiamo questo per dirgli cosa disegnare! geo_type = -2 da = request.args.get('partenza', default='', type=str) a = request.args.get('arrivo', default='', type=str) form = FeedbackForm() form.searched_string.data = da t0 = time.perf_counter() if request.method == 'POST': if form.is_submitted(): if form.validate_on_submit(): with open(file_feedback, 'a') as f: f.write('*****\n') f.write(time.asctime(time.localtime(time.time())) + "\n") categoria = dict(form.category.choices).get( form.category.data) f.write(categoria + '\n') f.write(form.name.data + '\n') f.write(form.email.data + '\n') f.write(form.searched_string.data + '\n') f.write(form.found_string.data + '\n') f.write(form.feedback.data + "\n") f.write('*****\n') app.logger.info("feedback inviato") return render_template(html_water_file, geo_type=geo_type, start_coordx=-1, searched_name=da, start_name=start_name, feedbacksent=1) else: app.logger.info('errore nel feedback') return render_template(html_water_file, geo_type=geo_type, start_coordx=-1, searched_name=da, start_name=start_name, form=form, feedbacksent=0) else: app.logger.info( 'grazie per aver mandato il tuo indirizzo in find_address') if da == '': print('primo caricamento') app.logger.info('grazie per aver aperto find_address') temp = render_template(html_water_file, results_dictionary="None", form=form, feedbacksent=0) app.logger.info( 'ci ho messo {tot} a caricare la prima volta'.format( tot=time.perf_counter() - t0)) return temp elif a == '': app.logger.debug('indirizzo: {}'.format(da)) match_dict = find_address_in_db(da) # per ora usiamo solo la coordinata (nel caso di un poligono ritorno il centroide) e il nome, ma poi cambieremo app.logger.info( 'ci ho messo {tot} a calcolare la posizione degli indirizzi'. format(tot=time.perf_counter() - t0)) # 0 significa che stiamo ritornando un indirizzo singolo final_dict = prepare_our_message_to_javascript( 0, da, match_dict) # aggiunge da solo "no_path" e "no_end" print(final_dict) #dict_test = {"test":"ma va", "geotype":"0"} return render_template(html_water_file, form=form, results_dictionary=final_dict, feedbacksent=0) else: t0 = time.perf_counter() match_dict_da = find_address_in_db(da) match_dict_a = find_address_in_db(a) app.logger.info( 'ci ho messo {tot} a calcolare la posizione degli indirizzi'. format(tot=time.perf_counter() - t0)) [start_coord, stop_coord ] = find_closest_nodes([match_dict_da[0], match_dict_a[0]], G_terra_array) #rive_vicine=PoiCategoryType.query.filter_by(name="Riva").one().pois.join(Location).filter(and_(db.between(Location.longitude,start_coord[0]-0.0003,start_coord[0]+0.0003),db.between(Location.latitude,start_coord[1]-0.003,start_coord[1]+0.003))).all() #per tutti gli accessi all'acqua rive_vicine = [] #app.logger.info("cerco le rive vicine") rive_vicine_start, how_many_start = find_POI( min_number_of_rive, start_coord, name_of_rive_as_poi) #while len(rive_vicine)<10: # app.logger.info("increasing proximity") # proximity += [0.005,0.005] # rive_vicine=Poi.query.join(poi_types).join(PoiCategoryType).join(PoiCategory).filter_by(name="vincolo").join(Location).filter(and_(db.between(Location.longitude,start_coord[0]-proximity[0],start_coord[0]+proximity[0]),db.between(Location.latitude,start_coord[1]-proximity[1],start_coord[1]+proximity[1]))).all() app.logger.info( "rive vicine alla partenza: {}".format(how_many_start)) rive_start_list = [{ "coordinate": (riva.location.longitude, riva.location.latitude) } for riva in rive_vicine_start] rive_start_nodes_list = find_closest_nodes(rive_start_list, G_terra_array) start_path = find_path_to_closest_riva(G_terra, start_coord, rive_start_nodes_list) #print("start path", start_path) riva_start = start_path[-1] #print("riva start", riva_start) # per le rive vere e prorie # PoiCategoryType.query.filter_by(name="Riva").one().pois.join(Location).filter(and_(db.between(Location.longitude,stop_coord[0]-0.003,stop_coord[0]+0.003),db.between(Location.latitude,stop_coord[1]-0.03,stop_coord[1]+0.03))).all() #rive_vicine_stop=[] #while len(rive_vicine_stop)<10: # print("increasing proximity") # proximity += [0.005,0.005] # print(proximity) # rive_vicine_stop=Poi.query.join(poi_types).join(PoiCategoryType).join(PoiCategory).filter_by(name="vincolo").join(Location).filter(and_(db.between(Location.longitude,stop_coord[0]-proximity[0],stop_coord[0]+proximity[0]),db.between(Location.latitude,stop_coord[1]-proximity[1],stop_coord[1]+proximity[1]))).all() rive_vicine_stop, how_many_stop = find_POI(min_number_of_rive, stop_coord, name_of_rive_as_poi) app.logger.info("rive vicine all'arrivo: {}".format(how_many_stop)) rive_stop_list = [{ "coordinate": (riva.location.longitude, riva.location.latitude) } for riva in rive_vicine_stop] rive_stop_nodes_list = find_closest_nodes(rive_stop_list, G_terra_array) stop_path = find_path_to_closest_riva(G_terra, stop_coord, rive_stop_nodes_list) riva_stop = stop_path[-1] #print("riva stop", riva_stop) if request.form.get('meno_ponti'): f_ponti = True else: f_ponti = False t2 = time.perf_counter() # per i casi in cui abbiamo il civico qui andrà estratta la prima coordinate della shape... Stiamo ritornando la shape in quei casi?!? Servirà a java per disegnare il percorso completo! # lista degli archi list_of_edges_node_with_their_distance = find_closest_edge( [riva_start, riva_stop], G_acqua) # aggiungere gli archi! list_of_added_edges = pyAny_lib.dynamically_add_edges( G_acqua, list_of_edges_node_with_their_distance, [riva_start, riva_stop]) #print(list_of_added_edges) # trova la strada strada, length = pyAny_lib.calculate_path_wkt(G_acqua, riva_start, riva_stop, flag_ponti=f_ponti) # togli gli archi pyAny_lib.dynamically_remove_edges(G_acqua, list_of_added_edges) #print("path, length", strada, length) #trada = add_from_strada_to_porta(strada,match_dict_da[0], match_dict_a[0]) app.logger.info('ci ho messo {tot} a calcolare la strada'.format( tot=time.perf_counter() - t2)) # 1 significa che stiamo ritornando un percorso da plottare #strada_totale = add_from_strada_to_porta(strada_totale,match_dict_da[0], match_dict_a[0]) path_list_of_dictionaries = [{ "strada": strada, "lunghezza": length, "tipo": 1 }, { "strada": start_path, "lunghezza": length, "tipo": 0 }, { "strada": stop_path, "lunghezza": length, "tipo": 0 }] final_dict = prepare_our_message_to_javascript( 1, da + " " + a, [match_dict_da[0]], path_list_of_dictionaries, [match_dict_a[0]]) # aggiunge da solo "no_path" e "no_end" #print(final_dict) return render_template(html_water_file, form=form, results_dictionary=final_dict, feedbacksent=0)
def navigation(): # this could go in a method retrieve_parameters_from_GET da = request.args.get('partenza', default='', type=str) a = request.args.get('arrivo', default='', type=str) # new code! i bottoni sono 'off' o 'on' no_bridges = request.args.get('lazy', default='off', type=str) by_boat = request.args.get('boat', default='off', type=str) with_tide = request.args.get('tide', default='off', type=str) by_ambulance = request.args.get('ambu', default='off', type=str) # usiamo questo per dirgli cosa disegnare! # assumiamo nulla per ora geo_type = -2 f_ponti = False # se e stato inviato il form, scriviamo sul feedback file # anche questo da spostare su un metodo form = FeedbackForm() form.searched_string.data = da t0 = time.perf_counter() if request.method == 'POST': if form.is_submitted(): if form.validate_on_submit(): with open(file_feedback, 'a') as f: f.write('*****\n') f.write(time.asctime(time.localtime(time.time())) + "\n") categoria = dict(form.category.choices).get( form.category.data) f.write(categoria + '\n') f.write(form.name.data + '\n') f.write(form.email.data + '\n') f.write(form.searched_string.data + '\n') f.write(form.found_string.data + '\n') f.write(form.feedback.data + "\n") f.write('*****\n') app.logger.info("feedback inviato") return render_template(html_file, geo_type=geo_type, start_coordx=-1, searched_name=da, start_name=start_name, feedbacksent=1) else: app.logger.info('errore nel feedback') return render_template(html_file, geo_type=geo_type, start_coordx=-1, searched_name=da, start_name=start_name, form=form, feedbacksent=0) # altrimenti, dobbiamo fare qualocsa else: #app.logger.info('grazie per aver mandato il tuo indirizzo in find_address') if da == '': app.logger.info('just loading the page') temp = render_template(html_file, results_dictionary="None", form=form, feedbacksent=0) app.logger.info( 'ci ho messo {tot} a caricare la pagina senza ricerche'.format( tot=time.perf_counter() - t0)) return temp elif a == '': app.logger.debug('ricerca singolo indirizzo: {}'.format(da)) match_dict = find_address_in_db(da) # per ora usiamo solo la coordinata (nel caso di un poligono ritorno il centroide) e il nome, ma poi cambieremo app.logger.info( 'ci ho messo {tot} a calcolare la posizione degli indirizzi'. format(tot=time.perf_counter() - t0)) # 0 significa che stiamo ritornando un indirizzo singolo final_dict = prepare_our_message_to_javascript( 0, da, match_dict) # aggiunge da solo "no_path" e "no_end" app.logger.debug(final_dict) #dict_test = {"test":"ma va", "geotype":"0"} return render_template(html_file, form=form, results_dictionary=final_dict, feedbacksent=0) else: t0 = time.perf_counter() match_dict_da = find_address_in_db(da) match_dict_a = find_address_in_db(a) app.logger.info("ricerca percorso da {} a {}".format(da, a)) app.logger.info( 'ci ho messo {tot} a calcolare la posizione degli indirizzi'. format(tot=time.perf_counter() - t0)) # cerchiamo in acqua? if by_boat == 'on': app.logger.info("andiamo in barca..") # anche qua, spostare in un metodo proximity = [0.002, 0.002] min_number_of_rive = 10 name_of_rive_as_poi = "vincolo" [start_coord, stop_coord ] = find_closest_nodes([match_dict_da[0], match_dict_a[0]], G_terra_array) #per tutti gli accessi all'acqua rive_vicine = [] rive_vicine_start, how_many_start = find_POI( min_number_of_rive, start_coord, name_of_rive_as_poi) app.logger.info( "rive vicine alla partenza: {}".format(how_many_start)) rive_start_list = [{ "coordinate": (riva.location.longitude, riva.location.latitude) } for riva in rive_vicine_start] rive_start_nodes_list = find_closest_nodes( rive_start_list, G_terra_array) # ritorna la strada con properties e la riva scelta! geojson_path_from_land_to_water, riva_start = find_path_to_closest_riva( G_terra, start_coord, rive_start_nodes_list) # rive_vicine_stop=Poi.query.join(poi_types).join(PoiCategoryType).join(PoiCategory).filter_by(name="vincolo").join(Location).filter(and_(db.between(Location.longitude,stop_coord[0]-proximity[0],stop_coord[0]+proximity[0]),db.between(Location.latitude,stop_coord[1]-proximity[1],stop_coord[1]+proximity[1]))).all() rive_vicine_stop, how_many_stop = find_POI( min_number_of_rive, stop_coord, name_of_rive_as_poi) app.logger.info( "rive vicine all'arrivo: {}".format(how_many_stop)) rive_stop_list = [{ "coordinate": (riva.location.longitude, riva.location.latitude) } for riva in rive_vicine_stop] rive_stop_nodes_list = find_closest_nodes( rive_stop_list, G_terra_array) # ritorna la strada con properties e la riva scelta! geojson_path_from_water_to_land, riva_stop = find_path_to_closest_riva( G_terra, stop_coord, rive_stop_nodes_list) #print("riva stop", riva_stop) t2 = time.perf_counter() # per i casi in cui abbiamo il civico qui andrà estratta la prima coordinate della shape... Stiamo ritornando la shape in quei casi?!? Servirà a java per disegnare il percorso completo! # lista degli archi list_of_edges_node_with_their_distance = find_closest_edge( [riva_start, riva_stop], G_acqua) # aggiungere gli archi! list_of_added_edges = pyAny_lib.dynamically_add_edges( G_acqua, list_of_edges_node_with_their_distance, [riva_start, riva_stop]) # trova la strada water_streets_info = pyAny_lib.give_me_the_street( G_acqua, riva_start, riva_stop, flag_ponti=False, water_flag=True) app.logger.debug("the dictionary with all the info: {}".format( water_streets_info)) # togli gli archi pyAny_lib.dynamically_remove_edges(G_acqua, list_of_added_edges) #print("path, length", strada, length) #trada = add_from_strada_to_porta(strada,match_dict_da[0], match_dict_a[0]) app.logger.info( 'ci ho messo {tot} a calcolare la strada'.format( tot=time.perf_counter() - t2)) # 1 significa che stiamo ritornando un percorso da plottare #strada_totale = add_from_strada_to_porta(strada_totale,match_dict_da[0], match_dict_a[0]) # una lista con il dizionario che ha tutte le info sulle strade (una lista perche usiamo un ciclo di la su js) path_list_of_dictionaries = [ geojson_path_from_land_to_water, water_streets_info, geojson_path_from_water_to_land ] #path_list_of_dictionaries=[{"strada":strada, "lunghezza":length, "tipo":1},{"strada":start_path, "lunghezza":length, "tipo":0},{"strada":stop_path, "lunghezza":length, "tipo":0}] #final_dict = prepare_our_message_to_javascript(1, da+" "+a,[match_dict_da[0]], path_list_of_dictionaries, [match_dict_a[0]]) # aggiunge da solo "no_path" e "no_end" #print(final_dict) #return render_template(html_file, form=form, results_dictionary=final_dict, feedbacksent=0) else: # cerchiamo per terra app.logger.info("andiamo a piedi..") t0 = time.perf_counter() # per i casi in cui abbiamo il civico qui andrà estratta la prima coordinate della shape... Stiamo ritornando la shape in quei casi?!? Servirà a java per disegnare il percorso completo! [start_coord, stop_coord ] = find_closest_nodes([match_dict_da[0], match_dict_a[0]], G_terra_array) app.logger.info( 'ci ho messo {tot} a trovare il nodo piu vicino'.format( tot=time.perf_counter() - t0)) if no_bridges == 'on': f_ponti = True app.logger.info("con meno ponti possibile!") t2 = time.perf_counter() streets_info = pyAny_lib.give_me_the_street(G_terra, start_coord, stop_coord, flag_ponti=f_ponti) app.logger.debug(streets_info) #print("path, length", strada, length) streets_info = add_from_strada_to_porta( streets_info, match_dict_da[0], match_dict_a[0]) app.logger.info( 'ci ho messo {tot} a calcolare la strada'.format( tot=time.perf_counter() - t2)) streets_info['tipo'] = 0 # una lista con il dizionario che ha tutte le info sulle strade (una lista perche usiamo un ciclo di la su js) path_list_of_dictionaries = [streets_info] # prepara il messaggio da mandare a javascript final_dict = prepare_our_message_to_javascript( 1, da + " " + a, [match_dict_da[0]], path_list_of_dictionaries, [match_dict_a[0]]) return render_template(html_file, form=form, results_dictionary=final_dict, feedbacksent=0)