Пример #1
0
def test_compare(version, key, features):
    for tst, ref in features(version):
        itst = tst.GetFieldIndex(key)
        iref = ref.GetFieldIndex(key)

        dtst = tst.GetFieldDefnRef(itst)
        dref = ref.GetFieldDefnRef(iref)
        assert tst.IsFieldNull(itst) == ref.IsFieldNull(iref)

        tp_tst, tp_ref = dtst.GetType(), dref.GetType()
        if tp_tst == ogr.OFTString and tp_ref == ogr.OFTDate:
            vref = ref.GetFieldAsString(iref).replace('/', '-')
            assert tst.GetFieldAsString(itst) == vref
        elif tp_tst == ogr.OFTString and tp_ref == ogr.OFTDateTime:
            vref = ref.GetFieldAsString(iref).replace('/',
                                                      '-').replace(' ', 'T')
            assert tst.GetFieldAsString(itst) == vref
        else:
            tn_tst = ogr.GetFieldTypeName(dtst.GetType())
            tn_ref = ogr.GetFieldTypeName(dref.GetType())
            assert tn_tst == tn_ref, "Field type mismatch"

            if dref.GetType() == ogr.OFTReal:
                gname = 'GetFieldAsDouble'
            else:
                gname = 'GetFieldAs' + ogr.GetFieldTypeName(dref.GetType())

            vtst = getattr(tst, gname)(itst)
            vref = getattr(ref, gname)(iref)

            if dtst.GetType() == ogr.OFTReal:
                assert abs(vtst - vref) < 1e-6
            else:
                assert vtst == vref
Пример #2
0
def DumpReadableFeature( poFeature, options = None ):

    poDefn = poFeature.GetDefnRef()
    print("OGRFeature(%s):%ld" % (poDefn.GetName(), poFeature.GetFID() ))

    if 'DISPLAY_FIELDS' not in options or EQUAL(options['DISPLAY_FIELDS'], 'yes'):
        for iField in range(poDefn.GetFieldCount()):

            poFDefn = poDefn.GetFieldDefn(iField)

            line =  "  %s (%s) = " % ( \
                    poFDefn.GetNameRef(), \
                    ogr.GetFieldTypeName(poFDefn.GetType()) )

            if poFeature.IsFieldSet( iField ):
                line = line + "%s" % (poFeature.GetFieldAsString( iField ) )
            else:
                line = line + "(null)"

            print(line)


    if poFeature.GetStyleString() is not None:

        if 'DISPLAY_STYLE' not in options or EQUAL(options['DISPLAY_STYLE'], 'yes'):
            print("  Style = %s" % GetStyleString() )

    poGeometry = poFeature.GetGeometryRef()
    if poGeometry is not None:
        if 'DISPLAY_GEOMETRY' not in options or not EQUAL(options['DISPLAY_GEOMETRY'], 'no'):
            DumpReadableGeometry( poGeometry, "  ", options)

    print('')

    return
Пример #3
0
    def fields_of(self, feature):
        for k, v in feature.items():
            datatype = ogr.GetFieldTypeName(
                feature.GetFieldType(feature.GetFieldIndex(k)))
            if v is None:
                continue

            yield {'attribute': k, 'value': v, 'datatype': datatype}
Пример #4
0
def featuresToFile(features,
                   dst_drv,
                   dst_name,
                   dst_srs,
                   layer_name=None,
                   geomtype=None,
                   overwrite=True):
    if not features:  # features is empty list
        print("No Features Created")
        return

    drv = ogr.GetDriverByName(dst_drv)
    if drv is None:
        print("Driver not available ({})".format(dst_drv))
        return

    dsrc = drv.CreateDataSource(dst_name)
    if dsrc is None:
        print("DataSource creation failed")
        return

    if not geomtype:
        f0 = features[0]
        geomref = features[0].GetGeometryRef()
        if geomref is not None:
            geomtype = geomref.GetGeometryType()
        else:
            return

    layer = dsrc.CreateLayer(layer_name, srs=dst_srs, geom_type=geomtype)

    # Create the fields for the new file
    for i in range(features[0].GetFieldCount()):
        fieldDef = features[0].GetFieldDefnRef(i)
        if "List" in ogr.GetFieldTypeName(fieldDef.GetType()):
            t = ogr.GetFieldTypeName(fieldDef.GetType())[:-4]
            if t == "String":
                fieldDef = ogr.FieldDefn(fieldDef.GetName(), ogr.OFTString)
            elif t == "Integer":
                fieldDef = ogr.FieldDefn(fieldDef.GetName(), ogr.OFTInteger)

        layer.CreateField(fieldDef)

    # print layer_name
    for feature in features:
        layer.CreateFeature(feature)
Пример #5
0
def test_compare(version, key, features):
    for tst, ref in features(version):
        itst = tst.GetFieldIndex(key)
        iref = ref.GetFieldIndex(key)

        dtst = tst.GetFieldDefnRef(itst)
        dref = ref.GetFieldDefnRef(iref)
        assert tst.IsFieldNull(itst) == ref.IsFieldNull(iref)
        assert ogr.GetFieldTypeName(dtst.GetType()) == ogr.GetFieldTypeName(
            dref.GetType())

        if dref.GetType() == ogr.OFTReal:
            gname = 'GetFieldAsDouble'
        else:
            gname = 'GetFieldAs' + ogr.GetFieldTypeName(dref.GetType())

        vtst = getattr(tst, gname)(itst)
        vref = getattr(ref, gname)(iref)

        if dtst.GetType() == ogr.OFTReal:
            assert abs(vtst - vref) < 1e-6
        else:
            assert vtst == vref
