一、导入ogr库
一般不推荐直接导入ogr,容易出问题。
import ogr
ogr官网上推荐采用以下两种两种方法
from osgeo import ogr
try:
from osgeo import ogr
except:
import ogr
二、获取数据驱动
读取shp文件前要获取数据驱动来打开数据
driver = ogr.GetDriverByName("Esri Shapefile")
inpath = "***.shp"
datasource = driver.Open(inpath, 0)# 0为只读,1为可写:
driver.Open()方法如下
Open(self, char name, int update = 0) #其中update值 0为只读,1为可写:
三、新建图层并遍历数据
ogr读取的shp文件并不能直接处理,需要从打开的数据源创建Layer-图层,然后再进行循环遍读取多边形。ogr中采用GetGeometryRef()读取形状。由于多边形的特殊,需要调用两次该方法才能读取出多边形的坐标节点列表。第一次调用读取出的形状是多边形,第二次调用读取的是组成多边形的折线,读取出折线后才能获取折点的x,y坐标。
layer = datasource.GetLayer(0)#GetLAayer方法默认参数为o
for feature in layer:
list = []
geom = feature.GetGeometryRef()
polygon = geom.GetGeometryRef(0)
for i in range(polygon.GetPointCount()):
x = polygon.GetX(i)
y = polygon.GetY(i)
list.append([x, y])
PS:获取多边形属性操作类似,采用的是GetField('CNTRY_NAME')方法
for feature in layer:
field = feature.GetField('CNTRY_NAME')#参数采用字段名或数字,类似从列表获取元素。
遍历属性表可以采用一下方式
for feature i layer:
for i in range(feature.GetFieldCount()):
feature.GetField(i)
读取多边形节点和属性代码
from osgeo import ogr
inpath = "文件名.shp"
driver = ogr.GetDriverByName("Esri Shapefile")
datasource = driver.Open(inpath, 0)# 0为只读,1为可写:
layer = datasource.GetLayer(0)#GetLAayer方法默认参数为o
for feature in layer:
list = []
fields = []
for i in range(feature.GetFieldCount()):
fields.append(feature.GetField(i))
geom = feature.GetGeometryRef()
polygon = geom.GetGeometryRef(0)
for i in range(polygon.GetPointCount()):
x = polygon.GetX(i)
y = polygon.GetY(i)
list.append([x, y])
fields.append(list)
附说明
本文用于个人记录ogr学习使用过程,如果要系统学习ogr使用,推荐去osgeo官网。
获取shp属性和坐标的方法有很多。如果要单纯获取属性表,可以直接拖拽对应文件的dbf至excel打开再另存为。获取坐标的话也可以在对应的文件的属性表内新建x,y字段选择计算几何。
自写完整代码
import sys
from osgeo import ogr
def getfield(feature):
"""
获取多边形对应属性信息
:param feature:多边形
:return:多边形属性(列表)
"""
fieldlist = []
for i in range(feature.GetFieldCount()):
fieldlist.append(feature.GetField(i))
return fieldlist
def extra_node(feature):
"""
获取多边形节点坐标,存储为二维列表,o为x坐标,1为有坐标
:param: eature,获取的多边形:
:return: 多边形节点坐标对,列表
"""
list = []
geom = feature.GetGeometryRef()
polygon = geom.GetGeometryRef(0)
for i in range(polygon.GetPointCount()):
x = polygon.GetX(i)
yi = polygon.GetY(i)
list.append([x, yi])
return list
def writerow(wrtpath, list):
"""
写入CSV行
:param path: 输出文件路径
:param list: 写入列表
:return:
"""
with open(wrtpath, 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(list)
f.close()
wspath = "lane.shp"
# 输出文件路径
outpath = "D:/Research/"
# 输出文件名
name = "3600-3900.csv"
#属性表和点对
fieldtable = []
nodetable = []
# 创建数据源
dadtasource = ogr.Open(wspath)
# 初始化驱动
driver = dadtasource.GetDriver()
if dadtasource == None:
print("Can't Open The File")
sys.exit()
else:
print("Done!")
# 获取要素图层
layer = dadtasource.GetLayer()
# 遍历所有要素多边形
for feature in layer:
fields = shptool.getfield(feature) # 获取当前要素多边形属性信息
# fieldtable.append(fields) # 写入当前要素多边形属性信息至表,可不用
points = shptool.extra_node(feature) # 获取要素多边形节点
fields.append(points)
DataTools.writerow(out_file, fields)