WGS84坐标和UTM坐标的互转(c/c++)

本文使用proj4库来进行WGS84坐标和UTM坐标的互转。

开发工具:

qt 5.12.2 编译器MVCS2015

proj4源码和编译过的文件(使用mvcs2015 release 64编译,如需要其他则使用相应的命令行编译):网盘连接:https://pan.baidu.com/s/10450W8_jde71_JKU03szHw   密码:pt19

目录内容:

qt.pro配置: 对应上自己的路径

coorconv.h

#ifndef CCOORCONV_H
#define CCOORCONV_H
#define ACCEPT_USE_OF_DEPRECATED_PROJ_API_H
#include <proj_api.h>

typedef struct _UTMCorr
{
    double x;
    double y;
}UTMCorr;

typedef struct _WGS84Corr
{
    double log;
    double lat;
}WGS84Corr;

class CCoorConv
{
private:
    projPJ m_pj_wgs84;  //球体:wgs84、投影:经纬度投影
    projPJ m_pj_utm;    //球体:wgs84、投影UTM
    int m_nUTMZone;     //utm带号
    bool m_bNorth;      //是否为北半球

public:
    CCoorConv();
    ~CCoorConv();
    //wgs84 -> utm
    bool LatLonToUTMXY(const WGS84Corr wgs, UTMCorr& utm);
    //utm -> wgs84
    bool UTMXYToLatLon(const UTMCorr utm, WGS84Corr& wgs);

};
#endif

coorconv.cpp

#include "coorconv.h"
#include <iostream>
#include <string>
using namespace std;

CCoorConv::CCoorConv():
    m_nUTMZone(-10000), m_bNorth(false), m_pj_utm(nullptr)
{
    const char *wgs84 = "+proj=longlat +datum=WGS84 +no_defs ";//GPS所用坐标系,EPSG:4326
    m_pj_wgs84 = pj_init_plus(wgs84);
}
CCoorConv::~CCoorConv()
{
    if(m_pj_utm != nullptr)
    {
        pj_free(m_pj_utm);
        m_pj_utm = nullptr;
    }
    if(m_pj_wgs84 != nullptr)
    {
        pj_free(m_pj_wgs84);
        m_pj_wgs84 = nullptr;
    }
}

bool CCoorConv::LatLonToUTMXY(const WGS84Corr wgs, UTMCorr& utm)
{

    int nUTMZone = (int)((wgs.log+186.0)/6.0);
    bool bNorth = wgs.lat > 0 ? true : false;
    if(m_nUTMZone != nUTMZone || m_bNorth != bNorth)
    {
        //"+proj=utm +zone=50 +datum=WGS84 +units=m +no_defs";
        // "+proj=utm +zone=48 +south +datum=WGS84 +units=m +no_defs"
        std::string qstrUTM = "+proj=utm +zone=" + std::to_string(nUTMZone);
        if(!bNorth)
        {
            qstrUTM += " +south ";
        }
        qstrUTM += " +datum=WGS84 +units=m +no_defs";
        if(m_pj_utm != nullptr)
        {
            pj_free(m_pj_utm);
            m_pj_utm = NULL;
        }
        string strUTM = qstrUTM;
        const char *pUTM = strUTM.c_str();

        m_pj_utm = pj_init_plus(pUTM);


        m_nUTMZone = nUTMZone;
        m_bNorth = bNorth;
    }
    utm.x = wgs.log * DEG_TO_RAD;
    utm.y = wgs.lat * DEG_TO_RAD;
    pj_transform(m_pj_wgs84, m_pj_utm, 1, 1, &utm.x, &utm.y, nullptr);

    return true;
}

bool CCoorConv::UTMXYToLatLon(const UTMCorr utm, WGS84Corr& wgs)
{
    if(m_pj_utm == nullptr)
    {
        return false;
    }
    wgs.log = utm.x;
    wgs.lat = utm.y;
    pj_transform(m_pj_utm, m_pj_wgs84, 1, 1, &wgs.log, &wgs.lat, nullptr);
    wgs.log = wgs.log * RAD_TO_DEG;
    wgs.lat = wgs.lat * RAD_TO_DEG;

    return  true;
}

main.cpp

#include"coorconv.h"
#include<qdebug.h>
int main(int argc,char* argv[])
{
    CCoorConv conv_;
    UTMCorr utm;
    WGS84Corr wgs;
    wgs.log = 116.26786647;
    wgs.lat = 38.09131733;
    conv_.LatLonToUTMXY(wgs,utm);
    QString x1 = QString::number(utm.x, 10, 3);
    QString y1 = QString::number(utm.y, 10, 3);
    QString str1 = QString("%1 %2").arg(x1).arg(y1);
    qDebug()<<str1;

    conv_.UTMXYToLatLon(utm,wgs);
    QString x2 = QString::number(wgs.log, 10, 8);
    QString y2 = QString::number(wgs.lat, 10, 8);
    QString str2 = QString("%1 %2").arg(x2).arg(y2);
    qDebug()<<str2;

    return 0;
}

输出结果:

精度毫无缺失。


版权声明:本文为kingcrab0710原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。