基于arcpro3.0.2的北斗网格生成简介

基于arcpro3.0.2的北斗网格生成简介

bash 复制代码
采用2000坐标系、可基于行政区范围
软件可生成第一级到第十级北斗网格
              经纬跨度                  等分         约赤道处距离
第一级 6X4度                      60 和A~V         660      km
第二级 30X30分                    12X8             55.66    km
第三级 15X10分                    2X3              27.83    km
第四级 1X1分                      15X10            1.85      km
第五级 4X4秒                      15X15            123.69  m
第六级 2X2秒                      2X2              61.84    m
第七级 1/4 X 1/4秒                8X8              7.73      m
第八级 1/32 X 1/32秒              8X8              0.97     m
第九级 1/256 X 1/256秒            8X8              12.0     cm
第十级 1/2048 X 1/2048秒          8X8              1.5       cm
csharp 复制代码
public static string GetNewBDBM(double B, double L, int Level)
{
    List<string> code = new List<string>();
    double pre_a = 0;   //上一级行号
    double pre_b = 0;   //上一级列号
    double pre_Q = 0;    //上一级确定角点纬度值
    double pre_Y = 0;    //上一级确定角点经度值
    double pre_dB = 0;   //上一级经差
    double pre_dL = 0;   //上一级纬差
    //本级变量
    double dB = 0, dL = 0;
    int a = 0, b = 0;
    double Q = 0, Y = 0;
    //BL点 转为度
    for (int i = 1; i <= Level; i++)
    {
        if (i == 1)
        {   //第一层  1:100万                    
            GetDetaB_detaL(i, ref dB, ref dL);  //获取本级经纬差值
            //                  
            string bit_1 = "N";   //我国位于北半球=N,   南半球=S
            if (B >= 0)
            {   //B=y
                bit_1 = "N";
            }
            else
            {
                bit_1 = "S";
            }
            //
            a = getInt(Math.Floor(Math.Abs(B) / dB)) + 1;    //商取整【B/4】+1                    
            b = getInt(Math.Floor(L / dL)) + 31;             //商取整【L/6】+31  
            //修正b值
            b = Math.Abs(b); 
            if (b<0) b = 1;
            if (b > 59) b = 60;
            //修正a值
            if (a > 22) a = 22;
            //
            string bit_23 = b.ToString().PadLeft(2, '0');    //补足2位01-60
            string bit_4 = Get100W_WeiD_bit_1(Math.Abs(a).ToString());
            //生成北斗码
            code.Add(bit_1 + bit_23 + bit_4);    //N45A
            //==记录历史行列号和确定角点经纬度坐标值
            pre_a = a;
            pre_b = b;
            pre_Q = 0;   //全球赤道0度点
            pre_Y = 0;   //全球赤道0度点
            pre_dB = dB;
            pre_dL = dL;
            //==
        }
        else if (i == 2)
        {
            GetDetaB_detaL(i, ref dB, ref dL);  //获取本级经纬差值

            //获取上一级网格层的确定角点经纬度坐标值
            Q = pre_Q + (pre_b - 31) * pre_dL;
            Y = pre_Y + (pre_a - 1) * pre_dB;
            //获取此点在本级网格层的行列号                  
            a = getInt((L - Q) / dL) + 1;
            b = getInt((B - Y) / dB) + 1;
            //生成北斗码
            code.Add(fixRowColNum15(a - 1));
            code.Add(fixRowColNum15(b - 1));
            //==记录历史行列号和确定角点经纬度坐标值
            pre_a = a;
            pre_b = b;
            pre_Q = Q;   //全球赤道0度点
            pre_Y = Y;   //全球赤道0度点
            pre_dB = dB;
            pre_dL = dL;
            //==
        }
        else if (i == 3)
        {
            GetDetaB_detaL(i, ref dB, ref dL);  //获取本级经纬差值

            //获取上一级网格层的确定角点经纬度坐标值
            Q = pre_Q + (pre_a - 1) * pre_dL;
            Y = pre_Y + (pre_b - 1) * pre_dB;
            //获取此点在本级网格层的行列号                  
            a = getInt((L - Q) / dL) + 1;
            b = getInt((B - Y) / dB) + 1;
            //生成北斗码  (Z序列)
            //code.Add(fixRowColNum15(a - 1));
            //code.Add(fixRowColNum15(b - 1));
            code.Add(fixRowColZorder(a, b));
            //==记录历史行列号和确定角点经纬度坐标值
            pre_a = a;
            pre_b = b;
            pre_Q = Q;   //全球赤道0度点
            pre_Y = Y;   //全球赤道0度点
            pre_dB = dB;
            pre_dL = dL;
            //==
        }
        else if (i >= 4 && i <= 5)
        {
            GetDetaB_detaL(i, ref dB, ref dL);  //获取本级经纬差值

            //获取上一级网格层的确定角点经纬度坐标值
            Q = pre_Q + (pre_a - 1) * pre_dL;
            Y = pre_Y + (pre_b - 1) * pre_dB;
            //获取此点在本级网格层的行列号                  
            a = getInt((L - Q) / dL) + 1;
            b = getInt((B - Y) / dB) + 1;
            //生成北斗码
            code.Add(fixRowColNum15(a - 1));
            code.Add(fixRowColNum15(b - 1));
            //==记录历史行列号和确定角点经纬度坐标值
            pre_a = a;
            pre_b = b;
            pre_Q = Q;   //全球赤道0度点
            pre_Y = Y;   //全球赤道0度点
            pre_dB = dB;
            pre_dL = dL;
            //==
        }
        else if (i == 6)
        {
            GetDetaB_detaL(i, ref dB, ref dL);  //获取本级经纬差值

            //获取上一级网格层的确定角点经纬度坐标值
            Q = pre_Q + (pre_a - 1) * pre_dL;
            Y = pre_Y + (pre_b - 1) * pre_dB;
            //获取此点在本级网格层的行列号                  
            a = getInt((L - Q) / dL) + 1;
            b = getInt((B - Y) / dB) + 1;
            //生成北斗码  (Z序列)
            //code.Add(fixRowColNum15(a - 1));
            //code.Add(fixRowColNum15(b - 1));
            code.Add(fixRowColZorder(a, b));
            //==记录历史行列号和确定角点经纬度坐标值
            pre_a = a;
            pre_b = b;
            pre_Q = Q;   //全球赤道0度点
            pre_Y = Y;   //全球赤道0度点
            pre_dB = dB;
            pre_dL = dL;
            //==
        }
        else if (i >= 7 && i <= 10)
        {
            GetDetaB_detaL(i, ref dB, ref dL);  //获取本级经纬差值

            //获取上一级网格层的确定角点经纬度坐标值
            Q = pre_Q + (pre_a - 1) * pre_dL;
            Y = pre_Y + (pre_b - 1) * pre_dB;
            //获取此点在本级网格层的行列号                  
            a = getInt((L - Q) / dL) + 1;
            b = getInt((B - Y) / dB) + 1;
            //生成北斗码
            code.Add(fixRowColNum15(a - 1));
            code.Add(fixRowColNum15(b - 1));
            //==记录历史行列号和确定角点经纬度坐标值
            pre_a = a;
            pre_b = b;
            pre_Q = Q;   //全球赤道0度点
            pre_Y = Y;   //全球赤道0度点
            pre_dB = dB;
            pre_dL = dL;
            //==
        }
    }
    string buf = "";
    for (int i = 0; i < code.Count; i++)
    {
        buf += code[i];
    }
    return buf;
}

