2015-07-08 1 views
0

Я твердо верю, что этот вопрос уже задан, но я не могу найти ответ, поэтому я размещаю его перед вами. У меня возникла проблема при запуске скрипта для преобразования файлов osm в файлы shp. Скрипт читает все файлы osm, но просто создает один файл shp первого файла osm в конце, а не конвертирует все файлы osm. Я предоставляю код, который я использовал ниже. Поэтому, пожалуйста, любезно помогите мне в решении этого.Как преобразовать набор файлов osm в файлы с использованием ogr2ogr в python


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" 

ответ

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. Убедитесь, что файлы и каталоги, указанные в этой команде, являются правильными.

PS: каждый элемент в archivos будет уже содержать реж часть, так что вы должны split часть папки, а не join Инг.

PS2: вам, возможно, потребуется использовать двойную обратную косую черту для dirs. Кроме того, имейте в виду os.sep.

+0

Спасибо за ваш ответ Sancho.S ... Но это не помогает, на деле все усложняется. файл формы не создается – Jothi

+0

@Jothi - см. обновленный ответ. –

Смежные вопросы