Używasz ogr2ogr do konwersji wszystkich plików kształtów w katalogu?

25

Mam katalog z kilkoma plikami kształtów.

Jak przekonwertować wszystkie te pliki kształtów na MapInfo za pomocą ogr2ogr?

Wiem, jak mogę przekonwertować jeden plik. I mogę zrobić skrypt wsadowy, pisząc wiersz dla każdego pliku. Ale czy nie ma łatwiejszego sposobu konwersji wszystkich plików w katalogu (i podkatalogu).

Stefan
źródło
To zależy od systemu operacyjnego. Zasadniczo zrób pętlę „za”, zobacz gis.stackexchange.com/questions/7803/…
Mike T
System operacyjny to Windows 7. Próbuję tego w wierszu polecenia: dla% f w * .shp; do ogr2ogr -f MapInfo $ f.tab. Ale to nie działa. Pojawia się błąd: „Nie można otworzyć danych '$ f.tab” z następującymi sterownikami .....
Stefan
Oto jak zrobić SHP do TAB: ogr2ogr -f „Plik MapInfo”% 1.tab% 1.shp. Ale dopóki OGR nie rozpozna poprawnie pliku PRJ, łatwo znajdziesz pliki TAB z wbudowanym niewłaściwym coordys. Polecam korzystanie z wbudowanego Universal Translator (zmniejszonego FME), który może również przetwarzać wszystkie wybrane pliki. Pozwala wybrać poprawne współrzędne.
Uffe Kousgaard
Naprawdę mam problemy z właściwą projekcją w pliku MapInfo. Próbuję uwzględnić odpowiednią projekcję, ale to nie działa. Projekcja w pliku de mapinfo jest ustawiona na wartość inną niż ziemia (metry). Czy możliwe jest dołączenie poprawnej projekcji za pomocą narzędzia ogr2ogr. Chciałbym umieścić wiersze poleceń w innym skrypcie. Wolę więc nie używać Universal Translator.
Stefan
Próbowałeś już biblioteki OGR i jej narzędzi wiersza poleceń?
Alex Markov

Odpowiedzi:

34

W systemie Windows w przypadku bieżących i podkatalogów pod bieżącym wypróbuj to polecenie:

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

Aby krótko opisać sztuczek, co się tu dzieje , %~dpnf.tabwykorzystuje zmienną % f , z którym dodaje się d rzeka list, str nazwę ATH (czyli folderu lub katalogu) i wyodrębnia plik n ame (bez .shprozszerzenia) . Na koniec .tabjest dodawany natychmiast po modyfikatorach zmiennych złożonych dla nowego rozszerzenia.

Więc jeśli jesteś w katalogu C:\MyDatai masz dane w tym katalogu, podkatalogach C:\MyData\Region1i C:\MyData\Region1\City1, dowolny .shpplik Shapefile (z rozszerzeniem) zostanie przetworzony, a podobny plik o nazwie .tabzostanie utworzony w tym samym katalogu.

Mike T.
źródło
Fajne! To działa! Wielkie dzięki za odpowiedź :) Jeszcze jedno pytanie: Czy istnieje również sposób na odniesienie się do podkatalogu i konwersję plików w innym podkatalogu. Mam różne katalogi zawierające pliki kształtów. Takich jak: Holandia \ kształt \ prowincjaX Holandia \ kształt \ prowincjaY Holandia \ shape \ prowincjaZ I chciałbym przekonwertować to na następujące foldery: Holandia \ mapinfo \ prowincjaX Holandia \ mapinfo \ prowincja Y Holandia \ mapinfo \ prowincjaZ Dzięki :)
Stefan
Zaktualizowałem powyższe wyszukiwanie rekurencyjne, jednak nie wiem, jak zrobić dodatkową logikę, aby zmienić „kształt” na „mapinfo”; może znajdź / zapytaj na superuser.com
Mike T
1
Jeszcze raz dziękuję za szybką odpowiedź. To było bardzo pomocne. Muszę tylko skopiować pliki do odpowiedniego katalogu.
Stefan
Zauważ, że wiersz poleceń systemu Windows i polecenie pliku wsadowego różnią się: Musisz podwoić procent %fdo %%f. Szczegółowe informacje można znaleźć na stronie ss64.com/nt/for.html .
AndreJ
To świetne, podobne podejście na MAC
Ryan Garnett
11

