如何在python中使用ogr2​​ogr将一组osm文件转换为形状文件

时间:2015-07-08 07:37:37

标签: python openstreetmap shapefile gdal ogr2ogr

我坚信这个问题已经被问到,但我找不到答案,所以我把它放在你面前。我在运行脚本以将osm文件转换为shp文件时遇到问题。该脚本正在读取所有osm文件,但只是在最后创建第一个osm文件的一个shp文件,而不是转换所有osm文件。我提供下面使用的代码。所以请帮助我解决这个问题。

from xml.dom import minidom
import os, sys
import xml.etree.ElementTree as ET

### ruta a gdal-data C:\Program Files (x86)\PostgreSQL\9.4\gdal-data

path = r"C:\Users\Administrator\Desktop\CHECKING\T2"

systemOutput = 'Shp'


print ("\n#### Execute python NY_osm2shapes")
print ("#### MONITORING CITIES")
print ("#### Conversor osm to shapes")
print ("#### OSM Path: " + path)

print "#### "
"""
Modify
Win: C:/Program Files/GDAL/gdal-data/osmconfig.ini
Linux: /usr/share/gdal/1.11/osmconfig.ini
report_all_ways=yes #activate lines without tag
attributes=landuse, plots #inside [lines]
attributes=landuse, plots #inside [multipolygons]
"""

### Check if path from argv
try:
    if len(sys.argv) >= 2:
       print("#### Path from argv: ", sys.argv[1])
       path = sys.argv[1]
    else:
       print "#### Path set to", path
       sys.exit()
except:
      pass


#### Ogr config
print "\n#### Process: osm to shapes"
ogrOutputType = ''      #-f "Esri Shapefile"'
ogrProjection = ''      # -t_srs EPSG:4326' #+ epsg
ogrProjectionA = ''     #-a_srs EPSG:3827'
ogrProjectionIn = ''    #-s_srs EPSG:3827' #-t_srs EPSG:4326

ogrConfigType = ' --config OSM_USE_CUSTOM_INDEXING NO'

ogr2ogr = 'ogr2ogr %s %s %s %s %s %s -overwrite %s %s %s  %s layer %s'

### Process
for l in os.walk(path):
    archivos = l[2]
    ruta = l[0]

for a in archivos:
    if a.endswith(".osm"):
        osmFile = os.path.join(ruta, a)
        folder = os.path.join(ruta, systemOutput)
        shapeFile = a[:-4]
        ogrFileOutput = " -nln " + shapeFile
        print "Archivo Shape: ", shapeFile,
        layerType = shapeFile[-1]


        if layerType=="0":
            print "\t TIPO 0: Circles"
            ogrSelectLayer = "lines"
            ogrLcoType = ' -lco SHPT=ARC'
            ogrSelect = ' -select ID_string'

        elif layerType == "1":
            print "\t TIPO 1: Blocks"
            ogrSelectLayer = "lines"
            ogrLcoType = ' -lco SHPT=ARC'
            ogrSelect = ' -select Land_use'

        elif layerType == "2":
            print "\t TIPO 2: Plots"
            ogrSelectLayer = "lines"
            ogrLcoType = ' -lco SHPT=ARC'
            ogrSelect = ' -select Plot'

        elif layerType == "3":
            print "\t TIPO 3: Medians"
            ogrSelectLayer = "lines"
            ogrLcoType = ' -lco SHPT=ARC'
            ogrSelect = ' -select ID_string'


        else:
            print "ELSE ERROR*"


        systemOutput = ogr2ogr % (ogrOutputType, folder, osmFile, ogrProjectionA, ogrProjectionIn, ogrProjection, ogrFileOutput, ogrLcoType, ogrConfigType, ogrSelect, ogrSelectLayer)

        #print ("Fichero: ", osmFile, shapeFile, layerType, ogrSelectLayer)

        os.system(systemOutput)
print "End process"

1 个答案:

答案 0 :(得分:0)

您使用os.walk的方式返回archivos遍历的树结构的最后osm中的所有ruta个文件。这可能(至少是你的问题的一部分),或将来也可能如此。

您必须以不同的方式使用os.walk

import os, re

ext_regx = '\.osm$'
archivos = []

for ruta, dirs, archs in os.walk( path ) :
    for arch in archs :
        if re.search( ext_regx, arch ) :
            archivos.append( os.path.join( ruta, arch ) )

for osmFile in archivos :
    print( osmFile )
    ...

现在,如果for循环中的代码不符合您的意思,那就是另一个问题。 我建议你:

  1. 添加print( systemOutput )以检查执行的每个命令是否符合您的要求。
  2. 检查该命令中引用的文件和目录是否正确。
  3. PS:archivos中的每个项目都已包含dir部分,因此您必须split文件夹部分,而不是join

    PS2:您可能需要为dirs使用双反斜杠。另外,请记住os.sep