Buon giorno lista, ho terminato il mio primo codice il quale funziona come volevo.
Se avete voglia potete dagli un'occhiata? Desidererei dei suggerimenti su come renderlo più leggibile e ordinato su come potrei ottimizzarlo con funzioni più avanzate e, non intendo una riscrittura del codice da parte vostra ma una cosa tipo: il while alla riga x potresti sostituirlo con ... (mi basta lo spunto poi la studierei io per imparare cose nuove). Breve descrizione del: Il programma permette l'inserimento di alcuni parametri, ne controlla che rientrino in determinati range e controlla che il tipo di carattere sia quello giusto. Finiti gli input fa delle conversioni e gli stampa a monitor. I valori inseriti e calcolati gli infila in un db SQL e apre una pagina internet di una mappa e posiziona il punto delle coordinate. Scritto con Python 3 su linux mint 17 Grazie saluti andrea
#!/usr/bin/python # -*- coding: utf-8 -*- import os import datetime import sqlite3 import webbrowser import urllib.request import urllib.error import socket # ########################## Definisco le funzioni ################################################################################# # Funzione per pulire la Bash dalle scritte e dai valori immessi, così facendo avrò a monitor solo il riepilogo e le conversioni def pulisci(): os.system("clear") pulisci() # Funzione per lasciare 2 righe vuote -- Questa è una funzione ricorsiva in quanto richiama se stessa -- def vuote(n): print(os.linesep * n) # ---------------------- Fine della definizione delle funzioni--------------------------------------------------------- vuote(2) # ######################## Definisco le variabili fisse ################################################################ data = today = datetime.date.today() ora = 0 # Trovare il modo di memorizzare l'ora attuale GPSMapDatum = "WGS-84" Meridiano = "Greenwich" # ------------------------ Fine della definizione delle variabili fisse ------------------------------------------------ # Messaggio iniziale stampato a monitor; \n scrive ciò che segue nella riga sottostante print("Questo codice permette all'utente di convertire delle coordinate geografiche espresse in Gradi Primi e Secondi\nnelle due notazioni: Gradi e Primi e Gradi\nCrea i seguenti standard:stringa NMEA che è lo standard delle unità GPS riceventi\nstandard Web per aprire la mappa di Google e lo standard digiKam\nI valori digitati e quelli calcolati saranno inseriti in un data base SQL nominato coordinate.db") vuote(2) # ######################## Inserimento e controllo tramite input dei parametri delle coordinate geografiche ############ # ------------------------ Inserimento del nome e della descrizione ---------------------------------------------------- print("\033[33m Inserisci i valori che il programma ti chiederà \033[0m") print() nome = input("Inserisci un nome per le coordinate geografiche (massimo 15 caratteri): ") conta_nome = len(nome) while conta_nome not in range(16): print("\033[36m ATTENZIONE --- Valore non consentito - massimo 15 caratteri --- ATTENZIONE\033[0m") print() nome = input("Inserisci un nome per le coordinate geografiche (massimo 15 caratteri): ") conta_nome = len(nome) print() descrizione = input("Inserisci una breve descrizione per le coordinate geografiche (massimo 40 caratteri): ") conta_descrizione = len(descrizione) while conta_descrizione not in range(41): print("\033[36m ATTENZIONE --- Valore non consentito - massimo 40 caratteri --- ATTENZIONE\033[0m") print() descrizione = input("Inserisci una breve descrizione per le coordinate geografiche (massimo 40 caratteri): ") conta_descrizione = len(descrizione) print() # ----------------------- Inserimento dei riferimenti e dei valori delle coordinate geografiche (latitudine) ----------- print("Valori di Latitudine") print() GPSLatitudeRef = input("Inserisci il riferimento della Latitudine; N=Nord S=Sud: ") GPSLatitudeRef = GPSLatitudeRef.upper() while GPSLatitudeRef not in ("S", "N"): print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() GPSLatitudeRef = input("Inserisci N per Nord oppure S per Sud: ") GPSLatitudeRef = GPSLatitudeRef.upper() # Questo ciclo permette l'inserimento dei gradi di latitudine e ne controlla che lo stesso sia all'interno di un range e che sia un numero e non una lettera while True: try: lat_g = int(input("Inserisci i gradi di latitudine; con un valore compreso tra 0 e 90: ")) while lat_g not in range (91): print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() lat_g = int(input("Inserisci i gradi di latitudine; con un valore compreso tra 0 e 90: ")) break except ValueError: print("\033[36m ATTENZIONE --- Valore non consentito --- Inserisci solo numeri da 0 a 90 --- ATTENZIONE\033[0m") print() # Questo ciclo permette l'inserimento dei primi di latitudine e ne controlla che lo stesso sia all'interno di un range e che sia un numero e non una lettera while True: try: lat_p = int(input("Inserisci i primi (o minuti) di latitudine; con un valore compreso tra 0 e 59: ")) while lat_p not in range (60): print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() lat_p = int(input("Inserisci i gradi di latitudine; con un valore compreso tra 0 e 59: ")) break except ValueError: print("\033[36m ATTENZIONE --- Valore non consentito --- Inserisci solo numeri da 0 a 59 --- ATTENZIONE\033[0m") print() # Questo ciclo permette l'inserimento dei secondi di latitudine e controlla che lo stesso sia all'interno di un range e che sia un numero e non una lettera while True: try: lat_s = float(input("Inserisci i secondi di latitudine; con un valore compreso tra 0 e 59.9: ")) while lat_s < 0 or lat_s > 59.9: print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() lat_s = float(input("Inserisci i secondi di latitudine; con un valore compreso tra 0 e 59.9: ")) break except ValueError: print("\033[36m ATTENZIONE --- Valore non consentito --- Inserisci solo numeri da 0 a 59.9 --- ATTENZIONE\033[0m") print() # Pulizia del monitor e riepilogo della latitudine pulisci() vuote(2) print("I valori di latitudine inseriti per il punto: ", nome) print(lat_g, "° ", lat_p, "' ", lat_s, "'' ", "di Latitudine ", GPSLatitudeRef, sep="") print() vuote(3) # ----------------------- Inserimento dei riferimenti e dei valori delle coordinate geografiche (longitudine) ----------- print("Valori di Longitudine") print() GPSLongitudeRef = input("Inserisci il riferimento della Longitudine; O=Ovest E=Est: ") GPSLongitudeRef = GPSLongitudeRef.upper() while GPSLongitudeRef not in ("E", "O"): print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() GPSLongitudeRef = input("Inserisci E per Est oppure O per Ovest: ") GPSLongitudeRef = GPSLongitudeRef.upper() # Questo ciclo permette l'inserimento dei gradi di longitudine e ne controlla che lo stesso sia all'interno di un range e che sia un numero e non una lettera while True: try: lon_g = int(input("Inserisci i gradi di longitudine; con un valore compreso tra 0 e 180: ")) while lon_g not in range (181): print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() lon_g = int(input("Inserisci i gradi di latitudine; con un valore compreso tra 0 e 180: ")) break except ValueError: print("\033[36m ATTENZIONE --- Valore non consentito --- Inserisci solo numeri da 0 a 180 --- ATTENZIONE\033[0m") print() # Questo ciclo permette l'inserimento dei primi di longitudine e ne controlla che lo stesso sia all'interno di un range e che sia un numero e non una lettera while True: try: lon_p = int(input("Inserisci i primi (o minuti) di longitudine; con un valore compreso tra 0 e 59: ")) while lon_p not in range (60): print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() lon_p = int(input("Inserisci i primi (o minuti) di longitudine; con un valore compreso tra 0 e 59: ")) break except ValueError: print("\033[36m ATTENZIONE --- Valore non consentito --- Inserisci solo numeri da 0 a 59 --- ATTENZIONE\033[0m") print() # Questo ciclo permette l'inserimento dei secondi di longitudine e controlla che lo stesso sia all'interno di un range e che sia un numero e non una lettera while True: try: lon_s = float(input("Inserisci i secondi di latitudine; con un valore compreso tra 0 e 59.9: ")) while lon_s < 0 or lon_s > 59.9: print("\033[36m ATTENZIONE --- Valore non consentito --- ATTENZIONE\033[0m") print() lon_s = float(input("Inserisci i secondi di latitudine; con un valore compreso tra 0 e 59.9: ")) break except ValueError: print("\033[36m ATTENZIONE --- Valore non consentito --- Inserisci solo numeri da 0 a 59.9 --- ATTENZIONE\033[0m") print() # ----------------------- Fine inserimento tramite input dei riferimenti e dei valori delle coordinate geografiche -------- # ####################### Elaborazione dei parametri inseriti ############################################################# # Assegnazione di Nord e 1 per N --- Sud e -1 per S # La regola: N (North, Nord) = + , S (South, Sud) = - if GPSLatitudeRef == "S": lat_ref_esteso,lat_ref = "Sud",-1 else: lat_ref_esteso,lat_ref = "Nord",1 # Assegnazione di Est e 1 per E --- Ovest e -1 per O # La regola: E (East, Est) = + , W (West, Ovest) = - if GPSLongitudeRef == "O": lon_ref_esteso, lon_ref = "Ovest", -1 else: lon_ref_esteso, lon_ref = "Est", 1 # Conversione dei primi e secondi in primi lat_primi = lat_p+(lat_s/60) lon_primi = lon_p+(lon_s/60) # Conversione da Gradi Primi e Secondi in Gradi GPSLatitude = lat_g+((lat_p+(lat_s/60))/60) GPSLongitude = lon_g+((lon_p+(lon_s/60))/60) # Conversione da Gradi Primi e Secondi in Gradi non valore negativo se Sud e/o Ovest latitudine = GPSLatitude*lat_ref longitudine = GPSLongitude*lon_ref lat_str = str(latitudine) lon_str = str(longitudine) # Conversione in stringa NMEA # La latitudine viene espressa con 2 cifre che indicano i gradi e con 2 cifre e 4 decimali per i minuti: # 4536.8373,N va letta come 45° 36.8373' N # La longitudine viene espressa con 3 cifre che indicano i gradi e con 2 cifre e 4 decimali per i minuti: # 00857.6712,E va letta come 8° 57.6712' E # Stringa NMEA per la Latitudine # Dichiarazione delle variabili nmea_lat_g = str(lat_g) conta_lat_g = len(nmea_lat_g) nmea_lat_p = str(lat_p) conta_lat_p = len(nmea_lat_p) lat_p_dec = str(round (lat_s/60, 4)) conta_lat_dec = len(lat_p_dec) # Fine della dichiarazione delle variabili if conta_lat_g < 2: nmea_lat_g = "0"+nmea_lat_g if conta_lat_p < 2: nmea_lat_p = "0"+nmea_lat_p # La stringa NMEA prevede che i decimali dei primi siano 4, in precedenza abbiamo trasformato la variabile lat_p_dec in stringa (es. 0.3957) ma, a noi servono solo # i 4 valori dopo la virgola, questo ciclo while conta tutti i caratteri nella stringa quindi anche lo 0 e il . e aggiunge uno 0 in fondo alla striga fino a quando # conta_lat_dec è minore di sei; una stringa 0.75 diventerà 0.7500 while conta_lat_dec < 6: lat_p_dec = lat_p_dec+"0" conta_lat_dec = len(lat_p_dec) lat_p_dec = lat_p_dec[-4:] nmea_lat = nmea_lat_g + nmea_lat_p + "." + lat_p_dec + "," + GPSLatitudeRef # Stringa NMEA per la Longitudine # Dichiarazione delle variabili nmea_lon_g = str(lon_g) conta_lon_g = len(nmea_lon_g) nmea_lon_p = str(lon_p) conta_lon_p = len(nmea_lon_p) lon_p_dec = str(round (lon_s/60, 4)) conta_lon_dec = len(lon_p_dec) # Fine della dichiarazione delle variabili while conta_lon_g < 3: nmea_lon_g = "0"+nmea_lon_g conta_lon_g = len(nmea_lon_g) if conta_lon_p < 2: nmea_lon_p = "0"+nmea_lon_p while conta_lon_dec < 6: lon_p_dec = lon_p_dec+"0" conta_lon_dec = len(lon_p_dec) lon_p_dec = lon_p_dec[-4:] # Assegnazione nuove variabili NMEA per utilizzarle in print e per il file coordinate.db nmea_lon = nmea_lon_g + nmea_lon_p + "." + lon_p_dec + ","+GPSLongitudeRef nmea = nmea_lat_g + nmea_lat_p + "." + lat_p_dec + "," + GPSLatitudeRef + "," + nmea_lon_g + nmea_lon_p + "." + lon_p_dec + ","+GPSLongitudeRef # ############################### Print dei valori inseriti ed elaborati #################################################### pulisci() print() print(">"*26, "Le coordinate inserite sono", "<"*26) print() print("Notazione di: gradi, primi (minuti) e i secondi, DMS (Degrees, Minutes, Seconds)") print() print(lat_g, "° ", lat_p, "' ", lat_s, "'' ", "di Latitudine ", lat_ref_esteso, "\t", "--", "\t",lon_g, "° ", lon_p, "' ", lon_s, "'' ", "di Longitudine ", lon_ref_esteso, sep="") print() print("Con orientamento medio", GPSMapDatum, "e con meridiano fondamentale", Meridiano,"\nLe conversioni manterranno lo stesso orientamento e lo stesso meridiano") vuote(2) print("-"*13, "Conversione da Gradi Primi e Secondi in Gradi e Primi", "-"*13) print() print("Con i decimali dei minuti abbiamo la notazione DM (Degrees, Decimal Minutes)") print() print(lat_g, "° ", round(lat_primi, 7), "' ", "di Latitudine ", lat_ref_esteso, "\t", "--", "\t", lon_g, "° ", round(lon_primi, 7), "' ", "di Latitudine ", lon_ref_esteso, sep="") print() print("-"*17, "Conversione da Gradi Primi e Secondi in Gradi", "-"*17) print() print("Con i decimali di grado abbiamo la notazione DD (Decimal Degrees)") print() print(round(GPSLatitude, 7), "° ", "di Latitudine ", lat_ref_esteso, "\t", "--", "\t", round(GPSLongitude, 7), "° ", "di Longitudine ", lon_ref_esteso, sep="") print() print("-"*29, "Coordinate per il Web", "-"*29) print() print(round(latitudine, 7),",",round(longitudine,7), sep="") print() print("-"*2, "Conversione in stringa NMEA 0183 (National Marine Electronics Association)", "-"*2) print() print(nmea) print() print("-"*8, "Conversione per il programma di fotoelaborazione digiKam)", "-"*8) print() print(lat_str.replace(".",","), "\t", "--", "\t", lon_str.replace(".",",")) vuote(2) # ##################################### Gestione del file coordinate.db ################################################ # Questa porzione del codice, crea e scrive un data base SQL con estensione .db # Dichiero le variabili g_p_s = str(lat_g) + "° " + str(lat_p) + "' " + str(lat_s) + "'' " + lat_ref_esteso + " ed " + str(lon_g) + "° " + str(lon_p) + "' " + str(lon_s) + "'' " + lon_ref_esteso g_p = str(lat_g) + "° " + str(round(lat_primi, 7)) + "' " + lat_ref_esteso + " ed " + str(lon_g) + "° " + str(round(lon_primi, 7)) + "' " + lon_ref_esteso g = str(round(GPSLatitude, 7)) + "° " + lat_ref_esteso + " ed " + str(round(GPSLongitude, 7)) + "° " + lon_ref_esteso la_lo = lat_str + "," + lon_str digikam = lat_str.replace(".",",") + " ed " + lon_str.replace(".",",") url = "https://www.google.com/maps/preview?q=" + la_lo # Creo il dizionario per l'inserimento delle variabili vella tabella bindings = {"NOME":nome, "DESCRIZIONE":descrizione, "GRADI_PRIMI_SECONDI":g_p_s, "GRADI_PRIMI":g_p, "GRADI":g, "WEB":la_lo, "NMEA":nmea, "DIGIKAM":digikam, "URL":url, "MapDatum":GPSMapDatum, "MERIDIANO":Meridiano} # Con questa istruzione controllo che il file coordinate.db non esiste e se è vera lo creo e inserisco le variabili if not os.path.isfile('coordinate.db'): conn = sqlite3.connect('coordinate.db') print("Il database coordinate.db è stato creato con successo") conn.execute('''CREATE TABLE t_coordinate (NOME TEXT NOT NULL, DESCRIZIONE TEXT NOT NULL, GRADI_PRIMI_SECONDI TEXT NOT NULL, GRADI_PRIMI TEXT NOT NULL, GRADI TEXT NOT NULL, WEB TEXT NOT NULL, NMEA TEXT NOT NULL, DIGIKAM TEXT NOT NULL, URL TEXT NOT NULL, MapDatum TEXT NOT NULL, MERIDIANO TEXT NOT NULL);''') print() print("La tabella t_coordinate è stata creata con successo") print() conn = sqlite3.connect('coordinate.db') # Inserisco i valori nella tabella conn.execute(""" insert into t_coordinate (NOME, DESCRIZIONE, GRADI_PRIMI_SECONDI, GRADI_PRIMI, GRADI, WEB, NMEA, DIGIKAM, URL, MapDatum, MERIDIANO) values (:NOME, :DESCRIZIONE, :GRADI_PRIMI_SECONDI, :GRADI_PRIMI, :GRADI, :WEB, :NMEA, :DIGIKAM, :URL, :MapDatum, :MERIDIANO)""",bindings) print("I valori sono stati inseriti correttamente nel data base coordinate.db") print() conn.commit() conn.close() # ################################################ Apre Google maps alle coordinate scritte ###################################### try: sito = urllib.request.urlopen(url) webbrowser.open(url) except socket.gaierror: print("\033[36m ATTENZIONE --- Sito internet o connessione non disponibile --- ATTENZIONE\033[0m") print() except urllib.error.URLError: print("\033[36m ATTENZIONE --- Sito internet o connessione non disponibile --- ATTENZIONE\033[0m") print() except ValueError: print("\033[36m ATTENZIONE --- Sito internet o connessione non disponibile --- ATTENZIONE\033[0m") print()
_______________________________________________ Python mailing list Python@lists.python.it http://lists.python.it/mailman/listinfo/python