基于GDAL命令行对遥感影像加以投影的方法

简介: 【2月更文挑战第3天】本文介绍基于gdal模块,在命令行中通过GDAL命令的方式(不是Python或者C++代码,就是gdal模块自身提供的命令行工具),对栅格遥感影像数据加以投影,即将原本的地理坐标系转为投影坐标系的方法~

  本文介绍基于gdal模块,在命令行中通过GDAL命令的方式(不是Python或者C++代码,就是gdal模块自身提供的命令行工具),对栅格遥感影像数据加以投影,即将原本的地理坐标系转为投影坐标系的方法。

  首先明确一下本文的需求。我们现在有一个.tif格式的栅格遥感影像文件,其空间坐标系为GCS_WGS_1984,也就是WGS84,是一个地理坐标系;在ArcMap软件中将其打开,可以看到其空间坐标系及空间分辨率的单位(经纬度),如下图所示。

  我们现在希望,将这一景遥感影像加以投影,即将其坐标系由原本的地理坐标系转换为投影坐标系,目标投影坐标系为WGS_1984_UTM_Zone_48N,也就是一个UTM投影坐标系。在之前的文章中,我们也多次介绍过基于ArcGIS等软件,或者GEE等在线平台,直接或间接地实现矢量、栅格数据投影(或者重投影)的具体方法,大家可以参考文章ArcGIS投影:地理坐标系转为投影坐标系,或者文章通过ArcMap的模型构建器生成空间坐标系转换的代码,再或者文章Google Earth Engine谷歌地球引擎GEE地理坐标系与投影坐标系变换与重投影加以查看。而本文,我们就介绍基于gdal模块(这个模块可以是大家单独配置的,也可以是在PythonC++等代码语言的环境下配置的),快速、方便地实现空间数据投影的方法。

  首先,我们需要配置好gdal模块。如果大家是用的Anaconda环境,那么就可以基于文章Anaconda下Python中GDAL模块的下载与安装方法中介绍的方法,借着Python环境配置一下gdal模块;如果想通过其他方式配置gdal模块,那么参照gdal模块官网的介绍加以操作即可。

  配置gdal模块完毕后,我们打开电脑中的任意命令行工具。如果前期是在Python环境配置的gdal模块,那么就建议用Python环境下的命令行工具——否则,如果直接用操作系统自带的命令行工具,可能会出现由于环境变量配置不当导致的代码执行错误。例如,如果大家前期是在Anaconda环境的Python中配置的gdal模块,那么此时就打开Anaconda下属的Prompt工具即可;如下图所示,这两个Prompt工具选择任意一个均可。

  随后,在弹出的命令行中,我们首先cd进入存储有原文件(也就是待投影的栅格遥感影像文件)的路径下,然后输入如下的代码。

gdalwarp vegetation_type.tif result.tif -t_srs "EPSG:32648"

  其中,vegetation_type.tif就是原文件待投影的文件)的名称,result.tif就是输出文件的名称;-t_srs表示目标坐标系(或者叫输出坐标系),其后面的参数就是我们期望的投影坐标系,随后的"EPSG:32648"就是WGS_1984_UTM_Zone_48N这个投影坐标系。大家可以在这个网站中,找到自己所需坐标系的EPSG编号。

  运行上述代码,如下图所示。

  其中,需要注意,我们也可以不cd进入存储有原文件(也就是待投影的栅格遥感影像文件)的路径,但那样就必须在上述代码的前2个参数中,将栅格遥感影像文件的名称用完整的绝对路径来表示;否则就会如上图紫色框上方的那个报错一样,找不到指定的文件。

  此外,需要注意的是,大家执行上述代码后,可能会出现ERROR 1: PROJ: proj_create_from_database: Cannot find proj.db这个错误提示,如下图所示。

  遇到这种情况,我们就需要首先找到配置gdal模块时的路径,并在其中找到proj这个文件夹;因为我这里是在Anaconda环境的Python中配置的,所以就在Anaconda环境的Library文件夹找这个proj文件夹即可。随后,按照Windows环境变量(用户变量、系统变量)的设置提到的方法,在系统变量中,新建一个名叫PROJ_LIB的变量,并将proj这个文件夹的路径作为其值。如下图所示。

  随后,再运行上述代码,即可不再报错。

  此时,如果我们用ArcGIS打开结果文件,可以看到其已经完成了投影,坐标系已经是WGS_1984_UTM_Zone_48N,且空间分辨率的单位为米;如下图所示。

  以上,我们利用了gdal模块提供的一个命令行工具——gdalwarp命令,实现了栅格图像投影的需求。gdal模块提供的这些命令行工具,可以在命令提示符终端中执行,就不需要我们再写PythonC++等语言的代码了,所以比较方便。这些命令行工具通常作为gdal模块的一部分提供——在正确安装gdal模块后,其会自动添加到系统的环境变量中,以便在任何命令行工具里执行这些命令。

  除了上述命令行工具,按道理我们还可以用Python代码的方式,基于gdal模块提供的Python语言的API——gdal.Warp()函数,或者gdal.Translate()函数等,来实现栅格投影的需求;如以下代码所示。

