简单的WGS84转UTM程序[C++]
目录
- 前言
- 公式
- 传入参数
- 传出参数
- 程序
- 验证
前言
找了不少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++]相关推荐
- NanoPi NEO Air使用八:编写个简单的驱动和应用程序
NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...
- 使用 Flutter 制作一个简单的笑话生成器应用程序
在本教程中,我将向您展示如何使用 Flutter 制作一个简单的笑话生成器应用程序 对于这个项目,我们将从 RESTful API 获取数据 API的链接: 随机笑话 对于这个项目,我不会关注应用程序 ...
- test.php创建,基于phpstudy简单快速搭建一个php程序
原标题:基于phpstudy简单快速搭建一个php程序 人人都是程序员,希望在零碎的阅读时间里,给您一些技术提升. 1 安装phpstudy 通过以下链接download.csdn.net/downl ...
- gradle spring_使用Gradle的简单Spring MVC Web应用程序
gradle spring 除了我们现在将使用Spring MVC而不是原始servlet之外,该文章将与我们之前的文章Simple Gradle Web Application相似. 使用Gradl ...
- linux编写一个简单的端口扫描程序,小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2)...
当前位置:我的异常网» Linux/Unix » 小弟我在linux下写了个简单的多线程端口扫描程序, 小弟我在linux下写了个简单的多线程端口扫描程序,运行时出现有关问题,请问一下(2) www. ...
- java mapreduce程序_简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行...
[TOC] 简单的java Hadoop MapReduce程序(计算平均成绩)从打包到提交及运行 程序源码 import java.io.IOException; import java.util. ...
- sqllite java 代码,非常简单的SQLite的Java程序
/* 在你的代码中引用这个驱动: Class.forName("org.sqlite.JDBC"); Connection conn = DriverManager.getConn ...
- vue.js更改颜色_如何使用Vue.js实现简单的标题更改应用程序
vue.js更改颜色 by Anoob Bava 通过Anoob Bava 如何使用Vue.js实现简单的标题更改应用程序 (How to implement a simple title chang ...
- python协同过滤调用包_简单的python协同过滤程序实例代码
本文研究的主要是python协同过滤程序的相关内容,具体介绍如下. 关于协同过滤的一个最经典的例子就是看电影,有时候不知道哪一部电影是我们喜欢的或者评分比较高的,那么通常的做法就是问问周围的朋友,看看 ...
- 编写简单的计算器功能的程序
使用switch语句实现简单的加减乘除 具体代码如下: #include<stdio.h> int main() {int date1, date2; char op;printf(&qu ...
最新文章
- Centos7.x系统配置上的变化【转】
- python中configparser详解_Python中的ConfigParser模块使用详解
- Jquery中如何获取元素的文本,值,属性和内容
- [深度学习-TF2实践]应用Tensorflow2.x训练ResNet,SeNet和Inception模型在cifar10,测试集上准确率88.6%
- layuiadmin上手好难_孩子学什么乐器好?十种最受欢迎乐器的优劣势分析
- winyyy sys hcpidesk sys mtlrd sys uldfhjfh sys servets exe等1
- kmz转换为dwg_怎么将CAD图纸两种基本格式DWG与DXF进行互转?
- EXCEL的字符串处理公式,自带工作表函数汇总
- unbuntu20.04下载opencv4.5.2
- drain open 线与_Open-Drain与Push-Pull
- 2008年4月28日A股市场存在筑底异样
- 周转时间,平均周转时间,带权周转时间
- 计算机流体力学软件基础及工程应用,流体力学及其工程应用(英文版·原书第10版)2013年版...
- mysql内存淘汰_从创建索引过程中内存变化来看SQL Server与MySQL的内存淘汰算法
- 金字塔,原来这么简单
- 企业家够疯狂:他选择了挑战微软
- 个人喜欢的学习SAP的书
- RESTful的意义及其使用规则
- 私有云、公共云、混合云
- 什么是银行数字化转型?
热门文章
- Win10安装Apache和PHP
- A fastandrobust convolutionalneuralnetwork-based defect detection model inproductqualitycontrol-阅读笔记
- 如何获取和发现用户需求
- win7设置无线wifi连接到服务器,自动连接wifi怎么设置_如何设置无线网自动连接...
- 如何解决苹果电脑键盘失灵的问题
- Sails基础之Models层的config/datastores配置
- Swiper的安装及使用
- 如何将caj转换成word?caj转Word工具
- 华为云免费试用_如何试用华为云服务器
- js创建节点删除节点实例