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

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

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

评论

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

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

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

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

您是否尝试过OGR库及其命令行工具?

#1 楼

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

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


为了简要说明此处所发生的问题,%~dpnf.tab使用了变量%f,通过它添加驱动器号,路径名(即文件夹或目录),并提取文件名(不包括.shp文件扩展名)。最后,将.tab添加到新扩展的复合变量修饰符之后。 (扩展名为C:\MyData)(将被处理),并且将在同一目录中创建带有C:\MyData\Region1的类似命名文件。

评论


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

– Stefan
2012年5月14日10:21



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

– Mike T
2012年5月14日上午11:06

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

– Stefan
2012年5月14日12:22

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

– AndreJ
16年8月23日在15:53

这很棒,是MAC上的类似方法

–瑞安·加内特(Ryan Garnett)
16-10-2在16:00

#2 楼

对于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在此处开发了一些批处理shell脚本(上面是基于这些脚本的。)更通用,并提供更多使用说明。



评论


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

–JasonRDalton
18年3月14日在15:21

#3 楼

使用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()更改为文件所在的路径...

希望对您有所帮助

评论


对于* .shp:是语法错误;您正在考虑从全局导入全局;对于一个glob('*。shp'):

– Mike T
2012年5月14日晚上10:15

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

–阿拉贡
2012年5月14日上午10:27

#4 楼

正如Alex Markov所说,最好的方法是让您使用OGR。

您将需要编写一个脚本,但是非常简单。基本上,如果您使用的是Windows,则所需要做的就是在命令行中运行以下代码(在所需的文件夹内):

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


检查此站点,所有在这里说明:

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

评论


我认为您也可以这样做:ogr2ogr -f“ KML” {outfolder} {infolder}技巧摘自underdark.wordpress.com/2012/05/09/batch-shapefile-clipping

–内森·W
2012年5月16日11:26



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

– hu
2012年5月16日下午14:07

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

–marty_c
2015年2月23日在12:10



#5 楼

您不需要循环,只需将目录命名为源和目标即可,ogr2ogr会转换源目录中的任何文件。 />

评论


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

– Stefan
2012年5月14日12:24



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

– Torsten
2012年5月15日在9:54

#6 楼

听起来您需要一个for循环-有关它们如何工作的说明,请参见http://www.robvanderwoude.com/for.php。

#7 楼

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

#8 楼

这是上述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))