使用ogr2​​ogr转换目录中的所有shapefile?


25

我有一个包含几个shapefile的目录。

如何使用ogr2​​ogr将所有这些shapefile转换为MapInfo?

我知道如何转换一个文件。我可以制作一个批处理脚本,为每个文件写一行。但是没有一种更简便的方法来转换目录(和子目录)中的所有文件。


这取决于什么操作系统。基本上进行“ for”循环,请参见gis.stackexchange.com/questions/7803/…–
Mike T

操作系统是Windows7。请在命令提示符下尝试以下操作:* .shp中的%f; 做ogr2ogr -f MapInfo文件$ f.tab。但这是行不通的。我收到错误消息:“无法使用以下驱动程序打开datasour'$ f.tab'.....
Stefan

这是执行SHP到TAB的方法:ogr2ogr -f“ MapInfo文件”%1.tab%1.shp。但是,除非OGR能够正确识别PRJ文件,否则您很容易以内置错误的coordsys生成TAB文件。我建议使用内置的通用转换器(按比例缩小的FME),它也可以处理您选择的所有文件。它允许您选择正确的coordsys。
Uffe Kousgaard

我确实对MapInfo File中的正确投影有问题。我尝试包括正确的投影,但这不起作用。mapinfo文件中的投影设置为非地球(米)。ogr2ogr工具是否可以包含正确的投影。我想将命令行放在另一个脚本中。因此,我宁愿不使用通用翻译器。
Stefan

您是否尝试过OGR库及其命令行工具?
亚历克斯·马尔科夫

Answers:


34

在Windows上,对于当前目录和当前目录下的子目录,请尝试以下命令:

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

简单介绍一下这是怎么回事的诡计%~dpnf.tab使用变量%F,与它增加了d河信,p ATH名称(例如,文件夹或目录),并提取文件ñ AME(没有.shp文件扩展名) 。最后,.tab在新扩展的复合变量修饰符之后立即添加。

因此,如果您在directory中C:\MyData,并且该目录中有数据,并且子目录C:\MyData\Region1C:\MyData\Region1\City1.shp则将处理任何Shapefile(带有扩展名),并且.tab将在同一目录中创建一个具有类似名称的文件。


凉!这可行!非常感谢您提供答案:)还有一个问题:还有一种方法可以引用子目录并将文件转换到另一个子目录中。我有一个包含shapefile的各种目录。例如:Netherlands \ shape \ provinceX Netherlands \ shape \ provinceY Netherlands \ shape \ provinceZ并将其转换为以下文件夹:Netherlands \ mapinfo \ provinceX Netherlands \ mapinfo \ provinceY Netherlands \ mapinfo \ provinceZ谢谢:)
Stefan

我已经对上述内容进行了递归搜索,但是我不知道如何执行额外的逻辑将“ shape”更改为“ mapinfo”。也许在superuser.com
Mike T

1
再次感谢您的快速回复。这非常有帮助。我只需要将文件复制到正确的目录。
Stefan

请注意,Windows命令行和批处理文件命令有所不同:您必须将百分比翻倍%f%%f。有关详细信息,请参见ss64.com/nt/for.html
AndreJ

很棒,是在MAC上的类似方法
Ryan Garnett

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的OS(即Linux或OS X),则clhenrik 在此处开发一些批处理shell脚本(以上内容基于)。

我正在研究一个分叉,它使某些脚本更加通用,并提供了更多使用说明。



如果文件名包含空格,将导致错误。
JasonRDalton

8

正如Alex Markov所说,最好的方法是使用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
Nathan W

注意:此回复来自一个密切相关的问题,涉及不同的文件格式。
ub

嗨,当我在Ubuntu中尝试这种方法时,例如ogr2ogr -f“ KML” {outfolder} {infolder},我收到错误消息:“错误4:创建KML文件失败”。知道这里可能出什么问题吗?我已经建立了具有KML支持的GDAL
marty_c 2015年

7

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

您可以更改os.getcwd()为文件所在的路径...

希望对您有帮助


for a in *.shp:是语法错误;您正在考虑from glob import glob; for a in glob('*.shp'):
Mike T

哦,对不起,我写错了样式。我已经更新了。@迈克·托斯谢谢。
阿拉贡

4

您不需要循环,只需将目录命名为源和目标即可,ogr2ogr会转换源目录中的所有文件。参见此处: 将TAB转换为MIF /将MIF转换为TAB


谢谢!我可以从一个父目录引用所有子目录并将所有文件转换为其他子目录吗?我拥有:Netherlands \ shape \ provinceX Netherlands \ shape \ provinceY Netherlands \ shape \ provinceZ等等...并将其转换为以下文件夹:Netherlands \ mapinfo \ provinceX Netherlands \ mapinfo \ provinceY Netherlands \ mapinfo \ provinceZ我可以为每个省写一条线,但我也可以用一个命令来做
Stefan 2012年

我没有尝试过,但是我认为这是不可能的。您将需要一个处理各自输入和输出目录的循环。在这种情况下,遵循python方法可能会更容易。
Torsten 2012年


0

Mapinfo中的Universal Translator可处理多个文件。转到目标文件夹,选择所有shapefile,为输入和输出定义CRS。应该做的。


0

这是上述Aragon答案的改进。它只会在.TAB或.tab文件上运行ogr2ogr,而忽略文件夹中的其他文件类型。

#!/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))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.