我国基本比例尺地形图的分幅编号,有新旧两种。均是在国际规定的1:100万地形图基础上,按经纬度进行分幅和编号的。

1 旧图幅

1:100万地图的分幅编号:每幅1:100万地图纬差4°经差6°。从地球赤道起,向两极每纬度4°为一行,依次以字母A,B,C,…,V表示;从西经180°起,向东每6°为一列,依次以数字l,2,3,…,60表示。每幅图的编号由该图幅所在的行号(字符码)和列号(数字码)组成,列号在前,行号在后,二者之间划一短线。如北京在1:100万图上处于第J列第50行,故编号为J-50。

20210825221624903

1:50万、1:20万、1:10万地形图分幅编号(旧图幅号没有1:25万):在1:100万图幅基础上,按一定经差和纬差进行划分,并分别在1:100万图幅后加上各自的代号。

1:50万:1:100万地形图一分为四,用A、B、C、D表示,即经差3°,纬差2°

北京某地:北纬39º54’30”, 东经116º28’25”。1:50万图幅编号:J-50-A

20210825221624918

1:20万:一幅1:100万地形图分为36幅,用[1]……[36]表示,即经差1°,纬差40′
北京某地:北纬39º54’30”, 东经116º28’25”。1:20万图幅编号:J-50-[3]

20210825221624933

1:10万:一幅1:100万地形图分为144幅,用1,2,……,144表示,即经差30′,纬差20′

北京某地:北纬39º54’30”, 东经116º28’25”。1:10万图幅编号:J-50-5

20210825221624949

1:5万、1:2.5万、1:1万地形图分幅编号:在1:10万图幅基础上,按一定经差和纬差进行划分,并分别在1:10万图幅后加上各自的代号。

1:5万:一幅1:10万地形图分为4幅,用A,B,C,D表示,即经差15′,纬差10′

北京某地:北纬39º54’30”, 东经116º28’25”。1:5万图幅编号:J-50-5-B

20210825221624965

1:2.5万:一幅1:5万地形图分为4幅,用1,2,3,4表示,经差7′30″,纬差5′。图幅编号:在1:5万编号后加上自己的序号。

北京某地:北纬39º54’30”, 东经116º28’25”。1:2.5万图幅编号:J-50-5-B-4

20210825221624996

1:1万:一幅1:10万地形图分为8行、8列共64幅图,用(1),……,(64)表示,经差3′45″,纬差2′30″。图幅编号:在1:10万编号后加上各自的代号。
北京某地:北纬39º54’30”, 东经116º28’25”。1:1万图幅编号:J-50-5-(24)

20210825221625012

1:5000比例尺地形图:在1:1万的基础上进行,一幅1:1万地形图分为4幅,用a,b,c,d表示,经差1′52.5″,纬差1′15″。图幅编号:在1:1万编号后加上各自的代号。
北京某地:北纬39º54’30”, 东经116º28’25”。1:5000图幅编号:J-50-5-(24)-b

20210825221625027

2 新图幅

1991年制订了新的《国家基本比例尺地形图分幅和编号》(GB/T 13989-92 )的国家标准,并给出了不同标准比例尺地形图的编给规范及图式。新测和更新的地图,照此标准进行分幅和编号。

我国基本比例尺的地形图包括1:5000、1:1万、1:2.5万、1:5万、1:10万、1:25万、1:50万、1:100万共8种不同比例尺。基本比例尺地图以1:100万地图为基础,按规定的经差和纬差采用逐次加密划分方法划分图幅。不同比例尺的图幅将1:100万的图幅划分成若干行和列,使相邻比例尺地图的经纬差、行列数和图幅数成简单的倍数。(注:1:20万图幅不是基本比例尺图幅)
1:100万地形图的分幅仍按国际标准进行。每幅1:100万地图的编号由该图幅所在的行号(字符码)和列号(数字码)组成,如北京所在的1:100万地图的图幅编号为J50。

20210825221625043

1:50万-1:5000地图的编号以1:100万地图编号为基础,按行列编号方法,即将1:100万地形图按所含各比例尺地形图的经差和纬差划分成若干行和列,横行从上到下、纵列从左到右按顺序分别用阿拉伯数字(数字码)编号,这样便于计算机运算处理。表示图幅编号的行、列代码均采用3位数字表示,不足3位时前面补0,取行号在前、列号在后的排列形式标记,加在1:100万图幅的图号之后。每幅图的编号是由该图幅所在的1:100万地图编号、比例尺代码以及各自图幅所在的行号和列号的数字码组成。

