APP下载

基于C#的国家基本比例尺地形图分幅与新旧编号查询实现

2013-08-13张宏宇曲苑婷杨金玲曹先革

黑龙江工程学院学报 2013年2期
关键词:图幅行列数组

张宏宇,曲苑婷,杨金玲,曹先革

(1.黑龙江工程学院 测绘工程学院,黑龙江 哈尔滨150050;2.东北林业大学 林学院,黑龙江 哈尔滨150040)

我国幅员辽阔,以至产生的各种比例尺地形图数量非常大。为了便于测绘、拼接、管理,防止漏测、重测,将地形按一定的面积、大小进行划分,统一编号十分有必要。同时地形图的图幅编码有新旧两种规则,在生产工作中,存在着新旧图幅转换的问题,故开发一个能自动进行新旧图幅编号转换的程序就有了需求。国家基本比例尺地形图系列包括1∶100万、1∶50万、1∶25万、1∶10万、1∶5万、1∶2.5万、1∶1万、1∶5 000。本文利用.net体系下的C#语言实现了在不同比例尺下地图新旧编码的查询[1-2]。

1 分幅及新旧编号规则

地图分幅有按经纬线的梯形分幅和按平面直角坐标网格线的矩形分幅两种[3]。本文采用梯形分幅。

新旧图幅编码中1∶100万地形图的分幅和编号相同,采用国际分幅标准。经差6°、纬差4°。但在纬度60°~76°之间为经差12°、纬差4°;纬度76°~88°之间为经差24°、纬差4°,纬度为88°以上单独为1幅来划分。从地球的赤道起算,分别向南北极每4°为一行,至88°共22行,依次以A,B…V编号。从180°经线起,自西向东,每6°为一列,共60列。依次以1,2…60编号[4-5]。

1)新图幅编码。其余比例尺地形图以百万图为基础,按各自经差、纬差分幅,行从上到下,列从左到右依次以阿拉伯数字编码,表示行列号。编码位数为三位,不足三位前面补0。形成编码方式为:在1∶100万图幅编号之后接代表各比例尺的代码B~H,再接其行列号,例如:H-51-G-078-024。

2)旧图幅编码。1∶50万地形图将1:100万图分为2行2列,共4幅,分别以A~D以自然顺序编码,例如H-51-A。1∶25万图将百万图分为4行4列,共16幅,以1~16编码,例如 H-51-16。1∶10万图将百万图分为12行12列,共144幅,以1~144编码,例如H-51-134。1∶5万和1∶1万图是在1∶10万图基础上,分别分1∶10万图为2行2列,共4幅,和8行8列,共64幅。分别以A~D、1~64编码,例如 H-51-136-A、H-51-136-23。1∶2.5万图将1∶5万图分为2行2列,分别以1~4编码,例如H-51-136-A-2。1∶5 000图分1∶1万图为2行2列,以a~d编码,例如 H-51-136-23-a。

2 设计思路

本程序可完成两个功能:1)根据已知图幅编号(包括新图幅编号和旧图幅编号)查询图幅范围。2)根据已知点经纬坐标,确定已知点在不同国家标准比例尺下所属图幅的新旧图幅编号。

首先对新旧编码的编码规则比较,发现新编码更易于编程实现。通过总结编码规则,发现旧编码和新编码之间存在转换关系。故将旧编码转换为新编码统一运算。

对于功能1),需要确定地图边界。而地图边界的确定只需确定边界最大和最小经纬度值即可。新编码的编码形式为× × × × ×,前两位为百万图幅行列编号,第三位为比例尺,后两位为在相应比例尺中的行列编号。故首先对百万图幅按分幅规则进行划分,利用一个22行60列二维数组存放其边界最大和最小经纬度,以数组下标表示行列编码,即新图幅编码中前两位。对于其他比例尺地形图,再利用一个二维数组,依据相应的分幅规则对百万图进行划分,同样以数组下标表示行列编码即旧图幅编码的后两位。在使用功能1)时,只需根据新编码第三位确定比例尺大小,依据相应规则划分由新编码前两位所确定的百万图数组,再根据最后两位的值取相应的数组中存储的经纬值即得到该编码所代表地图的范围。

对于功能2),先划分百万图,通过与数组内存储的最大最小经纬值比较,确定所属百万数组,根据数组下标即得所属百万图行列编号。再依照所欲查询的比例尺对百万图幅进行划分,做相同比较,确定相应比例尺的行列号,得到新图幅编码[6]。

3 程序实现及核心算法

1)运行界面如图1、图2所示。

2)将新图幅编码转换为旧图幅编码算法。通过对新旧编码的编号规则的比对,可以发现新旧编码之间存在以下函数关系:

(%表示取余ceil()表示向上取整)

新编码为:× ×k i j

旧编码为:× ×x

1∶50万:

x=2* (i-1)+j

(例:新编码为J50B002002,旧编码为J50D即i=2 j=2代入得x=4对应旧编码格式4即为D)

1∶25万:

x=4* (i-1)+j

(例:新编码为J50C004004,旧编码为J50016即i=4 j=4代入得x=16)

1∶10万:

x=12* (i-1)+j

(例:新编码为J50D012012,旧编码为J50144即i=12 j=12代入得x=144)

旧编码为:× ×x y

1∶5万:

x =12* (ceil(i/2)-1)+ceil(j/2)

y=2*((i-1)%2)+ (j-1)%2+1

(例:新编码为J50E024024,旧编码为J50144D即i=24 j=24代入得x=144 y=4对应旧编码格式4即为D)

