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
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
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}
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)
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
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
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
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:
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("数据集关闭!")
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("数据集关闭!")
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)
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()
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
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
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)'
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("数据集关闭!")