基于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

相关推荐
宇寒风暖2 小时前
侯捷 C++ 课程学习笔记:内存管理与工具应用
c++·笔记·学习
云缘若仙2 小时前
directx12 3d+vs2022游戏开发第六章 笔记十一
笔记·directx12 3d
电棍2332 小时前
在wsl环境中配置和开发verilog(一种比较新颖的verilog开发指南)
笔记
非 白3 小时前
【Java】单例模式
java·笔记·单例模式
明阳mark4 小时前
Ansible 学习笔记
笔记·学习·ansible
StickToForever5 小时前
第4章 信息系统架构(六)
经验分享·笔记·学习·职场和发展
东方芷兰9 小时前
伯克利 CS61A 课堂笔记 11 —— Mutability
笔记·python
快下雨了L15 小时前
C++面试笔记(持续更新...)
笔记
柃歌16 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法
JANGHIGH16 小时前
c++ std::list使用笔记
c++·笔记·list