栅格文件访问和矢量文件访问
使用Python进行数据分析的过程中,我们常常要接触到两种文件,一种是矢量文件,另一种则是栅格文件,对于两种文件,我们都必须认识,并且掌握其读取和写入的方法。
1.矢量文件
a.认识矢量文件
矢量数据模型要素 (Feature)包括几何对象和属性信息两部分,几何对象可以用WKT(用于编程赋 值)和 WKB(用于数据库或二进制文件格式)。
dbf—属性信息
prj—投影信息
shp—图形格式,用于保存元素的几何实体。
shx—图形索引格式。几何体位置索引,记录每一个几何体在 shp文件之中的位置。
注意:每个文件必须是同类型的集合要素:点/线/面
b.读取矢量文件
基本信息读取:
ds = ogr.Open(filename, False) #打开 Shape 文件(False - read only, True - read/write)
layer = ds.GetLayer(0) #获取图层
spatialref = layer.GetSpatialRef() #投影信息
lydefn = layer.GetLayerDefn() #图层定义信息
geomtype=lydefn.GetGeomType()#几何对象类型(wkbPoint, wkbLineString, wkbPolygon)
读取属性字段的信息:
fieldlist = [] #字段列表 (字段类型,OFTInteger, OFTReal, OFTString, OFTDateTime)
for i in range(lydefn.GetFieldCount()): #根据字段数目,遍历字段
fddefn = lydefn.GetFieldDefn(i) #获取每个字段定义
fddict = {'name':fddefn.GetName(),'type':fddefn.GetType(),‘width’:fddefn.GetWidth(),
‘decimal’:fddefn.GetPrecision()} #获取字段的名称、类型、宽度、精度
fieldlist += [fddict]
读取矢量信息和对应的属性值信息:
geomlist, reclist = [], [] #数据记录 – 几何对象及其对应属性
feature = layer.GetNextFeature() #获得第一个要素
while feature is not None: #遍历矢量要素
geom = feature.GetGeometryRef() #获取几何对象
geomlist += [geom.ExportToWkt()] #将几何对象输出wkt格式
rec = {}
for fd in fieldlist:
rec[fd[‘name’]] = feature.GetField(fd[‘name’]) #获取每个字段对应的属性值
reclist += [rec]
feature = layer.GetNextFeature()
最终的结果:geomlist,reclist是一一对应的关系。写入栅格文件
c.写入矢量文件
仅以将几何对象及其属性写入图层举例
for i in range(len(reclist)): #将几何对象及其属性写入图层
geom = ogr.CreateGeometryFromWkt(geomlist[i]) #由wkt格式构建几何要素
feat = ogr.Feature(layer.GetLayerDefn()) #创建要素
feat.SetGeometry(geom)
for fd in fieldlist:
feat.SetField(fd[‘name’], reclist[i][fd[‘name’]]) #给每个字段赋值
layer.CreateFeature(feat) #写入图层
reclist是列表,每个元素是字典,包含x和y字段值,如下。
[{‘x’:106.5,’y’:39.4},{‘x’:103.7,’y’:38.8}]
geomlist是列表,每个元素是几何要素,如下。
Geom——[‘<class 'osgeo.ogr.Geometry'>’,’ <class 'osgeo.ogr.Geometry'>’]
Wkt——POINT(106.5 39.4),POINT(103.7 38.8)的几何格式。
2.栅格文件
a.认识栅格文件
栅格数据实质上是对连续空间分布现象的离散化,采用了一个二维矩阵、使用行号与列号来确 定每个象元点(cell)的空间位置。其数据模型主要包括两部分 – 数据矩阵和大地坐标。
栅格矩阵:像元值用于表示地物某种属性的数值,像元大小表示栅格数据的空间分辨率, 波段则表示地物属性有多类,每类属性用一个波段表示。 大地坐标:参考表示地图投影信息。
利用python里的GDAL库对栅格图像进行读取和存储。GDAL提供对多种栅格数据的支持,包括 Arc/Info ASCII Grid(asc),GeoTiff (tiff),Erdas Imagine Images(img),ASCII DEM(dem) 以及jpg、 bmp、gif等格式。
b.读取栅格文件
基本信息读取:
dataset=gdal.Open(“***.tif")
用gdal.Open()函数打开一个文件,有两种方式GA_ReadOnly、GA_Update,
前者是只读,后者可对文 件进行修改,结果得到数据集。
widthinpixel = dataset.RasterXSize #栅格矩阵的列数
heightinpixel = dataset.RasterYSize #栅格矩阵的行数
bandnumber = dataset.RasterCount #获得栅格数据的波段数
notes:这几个是属性,不是方法,所以没有加括号()
proj = dataset.GetProjection() #地图投影信息,OGC WKT格式的坐标系统的定义。 geotrans = dataset.GetGeoTransform() #仿射矩阵,矩阵对应像素左上角为原点。
如图所示:
[0]和[3]:代表图像左上角地理坐标(x,y)
[1]和[5]:代表影像分辨率(东西方向为正,南北方向为负)
[2]和[4]:旋转角度,如果图像北方朝上,该值为0
图像行列号和地理坐标之间的变换:
Xgeo = GeoTransform[0] + XpixelGeoTransform[1]
Ygeo = GeoTransform[3] + YpixelGeoTransform[5]
数据获取:
data = dataset.ReadAsArray(0,0,width,height)
band1= data[0,0:height,0:width]#第几个波段的数据
band = ds.GetRasterBand(1)
data = band.ReadAsArray(0, 0, width, height)
Notes:
data为width列,height行的数据
所以获取某个像素值的时候,要注意data[height,width]
c.写入栅格文件
#gdal 数据类型vs 栅格数据的数据类型
if 'int8' in data.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in data.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
driver = gdal.GetDriverByName(“GTiff”) #创建文件
dataset = driver.Create(“mytest.tif”, width, height, bands, datatype)
dataset.SetGeoTransform(geotrans) #写入仿射变换参数
dataset.SetProjection(proj) #写入投影
if bands == 1:
dataset.GetRasterBand(1).WriteArray(data) #写入数组数据
else:
for i in range(bands):
dataset.GetRasterBand(i+1).WriteArray(data[i])
详细教程细节可观看视频学习:
Python教程
视频节选自王静老师的Python数据分析-入门案例实战
王静老师:中国科学院博士/国际期刊审稿国家重大项目负责人/国家自然科学基金专家。
课程历经三个月打磨,对于基于位置服务的应用案例进行剖析,通过具体案例结合实际,实现Python学习的从零入门。
学习完整个课程你可以学到:
1.快速的进行python语言的入门,并在使用过程中得到提升
2.python常用库的深入理解
3.机器学习算法原理的讲解及python实现
4.机器学习、python处理轨迹数据的案例应用
下面附全部课程链接,希望对你的学习有用:
https://edu.csdn.net/course/detail/25576
扫码入Python技术交流群,可免费听技术讲座+领学习资料+视频课免费看!
来源:CSDN
作者:weixin_38742954
链接:https://blog.csdn.net/weixin_38742954/article/details/101446906