Usando ogr2ogr per convertire tutti gli shapefile nella directory?


25

Ho una directory con diversi shapefile.

Come posso convertire tutti questi shapefile in MapInfo con ogr2ogr?

So come posso convertire un file. E posso creare uno script batch scrivendo una riga per ogni file. Ma non esiste un modo più semplice per convertire tutti i file in una directory (e sottodirectory).


Dipende dal sistema operativo. Fondamentalmente crea un ciclo "for", vedi gis.stackexchange.com/questions/7803/…
Mike T

Il sistema operativo è Windows 7. Provo questo nel prompt dei comandi: per% f in * .shp; do ogr2ogr -f File MapInfo $ f.tab. Ma questo non funziona. Viene visualizzato l'errore: "Impossibile aprire il datasour" $ f.tab "con i seguenti driver .....
Stefan,

Ecco come eseguire SHP su TAB: ogr2ogr -f "File MapInfo"% 1.tab% 1.shp. Ma a meno che OGR non sia in grado di riconoscere correttamente un file PRJ, si finisce facilmente con i file TAB con il coordsys sbagliato incorporato. Consiglio di utilizzare il traduttore universale integrato (FME ridimensionato), che può anche elaborare tutti i file selezionati. Ti permette di selezionare il coordsys corretto.
Uffe Kousgaard,

Ho davvero problemi con la giusta proiezione nel file MapInfo. Cerco di includere la giusta proiezione, ma questo non funziona. La proiezione nel file de mapinfo è impostata su non terra (metri). È possibile includere la proiezione corretta con lo strumento ogr2ogr. Vorrei inserire le righe di comando in un altro script. Quindi preferisco non usare Universal Translator.
Stefan,

Hai provato la libreria OGR e i suoi strumenti da riga di comando?
Alex Markov,

Risposte:


34

Su Windows, per le directory correnti e secondarie sotto l'attuale, provare questo comando:

for /R %f in (*.shp) do ogr2ogr -f "MapInfo File" "%~dpnf.tab" "%f"

Per spiegare brevemente l' inganno di ciò che sta succedendo qui , %~dpnf.tabusa la variabile % f , con la quale aggiunge la lettera d river, il nome p ath (cioè la cartella o la directory) ed estrae il file n ame (senza l' .shpestensione del file) . Infine, .tabviene aggiunto immediatamente dopo i modificatori della variabile composta per la nuova estensione.

Quindi, se ci si trova nella directory C:\MyDatae si hanno i dati in questa directory, le sottodirectory C:\MyData\Region1e C:\MyData\Region1\City1qualsiasi Shapefile (con .shpestensione) verranno elaborati e un file con nome simile .tabverrà creato nella stessa directory.


Freddo! Questo funziona! Mille grazie per la risposta :) Un'altra domanda: c'è anche un modo per fare riferimento alla sottodirectory e convertire i file in un'altra sottodirectory. Ho un contenente varie directory che contengono shapefile. Ad esempio: Paesi Bassi \ forma \ provinciaX Paesi Bassi \ forma \ provinciaY Paesi Bassi \ forma \ provinciaZ E vorrei convertirlo in queste cartelle: Paesi Bassi \ mapinfo \ provinceX Paesi Bassi \ mapinfo \ provinciaY Paesi Bassi \ mapinfo \ provinceZ Grazie :)
Stefan

Ho aggiornato quanto sopra per una ricerca ricorsiva, tuttavia non so come fare la logica in più per cambiare "forma" in "mapinfo"; forse trovare / chiedere su superuser.com
Mike T

1
Grazie ancora per la tua rapida risposta. Questo è stato molto utile. Devo solo copiare i file nella directory giusta.
Stefan,

Si noti che la riga di comando di Windows e il comando del file batch differiscono: è necessario raddoppiare la percentuale %fin %%f. Vedi ss64.com/nt/for.html per i dettagli.
AndreJ,

Questo è fantastico, è un approccio simile su un MAC
Ryan Garnett,

11

Per unix bash:

#!/bin/bash

