IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 像素坐标转投影坐标、投影坐标转像素坐标(附有完整代码及测试结果) -> 正文阅读

[数据结构与算法]像素坐标转投影坐标、投影坐标转像素坐标(附有完整代码及测试结果)

????????本文主要是对像素坐标转投影坐标、投影坐标转像素坐标的原理进行介绍及代码上的实现!!!?

一、.tif 影像基本信息介绍

1、影像借本信息

????????上图是我使用 QGIS 打开的一副遥感影像的基本属性,上图中 (CRS)范围中的数据对应着该遥感影像的左上角和右下角坐标;

2、遥感影像左上角、右下角坐标和像素大小、宽度、高度之间的关系

二、投影坐标与像素坐标间的转化原理

1、像素坐标转投影坐标?

2、投影坐标转像素坐标

?

三、代码实现?

1、投影坐标转像素坐标

//获取 .tif 图像的投影信息
void getTfw(const char* path, double* geo)
{
    GDALAllRegister();

    GDALDataset* podataset = (GDALDataset*)GDALOpen(path, GA_ReadOnly);

    //保存 .tif 文件的投影信息' x=geo[0]、y=geo[3]、像素大小=geo[1]
    //double oldGeo[6];

    podataset->GetGeoTransform(geo);
}


//像素坐标转投影坐标(基本无误差)
void pixelsPoint2ProjectPoint()
{
    //vector<Point2d> res;        //保存投影坐标

    //获取 .tif 文件的投影信息
    getTfw(OLDPATH, oldGeo);     
   

    //创建保存投影坐标的文件
    ofstream ofile(".\\oldProjectPoints.txt");

    if (!ofile.is_open())
    {
        qDebug() << "打开文件失败!" << endl;
        return;
    }

    for (auto it = oldPixelsPoints.begin(); it != oldPixelsPoints.end(); it++)
    {
        Point2d projectPoint;

        projectPoint.x = oldGeo[1] * (*it).x + oldGeo[0];
        projectPoint.y = oldGeo[3] - oldGeo[1] * (*it).y;

        //保存旧坐标系的投影坐标
        oldProjectPoints.append(projectPoint);

        //把旧坐标系的投影坐标保存到 .txt 文件中
        ofile << setprecision(20) << projectPoint.x << "," << setprecision(20) << projectPoint.y << endl;
    }
    ofile.close();
}

2、投影坐标转像素坐标

//获取 .tif 图像的投影信息
void getTfw(const char* path, double* geo)
{
    GDALAllRegister();

    GDALDataset* podataset = (GDALDataset*)GDALOpen(path, GA_ReadOnly);

    //保存 .tif 文件的投影信息' x=geo[0]、y=geo[3]、像素大小=geo[1]
    //double oldGeo[6];

    podataset->GetGeoTransform(geo);
}

//投影坐标转像素坐标(基本无误差)
void projectPoint2PixelsPoint()
{
    //vector<Point2d> res;        //保存像素坐标

    //获取 .tif 文件的投影信息,应转像素时转一次就够了(影像不同或许需要转两次)
    //getTfw(NEWPATH, newGeo);
    getTfw(OLDPATH, newGeo);

    char str[25];

    //gcvt(geo[1], 10, str);

    //cout << str << endl;

    //创建保存投影坐标的文件
    ofstream ofile(".\\newPixelsPoints.txt");

    if (!ofile.is_open())
    {
        qDebug() << "打开文件失败!" << endl;
        return;
    }

    for (auto it = newProjectPoints.begin(); it != newProjectPoints.end(); it++)
    {
        Point2d pixelsPoint;

        pixelsPoint.x = ((*it).x - newGeo[0]) / newGeo[1];
        pixelsPoint.y = (newGeo[3] - (*it).y) / newGeo[1];

        //保存新坐标系的像素坐标
        newPixelsPoints.append(pixelsPoint);

        ofile << setprecision(20) << pixelsPoint.x << "," << setprecision(20) << pixelsPoint.y << endl;
    }
    ofile.close();
}

说明:获取 .tif 影像的投影信息请参考:c++ 读取 .tfw 文件数据(读取 .tif 影像中的投影信息)_一米九零小胖子的博客-CSDN博客_tfw文件?

四、测试结果

1、像素坐标?

2、像素坐标转投影坐标结果?

?3、投影坐标转像素坐标结果

由上述转换结果可知,转换误差基本为零!!!?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:04:59  更:2022-04-28 12:05:25 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:20:45-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码