Usando ogr2ogr para converter todos os shapefiles no diretório?

25

Eu tenho um diretório com vários shapefiles.

Como converter todos esses shapefiles para o MapInfo com ogr2ogr?

Eu sei como posso converter um arquivo. E eu posso criar um script em lote escrevendo uma linha para cada arquivo. Mas não existe uma maneira mais fácil de converter todos os arquivos em um diretório (e subdiretório).

Stefan
fonte
Depende do sistema operacional. Basicamente, faça um loop "for", consulte gis.stackexchange.com/questions/7803/…
Mike T
O sistema operacional é o Windows 7. Eu tento isso no prompt de comando: para% f em * .shp; do ogr2ogr -f Arquivo MapInfo $ f.tab. Mas isso não funciona. Eu recebo o erro: 'Não é possível datasour aberta '$ f.tab' com os seguintes drivers .....
Stefan
Isto é como fazer SHP para TAB: ogr2ogr -f "Arquivo MapInfo"% 1.tab% 1.shp. Mas, a menos que o OGR consiga reconhecer um arquivo PRJ corretamente, você poderá acabar facilmente com os arquivos TAB com o coordsys incorreto. Eu recomendo usar o Universal Translator interno (FME reduzido), que também pode processar todos os arquivos que você selecionar. Ele permite que você selecione o cabo correto.
Uffe Kousgaard 14/05
Na verdade, tenho problemas com a projeção correta no arquivo MapInfo. Tento incluir a projeção correta, mas isso não funciona. A projeção no arquivo de mapinfo é definida como não terra (metros). É possível incluir a projeção correta com a ferramenta ogr2ogr. Eu gostaria de colocar as linhas de comando em outro script. Então, prefiro não usar o Universal Translator.
Stefan
Você já experimentou a biblioteca OGR e suas ferramentas de linha de comando?
Alex Markov

Respostas:

34

No Windows, para os diretórios atuais e subdiretórios sob o atual, tente este comando:

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

Para explicar brevemente a malandragem do que está acontecendo aqui , %~dpnf.tabusa a variável % f , com a qual ele adiciona o d carta rio, p nome ath (ou seja, pasta ou diretório), e extrai o arquivo n ame (sem a .shpextensão de arquivo) . Por fim, .tabé adicionado imediatamente após os modificadores da variável composta para a nova extensão.

Portanto, se você estiver no diretório C:\MyDatae tiver dados nesse diretório, subdiretórios C:\MyData\Region1e C:\MyData\Region1\City1, qualquer Shapefile (com .shpextensão) será processado e um arquivo nomeado semelhante .tabserá criado no mesmo diretório.

Mike T
fonte
Legal! Isso funciona! Muito obrigado pela resposta :) Mais uma pergunta: Existe também uma maneira de se referir ao subdiretório e converter os arquivos em outro subdiretório. Eu tenho um contendo vários diretórios contendo shapefiles. Tais como: Holanda \ forma \ provínciaX Holanda \ forma \ província \ Holanda \ forma \ provínciaZ E gostaria de converter isso nessas pastas: Holanda \ mapinfo \ provinceX Holanda \ mapinfo \ provínciaY Holanda \ mapinfo \ provinceZ Obrigado :)
Stefan
Atualizei o acima para uma pesquisa recursiva, mas não sei como fazer a lógica extra para alterar "shape" para "mapinfo"; talvez encontrar / perguntar sobre superuser.com
Mike T
1
Obrigado novamente por sua resposta rápida. Isso foi muito útil. Eu só preciso copiar os arquivos para o diretório certo.
Stefan
Observe que a linha de comando do Windows e o comando de arquivo em lote diferem: Você deve dobrar a porcentagem %fpara %%f. Consulte ss64.com/nt/for.html para obter detalhes.
Andrej
Isso é ótimo, é uma abordagem semelhante em um MAC
Ryan Garnett
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

Se você estiver trabalhando em um sistema operacional baseado em * nix (por exemplo, Linux ou OS X), existem alguns scripts de shell em lote que o clhenrik desenvolveu aqui (no qual o acima é baseado).

Estou trabalhando em um fork que torna alguns scripts um pouco mais genéricos e fornece um pouco mais de descrição em uso.


eltiar
fonte
Isso causará um erro se o nome do arquivo contiver espaços.
JasonRDalton
8

Como Alex Markov disse, a melhor maneira seria usar o OGR .

Você precisará fazer um script, mas muito simples. Basicamente, se você estiver usando o Windows, tudo o que você precisa fazer é executar o seguinte código na linha de comando (dentro da pasta desejada):

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

Confira este site, tudo é explicado aqui:

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

Alexandre Neto
fonte
2
Eu acho que você também pode fazer: ogr2ogr -f "KML" {outfolder} {infolder} Dica retirada de underdark.wordpress.com/2012/05/09/batch-shapefile-clipping
Nathan W
NB Esta resposta veio de uma pergunta intimamente relacionada que se referia a diferentes formatos de arquivo.
whuber
Olá, quando tento essa abordagem no Ubuntu, por exemplo, ogr2ogr -f "KML" {outfolder} {infolder}, recebo o erro: 'ERRO 4: Falha ao criar arquivo KML'. Alguma idéia do que pode estar errado aqui? Eu construí GDAL com suporte KML
marty_c
7

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

você pode mudar os.getcwd()para o caminho onde seus arquivos estão localizados ...

espero que ajude você

Aragão
fonte
for a in *.shp:é um erro de sintaxe; você está pensandofrom glob import glob; for a in glob('*.shp'):
Mike T
oh desculpe, eu escrevi no estilo errado. eu atualizei. @ Mike Toews obrigado.
Aragon
4

Você não precisa de um loop, basta nomear um diretório como origem e destino e o ogr2ogr converterá todos os arquivos no diretório de origem. Consulte aqui: Convertendo TAB para MIF / MIF para TAB

Torsten
fonte
Obrigado! Posso me referir de um diretório pai a todos os subdiretórios e converter todos os arquivos em outros subdiretórios. Ihave: Holanda \ shape \ provinceX Holanda \ shape \ provinceY Holanda \ shape \ provinceZ e assim por diante ... E gostaria de convertê-lo nessas pastas: Holanda \ mapinfo \ provinceX Holanda \ mapinfo \ provinceY Holanda \ mapinfo \ provinceZ Posso escrever uma linha para cada província, mas pode também fazê-lo com um comando
Stefan
Eu não tentei isso, mas não acho que isso seja possível. Você precisaria de um loop que lide com os respectivos diretórios de entrada e saída. Nesse caso, é provavelmente mais fácil seguir uma abordagem python.
Torsten
2

parece que você precisa de um loop for - consulte http://www.robvanderwoude.com/for.php para obter uma explicação de como eles funcionam.

Ian Turton
fonte
0

O Universal Translator no Mapinfo pode lidar com vários arquivos. Vá para a pasta de destino, selecione todos os shapefiles, defina o CRS para entrada e saída. Isso deveria estar pronto.

Bharadwaj AK
fonte
0

Este é o refinamento da resposta de Aragão acima. Ele executará apenas ogr2ogr em arquivos .TAB ou .tab e ignorará outros tipos de arquivos na pasta.

#!/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
fonte