北斗编码实现

本文根据北斗格网编码标注编写的测试代码, 北斗国标描述网址 http://c.gb688.cn/bzgk/gb/showGb?type=online&hcno=77B7EA113926D3247F9688324D4A91C8

我将北斗编码整理成一张图, 如下(代码在文末附上):

#include "stdafx.h"
#include <vector>
#include <algorithm>
#include <iosfwd>
#include <string>
#include <map>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <string>
#include <stdio.h>
#include <math.h>std::string GBBeiDouCode(int level, double x, double y, double z)
{//if(y >=88)std::vector<std::string>  code;std::vector<std::string>  hcode;LocType ltype = XYLocType(x, y);std::pair<int, int> sym = LocTypeSym(ltype);int pre_r, pre_c;double posLon = -180.00000000, posLat = 0.00000000;if (x >= 180.00000)x = x - D3600_2_8888 / 100;if (x <= -180.000000)x = x - D3600_2_8888 / -100;//行列号按照左闭右开,最后180按照闭算到59for (int i = 1; i <= level; i++){if (i == 1) {if (y >= 0)code.push_back("N");elsecode.push_back("S");int nr = floor((x - (posLon)) / 6.00000000); //0-59int nc = floor(fabs(y - posLat) / 4.00000000);//0-21std::string nrc;if (nr < 10){nrc = nrc.append("0");int tmpnr = nr == 0 ? 1 : nr;nrc = nrc.append(std::to_string(tmpnr));}else{nrc = std::to_string(nr > 59 ? 60 : nr + 1);}if (nc > 21)nc = 21;char nccc = (char)(nc + 65);char f[2] = { nccc,0 };code.emplace_back();code[code.size() - 1].append(nrc);code[code.size() - 1].append(f);code[code.size() - 1].resize(3);nr = nr > 59 ? 59 : nr;nc = nc > 21 ? 21 : nc;pre_r = nr;pre_c = nc;continue;}else if (i == 2){if (x > 0)posLon = posLon + (pre_r) * 6;else{/*	if (x <= -180.00000000000)posLon = posLon + (pre_r + 1) * 6;else*/posLon = posLon + (pre_r + 1) * 6;}if (y > 0)posLat = posLat + (pre_c) * 4;elseposLat = posLat - (pre_c) * 4;int nc = (int)floor(fabs(y - posLat) / 0.5);//0-11int nr = (int)floor(fabs(x - posLon) / 0.5);//0-7nr = nr > 11 ? 11 : nr;nc = nc > 7 ? 7 : nc;char nrc = (char)(nr > 9 ? nr + 55 : nr + 48);char ncc = (char)(nc + 48);pre_r = nr;pre_c = nc;code.emplace_back();code[code.size() - 1].resize(2);code[code.size() - 1][0] = nrc;code[code.size() - 1][1] = ncc;continue;}else if (i == 3){if (x > 0)posLon = posLon + (pre_r) * 0.5;elseposLon = posLon - pre_r * 0.5;if (y > 0)posLat = posLat + (pre_c) * 0.5;elseposLat = posLat - (pre_c) * 0.5;int nc = (int)floor(fabs(y - posLat) / D60_10);//0-2 int nr = (int)floor(fabs(x - posLon) / D60_15); //0-1nr = nr > 1 ? 1 : nr;nc = nc > 2 ? 2 : nc;pre_r = nr;pre_c = nc;int ncc = nc * 2 + nr;char nccc = (char)(ncc + 48);code.emplace_back();code[code.size() - 1].resize(1);code[code.size() - 1][0] = nccc;continue;}else if (i == 4){if (x > 0)posLon = posLon + (pre_r)* D60_15;elseposLon = posLon - (pre_r)* D60_15;if (y > 0)posLat = posLat + (pre_c)* D60_10;elseposLat = posLat - (pre_c)* D60_10;int nc = (int)floor(fabs(y - posLat) / D60_1);int nr = (int)floor(fabs(x - posLon) / D60_1);nr = nr > 14 ? 14 : nr;nc = nc > 9 ? 9 : nc;pre_r = nr;pre_c = nc;char nrc = (char)(nr > 9 ? nr + 55 : nr + 48);char ncc = (char)(nc + 48);code.emplace_back();code[code.size() - 1].resize(2);code[code.size() - 1][0] = nrc;code[code.size() - 1][1] = ncc;continue;}else if (i == 5){if (x > 0)posLon = posLon + (pre_r) * (D60_1);elseposLon = posLon - (pre_r) * (D60_1);if (y > 0)posLat = posLat + (pre_c) * (D60_1);elseposLat = posLat - (pre_c) * (D60_1);int nc = (int)floor(fabs(y - posLat) / D3600_4);//0-14int nr = (int)floor(fabs(x - posLon) / D3600_4);//0-14nr = nr > 14 ? 14 : nr;nc = nc > 14 ? 14 : nc;pre_r = nr;pre_c = nc;char nrc = (char)(nr > 9 ? nr + 55 : nr + 48);char ncc = (char)(nc > 9 ? nc + 55 : nc + 48);code.emplace_back();code[code.size() - 1].resize(2);code[code.size() - 1][0] = nrc;code[code.size() - 1][1] = ncc;continue;}else if (i == 6){if (x > 0)posLon = posLon + (pre_r)* D3600_4;elseposLon = posLon - (pre_r)* D3600_4;if (y > 0)posLat = posLat + (pre_c)* D3600_4;elseposLat = posLat - (pre_c)* D3600_4;int nc = (int)floor(fabs(y - posLat) / D3600_2);//0-1int nr = (int)floor(fabs(x - posLon) / D3600_2);//0-1nr = nr > 1 ? 1 : nr;nc = nc > 1 ? 1 : nc;pre_r = nr;pre_c = nc;int ncc = nc * 2 + nr;char nccc = (char)(ncc + 48);code.emplace_back();code[code.size() - 1].resize(1);code[code.size() - 1][0] = nccc;continue;}else if (i >= 7 && i <= 10){int d = i - 7 + 1;double dd2 = D3600_2 / pow(8, d);double dd1 = D3600_2 / pow(8, d - 1);if (x > 0)posLon = posLon + (pre_r)* dd1;elseposLon = posLon - (pre_r)* dd1;if (y > 0)posLat = posLat + (pre_c)* dd1;elseposLat = posLat - (pre_c)* dd1;int nc = (int)floor(fabs(y - posLat) / dd2);int nr = (int)floor(fabs(x - posLon) / dd2);nr = nr > 7 ? 7 : nr;nc = nc > 7 ? 7 : nc;pre_r = nr;pre_c = nc;char nrc = (char)(nr + 48);char ncc = (char)(nc + 48);code.emplace_back();code[code.size() - 1].resize(2);code[code.size() - 1][0] = nrc;code[code.size() - 1][1] = ncc;continue;}}//n0double r0 = 6378137.000000000;// a=1+sta0 b=(h+r0)/r0//n=sta0/sta * logb /log a b //a 为底, b为指double PI = 3.1415926535897932;double sta0 =  PI / 180.00000000;double sta = g_zdel[level-1]  * 0.017453292519943295;double rn = (r0 + z) / r0;double fg = (sta0 / sta) * (log(rn) / log(1 + sta0));int ffg = floor(fg);std::vector<std::pair<int, int>>g_levelStartEndLocation ={ { 32,32 },		{ 26, 31 },		{ 23, 25 },		{ 22, 22 },		{ 18, 21 },{ 14, 17 },		{ 13, 13 },		{ 10, 12 },		{ 7, 9 } ,		{ 4, 6 } ,		{ 1, 3 } };// 1 6 3 1 4 4 1 3 3 3 3 int left = 0;for (int j = 0; j <= level; ++j){int left = 32 - g_levelStartEndLocation[j].second;int right = g_levelStartEndLocation[j].first + 32 - g_levelStartEndLocation[j].second - 1;int nVal = (((unsigned int)ffg << left) >> right);if (j == 3 || j == 6) {if (nVal > 1)nVal = 1;}else if (j == 4 || j == 5) {if (nVal > 14)nVal = 14;}else if (j == 2 || j >= 7){if (nVal > 7)nVal = 7;}else if (j == 1){if (nVal > 63)nVal = 63;}if (j == 4 || j == 5) {std::string s;char nrc = (char)(nVal > 9 ? nVal + 55 : nVal + 48);s.resize(1);s[0] = nrc;hcode.push_back(s);}else if (j == 1 && nVal < 10) {std::string f = "0";f.append(std::to_string(nVal));hcode.push_back(f.c_str());}else {hcode.push_back(std::to_string(nVal).c_str());}}std::stringbuf buf;for (int i = 0; i < code.size(); i++){buf.sputn(code[i].c_str(), code[i].size());buf.sputn(hcode[i].c_str(), hcode[i].size());}return buf.str();}

反算代码后面再写,

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/659921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫头虎博主第10期赠书活动:《写给大家看的Midjourney设计书》

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

Android 9.0 SystemServer进程读写sdcard权限的修改

1.前言 在9.0的系统rom定制化开发中,在一些系统进程中,也就是在SystemServer的进程中,其中系统服务中会要求读写Sdcard的一些功能,然后 默认是没有读取sdcard权限的,而在app中可以申请sdcard读写权限在系统服务中就不能申请权限,接下来看怎么授权实现sdcard授权 如图: 2…

ElementUI 组件:Container 布局容器

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 el-container.vue&#xff08;Container 布局容器&#xff09;页面效果图 项目里el-container.vue代码 <script> import PagePath from "/components/PagePat…

蓝桥杯嵌入式——省赛模板构建_lcd

在比赛时会给到资料包里面有LCD的驱动代码&#xff0c;我们只需copy到目标工程的bsp中间层来应用即可 打开Keil5&#xff0c;进行声明 初始化LCD屏幕 定义LCD专用减速变量和显示字符串变量 编写LCD执行子函数Lcd_proc()&#xff0c;用到sprintf函数

Go map 读写性能优化 - 分片 map

基本在所有的编程语言中&#xff0c;都有 map 这种数据结构&#xff0c;Go 语言也不例外。 我们知道 Go 是一门对并发支持得比较好的语言&#xff0c;但是 map 并不支持并发读写。 比如&#xff0c;下面这种写法是错误的&#xff1a; var m make(map[int]int) var wg sync.Wa…

如何下载52pojie、CSDN、简书、Myitmx、博客园的文章?(最新教程)

使用的油猴插件&#xff0c;具体怎么安装问一下度娘。 我用的火狐&#xff0c;点点点就行了&#xff0c;省事 先安装油猴拓展&#xff0c;启用一下 Tampermonkey – 下载 &#x1f98a; Firefox 扩展&#xff08;zh-CN&#xff09; 在安装插件 SaveToPDF 脚本安装后&#…

基于EdgeWorkers的边缘应用如何进行单元测试?

随着各行各业数字化转型的持续深入&#xff0c;越来越多企业开始选择将一些应用程序放在距离最终用户更近的边缘位置来运行&#xff0c;借此降低延迟&#xff0c;提高应用程序响应速度&#xff0c;打造更出色的用户体验。 相比传统集中部署和运行的方式&#xff0c;这种边缘应…

基于 NOVATEK NT98530 Multiview Stitching 应用解决方案

感测技术近来于影像监控系统应用有了进一步的发展&#xff0c;多镜头的应用也与日俱增&#xff0c;如 AI 视觉感测会议相机&#xff0c;能满足远端多人聚会、远距教育训练的多元需求等&#xff0c;相关应用层面广泛涵盖了在生活中所面对的各种场景&#xff0c;带动更加可观的潜…

#{}和${}的区别

#{}和${}的区别 .本质区别:使用注意事项防止SQL注入排序like查询 . 在使用mybatis操作数据库的时候,我们在编写sql语言的时候,会遇到一个问题,就是在传参的时候,有两个符号#,$.这两个符号有什么异同呢,接下来,我就会带着大家对这个问题进行简单的探讨 本质区别: #执行的是预编…

idea自动生成实体类

第一步&#xff1a;idea连接数据库 出现这个就连接成功 第二步&#xff1a;选择数据库 第三步&#xff1a;创建实体类 也可以点击数据库一下子全部创建 选择创建实体类所放位置 这样就完成了&#xff0c;点击看看对其做相应修改

RK3588平台开发系列讲解(视频篇)RKMedia的VDEC模块

文章目录 一、 VDEC模块支持的编码标准介绍二、VDEC API的调用三、VDEC解码流程沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKMedia是RK提供的一种多媒体处理方案,可实现音视频捕获、音视频输出、音视频编解码等功能。 一、 VDEC模块支持的编码标准介绍 RK3688 V…

【日常总结】MobaXterm session 如何迁移

一、场景 二、解决方案 三、实战 Stage 1&#xff1a;右键导出 Import sessions from file Stage 2&#xff1a;新MobaXterm软件中导入即可。Export all sessions to file 四、不足 一、场景 电脑更换&#xff0c;原电脑上MobaXterm中的20多个连接如何迁移 二、解决方案 …

如何判断 LM358 芯片是否损坏或故障?

LM358 芯片是一种流行的低功耗双运放&#xff0c;广泛应用于各种电子电路中&#xff0c;包括放大器、滤波器、积分器、比较器等。它以其低成本、高性价比和广泛的工作电源范围&#xff08;3V至32V单电源或1.5V至16V双电源&#xff09;而被广泛使用。 然而&#xff0c;像所有电…

十分钟学会用springboot制作微信小程序富文本编辑器

1.1 富文本模型设计 在构建富文本编辑器系统时&#xff0c;首先需要设计一个合适的富文本模型。 CREATE TABLE IF NOT EXISTS rich_texts (id INT PRIMARY KEY AUTO_INCREMENT,title VARCHAR(255),content TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );这个表包括…

如何在FBX剔除Lit.shader依赖

1&#xff09;如何在FBX剔除Lit.shader依赖 2&#xff09;Unity出AAB包&#xff08;PlayAssetDelivery&#xff09;模式下加载资源过慢问题 3&#xff09;如何在URP中正确打出Shader变体 4&#xff09;XLua打包Lua文件粒度问题 这是第371篇UWA技术知识分享的推送&#xff0c;精…

维护神经健康:新生儿补充维生素B12的注意事项

引言&#xff1a; 维生素B12是维持神经系统正常运作所必需的关键成分&#xff0c;对于新生儿的生长发育具有重要的作用。本文将深入探讨维生素B12的功能、新生儿补充的必要性&#xff0c;以及在补充维生素B12时应该注意的事项&#xff0c;以为父母提供科学、全面的育儿指南。 …

springCloud gateway 防止XSS漏洞

springCloud gateway 防止XSS漏洞 一.XSS(跨站脚本)漏洞详解1.XSS的原理和分类2.XSS漏洞的危害3.XSS的防御 二.Java开发中防范XSS跨站脚本攻击的思路三.相关代码&#xff08;适用于spring cloud gateway&#xff09;1.CacheBodyGlobalFilter.java2.XssRequestGlobalFilter.java…

C++基础语法学习笔记

C Tutorial 1.基础语法 C 应用&#xff1a;操作系统、图形用户界面和嵌入式系统 C和C区别&#xff1a;C支持类和对象 C语法 #include <iostream> using namespace std;int main(){cout << "hello world!";return 0; }int main () { cout << &q…

8-Docker网络模式之container

1.介绍 Docker container网络模式是指指定新创建的Docker容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。 使用Docker container网络模式新建的容器不会创建的自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口等。然而两个容器除了网络…

知识图谱推理方法综述

目录 前言1 基于符号表示的推理方法1.1 Axioms和Datalog1.2 图结构和规则学习1.3 TBox和ABox 2 基于向量表示的推理方法2.1 嵌入系列和Ontology Embedding2.2 向量的规则学习2.3 图神经网络 3 符号逻辑和表示学习的融合3.1 向量表示学习与本体规则学习3.2 规则演绎推理3.3 符号…