经纬度转北斗网格位置码(非极地区域,编码篇)
前言在 GPS 和北斗卫星导航系统的加持下经纬度已成为描述地球位置的标准方式。但在城市管理、物流配送、无人机路径规划等场景中直接使用经纬度存在数据量大、查询效率低等问题。北斗网格码将地球表面划分为多层网格为每个网格分配唯一编码从而实现高效的空间索引。例如经纬度 (116.312603°E, 39.993161°N) 可以编码为 N11J47539B8255346171短短 20 个字符就精确到了约 0.24 米。规范参考北斗网格位置码一、编码规则速览北斗二维网格码最多 20 个字符分为 11 段对应半球标识 1~10 级网格段位码元数说明编码方式第1段1半球N北/ S南第2段3第1级6°×4°列号01~60 行号A~V第3段2第2级30×30横竖编码十六进制第4段1第3级15×10Z字形编码 0~5第5段2第4级1×1横竖编码十六进制第6段2第5级4×4横竖编码十六进制第7段1第6级2×2Z字形编码 0~3第8~11段各2第7~10级横竖编码十六进制各级网格的步长和子网格数如下级别经度步长秒纬度步长秒子网格列×行121600 (6°)14400 (4°)60×44全球21800 (30)1800 (30)12×83900 (15)600 (10)2×3460 (1)60 (1)15×1054415×156222×270.250.258×881/321/328×891/2561/2568×8101/20481/20488×8核心编码思路所有级别的计算本质上都是同一件事在当前父网格内确定坐标落在哪个子网格中。坐标 → 减去父网格起点 → 除以当前级步长 → 取整得行列号 → 按规则编码为字符区别只在于编码方式第1级特殊全球统一编号列号 01~60行号 A~V第3、6级Z字形级子网格为 2×3 或 2×2用 Z 字形曲线编号单个数字 0~5 或 0~3其余级别横竖编码级列号和行号分别用十六进制字符表示二、逐级实现从理解到代码为了便于理解我们先用最直白的方式逐级实现后面再做统一优化。2.1 准备工作常量定义网格步长用两个常量数组存储private static final double[] LON_STEPS { 21600, 1800, 900, 60, 4, 2, 0.25, 1.0/32, 1.0/256, 1.0/2048 }; private static final double[] LAT_STEPS { 14400, 1800, 600, 60, 4, 2, 0.25, 1.0/32, 1.0/256, 1.0/2048 };2.2 第1级全球统一编号思路第1级覆盖全球经度从 -180° 到 180° 按 6° 分成 60 列编号 01~60纬度按 4° 分成 22 行编号 A~V。关键点西半球的列号从 30 往左递减东半球从 31 往右递增就像一面镜子← 西半球递减 | 东半球递增 → ┌───┬───┬───┬───┬───┬───┬───┬───┐ │28 │29 │30 │31 │32 │33 │34 │35 │... └───┴───┴───┴───┴───┴───┴───┴───┘ ↑ 本初子午线 ↑// 取绝对值统一当作正数计算 double absLon Math.abs(lon) * 3600; double absLat Math.abs(lat) * 3600; ​ // 第1级步长经度21600秒(6°)纬度14400秒(4°) int col (int)(absLon / 21600); int row (int)(absLat / 14400); ​ // 经度列号东半球从31递增西半球从30递减 int num lon 0 ? 30 - col : 30 col 1; ​ // 拼接半球符 两位列号 行号字母 // 例如N11J北半球第11列第J行2.3 第2级及以后在父网格内细分思路每一级都是在当前父网格内找出坐标属于哪个子网格。步骤算出父网格起点坐标上级起点 上级子网格偏移量用原始坐标减去父网格起点得到相对偏移除以当前级步长取整 → 行列号按编码规则转为字符追加到网格码以第2级为例30×3012×8 子网格横竖编码// 父网格第1级起点 double refLon col * 21600; // 第1级列号 × 第1级步长 double refLat row * 14400; ​ // 相对偏移 int subCol (int)((absLon - refLon) / 1800); // 0~11 int subRow (int)((absLat - refLat) / 1800); // 0~7 ​ // 横竖编码列号和行号分别用十六进制字符 // 例如col4, row7 → 472.4 Z字形编码第3、6级第3级将父网格分成 2×3 个子网格用 Z 字形曲线编号┌───┬───┐ │ 4 │ 5 │ ← row 2 ├───┼───┤ │ 2 │ 3 │ ← row 1 ├───┼───┤ │ 0 │ 1 │ ← row 0 └───┴───┘ col col 0 1编码值 zOrderMatrix[col][row]结果是一个 0~5 的单个数字。第6级类似但只有 2×2 4 个子网格编码 0~3。2.5 小结三种编码模式模式适用级别编码方式示例全球编号第1级列号01~60 行号A~VN11JZ字形第3、6级查Z序矩阵单个数字5横竖编码第2、4、5、7、8、9、10级列号行号十六进制B8三、完整实现理解了上面的规则后最自然的写法是每个级别写一个方法。但仔细观察会发现2~10 级的逻辑几乎一模一样只有步长和编码方式不同。所以我们可以用一个循环来处理所有级别/** * 将经纬度编码为北斗网格码 * * param lng 经度度 * param lat 纬度度 * param depth 编码级别1-10 * return 北斗网格编码 */ public String encode(double lon, double lat, int level) { // 参数校验 if (lon -180.0 || lon 180.0) throw new BeidouGridException(经度超出范围); if (lat -88.0 || lat 88.0) throw new BeidouGridException(纬度超出范围); if (level 1 || level 10) throw new BeidouGridException(编码级别超出范围); ​ StringBuilder buf new StringBuilder(20); buf.append(lat 0.0 ? N : S); ​ double absLon Math.abs(lon) * 3600; double absLat Math.abs(lat) * 3600; double refLon 0, refLat 0; ​ for (int lv 1; lv level; lv) { double cellW COL_STEP[lv]; double cellH ROW_STEP[lv]; int col (int)((absLon - refLon) / cellW); int row (int)((absLat - refLat) / cellH); refLon col * cellW; refLat row * cellH; ​ if (lv 1) { // 第1级全球统一编号 int num lon 0 ? 30 - col : 30 col 1; if (num 10) buf.append(0); buf.append(num).append((char)(A row)); } else if (ZIGZAG[lv]) { // Z字形级单数字编码 buf.append(col row * COL_NUM[lv]); } else { // 横竖编码级十六进制 buf.append(Integer.toHexString(col)) .append(Integer.toHexString(row)); } } return buf.toString().toUpperCase(); }常量定义// 各级经度步长秒索引 级别 private static final double[] COL_STEP { 0, 21600, 1800, 900, 60, 4, 2, 0.25, 1.0/32, 1.0/256, 1.0/2048 }; ​ // 各级纬度步长秒 private static final double[] ROW_STEP { 0, 14400, 1800, 600, 60, 4, 2, 0.25, 1.0/32, 1.0/256, 1.0/2048 }; ​ // 各级子网格列数 private static final int[] COL_NUM { 0, 60, 12, 2, 15, 15, 2, 8, 8, 8, 8 }; ​ // 是否使用Z字形编码 private static final boolean[] ZIGZAG { false, false, false, true, false, false, true, false, false, false, false };异常类定义public class BeidouGridException extends RuntimeException{ private static final long serialVersionUID 1L; public BeidouGridException() { } public BeidouGridException(String message) { super(message); } public BeidouGridException(String message, Throwable cause) { super(message, cause); } public BeidouGridException(Throwable cause) { super(cause); } public BeidouGridException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); } }