for FILE in *.mif # cycles through all files in directory (case-sensitive!)
do
    echo "converting file: $FILE..."
    FILENEW=`echo $FILE | sed "s/.mif/_new.shp/"` # replaces old filename
    ogr2ogr \
    -f "ESRI Shapefile" \
    "$FILENEW" "$FILE"
done
exit

Se stai lavorando in un sistema operativo basato su * nix (cioè Linux o OS X), ci sono alcuni script di shell batch che Clhenrik ha sviluppato qui (su cui si basa sopra).

Sto lavorando a un fork che rende alcuni degli script un po 'più generici e fornisce un po' più di descrizione sull'uso.



Ciò causerà un errore se il nome file contiene spazi.
JasonRDtonton

8

Come diceva Alex Markov , il modo migliore sarebbe usare OGR .

Dovrai fare uno script, ma molto semplice. Fondamentalmente se stai usando Windows, tutto ciò che devi fare è eseguire il seguente codice nella riga di comando (all'interno della cartella desiderata):

for %f in (*.tab) do ogr2ogr -f "KML" %~nf.kml %f

Controlla questo sito, tutto è spiegato qui:

http://www.processamentodigital.com.br/?p=2511


2
Penso che anche tu puoi fare: ogr2ogr -f "KML" {outfolder} {infolder} Suggerimento tratto da underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W

NB Questa risposta è nata da una domanda strettamente correlata che faceva riferimento a diversi formati di file.
whuber

Ciao, quando provo questo approccio in Ubuntu, ad esempio ogr2ogr -f "KML" {outfolder} {infolder}, ricevo l'errore: "ERRORE 4: impossibile creare il file KML". Qualche idea di cosa potrebbe andare storto qui? Ho creato GDAL con supporto KML
marty_c,

7

con pitone:

import os 

for a in os.listdir(os.getcwd()):
   fileName, fileExtension = os.path.splitext(a)
   os.system('ogr2ogr -f "ESRI Shapefile" %s %s' % (a, fileName + '.tab'))

puoi passare os.getcwd()al tuo percorso in cui si trovano i tuoi file ...

spero che ti aiuti


for a in *.shp:è un errore di sintassi; stai pensandofrom glob import glob; for a in glob('*.shp'):
Mike T,

oh scusa, l'ho scritto con uno stile sbagliato. Ho aggiornato. @ Mike Toews grazie.
Aragona,

4

Non hai bisogno di un ciclo, puoi semplicemente nominare una directory come sorgente e destinazione e ogr2ogr convertirà tutti i file nella directory sorgente. Vedi qui: Conversione di TAB in MIF / MIF in TAB


Grazie! Posso fare riferimento da una directory padre a tutti i sottodir e convertire tutti i file in altri sottodir. Ihave: Paesi Bassi \ forma \ provinciaX Paesi Bassi \ forma \ provinciaY Paesi Bassi \ forma \ provinciaZ e così via ... E vorrei convertirlo in queste cartelle: Paesi Bassi \ mapinfo \ provinciaX Paesi Bassi \ mapinfo \ provinciaY Paesi Bassi \ mapinfo \ provinciaZ Posso scrivere una riga per ogni provincia, ma posso farlo anche con un comando
Stefan

Non l'ho provato, ma non penso che sia possibile. Avresti bisogno di un ciclo che gestisca le rispettive directory di input e output. In questo caso è probabilmente più facile seguire un approccio Python.
Torsten,


0

Universal Translator in Mapinfo può gestire più file. Vai alla cartella di destinazione, seleziona tutti gli shapefile, definisci CRS per input e output. Dovrebbe essere fatto.


0

Questa è la raffinatezza della risposta di Aragon sopra. Eseguirà ogr2ogr solo su file .TAB o .tab e ignorerà altri tipi di file nella cartella.

#!/usr/bin/env python3

import os 

for a in os.listdir(os.getcwd()):
  fileName, ext = os.path.splitext(a)
  if ext.lower() == '.tab':
    print('ogr2ogr -f "ESRI Shapefile" %s %s' % (a.replace(ext,
                           '.shp'), fileName + ext))
    os.system('ogr2ogr -f "ESRI Shapefile" %s %s' % (a.replace(ext,
                           '.shp'), fileName + ext))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.