Пример #6
0
def DumpReadableFeature(poFeature, options=None):

    poDefn = poFeature.GetDefnRef()
    print("OGRFeature(%s):%ld" % (poDefn.GetName(), poFeature.GetFID()))

    if 'DISPLAY_FIELDS' not in options or EQUAL(options['DISPLAY_FIELDS'],
                                                'yes'):
        for iField in range(poDefn.GetFieldCount()):

            poFDefn = poDefn.GetFieldDefn(iField)

            line =  "  %s (%s) = " % ( \
                    poFDefn.GetNameRef(), \
                    ogr.GetFieldTypeName(poFDefn.GetType()) )

            if poFeature.IsFieldSet(iField):
                try:
                    line = line + "%s" % (poFeature.GetFieldAsString(iField))
                except:
                    # For Python3 on non-UTF8 strings
                    line = line + "%s" % (poFeature.GetFieldAsBinary(iField))
            else:
                line = line + "(null)"

            print(line)

    if poFeature.GetStyleString() is not None:

        if 'DISPLAY_STYLE' not in options or EQUAL(options['DISPLAY_STYLE'],
                                                   'yes'):
            print("  Style = %s" % poFeature.GetStyleString())

    nGeomFieldCount = poFeature.GetGeomFieldCount()
    if nGeomFieldCount > 0:
        if 'DISPLAY_GEOMETRY' not in options or not EQUAL(
                options['DISPLAY_GEOMETRY'], 'no'):
            for iField in range(nGeomFieldCount):
                poGFldDefn = poFeature.GetDefnRef().GetGeomFieldDefn(iField)
                poGeometry = poFeature.GetGeomFieldRef(iField)
                if poGeometry is not None:
                    sys.stdout.write("  ")
                    if len(poGFldDefn.GetNameRef()
                           ) > 0 and nGeomFieldCount > 1:
                        sys.stdout.write("%s = " % poGFldDefn.GetNameRef())
                    DumpReadableGeometry(poGeometry, "", options)

    print('')

    return
def vrt_layer(layer, infile, geomFieldCount, iGeom, relative="0"):
    layerdef = layer.GetLayerDefn()
    name = layerdef.GetName()
    poGFldDefn = None
    nameSuffix = ''
    if geomFieldCount == 1:
        gFldType = GeomType2Name(layerdef.GetGeomType())
    elif geomFieldCount > 1:
        poGFldDefn = layerdef.GetGeomFieldDefn(iGeom)
        gFldType = GeomType2Name(poGFldDefn.GetType())
        gFldName = poGFldDefn.GetNameRef()
        nameSuffix = '__%s' % gFldName
    else:
        gFldType = 'wkbNone'

    vrt = ''
    vrt += '  <OGRVRTLayer name="%s">\n' % Esc(name + nameSuffix)
    vrt += '    <SrcDataSource relativeToVRT="%s" shared="%d">%s</SrcDataSource>\n' \
           % (relative, True, Esc(str(infile)))
    vrt += '    <SrcLayer>%s</SrcLayer>\n' % Esc(name)
    vrt += '    <GeometryType>%s</GeometryType>\n' % gFldType
    # Add FeatureCount for QGIS layer selection
    vrt += '    <FeatureCount>%d</FeatureCount>\n' % layer.GetFeatureCount()
    # OGR sometimes doesn't detect FID of source (Ili2 only?).
    # Workaround: We explicitly add TID as FID, when available
    if layer.GetFIDColumn() == '' and layerdef.GetFieldIndex("TID") != -1:
        vrt += '    <FID>TID</FID>\n'
    if poGFldDefn is not None:
        vrt += '    <GeometryField name="%s"/>\n' % gFldName
        if poGFldDefn.GetSpatialRef() is not None:
            vrt += '    <LayerSRS>%s</LayerSRS>\n' \
                   % (Esc(poGFldDefn.GetSpatialRef().ExportToWkt()))

    # Process all the fields.
    for fld_index in range(layerdef.GetFieldCount()):
        src_fd = layerdef.GetFieldDefn(fld_index)
        vrt += '    <Field name="%s" type="%s"' \
               % (Esc(src_fd.GetName()),
                  ogr.GetFieldTypeName(src_fd.GetType()))
        vrt += ' src="%s"' % Esc(src_fd.GetName())
        if src_fd.GetWidth() > 0:
            vrt += ' width="%d"' % src_fd.GetWidth()
        if src_fd.GetPrecision() > 0:
            vrt += ' precision="%d"' % src_fd.GetPrecision()
        vrt += '/>\n'

    vrt += '  </OGRVRTLayer>\n'
    return vrt
Пример #8
0
def DumpReadableFeature(inputs, res, poFeature, options=None):

    poDefn = poFeature.GetDefnRef()

    if 'DISPLAY_FIELDS' not in options or EQUAL(options['DISPLAY_FIELDS'],
                                                'yes'):
        line1 = {}
        for iField in range(poDefn.GetFieldCount()):

            poFDefn = poDefn.GetFieldDefn(iField)

            line =  "  %s (%s) = " % ( \
                    poFDefn.GetNameRef(), \
                    ogr.GetFieldTypeName(poFDefn.GetType()) )
            val = ""
            if poFeature.IsFieldSet(iField):
                line = line + "%s" % (poFeature.GetFieldAsString(iField))
                val = "%s" % (poFeature.GetFieldAsString(iField))
            else:
                line = line + "(null)"
                val = "(null)"
            line1[poFDefn.GetNameRef()] = val

        res += [line1]

    if poFeature.GetStyleString() is not None:

        if 'DISPLAY_STYLE' not in options or EQUAL(options['DISPLAY_STYLE'],
                                                   'yes'):
            print >> sys.stderr, "  Style = %s" % GetStyleString()

    poGeometry = poFeature.GetGeometryRef()
    if poGeometry is not None:
        if 'DISPLAY_GEOMETRY' not in options or not EQUAL(
                options['DISPLAY_GEOMETRY'], 'no'):
            DumpReadableGeometry(poGeometry, "  ", options)

    return
Пример #9
0
        ogr.OFTInteger,
        ogr.OFTIntegerList,
        ogr.OFTReal,
        ogr.OFTRealList,
        ogr.OFTString,
        ogr.OFTStringList,
        #ogr.OFTWideString,
        #ogr.OFTWideStringList,
        ogr.OFTBinary,
        ogr.OFTDate,
        ogr.OFTTime,
        ogr.OFTDateTime
]:
    #ogr.OFTInteger64,
    #ogr.OFTInteger64List
    ogrFieldTypes.append((fieldType, ogr.GetFieldTypeName(fieldType)))