1∶1万:

x =12* (ceil(i/8)-1)+ceil(j/8)

y=8*((i-1)%8)+ (j-1)%8+1

(例:新编码为J50G096096,旧编码为J50144064即i=96 j=96代入得x=144 y=64)

旧编码为:× ×x y z

1∶2.5万:

x =12* (ceil(i/4)-1)+ceil(j/4)

y =2*((ceil(i/2)-1)%2)+((ceil(j/2)-1)%2)+1

z=2*((i-1)%2)+ ((j-1)%2)+1

(例:新编码为J50F048048,旧编码为J50144D004即i=48 j=48代入得x=144 y=4对应旧编码格式4即为Dz=4)

3)图幅划分。按照新编码规则,首先划分百万图幅,代码如下:

k= MapCode.code_3-65;

for(i=0;i<22;i++)

for(j=0;j<60;j++)

MapRangeValue mapRangeValue=new MapRangeValue();

mapRangeValue.rangeValue[0]= 180-6*j;

mapRangeValue.rangeValue[1]= 174-6*j;

mapRangeValue.rangeValue[2]=4+4*i;

mapRangeValue.rangeValue[3]=0+4*i;

million[i,j]= mapRangeValue;

4)根据不同比例尺,按以下方法划分图幅。①划分1:50万、1:25万比例尺图幅:

millionBase= million[MapCode.code_1 - 65,MapCode.code_2-1];

for(i=0;i< (2*k);i++)

for(j=0;j< (2*k);j++)

MapRangeValue mapRangeValue=new MapRangeValue();

mapRangeValue.rangeValue[1]= million-Base.rangeValue[1]+ (6.0/(2*k))*j;

mapRangeValue.rangeValue[0]= mapRangeValue.rangeValue[1]+ (6.0/(2*k));

mapRangeValue.rangeValue[2]= million-Base.rangeValue[2]- (4.0/(2*k))*i;

mapRangeValue.rangeValue[3]= mapRangeValue.rangeValue[2]- (4.0/(2*k));

million[i,j]= mapRangeValue;

②划分其他比例尺地形图:

for(i=0;i< (12* Math.Pow(2,k-3));i++)

for(j=0;j< (12* Math.Pow(2,k-3));j++)

MapRangeValue mapRangeValue=new MapRangeValue();

mapRangeValue.rangeValue[1]= million-Base.rangeValue[1]+ (6.0/ (12* Math.Pow(2,k-3)))*j;

mapRangeValue.rangeValue[0]= mapRangeValue.rangeValue[1] + (6.0 / (12 *Math.Pow(2,k-3)));

mapRangeValue.rangeValue[2]= million-Base.rangeValue[2]- (4.0/ (12* Math.Pow(2,k-3)))*i;

mapRangeValue.rangeValue[3]= mapRangeValue.rangeValue[2] - (4.0 / (12 *Math.Pow(2,k-3)));

million[i,j]= mapRangeValue;

5)实现搜索功能。由于数组中存放着地图范围经纬度的最大值和最小值,故只需将已知的经纬度和数组中的最值进行比较便可确认已知点所属数组,即可确定行列号,得到新图幅编码,再由新编码进行转换得到旧编码[7-8],流程如图3所示。

图3 工作流程

实现确定行列号代码:

if(longitude<= mapRangeValue.rangeValue[0] && longitude > = mapRangeValue.rangeValue[1]&&latitude < = mapRangeValue.rangeValue[2]&&latitude > = mapRangeValue.rangeValue[3])

4 结束语

通过计算机实现地形图分幅编码查询,直观,利于识别,大大方便了地形图的管理。同时实现了新旧编码的转换,满足了现实生产工作中的需要,具有一定的实用价值。通过进一步完善,本程序可作为地理信息系统存取地形图的组件,用以组成功能强大、完善的GIS系统。

[1]项仲贞,许承权,方子岩.中大比例尺地形图标准分幅与编号查询系统的实现[J].铁道勘察,2008(1):24-26.

[2]毕旭东,李永树.AE环境下宗地图自动生成模块的设计与实现[J].测绘工程,2009(1):42-44.

[3]马俊海,王文福,祁向前.现代地图学理论与技术[M].哈尔滨:哈尔滨地图出版社,2008:89-95.

[4]罗胜,郭海涛,张保明.矢量地图图幅裁剪技术研究[J].测绘工程,2007,16(4):56-59.

[5]杜军和.王英.大比例尺地形图图幅号查询的可视化实现[J].城市勘测,2007(5):67-70.

[6]李学民,田耀永,邓丽霞.国家基本比例尺地形图的分幅与编号及新旧图号的转换[J].河南测绘,2007(3):25-26.

[7]颉耀文.GIS中地图投影的应用[J].黑龙江工程学院学报:自然科学版,2001,5(3):22-25.

[8]王俊,张文诗,王建涛.多图幅海量数据电子地图快速显示的研究与实现[J].测绘工程,2003,2(3):18-20.

猜你喜欢

图幅行列数组
JAVA稀疏矩阵算法
用“行列排除法”解四宫数独(2)
用“行列排除法”解四宫数独(1)
JAVA玩转数学之二维数组排序
单层小波分解下图像行列压缩感知选择算法
Excel数组公式在林业多条件求和中的应用
基于EXCEL的地形图图幅号转换查询方法
寻找勾股数组的历程
基于ArcMap的图幅接合表快速生成方法研究
地形图图幅编号规则及实现