Memetakan antara tipe data OGR dan Python?

8

Saya sedang menulis shapefile menggunakan OGR dalam python, membuat bidang on-the-fly dari sumber data python. Pembuatan bidang baru membutuhkan tipe data OGR, apakah ada pemetaan antara tipe data OGR dan python?

Sebagai contoh, ini akan menjadi norma:

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

Idealnya:

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

Saat ini konversi saya menggunakan kode keras (mis. Int = ogr.OFTInteger), tetapi ini sedikit menyusahkan dan bergantung pada saya untuk mengkode semua tipe data yang mungkin.

Tomas
sumber
Saya pikir pembungkus ogr geodjango adalah pembungkus terbaik yang pernah saya gunakan. Ini memberikan cara yang sangat intuitif untuk menggambarkan fitur geo. Anda dapat menemukan informasi lebih lanjut tentang itu di situs web geodjango .
xiao

Jawaban:

9

Anda harus membuat kamus jenis Python ke "jenis" OGR karena hanya berupa int. Ini agak menyusahkan, saya beri Anda, tetapi OGR (dan binding yang dihasilkan SWIG) tidak memiliki gagasan tentang jenis bahasa apakah itu dalam C atau Python.

Sesuatu seperti ini seharusnya bekerja:

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

...

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

Untuk apa nilainya, saya punya paket Python yang berisi pemetaan seperti itu. Lihat https://github.com/Toblerity/Fiona/blob/master/src/fiona/ogrext.pyx#L18 . Disalin di sini:

# 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,
    }

Pemetaan saya tidak lengkap karena saya tidak mengalami banyak bidang Daftar OFT * di alam. Anda ingin memetakan ini ke array Python, saya kira (OFTIntegerList -> array ('i') misalnya) karena daftar Python tidak diketik. Bidang OFTDate / Time adalah iblis dan pemetaan ini ke Python DateTime tidak membuat situasi lebih baik karena API modul datetime mengerikan. Dalam proyek saya, saya akan memetakan tanggal dan waktu ke string ISO 8601 seperti "2012-01-02T20: 59: 38Z". Data biner mentah akan dipetakan ke string Python non-unicode (yang menjadi tipe byte di Python 3).

sgillies
sumber
Akan menyebutkan fiona dan kemudian saya gulir ke bawah dan melihat Anda sudah diposting :)
Nathan W
1

Jika sasaran Anda hanyalah pengeditan shapefile dengan Python, periksa PyShp:

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

Ini python murni sehingga Anda hanya menggunakan tipe data python. Saya juga punya contoh geometri umum dan operasi atribut di GeospatialPython.com

GeospatialPython.com
sumber