class OgrFieldTypeDelegate(QtWidgets.QStyledItemDelegate):
    def __init__(self, parent=None):
        super(OgrFieldTypeDelegate, self).__init__(parent)

    def createEditor(self, parent, option, index):
        editor = QtWidgets.QComboBox(parent)
        for value, text in ogrFieldTypes:
            editor.addItem(text, value)
        editor.setAutoFillBackground(True)
        return editor

    def setEditorData(self, editor, index):
        if not editor:
Пример #10
0
def readVectorFile():
    # 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 为了使属性表字段支持中文,请添加下面这句
    gdal.SetConfigOption("SHAPE_ENCODING", "")

    currentFolder = os.getcwd()
    parentFolder = os.path.dirname(currentFolder)
    strVectorFile = parentFolder + "/testdata/flttoshp.shp"
    print(strVectorFile)

    # 注册所有的驱动
    ogr.RegisterAll()

    # 打开数据
    dataSource = ogr.Open(strVectorFile, 0)
    if dataSource == None:
        print("打开文件【%s】失败!", strVectorFile)
        return

    print("打开文件【%s】成功!", strVectorFile)

    # 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个
    iLayerCount = dataSource.GetLayerCount()

    # 获取第一个图层
    oLayer = dataSource.GetLayerByIndex(0)
    if oLayer == None:
        print("获取第%d个图层失败!\n", 0)
        return

    # 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
    oLayer.ResetReading()

    # 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容
    # oLayer.SetAttributeFilter("\"NAME99\"LIKE \"北京市市辖区\"")

    # 通过指定的几何对象对图层中的要素进行筛选
    # oLayer.SetSpatialFilter()

    # 通过指定的四至范围对图层中的要素进行筛选
    # oLayer.SetSpatialFilterRect()

    # 获取图层中的属性表表头并输出
    print("属性表结构信息:")
    oDefn = oLayer.GetLayerDefn()
    iFieldCount = oDefn.GetFieldCount()
    for iAttr in range(iFieldCount):
        oField = oDefn.GetFieldDefn(iAttr)
        print("%s: %s(%d.%d)" % ( oField.GetNameRef(), oField.GetFieldTypeName(oField.GetType()), oField.GetWidth(), oField.GetPrecision()))

        # 输出图层中的要素个数
    print("要素个数 = %d", oLayer.GetFeatureCount(0))

    oFeature = oLayer.GetNextFeature()
    # 下面开始遍历图层中的要素
    while oFeature is not None:
        print("当前处理第%d个: \n属性值:", oFeature.GetFID())
        # 获取要素中的属性表内容
        for iField in range(iFieldCount):
            oFieldDefn = oDefn.GetFieldDefn(iField)
            line = " %s (%s) = " % (oFieldDefn.GetNameRef(), ogr.GetFieldTypeName(oFieldDefn.GetType()))

            if oFeature.IsFieldSet(iField):
                line = line + "%s" % (oFeature.GetFieldAsString(iField))
        else:
            line = line + "(null)"

        print(line)

        # 获取要素中的几何体
        oGeometry = oFeature.GetGeometryRef()

        # 为了演示,只输出一个要素信息
        break

    # 释放内存
    oFeature.Destroy()
    # 关闭数据源,相当于文件系统操作中的关闭文件
    dataSource.Destroy()
    print("数据集关闭!")
Пример #11
0
def read_vec_file(vec_file):
    # 支持文件中文路径
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 支持文件中文字段
    gdal.SetConfigOption("SHAPE_ENCODING", "GB2312")
    # 注册所有驱动
    ogr.RegisterAll()
    # 以只读的方式打开数据源
    ds = ogr.Open(vec_file)
    # 判断文件是否存在
    if ds is None:
        # 提示打开文件成功
        print("打开文件【%s】失败!" % vec_file)
        # 退出当前函数
        return
    # 提示文件打开成功
    print("打开文件【%s】成功!" % vec_file)
    # 获取数据源图层个数
    layer_count = ds.GetLayerCount()
    # 打印文件图层个数
    print("文件【%s】的图层个数为:%d" % (vec_file, layer_count))
    # 通过图层序号获取图层
    layer = ds.GetLayerByIndex(0)
    # 判断图层是否获取成功
    if layer is None:
        # 提示获取图层失败
        print("获取第%d个图层失败!" % 0)
        # 退出当前函数
        return
    # 图层初始化
    layer.ResetReading()
    # 获取图层定义信息
    layer_def = layer.GetLayerDefn()
    # 获取字段个数
    field_count = layer_def.GetFieldCount()
    # 打印字段个数
    print("第【%d】个图层的字段个数为:%d" % (0, field_count))
    # 遍历所有字段
    for i_field in range(field_count):
        # 获取第i字段定义
        field_def = layer_def.GetFieldDefn(i_field)
        # 获取该字段的信息:字段名:字段类型(字段长度, 字段精度)
        print("%s:%s(%d.%d)" % (
        field_def.GetNameRef(), field_def.GetFieldTypeName(field_def.GetType()), field_def.GetWidth(),
        field_def.GetPrecision()))
    # 输出图层中要素的个数
    feature_count = layer.GetFeatureCount()
    # 打印图层要素的个数
    print("第【%d】个图层的要素个数为:%d" % (0, feature_count))
    # 获取图层中的第一个要素
    feature = layer.GetNextFeature()
    while feature is not None:
        print("当前要素的序号为:%d \n属性值为:" % feature.GetFID())
        # 遍历该要素的属性信息
        for i_field in range(field_count):
            # 创建字段定义
            field_def = layer_def.GetFieldDefn(i_field)
            # 构建显示的方式:属性字段名称+属性值
            line = "%s (%s) = " % (field_def.GetNameRef(), ogr.GetFieldTypeName(field_def.GetType()))
            # 判断要素当前字段是否赋值
            if feature.IsFieldSet(i_field):
                # 赋值, 获取该字段的属性值
                line = line + "%s" % (feature.GetFieldAsString(i_field))
            else:
                # 未赋值,当前字段的值为null
                line = line + "(null)"
            # 打印属性字段和属性值
            print("line: " + line)
        # 获取下一个图层要素
        feature = layer.GetNextFeature()
    # 销毁数据源
    ds.Destroy()
    # 提示数据集关闭
    print("数据集关闭!")
