Zuordnung zwischen OGR- und Python-Datentypen?

8

Ich schreibe ein Shapefile mit OGR in Python und erstelle Felder im laufenden Betrieb aus einer Python-Datenquelle. Für die Erstellung eines neuen Felds ist ein OGR-Datentyp erforderlich. Gibt es eine Zuordnung zwischen OGR- und Python-Datentypen?

Dies wäre beispielsweise die Norm:

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

Im Idealfall:

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

Derzeit sind meine Konvertierungen fest codiert (z. B. int = ogr.OFTInteger), aber dies ist ein bisschen mühsam und hängt davon ab, dass ich alle möglichen Datentypen codiere.

Tomas
quelle
Ich denke, der Geodjango Ogr Wrapper ist der beste Wrapper, den ich je benutzt habe. Es bietet eine sehr intuitive Möglichkeit, Geofunktionen zu beschreiben. Weitere Informationen dazu finden Sie auf der Geodjango-Website .
Xiao

Antworten:

9

Sie müssen ein Wörterbuch mit Python-Typen für OGR- "Typen" erstellen, da diese nur Ints sind. Ich gebe Ihnen zu, dass es ein bisschen schmerzhaft ist, aber OGR (und die von SWIG generierten Bindungen) haben keine Ahnung von den Typen einer Sprache, egal ob in C oder Python.

So etwas sollte funktionieren:

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

...

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

Für das, was es wert ist, habe ich ein Python-Paket, das eine solche Zuordnung enthält. Siehe https://github.com/Toblerity/Fiona/blob/master/src/fiona/ogrext.pyx#L18 . Hier kopiert:

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

Meine Zuordnung ist unvollständig, da ich in freier Wildbahn nicht auf viele OFT * -Listenfelder stoße. Sie möchten diese wahrscheinlich Python-Arrays zuordnen (OFTIntegerList -> Array ('i') zum Beispiel), da Pythons Listen nicht typisiert sind. OFTDate / Time-Felder sind der Teufel, und die Zuordnung zu Python DateTime verbessert die Situation nicht, da die Datetime-Modul-API schrecklich ist. In meinem Projekt werde ich Datums- und Uhrzeitangaben ISO 8601-Zeichenfolgen wie "2012-01-02T20: 59: 38Z" zuordnen. Rohe Binärdaten würden einer Nicht-Unicode-Python-Zeichenfolge zugeordnet (die in Python 3 zum Bytetyp wird).

sgillies
quelle
Wollte fiona erwähnen und dann scrolle ich nach unten und sehe, dass du bereits gepostet hast :)
Nathan W
1

Wenn Ihr Ziel einfach die Bearbeitung von Shapefiles in Python ist, schauen Sie sich PyShp an:

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

Es ist reines Python, daher verwenden Sie nur Python-Datentypen. Ich habe auch Beispiele für allgemeine Geometrie- und Attributoperationen auf GeospatialPython.com

GeospatialPython.com
quelle