例如,北京某地:北纬39º54’30”, 东经116º28’25”。1:5万的图幅号为J50E001010。其中第1位字母“J”是1:100万图幅行号,第2、3位数字“50”是1:100万图幅的列号,第4位字母“E”是1:5万的比例尺的代号,第5、6、7位“001”是行号,第8、9、10位“010”为列号。

20210825221625058

各比例尺国幅号关系如下:

20210825221625074

新图幅号的计算也相对简单。
下列以北京某地(坐标:北纬39º54’30”, 东经116º28’25”。)为例 ,简单的介绍计算过程如下:

计算1:100万图幅的行号和列号

1:100行号 = [纬度/4] +1    []表示取模,1为A,2为B……

1:100列号 = [经度/6]+31    []表示取模

例:坐标:北纬39º54’30”, 东经116º28’25”

1:100行号=[39º54’30”/4º]+1=9+1=10=J

1:100列号 = [116º28’25”/6º]+31 =19+31=50

根据计算图幅的比例,查出比例尺代号

以1:5万为列,比例尺代码为“E”

根据比例尺记算图幅行号和列号。

根据比例尺,查经差和纬差(见上文新图幅号各分幅号关系表)。

1:5万图幅,经差为:15’,纬差为:10’

计算公式:

行号 = 4º/纬差 - [(纬度/4º)/纬差]    []为取整,()为取余

列号 = [(经度/4º)/经差]+1       []为取整,()为取余

例:

行号 = 4º/10’ - [(39º54’30”/4º)/10’]=24-[3º54’30”/10’]=24-23=1

列号 = [(116º28’25”/6º)/15’]+1 =[2º28’25”/15’]+1=9+1=10

2 代码实现经纬度与新图幅编号转换

SheetDesignationUtils类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
using System;
using System.Linq;