Пример #12
0
        if not args.quiet:
            print("Extent : (%f, %f) - (%f %f)" % (xmin, ymin, xmax, ymax))
            print("Geometry type: %s" %
                  ogr.GeometryTypeToName(lyr.GetGeomType()))

        srs = lyr.GetSpatialRef()
        if srs is not None:
            if not args.quiet:
                print("SRS: %s" % srs.ExportToWkt())

        lyr_defn = lyr.GetLayerDefn()
        for i in range(lyr_defn.GetFieldCount()):
            field_defn = lyr_defn.GetFieldDefn(i)
            name = field_defn.GetName()
            type = ogr.GetFieldTypeName(field_defn.GetType())
            width = field_defn.GetWidth()
            prec = field_defn.GetPrecision()
            if not args.quiet:
                print('Field %s, type %s (%d.%d)' % (name, type, width, prec))

    local = pytz.timezone(args.timezone)

    datestamp = None
    if args.datestamp:
        datestamp = dateutil.parser.parse(args.datestamp)
    iso_datestamp = datestamp or datetime.datetime.utcnow().strftime(
        "%Y-%m-%dT%H:%M:%SZ")
    if not args.quiet:
        print("ISO Date Stamp: %s" % iso_datestamp)
Пример #13
0
def process_gml(input_filename,
                outName,
                field_mapping,
                icon_mapping,
                epsg=None):

    if epsg is not None:
        # Define the  projection system (EPSG 28992) sourcedata
        source_epsg = SpatialReference()
        source_epsg.ImportFromEPSG(epsg)
    else:
        source_epsg = SpatialReference()
        source_epsg.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER)
        source_epsg.ImportFromEPSG(4326)

    # Define the wgs84 system (EPSG 4326)
    epsg4326 = SpatialReference()
    epsg4326.SetAxisMappingStrategy(OAMS_TRADITIONAL_GIS_ORDER)
    epsg4326.ImportFromEPSG(4326)

    outDriver = ogr.GetDriverByName('GPX')
    co_opts = ['GPX_USE_EXTENSIONS=yes', 'GPX_EXTENSIONS_NS="{opencpn}"']
    outDataSource = outDriver.CreateDataSource(outName, options=co_opts)
    outLayer = outDataSource.CreateLayer('waypoints',
                                         epsg4326,
                                         geom_type=ogr.wkbPoint)
    featureDefn = outLayer.GetLayerDefn()

    reader = ogr.Open(input_filename, update=0)

    print("GetLayerCount() = %d\n", reader.GetLayerCount())
    for iLayer in range(reader.GetLayerCount()):
        poLayer = reader.GetLayer(iLayer)
        # poLayer.SetSpatialFilter(epsg28992)

        line = "Layer %d: %s" % (iLayer + 1, poLayer.GetLayerDefn().GetName())
        print(line)

        line = "geocount %d: %s" % (iLayer + 1,
                                    poLayer.GetLayerDefn().GetGeomFieldCount())

        nGeomFieldCount = poLayer.GetLayerDefn().GetGeomFieldCount()
        if nGeomFieldCount > 0:
            line = line + " ("
            for iGeom in range(nGeomFieldCount):
                if iGeom > 0:
                    line = line + ", "
                poGFldDefn = poLayer.GetLayerDefn().GetGeomFieldDefn(iGeom)
                line = line + "%s" % ogr.GeometryTypeToName(
                    poGFldDefn.GetType())
            line = line + ")"

        if poLayer.GetLayerDefn().GetGeomType() != ogr.wkbUnknown:
            line = line + " (%s)" % ogr.GeometryTypeToName(
                poLayer.GetLayerDefn().GetGeomType())

        print(line)

        poFeature = poLayer.GetNextFeature()
        while poFeature is not None:
            poDefn = poFeature.GetDefnRef()
            print("OGRFeature(%s):%ld" %
                  (poDefn.GetName(), poFeature.GetFID()))
            outFeature = ogr.Feature(featureDefn)
            outFeature.SetFrom(poFeature)
            poDstGeometry: ogr.Geometry = outFeature.GetGeometryRef()
            if poDstGeometry is not None:
                print('geometry input:       ', poDstGeometry)
                srsReference: SpatialReference = poDstGeometry.GetSpatialReference(
                )
                if srsReference is None:
                    srsReference = source_epsg
                    print('no SpatialReference, using default')
                poCT = CoordinateTransformation(srsReference, epsg4326)
                if poCT is not None:
                    eErr = poDstGeometry.Transform(poCT)
                    print('geometry converted:   ', poDstGeometry)
                    if eErr != 0:
                        print(
                            "Failed to reproject feature %d (geometry probably out of source or destination SRS)."
                            % poFeature.GetFID())

            description = []

            for iField in range(poDefn.GetFieldCount()):
                poFDefn = poDefn.GetFieldDefn(iField)
                line = "  %s (%s) = " % (poFDefn.GetNameRef(),
                                         ogr.GetFieldTypeName(
                                             poFDefn.GetType()))
                if poFeature.IsFieldSet(
                        iField) and poFDefn.GetNameRef() in field_mapping:
                    try:
                        line = line + "%s" % (
                            poFeature.GetFieldAsString(iField))
                        map = field_mapping[poFDefn.GetNameRef()]
                        value = poFeature.GetFieldAsString(iField)

                        if map['isDescription']:
                            if len(
                                    value
                            ) > 0 and value != 'Niet toegewezen' and value != '#':
                                description.append(
                                    '%s : %s' %
                                    (map['dst'],
                                     poFeature.GetFieldAsString(iField)))
                        else:
                            outFeature.SetField(
                                map['dst'], poFeature.GetFieldAsString(iField))

                        # for the icons do a lookup
                        if map['dst'] == 'sym':
                            if value in icon_mapping:
                                outFeature.SetField(map['dst'],
                                                    str(icon_mapping[value]))
                            else:
                                outFeature.SetField(
                                    map['dst'],
                                    poFeature.GetFieldAsString(iField))
                                if value not in missing:
                                    missing.append(value)

                    except UnicodeEncodeError:
                        # For Python3 on non-UTF8 strings
                        print('pynonUT', errno)
                        # exit()
                        line = line + "%s" % (
                            poFeature.GetFieldAsBinary(iField))
                else:
                    line = line + "(null)"
                if debugging:
                    print(line)

            if len(description) > 0:
                outFeature.SetField('desc', '\n'.join(description))
            outLayer.CreateFeature(outFeature)
            # dereference the feature
            outFeature = None

            poFeature = poLayer.GetNextFeature()
    reader.Destroy()
    outDataSource.Destroy()
