¿Usando ogr2ogr para convertir todos los archivos de forma en el directorio?


25

Tengo un directorio con varios archivos de forma.

¿Cómo puede convertir todos estos archivos de forma a MapInfo con ogr2ogr?

Sé cómo puedo convertir un archivo. Y puedo hacer un script por lotes escribiendo una línea para cada archivo. Pero, ¿no hay una manera más fácil de convertir todos los archivos en un directorio (y subdirectorio)?


Depende de qué sistema operativo. Básicamente, haga un ciclo "for", consulte gis.stackexchange.com/questions/7803/…
Mike T

El sistema operativo es Windows 7. Intento esto en el símbolo del sistema: para% f en * .shp; do ogr2ogr -f Archivo MapInfo $ f.tab. Pero eso no funciona. Me sale el error: 'No se puede abrir el datasour' $ f.tab 'con los siguientes controladores .....
Stefan

Así es como hacer SHP a TAB: ogr2ogr -f "MapInfo File"% 1.tab% 1.shp. Pero a menos que OGR pueda reconocer un archivo PRJ correctamente, puede terminar fácilmente con archivos TAB con el coordsys incorporado incorrecto. Recomiendo usar el traductor universal incorporado (FME reducido), que también puede procesar todos los archivos que seleccione. Le permite seleccionar el coordsys correcto.
Uffe Kousgaard

De hecho, tengo problemas con la proyección correcta en MapInfo File. Intento incluir la proyección correcta, pero esto no funciona. La proyección en el archivo de mapinfo se establece en no tierra (metros). ¿Es posible incluir la proyección correcta con la herramienta ogr2ogr? Me gustaría poner las líneas de comando en otro script. Así que prefiero no usar el traductor universal.
Stefan

¿Has probado la biblioteca OGR y sus herramientas de línea de comandos?
Alex Markov

Respuestas:


34

En Windows, para los directorios actuales y secundarios bajo el actual, intente este comando:

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

Para explicar brevemente el truco de lo que está sucediendo aquí , %~dpnf.tabutiliza la variable % f , con la cual agrega la letra d river, el nombre p ath (es decir, la carpeta o el directorio) y extrae el archivo n AME (sin la .shpextensión de archivo) . Por último, .tabse agrega inmediatamente después de los modificadores de variables compuestas para la nueva extensión.

Entonces, si está en el directorio C:\MyData, y tiene datos en este directorio, y subdirectorios C:\MyData\Region1y C:\MyData\Region1\City1, .shpse procesará cualquier Shapefile (con extensión), y .tabse creará un archivo con un nombre similar en el mismo directorio.


¡Guay! ¡Esto funciona! Muchas gracias por la respuesta :) Una pregunta más: ¿hay alguna forma de referirse al subdirectorio y convertir los archivos en otro subdirectorio? Tengo un que contiene varios directorios que contienen archivos de forma. Tales como: Países Bajos \ forma \ provinciaX Países Bajos \ forma \ provinciaY Países Bajos \ forma \ provinciaZ Y me gustaría convertir esto en estas carpetas: Países Bajos \ mapinfo \ provinciaX Países Bajos \ mapinfo \ provinciaY Países Bajos \ mapinfo \ provinciaZ Gracias :)
Stefan

He actualizado lo anterior para una búsqueda recursiva, sin embargo, no sé cómo hacer la lógica adicional para cambiar "forma" a "mapinfo"; quizás encontrar / preguntar en superuser.com
Mike T

1
Gracias de nuevo por su respuesta rápida. Esto fue muy útil. Solo necesito copiar los archivos en el directorio correcto.
Stefan

Tenga en cuenta que la línea de comando de Windows y el comando de archivo por lotes difieren: debe duplicar el porcentaje %fa %%f. Consulte ss64.com/nt/for.html para obtener más detalles.
AndreJ

Este es un gran enfoque similar en un MAC
Ryan Garnett, del

11

Para 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

Si está trabajando en un sistema operativo basado en * nix (es decir, Linux u OS X), hay algunos scripts de shell por lotes que Clhenrik desarrolló aquí (en los que se basa lo anterior).

Estoy trabajando en una bifurcación que hace que algunos de los scripts sean un poco más genéricos y proporciona un poco más de descripción sobre el uso.



Esto causará un error si el nombre del archivo contiene espacios.
JasonRDalton

8

Como dijo Alex Markov , la mejor manera sería utilizar OGR .

Tendrá que hacer un script, pero muy simple. Básicamente, si está utilizando Windows, todo lo que tiene que hacer es ejecutar el siguiente código en la línea de comando (dentro de la carpeta deseada):

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

Consulte este sitio, todo se explica aquí:

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


2
Creo que también puede hacer lo siguiente: ogr2ogr -f "KML" {outfolder} {infolder} Consejo tomado de underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W

Nota: esta respuesta provino de una pregunta estrechamente relacionada que se refería a diferentes formatos de archivo.
whuber

Hola, cuando intento este enfoque en Ubuntu, por ejemplo, ogr2ogr -f "KML" {outfolder} {infolder} aparece el error: 'ERROR 4: Error al crear el archivo KML'. ¿Alguna idea de lo que podría estar yendo mal aquí? He creado GDAL con soporte KML
marty_c

7

con pitón:

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'))

puede cambiar os.getcwd()a su ruta donde se encuentran sus archivos ...

Espero que te ayude


for a in *.shp:es un error de sintaxis; estás pensandofrom glob import glob; for a in glob('*.shp'):
Mike T

oh lo siento, lo he escrito con un estilo incorrecto. He actualizado @ Mike Toews gracias.
Aragón

4

No necesita un bucle, simplemente puede nombrar un directorio como fuente y destino y ogr2ogr convertirá cualquier archivo en el directorio fuente. Ver aquí: Convertir TAB a MIF / MIF a TAB


¡Gracias! ¿Puedo referirme desde un directorio padre a todos los subdirectorios y convertir todos los archivos a otros subdirectores? Tengo: Países Bajos \ forma \ provinciaX Países Bajos \ forma \ provinciaY Países Bajos \ forma \ provinciaZ y así sucesivamente ... Y me gustaría convertir esto en estas carpetas: Países Bajos \ mapinfo \ provinciaX Países Bajos \ mapinfo \ provinciaY Países Bajos \ mapinfo \ provinciaZ Puedo escribir una línea para cada provincia, pero ¿puedo hacerlo también con un comando
Stefan

No he intentado esto, pero no creo que sea posible. Necesitaría un bucle que maneje los directorios de entrada y salida respectivos. En este caso, probablemente sea más fácil seguir un enfoque de Python.
Torsten


0

Universal Translator en Mapinfo puede manejar múltiples archivos. Vaya a la carpeta de destino, seleccione todos los archivos de forma, defina CRS para entrada y salida. Debería estar hecho.


0

Este es el refinamiento de la respuesta de Aragón anterior. Solo ejecutará ogr2ogr en archivos .TAB o .tab e ignorará otros tipos de archivos en la carpeta.

#!/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))
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.