Guida App in Python che automatizza il download di dati geospaziali da Natural Earth (Windows)

Netcat

Helper
17 Gennaio 2022
526
145
383
716
Questo progetto all'inizio lo avevo pensato come plugin da integrare direttamente in QGIS (dato che la piattaforma è open source), ma dato che l'interpreter di Python di QGIS ha delle limitazioni che non mi andava di affrontare, ho creato uno script indipendente testato con successo usando Python 3.12 (ma anche versioni leggermente più datate di Python dovrebbero andar bene) che si collega al sito di Natural Earth e scarica dei file pubblicamente accessibili contenuti nelle repository del sito, precisamente: dati vettoriali e raster, a diverse scale geografiche. Questi dati ovviamente, possono essere importati in QGIS a scopo didattico, ma anche utili per ingegneri pigri che vogliono iniziare a lavorare su progetti GIS senza dover partire da zero.

In questa .zip sono inclusi il file .py originale (codice del programma) che dovrà essere eseguito attraverso Python 3.12 (Windows di base non cel'ha purtroppo), e per funzionare richiederà le dipendenze requests beautifulsoup4 tqdm, che possono essere installate singolarmente attraverso il comando pip install.

Comunque, per ragioni di comodità nella cartella ho incluso un PE compilato dal source code attraverso Pyinstaller, compatibile con qualsiasi Windows 10 dotato di processore AMD64. Questo PE vi permetterà di ottenere accesso alle funzioni dell'app senza dover installare Python 3.12 o altre dipendenze, con l'unico difetto che dovrete testarlo su VMware o VirtualBox per assicurarvi che sia pulito (alcune persone molto stupide hanno compilato dei malware con Pyinstaller dimenticandosi di proteggerli con un packer: come risultato gli antivirus stanno segnalando come "sospette" tutte le app generate con Pyinstaller. In particolare Avast genera falsi positivi). Tecnicamente il PE è pulito, ma dato che sono uno sconosciuto qua chiunque è legittimato ad avere sospetti.

Passiamo ora alla parte tecnica, cioè a descrivere in modo granulare cosa fa la routine di quest'app:

  • All'apertura, l'app invierà una richiesta HTTP con un User-Agent specifico per ottenere e stampare a schermo le generalità del sito web e verificare l'autenticità della fonte;
  • Viene proposta una lista comprendente 4 sample da scaricare dal sito, specificandone il peso, espresso in MegaByte (MB), e l'utente deve scegliere quale scaricare;
  • Una volta scelto il sample, tqdm gioca la sua parte qua, mostrando una barra d'avanzamento per il download;
  • Al termine del download, lo script individua la cartella "Downloads" tramite la variabile %userprofile% presente in Windows, ci salva il file, e poi apre la cartella con il file scaricato e pronto all'uso in faccia all'user. Viene sfruttata una syscall attraverso il modulo subprocess per questo;
Per lo scaricamento del sample "Prisma Shaded Relief" è successo qualcosa di strano ma l'ho risolto facendoglielo scaricare con un altro metodo. Praticamente appariva che la sezione del sito contenente Prisma Shaded Relief usasse "più sicurezza" rispetto alle altre sezioni, quindi per effettuare il download serviva emulare più fedelmente il comportamento di un browser, altrimenti il download falliva. Per fare questo, oltre al parametro "User-Agent", ho dovuto specificare "Accept", "Accept-Language", "Referef", e "Upgrade-Insecure-Requests", oltre che a dover ridefinire la barra di scaricamento a causa di un altro bug. Queste modifiche al punto finale hanno causato una Traceback alla riga 123 perché avrei dovuto modificare altri parametri in accordo, ma per fortuna era innoqua, consentendomi di completare l'app con successo.

Lo scopo di quest'app è quello di rilevare un sito che offre sample di dati geospaziali già pronti, ottimizzando ulteriormente i tempi di lavoro degli analisti o dei docenti.

In allegato, la ZIP (NearthQGIS.zip) contenente il source code + PE (.exe) + specs.txt (contenente le dipendenze da installare in caso si scelga di eseguire direttamente il source code piuttosto che il PE): https://github.com/Admin9961/QGIS_automation

Da come potete intuire, l'app funziona solo per Windows (anche dal fatto che sfrutta la variabile %userprofile% per gestire il download, utilizzabile solo su Windows) e non pianifico di rilasciare una versione per Unix perché non è il mio main OS. In quel caso comunque basterebbe lanciare direttamente il .py dopo aver installato le dipendenze indicate, e ridefinire il metodo usato per scaricare e salvare i file.
 
  • Mi piace
Reazioni: Valley
Oltre a "USERPROFILE" devi sostituire anche "explorer"
Python:
    #downloads_path = os.path.join(os.environ['USERPROFILE'], 'Downloads')
    downloads_path = os.path.join(os.environ['HOME'], 'Downloads')

    # subprocess.run(['explorer', downloads_path])
    subprocess.run(['xdg-open', downloads_path])

Ha scaricato tutto
 
  • Grazie
Reazioni: Netcat
Oltre a "USERPROFILE" devi sostituire anche "explorer"
Python:
    #downloads_path = os.path.join(os.environ['USERPROFILE'], 'Downloads')
    downloads_path = os.path.join(os.environ['HOME'], 'Downloads')

    # subprocess.run(['explorer', downloads_path])
    subprocess.run(['xdg-open', downloads_path])

Ha scaricato tutto
Sembra essere una variante per Unix... Su Unix puoi risparmiarti di usare lo script usando direttamente wget [URL] o curl URL --output example.shp
In alcuni casi hai bisogno di aggiungere il flag --no-check-certificate.
Su Windows, sembrerebbe che l'interprete di Python incorporato in QGIS non riesca ad interfacciarsi con Powershell di default, altrimenti lo sviluppo dello script sarebbe stato più semplice. Non la invoca nemmeno se è nel PATH di default, infatti se scrivi os.system("powershell.exe") ti restituisce 1, e poi esce. CMD lo fa, Powershell no. Capisco che Powershell è abusabile per diramare attacchi informatici "fileless", ma abbiamo AMSI, gli EDR, boh.. Bastava una syscall con Invoke-Webrequest e il gioco era fatto (ma son dettagli ormai)
 
Ultima modifica:
Si ok ma mi ero limitato a convertire quelle due righe.
La cosa mi ha incuriosito è ho scritto un plugin per qgis. Devi fare install from zip ma forse lo sai già. Il pulsante del plugin lo trovi in alto a destra
Provato su windows 11 e Linux. Spero possa esserti utile
 

Allegati

  • qgis_natural_earth.zip
    8.3 KB · Visualizzazioni: 2
  • qgis_linux.png
    qgis_linux.png
    361.1 KB · Visualizzazioni: 3
  • qgis_natural.png
    qgis_natural.png
    193.1 KB · Visualizzazioni: 3
  • Mi piace
Reazioni: Netcat
Avevo pubblicato un .py indipendente da QGIS e pre-compilato in un .exe proprio perché non ho ancora molta familiarietà con i plugin e pythonQGIS, grazie per le risorse, ne terrò in conto. Se scarichi quell'.exe riceverai anche uno strike da Smartscreen perché la tecnica di developing che ho usato è rude e aggressiva, anche se di fatto non c'è alcun malware (python3.12 => pyinstaller => .exe senza firme digitali). L'unico vantaggio è la comodità, l'exe lo puoi tenere sul desktop senza aprire QGIS e ti colleghi a Natural Earth in 2 click.
 
  • Mi piace
Reazioni: Metal203