venerdì 22 aprile 2016

QGIS e la cancellazione di una feature in uno shapefile.



Nota per chi utilizza il software GIS GFOSS QGIS.
Stare parecchio attento se si usa il formato esri-shapefile e editando uno shapefile si esegue una operazione di cancellazione.
Questo perche' in realta' QGIS NON CANCELLA il record, ma bensi' lo marca (con una operazione che non e' prevista dallo standard shapefile) come una forma di cancellazione virtuale o logica.
Il che vuol dire che il record non e' realmente cancellato, ma solo MARCATO come fosse cancellato.

Dopo aver marcato il record "cancellato", QGIS non mostra piu' tale record facendo credere all'utente che il record sia stato effettivamente cancellato.

Una volta che viene chiusa la sessione di editing e committato il risultato salvando sullo shapefile le modifiche.
Loshapefile che ne risulta sara' uno shapefile in ui il record CANCELLATO e' ANCORA PRESENTE, solamente possiede un flag (assolutamente non previsto dallo standard shapefile) che lo segna come fosse cancellato.
Purtroppo questo flag di cancellazione e' noto solo a QGIS, per cui se si riaprisse lo shapefile con qgis non si vedrebbe il record cancellato.
Pero' se si apre il medesimo shapefile con un altro software GIS, commerciale o gfoss si vedra'ricomparire il record cancellato come se mai lo fosse stato.

Questo e' un comportamento molto rischioso perche', come ho detot , e' un comportamento fuori standard e se lo shapefile gestito con qgis viene fatto circolare e fornito a altri utenti che loro malgrado non usano qgis, vedrebbero ricomparire ati cancellati e considerarli buoni e validi.

E' facile capire come questo si presta a generare problemi e incomprensoni oltre a comportare dei seri problemi per chi adottasse qgis senza conoscere questa sua caratteristica.

Di seguito alcune immagini di esempio:



L'immagine sopra riportata rappresenta una selezione del dataset confini comunali di Regione Toscana scaricato dal suo sito Cartoteca.
Dopo averla scaricata la ho aggiunta a un progettoQGIS e poi mettendo lo shapefile in editing hocancellato un comune. Si nota infatto su QGIS il buco provocato sulla mappa dalla cancellazione eseguita.

Dopo aver fatto questo chiudo la sessione di editing confermando il salvataggio della nuova situazione e chiudo il QGIS.

Dopo diche se riapro lo shapefile sempre con QGIS vedro' che il buco della cancellazione e' sempre presente. E non mi sarei aspettato altrimenti, vistoche ho eseguito una cancellazione.
:)

Chiudo definitivamente QGIS e mi scaricoun altro software GIS sempre gfoss.
In questo secondo caso si tratta di gvSig un altro famoso software GIS gfoss.

Lo installo e dopo con esso riapro lo shapefile .

Il risultato che vedo e' riportato nella immagine seguente:





Come si puo' notare nella mappa il buco E' ASSENTE. Queto perche' e' ricomparso il  poligono che io avevo cancellato , o meglio che credevo di aver cancellato.

Come ulteriore riprova faccio ricorso a un famoso software GIS commerciale , si tratta del vecchio e glorioso Arcview 3.2.

Anche in questo caso, con il suddetto software GIS apro lo shapefile e visualizzo la mappa dei suoi poligoni e anche in questo caso il buco che dovrebbe esserci non e' presente.
Come si puo' vedere nella immagine seguente:


Da ua ricerca su internet e in particolare sul sito di QGIS risulta che su questa cosa qui ci sia un ticket aperto da svariati anni, ma che mai e' stato risolto.

Probabilmente  qualcuno lo considera una feature. Perche'magari e' considerato un pregio il fatto di avere una cancellazione virtuale.

Secondo me pero' un comportamento che porta fuori da uno standard non e' mai una feature, ma anzi e' una delle pratiche che spesso vengono censurate ccome "bad practice" proprio nel mondo floss a cui qgis vuole appartenere. Questo perche' alla fine produce degli shapefile che sono usabili solo con lui stesso e con nessun altro software.
va anche detto che QGIS e' un ottimo prodotto e considero questa cosa un inciampo di tale prodotto.
Certo il fatto che dopo svariati anni che alla ristretta cerchia degli sviluppatori di qgis questa cosa e' nota e che fin ad oggi questa cosa non era stata risolta ha sicuramente prodotto una serie di archivi che al'insaputa di chi li usava erano difatto fuori standard.

E' quindi importante che chi usava qgis sia messo al corrente dell'esistenza di questo bug.

Termino questa digressione  , fornendo una serie di workarounds per scansare questo problema.

Il primo e' quello di non usare il formato shapefile. Infatti e' un bug presente solo nel formato shapefile all'interno di qgis. Se ad esmepio si sceglie di usare un DBMS postgis il problema non sussiste.
Certo, non tutti sono esperti dbms e sono in grado id installarsi , gestirsi e impiegare un dbms postgres con espensione spaziale postgis. Per cui una soluzione piu' facile, rapida , econoica e altrettanto efficiente e' usare il formato spatialite  che e' basatosu un file unico che contiene un intero archivio geografico e come per il postgres con espesione postgis non soffre del problema della finta cancellazione che affligge lo shapefile.

Ne caso invece in cui per varie ragioni (il mondo e' vario e non sempre si puo' fare cio' che sarebbe meglio)  sisia costretti a usare il formato shapefile , la soluzione e' che al temrine del lavoro si esegua una esportazione tramite il comando "salva come..." (save as...).
Il comando Salva-Come viene usualmente impiegato per salvare un archivio geografico in  formati differenti e puo' sembrare strano impiegarlo per risalvare nel medesimo formato in cui l'archivio e' gia' presente. Ma e' proprio qui il workaround.
Infatti le prove effettuate dimostrano che durante la rigenerazione dell'archivio il QGIS poiche' filtra il record cancellato logicamente non lo trasferisce nel nuovo shapefile generato e quindi solo con questa soluzione si riesce ad avere uno shapefile in cui i dati cancellati SONO REALMENTE CANCELLATI.






E'  un po' macchinoso , ma preserva da problemi peggiori , specie se non ci accorge di questa cosa e si scopre solo dopo parecchio tempo che dati che si credevano cancellati erano invece ancora presenti e magari sono stati impiegati in elaborazioni successive compiute da altri soggetti.

Termino dicendo che questa cosa e' presente in parecchie versioni di qgis, non so' a quando risale la sua comparsa, ed e' presente fino alla versione 2.12.
Infatti con la versione 2.14 mi e' stato segnalato che il bug e'stato risolto.
Da una verifica effttuata confemro la sua scomparsa.
Ma i suoi problemi potrebbero permanere a lungo.
Infatti chi avesse ancora una versione installata di QGIS antecedente alla 2.14 oppure avesse archivi prodotti con una versione antecedente alla 2.14.
Cosa moltoprobabile vistoche la 2.14 e'uscita circa 2 mesi fa'. Molto probabilmente ha archivi difettati sui record cancellati.

E di conseguenza molti degli archivi che sono in circolo e che sono stati rpodotti con qgis sono in queste condizioni.

Analogamente il fatto che sia stato risolto non esime dal gestire questi problema.
Perche' ora ci sono a giro archivi con cancellazioni logiche che probabilmente andrebbero gestiti comunque dai softwares alternativi proprio per attenare i potenziali problemi che sorgenrebbero dall'avere usato una versione di qgis infesriore alla 2.14.
 
Buona fortuna.

Nessun commento: