Verwenden Sie ogr2ogr, um alle Shapefiles im Verzeichnis zu konvertieren?


25

Ich habe ein Verzeichnis mit mehreren Shapefiles.

Wie kann man all diese Shapefiles mit ogr2ogr nach MapInfo konvertieren?

Ich weiß, wie ich eine Datei konvertieren kann. Und ich kann ein Stapelskript erstellen, das eine Zeile für jede Datei schreibt. Aber gibt es nicht eine einfachere Möglichkeit, alle Dateien in einem Verzeichnis (und einem Unterverzeichnis) zu konvertieren?


Es kommt darauf an welches Betriebssystem. Grundsätzlich machen Sie eine "for" -Schleife, siehe gis.stackexchange.com/questions/7803/…
Mike T

Betriebssystem ist Windows 7. Ich versuche dies in der Eingabeaufforderung: für% f in * .shp; do ogr2ogr -f MapInfo-Datei $ f.tab. Das geht aber nicht. Ich erhalte die Fehlermeldung: 'Datenquelle' $ f.tab 'kann mit den folgenden Treibern nicht geöffnet werden .....
Stefan

So erstellen Sie SHP für TAB: ogr2ogr -f "MapInfo-Datei"% 1.tab% 1.shp. Aber wenn OGR eine PRJ-Datei nicht richtig erkennt, haben Sie leicht TAB-Dateien mit dem falschen integrierten Coordsys. Ich empfehle die Verwendung des integrierten Universal Translator (verkleinerte FME), der auch alle von Ihnen ausgewählten Dateien verarbeiten kann. Hier können Sie die richtigen Koordinaten auswählen.
Uffe Kousgaard

Ich habe in der Tat Probleme mit der richtigen Projektion in MapInfo File. Ich versuche, die richtige Projektion einzubeziehen, aber das funktioniert nicht. Die Projektion in der Mapinfo-Datei ist auf Nicht-Erde (Meter) eingestellt. Ist es möglich, die korrekte Projektion mit dem Tool ogr2ogr aufzunehmen? Ich möchte die Befehlszeilen in ein anderes Skript einfügen. Also benutze ich den Universal Translator lieber nicht.
Stefan

Haben Sie die OGR- Bibliothek und ihre Befehlszeilentools ausprobiert ?
Alex Markov

Antworten:


34

Führen Sie unter Windows für das aktuelle Verzeichnis und die Unterverzeichnisse unter dem aktuellen Verzeichnis den folgenden Befehl aus:

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

Um kurz zu erklären, was hier vor sich geht , %~dpnf.tabverwenden Sie die Variable % f , mit der der Buchstabe d river und der Name p ath (dh der Ordner oder das Verzeichnis) hinzugefügt werden , und extrahieren Sie die Datei n ame (ohne die .shpDateierweiterung). . Zuletzt .tabwird unmittelbar nach den zusammengesetzten Variablenmodifikatoren für die neue Erweiterung hinzugefügt.

Wenn Sie sich also in einem Verzeichnis befinden C:\MyDataund Daten in diesem Verzeichnis sowie in den Unterverzeichnissen C:\MyData\Region1und befinden C:\MyData\Region1\City1, wird ein beliebiges Shapefile (mit .shpErweiterung) verarbeitet und eine Datei mit einem ähnlichen Namen .tabim selben Verzeichnis erstellt.


Cool! Das funktioniert! Vielen Dank für die Antwort :) Noch eine Frage: Gibt es auch eine Möglichkeit, auf Unterverzeichnis zu verweisen und die Dateien in ein anderes Unterverzeichnis umzuwandeln. Ich habe verschiedene Verzeichnisse mit Shapefiles. Beispiel: Niederlande \ Form \ ProvinzX Niederlande \ Form \ ProvinzY Niederlande \ Form \ ProvinzZ Und möchte dies in die folgenden Ordner konvertieren: Niederlande \ Karteninfo \ ProvinzX Niederlande \ Karteninfo \ ProvinzY Niederlande \ Karteninfo \ ProvinzZ Danke :)
Stefan

Ich habe das Obige für eine rekursive Suche aktualisiert, weiß jedoch nicht, wie ich die zusätzliche Logik ausführen soll, um "shape" in "mapinfo" zu ändern. Vielleicht finden / fragen Sie auf superuser.com
Mike T

