Для теста сделал таблицу со всеми возможными типами колонок. Когда начал вытаскивать структуру таблицы столкнулся с тем, что на разные поля 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)
-------------------------------------