相关新闻

HT200铸件工艺设计3大误区:基于左支座实例的CAD/CAM协同分析

HT200铸件工艺设计3大误区:基于左支座实例的CAD/CAM协同分析

HT200铸件工艺设计的3大数字化协同陷阱:从CAD到CAM的实战避坑指南在机械制造领域,HT200铸铁件的加工工艺设计正经历着从传统经验驱动向数字化协同的范式转变。左支座这类典型铸铁零件的加工质量,往往在CAD模型阶段就已埋下伏笔。本文将通过三…

2026/7/8 1:51:19 阅读更多 →
论文 Review 3DGS LetsGo | SIGGRAPH Asia 2024 | LiDAR-Assisted 3D Gaussian Splatting 大规模车库建模与渲染

论文 Review 3DGS LetsGo | SIGGRAPH Asia 2024 | LiDAR-Assisted 3D Gaussian Splatting 大规模车库建模与渲染

基本信息 题目: LetsGo: Large-Scale Garage Modeling and Rendering via LiDAR-Assisted Gaussian Primitives 作者: Jiadi Cui, Junming Cao, Fuqiang Zhao, Zhipeng He, Yifan Chen, Yuhui Zhong, Lan Xu, Yujiao Shi, Yingliang Zhang, Jingyi Yu 会…

2026/7/8 1:49:18 阅读更多 →
我发现了一个宝藏 AI 充值订阅入口:RechargeAi 订阅助手使用教程

我发现了一个宝藏 AI 充值订阅入口:RechargeAi 订阅助手使用教程

