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

Rispondere a