# -*- coding: utf-8 -*-
"""
Created on Mon Feb 19 22:48:16 2024

@author: fkxxgis
"""
import os
from osgeo import gdal

os.environ["PROJ_LIB"] = r"C:\ProgramData\anaconda3\Library\share\proj";
os.environ["GDAL_DATA"] = r"C:\ProgramData\anaconda3\Library\share"

original_file_path = r"F:\Data_Reflectance_Rec\Type\vegetation_type.tif"
projected_file_path = r"F:\Data_Reflectance_Rec\Type\vegetation_type_pro1.tif"

target_projection = 'EPSG: 32648'

# gdal.Warp(projected_file_path, original_file_path, dstSRS = target_projection, targetAlignedPixels = True)
gdal.Translate(projected_file_path, original_file_path, projWin = None, outputSRS = target_projection)

  但是,经过尝试,这两个函数在我这里都行不通。其中,第一个gdal.Warp()函数在我这里会出现TypeError: in method 'wrapper_GDALWarpDestName', argument 4 of type 'GDALWarpAppOptions *'这样的报错,如下图所示。

  据说出现这个报错的原因是gdal模块自身版本的问题,所以可能还不太好解决。而对于第二个gdal.Translate()函数,其在我这里虽然可以不报错地执行代码,但是得到的栅格遥感影像结果文件还是地理坐标系,依然没有被投影。针对上述这些问题,也加以了多次尝试,但一直得不到正确的结果,只好作罢,最后发现还是用GDAL命令的方式,更加方便、快捷一些。

  至此,大功告成。

相关文章
|
编解码 数据可视化
Google Earth Engine —— MODIS影像数据集分析
Google Earth Engine —— MODIS影像数据集分析
402 2
|
Java Shell Docker
Docker启动后怎样运行jar包文件
Docker启动后怎样运行jar包文件
|
9月前
|
机器学习/深度学习 数据采集 算法
Python AutoML框架选型攻略:7个工具性能对比与应用指南
本文系统介绍了主流Python AutoML库的技术特点与适用场景,涵盖AutoGluon、PyCaret、TPOT、Auto-sklearn、H2O AutoML及AutoKeras等工具,帮助开发者根据项目需求高效选择自动化机器学习方案。
1093 1
|
8月前
|
监控 数据安全/隐私保护 Python
微信自动抢红包免费版,2025微信抢红包神器,微信红包挂苹果版【python仅供学习】
这个模拟项目包含5个模块:核心监控逻辑、用户界面、配置管理、实用工具和主程序入口
|
存储 数据采集 数据处理
【数据结构进阶】位图
位图是一种高效的数据结构,通过二进制的0和1表示数据的存在状态,适用于海量数据的压缩存储与快速检索。本文从概念、实现到应用场景全面解析位图。核心思想是将数据映射到位图的比特位,利用位运算实现O(1)时间复杂度的增删查操作。文章通过C++代码示例展示了位图的三大接口(set、unset、test)实现,并对比自定义位图与标准库`bitset`的异同。位图优点在于极高的时间和空间效率,但仅适用于整型数据。它为布隆过滤器等高级结构奠定了基础,在数据处理领域具有重要价值。
856 1
|
资源调度 前端开发
vue3.2最新语法如何使用socket.io实现即时通讯
vue3.2最新语法如何使用socket.io实现即时通讯
392 3
|
前端开发 JavaScript 定位技术
React 地图组件 Mapbox 入门指南
Mapbox 是一个强大的地图平台,提供丰富的地图数据和工具,支持多种开发语言和框架。本文介绍如何在 React 项目中使用 Mapbox,涵盖基础概念、安装配置、基本用法、常见问题及解决方法、高级用法等内容,并通过代码示例详细说明,帮助开发者提升地图应用的开发效率和用户体验。
804 2
|
人工智能 运维 监控
人工智能如何影响后端开发
【6月更文挑战第1天】人工智能如何影响后端开发
693 2
|
传感器 数据中心
|
安全 网络安全 Windows
网易邮箱显示附件上传不成功,请重试!(错误码:FR_INVALID_REQUEST) 的解决方法
网易邮箱显示附件上传不成功,请重试!(错误码:FR_INVALID_REQUEST) 的解决方法