基于arcpro3.0.2的北斗网格生成简介
采用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
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