从 python 中给定变量的 lat/lon 点数据创建 lat/lon 网格?

Creating a lat/lon grid from lat/lon point data of a given variable in python?

我有一个很大的数据框 df,它是我从多个分散的、不规则的数据文件中创建的。

df 很长 (8131596),包含以下列:日期、纬度、经度、变量 1、变量 2。

理想情况下,我想创建某个 latitude/longitude 边界框的 2D grid/map,并应用我的 df,以便包含 lat/lon 范围内的任何数据。或者,根据我的数据创建 2D lat/lon 网格,我可以稍后对其进行切割(即,以 2D 'image' / 矩阵结束)。

然后我将在这些不规则点之间进行插值,最终得到 df 中每个变量的基本数据字段。

但是,我对解决此问题的最佳方法有点困惑。我想也许 mesh grid 会涉及到,但我似乎找不到任何以前的 questions/help 与这种情况有关。

非常感谢任何建议!

这是针对 var1 的,您必须对 var2 重复此操作

import numpy as np
import pandas as pd
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
import rasterio
from rasterio.crs import CRS

# define interpolation inputs
points = list(zip(df.longitude,df.latitude))
values = df.var1.values # change to var2 for second grid

# define raster resolution
rRes = 50

# create coord ranges over the desired raster extension
xRange = np.arange(df.longitude.min(),df.longitude.max()+rRes,rRes)
yRange = np.arange(df.latitude.min(),df.latitude.max()+rRes,rRes)

# create arrays of x,y over the raster extension
gridX,gridY = np.meshgrid(xRange, yRange)

# interpolate over the grid
gridPh = griddata(points, values, (gridX,gridY), method='linear')

# show interpolated values
plt.imshow(gridPh)
plt.colorbar()

# definition of the raster transform array
from rasterio.transform import Affine
transform = Affine.translation(gridX[0][0]-rRes/2, gridY[0][0]-rRes/2)*Affine.scale(rRes,rRes)
transform

# get crs as wkt
# use your crs here
rasterCrs = CRS.from_epsg('32718')
rasterCrs.data

#definition, register and close of interpolated raster
interpRaster = rasterio.open('./interpRaster3.tif',
                                'w',
                                driver='GTiff',
                                height=gridPh.shape[0],
                                width=gridPh.shape[1],
                                count=1,
                                dtype=gridPh.dtype,
                                crs=rasterCrs,
                                transform=transform,
                                )
interpRaster.write(gridPh,1)
interpRaster.close()