实现水体含量反演程序。

This commit is contained in:
tangchao0503
2025-01-06 10:18:08 +08:00
parent 7c1f83308d
commit 772663a03c
16 changed files with 1903 additions and 0 deletions

77
interpolate.py Normal file
View File

@ -0,0 +1,77 @@
from util import *
import numpy as np
from osgeo import gdal
import time
import argparse
@timeit
def interpolate_kriging_pykrige(x, y, z, proj, spatial_resolution, output_path=None):
# https://pygis.io/docs/e_interpolation.html
from pykrige.ok import OrdinaryKriging
x_min = x.min()
x_max = x.max()
y_min = y.min()
y_max = y.max()
# Generate a regular grid
step_x = int(x_max - x_min / spatial_resolution)
step_y = int(y_max - y_min / spatial_resolution)
grid_x = np.linspace(x_min, x_max, step_x)
grid_y = np.linspace(y_min, y_max, step_y)
# Create ordinary kriging object:
OK = OrdinaryKriging(
x,
y,
z,
variogram_model="spherical",
verbose=False,
enable_plotting=False,
coordinates_type="euclidean",
)
# Execute on grid:
print("执行插值")
start1 = time.perf_counter()
z1, ss1 = OK.execute("grid", grid_x, grid_y, backend="loop", n_closest_points=12)
end1 = time.perf_counter()
print("插值,运行时间:", end1 - start1, "")
if output_path is not None:
format_str = "GTiff"
driver = gdal.GetDriverByName(format_str)
# driver.Create()函数中RasterXSize代表影像的sample列数RasterYSize代表影像的line行数
dataset_out = driver.Create(output_path, step_x, step_y, 1, gdal.GDT_Float64)
dataset_out.SetProjection(proj)
geotransform_out = (x_min, spatial_resolution, 0, y_max, 0, -spatial_resolution)
dataset_out.SetGeoTransform(geotransform_out)
dataset_out.GetRasterBand(1).WriteArray(z1)
del dataset_out
# Press the green button in the gutter to run the script.
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="此程序基于反演结果进行插值。")
parser.add_argument('-i1', '--pos_content_path', type=str, required=True, help='输入含量文件的路径')
parser.add_argument('-i2', '--img_path', type=str, required=True, help='输入影像文件的路径')
parser.add_argument('-i3', '--spatial_resolution', type=float, default=1.0, help='输出控件分辨率')
parser.add_argument('-o', '--outpath', required=True, type=str, help='输出文件的路径')
parser.add_argument('-v', '--verbose', action='store_true', help='启用详细模式')
args = parser.parse_args()
pos_content = np.loadtxt(args.pos_content_path)
dataset = gdal.Open(args.img_path)
im_proj = dataset.GetProjection() # 地图投影信息
interpolate_kriging_pykrige(pos_content[:, 0], pos_content[:, 1], pos_content[:, 2], im_proj, args.spatial_resolution, args.outpath)