Для теста сделал таблицу со всеми возможными типами колонок. Когда начал вытаскивать структуру таблицы столкнулся с тем, что на разные поля ogr выдает одинаковый тип.
А именно: Integer и Small Integer полностью идентичны, а колонка Logical похожа на строку из 1 символа.
Кто-нибудь сталкивался с такой проблемой? Как узнать исходный тип?
Python 2.5.1, gdal 1.6
Используемый код для определения структуры
Код: Выделить всё
from osgeo import ogr
import os
oft_fields = dict((getattr(ogr, x), x) for x in dir(ogr) if x.startswith('OFT'))
def get_columns(tabFile):
tab = ogr.Open(tabFile, False)
layer = tab.GetLayer(0)
fields = layer.GetLayerDefn()
for i in range( fields.GetFieldCount() ):
field = fields.GetFieldDefn( i )
print "Field name: \t\t'%s'" % (field.GetNameRef())
print "Field type: \t\t%s (%s)" % (field.GetType(), oft_fields.get(field.GetType(), 'unknown'))
print "GetFieldTypeName: \t", field.GetFieldTypeName(field.GetType())
print "Width,Precision: \t(%s,%s)" % (field.GetWidth(), field.GetPrecision())
#print "MapInfo type: %s" % ( ??? )
print "-------------------------------------\n"
print get_columns(r'.\TEST_TYPES.TAB')
Код: Выделить всё
Field name: 'Character10' ( исходный тип записан в названии колонки для удобства)
Field type: 4 (OFTString) (возвращаемый ogr'ом тип)
GetFieldTypeName: String (возвращаемое ogr'ом имя типа)
Width,Precision: (10,0) (возвращаемая ogr'ом ширина и точность)
-------------------------------------
Field name: 'Integer'
Field type: 0 (OFTInteger)
GetFieldTypeName: Integer
Width,Precision: (0,0)
-------------------------------------
Field name: 'Small_Integer'
Field type: 0 (OFTInteger)
GetFieldTypeName: Integer
Width,Precision: (0,0)
-------------------------------------
Field name: 'Float'
Field type: 2 (OFTReal)
GetFieldTypeName: Real
Width,Precision: (0,0)
-------------------------------------
Field name: 'Decimal_10_0'
Field type: 2 (OFTReal)
GetFieldTypeName: Real
Width,Precision: (10,0)
-------------------------------------
Field name: 'Decimal_10_6'
Field type: 2 (OFTReal)
GetFieldTypeName: Real
Width,Precision: (10,8)
-------------------------------------
Field name: 'Date'
Field type: 9 (OFTDate)
GetFieldTypeName: Date
Width,Precision: (10,0)
-------------------------------------
Field name: 'Time'
Field type: 10 (OFTTime)
GetFieldTypeName: Time
Width,Precision: (8,0)
-------------------------------------
Field name: 'DateTime'
Field type: 11 (OFTDateTime)
GetFieldTypeName: DateTime
Width,Precision: (19,0)
-------------------------------------
Field name: 'Logical'
Field type: 4 (OFTString)
GetFieldTypeName: String
Width,Precision: (1,0)
-------------------------------------