最近很多人都在用各种 AI 工具,但真正麻烦的地方往往不是“怎么用 AI”,而是“怎么开通、怎么续费、怎么充值”。有些平台流程复杂,有些支付方式不方便,还有些订阅到期后续费也比较折腾。 我最近发现了一个比较方便的入口&#x…

2026/7/8 1:47:18 阅读更多 →

最新新闻

Kaggle M5 竞赛 Top3 方案解析:LightGBM 与 N-BEATS 的 6 模型融合策略

Kaggle M5 竞赛 Top3 方案解析:LightGBM 与 N-BEATS 的 6 模型融合策略

Kaggle M5 竞赛 Top3 方案解析:LightGBM 与 N-BEATS 的 6 模型融合策略 在时间序列预测领域,Kaggle M5竞赛无疑是一座难以逾越的高峰。这场由沃尔玛发起的销量预测挑战,不仅吸引了全球顶尖数据科学团队的参与,更催生了一系列创新性…

2026/7/8 2:39:29 阅读更多 →
Qwen3.5 DPO 模型对齐实战(pytrio训练版)

Qwen3.5 DPO 模型对齐实战(pytrio训练版)

Qwen3.5 DPO 模型对齐实战(pytrio训练版) 以 Qwen3.5 作为基座模型,根据人类对模型回答偏好的预期做 DPO(直接偏好优化),是学习模型对齐的入门任务。 在本文中,我们会使用 Qwen3.5-4B 模型在 A…

2026/7/8 2:39:29 阅读更多 →
AI漫剧分镜提示词之都市奇幻漫剧

AI漫剧分镜提示词之都市奇幻漫剧

适配:奇幻/冒险/都市向 核心场景:现代都市 补充适配:可替换场景(城市scape/城市scape/城市scape),替换风格后缀(城市scape/城市scape/城市scape) 负面提示词:低分辨率,颜色暗淡,线条杂乱,噪点,背景模糊 开篇分镜 都市奇幻漫剧,横向分镜布局,繁华都市街头,霓虹灯…

2026/7/8 2:37:28 阅读更多 →
DFT扫描链设计与优化策略:构建高效可测试性电路架构

DFT扫描链设计与优化策略:构建高效可测试性电路架构

DFT扫描链设计与优化策略:构建高效可测试性电路架构 概述 随着集成电路工艺节点不断缩小,芯片的复杂度呈指数级增长,传统的外部测试方法已经难以满足现代芯片的测试需求。可测试性设计(Design for Testability, DFT)技…

2026/7/8 2:37:28 阅读更多 →
深演智能黄晓南出席 The MarTech Summit Hong Kong:布局全球化,把中国的企业AI实践带向世界

深演智能黄晓南出席 The MarTech Summit Hong Kong:布局全球化,把中国的企业AI实践带向世界

7 月 7 日,The MarTech Summit Hong Kong 在香港举行。深演智能创始人兼 CEO 黄晓南受邀担任 “Gen AI & Marketing Automation: Transforming Content Creation and Customer Engagement” 圆桌讨论的主导嘉宾,与来自金融、消费品、零售、MarTech 等…

2026/7/8 2:33:28 阅读更多 →
2026 年智慧校园系统能帮学校做什么?这十个功能挺实用

2026 年智慧校园系统能帮学校做什么?这十个功能挺实用

✅作者简介:合肥自友科技 📌核心产品:智慧校园平台(包括教工管理、学工管理、教务管理、考务管理、后勤管理、德育管理、资产管理、公寓管理、实习管理、就业管理、离校管理、科研平台、档案管理、学生平台等26个子平台) 。公司所有人员均有多…

2026/7/8 2:33:28 阅读更多 →

日新闻

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破

3大核心能力重塑《明日方舟》游戏体验:MAA自动化助手的革命性突破 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: …

2026/7/8 0:00:48 阅读更多 →
MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N+1 到批处理的全路径

MyBatis 批量操作深度优化——从 N1 到批处理的全路径 一、从"功能正确"到"性能可接受"——MyBatis 批量操作的三段式进化 MyBatis 在日常增删改查场景中几乎是无感的——实体映射直观、SQL 控制灵活。但当数据量从千级上升到十万级、百万级,许…

2026/7/8 0:00:48 阅读更多 →
工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

工业负载控制方案:TPD2015FN与PIC18F45K22应用解析

1. 工业负载控制方案概述在工业自动化、电机驱动和照明控制等高需求场景中,可靠地控制电感和电阻负载是核心挑战之一。TPD2015FN作为东芝的8通道高端智能功率开关IC,配合PIC18F45K22微控制器,能够构建一套稳定、高效的负载控制系统。这套组合…

2026/7/8 0:02:48 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/7 14:24:45 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/7 12:34:47 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/7 15:59:06 阅读更多 →

月新闻