Mapeo entre los tipos de datos OGR y Python?

8

Estoy escribiendo un archivo de forma usando OGR en python, creando campos sobre la marcha desde una fuente de datos de python. La creación de un nuevo campo requiere un tipo de datos OGR, ¿existe una asignación entre los tipos de datos OGR y python?

Por ejemplo, esta sería la norma:

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

Idealmente:

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

Actualmente mis conversiones están codificadas (por ejemplo, int = ogr.OFTInteger), pero esto es un poco molesto y depende de mí la codificación de todos los tipos de datos posibles.

Tomás
fuente
Creo que el contenedor geodjango ogr es el mejor contenedor que he usado. Proporciona una forma muy intuitiva de describir características geográficas. Puede encontrar más información al respecto en el sitio web de geodjango .
xiao

Respuestas:

9

Tendrás que crear un diccionario de tipos de Python a "tipos" de OGR porque son solo ints. Te doy un poco de dolor, pero OGR (y los enlaces generados por SWIG) no tienen noción de los tipos de un lenguaje, ya sea en C o Python.

Algo como esto debería funcionar:

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

...

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

Por lo que vale, tengo un paquete de Python que contiene dicha asignación. Ver https://github.com/Toblerity/Fiona/blob/master/src/fiona/ogrext.pyx#L18 . Copiado aquí:

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

Mi mapeo está incompleto porque no me encuentro con muchos campos OFT * List en la naturaleza. Supongo que querrá asignarlos a matrices de Python (OFTIntegerList -> array ('i') por ejemplo) ya que las listas de Python no están escritas. Los campos OFTDate / Time son el demonio y asignarlos a Python DateTime no mejora la situación porque la API del módulo datetime es horrible. En mi proyecto, voy a asignar fechas y horas a cadenas ISO 8601 como "2012-01-02T20: 59: 38Z". Los datos binarios sin procesar se asignarían a una cadena de Python no unicode (que se convierte en el tipo de bytes en Python 3).

sgillies
fuente
Iba a mencionar a Fiona y luego me desplazo hacia abajo y veo que ya has publicado :)
Nathan W
1

Si su objetivo es simplemente editar archivos de formas en Python, consulte PyShp:

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

Es Python puro, por lo que solo usa tipos de datos de Python. También tengo ejemplos de operaciones comunes de geometría y atributos en GeospatialPython.com

GeospatialPython.com
fuente