Пример #14
0
def ogr2vrt(infile,
            outfile=None,
            layer_list=[],
            relative="0",
            schema=0):

    ##########################################################################
    # Open the datasource to read.

    src_ds = ogr.Open(infile, update=0)

    if src_ds is None:
        return None

    if schema:
        infile = '@dummy@'

    if len(layer_list) == 0:
        for layer in src_ds:
            layer_list.append(layer.GetLayerDefn().GetName())

    ##########################################################################
    # Start the VRT file.

    vrt = '<OGRVRTDataSource>\n'

    ##########################################################################
    #	Process each source layer.

    for name in layer_list:
        layer = src_ds.GetLayerByName(name)
        layerdef = layer.GetLayerDefn()

        vrt += '  <OGRVRTLayer name="%s">\n' % Esc(name)
        vrt += '    <SrcDataSource relativeToVRT="%s" shared="%d">%s</SrcDataSource>\n' \
               % (relative, not schema, Esc(infile))
        if schema:
            vrt += '    <SrcLayer>@dummy@</SrcLayer>\n'
        else:
            vrt += '    <SrcLayer>%s</SrcLayer>\n' % Esc(name)
        vrt += '    <GeometryType>%s</GeometryType>\n' \
               % GeomType2Name(layerdef.GetGeomType())
        srs = layer.GetSpatialRef()
        if srs is not None:
            vrt += '    <LayerSRS>%s</LayerSRS>\n' \
                   % (Esc(srs.ExportToWkt()))

        # Process all the fields.
        for fld_index in range(layerdef.GetFieldCount()):
            src_fd = layerdef.GetFieldDefn(fld_index)
            ftype = ogr.GetFieldTypeName(src_fd.GetType())
            vrt += '    <Field name="%s" type="%s"' \
                   % (Esc(src_fd.GetName()), ftype)
            if not schema:
                vrt += ' src="%s"' % Esc(src_fd.GetName())
            if src_fd.GetWidth() > 0:
                vrt += ' width="%d"' % src_fd.GetWidth()
            if src_fd.GetPrecision() > 0:
                vrt += ' precision="%d"' % src_fd.GetPrecision()
            vrt += '/>\n'

        vrt += '  </OGRVRTLayer>\n'

    vrt += '</OGRVRTDataSource>\n'

    if outfile is not None:
        f = open(outfile, "w")
        f.write(vrt)
        f.close()

    return vrt
Пример #15
0
    def prepareVrt(self, sample=False, without_fields=False):
        buffer = QtCore.QBuffer()
        buffer.open(QtCore.QBuffer.ReadWrite)

        stream = QtCore.QXmlStreamWriter(buffer)
        stream.setAutoFormatting(True)
        stream.writeStartDocument()
        stream.writeStartElement("OGRVRTDataSource")

        stream.writeStartElement("OGRVRTLayer")
        stream.writeAttribute("name", self.layerName())

        stream.writeStartElement("SrcDataSource")
        if sample:
            stream.writeCharacters(self.filePath())
        else:
            stream.writeAttribute("relativeToVRT", "1")
            stream.writeCharacters(os.path.basename(self.filePath()))
        stream.writeEndElement()

        stream.writeComment('Header={}'.format(self.header()))

        if (self.offset() > 0
                or self._non_empty_rows != self.layer.GetFeatureCount()):
            stream.writeStartElement("SrcSql")
            stream.writeAttribute("dialect", "sqlite")
            stream.writeCharacters(self.sql())
            stream.writeEndElement()
        else:
            stream.writeStartElement("SrcLayer")
            stream.writeCharacters(self.sheet())
            stream.writeEndElement()

        if not without_fields:
            for field in self.fields:
                if (self.geometry() and not sample):
                    if field['src'] in (self.xField(), self.yField()):
                        if not self.showGeometryFields():
                            continue
                stream.writeStartElement("Field")
                stream.writeAttribute("name", field['name'])
                stream.writeAttribute("src", field['src'])
                stream.writeAttribute("type",
                                      ogr.GetFieldTypeName(field['type']))
                stream.writeEndElement()

        if (self.geometry() and not sample):
            stream.writeStartElement("GeometryType")
            stream.writeCharacters("wkbPoint")
            stream.writeEndElement()

            if self.crs():
                stream.writeStartElement("LayerSRS")
                stream.writeCharacters(self.crs())
                stream.writeEndElement()

            stream.writeStartElement("GeometryField")
            stream.writeAttribute("encoding", "PointFromColumns")
            stream.writeAttribute("x", self.xField())
            stream.writeAttribute("y", self.yField())
            stream.writeEndElement()

        stream.writeEndElement()  # OGRVRTLayer
        stream.writeEndElement()  # OGRVRTDataSource
        stream.writeEndDocument()

        buffer.reset()
        content = buffer.readAll()
        buffer.close

        return content