namespace SheetDesignationUtils
{
/// <summary>
/// 坐标图幅号转换类
/// </summary>
public class CoordToSheetNo
{
private static char[] LatCharArray = {'A','B','C','D','E','F','G','H','I','J','K'
,'L','M','N','O','P','Q','R','S','T','U','V'};
private static char[] ScaleCharArray = {'A','B','C','R','D','E','F','G','H'};
private static double[] LatDArray = { 14400, 7200, 3600, 2400, 1200, 600, 300, 150, 75 };
private static double[] LonDArray = { 21600, 10800, 5400, 3600, 1800, 900, 450, 225, 112.5 };

/// <summary>
/// 获取图幅编号
/// </summary>
/// <param name="lon">经度/秒</param>
/// <param name="lat">纬度/秒</param>
/// <param name="scale">比例尺</param>
/// <returns>图幅号</returns>
public static string GetSheetNo(int lon, int lat, SheetScale scale)
{
//*|*|**|*|***|***
if (lat < -(88 * 60 * 60) || lat > (88 * 60 * 60))
throw new Exception("纬度不正确,请检查!");
if (lon < 0 || lon > (180 * 60 * 60))
throw new Exception("经度不正确,请检查!");
string numString = "";
numString += GetMillionRowID(lat, scale);
numString += GetMillionColumnID(lon);
if (scale == SheetScale._1000000)
return numString;
numString += GetScaleID(scale);
numString += GetRowID(lat, scale);
numString += GetColumnID(lon, scale);
return numString;
}

public static char GetMillionRowID(int lat, SheetScale scale)
{
int scaleIndex = Convert.ToInt32(scale);
int a = lat / (4 * 3600);
return LatCharArray[a];
}

public static int GetMillionColumnID(int lon)
{
int b = lon / (6 * 3600) + 31;
return b;
}

public static char GetScaleID(SheetScale scale)
{
int scaleIndex = Convert.ToInt32(scale);
char scaleId = ScaleCharArray[scaleIndex];
return scaleId;
}

public static string GetRowID(int lat, SheetScale scale)
{
int scaleIndex = Convert.ToInt32(scale);
int c = Convert.ToInt32(4 * 3600 / LatDArray[scaleIndex]) -
Convert.ToInt32((lat % (4 * 3600)) / LatDArray[scaleIndex]);
return c.ToString().PadRight(3,'0');
}

public static string GetColumnID(int lon, SheetScale scale)
{
int scaleIndex = Convert.ToInt32(scale);
int d = Convert.ToInt32((lon % (6 * 3600)) / LonDArray[scaleIndex]) + 1;
return d.ToString().PadRight(3, '0');
}

/// <summary>
/// 根据图幅号获取经纬度范围(北半球)
/// </summary>
/// <param name="frmNo">图幅号</param>
/// <returns>图幅范围</returns>
/// <exception cref="Exception">图幅号错误异常</exception>
public static SheetArea GetSheetArea(string frmNo)
{
if (frmNo.Length != 10)
throw new Exception("图幅号错误,请输入标准十位图幅编号!");
int latMillionNum, lonMillionNum, latNum, lonNum, scaleNum;
char latMillionChar, scaleChar;

latMillionChar = char.Parse(frmNo.Substring(0, 1));
latMillionNum = LatCharArray.ToList().IndexOf(latMillionChar);
if (latMillionNum == -1)
throw new Exception("图幅号错误,请检查百万比例尺纬度号!");

scaleChar = char.Parse(frmNo.Substring(3, 1));
scaleNum = ScaleCharArray.ToList().IndexOf(scaleChar);
if (scaleNum == -1)
throw new Exception("图符号错误,请检查比例尺代号!");

if (!int.TryParse(frmNo.Substring(1, 2), out lonMillionNum))
throw new Exception("图幅号错误,请检查百万比例尺经度号!");
if (!int.TryParse(frmNo.Substring(4, 3), out latNum))
throw new Exception("图幅号错误,请检查纬度号!");
if (!int.TryParse(frmNo.Substring(7, 3), out lonNum))
throw new Exception("图幅号错误,请检查经度号!");
SheetArea sheetArea = new SheetArea();
sheetArea.LatMin = latMillionNum * 4 * 3600 + (4 * 3600 / LatDArray[scaleNum] - latNum) * LatDArray[scaleNum];
sheetArea.LatMax = sheetArea.LatMin + LatDArray[scaleNum];

sheetArea.LonMax = (lonMillionNum - 30 - 1) * 6 * 3600 + lonNum * LonDArray[scaleNum];
sheetArea.LonMin = sheetArea.LonMax - LonDArray[scaleNum];
return sheetArea;
}

/// <summary>
/// 根据经度获取6度分带
/// </summary>
/// <param name="centerLongitude"></param>
/// <returns>2000国家大地坐标系6度分带带号名</returns>
public static string GetChinaGeodeticCoordinateSystem2000_6DegreesZone(double centerLongitude)
{
centerLongitude = centerLongitude / 3600;
string SpatialRefName = "高斯大地坐标系_中国2000_";
int ZoneNum = Convert.ToInt32(Math.Round((centerLongitude + 3) / 6,0));
SpatialRefName += ZoneNum + "带6_北";
return SpatialRefName;
}
}
}

SheetArea类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class SheetArea
{
public double LonMin { get; set; }
public double LatMin { get; set; }
public double LonMax { get; set; }
public double LatMax { get; set; }
public SheetArea() { }
public SheetArea(double lonMin, double latMin, double lonMax, double latMax)
{
LonMin = lonMin;
LatMin = latMin;
LonMax = lonMax;
LatMax = latMax;
}
}

LonLatException类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class LonLatException : Exception
{
public string error;
private Exception exception;
public LonLatException() { }
public LonLatException(string msg) : base(msg)
{
this.error = msg;
}
public LonLatException(string msg, Exception exception) : base(msg, exception)
{
this.exception = exception;
error = msg;
}
public string GetError()
{
return error;
}
}

Scale枚举

1
2
3
4
5
6
7
8
9
10
11
12
public enum Scale : int
{
_1000000 = 0,
_500000=1,
_250000=2,
_200000=3,
_100000=4,
_50000=5,
_25000=6,
_10000=7,
_5000=8
}

参考资料:

https://wenku.baidu.com/view/c26dccebf524ccbff12184c6.html?from=search
earch