基于JS实现《国家基本比例尺地形图分幅和编号》标准

1、标准

GB T 13989-2012国家基本比例尺地形图分幅和编号

地址:【高清版】GB T 13989-2012国家基本比例尺地形图分幅和编号 - 道客巴巴

2、1:100万比例尺

2.1 说明

2.2 计算公式

2.3 计算代码

2.3.1 元素数据定义

由于中国只到N层,所以只定义到O.

/*** 100万比例尺下的行号对应的代码*/static mateData100 = [{rowCode: "A",rowNumber: 1,},{rowCode: "B",rowNumber: 2,},{rowCode: "C",rowNumber: 3,},{rowCode: "D",rowNumber: 4,},{rowCode: "E",rowNumber: 5,},{rowCode: "F",rowNumber: 6,},{rowCode: "G",rowNumber: 7,},{rowCode: "H",rowNumber: 8,},{rowCode: "I",rowNumber: 9,},{rowCode: "J",rowNumber: 10,},{rowCode: "K",rowNumber: 11,},{rowCode: "L",rowNumber: 12,},{rowCode: "M",rowNumber: 13,},{rowCode: "N",rowNumber: 14,},{rowCode: "O",rowNumber: 15,},];
2.3.2 代码实现
/*** 根据经纬度计算100万比例尺的行列号* @param lon* @param lat* @return {{col: number, row: number, code: string}}*/static calcMapFrameNumber100 = (lon, lat) => {let a = Math.trunc(lat / 4.0) + 1;let b = Math.trunc(lon / 6.0) + 31;let mateInfo = MapFrameUtils.mateData100.find((item) => item.rowNumber === a);return {row: a,col: b,code: mateInfo.rowCode,};};

3、非100万比例尺

3.1 说明

3.1.1 2000到50万比例尺格式

3.1.2 500到1000比例尺格式

3.2 计算公式

3.3 代码

3.3.1 元数据
/*** 100万比例尺下的行号对应的代码*/static mateData100 = [{rowCode: "A",rowNumber: 1,},{rowCode: "B",rowNumber: 2,},{rowCode: "C",rowNumber: 3,},{rowCode: "D",rowNumber: 4,},{rowCode: "E",rowNumber: 5,},{rowCode: "F",rowNumber: 6,},{rowCode: "G",rowNumber: 7,},{rowCode: "H",rowNumber: 8,},{rowCode: "I",rowNumber: 9,},{rowCode: "J",rowNumber: 10,},{rowCode: "K",rowNumber: 11,},{rowCode: "L",rowNumber: 12,},{rowCode: "M",rowNumber: 13,},{rowCode: "N",rowNumber: 14,},{rowCode: "O",rowNumber: 15,},];
3.3.2 实现代码
/*** 根据比例尺,经纬度计算地图的行列号* @param scale* @param lon* @param lat* @return {{col: number, code: *, row: number, digit: (number|*)}|null}*/static calcMapFrameNumberNot100 = (scale, lon, lat) => {let mateData = MapFrameUtils.mateData.find((item) => item.scale === scale);if (mateData) {let cStep = ((lat % 4) / mateData.latD).toPrecision(4);let c = Math.round(4 / mateData.latD - Math.trunc(Number(cStep)));let dStep = ((lon % 6) / mateData.lonD).toPrecision(4);let d = Math.trunc(Number(dStep)) + 1;return {row: c,col: d,code: mateData.code,digit: mateData.digit,};} else {return null;}};

4、综合代码

