1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| import numpy as np import rasterio from rasterio.enums import Resampling import matplotlib.pyplot as plt import matplotlib
intensity_file = 'intensity.tif' base_file = 'base.tif' output_file = 'risk_probability.tif'
def calculate_risk_probability(intensity, base): return 1 / (1 + np.exp(0 - 0.00250165038535077 * np.exp(0.6931 * intensity) - base))
try: with rasterio.open(base_file) as src: base_data = src.read(1) base_meta = src.meta
with rasterio.open(intensity_file) as src: intensity_data_resampled = src.read( out_shape=(1, base_data.shape[0], base_data.shape[1]), resampling=Resampling.bilinear )[0]
print("Base data shape:", base_data.shape) print("Intensity data shape (after resampling):", intensity_data_resampled.shape)
risk_probability = calculate_risk_probability(intensity_data_resampled, base_data)
risk_probability[np.isinf(risk_probability)] = 0 risk_probability = np.clip(risk_probability, 0, 1)
risk_classification = np.zeros_like(risk_probability) risk_classification[risk_probability >= 0.1] = 4 risk_classification[(risk_probability >= 0.01) & (risk_probability < 0.1)] = 3 risk_classification[(risk_probability >= 0.001) & (risk_probability < 0.01)] = 2 risk_classification[(risk_probability >= 0.0001) & (risk_probability < 0.001)] = 1 risk_classification[risk_probability < 0.0001] = 0
plt.figure(figsize=(10, 6)) cmap = matplotlib.colormaps['RdYlBu_r'] plt.imshow(risk_classification, cmap=cmap, interpolation='nearest', extent=(base_meta['transform'][2], base_meta['transform'][2] + base_meta['width'] * base_meta['transform'][0], base_meta['transform'][5] + base_meta['height'] * base_meta['transform'][4], base_meta['transform'][5]))
plt.colorbar(ticks=[0, 1, 2, 3, 4], label='风险等级') plt.title('次生地质灾害风险概率分级图') plt.xlabel('经度') plt.ylabel('纬度') plt.axis('on') plt.show()
risk_probability = (risk_probability * 255).astype(np.uint8) with rasterio.open(output_file, 'w', driver='GTiff', height=risk_probability.shape[0], width=risk_probability.shape[1], count=1, dtype='uint8', crs=base_meta['crs'], transform=base_meta['transform']) as dst: dst.write(risk_probability, 1)
print(f"风险概率地图已保存至 {output_file}")
except Exception as e: print(f"发生错误: {e}")
|