Пример #16
0
def _check_test_parquet(filename,
                        expect_fast_feature_count=True,
                        expect_fast_get_extent=True,
                        expect_ignore_fields=True):
    with gdaltest.config_option('OGR_PARQUET_BATCH_SIZE', '2'):
        ds = gdal.OpenEx(filename)
    assert ds is not None, 'cannot open dataset'
    assert ds.TestCapability("foo") == 0
    assert ds.GetLayerCount() == 1, 'bad layer count'
    assert ds.GetLayer(-1) is None
    assert ds.GetLayer(1) is None
    lyr = ds.GetLayer(0)
    assert lyr is not None
    lyr_defn = lyr.GetLayerDefn()
    assert lyr_defn.GetGeomFieldCount() == 1
    assert lyr_defn.GetGeomFieldDefn(0).GetName() == 'geometry'
    srs = lyr_defn.GetGeomFieldDefn(0).GetSpatialRef()
    assert srs is not None
    assert srs.GetAuthorityCode(None) == '4326'
    assert lyr_defn.GetGeomFieldDefn(0).GetType() == ogr.wkbPoint
    assert lyr_defn.GetFieldCount() == 71
    got_field_defns = [
        (lyr_defn.GetFieldDefn(i).GetName(),
         ogr.GetFieldTypeName(lyr_defn.GetFieldDefn(i).GetType()),
         ogr.GetFieldSubTypeName(lyr_defn.GetFieldDefn(i).GetSubType()),
         lyr_defn.GetFieldDefn(i).GetWidth(),
         lyr_defn.GetFieldDefn(i).GetPrecision())
        for i in range(lyr_defn.GetFieldCount())
    ]
    #import pprint
    #pprint.pprint(got_field_defns)
    expected_field_defns = [
        ('boolean', 'Integer', 'Boolean', 0, 0),
        ('uint8', 'Integer', 'None', 0, 0), ('int8', 'Integer', 'None', 0, 0),
        ('uint16', 'Integer', 'None', 0, 0),
        ('int16', 'Integer', 'Int16', 0, 0),
        ('uint32', 'Integer64', 'None', 0, 0),
        ('int32', 'Integer', 'None', 0, 0), ('uint64', 'Real', 'None', 0, 0),
        ('int64', 'Integer64', 'None', 0, 0),
        ('float32', 'Real', 'Float32', 0, 0),
        ('float64', 'Real', 'None', 0, 0), ('string', 'String', 'None', 0, 0),
        ('large_string', 'String', 'None', 0, 0),
        ('timestamp_ms_gmt', 'DateTime', 'None', 0, 0),
        ('timestamp_ms_gmt_plus_2', 'DateTime', 'None', 0, 0),
        ('timestamp_ms_gmt_minus_0215', 'DateTime', 'None', 0, 0),
        ('timestamp_s_no_tz', 'DateTime', 'None', 0, 0),
        ('time32_s', 'Time', 'None', 0, 0),
        ('time32_ms', 'Time', 'None', 0, 0),
        ('time64_us', 'Integer64', 'None', 0, 0),
        ('time64_ns', 'Integer64', 'None', 0, 0),
        ('date32', 'Date', 'None', 0, 0), ('date64', 'Date', 'None', 0, 0),
        ('binary', 'Binary', 'None', 0, 0),
        ('large_binary', 'Binary', 'None', 0, 0),
        ('fixed_size_binary', 'Binary', 'None', 2, 0),
        ('decimal128', 'Real', 'None', 7, 3),
        ('decimal256', 'Real', 'None', 7, 3),
        ('list_boolean', 'IntegerList', 'Boolean', 0, 0),
        ('list_uint8', 'IntegerList', 'None', 0, 0),
        ('list_int8', 'IntegerList', 'None', 0, 0),
        ('list_uint16', 'IntegerList', 'None', 0, 0),
        ('list_int16', 'IntegerList', 'None', 0, 0),
        ('list_uint32', 'Integer64List', 'None', 0, 0),
        ('list_int32', 'IntegerList', 'None', 0, 0),
        ('list_uint64', 'RealList', 'None', 0, 0),
        ('list_int64', 'Integer64List', 'None', 0, 0),
        ('list_float32', 'RealList', 'Float32', 0, 0),
        ('list_float64', 'RealList', 'None', 0, 0),
        ('list_string', 'StringList', 'None', 0, 0),
        ('fixed_size_list_boolean', 'IntegerList', 'Boolean', 0, 0),
        ('fixed_size_list_uint8', 'IntegerList', 'None', 0, 0),
        ('fixed_size_list_int8', 'IntegerList', 'None', 0, 0),
        ('fixed_size_list_uint16', 'IntegerList', 'None', 0, 0),
        ('fixed_size_list_int16', 'IntegerList', 'None', 0, 0),
        ('fixed_size_list_uint32', 'Integer64List', 'None', 0, 0),
        ('fixed_size_list_int32', 'IntegerList', 'None', 0, 0),
        ('fixed_size_list_uint64', 'RealList', 'None', 0, 0),
        ('fixed_size_list_int64', 'Integer64List', 'None', 0, 0),
        ('fixed_size_list_float32', 'RealList', 'Float32', 0, 0),
        ('fixed_size_list_float64', 'RealList', 'None', 0, 0),
        ('fixed_size_list_string', 'StringList', 'None', 0, 0),
        ('struct_field.a', 'Integer64', 'None', 0, 0),
        ('struct_field.b', 'Real', 'None', 0, 0),
        ('struct_field.c.d', 'String', 'None', 0, 0),
        ('struct_field.c.f', 'String', 'None', 0, 0),
        ('struct_field.h', 'Integer64List', 'None', 0, 0),
        ('struct_field.i', 'Integer64', 'None', 0, 0),
        ('map_boolean', 'String', 'JSON', 0, 0),
        ('map_uint8', 'String', 'JSON', 0, 0),
        ('map_int8', 'String', 'JSON', 0, 0),
        ('map_uint16', 'String', 'JSON', 0, 0),
        ('map_int16', 'String', 'JSON', 0, 0),
        ('map_uint32', 'String', 'JSON', 0, 0),
        ('map_int32', 'String', 'JSON', 0, 0),
        ('map_uint64', 'String', 'JSON', 0, 0),
        ('map_int64', 'String', 'JSON', 0, 0),
        ('map_float32', 'String', 'JSON', 0, 0),
        ('map_float64', 'String', 'JSON', 0, 0),
        ('map_string', 'String', 'JSON', 0, 0),
        ('dict', 'Integer', 'None', 0, 0)
    ]
    assert got_field_defns == expected_field_defns
    if expect_fast_feature_count:
        assert lyr.TestCapability(ogr.OLCFastFeatureCount) == 1
    assert lyr.TestCapability(ogr.OLCStringsAsUTF8) == 1
    if expect_fast_get_extent:
        assert lyr.TestCapability(ogr.OLCFastGetExtent) == 1
    if expect_ignore_fields:
        assert lyr.TestCapability(ogr.OLCIgnoreFields) == 1
    assert lyr.GetFeatureCount() == 5
    assert lyr.GetExtent() == (0.0, 4.0, 2.0, 2.0)
    assert lyr.GetExtent(geom_field=0) == (0.0, 4.0, 2.0, 2.0)
    with gdaltest.error_handler():
        lyr.GetExtent(geom_field=-1)
        lyr.GetExtent(geom_field=1)

    assert ds.GetFieldDomainNames() == ['dictDomain']
    assert ds.GetFieldDomain('not_existing') is None
    for _ in range(2):
        domain = ds.GetFieldDomain('dictDomain')
        assert domain is not None
        assert domain.GetName() == 'dictDomain'
        assert domain.GetDescription() == ''
        assert domain.GetDomainType() == ogr.OFDT_CODED
        assert domain.GetFieldType() == ogr.OFTInteger
        assert domain.GetFieldSubType() == ogr.OFSTNone
        assert domain.GetEnumeration() == {'0': 'foo', '1': 'bar', '2': 'baz'}

    f = lyr.GetNextFeature()
    assert f.GetFID() == 0
    assert f['boolean']
    assert f['uint8'] == 1
    assert f['int8'] == -2
    assert f['uint16'] == 1
    assert f['int16'] == -20000
    assert f['uint32'] == 1
    assert f['int32'] == -2000000000
    assert f['uint64'] == 1
    assert f['int64'] == -200000000000
    assert f['float32'] == 1.5
    assert f['float64'] == 1.5
    assert f['string'] == 'abcd'
    assert f['large_string'] == 'abcd'
    assert f['timestamp_ms_gmt'] == '2019/01/01 14:00:00+00'
    assert f['timestamp_ms_gmt_plus_2'] == '2019/01/01 14:00:00+02'
    assert f['timestamp_ms_gmt_minus_0215'] == '2019/01/01 14:00:00-0215'
    assert f['timestamp_s_no_tz'] == '2019/01/01 14:00:00'
    assert f['time32_s'] == '01:02:03'
    assert f['time32_ms'] == '01:02:03.456'
    assert f['time64_us'] == 3723000000
    assert f['time64_ns'] == 3723000000456
    assert f['date32'] == '1970/01/02'
    assert f['date64'] == '1970/01/02'
    assert f['binary'] == '0001'
    assert f['large_binary'] == '0001'
    assert f['fixed_size_binary'] == '0001'
    assert f['decimal128'] == 1234.567
    assert f['decimal256'] == 1234.567
    assert f['list_boolean'] == []
    assert f['list_uint8'] == []
    assert f['list_int8'] == []
    assert f['list_uint16'] == []
    assert f['list_int16'] == []
    assert f['list_uint32'] == []
    assert f['list_int32'] == []
    assert f['list_uint64'] == []
    assert f['list_int64'] == []
    assert f['list_float32'] == []
    assert f['list_float64'] == []
    assert f['list_string'] is None
    assert f['fixed_size_list_boolean'] == [1, 0]
    assert f['fixed_size_list_uint8'] == [0, 1]
    assert f['fixed_size_list_int8'] == [0, 1]
    assert f['fixed_size_list_uint16'] == [0, 1]
    assert f['fixed_size_list_int16'] == [0, 1]
    assert f['fixed_size_list_uint32'] == [0, 1]
    assert f['fixed_size_list_int32'] == [0, 1]
    assert f['fixed_size_list_uint64'] == [0, 1]
    assert f['fixed_size_list_int64'] == [0, 1]
    assert f['fixed_size_list_float32'][0] == 0
    assert math.isnan(f['fixed_size_list_float32'][1])
    assert f['fixed_size_list_float64'][0] == 0
    assert math.isnan(f['fixed_size_list_float64'][1])
    assert f['fixed_size_list_string'] == ['a', 'b']
    assert f['struct_field.a'] == 1
    assert f['struct_field.b'] == 2.5
    assert f['struct_field.c.d'] == 'e'
    assert f['struct_field.c.f'] == 'g'
    assert f['struct_field.h'] == [5, 6]
    assert f['struct_field.i'] == 3
    assert f['map_boolean'] == '{"x":null,"y":true}'
    assert f['map_uint8'] == '{"x":1,"y":null}'
    assert f['map_int8'] == '{"x":1,"y":null}'
    assert f['map_uint16'] == '{"x":1,"y":null}'
    assert f['map_int16'] == '{"x":1,"y":null}'
    assert f['map_uint32'] == '{"x":4000000000,"y":null}'
    assert f['map_int32'] == '{"x":2000000000,"y":null}'
    assert f['map_uint64'] == '{"x":4000000000000.0,"y":null}'
    assert f['map_int64'] == '{"x":-2000000000000,"y":null}'
    assert f['map_float32'] == '{"x":1.5,"y":null}'
    assert f['map_float64'] == '{"x":1.5,"y":null}'
    assert f['map_string'] == '{"x":"x_val","y":null}'
    assert f['dict'] == 0
    assert f.GetGeometryRef().ExportToWkt() == 'POINT (0 2)'

    f = lyr.GetNextFeature()
    assert f.GetFID() == 1
    assert not f['boolean']
    assert f['uint8'] == 2
    assert f.GetGeometryRef() is None

    f = lyr.GetNextFeature()
    assert f.GetFID() == 2
    assert f['uint8'] is None
    assert f.GetGeometryRef().ExportToWkt() == 'POINT (2 2)'

    f = lyr.GetNextFeature()
    assert f.GetFID() == 3
    assert f['uint8'] == 4
    assert f.GetGeometryRef().ExportToWkt() == 'POINT (3 2)'

    f = lyr.GetNextFeature()
    assert f.GetFID() == 4
    assert f['uint8'] == 5
    assert f.GetGeometryRef().ExportToWkt() == 'POINT (4 2)'

    assert lyr.GetNextFeature() is None

    assert lyr.GetNextFeature() is None

    lyr.ResetReading()
    f = lyr.GetNextFeature()
    assert f.GetFID() == 0

    lyr.SetSpatialFilterRect(4, 2, 4, 2)
    lyr.ResetReading()
    f = lyr.GetNextFeature()
    assert f.GetFID() == 4
    lyr.SetSpatialFilter(None)

    if expect_ignore_fields:
        # Ignore just one member of a structure
        assert lyr.SetIgnoredFields(['struct_field.a']) == ogr.OGRERR_NONE
        lyr.ResetReading()
        f = lyr.GetNextFeature()
        assert f['fixed_size_list_string'] == ['a', 'b']
        assert f['struct_field.a'] is None
        assert f['struct_field.b'] == 2.5
        assert f['map_boolean'] == '{"x":null,"y":true}'
        assert f.GetGeometryRef().ExportToWkt() == 'POINT (0 2)'

        # Ignore all members of a structure
        assert lyr.SetIgnoredFields([
            'struct_field.a', 'struct_field.b', 'struct_field.c.d',
            'struct_field.c.f', 'struct_field.h', 'struct_field.i'
        ]) == ogr.OGRERR_NONE
        lyr.ResetReading()
        f = lyr.GetNextFeature()
        assert f['fixed_size_list_string'] == ['a', 'b']
        assert f['struct_field.a'] is None
        assert f['struct_field.b'] is None
        assert f['struct_field.c.d'] is None
        assert f['struct_field.c.f'] is None
        assert f['struct_field.h'] is None
        assert f['struct_field.i'] is None
        assert f['map_boolean'] == '{"x":null,"y":true}'
        assert f.GetGeometryRef().ExportToWkt() == 'POINT (0 2)'

        # Ignore a map
        assert lyr.SetIgnoredFields(['map_boolean']) == ogr.OGRERR_NONE
        lyr.ResetReading()
        f = lyr.GetNextFeature()
        assert f['fixed_size_list_string'] == ['a', 'b']
        assert f['struct_field.a'] == 1
        assert f['struct_field.b'] == 2.5
        assert f['map_boolean'] is None
        assert f['map_uint8'] == '{"x":1,"y":null}'
        assert f.GetGeometryRef().ExportToWkt() == 'POINT (0 2)'

        # Ignore geometry
        assert lyr.SetIgnoredFields(['geometry']) == ogr.OGRERR_NONE
        lyr.ResetReading()
        f = lyr.GetNextFeature()
        assert f['fixed_size_list_string'] == ['a', 'b']
        assert f['struct_field.a'] == 1
        assert f['struct_field.b'] == 2.5
        assert f['map_boolean'] == '{"x":null,"y":true}'
        assert f.GetGeometryRef() is None

        # Cancel ignored fields
        assert lyr.SetIgnoredFields([]) == ogr.OGRERR_NONE
        lyr.ResetReading()
        f = lyr.GetNextFeature()
        assert f['fixed_size_list_string'] == ['a', 'b']
        assert f['struct_field.a'] == 1
        assert f['struct_field.b'] == 2.5
        assert f['map_boolean'] == '{"x":null,"y":true}'
        assert f.GetGeometryRef().ExportToWkt() == 'POINT (0 2)'
