python:提取多个点(矢量)对应的栅格值,保存到Excel

最近写代码碰到了根据点矢量数据提取栅格值到本地的需求,于是将代码记录了下来。自己查了资料后写的,大家放心用。

文章目录

        • 研究区矢量和栅格相对位置展示
        • 提取结果展示
      • 一、提取单幅影像栅格值
      • 二、批量提取同一文件夹下的多幅影像栅格值


研究区矢量和栅格相对位置展示


提取结果展示

python:提取多个点(矢量)对应的栅格值,保存到Excel_第1张图片

一、提取单幅影像栅格值

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)

你可能感兴趣的:(ArcGIS,python,python,经验分享)