帮我写一个批量处理多波段栅格数据值提取到已有矢量点并转为excal的代码
时间: 2023-06-09 14:05:52 浏览: 210
好的,为您提供一个Python代码实现:
首先,需要安装必要的包:GDAL、Numpy、Pandas、xlwt、Shapely。
```python
import ogr
import gdal
import numpy as np
import pandas as pd
import xlwt
from shapely.geometry import Point
# 输入栅格文件路径
raster_file = r"path/to/raster/file"
# 输入矢量文件路径
vector_file = r"path/to/vector/file"
# 输入Excel文件路径
excel_file = r"path/to/output/excel/file"
# 提取波段范围
bands = [1, 2, 3]
# 读取栅格文件
ds = gdal.Open(raster_file)
# 获取栅格属性
cols = ds.RasterXSize
rows= ds.RasterYSize
# 获取地理仿射变换参数
transform = ds.GetGeoTransform()
# 计算像元宽度和高度
x_step, y_step = transform[1], transform[5]
# 获取矢量文件的投影信息
driver = ogr.GetDriverByName('ESRI Shapefile')
source = driver.Open(vector_file, 0)
layer = source.GetLayer()
spatialRef = layer.GetSpatialRef()
# 创建Excel文件
wb = xlwt.Workbook(encoding='utf8')
ws = wb.add_sheet('Sheet1')
# 添加表头
ws.write(0, 0, 'ID')
ws.write(0, 1, 'X')
ws.write(0, 2, 'Y')
for i, band in enumerate(bands):
ws.write(0, i+3, f'Band{band}')
# 遍历矢量点
id = 1
for feature in layer:
geom = feature.GetGeometryRef()
# 获取矢量点坐标
x, y = geom.GetX(), geom.GetY()
# 计算矢量点所在像元的行列号
col, row = int((x - transform[0]) / x_step), int((y - transform[3]) / y_step)
# 获取多波段栅格数据值
data = ds.ReadAsArray(col, row, 1, 1, bands)
# 将多波段栅格数据值转为一维数组
values = np.array(data).ravel()
# 创建点对象
point = Point(x, y)
# 判断点是否在多边形内
if feature.GetGeometryRef().Contains(point):
# 写入Excel文件
ws.write(id, 0, id)
ws.write(id, 1, x)
ws.write(id, 2, y)
for i, value in enumerate(values):
ws.write(id, i+3, value)
id += 1
# 保存Excel文件
wb.save(excel_file)
```
以上代码是一个基础的栅格数据值提取到矢量点并转为Excel的例子,如果需要批量处理多个栅格文件和矢量文件,可以在代码中加入循环遍历的功能。
阅读全文