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.
Respuestas:
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:
fuente
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í:
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).
fuente
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
fuente