OGR CreateLayerがTypeErrorを返す


9

既存のラスターの空間投影に基づいてシェープファイルレイヤーを作成しようとしています。(最終的に、これはgdal.Polygonizeで使用され、ラスターデータから形状を取得します。)ただし、CreateLayerを使用しようとすると、エラーが発生します。

  • raster_uri-シェープファイルにしたいラスターファイルの場所。私はこれが存在することを知っています。
  • out_uri-場所新しいシェープファイルを印刷する場所。
  • layer_name-文字列のレイヤー名入力。
  • filed_name-文字列フィールド名入力。

これは私が使っていたコードです。

raster = gdal.Open(raster_uri)
driver = ogr.GetDriverByName("ESRI Shapefile")
ds = driver.CreateDataSource(out_uri)

spat_ref = osr.SpatialReference()
proj = raster.GetProjectionRef()
spat_ref.ImportFromWkt(proj)

layer = ds.CreateLayer(layer_name, spat_ref, ogr.wkbPolygon)

次のエラーメッセージが表示されます。

TypeError: in method 'DataSource_CreateLayer', argument 2 of type 'char const *'

spat_refのタイプの出力が表示される<class 'osgeo.osr.SpatialReference'>ので、どのchar const *が不満を言っているのかわかりません。

興味深いことに、同じファイルを使用してpythonシェルからこれをすべて実行しようとすると、レイヤーは正常に作成されます。何が問題になるのかについてのアイデアはありますか?

回答:


10

結局のところ、ESRIシェイプファイルにレイヤー名を作成することは、Unicode文字列を使用して行うことはできません。私のファイルシステムに戻って以来、一連のファイル名から動的にレイヤー名を取得していたため、Unicodeを使用できましたが、そのCreateLayer()ではサポートされていません。この問題は、(修正された)次のようにすることで解決されました。

layer_name = layer_name.encode('utf-8')
layer = ds.CreateLayer(layer_name, spat_ref, ogr.wkbPolygon)

これで問題なく動作しますが、潜在的な文字セットはわずかに小さくなります。


答えをありがとう、私は最終的に私の問題を解決するのに役立ちました。私はより深く掘り下げ、それをうまく説明するSOの関連記事を見つけました。他の人にも役立つように、私の発見を回答に要約します。(ネタバレ:文字列にキャストするだけで問題が解決しました)
DarkCygnus

0

この問題をさらに掘り下げて、私が抱えていた問題の解決策を提供するこのSOの答えを見つけました。

あなたの場合、あなたの場合、あなたlayer_nameはいくつかのユニコード文字を含んでいるようですが、それは簡単な方法で 'char const *'に変換できず、例外が発生する理由です。

これが、受け入れられた回答で提案されたソリューションが機能する理由です。これは、エンコーディングをUTF-8バイト文字列に変更し、「char const *」に簡単に変換できるためです(偶然にも、同じSOの別の回答でも提案されていました)役職)。

代わりに私のために働いたのは、次のようにして単に文字列にキャストするlayer_nameことです:

layer = ds.CreateLayer(str(layer_name), spat_ref, ogr.wkbPolygon)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.