OGRとPythonのデータ型の間のマッピング?


8

PythonでOGRを使用してシェープファイルを作成し、Pythonデータソースからオンザフライでフィールドを作成しています。新しいフィールドの作成にはOGRデータ型が必要ですが、OGRとpythonデータ型の間にマッピングはありますか?

たとえば、これは標準です。

new_field = ogr.FieldDefn('MYFLD', ogr.OFTInteger)

理想的には:

ogr_datatype = get_ogr_data_type(python_data)
new_field = ogr.FieldDefn('MYFLD', ogr_datatype)

現在、変換はハードコーディングされています(たとえば、int = ogr.OFTInteger)。


geodjango ogrラッパーは、私が今まで使った中で最高のラッパーだと思います。地理的特徴を説明する非常に直感的な方法を提供します。あなたはそれについてgeodjangoのウェブサイトでそれについての詳細を見つけることができます。
シャオ2012年

回答:


9

Pythonの型は単なるintであるため、OGRの「型」への辞書を作成する必要があります。少し面倒ですが、OGR(およびSWIGで生成されたバインディング)には、CとPythonのどちらの言語であっても、言語の型の概念はありません。

このようなものはうまくいくはずです:

OGRTypes = {int: ogr.OFTInteger, str: ogr.OFTString, ...}

...

new_field = ogr.FieldDefn('MYFLD', OGRTypes[type(python_data)])

7

それだけの価値があるので、私はそのようなマッピングを含むPythonパッケージを持っています。https://github.com/Toblerity/Fiona/blob/master/src/fiona/ogrext.pyx#L18を参照してください。ここにコピー:

# Mapping of OGR integer field types to Fiona field type names.
#
# Only ints, floats, and unicode strings are supported. On the web, dates and
# times are represented as strings (see RFC 3339). 
FIELD_TYPES = [
    'int',          # OFTInteger, Simple 32bit integer
    None,           # OFTIntegerList, List of 32bit integers
    'float',       # OFTReal, Double Precision floating point
    None,           # OFTRealList, List of doubles
    'str',          # OFTString, String of ASCII chars
    None,           # OFTStringList, Array of strings
    None,           # OFTWideString, deprecated
    None,           # OFTWideStringList, deprecated
    None,           # OFTBinary, Raw Binary data
    None,           # OFTDate, Date
    None,           # OFTTime, Time
    None,           # OFTDateTime, Date and Time
    ]

# Mapping of Fiona field type names to Python types.
FIELD_TYPES_MAP = {
    'int':      IntType,
    'float':    FloatType,
    'str':      UnicodeType,
    }

野生のOFT * Listフィールドに出くわさないので、マッピングは不完全です。Pythonのリストは型指定されていないので、これらをPythonの配列にマッピングしたいと思います(たとえば、OFTIntegerList-> array( 'i')など)。OFTDate / Timeフィールドは悪魔であり、これらをPython DateTimeにマップしても、datetimeモジュールAPIがひどいため、状況は改善されません。私のプロジェクトでは、日付と時刻を "2012-01-02T20:59:38Z"のようなISO 8601文字列にマップします。生のバイナリデータは、非ユニコードのPython文字列(Python 3ではバイト型になります)にマッピングされます。


fionaについて言及するつもりだったので、下にスクロールして、既に投稿したことを確認します:)
Nathan W

1

Pythonでシェープファイルを編集するだけの場合は、PyShpを確認してください。

http://code.google.com/p/pyshp/

純粋なpythonなので、pythonデータ型のみを使用します。GeospatialPython.comでの一般的なジオメトリと属性の操作の例もあります

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