常遇见的矢量数据有GDB、Shapefile和空间数据库PostGIS,不论是何种格式的数据或如何存储,一旦打开数据源、获取矢量图层后,对数据的操作都一样。

1、读取矢量数据

详细代码:

import sys
from osgeo import ogr
import ospybook as pbfn = r'D:\data\dltb\db.gdb'
ds = ogr.Open(fn, 0)
if ds is None:sys.exit('Could not open {0}.'.format(fn))for i in range(ds.GetLayerCount()):lyr = ds.GetLayer(i)print('{0}:{1}'.format(i, lyr.GetName()))'''索引获取数据源中的图层方式'''
layer = ds.GetLayer(0)
print(lyr.GetName())i = 0
for feature in layer:pt = feature.geometry()x = pt.GetX()y = pt.GetY()'''字段名称 获取属性值'''code = feature.GetField('GBCODE')'''对象方式获取属性值'''length = feature.LENGTH'''对象方式获取属性值2'''lpoly_ = feature['LPOLY_']'''索引方式获取属性值'''fnode_ = feature.GetField(0)'''获取特定类型的属性值'''str_len = feature.GetFieldAsString('LENGTH')print(code, length, fnode_, lpoly_, str_len, x, y)i += 1if i == 20:break'''名称获取数据源中的图层'''
layer2 = ds.GetLayer('国家')
print(lyr2.GetName())

2、获取数据元数据

矢量数据的元数据,包括数据范围、几何类型、空间参考及图层对象的概要信息等,下面的代码片段展示如何获取这些元数据信息:

import sys
from osgeo import  ogrfn = r'D:\data\dltb.gdb'
ds = ogr.Open(fn, 0)
if ds is None:sys.exit('Could not open {0}.'.format(fn))lyr = ds.GetLayer(0)
'''获取图层范围'''
extent = lyr.GetExtent()
print(extent)'''(73.44696044921875, 135.08583068847656, 3.408477306365967, 53.557926177978516)'''
'''(min_x, max_x, min_y, max_y)''''''获取图层集合类型,返回值为数字'''
'''1:点, 2:线, 3:面'''
geom_type = lyr.GetGeomType()
print(geom_type) #2
print(geom_type == ogr.wkbPoint) #False
print(geom_type == ogr.wkbLineString) #True
print(geom_type == ogr.wkbPolygon) #False'''通过要素获取几何类型'''
fea = lyr.GetFeature(0)
print(fea.geometry().GetGeometryType()) #2
print(fea.geometry().GetGeometryName()) #LINESTRING'''获取图层的空间参考'''
print(lyr.GetSpatialRef())
# GEOGCS["GCS_WGS_1984",
#     DATUM["WGS_1984",
#         SPHEROID["WGS_84",6378137.0,298.257223563]],
#     PRIMEM["Greenwich",0.0],
#     UNIT["Degree",0.0174532925199433],
#     AUTHORITY["EPSG","4326"]]print(lyr.schema)'''获取图层属性名称及数据类型'''
for field in lyr.schema:print(field.name, field.GetTypeName())
# FNODE_ Integer64
# TNODE_ Integer64
# LPOLY_ Integer64
# RPOLY_ Integer64
# LENGTH Real
# BOU2_4M_ Integer64
# BOU2_4M_ID Integer64
# GBCODE Integer

3、矢量数据写入

详细代码:

# -*- coding:utf-8 -*-
import sys
from osgeo import ogr'''创建一个图层(根据一个图层中的要素创建)'''fn = r'D:\data\Workspace'
'''以读写模式打开数据源'''
ds = ogr.Open(fn, 1)
if ds is None:sys.exit('Could not open {0}.'.format(fn))in_lyr = ds.GetLayer('省会城市')# lyr = ds.GetLayer('国家')
#
# from ospybook.vectorplotter import VectorPlotter
# vp = VectorPlotter(False)
# vp.plot(lyr, fill=False)
# vp.draw()'''若存在同名图层,则先删除再创键'''
my_layer = 'my_layer'
if ds.GetLayer(my_layer):ds.DeleteLayer(my_layer)
out_lyr = ds.CreateLayer(my_layer,in_lyr.GetSpatialRef(),ogr.wkbPoint)'''根据元图层字段对象创建新图层的字段'''
out_lyr.CreateFields(in_lyr.schema)'''根据图层定义创建一个空的要素'''
out_defn = out_lyr.GetLayerDefn()
out_fea = ogr.Feature(out_defn)
for in_fea in in_lyr:geom = in_fea.geometry()out_fea.SetGeometry(geom)for i in range(in_fea.GetFieldCount()):value = in_fea.GetField(i)if i != 5:out_fea.SetField(i, value)else:print(value)out_lyr.CreateFeature(out_fea)