/*** 采用标准:国家基本比例尺地形图分幅和编号《GB/T 13989-2012》* 1、根据经纬度计算图幅号* 2、根据图幅号图幅范围计算* 3、定义图幅信息*/
export default class MapFrameUtils {/*** 根据经纬度计算100万比例尺的行列号* @param lon* @param lat* @return {{col: number, row: number, code: string}}*/static calcMapFrameNumber100 = (lon, lat) => {let a = Math.trunc(lat / 4.0) + 1;let b = Math.trunc(lon / 6.0) + 31;let mateInfo = MapFrameUtils.mateData100.find((item) => item.rowNumber === a);return {row: a,col: b,code: mateInfo.rowCode,};};/*** 根据比例尺,经纬度计算地图的行列号* @param scale* @param lon* @param lat* @return {{col: number, code: *, row: number, digit: (number|*)}|null}*/static calcMapFrameNumberNot100 = (scale, lon, lat) => {let mateData = MapFrameUtils.mateData.find((item) => item.scale === scale);if (mateData) {let cStep = ((lat % 4) / mateData.latD).toPrecision(4);let c = Math.round(4 / mateData.latD - Math.trunc(Number(cStep)));let dStep = ((lon % 6) / mateData.lonD).toPrecision(4);let d = Math.trunc(Number(dStep)) + 1;return {row: c,col: d,code: mateData.code,digit: mateData.digit,};} else {return null;}};/*** 根据计算出来的行列号,比例尺,计算该格网在地图商的范围* @param frame100* @param frameNot100* @param scale* @return {{minY: number, minX: number, maxY: number, maxX: number}}*/static calcMapFrameExtent = (frame100, frameNot100, scale) => {let mateData = MapFrameUtils.mateData.find((item) => item.scale === scale);let lon = (frame100.col - 31) * 6 + (frameNot100.col - 1) * mateData.lonD;let lat =(frame100.row - 1) * 4 +(4 / mateData.latD - frameNot100.row) * mateData.latD;return {minX: lon,minY: lat,maxX: lon + mateData.lonD,maxY: lat + mateData.latD,};};/*** 根据比例尺和经纬度,获取所在图幅范围的编号、行列号以及范围* @param scale* @param lon* @param lat* @return {null|{extent: {minY: number, minX: number, maxY: number, maxX: number}, col: number, code: string, row: number}}*/static calcMapFrameNumber = (scale, lon, lat) => {let mapFrameNumber100 = MapFrameUtils.calcMapFrameNumber100(lon, lat);let mapFrameNumberNot100 = MapFrameUtils.calcMapFrameNumberNot100(scale,lon,lat);if (mapFrameNumberNot100) {let code =mapFrameNumber100.code +"" +mapFrameNumber100.col +"" +mapFrameNumberNot100.code +"" +mapFrameNumberNot100.row.toString().padStart(mapFrameNumberNot100.digit, "0") +"" +mapFrameNumberNot100.col.toString().padStart(mapFrameNumberNot100.digit, "0");let extent = MapFrameUtils.calcMapFrameExtent(mapFrameNumber100,mapFrameNumberNot100,scale);return {code: code,extent: extent,row: mapFrameNumberNot100.row,col: mapFrameNumberNot100.col,};} else {return null;}};/*** 100万比例尺下的行号对应的代码*/static mateData100 = [{rowCode: "A",rowNumber: 1,},{rowCode: "B",rowNumber: 2,},{rowCode: "C",rowNumber: 3,},{rowCode: "D",rowNumber: 4,},{rowCode: "E",rowNumber: 5,},{rowCode: "F",rowNumber: 6,},{rowCode: "G",rowNumber: 7,},{rowCode: "H",rowNumber: 8,},{rowCode: "I",rowNumber: 9,},{rowCode: "J",rowNumber: 10,},{rowCode: "K",rowNumber: 11,},{rowCode: "L",rowNumber: 12,},{rowCode: "M",rowNumber: 13,},{rowCode: "N",rowNumber: 14,},{rowCode: "O",rowNumber: 15,},];/*** 非100万情况下,不同比例尺的原始数据*/static mateData = [{scale: 500000,label: "1:50万",lonD: 3,latD: 2,code: "B",digit: 3,},{scale: 250000,label: "1:25万",lonD: 1.5,latD: 1,code: "C",digit: 3,},{scale: 100000,label: "1:10万",lonD: 0.5,latD: 0.33333333,code: "D",digit: 3,},{scale: 50000,label: "1:5万",lonD: 0.25,latD: 0.16666667,code: "E",digit: 3,},{scale: 25000,label: "1:2.5万",lonD: 0.125,latD: 0.08333333,code: "F",digit: 3,},{scale: 10000,label: "1:1万",lonD: 0.0625,latD: 0.04166667,code: "G",digit: 3,},{scale: 5000,label: "1:5000",lonD: 0.03125,latD: 0.02083333,code: "H",digit: 3,},{scale: 2000,label: "1:2000",lonD: 0.01041667,latD: 0.006944444,code: "I",digit: 3,},{scale: 1000,label: "1:1000",lonD: 0.005208333,latD: 0.003472222,code: "J",digit: 4,},{scale: 500,label: "1:500",lonD: 0.002603889,latD: 0.001736111,code: "K",digit: 4,},];
}