Пример #17
0
def ReadVectorFile(strVectorFile):
    # 为了支持中文路径,请添加下面这句代码
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO")
    # 为了使属性表字段支持中文,请添加下面这句,设置编码方式为GB2312
    #gdal.SetConfigOption("SHAPE_ENCODING", "GB2312")
    # 注册所有的驱动
    ogr.RegisterAll()
    # 打开数据
    ds = ogr.Open(strVectorFile, 0)
    #判断文件是否存在
    if ds == None:
        print("打开文件%s失败!" % strVectorFile)
        return
    #提示打开成功
    print("打开文件%s成功!" % strVectorFile)

    # 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个
    iLayerCount = ds.GetLayerCount()

    # 获取第一个图层
    oLayer = ds.GetLayerByIndex(0)
    if oLayer == None:
        print("获取第%d个图层失败!\n", 0)
        return

    # 对图层进行初始化,如果对图层进行了过滤操作,执行这句后,之前的过滤全部清空
    oLayer.ResetReading()

    # 通过属性表的SQL语句对图层中的要素进行筛选,这部分详细参考SQL查询章节内容
    #oLayer.SetAttributeFilter("\"NAME\"LIKE \"Hubei\"")

    # 通过指定的几何对象对图层中的要素进行筛选
    # oLayer.SetSpatialFilter()

    # 通过指定的四至范围对图层中的要素进行筛选
    # oLayer.SetSpatialFilterRect()

    # 获取图层中的属性表表头并输出
    print("属性表结构信息:")
    #图层对象
    oDefn = oLayer.GetLayerDefn()
    #字段个数
    iFieldCount = oDefn.GetFieldCount()
    print('字段个数: %d个' % iFieldCount)
    #遍历所有字段
    for iAttr in range(iFieldCount):
        #字段对象
        oField = oDefn.GetFieldDefn(iAttr)
        #输出字段信息;python中较长的语句如果一行写不完可以用“\”来连接多行语句
        #Python格式化输出%s和%d 可参考博客https://www.cnblogs.com/linguansheng/p/10184102.html

        print("%s: %s(%d.%d)" % ( \
            #字段名称
            oField.GetNameRef(), \
            #字段类型
            oField.GetFieldTypeName(oField.GetType()), \
            #字段长度
            oField.GetWidth(), \
            #字段精度
            oField.GetPrecision()))

    # 输出图层中的要素个数
    print("要素个数:%d个" % oLayer.GetFeatureCount(0))
    #定义新要素对象
    oFeature = oLayer.GetNextFeature()
    # 下面开始遍历图层中的要素
    while oFeature is not None:
        print("当前读取第 %d 个: \n属性值:" % (oFeature.GetFID()+1))
        # 获取要素中的属性表内容
        for iField in range(iFieldCount):
            #字段对象的属性信息
            oFieldDefn = oDefn.GetFieldDefn(iField)
            #构建行显示方式:字段名称+字段内容
            line = " %s (%s) = " % ( \
                #字段名称
                oFieldDefn.GetNameRef(), \
                #字段属性
                ogr.GetFieldTypeName(oFieldDefn.GetType()))

            #判断要素的字段集
            if oFeature.IsFieldSet(iField):
                #将要素属性转为字段串格式
                line = line + "%s" % (oFeature.GetFieldAsString(iField))
            else:
                line = line + "(null)"

            print('line:' + line)
            #print('line:' + line.encode('gbk','ignore').decode('cp936'))
            #print('line:' + line.encode('gbk','ignore').decode('cp936'))
            #print('line:'+line.encode('UTF-8', 'ignore').decode('UTF-8'))

        # 获取下一个要素
        oFeature = oLayer.GetNextFeature()
    print("数据集关闭!")