1
Nochmals vielen Dank für Ihre schnelle Antwort. Das war sehr hilfreich. Ich muss nur die Dateien in das richtige Verzeichnis kopieren.
Stefan

Beachten Sie, dass die Windows-Befehlszeile und der Batch-Dateibefehl unterschiedlich sind: Sie müssen den Prozentsatz %fauf verdoppeln %%f. Weitere Informationen finden Sie unter ss64.com/nt/for.html .
AndreJ

Dies ist eine großartige, ist die ähnliche Vorgehensweise auf einem MAC
Ryan Garnett

11

Für 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

Wenn Sie in einem * nix-basierten Betriebssystem (z. B. Linux oder OS X) arbeiten, gibt es einige Batch-Shell-Skripte, die clhenrik hier entwickelt hat (auf denen das Obige basiert).

Ich arbeite an einer Abzweigung, die einige der Skripte etwas allgemeiner macht und eine etwas ausführlichere Beschreibung der Verwendung liefert.



Dies führt zu einem Fehler, wenn der Dateiname Leerzeichen enthält.
JasonRDalton

8

Wie Alex Markov sagte, ist der beste Weg für Sie, OGR zu verwenden .

Sie müssen ein Skript erstellen, das jedoch sehr einfach ist. Wenn Sie Windows verwenden, müssen Sie lediglich den folgenden Code in der Befehlszeile (innerhalb des gewünschten Ordners) ausführen:

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

Überprüfen Sie diese Seite, alles wird hier erklärt:

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


2
Ich denke, Sie können auch Folgendes tun: ogr2ogr -f "KML" {outfolder} {infolder} Tipp aus underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W

NB Diese Antwort stammte von einer eng verwandten Frage, die sich auf verschiedene Dateiformate bezog.
whuber

Hallo, wenn ich diesen Ansatz in Ubuntu versuche, zB ogr2ogr -f "KML" {outfolder} {infolder}, erhalte ich die Fehlermeldung: 'FEHLER 4: Fehler beim Erstellen der KML-Datei'. Irgendeine Idee, was hier falsch laufen könnte? Ich habe GDAL mit KML-Unterstützung erstellt
marty_c

7

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

Sie können os.getcwd()zu Ihrem Pfad wechseln, in dem sich Ihre Dateien befinden ...

ich hoffe es hilft dir


for a in *.shp:ist ein Syntaxfehler; Sie denkenfrom glob import glob; for a in glob('*.shp'):
Mike T

oh sorry, ich habe es falsch geschrieben. ich habe aktualisiert. @ Mike Toews danke.
Aragon

4

Sie brauchen keine Schleife, Sie können einfach ein Verzeichnis als Quelle und Ziel benennen und ogr2ogr konvertiert alle Dateien im Quellverzeichnis. Siehe hier: Konvertieren von TAB in MIF / MIF in TAB


Vielen Dank! Kann ich von einem übergeordneten Verzeichnis auf alle Unterverzeichnisse verweisen und alle Dateien in andere Unterverzeichnisse konvertieren? Ich habe: Niederlande \ Form \ ProvinzX Niederlande \ Form \ ProvinzY Niederlande \ Form \ ProvinzZ und so weiter ... Und möchte dies in diese Ordner konvertieren: Niederlande \ Karteninfo \ ProvinzX Niederlande \ Karteninfo \ ProvinzY Niederlande \ Karteninfo \ ProvinzZ Ich kann schreibe eine Zeile für jede Provinz, aber kann ich das auch mit einem Befehl machen
Stefan

Ich habe es nicht versucht, aber ich denke nicht, dass dies möglich ist. Sie benötigen eine Schleife, die die jeweiligen Eingabe- und Ausgabeverzeichnisse behandelt. In diesem Fall ist es wahrscheinlich einfacher, einem Python-Ansatz zu folgen.
Torsten,


0

Universal Translator in Mapinfo kann mehrere Dateien verarbeiten. Gehen Sie zum Zielordner, wählen Sie alle Shapefiles aus und definieren Sie CRS für die Eingabe und Ausgabe. Es sollte getan werden.


0

Dies ist eine Verfeinerung der obigen Antwort von Aragon. Es wird nur ogr2ogr für .TAB- oder .TAB-Dateien ausgeführt und andere Dateitypen im Ordner ignoriert.

#!/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))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.