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
[email protected]
http://lists.python.it/mailman/listinfo/python