目录

  • 前言
  • 公式
  • 传入参数
  • 传出参数
  • 程序
  • 验证

前言

找了不少WGS84转UTM,不少都有些错误,兜兜转转找到一个即插即用的分享一下。

公式

传入参数

  • longitute(deg) 如:120.75819277
  • latitude(deg) 如:31.34534646

注意:如果传入的lon和lat是度分形式的记得要进行转换

传出参数

  • UTME(m) 如: 286733.498379
  • UTEN(m) 如: 3470047.079936

程序

#include "math.h"constexpr double DEG_TO_RAD_LOCAL = 3.1415926535897932 / 180.0;void LonLat2UTM(double longitude, double latitude, double& UTME, double& UTMN)
{double lon = longitude;double lat = latitude;// unit: km// variabledouble a = 6378.137;//赤道半径double e = 0.0818192;double k0 = 0.9996;double E0 = 500;double N0 = 0;//calc zoneNumberdouble zoneNumber = floor(lon/6) + 31;//calc lambda0double lambda0 = (zoneNumber - 1) * 6 - 180 + 3; //deglambda0 = lambda0 * DEG_TO_RAD_LOCAL; //radian//calc phi and lambda (lat and lon)double phi = lat * DEG_TO_RAD_LOCAL;double lambda = lon * DEG_TO_RAD_LOCAL;// Formula STARTdouble v = 1 / sqrt(1 - pow(e*sin(phi), 2));double A = (lambda - lambda0) * cos(phi);double T = pow(tan(phi), 2);double C = pow(e, 2) / (1 - pow(e, 2)) * pow(cos(phi), 2);double s = (1 - pow(e, 2)/4 - 3*pow(e, 4)/64 - 5*pow(e, 6)/256)*phi - (3*pow(e, 2)/8 + 3*pow(e, 4)/32 + 45*pow(e, 6)/1024)*sin(2*phi) + (15*pow(e, 4)/256 + 45*pow(e, 6)/1024)*sin(4*phi) - 35*pow(e, 6)/3072*sin(6*phi);UTME = E0 + k0*a*v * (A + (1-T+C)*pow(A, 3)/6 + (5-18*T+T*T)*pow(A, 5)/120);UTMN = N0 + k0*a * (s + v*tan(phi) * (pow(A, 2)/2 + (5-T+9*C+4*C*C)*pow(A, 4)/24 + (61-58*T+T*T)*pow(A, 6)/720));UTME *= 1000;UTMN *= 1000;
}

验证

#include <iostream>
#include <math.h>
#include <iomanip>
constexpr double DEG_TO_RAD_LOCAL = 3.1415926535897932 / 180.0;void LonLat2UTM(double longitude, double latitude, double& UTME, double& UTMN)
{double lon = longitude;double lat = latitude;// unit: km// variabledouble a = 6378.137;double e = 0.0818192;double k0 = 0.9996;double E0 = 500;double N0 = 0;//calc zoneNumberdouble zoneNumber = floor(lon/6) + 31;//calc lambda0double lambda0 = (zoneNumber - 1) * 6 - 180 + 3; //deglambda0 = lambda0 * DEG_TO_RAD_LOCAL; //radian//calc phi and lambda (lat and lon)double phi = lat * DEG_TO_RAD_LOCAL;double lambda = lon * DEG_TO_RAD_LOCAL;// Formula STARTdouble v = 1 / sqrt(1 - pow(e*sin(phi), 2));double A = (lambda - lambda0) * cos(phi);double T = pow(tan(phi), 2);double C = pow(e, 2) / (1 - pow(e, 2)) * pow(cos(phi), 2);double s = (1 - pow(e, 2)/4 - 3*pow(e, 4)/64 - 5*pow(e, 6)/256)*phi - (3*pow(e, 2)/8 + 3*pow(e, 4)/32 + 45*pow(e, 6)/1024)*sin(2*phi) + (15*pow(e, 4)/256 + 45*pow(e, 6)/1024)*sin(4*phi) - 35*pow(e, 6)/3072*sin(6*phi);UTME = E0 + k0*a*v * (A + (1-T+C)*pow(A, 3)/6 + (5-18*T+T*T)*pow(A, 5)/120);UTMN = N0 + k0*a * (s + v*tan(phi) * (pow(A, 2)/2 + (5-T+9*C+4*C*C)*pow(A, 4)/24 + (61-58*T+T*T)*pow(A, 6)/720));UTME *= 1000;UTMN *= 1000;
}int main()
{std::cout << "Hello world!" << std::endl;double lon = 120.75819277;double lat = 31.34534646;double x;double y;LonLat2UTM(lon, lat, x, y);std::cout<<setiosflags(std::ios::fixed)<<"x:"<<x<<std::endl;std::cout<<setiosflags(std::ios::fixed)<<"y:"<<y<<std::endl;return 0;
}

