从 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()
我有一个很大的数据框 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()