4、创建新数据源并添加字段

详细代码:

''''''''''创建新的数据源'''''''''
import sys
from osgeo import ogrfn = r'D:\data\Workspace''''获取数据驱动的第一种方式:根据已有数据源获取'''
ds = ogr.Open(fn, 0)
if ds is None:sys.exit('Could not open {0}.'.format(fn))driver = ds.GetDriver()
print(driver.GetName())'''获取数据源的第二种方式:GetDriverByName'''
json_driver = ogr.GetDriverByName('GeoJSON')
print(json_driver.GetName())'''创建GeoJson数据源,数据源路径应到具体文件名'''
json_fn = r'D:\data\Workspace\json_fn.json'
json_ds = json_driver.CreateDataSource(json_fn)
if json_ds is None:sys.exit('Could not create {0}'.format(json_fn))
print(json_ds)'''UseExceptions'''
ogr.UseExceptions()
json_driver = ogr.GetDriverByName('GeoJSON')
print('start')try:json_ds = json_driver.CreateDataSource(json_fn)'''新建属性数据字段'''lyr = json_ds.CreateLayer('layer')coord_fld = ogr.FieldDefn('X', ogr.OFTReal)coord_fld.SetWidth(8)coord_fld.SetPrecision(3)lyr.CreateField(coord_fld)coord_fld.SetName('Y')lyr.CreateField(coord_fld)#新建要素fea = ogr.Feature(lyr.GetLayerDefn())fea.SetField('X', 12.34)fea.SetFID(1)lyr.CreateFeature(fea)#结果同步至硬盘(保存到文件中)json_ds.SyncToDisk()
except RuntimeError as e:print(e)print('end')

5、数据更新

详细代码:

import sys
from osgeo import ogr
'''''''更新现有数据'''''''
fn = r'D:\data\Workspace'
ds = ogr.Open(fn, 1)
if ds is None:sys.exit('Could not open {0}.'.format(fn))'''更改图层定义(新增、删除、修改字段)'''
lyr = ds.GetLayer(0)
lyrdefn = lyr.GetLayerDefn()
i = lyrdefn.GetFieldIndex('GBCODE')
'''获取字段的数据类型'''
fld_type = lyrdefn.GetFieldDefn(i).GetType()
print(fld_type)
'''定义新的属性字段'''
fld_defn = ogr.FieldDefn('GBCODECODE', fld_type)
fld_defn2 = ogr.FieldDefn('NEWFIELD4', ogr.OFTInteger)
'''使用ALTER_NAME_FLAG更改属性字段名称,必须保证字段的数据类型一致'''
lyr.AlterFieldDefn(i, fld_defn, ogr.ALTER_NAME_FLAG)
'''新建属性字段'''
lyr.CreateField(fld_defn2)
'''删除字段(参数为字段索引值)'''
lyr.DeleteField(lyr.FindFieldIndex('NEWFIELD', 0))
lyr.DeleteField(lyrdefn.GetFieldIndex('NEWFIELD2'))'''增加、删除和更新要素'''
ds = ogr.Open(fn, 1)
if ds is None:sys.exit('Could not open {0}.'.format(fn))#更新要素(新增属性字段)
lyr = ds.GetLayer(0)
lyr.CreateField(ogr.FieldDefn('NEWFIELD', ogr.OFTInteger))
n = 1
for fea in lyr:fea.SetField('NEWFIELD', n*n)lyr.SetFeature(fea)n += 1#删除要素
for fea in lyr:print(fea.GetField('NEWFIELD'))if fea.GetField('NEWFIELD') == 3179089:lyr.DeleteFeature(fea.GetFID())print(lyr.GetFeatureCount())"""对数据进行更新操作后,一般需要对数据库进行压缩、重组或重新计算数据的空间范围等
"""
ds.ExecuteSQL('REPACK ' + lyr.GetName()) #压缩数据库
ds.ExecuteSQL('VACUUM') #重组功能ds.ExecuteSQL('RECOMPUTE EXTENT ON ' + lyr.GetName()) #重新计算图层的空间范围
print(lyr.GetExtent())

