GDAL重采样与裁剪图像示例

2023-05-16

        GDAL重采样,可以通过写文件时改变图像尺寸和geo_transformes的分辨率信息实现。核心代码示例如下:

in_ds = gdal.Open(fi, gdal.GA_ReadOnly)
geotrans = in_ds.GetGeoTransform()
geotrans = list(geotrans)
geoproj = in_ds.GetProjection()
# 更新为采样后分辨率
geotrans[1] = tar_resolution  #
geotrans[5] = -tar_resolution  # 
in_band = in_ds.GetRasterBand(2)
xsize = in_band.XSize
ysize = in_band.YSize
# 重新计算尺寸
ysize_t = int(ysize * img_resolution / tar_resolution)
xsize_t = int(xsize * img_resolution / tar_resolution)
# 按新的尺寸写
out_ds = in_ds.GetDriver().Create(fo_, xsize_t, ysize_t, 1,
                                          in_band.DataType)  # 创建一个构建重采样影像的句柄
out_ds.SetProjection(in_ds.GetProjection())  # 设置投影信息
# 更新geotrans
geotrans = tuple(geotrans)

        GDAL裁切先计算索引,通过索引获取裁切后的图像,同时重新计算geo_transformes里的左上角点坐标。核心代码示例如下:

xsize_t = in_band.XSize
ysize_t = in_band.YSize
# 计算偏移
y_offset = ysize_t - height
x_offset = xsize_t - width
data = in_band.ReadAsArray()

if pro_mode == "r_b": # 假设裁剪右下部分
    # 更新左上角点坐标 
    geotrans[3] = geotrans[3] + geotrans[5] * y_offset
    geotrans[0] = geotrans[0] + geotrans[2] * x_offset
    data = data[y_offset:, x_offset:]

完整代码示例:

from os import makedirs, remove
from os.path import exists, join
from osgeo import gdal
import numpy as np


def get_params(img_info, img_config):
    return img_info["indir"], img_info["outdir"], img_info["img_list"], img_info["img_resolution"], \
           img_info["pro_mode"], img_config["height"], img_config["width"], img_config["channel"], img_config["tar_resolution"]


