2012-06-29 3 views
1

Я пытаюсь в течение последних 2 дней получить скрипт python для завершения , создавая шейп-файл из 289995 точек с атрибутами. Точками могут быть , но сценарий не заполняет атрибуты. Код работает правильно до тех пор, пока цикл: for j, p in enumerate(wCoords): (см. Код ниже-2-й цикл) , когда через некоторое время произошла ошибка сегментации. Я попытался добавить оператор if, который останавливает процессы в определенных интервалах, чтобы увидеть, могу ли я найти местоположение в цикле цикла, когда это произойдет . Цикл цикла без ошибок до 1000 циклов, но не до 10000, когда он останавливается без обратной связи, кажется бесконечной петлей. Программа предназначена для создания точек дерева, а затем прикрепляет высоту дерева атрибутов точек. Код ниже:Ошибка сегментации (сбрасывание ядра) на SetField/SetFeature в ogr

def save_shp(wCoords): 
    print 'saving shapefile...' 
    driver = ogr.GetDriverByName('ESRI Shapefile') 
    if os.path.exists('tree_points.shp'): 
     driver.DeleteDataSource('tree_points.shp') 
    ds = driver.CreateDataSource('tree_points.shp') 
    layer = ds.CreateLayer('trees', geom_type=ogr.wkbPoint) 
    layerDefn = layer.GetLayerDefn() 
    point = ogr.Geometry(ogr.wkbPoint) 

    for i, p in enumerate(wCoords): 
     point.AddPoint(p[0],p[1]) 
     featureIndex = i 
     feature = ogr.Feature(layerDefn) 
     feature.SetGeometry(point) 
     feature.SetFID(featureIndex) 
     layer.CreateFeature(feature) 

    fieldDefn = ogr.FieldDefn('tree_hts', ogr.OFTReal) 
    layer.CreateField(fieldDefn) 
    i = feature.GetFieldIndex('tree_hts')#??? 

    for j, p in enumerate(wCoords): 

     feature_n = layer.GetFeature(j) 
     feature_n.SetField(i, p[2])#??? 
     layer.SetFeature(feature_n) 

    try: 
     ds.Destroy() 
    except: 
     print 'still core dumping!' 

Я не знаю достаточно о библиотеке GDAL/OGR, чтобы дать вам больше информации, чем это. Пожалуйста, помогите. Жак

ответ

1

Несколько простых советов:

  • Используйте то же имя слоя в качестве префикса шейп: ds.CreateLayer('tree_points', ogr.wkbPoint)
  • ли ваш layer.CreateField(fieldDefn) вызов до добавления каких-либо данных
  • Loop через свои особенности сразу, одновременно создавая геометрию и объекты объектов.
  • Внутри цикла for вы должны создать новый объект геометрии и точечный индекс 0:

    point = ogr.Geometry(ogr.wkbPoint) 
    point.SetPoint_2D(0, p[0], p[1]) 
    
  • ; сохранить/закрыть, используя ds = None
Смежные вопросы