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.
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.
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.
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: Spiegazione dettagliata del comando
Per eseguire in Windows il comando descritto è necessario installare il pacchetto (OSGeo4W).
Diversamente dalla procedura descritta sul sito (e per evitare di installare software non necessari allo scopo), consiglio di seguire le seguenti istruzioni:
http://download.osgeo.org
> Avanticd
(qui alcune info in più)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*
Qui di seguito provo a descrivere nel dettaglio cosa fa il comando.
&&
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*
ogr2ogr
: chiama il pacchetto ogr2ogrfile_first12_FID.shp
è il nuovo file in output contenente il nuovo campo FIDfile_first12.shp
è lo shapefile originale-sql
dice che la seguente espressione contenuta tra virgolette “
è un'istruzione SQLSELECT
) 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)
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”
-f “ESRI Shapefile”
dice che i successivi file in input sono di tipo ESRI shapefile-overwrite
sovrascrive il file di output, se presenteoutput.shp
è il file in outputfile_first12_FID.shp
è il file principale, verso cui si fa il join-sql
dice nuovamente che la seguente espressione contenuta tra virgolette ”
è un'istruzione SQLLEFT JOIN 'file_last12_FID.dbf'.file_last12_FID ON file_first12_FID.FID4JOIN = file_last12_FID.FID4JOIN
)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)