5、测试结果

5.1 测试代码

MapFrameUtils.mateData.forEach((item) => {let mapFrame = MapFrameUtils.calcMapFrameNumber(item.scale, 114.5625, 39.375);console.log(item.scale, mapFrame);
});

5.2 测试结果

与标准中结果一致

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

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

相关文章

智慧校园究竟有何魅力?

随着科技的快速发展,智慧校园已成为教育领域的热门话题。智慧校园利用先进的技术手段,将信息化与教育深度融合,为学生、教师和家长提供更便捷、高效的教育服务。本文将带您深入了解智慧校园的魅力,让您对未来教育的发展充满期待。…

C++青少年简明教程:字符类型、字符数组和字符串

C青少年简明教程:字符类型、字符数组和字符串 在 C 语言中,处理文本数据的基础是字符类型 char,字符数组,以及标凌库中的字符串类 std::string。 C中的char类型占用 1 字节的内存空间,用于存储单个ASCII字符。例如&a…

【动手学深度学习】卷积神经网络CNN的研究详情

目录 🌊1. 研究目的 🌊2. 研究准备 🌊3. 研究内容 🌍3.1 卷积神经网络 🌍3.2 练习 🌊4. 研究体会 🌊1. 研究目的 特征提取和模式识别:CNN 在计算机视觉领域被广泛用于提取图像…

C++ : 模板初阶

标题:C : 模板初阶 水墨不写bug 正文开始: C语言的问题 : 写不完的swap函数 在学习C语言时,我们有一个经常使用的函数swap函数,它可以将两个对象的值交换。 我们通常这样实现它: void swap(int t1,int t2)…

景源畅信数字:抖音直播人气品类有哪些?

随着短视频平台的兴起,抖音成为了人们日常生活中不可或缺的娱乐方式之一。而抖音直播作为平台的重要组成部分,吸引了大量的观众和主播参与。那么,在抖音直播中,哪些品类能够吸引更多的人气,成为观众们关注的焦点呢?接…

vs2019 c++20 规范 STL库中关于时间的模板 ratio<T,U> , duration<T,U> , time_point<T,U>等

(探讨一)在学习线程的时候,一些函数会让线程等待或睡眠一段时间。函数形参是时间单位,那么在 c 中是如何记录和表示时间的呢?以下给出模板简图: (2 探讨二)接着给出对模板类 duration_values 的成员函数的测…

python字符串的进阶

在上一篇文章的 密码破解器 中,我们回顾了循环专题的知识点。 while 循环和 for 循环是 Python 中的两大循环语句,它们都可以实现循环的功能,但在具体使用时略有差别。当循环次数不确定时,我们选用 while 循环;当循环…

高并发短视频系统设计:架构、存储与性能优化全解

1. 系统概况与需求分析 1.1 短视频系统简介 当前短视频行业的快速发展,加上用户对高清、流畅观看体验的需求不断提升,对系统的并发处理能力、视频处理速度、存储效率等多方面都提出了极高的要求。那么,我们首先需要了解一个完整的短视频系统…

【C++】list的使用(上)

🔥个人主页: Forcible Bug Maker 🔥专栏: STL || C 目录 前言🌈关于list🔥默认成员函数构造函数(constructor)析构函数(destructor)赋值运算符重载 &#x1…

SOCKS 代理 和 HTTP 代理, WebSocket

