PythonでOGRを使用してレイヤーを複製するより良い方法は?


8

ogrを使用して、大きなシェープファイルを多数の小さなシェープファイルに分割しています。元のフィールドとレイヤー構成情報をすべてコピーしたいのですが。これが私が今やっている方法です:

src = ogr.Open('original.shp', 0)
layer = src.GetLayerByIndex(0)
driver = ogr.GetDriverByName('ESRI Shapefile')
ds = driver.CreateDataSource('file1.shp')
dest_layer = ds.CreateLayer('layer1',
                            srs = layer.GetSpatialRef(),
                            geom_type=layer.GetLayerDefn().GetGeomType())
feature  = layer.GetFeature(0)
[dest_layer.CreateField(feature.GetFieldDefnRef(i)) for i in range(feature.GetFieldCount())]

これを行うためのより簡潔な方法はありますか?

回答:


10

OGRライブラリの非常に単純なラッパーであるSean GilliesのFionaを使用します(The Fiona User Manual

シェープファイルのすべての要素(スキーマ、レコード)は、Python辞書を使用して処理されます。

例としての私のシェープファイルの1つのスキーマ:

{'geometry': 'LineString', 'properties': {u'faille': 'str:20', u'type': 'str:20', u'id': 'int'}}

シェープファイルの1つのレコード:

{'geometry': {'type': 'LineString', 'coordinates': [(269884.20917418826, 151805.1917153612), (270409.89083992655, 153146.21637285672), (272298.05355768028, 154047.38494269375), (272941.74539327814, 155484.96337552898), (272169.31519056071, 156117.92701386689)]}, 'id': '1', 'properties': {'faille': u'de Salinas', 'type': u'normale'}}

シェープファイルを複製するには:

from shapely.geometry import mapping, shape
import fiona
# Read the original Shapefile
with fiona.collection('original.shp', 'r') as input:
    # The output has the same schema
    schema = input.schema.copy()
    # write a new shapefile
    with fiona.collection(''file1.shp', 'w', 'ESRI Shapefile', schema) as output:
        for elem in input:
             output.write({'properties': elem['properties'],'geometry': mapping(shape(elem['geometry']))})

大きなシェープファイルを多数の小さなシェープファイルに分割する場合、すべてがforループで行われますが、元のシェープファイルのすべてのスキーマは、schema = input.schema.copy()およびを使用して辞書に保存されます。{'properties': elem['properties']

QGISまたはGRASSでベクター線方位を見つける方法を参照してください例として

  1. シェープファイルを分割する
  2. 分割されたシェープファイルに元のシェープファイルの属性を保持する
  3. 分割したシェープファイルに新しいフィールドを追加します

Mac OS XまたはLinuxユーザーの場合、インストールは簡単です。Windowsユーザーは、Python拡張パッケージ用の Christoph Gohlke 非公式Windowsバイナリのバージョンを使用してください。


フィオナのシンプルさがとても気に入りました。しかし、私はFiona 1.6がGDAL 2で動作しないという問題に遭遇しました。うまくいけば、彼らはそれをアップグレードするでしょう...
Akhorus

0

上記のライブラリのインストールに苦労している人のために:

import shapefile

r = shapefile.Reader('original') # original shp file
w = shapefile.Writer()

w.fields = list(r.fields)
w._shapes.extend(r.shapes()) # copy over geometry without any changes
w.save('new_shp_file')
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.