Utiliser ogr2ogr pour convertir tous les fichiers de formes dans le répertoire?

25

J'ai un répertoire avec plusieurs fichiers de formes.

Comment convertir tous ces fichiers de formes en MapInfo avec ogr2ogr?

Je sais comment convertir un fichier. Et je peux faire un script batch en écrivant une ligne pour chaque fichier. Mais n'y a-t-il pas un moyen plus simple de convertir tous les fichiers d'un répertoire (et d'un sous-répertoire).

Stefan
la source
Cela dépend de quel système d'exploitation. Faites une boucle "for", voir gis.stackexchange.com/questions/7803/…
Mike T
Le système d'exploitation est Windows 7. J'essaie ceci dans l'invite de commande: pour% f dans * .shp; do ogr2ogr -f Fichier MapInfo $ f.tab. Mais ça ne marche pas. J'obtiens l'erreur: 'Impossible d'ouvrir le fichier de données' $ f.tab 'avec les pilotes suivants .....
Stefan
Voici comment faire SHP en TAB: ogr2ogr -f "Fichier MapInfo"% 1.tab% 1.shp. Mais à moins que OGR soit capable de reconnaître correctement un fichier PRJ, vous vous retrouvez facilement avec des fichiers TAB avec le mauvais coordsys intégré. Je recommande d'utiliser le traducteur universel intégré (FME réduit), qui peut également traiter tous les fichiers que vous sélectionnez. Il vous permet de sélectionner les bons coordsys.
Uffe Kousgaard
J'ai en effet des problèmes avec la bonne projection dans le fichier MapInfo. J'essaie d'inclure la bonne projection, mais cela ne fonctionne pas. La projection dans le fichier de mapinfo est définie sur non terrestre (mètres). Est-il possible d'inclure la projection correcte avec l'outil ogr2ogr. Je voudrais mettre les lignes de commande dans un autre script. Je préfère donc ne pas utiliser Universal Translator.
Stefan
Avez-vous essayé la bibliothèque OGR et ses outils en ligne de commande?
Alex Markov

Réponses:

34

Sous Windows, pour les sous-répertoires actuels et sous le courant, essayez cette commande:

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

Pour expliquer brièvement la ruse de ce qui se passe ici , %~dpnf.tabutilise la variable % f , avec laquelle il ajoute la lettre d river, le nom p ath (ie, dossier ou répertoire), et extrait le fichier n ame (sans l' .shpextension de fichier) . Enfin, .tabest ajouté immédiatement après les modificateurs de variables composées pour la nouvelle extension.

Donc, si vous êtes dans le répertoire C:\MyData, et que vous avez des données dans ce répertoire, et des sous-répertoires C:\MyData\Region1et C:\MyData\Region1\City1, tout Shapefile (avec .shpextension) sera traité, et un fichier nommé similaire avec .tabsera créé dans le même répertoire.

Mike T
la source
Cool! Cela marche! Merci beaucoup pour la réponse :) Une autre question: existe-t-il également un moyen de se référer au sous-répertoire et de convertir les fichiers dans un autre sous-répertoire. J'ai un contenant divers répertoires contenant des fichiers de formes. Tels que: Pays-Bas \ forme \ provinceX Pays-Bas \ forme \ provinceY Pays-Bas \ forme \ provinceZ Et souhaitez convertir ceci dans ces dossiers: Pays-Bas \ mapinfo \ provinceX Pays-Bas \ mapinfo \ provinceY Pays-Bas \ mapinfo \ provinceZ Merci :)
Stefan
J'ai mis à jour ce qui précède pour une recherche récursive, mais je ne sais pas comment faire la logique supplémentaire pour changer "forme" en "mapinfo"; peut-être trouver / demander sur superuser.com
Mike T
1
Merci encore pour votre réponse rapide. Ce fut très utile. Il me suffit de copier les fichiers dans le bon répertoire.
Stefan
Notez que la ligne de commande Windows et la commande de fichier de commandes diffèrent: vous devez doubler le pourcentage %fà %%f. Voir ss64.com/nt/for.html pour plus de détails.
AndreJ
C'est super, c'est une approche similaire sur un MAC
Ryan Garnett
11

Pour 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 vous travaillez dans un système d'exploitation basé sur * nix (c'est-à-dire Linux ou OS X), il existe des scripts shell par lots que clhenrik a développés ici (sur lesquels est basé ci-dessus).

Je travaille sur un fork qui rend certains scripts un peu plus génériques et fournit un peu plus de description sur l'utilisation.


eltiar
la source
Cela provoquera une erreur si le nom de fichier contient des espaces.
JasonRDalton
8

Comme l'a dit Alex Markov , la meilleure façon serait d'utiliser OGR .

Vous devrez faire un script, mais très simple. Fondamentalement, si vous utilisez Windows, tout ce que vous avez à faire est d'exécuter le code suivant dans la ligne de commande (à l'intérieur du dossier souhaité):

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

Consultez ce site, tout est expliqué ici:

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

Alexandre Neto
la source
2
Je pense que vous pouvez aussi faire: ogr2ogr -f "KML" {outfolder} {infolder} Astuce tirée de underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W
NB Cette réponse est venue d'une question étroitement liée qui faisait référence à différents formats de fichiers.
whuber
Salut, lorsque j'essaie cette approche dans Ubuntu, par exemple ogr2ogr -f "KML" {outfolder} {infolder} j'obtiens l'erreur: "ERREUR 4: Échec de création du fichier KML". Une idée de ce qui pourrait mal se passer ici? J'ai construit GDAL avec le support KML
marty_c
7

avec python:

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

vous pouvez modifier os.getcwd()votre chemin d'accès où se trouvent vos fichiers ...

J'espère que ça t'aide

Aragon
la source
for a in *.shp:est une erreur de syntaxe; vous pensezfrom glob import glob; for a in glob('*.shp'):
Mike T
oh désolé, je l'ai écrit dans un mauvais style. J ai mis a jour. @ Mike Toews merci.
Aragon
4

Vous n'avez pas besoin d'une boucle, vous pouvez simplement nommer un répertoire comme source et destination et ogr2ogr convertira tous les fichiers du répertoire source. Voir ici: Conversion de TAB en MIF / MIF en TAB

Torsten
la source
Merci! Puis-je me référer d'un répertoire parent à tous les sous-répertoires et convertir tous les fichiers en d'autres sous-répertoires. J'ai: Pays-Bas \ forme \ provinceX Pays-Bas \ forme \ provinceY Pays-Bas \ forme \ provinceZ et ainsi de suite ... Et je voudrais le convertir dans ces dossiers: Pays-Bas \ mapinfo \ provinceX Pays-Bas \ mapinfo \ provinceY Pays-Bas \ mapinfo \ provinceZ écrire une ligne pour chaque province, mais je peux aussi le faire avec une seule commande
Stefan
Je n'ai pas essayé ça, mais je ne pense pas que ce soit possible. Vous auriez besoin d'une boucle qui gère les répertoires d'entrée et de sortie respectifs. Dans ce cas, il est probablement plus facile de suivre une approche python.
Torsten
0

Universal Translator dans Mapinfo peut gérer plusieurs fichiers. Accédez au dossier de destination, sélectionnez tous les fichiers de formes, définissez CRS pour l'entrée et la sortie. Ca devrait être fait.

Bharadwaj AK
la source
0

C'est le raffinement de la réponse d'Aragon ci-dessus. Il exécutera uniquement ogr2ogr sur les fichiers .TAB ou .tab et ignorera les autres types de fichiers du dossier.

#!/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))
Tybion
la source