====== Linee di navigazione ====== Uno degli output previsti nel flusso di elaborazione dei dati multibeam in CARIS è l'esportazione delle linee di navigazione in shapefiles. Il codice che identifica nello shapefile le singole linee è composto di 24 caratteri. ===== Problema: duplicazione shapefile in CARIS ===== Il problema è che (per qualche ragione a me sconosciuta) CARIS richiede di salvare 2 shapefiles, uno con il campo "//Source"// contenente le prime 12 cifre dell'identificativo della linea, e un secondo shapefile che nel campo "//Source//" contiene le ultime 12 cifre. Se ho capito bene, la procedura attuale prevede di aprire i //dbf// dei due shapefiles, copiare il contenuto delle due colonne //Source// in un foglio di calcolo che in una terza colonna concatena le stringhe dei 2 campi nei 24 richiesti, ricopiare tale colonna in uno dei due file originali, cancellare l'altro shapefile. ===== Soluzione con ogr2ogr in Linux ===== Per automatizzare la procedura attraverso l'utilizzo di un solo comando ho utilizzato il pacchetto **ogr2ogr **(http://www.gdal.org/ogr2ogr.html). Il seguente comando, lanciato da terminale (in ambiente Linux) all'interno della cartella contenente i due shapefile di input (**file_first12** e **file_last12**), permette di ottenere in output un file (**output.shp**) contenente nel campo //Source// tutti il 24 caratteri richiesti. ==== Comando completo ==== ''ogr2ogr file_first12_FID.shp file_first12.shp -sql "SELECT *, FID AS FID4JOIN FROM file_first12" && ogr2ogr file_last12_FID.shp file_last12.shp -sql "SELECT *, FID AS FID4JOIN FROM file_last12" && ogr2ogr -f "ESRI Shapefile" -overwrite output.shp file_first12_FID.shp -sql "SELECT Key, Feature, CONCAT(file_first12_FID.Source, substr(file_last12_FID.Source,5)) AS Source, Theme, Length, MinZ, MaxZ FROM file_first12_FID LEFT JOIN 'file_last12_FID.dbf'.file_last12_FID ON file_first12_FID.FID4JOIN = file_last12_FID.FID4JOIN" && rm *_FID*'' Maggiori informazioni sul significato dei singoli comandi qui: [[batimetrielagunave:lineenavigazione#spiegazione_dettagliata_del_comando|Spiegazione dettagliata del comando]] ===== Utilizzo in Windows ===== Per eseguire in Windows il comando descritto è necessario installare il pacchetto ([[http://trac.osgeo.org/osgeo4w/|OSGeo4W]]). Diversamente dalla procedura descritta sul sito (e per evitare di installare software non necessari allo scopo), consiglio di seguire le seguenti istruzioni: * dopo aver scaricato la versione a [[http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86.exe|32bit]] o [[http://download.osgeo.org/osgeo4w/osgeo4w-setup-x86_64.exe|64bit]] * lanciare il file .exe * scegliere //Advanced Install// > Avanti * //Install from Internet// > Avanti * lasciare le impostazioni di Default > Avanti * lasciare le impostazioni di Default > Avanti * lasciare le impostazioni di Default > Avanti * selezionare ''http://download.osgeo.org'' > Avanti * selezionare in **Libs** il pacchetto **gdal** come da immagine sottostante {{:batimetrielagunave:gdal.png?800|}} * Avanti * Attendere il download e l'installazione dei pacchetti * per lanciare la shell cliccare sull'icona **OSGeo4W Shell** che dovrebbe essere presente ora sul Desktop * altrimenti, se non è presente alcuna icona sul desktop, basta lanciare **OSGeo4W.bat** da C:\OSGeo4W64 * nella finestra del terminale è necessario spostarsi nella cartella contenente gli shapefile originali da unire, utilizzando il comando ''cd'' ([[http://comandi-dos-e-altro.jimdo.com/i-comandi-dos/cd-o-chdir|qui]] alcune info in più) * il comando è leggermente modificato rispetto a quello in Linux, modificando l'ultima istruzione che rimuove i file di passaggio da ''rm *_FID*'' in ''del *_FID*''. Risulterà quindi il seguente: ''ogr2ogr NAV_XX_WEEK_first12_FID.shp NAV_XX_WEEK_first12.shp -sql "SELECT *, FID AS FID4JOIN FROM NAV_XX_WEEK_first12" && ogr2ogr NAV_XX_WEEK_last12_FID.shp NAV_XX_WEEK_last12.shp -sql "SELECT *, FID AS FID4JOIN FROM NAV_XX_WEEK_last12" && ogr2ogr -f "ESRI Shapefile" -overwrite NAV_XX_WEEK.shp NAV_XX_WEEK_first12_FID.shp -sql "SELECT CONCAT(NAV_XX_WEEK_first12_FID.Source, SUBSTR(NAV_XX_WEEK_last12_FID.Source,5)) AS Source, Length FROM NAV_XX_WEEK_first12_FID LEFT JOIN 'NAV_XX_WEEK_last12_FID.dbf'.NAV_XX_WEEK_last12_FID ON NAV_XX_WEEK_first12_FID.FID4JOIN = NAV_XX_WEEK_last12_FID.FID4JOIN" && del *_FID*'' * in un editor di testo basterà sostituire nel comando le "XX" con il numero di settimana corrispondente ===== Spiegazione dettagliata del comando ===== Qui di seguito provo a descrivere nel dettaglio cosa fa il comando. * nel codice qui sopra sono in realtà presenti 3 chiamate distinte a ogr2ogr, concatenate tra loro in un unico flusso di esecuzione tramite l'operatore ''&&'' * i primi 2 comandi sono ''ogr2ogr file_first12_FID.shp file_first12.shp -sql "SELECT *, FID AS FID4JOIN FROM file_first12"'' e ''ogr2ogr file_last12_FID.shp file_last12.shp -sql "SELECT *, FID AS FID4JOIN FROM file_last12"''. Lo scopo è di creare, per ciascuno dei file in input, un nuovo shapefile, uguale a quello di partenza, con in più un campo //FID4JOIN//. Questo campo contiene i //FID //(//Feature ID//) dello shapefile, cioè gli identificativi che automaticamente vengono creati negli shapefile per identificare automaticamente in modo univoco ogni record. I //FID// servono successivamente nel comando per effettuare il JOIN tra i due shapefile. Tali identificativi sono "nascosti" nei dbf e, poiché la successiva istruzione SQL nel JOIN usa un file dbf, ho dovuto come prima cosa creare 2 shapefile che contengono esplicitamente (quindi anche nei dbf) un campo contenente il //FID//. Questi due shapefile "di passaggio" vengono cancellati alla fine del comando globale tramite ''rm *_FID*'' * entrando nel dettaglio dei comandi precedenti, ''ogr2ogr'': chiama il pacchetto ogr2ogr * ''file_first12_FID.shp'' è il nuovo file in output contenente il nuovo campo //FID// * ''file_first12.shp'' è lo shapefile originale * ''-sql'' dice che la seguente espressione contenuta tra virgolette ''"'' è un'istruzione SQL * l'istruzione seleziona (''SELECT'') e quindi restituisce in output, tutti i campi presente nel file originale (''*'') e in più anche il campo ''FID'', che viene rinominato in ''FID4JOIN'' (perché sarà usato in funzione del JOIN successivo) * a questo punto abbiamo due nuovi shapefile **file_first12_FID.shp** e **file_last12_FID.shp** che verranno usati nel comando successivo ''ogr2ogr -f "ESRI Shapefile" -overwrite output.shp file_first12_FID.shp -sql "SELECT Key, Feature, CONCAT(file_first12_FID.Source, substr(file_last12_FID.Source,5)) AS Source, Theme, Length, MinZ, MaxZ FROM file_first12_FID LEFT JOIN 'file_last12_FID.dbf'.file_last12_FID ON file_first12_FID.FID4JOIN = file_last12_FID.FID4JOIN"'' * di nuovo viene chiamato il comando ogr2ogr * il parametro ''-f "ESRI Shapefile"'' dice che i successivi file in input sono di tipo //ESRI shapefile// * ''-overwrite'' sovrascrive il file di output, se presente * ''output.shp'' è il file in output * ''file_first12_FID.shp'' è il file principale, verso cui si fa il join * ''-sql'' dice nuovamente che la seguente espressione contenuta tra virgolette ''"'' è un'istruzione SQL * l'istruzione SQL fa un JOIN tra il file //file_first12_FID.shp// e il file //file_last12_FID.dbf //usando il campo univoco //FID4JOIN// presente in entrambi i file (istruzione ''LEFT JOIN 'file_last12_FID.dbf'.file_last12_FID ON file_first12_FID.FID4JOIN = file_last12_FID.FID4JOIN'') * il ''SELECT'' crea uno shapefile contenente tutti i campi originali (Key, Feature, Source, Theme, Length, MinZ, MaxZ) con //Source //che però contiene l la concatenazione (''CONCAT'') dei due campi //Source //originari. In realtà dal secondo campo viene estratta una stringa a partire dal 5° carattere tramite il comando ''substr(nomeFile.campo,5)''