Python, GDAL/OGR, MapInfo Получить типы колонок таблицы
Добавлено: 05 июл 2012, 09:44
Хочу получить структуру таблицы mapinfo tab-файла, для дальнейшего сравнения её с другими таблицами.
Для теста сделал таблицу со всеми возможными типами колонок. Когда начал вытаскивать структуру таблицы столкнулся с тем, что на разные поля ogr выдает одинаковый тип.
А именно: Integer и Small Integer полностью идентичны, а колонка Logical похожа на строку из 1 символа.
Кто-нибудь сталкивался с такой проблемой? Как узнать исходный тип?
Python 2.5.1, gdal 1.6
Используемый код для определения структуры
Вывод
Для теста сделал таблицу со всеми возможными типами колонок. Когда начал вытаскивать структуру таблицы столкнулся с тем, что на разные поля 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)
-------------------------------------