输出:

Hello world!
x:286733.498379
y:3470047.079936

简单的WGS84转UTM程序[C++]相关推荐

  1. NanoPi NEO Air使用八:编写个简单的驱动和应用程序

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  2. 使用 Flutter 制作一个简单的笑话生成器应用程序

    在本教程中,我将向您展示如何使用 Flutter 制作一个简单的笑话生成器应用程序 对于这个项目,我们将从 RESTful API 获取数据 API的链接: 随机笑话 对于这个项目,我不会关注应用程序 ...

  3. test.php创建,基于phpstudy简单快速搭建一个php程序

    原标题:基于phpstudy简单快速搭建一个php程序 人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升. 1 安装phpstudy 通过以下链接download.csdn.net/downl ...

  4. gradle spring_使用Gradle的简单Spring MVC Web应用程序

    gradle spring 除了我们现在将使用Spring MVC而不是原始servlet之外,该文章将与我们之前的文章Simple Gradle Web Application相似. 使用Gradl ...

  5. linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...

    当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...

  6. java mapreduce程序_简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行...

    [TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...

  7. sqllite java 代码,非常简单的SQLite的Java程序

    /* 在你的代码中引用这个驱动: Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConn ...

  8. vue.js更改颜色_如何使用Vue.js实现简单的标题更改应用程序

    vue.js更改颜色 by Anoob Bava 通过Anoob Bava 如何使用Vue.js实现简单的标题更改应用程序 (How to implement a simple title chang ...

  9. python协同过滤调用包_简单的python协同过滤程序实例代码

    本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...

  10. 编写简单的计算器功能的程序

    使用switch语句实现简单的加减乘除 具体代码如下: #include<stdio.h> int main() {int date1, date2; char op;printf(&qu ...

最新文章

  1. Centos7.x系统配置上的变化【转】
  2. python中configparser详解_Python中的ConfigParser模块使用详解
  3. Jquery中如何获取元素的文本,值,属性和内容
  4. [深度学习-TF2实践]应用Tensorflow2.x训练ResNet,SeNet和Inception模型在cifar10,测试集上准确率88.6%
  5. layuiadmin上手好难_孩子学什么乐器好?十种最受欢迎乐器的优劣势分析
  6. winyyy sys hcpidesk sys mtlrd sys uldfhjfh sys servets exe等1
  7. kmz转换为dwg_怎么将CAD图纸两种基本格式DWG与DXF进行互转?
  8. EXCEL的字符串处理公式,自带工作表函数汇总
  9. unbuntu20.04下载opencv4.5.2
  10. drain open 线与_Open-Drain与Push-Pull
  11. 2008年4月28日A股市场存在筑底异样
  12. 周转时间,平均周转时间,带权周转时间
  13. 计算机流体力学软件基础及工程应用,流体力学及其工程应用(英文版·原书第10版)2013年版...
  14. mysql内存淘汰_从创建索引过程中内存变化来看SQL Server与MySQL的内存淘汰算法
  15. 金字塔,原来这么简单
  16. 企业家够疯狂:他选择了挑战微软
  17. 个人喜欢的学习SAP的书
  18. RESTful的意义及其使用规则
  19. 私有云、公共云、混合云
  20. 什么是银行数字化转型?

热门文章

  1. Win10安装Apache和PHP
  2. A fastandrobust convolutionalneuralnetwork-based defect detection model inproductqualitycontrol-阅读笔记
  3. 如何获取和发现用户需求
  4. win7设置无线wifi连接到服务器,自动连接wifi怎么设置_如何设置无线网自动连接...
  5. 如何解决苹果电脑键盘失灵的问题
  6. Sails基础之Models层的config/datastores配置
  7. Swiper的安装及使用
  8. 如何将caj转换成word?caj转Word工具
  9. 华为云免费试用_如何试用华为云服务器
  10. js创建节点删除节点实例