Python 根据经纬度批量裁剪TIFF影像

为了制作深度学习数据集,我需要将多通道tiff图像进行裁剪,因此采用先用Python 根据经纬度批量裁剪TIFF影像。

如图所示,我这里是上海某POI的经纬度,按照经纬度我需要裁剪下面的底图

它有五个通道

import geopandas as gpd
import pandas as pd
import rasterio
from rasterio.windows import Window
import os
import numpy as np
# 配置
tiff_path = "D:/浏览器下载/卫星数据/卫星和路网.tif"
excel_path = "D:/浏览器下载/卫星数据/poi_data.xlsx"
output_dir = "D:/浏览器下载/卫星数据/裁剪xxx/input"
crop_size = 1000  # 裁剪区域的大小,以像素为单位

# 创建输出目录(如果不存在)
os.makedirs(output_dir, exist_ok=True)

# 读取 TIFF 图像
with rasterio.open(tiff_path) as src:
    tiff_crs = src.crs.to_string()
    tiff_transform = src.transform
    tiff_width = src.width
    tiff_height = src.height
    tiff_bounds = src.bounds
    num_bands = src.count  # 获取通道数

    # 读取 Excel 文件
    df = pd.read_excel(excel_path)
    gdf_excel = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.wgs84_经度, df.wgs84_纬度), crs='EPSG:4326')

    # 将 GeoDataFrame 的 CRS 转换为 TIFF 图像的 CRS
    gdf_excel = gdf_excel.to_crs(tiff_crs)

    for idx, row in gdf_excel.iterrows():
        # 获取每个点的经纬度
        lon, lat = row.geometry.x, row.geometry.y

        # 将经纬度转换为图像中的像素坐标
        px, py = ~tiff_transform * (lon, lat)

        # 计算裁剪区域的边界
        half_size = crop_size // 2
        left = max(0, int(px - half_size))
        top = max(0, int(py - half_size))
        right = min(tiff_width, int(px + half_size))
        bottom = min(tiff_height, int(py + half_size))

        # 确保边界在图像范围内
        width = right - left
        height = bottom - top

        # 裁剪图像
        window = Window(left, top, width, height)
        out_image = np.zeros((num_bands, height, width), dtype=np.uint8)  # 预先创建一个空数组

        with rasterio.open(tiff_path) as src:
            for i in range(1, num_bands + 1):
                out_image[i - 1] = src.read(i, window=window)

        # 更新元数据
        out_transform = tiff_transform * tiff_transform.translation(left, top)
        out_meta = src.meta.copy()
        out_meta.update({
            "driver": "GTiff",
            "count": num_bands,
            "height": height,
            "width": width,
            "transform": out_transform
        })

        # 保存裁剪后的图像
        output_file = os.path.join(output_dir, f"crop_{idx}.tif")
        with rasterio.open(output_file, "w", **out_meta) as dest:
            for i in range(num_bands):
                dest.write(out_image[i], i + 1)

        print(f"Cropped image {idx} saved to {output_file}")

这里裁剪大小为1000*1000自行设置,裁剪得到

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值