Python——使用OGR操作矢量数据

OGR库是GDAL的一个分支

获取Shapefile信息

>>> from osgeo import ogr
>>> datasource=ogr.Open("E:/2019全国行政区划/省.shp")
>>> driver=datasource.GetDriver()
>>> driver.name
'ESRI Shapefile'
>>> dir(datasource)
['AbortSQL', 'CommitTransaction', 'CopyLayer', 'CreateLayer', 'DeleteLayer', 'Dereference', 'Destroy', 'ExecuteSQL', 'FlushCache', 'GetDescription', 'GetDriver', 'GetLayer', 'GetLayerByIndex', 'GetLayerByName', 'GetLayerCount', 'GetMetadata', 'GetMetadataDomainList', 'GetMetadataItem', 'GetMetadata_Dict', 'GetMetadata_List', 'GetName', 'GetRefCount', 'GetStyleTable', 'GetSummaryRefCount', 'Reference', 'Release', 'ReleaseResultSet', 'RollbackTransaction', 'SetDescription', 'SetMetadata', 'SetMetadataItem', 'SetStyleTable', 'StartTransaction', 'SyncToDisk', 'TestCapability', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__swig_destroy__', '__weakref__', 'name', 'this', 'thisown']





>>> from osgeo import ogr
>>> import sys
>>> inshp='"E:/2019全国行政区划/省.shp"'
>>> driver=ogr.GetDriverByName('ESRI Shapefile')
>>> datasource=driver.Open(inshp,update=0)
>>> if datasource:
...    print('done')
... else:
...    print('could not open')
...
could not open        
>>> ogr.GetDriverCount()
82
>>> datasource.Destory()

2.获取图层信息

>>> from osgeo import ogr
>>> datasource=ogr.Open("E:/2019全国行政区划/省.shp")
>>> layer=datasource.GetLayer(0)  #矢量数据只有一个图层,默认为0
>>> dir(layer)  #查看图层可执行操作
['AlterFieldDefn', 'Clip', 'CommitTransaction', 'CreateFeature', 'CreateField', 'CreateFields', 'CreateGeomField', 'DeleteFeature', 'DeleteField', 'Dereference', 'Erase', 'FindFieldIndex', 'GetDescription', 'GetExtent', 'GetFIDColumn', 'GetFeature', 'GetFeatureCount', 'GetFeaturesRead', 'GetGeomType', 'GetGeometryColumn', 'GetLayerDefn', 'GetMetadata', 'GetMetadataDomainList', 'GetMetadataItem', 'GetMetadata_Dict', 'GetMetadata_List', 'GetName', 'GetNextFeature', 'GetRefCount', 'GetSpatialFilter', 'GetSpatialRef', 'GetStyleTable', 'Identity', 'Intersection', 'Reference', 'ReorderField', 'ReorderFields', 'ResetReading', 'RollbackTransaction', 'SetAttributeFilter', 'SetDescription', 'SetFeature', 'SetIgnoredFields', 'SetMetadata', 'SetMetadataItem', 'SetNextByIndex', 'SetSpatialFilter', 'SetSpatialFilterRect', 'SetStyleTable', 'StartTransaction', 'SymDifference', 'SyncToDisk', 'TestCapability', 'Union', 'Update', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'schema', 'this', 'thisown']
>>> layer.GetFeatureCount()  #查看图层要素数目
35
>>> layer.GetExtent()   #查看图层空间范围,四至(西东南北)
(73.50114210000005, 135.08851148000016, 6.323420775000072, 53.56090105000009)


#图层属性
>>> for i in range(layerdef.GetFieldCount()):
...     defn=layerdef.GetFieldDefn(i)
...     print(defn.GetName(),defn.GetWidth(),defn.GetType(),defn.GetPrecision())
...
省代码 10 12 0
省 50 4 0
类型 50 4 0
>>> 

创建矢量数据文件

1.创建shp数据

>>> from osgeo import ogr
#创建Shapefile驱动,以创建数据文件
>>> driver=ogr.GetDriverByName('ESRI Shapefile')
#>>> ds=driver.CreateDataSource('E:\python_wmx\test_1004.shp')
#>>> layer=ds.CreateLayer('test',geom_type=ogr.wkbPoint)
#ERROR 1: Failed to create file E:\python_wmx    est_1004.shp: No error
#文件地址的斜杠使用反斜杠,否则会出错
#创建shp文件
>>> ds=driver.CreateDataSource('E:/python_wmx/test_1004.shp')
#创建图层
>>> layer=ds.CreateLayer('test',geom_type=ogr.wkbPoint)
#添加新字段,前提条件是已创建图层,且该图层中不存在数据
>>> fieldDefn=ogr.FieldDefn('id',ogr.OFTString)
#添加的是字符串的话需要设定宽度
>>> fieldDefn.SetWidth(4)
>>> layer.CreateField(fieldDefn)
0
#将字段field添加完整,并从layer中读取相应的要素类型,才可在ArcGIS中打开
>>> featureDefn=layer.GetLayerDefn()
>>> feature=ogr.Feature(featureDefn)
#设定几何形状
>>> point=ogr.Geometry(ogr.wkbPoint)
>>> point.SetPoint(0,123,123)
>>> feature.SetGeometry(point)
0
#设定字段id的值
>>> feature.SetField('id',23)
#将feature写入layer中
>>> layer.CreateFeature(feature)
0
#从内存中清除ds,并存入磁盘中,若不进行该操作,创建的一系列要素将不被写入文件
>>> ds.Destroy()
#生成结果可在ArcGIS中查看

2.复制新的Shp

#数据源层次复制
>>> from osgeo import ogr
>>> import os,math
>>> inshp='E:/2019全国行政区划/省.shp'
>>> ds=ogr.Open(inshp)
>>> driver=ogr.GetDriverByName("ESRI Shapefile")
>>> outputfile='E:/python_wmx/sheng_copy1.shp'
#os.access(path,mode) 检查权限模式
>>> if os.access(outputfile,os.F_OK):
...      driver.DeleteDatSource(outputfile)  #检查是否已经存在同名称数据,若存在即删掉
#CopyDataSource(数据源,生成数据路径)
>>> pt_cp=driver.CopyDataSource(ds,outputfile)
>>> pt_cp.Release()  #将数据写入磁盘中,利用该函数释放此数据


#图层层次复制

os.access(path,mode)   检验权限模式

os.access()方法使用当前的uid/gid尝试访问路径。大部分操作使用有效的uid/gid,因此运行环境可以在suid/sgid环境尝试。

path -- 要用来检测是否有访问权限的路径。

mode -- mode为F_OK,测试存在的路径,或者它可以是包含R_OK, W_OK和X_OK或者R_OK, W_OK和X_OK其中之一或者更多。

os.F_OK: 作为access()的mode参数,测试path是否存在。
os.R_OK: 包含在access()的mode参数中 , 测试path是否可读。
os.W_OK 包含在access()的mode参数中 , 测试path是否可写。
os.X_OK 包含在access()的mode参数中 ,测试path是否可执行。
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将OGR格式的矢量数据导出为JSON格式,你可以使用`ogr`库中的`ogr2ogr`命令行工具或使用Python中的`ogr`模块来实现。以下是使用`ogr`模块的示例代码: ```python from osgeo import ogr # 输入和输出文件路径 input_file = 'your_input_file.shp' output_file = 'your_output_file.json' # 打开输入数据源 input_ds = ogr.Open(input_file) input_layer = input_ds.GetLayer() # 创建输出数据源 output_driver = ogr.GetDriverByName('GeoJSON') output_ds = output_driver.CreateDataSource(output_file) output_layer = output_ds.CreateLayer('', None, ogr.wkbPolygon) # 复制输入图层的字段定义到输出图层 input_layer_defn = input_layer.GetLayerDefn() for i in range(input_layer_defn.GetFieldCount()): field_defn = input_layer_defn.GetFieldDefn(i) output_layer.CreateField(field_defn) # 复制输入图层的要素到输出图层 for feature in input_layer: output_layer.CreateFeature(feature) # 关闭数据源 input_ds = None output_ds = None ``` 在这个示例中,我们首先指定输入文件路径和输出文件路径。然后,我们使用`ogr`库打开输入数据源,并获取输入图层。 接下来,我们创建输出数据源,并指定输出驱动为GeoJSON。然后,我们创建输出图层,并复制输入图层的字段定义到输出图层。 然后,我们使用一个循环来遍历输入图层中的要素,并将它们复制到输出图层中。 最后,我们关闭输入和输出数据源,完成导出过程。 请确保你已经安装了GDAL库,并将代码中的`your_input_file.shp`替换为你自己的输入矢量数据文件路径,将`your_output_file.json`替换为你想要保存的输出JSON文件路径。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值