热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

gdalproj像素坐标转经纬坐标

转自:gdal坐标变换(x,y变经纬度)gdal坐标变换最近因为一些原因需要读取地理数据,我使用的工具是gdal,在处理数据的时候遇到一些小的问题,自己折腾了会儿,现在分

转自:gdal坐标变换(x,y变经纬度)

gdal坐标变换

最近因为一些原因需要读取地理数据,我使用的工具是gdal,在处理数据的时候遇到一些小的问题,自己折腾了会儿,现在分享出

来,避免大家浪费时间。

  • tiff, geotif和gdal都可以提取tiff数据,对于地理数据gdal可能更方便一些

    我使用了tiff,geotiff尝试提取过手头的tif数据,发现有一些tag是未定义的,会报warning,尽管也可以手工处理,但有些麻烦,gdal一般可以直接处理这类图像


  • gdal图像之后,如果需要进行坐标变换,还要安装proj4

    我在windows下进行安装使用,可能需要安装Visual Studio,linux下的安装更加简单。安装教程一搜一大把,这里略去。个人觉得在windows下可能不用安装VS,如果使用dev C++的话,gcc也可以搞定,但没有试过,就不多说了。下面着重讲一讲tif数据读取,获得相关地理信息,并做坐标变换的过程。

相关程序

#include"gdal_priv.h"
#include "ogrsf_frmts.h"
#include"gdal.h"
#include"ogr_srs_api.h"
#include"ogr_spatialref.h"
#include"ogr_api.h"
#include"proj_api.h"
#include
#include

int main(){
    /** 过程1:读取相关文件信息 **/
    /** 见下面过程1 **/

    /** 过程2: 进行坐标变换 **/
    /** 见下面过程2 **/
    return 0;
}

过程1包括读文件,获得图像和坐标基本信息,这里假设图像为”test.tif”,按理说每一步操作都应该判断是否成功,这里为了使结构

更简单清晰,把这里略去了。

/** 过程1 **/
GDALDataset *poDataset;
GDALAllRegister();
poDataset = (GDALDataset *)GDALOpen("test.tif", GA_ReadOnly);

/** projRef将会存储test.tif中的坐标信息 **/
const char* projRef = poDataset->GetProjectionRef();
/** adfGeoTransform存储一些基准点的坐标和每一个pixel表示的长度等 **/
double adfGeoTransform[6];
poDataSet->GetGeoTransform(adfGeoTransform);

/** 下面获得波段信息 **/
GDALRasterBand *poBand;
poBand = poDataset->GetRasterBand(1);

int nXSize = poBand->GetXSize(),
    nYSize = poBand->GetYSize();

这里说明一下,adfGeoTransform中(这里简称GT),GT[0],GT[3]是做上角坐标,GT[1],GT[5]是图像总向横向分辨率,就是每个像

素代表的长度,GT[2],GT[4]是旋转相关,一般是0,不用管他。

所以,如果我们想知道右下角的坐标,以横坐标为例,右边和左边相隔nXSize个像素,所以相距nXSize*GT[1]的长度,所以横坐标

自然是GT[0]+nXSize*GT[1]。我们得到右下角的坐标x,y为

double x,y;
x = adfGeoTransform[0] + nXSize * adfGeoTransform[1];
y = adfGeoTransform[3] + nYSize * adfGeoTransform[5];

我们想把x,y变成经纬度怎么办呢?下面就是过程2干的事了

/** 过程2 **/
OGRSpatialReference fRef, tRef;
char *tmp = NULL;
/** 获得projRef的一份拷贝 **/
/** 由于projRef是const char*,下面的一个函数不接受,所以需要转换成非const **/
tmp = (char *)malloc(strlen(projRef) + 1);
strcpy_s(tmp, strlen(projRef)+1, projRef);


/** 设置原始的坐标参数,和test.tif一致 **/
fRef.importFromWkt(&tmp);
/** 设置转换后的坐标 **/
tRef.SetWellKnownGeogCS("WGS84");

/** 下面进行坐标转换,到此为止都不需要proj,但是下面的内容如果不安装proj将会无法编译 **/
OGRCoordinateTransformation *coordTrans;
coordTrans = OGRCreateCoordinateTransformation(&fRef, &tRef);
coordTrans->Transform(1, &x, &y);
/** 这时候x,y已经转化为经纬度啦 **/
std::cout < 
 


推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 本文介绍了使用Rust语言编写、保存和编译程序的简单步骤。首先,打开记事本文件并编写程序代码,然后将代码保存到一个以.rs为扩展名的文件中。接下来,使用rustc命令来编译运行程序。最后,通过命令行运行编译后的程序,得到输出结果。如果遇到编译错误,可以下载Build Tools for Visual Studio 2017来解决。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • d3dx9_26.dll极品飞车9修复工具下载及修复教程
    本文介绍了d3dx9_26.dll文件的修复工具下载和修复教程,解释了该dll文件的作用和安装方法,同时提供了其他dll文件下载安装的方法。文章涵盖了3d、windows、p2p、dll、visual studio等知识点,并由未来可期1212投稿。希望该技术和经验能帮到你解决dll文件相关技术问题。 ... [详细]
  • Carve库在Visual Studio2015中的编译方法及注意事项
    本文介绍了在Visual Studio2015中编译Carve库的方法及注意事项。首先下载Carve库,并使用Visual Studio2015打开,生成后在bin目录下会生成.lib文件。同时,本文还指出了之前在Visual Studio2017中编译的问题,并提醒需要根据对应的平台进行编译,否则会出现报错。详细的步骤和注意事项请参考原文链接。 ... [详细]
  • 本文记录了作者对x265开源代码的实现与框架进行学习与探索的过程,包括x265的下载地址与参考资料,以及在Win7 32 bit PC、VS2010平台上的安装与配置步骤。 ... [详细]
author-avatar
喜欢在他耳边唱歌
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有