1

過去 2 日間、python スクリプトを取得して、属性を持つ 289995 ポイントのシェープファイルの作成を完了しようとしました。ポイントは作成できますが、スクリプトは属性を完成しません。コードは、ループまで正しく実行されます: for j, p in enumerate(wCoords):(2 番目のループの下のコードを参照) しばらくすると、セグメンテーション違反が発生します。特定の間隔でプロセスを停止するifステートメントを追加して、ループサイクルが発生したときにその場所を見つけることができるかどうかを確認しようとしました。ループは 1000 サイクルまで問題なく循環しますが、10,000 サイクルまではフィードバックなしで停止し、エンドレス ループのように見えます。このプログラムは、木のポイントを作成し、そのポイントに木の高さ属性をアタッチします。コードは以下のとおりです。

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 については、これ以上の情報を提供できるほど詳しくありません。助けてください。ジャック

4

1 に答える 1

1

いくつかの簡単なヒント:

  • シェープファイルのプレフィックスと同じレイヤー名を使用します。ds.CreateLayer('tree_points', ogr.wkbPoint)
  • layer.CreateField(fieldDefn)データを追加する前に呼び出しを行う
  • フィーチャを1 回ループして、ジオメトリ オブジェクトとフィーチャ オブジェクトを同時に作成します。
  • for ループ内で、新しいジオメトリ オブジェクトを作成し、インデックス 0 を指定する必要があります。

    point = ogr.Geometry(ogr.wkbPoint)
    point.SetPoint_2D(0, p[0], p[1])
    
  • 必要ありませんds.Destroy(); を使用して保存/閉じるds = None
于 2012-07-04T04:24:40.723 に答える