【Python+GDAL矢量数据操作】相关推荐

  1. [Python] GDAL/OGR操作矢量数据(shp、GeoJSON)

    GDAL项目旨于地理数据抽象模型对地理数据文件进行读写管理:而其项目下有两大类模块:GDAL和OGR OGR提供操作矢量数据的API,GDAL模块提供栅格数据的API [相关链接] 1.GDAL/OG ...

  2. Python GDAL矢量转栅格详解

    前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(X,Y)转换到格网坐标(I,J),线栅格化方法主要有DDA算法.Bresenham算法等, ...

  3. 基于Python+GDAL实现nc格式转geotiff格式

    基于Python+GDAL实现nc格式转geotiff格式 1. 目的 2. 版本 3. 基础知识  3.1 什么是nc文件?  3.2 基于Python处理nc文件需要用到的库 4. 程序示例 5. ...

  4. Python模块MySQLdb操作mysql出现2019错误:Can't initialize character set utf-8

    我使用python的MySQLdb模块实现了一个mysql client, 在测试时,出现了如下错误 Python模块MySQLdb操作mysql出现2019错误:Can't initialize c ...

  5. Python 炫技操作:合并字典的七种方法

    来源 | Python编程时光(ID: Cool-Python) Python 语言里有许多(而且是越来越多)的高级特性,是 Python 发烧友们非常喜欢的.在这些人的眼里,能够写出那些一般开发者看 ...

  6. Python OpenCV像素操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...

  7. python列表字典操作_Python 列表(list)、字典(dict)、字符串(string)常用基本操作小结...

    创建列表 sample_list = ['a',1,('a','b')] Python 列表操作 sample_list = ['a','b',0,1,3] 得到列表中的某一个值 value_star ...

  8. python 实现卷积操作

    python实现卷积操作 调用tf.nn.conv2d()实现卷积 自己实现卷积函数 我们知道,tensorflow里面自带卷积函数,tf.nn.conv2d()就可以实现相关功能,本文主要是自己实现 ...

  9. python列表按照指定顺序排序-Python常见排序操作示例【字典、列表、指定元素等】...

    本文实例讲述了Python常见排序操作.分享给大家供大家参考,具体如下: 字典排序 按value排序 d1 = {"name":"python","b ...

  10. python界面设置-PYTHON图形化操作界面的编程七__创建菜单

    PYTHON图形化操作界面的编程七__创建菜单 十八.创建菜单 1.水平菜单的创建 创建菜单需要多条语句,所以这里通过实例来说明水平菜单的创建方法: 下面的语句可以在窗口中添加水平菜单,其中前四行语句 ...

最新文章

  1. java8 group by_java8新特性Java 8 – Stream Collectors groupingBy 示例 - Java教程
  2. 数据结构与算法:链表,队列,栈,递归,有序表
  3. Auto Lisp 标注子样式_FAIR 开放大规模细粒度词汇级标记数据集 LVIS,连披萨里的菠萝粒都能完整标注...
  4. html文件嵌入到reportlab,Reportlab的Code128条形码作为HTML图像标签,在Python中使用数据URI方案...
  5. loj2245 [NOI2014]魔法森林 LCT
  6. HBase实践案例:车联网监控系统
  7. java请求百度短链接_长链接生成短链接Java源码(调用百度接口)
  8. activex控件方法和事件
  9. 我私藏的一个超级无敌好用的 Java 工具类库
  10. html中optition默认类型,射频微电子学概论.PDF
  11. OD教程(基础--断点)
  12. 物业计算机管理系统论文,小区物业管理系统设计毕业论文
  13. 浅谈 MyBatis 缓存
  14. Linux下查看dd命令执行进度
  15. 如何写出更优雅的代码——编程范式简述
  16. 颠覆你想象的150个故事(1)
  17. tsp java_基于贪心算法求解TSP问题(JAVA)
  18. php能抓抖音短视频教程,初学者必须要掌握的抖音短视频拍摄的小技巧
  19. Oddball 怪人一个
  20. 关系型数据库管理系统跟Hadoop比较

热门文章

  1. VOFA+ 串口调试助手
  2. 技术交底书(二)-----一种基于移动终端的安全防护系统
  3. 图像相似度对比分析软件,图像相似度计算方法
  4. 求解鸡兔同笼问题C语言
  5. 低版本浏览器如何兼容html5,解决Vue兼容低版本浏览器的简单方法
  6. 大牛直播SDK-Windows RTMP/RTSP/本地FLV播放器使用说明...
  7. amd64版本linux,在Kali Linux系统下安装Zoom客户端amd64.deb版本的方法
  8. 音乐推荐系统协同过滤算法解释
  9. 万能免费信息采集软件-免费网站信息内容数据采集软件
  10. Arduino入门教程(二) Unity动感单车