依据矢量点批量计算遥感图像的植被指数(Python代码)

依据矢量点批量计算遥感图像的植被指数(Python代码)

根据不同作物类型的矢量点计算植被指数:
注:目前代码所使用遥感图像为单景,若要计算时序的遥感数据,须修改下代码

from osgeo import ogr, osr
from osgeo import gdal
import os, sys
import glob
import numpy as np
import pandas as pd

#############获取矢量点位的经纬度
#设置driver
driver = ogr.GetDriverByName('ESRI Shapefile')
#打开矢量
ds = driver.Open('G:\\WS_XL.shp', 0)
if ds is None:
    print('Could not open ' +'sites.shp')
    sys.exit(1)
#获取图层
layer = ds.GetLayer(0)
#获取要素及要素地理位置
xValues = []
yValues = []
name=[]
feature = layer.GetNextFeature()
while feature:
    types = feature.GetField('Value')
    name.append(types)
    geometry = feature.GetGeometryRef()
    x = geometry.GetX()
    y = geometry.GetY()
    xValues.append(x)
    yValues.append(y)  
    feature = layer.GetNextFeature()
    
#############获取点位所在像元的栅格值
#获取注册类
gdal.AllRegister()
#打开栅格数据
origin_path=glob.glob(r'G:\test.tif');
for file in origin_path:
    path, filename = os.path.split(file)
    ds1 = gdal.Open(file)
    if ds1 == None:
        print(filename + "文件无法打开")
    #获取行列、波段
    rows = ds1.RasterYSize  #行
    cols = ds1.RasterXSize #列
    bands = ds1.RasterCount
    #获取放射变换信息
    prosrs = osr.SpatialReference()
    prosrs.ImportFromWkt(ds1.GetProjection())
    geosrs = prosrs.CloneGeogCS()
    
    transform = ds1.GetGeoTransform()
    projection=ds1.GetProjection()
    xOrigin = transform[0] #获取栅格左上角栅格的点位信息
    yOrigin = transform[3] #获取栅格左上角栅格的点位信息
    pixelWidth = transform[1] #获取栅格的宽度
    pixelHeight = transform[5] #获取栅格的高度
  # 将栅格原始数据类型转化为反射率,并计算植被指数
    red = ds1.GetRasterBand(3).ReadAsArray() * 0.0001
    blue = ds1.GetRasterBand(1).ReadAsArray() * 0.0001
    green = ds1.GetRasterBand(2).ReadAsArray() * 0.0001
    nir = ds1.GetRasterBand(4).ReadAsArray() * 0.0001
    # swir = ds1.GetRasterBand(2).ReadAsArray() * 0.0001
    ndvi = (nir - red) / (nir + red)
    evi=(2.5*(nir-red))/(nir+6*red-7.5*blue+1)
    VIgreen=(green-red)/(green+red)
    # lswi=(nir-swir)/(nir+swir)
    vi=[ndvi,evi,VIgreen]
    
    #######提取各植被指数上对应的像元值
    allVI=[]
    for j in range(len(vi)):
        temVI=vi[j]
        values=[]
        for i in range(len(xValues)):
            x = xValues[i]
            y = yValues[i]
            ##########将经纬度转为地理坐标
            # ct = osr.CoordinateTransformation(geosrs, prosrs)
            # coords = ct.TransformPoint(y,x)
            # x1,y1=coords[:2]
            ###########计算行列号
            xOffset = int((x-xOrigin)/pixelWidth)  
            yOffset = int((y-yOrigin)/pixelHeight)
            data = temVI[yOffset,xOffset]
            values.append(data)
        allVI.append(values)
        
allVI=(pd.DataFrame(allVI)).T
allVI.columns =['NDVI','EVI','VIgreen']
allVI.insert(0,'type',name)
allVI.to_excel('G:\\'+ 'test'+'.xlsx')

你可能感兴趣的:(卫星影像,特征,python)