def large2small(img_info, img_config):
    indir, outdir, img_list, img_resolutions, pro_modes, height, width, channel, tar_resolution = get_params(img_info, img_config)

    for f, img_resolution, pro_mode in zip(img_list, img_resolutions, pro_modes):
        fi = join(indir, f)
        fo_ = join(outdir, "_" + f)
        fo = join(outdir, f)

        # resize image
        in_ds = gdal.Open(fi, gdal.GA_ReadOnly)
        geotrans = in_ds.GetGeoTransform()
        geotrans = list(geotrans)
        geoproj = in_ds.GetProjection()
        geotrans[1] = tar_resolution  # 
        geotrans[5] = -tar_resolution  # 
        in_band = in_ds.GetRasterBand(1)
        xsize = in_band.XSize
        ysize = in_band.YSize
        ysize_t = int(ysize * img_resolution / tar_resolution)
        xsize_t = int(xsize * img_resolution / tar_resolution)
        if exists(fo_):
            remove(fo_)
        out_ds = in_ds.GetDriver().Create(fo_, xsize_t, ysize_t, 1,
                                          in_band.DataType)  # 创建一个构建重采样影像的句柄
        out_ds.SetProjection(in_ds.GetProjection())  # 设置投影信息
        geotrans = tuple(geotrans)
        out_ds.SetGeoTransform(geotrans)  # 设置地理变换信息
        data = np.empty((ysize_t, xsize_t), np.uint8)  # 设置一个与重采样影像行列号相等的矩阵去接受读取所得的像元值
        in_band.ReadAsArray(buf_obj=data)
        out_band = out_ds.GetRasterBand(1)
        out_band.WriteArray(data)
        out_band.FlushCache()
        out_band.ComputeStatistics(False)  # 计算统计信息
        # out_ds.BuildOverviews('average', [1, 2, 4, 8, 16, 32])  # 构建金字塔
        del in_ds  # 删除句柄
        del out_ds

        # reload and clip
        in_ds = gdal.Open(fo_, gdal.GA_ReadOnly)
        geotrans = in_ds.GetGeoTransform()
        geotrans = list(geotrans)
        geoproj = in_ds.GetProjection()
        in_band = in_ds.GetRasterBand(1)
        xsize_t = in_band.XSize
        ysize_t = in_band.YSize
        y_offset = ysize_t - height
        x_offset = xsize_t - width
        data = in_band.ReadAsArray()
        #
        # pro_mode = "l_u"
        if pro_mode == "l_b":
            geotrans[3] = geotrans[3] + geotrans[5] * y_offset
            data = data[y_offset:, :width]
        elif pro_mode == "l_u":
            data = data[:height, :width]
        elif pro_mode == "r_u":
            geotrans[0] = geotrans[0] + geotrans[2] * x_offset
            data = data[:height, x_offset:]
        elif pro_mode == "r_b":
            geotrans[3] = geotrans[3] + geotrans[5] * y_offset
            geotrans[0] = geotrans[0] + geotrans[2] * x_offset
            data = data[y_offset:, x_offset:]

        if exists(fo):
            remove(fo)
        options = ['COMPRESS=LZW']
        out_ds = in_ds.GetDriver().Create(fo, width, height, 1,
                                          in_band.DataType, options=options)  # 创建一个构建重采样影像的句柄
        out_ds.SetProjection(in_ds.GetProjection())  # 设置投影信息
        geotrans = tuple(geotrans)
        out_ds.SetGeoTransform(geotrans)  # 设置地理变换信息
        # data = np.empty((height, width), np.uint8)  # 设置一个与重采样影像行列号相等的矩阵去接受读取所得的像元值
        # in_band.ReadAsArray(buf_obj=data)

        out_band = out_ds.GetRasterBand(1)
        out_band.WriteArray(data)
        out_band.FlushCache()
        out_band.ComputeStatistics(False)  # 计算统计信息
        out_ds.BuildOverviews('average', [1, 2, 4, 8, 16, 32])  # 构建金字塔
        del in_ds  # 删除句柄
        del out_ds

        if exists(fo_):
            remove(fo_)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDAL重采样与裁剪图像示例 的相关文章

  • GDAL重采样与裁剪图像示例

    GDAL重采样 xff0c 可以通过写文件时改变图像尺寸和geo transformes的分辨率信息实现 核心代码示例如下 xff1a in ds 61 gdal Open fi gdal GA ReadOnly geotrans 61 i
  • conda 创建的 python 虚拟环境中安装 gdal

    在 conda 创建的Python虚拟环境中安装 gdal 可以按照以下步骤 xff1a 1 打开Anaconda Prompt或者终端 xff0c 激活创建的虚拟环境 xff0c 比如 xff1a conda activate your
  • python中的copy和deepcopy

    数据处理经常会用到引用或者赋值 Python中的可变类型变量在操作时需要注意拷贝的方式 特别在实现复杂功能的函数时 一不小心就会改变原来的数据内容 data name anne age 18 scores 语文 130 数学 150 英语
  • gdal解析tif

    bool HandleTif ReadTif tif文件读取 std string name D XX xx tif const char charName name c str 注册 GDALAllRegister 以防中文名不能正常读取
  • 如何在python或java中将geotiff转换为jpg?

    我有一个具有 3bands 的 geotiff 图像 band1 2 是实际图像值 band3 是实例角度值 band1 2 是 float32 数据类型 下面的代码是我之前尝试过的 但它不起作用 我认为波段数据的范围太大 所以不 from
  • GDAL 未链接

    我正在尝试让我的程序在 Windows 上运行 它依赖于GDAL 一个用于加载GIS数据的库 它在 Linux 和 macOS 上都能很好地编译和链接 我将 CMake 与 MinGW 一起使用 并且遇到了如下链接错误 undefined
  • 逐块迭代加载图像,其中块部分重叠

    尝试处理大型卫星图像 10GB 为了有效地处理图像块 block tile 在每次迭代中被加载到内存中 其示例代码如下 def process image src img dst img band id 1 with rasterio op
  • 如何从 python 获取已安装的 GDAL/OGR 版本?

    如何从 python 获取已安装的 GDAL OGR 版本 我知道gdal config计划 目前正在使用以下内容 In 3 import commands In 4 commands getoutput gdal config versi
  • 在 AWS Beanstalk 或 EC2 实例中设置 Django 并支持 GeoDjango

    因此 我曾一度使用 Amazon Instance 2013 09 ami 35792c5c 通过 Beanstalk 进行此操作 当时 将此 ebextension 脚本放置在 ebextensions 中的存储库根目录中时效果非常好 0
  • python:使用 gdal 绑定在内存中执行 gdalwarp

    我目前有一个加工链R下载MODIS数据然后调用gdalwarp从系统将特定子数据集 例如 NDVI 重新投影到 WGS1984 中 所结果的GeoTiffs然后被收集到一个HDF5文件以供进一步处理 现在我将处理链移至python 我想知道
  • 在非标准位置安装带有库的 sf 包

    所需的库位于非标准位置 我可以通过以下命令安装 rgdal install packages rgdal type source configure args c with gdal config home programs anacond
  • 从 shape 转换为 topojson 时出现问题

    我正在尝试将墨西哥城市的 shapefile 转换为 topojson 并使用本教程使用 d3 js 显示它http bost ocks org mike map converting data http bost ocks org mik
  • 无法再加载 rgdal

    我在 Ubuntu 上将 GDAL 更新为 2 2 2 现在rgdal在 R 中失败 当我尝试加载时收到此消息rgdal 我也尝试更新rgdal 但没有成功 Error in get method envir home lazy load
  • 使用“gdal”将大彩色图像保存为“GTiff”

    我正在尝试保存尺寸较大的图像 15000 80000 3 这个数组是一个 numpy 数组 我初始化为im final np zeros 15000 80000 3 为了节省费用 我使用gdal像这样 dst ds gdal GetDriv
  • conda环境安装后无法导入包

    我尝试安装gdal我的 conda 环境中的包 我激活了 gcpy 环境并使用安装了 gdal 包conda install c conda forge gdal 该软件包安装成功 但是 当我尝试导入包时 出现错误 In 1 import
  • libgdal.so.20 问题 centos rgdal

    有人可以帮我理解 rgdal 的问题是什么吗 我为centos 6 64位安装了gdal 2 但没有成功安装rgdal 我试图找出问题所在 但在互联网上没有找到任何有用的信息 这是 Rstudio 服务器控制台 install packag
  • PHP GDAL/OGR 库的使用,哪种方法更干净?

    我将在新项目中使用 gdal ogr 我想要一个精简但功能齐全的应用程序 因此不会使用其他实现 例如地图服务器 因为它们具有我怀疑应用程序中是否需要的无关组件 即使在将来也是如此 根据记录 它是一个 GIS 但我在这里询问是因为 php 中
  • Python 3:如何更改GDAL中的图像数据?

    我有一个 GeoTIFF 图像 其中包含颜色表和带有 8 位表键的单个栅格带 并且使用 LZW 压缩 我加载该图像gdal Open https gdal org python osgeo gdal module html 我还有一个包含
  • Python gdal 未定义符号 GDALRasterBandGetVirtualMem

    我正在尝试使用Python GDAL 绑定 https pypi python org pypi GDAL 通过 pip 天真地安装绑定时 安装失败并显示错误 VSIFTruncateL 未在此范围内声明 https gis stackex
  • D3js:如何设计地形图?

    给定具有高程数据的 GIS 栅格 如何在D3js中设计地形图 有没有使用 D3js 制作的耕地地形图 地形图的示例 不工作 我探索了以下可能性 tif gt gdal contour py gt shp gt topojson gt d3j

随机推荐