====== Conversione da shapefile a GPX ====== Il formato [[wpit>Shapefile]] è ovviamente superiore al [[wp>GPX (Data transfer)|GPX]], però questa conversione può tornare utile ad esempio per caricare in [[http://josm.openstreetmap.de/|JOSM]] uno shapefile da usare come base per il disegno. Questa ricetta **funziona solo per la conversione di uno shapefile di tipo line**, per quelli di tipo **polygon** ci vuole un po' di pre-processing ad esempio in GRASS. FIXME La cosa più importante da scoprire è il **sistema di riferimento** utilizzato nello shape, per la cartografia italiana è abbastanza consueto trovare il **[[wpit>Proiezione di Gauss-Boaga|Gauss-Boaga Roma40]]**. Per avere questa informazione si deve ricorrere alla documentazione che dovrebbe accompagnare lo shapefile. Esiste il programma **[[http://gpx2shp.sourceforge.jp/|gpx2shp]]**, ma contrariamente a quelle che si legge sulla home page non consente la trasformazione inversa (**shp2gpx**). ===== Da riga di comando ===== Nell'esempio che segue si converte uno **shapefile Roma40** in un file **GPX WGS84**. Lo shapefile originale è composto da tre file: **VX.dbf**, **VX.shp** e **VX.shx**. Il primo programma da utilizzare è **ogr2ogr**. La home page del programma è **[[http://www.gdal.org/|www.gdal.org]]**, mentre Debian lo fornisce nel pacchetto **[[http://packages.debian.org/lenny/gdal-bin|gdal-bin]]**. Purtroppo per la conversione da Roma40 a WGS84 è necessario dare ad ogr2ogr un parametro un po' complicato; si tratta del parametro di correzione per la libreria [[http://proj.maptools.org/|PROJ]], usata da ogr2ogr. Per comodità lo scriviamo in un file di nome **roma40.srs**, mettendo **tutto su una riga sola**: +proj=tmerc +lat_0=0 +lon_0=9 +k=0.999600 +x_0=1500000 +y_0=0 +ellps=intl +units=m +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 Possiamo eseguire la riproiezione con il comando: ogr2ogr -f "ESRI Shapefile" -s_srs "roma40.srs" -t_srs "EPSG:4326" wgs84_shp VX.shp Nella directory **wgs84_shp** troveremo il nuovo shapefile nel sistema di riferimento WGS84 (identificato dal codice EPSG 4326). Adesso si usa il programma **[[http://gpsbabel.sourceforge.net/|GPSBabel]]** per convertire da shapefile a GPX. Il comportamento predefinito di GPSBabel sarebbe quello di convertire le linee dello shape in **rotte** GPX, noi invece vogliamo delle **tracce**, ecco il motivo dei due parametri **transform**: cd wgs84_shp gpsbabel -i shape -f VX -x transform,trk=rte -x nuketypes,routes -o gpx -F VX.gpx ===== Con QGIS e GRASS ===== Procedura decisamente più complessa, utile però a capire un po' la logica dell'accoppiata QGIS+GRASS. ==== Logica dei passaggi ==== - Aprire lo shapefile in QGIS e attribuire il sistema di riferimento giusto (Roma40). - Creare un mapset GRASS Roma40 e importare lo shape da QGIS. - Creare un mapset GRASS WGS84 e importare (riproiettando) il layer GRASS Roma40. - Esportare il layer GRASS in formato shapefile. - Usare GPSBabel per convertire da shapefile a GPX. ==== Dettaglio ==== FIXME Controllare e risistemare! - QGIS, menu //File//, //Nuovo progetto//. - Dal menu //Impostazioni//, //Proiezione personalizzata// definire una proiezione di nome //Gauss-Boaga Roma40// con i parametri che abbiamo visto nel paragrafo precedente (file roma40.srs). - Riavviare QGIS per far rileggere l'elenco delle proiezioni. - Menu //Plugin//, //GRASS//, //Nuovo mapset//. * Il database di solito è **$HOME/grass**. * Creare una nuova location: **osm_arezzo_roma40** * Selezionare una prioezione: **//User defined Gauss-Boaga Roma40//** * Selezionare una regione: **Italy** * Dare un nome al mapset: **arezzo** * Il mapset appena creato dovrebbe diventare quello in uso, altrimenti usare: //Plugin//, //GRASS//, //Apri mapset//. - Aggiungere in QGIS lo shapefile originale col pulsante //Aggiungi un layer vettoriale//. In //Proprietà// del layer (click destro), //Generale//, //Sistema di Riferimento Spaziale// scegliere **//User defined Gauss-Boaga Roma40//**. - Importare lo shapefile in GRASS; dal pulsante //Apri strumenti GRASS// avviare il modulo //File//, //Import//, //Import vector//, //**v.in.ogr** (Import OGR/PostGIS vector layer)//. * Indicare come origine il layer appena aggiunto in QGIS. * Indicare il nome che questo layer avrà in GRASS, es: **VX_GRASS_Roma40**. - Creare un altro mapset: menu //Plugin//, //GRASS//, //Nuovo mapset//. * Location: **osm_arezzo_wgs84** * Proiezione **WGS84** (EPSG 4326) * Selezionare una regione: **Italy** * Dare un nome al mapset: **arezzo** * Il mapset appena creato dovrebbe diventare quello in uso. - Convertire il layer vettoriale GRASS da una location all'altra; dal pulsante //Apri strumenti GRASS// avviare il modulo //Vector//, //Develop map//, //Geometry management//, //Reproject vector from another location//, **//v.proj//**: * Name of input vector map: VX_GRASS_Roma40 * Path to GRASS database of input location: $HOME/grass/ * Location containing input vector map: osm_arezzo_roma40 * Mapset containing input vector map: arezzo * Name of output vector map: VX_GRASS_WGS84 - Esportare il layer GRASS in formato shapefile: v.out.ogr input=AO2k_line type=line dsn=AO2k_line_shp olayer=AO2k_line_shp layer=1 format=ESRI_Shapefile ====== Conversione di coordinate ====== Per una semplice conversione di coordinate si può utilizzare il comando **''cs2cs''** fornito dal pacchetto **proj**. Questo esempio converte una coppia di coordinate dal sistema **EPSG:3003** (Monte Mario, Italy zone 1 - Roma40) al sistema **EPSG:4326** (WGS84). La cosa è resa complicata perché la definizione di EPSG:3003 fornita da Proj non include i parametri di trasformazione verso WGS84, che vanno quindi aggiunti a mano: echo "1674257 4846294" | cs2cs \ +init=epsg:3003 \ +towgs84=-104.1,-49.1,-9.9,0.971,-2.917,0.714,-11.68 \ +to +init=epsg:4326 -f "%.8f" 11.16398206 43.74906364 45.83517126 Il comando restituisce una terna di numeri (le coordinate **//x//**, **//y//** e **//z//**), cioè anche l'altezza.