代码记录——tif网格到站点

import pandas as pd
import rasterio
import numpy as np
from scipy.ndimage import map_coordinates

# 设置Excel文件路径
stations_info_path = r'E:\2000-2018excel\黄河流域2000-2020.xlsx'

# 读取Excel文件
df = pd.read_excel(stations_info_path)

# 假设Excel文件中包含“Longitude”和“Latitude”列
lons = df['经度'].values
lats = df['纬度'].values

# 打开栅格文件
raster_path = r'E:\GSMap\daily-tif\20010720.dat.tif'
with rasterio.open(raster_path) as src:
    # 读取第一个波段的数据
    data = src.read(1)

    # 获取地理变换信息
    transform = src.transform

    # 初始化一个数组来存储插值结果
    interpolated_values = np.zeros(lons.shape)

    # 对每个站点进行插值
    for i, (lon, lat) in enumerate(zip(lons, lats)):
        # 将经纬度坐标转换为栅格坐标
        x = (lon - transform.xoff) / transform.a
        y = (transform.yoff - lat) / transform.e  # 注意:y坐标可能需要反转

        # 确保坐标在栅格范围内
        x = np.clip(x, 0, data.shape[1] - 1)
        y = np.clip(y, 0, data.shape[0] - 1)

        # 计算插值点周围的四个栅格坐标(双线性插值需要四个点)
        x0, x1 = int(np.floor(x)), int(np.ceil(x))
        y0, y1 = int(np.floor(y)), int(np.ceil(y))

        # 确保坐标不越界
        x0, x1 = np.clip([x0, x1], 0, data.shape[1] - 1)
        y0, y1 = np.clip([y0, y1], 0, data.shape[0] - 1)

        # 计算插值权重(这里简化处理,实际应考虑距离)
        fx = x - x0
        fy = y - y0

        # 双线性插值(这里使用简化的权重,实际应使用更精确的计算)
        q11 = data[y0, x0]
        q12 = data[y0, x1]
        q21 = data[y1, x0]
        q22 = data[y1, x1]

        # 注意:这里只是演示了双线性插值的基本思想,实际上你可以直接使用map_coordinates
        # 但由于map_coordinates已经内置了双线性插值,我们可以直接用它来避免手动计算

        # 使用map_coordinates进行插值(更推荐的方式)
        coords = np.array([[y], [x]])  # 注意map_coordinates需要二维数组作为输入
        interpolated_value = map_coordinates(data, coords, order=1, mode='constant', cval=np.nan).ravel()[0]

        # 存储插值结果
        interpolated_values[i] = interpolated_value

    # 现在interpolated_values包含了每个站点的插值结果
print(interpolated_values)

想进行的是tif网格数据插值到气象站点利用双线性插值,但是由于我不会写代码,很多都是搬运,双线性插值方法很复杂,老是报错,插值不成功,于是找到了这个方法。这个方法用的是线性插值,虽然不是双线性插值,但是可以作为近似。仅供参考! 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值