Skip to main content

克里金krige

什么是克里金(krige)

插值模式

  • 普通克里金插值
  • 泛克里金插值

半变异模型

  • 球面函数
  • 三角函数
  • 指数函数
  • 高斯函数
  • 线性函数

输出图像元大小

当前进度

由于插值数量太大,经常导致内存不足,无法继续

import numpy as np
from pykrige.ok import OrdinaryKriging
from shapely.geometry import Point
from shapely.ops import unary_union
import geopandas as gpd


import geopandas as gpd
import numpy as np
import pandas as pd

from pykrige.ok import OrdinaryKriging
from scipy.spatial import KDTree


def kriging(
input_shp,
data_field,
resolution: int = 100, # 采用百分比,100则为100分之一,1000则为1000份之一
semivariogram_model="spherical",
n_nearest_points=12,
range_max=None,
):
# 读取输入数据
gdf = gpd.read_file(input_shp)
values = gdf[data_field].values
# 使用np.meshgrid生成网格的X和Y坐标
X, Y = np.meshgrid(grid_x, grid_y)

# 将X和Y坐标展平为一维数组,因为PyKrige需要这样的格式
X_flat = X.flatten()
Y_flat = Y.flatten()

# 初始化克里金插值器
OK = OrdinaryKriging(
coordinates[:, 0],
coordinates[:, 1],
values,
variogram_model=semivariogram_model,
verbose=False,
enable_plotting=False,
nlags=n_nearest_points,
range_max=range_max,
)

# 执行克里金插值
z, ss = OK.execute("grid", X_flat, Y_flat)

# 将结果重新整形为二维数组,以匹配网格的形状
z_reshaped = z.reshape(X.shape)

# 返回插值结果
return z_reshaped


def extract_kriging_results(kriging_result, points_shp, output_field="kriging_value"):
# 读取点集shp文件
points_gdf = gpd.read_file(points_shp)

# 创建一个空列表来存储每个点的插值结果
kriging_values = []

# 遍历点集中的每个点
for index, row in points_gdf.iterrows():
x, y = row.geometry.x, row.geometry.y

# 计算该点在kriging结果中的索引(这里假设kriging_result是一个二维numpy数组)
# 注意:这里使用简单的线性插值索引计算,可能需要根据实际情况调整
# (例如,如果kriging_result的分辨率不是严格的output_resolution,则需要进行适当的缩放)
ix = int((x - kriging_result.shape[1] * output_resolution / 2) / output_resolution)
iy = int((y - kriging_result.shape[0] * output_resolution / 2) / output_resolution)

# 检查索引是否在范围内
if 0 <= ix < kriging_result.shape[1] and 0 <= iy < kriging_result.shape[0]:
# 提取插值结果
kriging_values.append(kriging_result[iy, ix])
else:
# 如果点不在kriging网格内,可以选择一个默认值(例如NaN)
kriging_values.append(np.nan)

# 将插值结果作为新列添加到GeoDataFrame中
points_gdf[output_field] = kriging_values

# 输出新的shp点文件
output_shp = "output_points_with_kriging.shp"
points_gdf.to_file(output_shp, driver="ESRI Shapefile")

# 返回更新后的GeoDataFrame(可选)
return points_gdf


if __name__ == "__main__":
input_shp = r"./clip_range.shp"
point_shp = r"./fishnet_clip.shp"
af_shp = r"./af_raw.shp"
be_shp = r"./be_raw.shp"

gdf = gpd.read_file(be_shp)
Z = gdf["speed"].values
xmin, ymin, xmax, ymax = gdf.total_bounds

x_l = np.linspace(xmin, xmax, 300)
y_l = np.linspace(ymin, ymax, 100)

# 将X和Y坐标展平为一维数组,因为PyKrige需要这样的格式
xgrid, ygrid = np.meshgrid(x_l, y_l)

coordinates = np.array([(row.geometry.x, row.geometry.y) for _, row in gdf.iterrows()])
X = gdf["geometry"].apply(lambda geom: geom.x).values
Y = gdf["geometry"].apply(lambda geom: geom.y).values
OK = OrdinaryKriging(X, Y, Z, variogram_model="gaussian", nlags=12)
zgrid, ss = OK.execute("grid", x_l, y_l)

print(len(zgrid))
print(len(ygrid))