【坐标转换】像素坐标转投影坐标、投影坐标转像素坐标(附有完整代码及测试结果)

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

        误差基本为零!

        坐标转换整套流程包括:像素坐标转投影坐标、投影坐标转大地坐标、大地坐标转空间直角坐标、七参数转换、空间直角坐标转大地坐标、大地坐标转投影坐标、投影坐标转像素坐标; 本人均已实现,且每一个环节都已经过测试、如有需要欢迎在下方留言评论!!!

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

1、影像借本信息

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

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

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

1、像素坐标转投影坐标 

2、投影坐标转像素坐标

三、代码实现 

1、像素坐标转投影坐标 

#include<iostream>
#include<fstream>
#include<ogrsf_frmts.h>
#include<ogr_geometry.h>
#include<gdal_priv.h>
#include<gdal.h>
#include "gdalwarper.h"  
#include<opencv2/opencv.hpp>    

using namespace cv;
using namespace std;


//获取 .tif 图像的投影信息
void getTfw(const char* path, double* geo)
{
    //path是.tif的绝对路径
    //geo[6]为数组
    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>& PixelsPoints, vector<Point2d>& ProjectPoints, string path)
{
    //vector<Point2d> res;        //保存投影坐标

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

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

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

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

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

        //保存旧坐标系的投影坐标
        ProjectPoints.push_back(projectPoint);

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

2、投影坐标转像素坐标 

//获取 .tif 图像的投影信息
void getTfw(const char* path, double* geo)
{
    //path是.tif的绝对路径
    //geo[6]为数组
    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>& ProjectPoints, vector<Point2d>& PixelsPoints, string path)
{
    //vector<Point2d> res;        //保存像素坐标

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


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

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

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

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

        //保存新坐标系的像素坐标
        PixelsPoints.push_back(pixelsPoint);

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

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

四、测试结果

1、像素坐标 

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

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

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

坐标转换整套流程包括:像素坐标转投影坐标、投影坐标转大地坐标、大地坐标转空间直角坐标、七参数转换、空间直角坐标转大地坐标、大地坐标转投影坐标、投影坐标转像素坐标; 本人均已实现,且每一个环节都已经过测试、如有需要欢迎在下方留言评论!!!

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
将经纬度坐标转换为监控像素坐标需要知道以下几个参数: 1. 监控画面的分辨率(宽度和高度) 2. 监控画面的显示区域对应的经纬度范围 3. 待换的经纬度坐标 假设我们已知以上参数,以下是一个简单的 Python 函数,可以将经纬度坐标转换为监控像素坐标: ```python import math def latlon_to_pixel(lat, lon, width, height, lat_min, lat_max, lon_min, lon_max): """ 将经纬度坐标转换为监控像素坐标 Arguments: lat -- 待换的纬度 lon -- 待换的经度 width -- 监控画面的宽度 height -- 监控画面的高度 lat_min -- 监控画面显示区域的最小纬度 lat_max -- 监控画面显示区域的最大纬度 lon_min -- 监控画面显示区域的最小经度 lon_max -- 监控画面显示区域的最大经度 Returns: x -- 换后的 x 坐标 y -- 换后的 y 坐标 """ # 计算纬度和经度的比例因子 lat_scale = height / (lat_max - lat_min) lon_scale = width / (lon_max - lon_min) # 计算像素坐标 x = math.floor((lon - lon_min) * lon_scale) y = math.floor((lat_max - lat) * lat_scale) return x, y ``` 使用示例: ```python # 监控画面分辨率为 1920x1080,显示区域为北京市 width = 1920 height = 1080 lat_min = 39.6 lat_max = 41.1 lon_min = 115.4 lon_max = 117.5 # 待换的经纬度坐标为 (40.0, 116.5) lat = 40.0 lon = 116.5 # 换为像素坐标 x, y = latlon_to_pixel(lat, lon, width, height, lat_min, lat_max, lon_min, lon_max) # 输出结果 print("经纬度坐标 ({}, {}) 换为像素坐标 ({}, {})".format(lon, lat, x, y)) ``` 输出结果: ``` 经纬度坐标 (116.5, 40.0) 换为像素坐标 (1053, 321) ``` 注意:以上代码仅提供基本的经纬度像素坐标的计算方法,实际使用时还需要考虑地球的椭球形状、地图投影方式等因素对坐标转换的影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据库内核

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值