W przypadku Uniksa 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

Jeśli pracujesz w systemie operacyjnym opartym na * nix (tj. Linux lub OS X), istnieje kilka skryptów powłoki wsadowej, które Clhenrik opracował tutaj (na których opiera się powyższe).

Pracuję nad rozwidleniem, które sprawia, że ​​niektóre skrypty są nieco bardziej ogólne i zawierają nieco więcej opisu użytkowania.


eltiar
źródło
Spowoduje to błąd, jeśli nazwa pliku zawiera spacje.
JasonRDalton
8

Jak powiedział Alex Markov , najlepszym sposobem byłoby użycie OGR .

Będziesz musiał zrobić skrypt, ale bardzo prosty. Zasadniczo, jeśli używasz systemu Windows, wszystko, co musisz zrobić, to uruchomić następujący kod w wierszu poleceń (wewnątrz żądanego folderu):

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

Sprawdź tę stronę, wszystko wyjaśniono tutaj:

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

Alexandre Neto
źródło
2
Myślę, że możesz też: ogr2ogr -f "KML" {outfolder} {infolder} Wskazówka pochodzi z underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W
NB Ta odpowiedź pochodzi od ściśle powiązanego pytania dotyczącego różnych formatów plików.
whuber
Cześć, kiedy próbuję tego podejścia w Ubuntu, np. Ogr2ogr -f "KML" {outfolder} {infolder} pojawia się błąd: „BŁĄD 4: Nie udało się utworzyć pliku KML”. Masz pojęcie, co może tu pójść nie tak? Zbudowałem GDAL z obsługą KML
marty_c
7

z pythonem:

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

możesz przejść os.getcwd()do ścieżki, w której znajdują się twoje pliki ...

Mam nadzieję, że Ci to pomoże

Aragonia
źródło
for a in *.shp:jest błędem składni; myśliszfrom glob import glob; for a in glob('*.shp'):
Mike T
o przepraszam, napisałem to w złym stylu. zaktualizowałem. @ Mike Toews dzięki.
Aragonia
4

Nie potrzebujesz pętli, możesz po prostu nazwać katalog źródłowy i docelowy, a ogr2ogr przekonwertuje dowolne pliki w katalogu źródłowym. Zobacz tutaj: Konwersja TAB na MIF / MIF na TAB

Torsten
źródło
Dzięki! Czy mogę odwoływać się z jednego katalogu nadrzędnego do wszystkich podkatalogów i konwertować wszystkie pliki na inne podkatalogi. Ihave: Holandia \ kształt \ prowincjaX Holandia \ kształt \ prowincja Y Holandia \ kształt \ prowincjaZ i tak dalej ... Chciałbym przekonwertować to na te foldery: Holandia \ mapinfo \ prowincjaX Holandia \ mapinfo \ prowincja Y Holandia \ mapinfo \ prowincjaZ Mogę napisz wiersz dla każdej prowincji, ale czy mogę to zrobić również jednym poleceniem
Stefan
Nie próbowałem tego, ale nie sądzę, że jest to możliwe. Potrzebna byłaby pętla, która obsługuje odpowiednie katalogi wejściowe i wyjściowe. W takim przypadku prawdopodobnie łatwiej jest zastosować podejście w języku python.
Torsten
0

Universal Translator w Mapinfo może obsługiwać wiele plików. Przejdź do folderu docelowego, wybierz wszystkie pliki kształtów, zdefiniuj CRS dla danych wejściowych i wyjściowych. Powinno być zrobione.

Bharadwaj AK
źródło
0

Jest to udoskonalenie powyższej odpowiedzi Aragona. Będzie uruchamiał tylko ogr2ogr na plikach .TAB lub .tab i zignoruje inne typy plików w folderze.

#!/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
źródło