本blog地址:https://blog.csdn.net/hsg77

相关推荐
largecode7 小时前
打电话时,怎么让号码显示自己的品牌名称?办理号码认证服务流程
笔记·百度·微信·课程设计·微信公众平台·facebook·新浪微博
米罗篮8 小时前
DSU并查集 & 拓展欧几里得-逆元
c++·经验分享·笔记·算法·青少年编程
噜噜噜阿鲁~8 小时前
python学习笔记 | 10.0、面向对象编程
笔记·python·学习
hssfscv9 小时前
软件设计师下午题训练1-3题+2019上上午题错题解析 练习真题训练13
笔记·设计模式·uml
哆哆啦0010 小时前
使用 Obsidian + GitHub Actions + GitHub Pages 搭建内容发布流
数据库·笔记·github·obsidian
xuhaoyu_cpp_java12 小时前
SpringMVC学习(五)
java·开发语言·经验分享·笔记·学习·spring
中屹指纹浏览器12 小时前
2026平台集群式风控溯源体系研究与浏览器环境适配应对方案
经验分享·笔记
敲代码的嘎仔13 小时前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
星恒随风14 小时前
四天学完前端基础三件套(JavaScript篇)
开发语言·前端·javascript·笔记
羊群智妍14 小时前
2026 免费GEO监测:AI搜索优化实用工具推荐
笔记