Использование ogr2ogr для преобразования всех шейп-файлов в каталоге?

25

У меня есть каталог с несколькими шейп-файлами.

Как можно преобразовать все эти шейп-файлы в MapInfo с помощью ogr2ogr?

Я знаю, как я могу конвертировать один файл. И я могу сделать пакетный скрипт, записывающий строку для каждого файла. Но разве нет более простого способа конвертировать все файлы в каталоге (и подкаталоге).

Стефан
источник
Смотря какая операционная система. По сути, создайте цикл «for», см. Gis.stackexchange.com/questions/7803/…
Майк Т,
ОС Windows 7. Я пробую это в командной строке: для% f в * .shp; do ogr2ogr -f Файл MapInfo $ f.tab. Но это не работает. Я получаю сообщение об ошибке: «Невозможно открыть datasour« $ f.tab »со следующими драйверами .....
Стефан
Вот как сделать SHP для TAB: ogr2ogr -f "Файл MapInfo"% 1.tab% 1.shp. Но если OGR не сможет правильно распознать файл PRJ, вы легко получите TAB-файлы с неправильной встроенной системой координат. Я рекомендую использовать встроенный универсальный переводчик (уменьшенный FME), который также может обрабатывать все выбранные вами файлы. Это позволяет вам выбрать правильные координаты.
Уффе Кусгаард
У меня действительно есть проблемы с правильной проекцией в файле MapInfo. Я пытаюсь включить правильную проекцию, но это не работает. Проекция в файле de mapinfo установлена ​​не на землю (в метрах). Можно ли включить правильную проекцию с помощью инструмента ogr2ogr. Я хотел бы поместить командные строки в другой скрипт. Поэтому я скорее не пользуюсь универсальным переводчиком.
Стефан
Вы пробовали библиотеку OGR и ее инструменты командной строки?
Алекс Марков

Ответы:

34

В Windows, для текущего и подкаталогов в текущем, попробуйте эту команду:

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

Чтобы кратко объяснить хитрость происходящего здесь , %~dpnf.tabиспользуется переменная % f , с помощью которой она добавляет букву d river, имя p ath (т.е. папку или каталог) и извлекает файл n ame (без .shpрасширения файла) , Наконец, .tabдобавляется сразу после модификатора составной переменной для нового расширения.

Так что, если вы находитесь в каталоге C:\MyData, и у вас есть данные в этом каталоге, а также в подкаталогах C:\MyData\Region1и C:\MyData\Region1\City1любом, любой Shapefile (с .shpрасширением) будет обработан, и аналогичный именованный файл .tabбудет создан в том же каталоге.

Майк Т
источник
Круто! Это работает! Большое спасибо за ответ :) Еще один вопрос: есть ли способ обратиться к подкаталогу и конвертировать файлы в другой подкаталог. У меня есть различные каталоги, содержащие шейп-файлы. Например: Нидерланды \ форма \ провинцияX Нидерланды \ форма \ провинцияY Нидерланды \ форма \ провинцияZ И хотелось бы преобразовать это в следующие папки: Нидерланды \ mapinfo \ провинцияX Нидерланды \ mapinfo \ провинцияY Нидерланды \ mapinfo \ провинцияZ Спасибо :)
Стефан
Я обновил выше для рекурсивного поиска, однако я не знаю, как сделать дополнительную логику, чтобы изменить "shape" на "mapinfo"; возможно найди / спроси на superuser.com
Майк Т
1
Еще раз спасибо за ваш быстрый ответ. Это было очень полезно. Мне нужно только скопировать файлы в правильный каталог.
Стефан
Обратите внимание, что командная строка Windows и командный файл отличаются: вы должны удвоить процент %fдо %%f. См. Ss64.com/nt/for.html для деталей.
AndreJ
Это здорово, это похожий подход на MAC
Райан Гарнетт
11

Для 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

Если вы работаете в ОС * nix (то есть в Linux или OS X), есть несколько сценариев пакетной оболочки, которые были разработаны здесь clhenrik (на которых основано вышеизложенное).

Я работаю над форком, который делает некоторые из сценариев немного более общими и предоставляет немного больше описания по использованию.


eltiar
источник
Это приведет к ошибке, если имя файла содержит пробелы.
JasonRDalton
8

Как сказал Алексей Марков , для вас лучше всего использовать OGR .

Вам нужно будет сделать сценарий, но очень простой. В основном, если вы используете Windows, все, что вам нужно сделать, это запустить следующий код в командной строке (внутри нужной папки):

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

Проверьте этот сайт, все объясняется здесь:

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

Александр Нето
источник
2
Я думаю, что вы также можете сделать: ogr2ogr -f "KML" {outfolder} {infolder} Подсказка взята из underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Натан W
NB. Этот ответ был получен из тесно связанного вопроса, относящегося к различным форматам файлов.
whuber
Привет, когда я пробую этот подход в Ubuntu, например, ogr2ogr -f "KML" {outfolder} {infolder}, я получаю ошибку: "ОШИБКА 4: Не удалось создать файл KML". Есть идеи, что здесь может пойти не так? Я построил GDAL с поддержкой KML
marty_c
7

с питоном:

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

Вы можете изменить os.getcwd()свой путь, где ваши файлы находятся ...

я надеюсь, что это поможет вам

Арагон
источник
for a in *.shp:это синтаксическая ошибка; ты думаешьfrom glob import glob; for a in glob('*.shp'):
Майк Т
о, извините, я написал это в неправильном стиле. я обновил. @ Майк Тьюс спасибо.
Арагон
4

Вам не нужен цикл, вы можете просто назвать каталог как источник и место назначения, и ogr2ogr преобразует любые файлы в исходном каталоге. Смотрите здесь: Преобразование TAB в MIF / MIF в TAB

Торстен
источник
Благодарность! Могу ли я сослаться из одного родительского каталога на все подкаталоги и конвертировать все файлы в другие подкаталоги. У меня есть: Нидерланды \ форма \ провинцияX Нидерланды \ форма \ провинцияY Нидерланды \ форма \ провинцияZ и т. Д. ... И я хотел бы преобразовать это в следующие папки: Нидерланды \ mapinfo \ провинцияX Нидерланды \ mapinfo \ провинцияY Нидерланды \ mapinfo \ провинцияZ Я могу написать строку для каждой провинции, но могу ли я сделать это одной командой
Stefan
Я не пробовал это, но я не думаю, что это возможно. Вам понадобится цикл, который обрабатывает соответствующие входные и выходные каталоги. В этом случае, вероятно, легче следовать подходу Python.
Торстен
0

Универсальный переводчик в Mapinfo может обрабатывать несколько файлов. Перейдите в папку назначения, выберите все шейп-файлы, определите CRS для ввода и вывода. Это должно быть сделано.

Бхарадвай А.К.
источник
0

Это уточнение ответа Арагона выше. Он будет запускать ogr2ogr только для файлов .TAB или .tab и игнорировать другие типы файлов в папке.

#!/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
источник