SOCKS 代理 和 HTTP 代理 的区别 SOCKS 代理 和 HTTP 代理 都是代理服务器,它们充当客户端和目标服务器之间的中介,但它们的工作方式和应用场景有所不同。 1. SOCKS 代理: 工作原理: SOCKS 代理是一种更底层的代理,…

[沫忘录]MySQL InnoDB引擎

[沫忘录]MySQL InnoDB引擎 逻辑存储结构 InnoDB采用 “表、段,区, 页、行” 这样的层级结构进行存储。 **表空间(tablespace)**ibd文件,主要用于存储记录、索引等数据,一个mysql实例可有多个表空间,甚至能通过innodb…

2024年度CCF-阿里云瑶池科研基金正式发布

2024年度CCF-阿里云瑶池科研基金正式发布 截止时间:2024年7月1日24:00(北京时间) 欢迎CCF会员积极申报 “CCF-阿里云瑶池科研基金”由CCF与阿里云计算有限公司于2024年联合设立,专注于数据库领域,旨在为领域学者提供…

做自媒体素材哪里找?做自媒体必备的几个高质量素材网站分享

在自媒体的世界里,内容是王道。无论是视频还是文章,优秀的自媒体作品都需要有力的内容和高质量的素材作支撑。今天,我为大家整理了一些优质的素材网站,帮助每一位自媒体创作者,无论新手还是老手,都能找到适…

nginx平滑升级

#平滑升级 kill -USR2 <PID号> //查看nginx版本 [rootl1 logs]# nginx -v //查看nginx版本 nginx version: nginx/1.26.0 [rootl1 logs]# 安装一个1.25版本实验一下 [rootl2 ~]# cd /opt/ [rootl2 opt]# [rootl2 opt]# lsnginx-1.25.5.tar.gz nginx-1.26.0.tar.…

Stable Diffusion: Lora篇

前面提到&#xff0c;在提示词中可以使用LoRA并设置权重。LoRA是Low-Rank Adaptation的简写&#xff0c;直译为轻量级微调&#xff0c;是一种通用的AI大模型微调技术&#xff0c;通过LoRA使用可以对Stable Diffusion模型输出进行微调型&#xff0c;更加随心所欲地实现定制华输出…

数据结构--双向链表

目录 一.链表的分类 二.双向链表的结构 三.双向链表的实现 1.初始化 2.尾插与头插 3.尾删与头删 4.在指定位置之后插入数据 查找函数 5.删除指定节点 6&#xff0c;销毁链表 四.完整代码 List.h List.c 一.链表的分类 链表的结构⾮常多样&#xff0c;以下情况组合起…

单列集合--ArryList、LinkedList、Set

使用IDEA进入某个类之后&#xff0c;按ctrlF12,或者alt数字7&#xff0c;可查看该实现类的大纲。 package exercise;import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.function.Consumer;public class Demo3 {public static void…

ShowDoc item_id 未授权SQL注入漏洞复现

0x01 产品简介 ShowDoc 是一个开源的在线文档协作平台,它支持Markdown、图片等多种格式,方便团队成员共同编辑和分享文档。企业常见使用场景是使用其进行接口文档、内部知识库管理。 0x02 漏洞概述 2024年6月,ShowDoc官方发布新版本修复了一个SQL注入漏洞。鉴于该漏洞无前…

基于三元组一致性学习的单目内窥镜里程计估计

文章目录 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope摘要方法实验结果 TCL: Triplet Consistent Learning for Odometry Estimation of Monocular Endoscope 摘要 单目图像中深度和姿态的估计对于计算机辅助导航至关重要。由于很难获…

6. MySQL 查询、去重、别名

文章目录 【 1. 数据表查询 SELECT 】1.1 查询表中所有字段使用 * 查询表的所有字段列出表的所有字段 1.2 查询表中指定的字段 【 2. 去重 DISTINCT 】【 3. 设置别名 AS 】3.1 为表指定别名3.2 为字段指定别名 【 5. 限制查询结果的条数 LIMIT 】5.1 指定初始位置5.2 不指定初…