8 votos

¿Hay una asignación entre OGR y python tipos de datos?

Estoy escribiendo un shapefile utilizando OGR en python, creando campos on-the-fly de un origen de datos de python. Creación de un nuevo campo requiere un tipo de datos OGR, hay una asignación entre OGR y python tipos de datos?

Por ejemplo, sería la norma:

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

Lo ideal sería:

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

Actualmente mis conversiones duro codificados (por ejemplo, int = ogr. OFTInteger), pero esto es un poco de un dolor y depende de mi codificación de todos los tipos de datos posibles.

Gracias.

9voto

Symmetric Puntos 158

Tendrás que crear un diccionario de los tipos de Python a OGR "tipos" porque son solo ints. Es un poco de un dolor que le concede, pero OGR (y los enlaces generados por TRAGO) no tienen ninguna noción de los tipos de la lengua 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)])

8voto

Antonio Haley Puntos 2588

Para lo que vale, tengo un paquete de Python que contiene tal asignación. Ver https://github.com/Toblerity/Fiona/blob/master/src/fiona/ogrext.pyx#L18. Copiado de 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 asignación es incompleta, porque no se ejecutan en muchos OFT*Lista de campos en la naturaleza. Te gustaría asignar estos a Python matrices, supongo (OFTIntegerList -> array('i') por ejemplo), ya que las listas de Python no se ha escrito. OFTDate/campos de Tiempo son el diablo y la asignación de estos a Python DateTime no mejora la situación debido a que el módulo datetime API es horrible. En mi proyecto, voy a mapa de fechas y horas para la norma ISO 8601 cadenas como "2012-01-02T20:59:38Z". Binario de datos se asignan a un no-unicode cadena Python (que se convierte en la bytes tipo en Python 3).

5voto

andynormancx Puntos 234

Creo que la envoltura de ogr geodjango es la mejor envoltura que siempre he utilizado. Proporciona una manera intuitiva para describir características de geo. Encontrará más información en la Página Web de geodjango.

1voto

harpo Puntos 17399

Si eres objetivo es editar simplemente shapefile en Python salida PyShp:

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

Es puro python Utilice únicamente tipos de datos de python. También tengo ejemplos de operaciones comunes de la geometría y atributos de GeospatialPython.com

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X