天天看點

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

目錄内容:

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

qt.pro配置: 對應上自己的路徑

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

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;
}
           

輸出結果:

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

精度毫無缺失。

繼續閱讀