依据矢量点提取多张多波段影像的像素值,并将其存入EXCEL表格

基于矢量点shp文件提取多张影像的对应点的像素值(多变量),并从影像文件名中获取日期-时间,将其与各变量一并存入EXCEL表格。

import rasterio
import geopandas as gpd
import numpy as np
import pandas as pd
import os
import glob
from osgeo import gdal
from datetime import datetime
from pathlib import Path
from datetime import datetime, timedelta
import geopandas as gpd
import rasterio

# Load the vector points as a GeoDataFrame
points = gpd.read_file(r'F:\Solar_Radiance\BSRN_SSR\Station_Point\Alberts_Point\54421new.shp')

# create an empty list to store the results
results = []
img_folder = r'F:\Solar_Radiance\BSRN_SSR\Factor'
for img_path in glob.glob(os.path.join(img_folder, '*.tif')):
    # Load the multi-band TIFF image
    with rasterio.open(img_path) as src:
        data = src.read()
        transform = src.transform
        crs = src.crs
        num_bands = src.count

    # Reproject the vector points to the same CRS as the TIFF image, if necessary
    if points.crs != crs:
        points = points.to_crs(crs)

    # Extract the pixel values from the TIFF image based on the vector points
    values = []

    #这里flag的设置和循环里的if都是针对仅包含单个点的shp文件,多点文件需要再考虑
    flag = 0
    for idx, point in points.iterrows():
        col, row = rasterio.transform.rowcol(transform, point['geometry'].x, point['geometry'].y)
        if row < 0 or row >= data.shape[1] or col < 0 or col >= data.shape[2]:
            print(f"Skipping point: ({col}, {row}) is outside the raster extent.")
            flag = 1
            break
        pixel_values = data[:, row, col]
        values.append(pixel_values.flatten())

    if flag == 1 :
        continue

    date_str = (Path(img_path).stem)[1:8]
    time_str = (Path(img_path).stem)[8:12]
    formatted_time_str = time_str[:2] + ":" + time_str[2:] + ":00"
    time_obj = datetime.strptime(formatted_time_str, '%H:%M:%S')  # convert string to datetime object
    new_time_obj = time_obj + timedelta(hours=8)  # add 8 hours to the datetime object
    new_time_str = new_time_obj.strftime('%H:%M:%S')  # convert datetime object back to string
    print(new_time_str)

    # date = datetime.strptime(date_str, '%Y%m%d')
    # doy = (date - datetime(date.year, 1, 1)).days + 1
    row = [date_str, new_time_str] + np.concatenate(values).tolist()

    # add the row to the results list
    results.append(row)
    # Add the pixel values as new columns to the GeoDataFrame
    #for band_idx in range(num_bands):
        #points[f'band{band_idx+1}_value'] = np.array(values)[:, band_idx]

    # Save the GeoDataFrame to a new shapefile
    #points.to_file(r'F:\Solar_Radiance\BSRN_SSR\Factor_try\points_with_values.shp')

Factor_name_List = ['ETR','Tr','Tum','To','Tw','Ta','Taa','Rs','WSA','BSA','Cld_Par_Eff_Rad','Cld_Water_Path','CF']
df = pd.DataFrame(results, columns=['Date', 'Time'] + Factor_name_List)
df.to_excel(r'F:\Solar_Radiance\BSRN_SSR\Factor\54221.xlsx', index=False)

# Create a pandas DataFrame with the pixel values for every band
#df = pd.DataFrame(values, columns=[f'band{band_idx+1}' for band_idx in range(num_bands)])

# Write the DataFrame to an Excel file
#df.to_excel(r'F:\Solar_Radiance\BSRN_SSR\Factor_try\output.xlsx', index=False)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个Python脚本可以完成您的要求: ```python import gdal import ogr import numpy as np # 打开多波段栅格数据 ds = gdal.Open("input_filename.tif") # 获取栅格数据的行列数和波段数 cols = ds.RasterXSize rows = ds.RasterYSize bands = ds.RasterCount # 遍历波段,在每个波段提取,并将其转换为并添加到shp文件中 for band in range(bands): band_num = band + 1 band_data = ds.GetRasterBand(band_num).ReadAsArray() # 获取栅格的地理参照信息 transform = ds.GetGeoTransform() x_start = transform[0] y_start = transform[3] pixel_width = transform[1] pixel_height = transform[5] # 创建一个shp文件来存储提取 shp_driver = ogr.GetDriverByName("ESRI Shapefile") shp_ds = shp_driver.CreateDataSource("output_filename.shp") shp_layer = shp_ds.CreateLayer("point_layer", geom_type=ogr.wkbPoint) shp_layer.CreateField(ogr.FieldDefn("value", ogr.OFTReal)) # 遍历栅格数据中的每个像素,将其转换为并添加到shp文件中 for i in range(rows): for j in range(cols): x = x_start + pixel_width * j y = y_start + pixel_height * i value = band_data[i][j] point = ogr.Geometry(ogr.wkbPoint) point.AddPoint(x, y) feature = ogr.Feature(shp_layer.GetLayerDefn()) feature.SetGeometry(point) feature.SetField("value", value) shp_layer.CreateFeature(feature) feature = None print("Band " + str(band_num) + " processed and added to shapefile") # 将shp文件中的导出为excal文件 excal_driver = ogr.GetDriverByName("XLSX") excal_ds = excal_driver.CreateDataSource("output_filename.xlsx") excal_layer = excal_ds.CreateLayer("data", geom_type=ogr.wkbNone) excal_layer.CreateField(ogr.FieldDefn("x", ogr.OFTReal)) excal_layer.CreateField(ogr.FieldDefn("y", ogr.OFTReal)) excal_layer.CreateField(ogr.FieldDefn("value", ogr.OFTReal)) for feature in shp_layer: excal_feature = ogr.Feature(excal_layer.GetLayerDefn()) excal_feature.SetField("x", feature.GetGeometryRef().GetX()) excal_feature.SetField("y", feature.GetGeometryRef().GetY()) excal_feature.SetField("value", feature.GetField("value")) excal_layer.CreateFeature(excal_feature) excal_feature = None excal_ds = None print("All bands processed and data exported to excal file") ``` 您需要将`input_filename.tif`替换为您的多波段栅格数据文件名,将`output_filename`替换为您想要的输出文件名。请注意,此代码假定多波段栅格数据是以与GDAL兼容的格式存储的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值