最近写代码碰到了根据点矢量数据提取栅格值到本地的需求,于是将代码记录了下来。自己查了资料后写的,大家放心用。
from osgeo import ogr
import os
from osgeo import gdal
from osgeo.gdalconst import *
import xlwt
def extractRasterDataValuesToPoitsShpFunc(inputSHP, InputRasterFolder, ExtractRasterName, saveExcelPathAndName):
# 设置Excel编码
file = xlwt.Workbook('encoding = utf-8')
# 创建sheet工作表
sheet1 = file.add_sheet('sheet1',cell_overwrite_ok=True)
#改变工作空间
#############获取矢量点位的经纬度
#设置driver
driver = ogr.GetDriverByName('ESRI Shapefile')
#打开矢量
ds = driver.Open(inputSHP, 0)
#获取图层
layer = ds.GetLayer()
#获取要素及要素地理位置
xValues = []
yValues = []
feature = layer.GetNextFeature()
while feature:
geometry = feature.GetGeometryRef()
x = geometry.GetX()
y = geometry.GetY()
xValues.append(x)
yValues.append(y)
feature = layer.GetNextFeature()
#获取点位所在像元的栅格值
#读取栅格
#获取注册类
#打开栅格数据
input_folder_list=os.listdir(InputRasterFolder) #读取文件夹里所有文件
tif_files=list() #创建一个只装tif格式的列表
# for filename in input_folder_list: #遍历
# if os.path.splitext(filename)[1] == '.tif': #不管文件名里面有多少个tif,都只认最后一个tif
# tif_files.append(filename) #将文件夹里的tif文件加入只有tif的列表
filename = ExtractRasterName
tif_files.append(filename)
# print(tif_files)
sheet1.write(0, 0, "X_Coor") # excel表的第1列为经度
sheet1.write(0, 1, "Y_Coor") # excel表的第2列为纬度
sheet1.write(0, 2, "True") # excel表的第3列为值
for i in range(0, len(tif_files)): #遍历tif
sheet1.write(0, i+2, filename) #在表格第一行设置列名
ds = gdal.Open(InputRasterFolder + '\\' + tif_files[i], GA_ReadOnly)
#获取行列、波段
rows = ds.RasterYSize
cols = ds.RasterXSize
bands = ds.RasterCount
#获取放射变换信息
transform = ds.GetGeoTransform()
xOrigin = transform[0]
yOrigin = transform[3]
pixelWidth = transform[1]
pixelHeight = transform[5]
#
values = []
for j in range(len(xValues)): #遍历所有点
x = xValues[j]
y = yValues[j]
#获取点位所在栅格的位置
xOffset = int((x - xOrigin) / pixelWidth)
yOffset = int((y - yOrigin) / pixelHeight)
band = ds.GetRasterBand(1) #读取影像
data = band.ReadAsArray(xOffset, yOffset, 1, 1) #读出从(xoffset,yoffset)开始,大小为(xsize,ysize)的矩阵
value = str(data[0, 0])
#将数据经纬度和对应栅格数值写入excel表
sheet1.write(j + 1, 0, x) # 第j+1行,第1列
sheet1.write(j + 1, 1, y) # 第j+1行,第2列
sheet1.write(j + 1, i+2, value) # 第j+1行,第3列
file.save(saveExcelPathAndName) #保存表格
if __name__ == "__main__":
inputSHP = r'E:\\RemoteSensing\\gzyd2018_ALL.shp' # 点的shp
InputRasterFolder = r'E:\\RemoteSensing\\DataSet' # 栅格数据所在的文件夹
ExtractRasterName = r'NDVI_Resample150m.tif' # 被提取的影像
saveExcelPathAndName = r'E:\\RemoteSensing\\pointsToRaster.xls' # Excel保存的位置
# 将点所在位置的栅格值提取到Excel表格
extractRasterDataValuesToPoitsShpFunc(inputSHP, InputRasterFolder, ExtractRasterName, saveExcelPathAndName)
上面的代码修改一下即可
def extractRasterDataValuesToPoitsShpFunc(inputSHP, InputRasterFolder, saveExcelPathAndName):
# 设置Excel编码
file = xlwt.Workbook('encoding = utf-8')
# 创建sheet工作表
sheet1 = file.add_sheet('sheet1',cell_overwrite_ok=True)
# 改变工作空间
# ******************获取矢量点位的经纬度*********************** #
# 设置driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# 打开矢量
ds = driver.Open(inputSHP, 0)
# 获取图层
layer = ds.GetLayer()
# 获取要素及要素地理位置
xValues = []
yValues = []
feature = layer.GetNextFeature()
while feature:
geometry = feature.GetGeometryRef()
x = geometry.GetX()
y = geometry.GetY()
xValues.append(x)
yValues.append(y)
feature = layer.GetNextFeature()
# ******************获取点位所在像元的栅格值****************** #
# 读取栅格
# 获取注册类
# 打开栅格数据
input_folder_list=os.listdir(InputRasterFolder) # 读取文件夹里所有文件
tif_files=list() # 创建一个只装tif格式的列表
for filename in input_folder_list: #遍历
if os.path.splitext(filename)[1] == '.tif': # 不管文件名里面有多少个tif,都只认最后一个tif
tif_files.append(filename) # 将文件夹里的tif文件加入只有tif的列表
tif_files.append(filename)
# print(tif_files)
# ******************将值写入Excel****************** #
sheet1.write(0, 0, "X_Coor") # excel表的第1列为经度
sheet1.write(0, 1, "Y_Coor") # excel表的第2列为纬度
sheet1.write(0, 2, "True") # excel表的第3列为值
for i in range(0, len(tif_files)): # 遍历tif
sheet1.write(0, i+2, filename) # 在表格第一行设置列名
ds = gdal.Open(InputRasterFolder + '\\' + tif_files[i], GA_ReadOnly)
# 获取行列、波段
rows = ds.RasterYSize
cols = ds.RasterXSize
bands = ds.RasterCount
# 获取放射变换信息
transform = ds.GetGeoTransform()
xOrigin = transform[0]
yOrigin = transform[3]
pixelWidth = transform[1]
pixelHeight = transform[5]
#
values = []
for j in range(len(xValues)): # 遍历所有点
x = xValues[j]
y = yValues[j]
#获取点位所在栅格的位置
xOffset = int((x - xOrigin) / pixelWidth)
yOffset = int((y - yOrigin) / pixelHeight)
band = ds.GetRasterBand(1) # 读取影像
data = band.ReadAsArray(xOffset, yOffset, 1, 1) # 读出从(xoffset,yoffset)开始,大小为(xsize,ysize)的矩阵
value = str(data[0, 0])
#
# 将数据经纬度和对应栅格数值写入excel表
sheet1.write(j + 1, 0, x) # 第j+1行,第1列
sheet1.write(j + 1, 1, y) # 第j+1行,第2列
sheet1.write(j + 1, i+2, value) # 第j+1行,第3列
file.save(saveExcelPathAndName) # 保存表格
if __name__ == "__main__":
inputSHP = r'E:\\RemoteSensing\\gzyd2018_ALL.shp' # 点的shp
InputRasterFolder = r'E:\\RemoteSensing\\DataSet' # 栅格数据所在的文件夹
saveExcelPathAndName = r'E:\\RemoteSensing\\pointsToRaster.xls' # Excel保存的位置
# 将点所在位置的栅格值提取到Excel表格
extractRasterDataValuesToPoitsShpFunc(inputSHP, InputRasterFolder, saveExcelPathAndName)