final 2024_Remote_Sensing
This commit is contained in:
@@ -0,0 +1,85 @@
|
||||
import rasterio
|
||||
from rasterio.warp import reproject, Resampling
|
||||
import numpy as np
|
||||
import argparse
|
||||
|
||||
def resample_raster_to_match(reference_path, target_path, output_path):
|
||||
"""Resample the target raster to match the resolution, extent, and CRS of the reference raster."""
|
||||
with rasterio.open(reference_path) as ref:
|
||||
ref_transform = ref.transform
|
||||
ref_crs = ref.crs
|
||||
ref_width = ref.width
|
||||
ref_height = ref.height
|
||||
ref_nodata = ref.nodata or -9999
|
||||
|
||||
with rasterio.open(target_path) as target:
|
||||
target_nodata = target.nodata or -9999
|
||||
profile = target.profile
|
||||
profile.update(
|
||||
transform=ref_transform,
|
||||
crs=ref_crs,
|
||||
width=ref_width,
|
||||
height=ref_height,
|
||||
nodata=ref_nodata
|
||||
)
|
||||
|
||||
# Resample target raster
|
||||
with rasterio.open(output_path, "w", **profile) as output:
|
||||
for i in range(1, target.count + 1):
|
||||
reproject(
|
||||
source=rasterio.band(target, i),
|
||||
destination=rasterio.band(output, i),
|
||||
src_transform=target.transform,
|
||||
src_crs=target.crs,
|
||||
dst_transform=ref_transform,
|
||||
dst_crs=ref_crs,
|
||||
resampling=Resampling.bilinear,
|
||||
)
|
||||
|
||||
def calculate_difference(raster1_path, raster2_resampled_path, output_path):
|
||||
"""Calculate the difference between two aligned rasters."""
|
||||
with rasterio.open(raster1_path) as src1:
|
||||
raster1 = src1.read(1)
|
||||
nodata1 = src1.nodata or -9999
|
||||
profile = src1.profile
|
||||
|
||||
with rasterio.open(raster2_resampled_path) as src2:
|
||||
raster2 = src2.read(1)
|
||||
nodata2 = src2.nodata or -9999
|
||||
|
||||
# Replace nodata values with NaN for calculation
|
||||
raster1 = np.where(raster1 == nodata1, np.nan, raster1)
|
||||
raster2 = np.where(raster2 == nodata2, np.nan, raster2)
|
||||
|
||||
# Compute difference
|
||||
difference = raster1 - raster2
|
||||
|
||||
# Replace NaN with nodata for saving
|
||||
difference[np.isnan(difference)] = -9999
|
||||
|
||||
# Update metadata to include nodata
|
||||
profile.update(nodata=-9999)
|
||||
|
||||
# Save the difference raster
|
||||
with rasterio.open(output_path, "w", **profile) as dst:
|
||||
dst.write(difference, 1)
|
||||
|
||||
def main():
|
||||
parser = argparse.ArgumentParser(description="Resample a raster and calculate the difference.")
|
||||
parser.add_argument("reference_raster", help="Path to the reference raster.")
|
||||
parser.add_argument("target_raster", help="Path to the target raster to be resampled.")
|
||||
parser.add_argument("aligned_raster", help="Path to save the resampled (aligned) raster.")
|
||||
parser.add_argument("difference_raster", help="Path to save the difference raster.")
|
||||
|
||||
args = parser.parse_args()
|
||||
|
||||
# Resample raster 2 to match raster 1
|
||||
resample_raster_to_match(args.reference_raster, args.target_raster, args.aligned_raster)
|
||||
|
||||
# Calculate the difference
|
||||
calculate_difference(args.reference_raster, args.aligned_raster, args.difference_raster)
|
||||
|
||||
print("Aligned raster and difference raster created successfully!")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user