GDAL一行代码实现投影:将栅格的地理坐标系转为投影坐标系

news2025/1/12 16:08:17

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

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

  我们现在希望,将这一景遥感影像加以投影,即将其坐标系由原本的地理坐标系转换为投影坐标系,目标投影坐标系为WGS_1984_UTM_Zone_48N,也就是一个UTM投影坐标系。在之前的文章中,我们也多次介绍过基于ArcGIS等软件,或者GEE等在线平台,直接或间接地实现矢量、栅格数据投影(或者重投影)的具体方法,大家可以参考文章ArcGIS矢量图层投影与地理坐标系转为投影坐标系——ArcMap,或者文章ArcGIS中ArcMap通过模型构建器ModelBuilder导出地理与投影坐标系转换Python代码的方法,再或者文章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 10 用户变量、系统变量等环境变量新建、编辑修改与删除方法提到的方法,在系统变量中,新建一个名叫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命令的方式,更加方便、快捷一些。

  至此,大功告成。

欢迎关注:疯狂学习GIS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1459534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Django后台管理(一)

一、admin介绍 Django 最强大的部分之一是自动管理界面。它从你的模型中读取元数据,提供一个快速的、以模型为中心的界面,受信任的用户可以管理你网站上的内容 官网:https://docs.djangoproject.com/zh-hans/4.1/ref/contrib/admin/ 提示 后台管理系统是管理人员使用,不是…

AD24-开窗

一、PCB阻焊开窗处理 开窗效果图 1、将铜皮选中,复制,来到阻焊层,利用特殊粘贴 2、如出现报错,可利用实心填充在阻焊层进行重新绘制;在3D状态下进行查看 3、放置一块填充;称为露基材(PCB材料&am…

发展至今的抖店,还值得新手去入驻吗?

我是电商珠珠 抖店从19年发展到现在已经有三年多的时间了,平台也已渐趋平稳,政策福利没有当初19年的那么大,所以很多新手在门外观望,这个项目的可行性。 我从20年开始做抖店,算是站到了项目的风口上,有人…

基于shp数据制作3DTiles建筑白膜

经纬管网建模系统MagicPipe3D,本地离线参数化构建地下管网、建筑三维模型,输出标准3DTiles服务、Obj模型等格式,支持Cesium、Unreal、Unity、Osg等引擎加载进行三维可视化、语义查询、专题分析。欢迎下载试用:http://www.magic3d.…

腾讯云4核8G12M服务器4c或4h什么意思?8g是什么?

4核8G是云服务器的参数,代表云服务器的硬件配置和网络带宽,4核代表CPU、8G是指内存、12M代表带宽值为12Mbps,腾讯云百科txybk.com以腾讯云轻量应用服务器4核8G12M带宽配置为例,来详细介绍下服务器参数: 4c8g是什么意思…

正交匹配追踪算法(Orthogonal Matching Pursuit)实现过程及Python模拟

正交匹配追踪(Orthogonal Matching Pursuit,OMP)是一种用于寻找稀疏信号的贪婪算法,用于求解压缩感知问题中的稀疏近似问题。在压缩感知的背景下,通常我们有一个欠定的线性系统Ax y,其中A是一个已知的测量…

【蓝桥杯单片机入门记录】Keil C51仿真调试

目录 一、仿真调试/在线调试的意义 二、程序调试 (1)修改模拟仿真晶振频率(和实际使用保持一致) (2)Debug程序界面设置(模拟调试) (3)利用工具栏的Debug…

【LeetCode】无权图的最短路精选7题——单源、多源

目录 无权图的单源最短路问题: 1. 迷宫中离入口最近的出口(中等) 2. 最小基因变化(中等) 3. 单词接龙(困难) 4. 为高尔夫比赛砍树(困难) 无权图的多源最短路问题&a…

HTML元素和属性快速参考指南

​ 以下是几个与HTML元素和属性相关的参考资料网站链接: HTML Reference - 提供所有HTML元素和属性的免费指南。W3Schools HTML Reference - W3Schools 提供一个广泛的HTML标签和属性参考。freeCodeCamp HTML Cheat Sheet - freeCodeCamp 提供了一个HTML元素列表参…

docker (十一)-进阶篇-docker-compos最佳实践部署zabbix

一 部署docker环境 关闭防火墙、selinux、开启docker,并设置开机自启动 注意点:docker部署的时候,bip要指定,不然会导致虚拟机ip和容器ip冲突,ssh连不上虚拟机 部署请参考 docker (二)-yum…

【机器学习】数据清洗——基于Numpy库的方法删除重复点

🎈个人主页:豌豆射手^ 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…

Github 2024-02-16 开源项目日报 Top9

根据Github Trendings的统计,今日(2024-02-16统计)共有9个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目4TypeScript项目3Rust项目3Jupyter Notebook项目1JavaScript项目1 Black:不妥协的Pytho…

并发编程-ReentrantLock 与 ReentrantReadWriteLock(可重入锁,独享锁,公平与非公平锁,读写锁)

AQS实现原理 前期准备 AQS(全称AbstractQueuedSynchronizer)即队列同步器。它是构建锁或者其他同步组件的基础框架(如ReentrantLock、ReentrantReadWriteLock、Semaphore等)。 整体概览类图 AbstractQueuedSynchronizer类图 …

汽车控制器软件正向开发

需求常见问题: 1.系统需求没有分层,没有结构化,依赖关系不明确 2.需求中没有验证准则 3.对客户需求的追溯缺失,不完整,颗粒度不够 4.系统需求没有相应的系统架构,需求没有分解到硬件和软件 5.需求变更管控不严格,变更频繁,变更纪录描述不准确,有遗漏,客户需求多…

【MySQL】如何处理DB读写分离数据不一致问题?

文章内容 1、前言读写库数据不一致问题我们如何解决?方案一:利用数据库自身特性方案二:不解决方案三:客户端保存法方案四:缓存标记法方案五:本地缓存标记 那DB读写分离情况下,如何解决缓存和数据…

STM32F1X RS485使用DMA发送丢失数据的处理方法。

串口通过DMA发送一帧数据时总是缺少2个字节,且最后一个字节数据为0xff的原因及解决方法 本次记录为采用485串口发送数据,发送模式是循环检测串口数据寄存器为空(TXE)和发送完成标志位(TC)。DMA发送串口方式…

基于java,springboot和vue房屋租赁租房销售平台设计

摘要 在现代城市生活中,房屋租赁市场一直是一个活跃且复杂的领域。随着互联网技术的不断发展,基于Spring Boot和Vue的房屋租赁系统应运而生,旨在提供一个高效、方便、可靠的在线服务平台。该系统利用了前后端分离架构的优势,后端…

【嵌入式学习】QT-Day1-Qt基础

笔记 https://lingjun.life/wiki/EmbeddedNote/20QT 毛玻璃登录界面实现:

模式匹配这么好,Java语法里有吗?

这篇文章我们借助新版Java来理解模式匹配,Rust版的模式匹配稍后就端上来,各位先尝尝Java这杯老咖啡还香不香😄。 什么是模式匹配? 下图直观的表达了模式匹配的概念。 所谓模式类似上图中木盒的各种形状的洞洞,我们…

UG NX二次开发(C#)-PMI-获取PMI尺寸数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 1、前言2、在UG NX的三维模型中添加PMI尺寸信息3、采用二次开发获取尺寸数据4、测试结果1、前言 PMI(Product and Manufacturing Information)是产品和制造信息的简称,主要用于将产品部件设计的…