测绘地理信息   2021, Vol. 46 Issue (4): 122-127
0
使用开源软件的地图分幅软件设计与实现[PDF全文]
程晓光1, 陆泉源1, 郑诚慧1, 常学立2,3, 商建伟4    
1. 飞燕航空遥感技术有限公司, 江苏 南京, 210001;
2. 湖北工业大学计算机学院, 湖北 武汉, 430068;
3. 地球空间信息技术协同创新中心, 湖北 武汉, 430074;
4. 山东省国土测绘院, 山东 济南, 250013
摘要: 现有的地图成图系统对最新版的地图分幅国家标准的支持不够充分,不能依据测区范围分幅,容易生成无效图幅,后期人工编辑工作量大。基于AutoCAD进行二次开发受制于AutoCAD,有断供风险。基于Qt、GEOS、PROJ、GDAL、libdxfrw等开源软件,本文使用C++设计实现了一个4层架构、多线程的地图自动分幅软件。它全面支持国家基本比例尺地图分幅标准,可以基于测区边界指定地图分幅范围来进行经纬度分幅和矩形分幅。在图廓整饰中,支持读取DWG/DXF格式的分幅接合表,附加数字正射影像参照和批量图廓整饰,运行速度快。该软件扩展性强,容易跨平台,对于在地图分幅上摆脱对AutoCAD的依赖有积极意义。
关键词: 地图分幅    图廓整饰    开源软件    AutoCAD    
Design and Implementation of Map Subdivision Software Using Open Source Software
CHENG Xiaoguang1, LU Quanyuan1, ZHENG Chenghui1, CHANG Xueli2,3, SHANG Jianwei4    
1. Feiyan Aerial Remote Sensing and Technology Co., Ltd., Nanjing 210001, China;
2. School of Computer, Hubei University of Technology, Wuhan 430068, China;
3. Collaborative Innovation Centerof Geospatial Technology, Wuhan 430074, China;
4. Shangdong Land Surveying and Mapping Institute, Jinan 250013, China
Abstract: The existing mapping systems of map does not fully support the latest national standards for map subdivision, and cannot perform subdivision based on survey range, so they often generate invalid map sheets, which makes the later manual editing workload is heavy. The secondary development based on AutoCAD is strictly restricted by AutoCAD and there is a risk of outage. Based on Qt, GEOS, PROJ, GDAL, libdxfrw and other open source softwares, this paper designs and implements an automatic map subdivision software with a four-layer architecture and multi-thread capability, and jmplements it in C++. It fully supports the national standard of map subdivision, and can specify the subdividing range based on the survey boundary to perform latitude-longitude subdivision or rectangular subdivision. Map decoration supports reading subdivision map with DWG/DXF format, attaching digital orthophoto map as reference and fast batch map decoration. The software has strong scalability and can easily migrate to other operating systems. It has positive significance for map subdivision in avoiding the dependence on AutoCAD.
Key words: map subdivision    map decoration    open source software    AutoCAD    

地图分幅编号和图廓整饰是国家基本比例尺地形图生产中的重要一步。在提交最终成果时,需要依据国家标准[1-5]或项目要求对整个测区的成果数据进行地图分幅编号、图幅裁切和图廓整饰,以方便地图数据的保管和使用[6]。目前,中国测绘行业主要使用在AutoCAD[7]基础上开发的地图成图软件进行地图分幅。但这些成图软件一般存在对新版国标[1]不全面支持,不能依据测区范围自动分幅,容易生成无效图幅,对个性化需求支持不够等问题,导致后期人工编辑工作量大,容易出错[8]。互联网上的一些地图分幅软件功能有限,主要支持单点图幅号查询、图幅角点坐标计算及新老编号转换[9, 10]。为此,有些生产单位基于AutoCAD平台提供的VBA[8, 11, 12]、AutoLISP[6]、DCL[6]等语言接口二次开发了地图分幅软件,但要求预装AutoCAD。总体而言,在地图分幅上,中国测绘行业对AutoCAD有很强的依赖。而AutoCAD是美国Autodesk公司[7]推出的商业软件,受美国出口管制,存在断供风险。从这个角度讲,开发掌握自主知识产权、充分支持新版国家标准、减少后期人工编辑工作量的自动地图分幅软件,降低对AutoCAD的依赖是非常必要的。

随着开源软件的发展,可用于地图分幅软件开发的开源软件越来越多,如应用程序开发框架Qt[13],它基于较宽松通用公共许可证(lesser general public liense, LGPL)发布[14];DXF/DWG读写库libdxfrw[15],它在GPL2.0[16]许可证下发布;开源空间信息基金会[17](Open Source Geospatial Foundation,OSGeo)旗下的二维几何分析库GEOS (geometry engine open source)[18];它基于通用公开许可证[16](general public license,GPL)发布,支持主流的操作系统。地理空间数据读写库GDAL(geospatial data abstraction library)[19]与地图投影库PROJ(projection)[20]在X/MIT开源许可证下发布[21],可在众多操作系统平台上解译使用。这些开源软件的许可证允许社会公众获得源代码,运行、复制、改进、发行、传播软件。

本文基于开源软件设计和开发了一套支持所有基本比例尺的地图自动分幅软件,自主可控,扩展性强,可以基于测区边界指定分幅范围,生成经纬度分幅、矩形分幅的接合表,批量生成图廓文件,支持部分个性化需求。

1 地图分幅软件设计 1.1 软件架构

软件架构如图 1所示,分为前端显示、服务管理、处理服务和底层支撑4层。前端显示层与服务管理层进行交互,不直接调用处理服务。服务管理层使用多线程技术调用和管理处理服务。处理服务层接收处理参数,调用底层支撑,执行具体任务,上报进度结果。架构设计实现了前端显示和后端计算的分离,确保即使后端在进行耗时较长的处理,显示界面也不卡死,仍可进行与当前处理不冲突的其他操作。

图 1 软件架构图 Fig.1 Software Architecture

1.2 地图分幅功能设计

本文定义落在指定分幅范围内的图廓为有效图廓。地图分幅的行号和列号均从1开始。经纬度分幅的流程如图 2所示。出于简单考虑,在经纬度分幅中只计算4个角点的投影坐标,对角点的包容盒进行外扩将其作为图廓[22],没有像文献[23]一样对图廓边进行加密。和经纬度分幅相比,矩形分幅的编号较为简单。输出分幅接合表的坐标系为2000国家大地坐标系椭球体基础上的高斯投影坐标系。地图分幅的大部分算法在文献[1, 9, 10, 23]中已有介绍,本文只介绍一下其他文献较少涉及的问题。

图 2 经纬度分幅流程图 Fig.2 Flow Chart of Latitude-Longitude Subdivision

指定地图分幅范围有两种方式,既可基于坐标(经纬度或投影坐标)范围,也可基于测区边界。对于后者,只有图廓的面状几何对象和测区的面状几何对象相交,图廓才是有效图廓。图 3为有效图廓示意图,其中灰色圆形为测区,带数字编号的矩形为图廓。在图 3中,图廓1与测区不相交,不是有效图廓;图廓2和图廓3与测区相交,是有效图廓。这种方式可以确保只生成覆盖测区的图幅。

图 3 有效图廓示意图 Fig.3 Example of Valid Map

在经纬度分幅中,和其他比例尺不同,1∶2 000的地图编号既可以基于1∶100万比例尺,也可以基于1∶5 000比例尺。设某个1∶2 000的图幅位于1∶100万图幅的第R2行第C2列,1≤R2≤576,1≤C2≤576,则其所在的1∶5 000图幅的行号R5和列号C5的计算如下:

$ {R_5} = {\mathop{\rm int}} \left( {\frac{{{R_2} - 1}}{3}} \right) + 1\quad {C_5} = {\mathop{\rm int}} \left( {\frac{{{C_2} - 1}}{3}} \right) + 1 $ (1)

式中,int为取整函数。1∶2 000的图幅在1∶5 000图幅中的相对位置A2的计算方法为:

$ {A_2} = 3\, \bmod \, \left( {{R_2} - 1, 3} \right) + \, \bmod \, \left( {{C_2} - 1, 3} \right) + 1 $ (2)

式中,mod为求余函数。将1∶100万图幅的编号、1∶5 000比例尺的代码HR5C5A2进行组合,即可得到基于1∶5 000比例尺的1∶2 000分幅的编号。

地图分幅界面如图 4所示,支持按照坐标范围或图形文件指定分幅范围。矩形分幅界面内置5种编号方法,除国标中的3种外,还有两种项目标准;允许设置编号前缀,以便在图幅编号中前置投影带等信息。

图 4 地图分幅编号界面 Fig.4 Graphic Interface of Map Subdivision

1.3 图廓整饰功能设计

矩形分幅的图廓整饰流程如图 5所示。和矩形分幅相比,经纬度分幅仅通过解析图幅编号和投影即可得到内图廓,而且多了单个图幅模式。软件根据空间相对位置或查询邻接图幅中心的分幅编号自动计算当前图幅的邻接图幅,填充邻接图表。

图 5 矩形分幅的图廓整饰流程图 Fig.5 Map Decoration Flow Chart of Rectangular Subdivision

对经纬度分幅,图幅比例尺可由编号解析出来。矩形分幅只能用于大比例尺,一般难以直接从编号获得比例尺,需要从图廓获得。设图廓的最小X坐标为xmin,最大X坐标为xmax,最小Y坐标为ymin,最大Y坐标为ymax。此处先计算图幅的最大尺度ΔD

$ \Delta D = \max \left( {{x_{\max }} - {x_{\min }}, {y_{\max }} - {y_{\min }}} \right) $ (3)

式中,max为求最大值函数。由ΔD判断比例尺S的方法如下:

$ S = \left\{ {\begin{array}{*{20}{l}} {1:2000, \Delta D = 1000 + 2d}\\ {1:1000, \Delta D = 500 + 2d}\\ {1:500, \Delta D = 250 + 2d} \end{array}} \right. $ (4)

式中,d为图廓外扩距离。

该方法可以确保无论采用50 cm×50 cm分幅还是50 cm×40 cm分幅,都能得到正确的比例尺。

不同比例尺下的图幅大小不同。为了尽量使同一套程序适用于不同比例尺,在计算绘图元素大小和位置时使用一个尺度系数k,计算如下:

$ k = \frac{{1/S}}{{1000}} $ (5)

图廓整饰的批量模式通过图幅接合表实现,经纬度分幅还支持单个模式。图廓整饰允许用户设置图廓文件名前缀和后缀、是否附着影像。

2 地图分幅软件实现

本文在Windows10平台上编译了Qt 5.11.3、GEOS 3.4.2、GDAL3.0、PROJ 6.0和libdxfrw0.6.3的源代码,得到对应的lib.dll.头文件,再在Visual studio 2017社区版开发环境中使用C++编程实现了地图分幅软件。利用Qt界面库实现了软件界面;利用Qt槽-信号机制实现了前后端间的通信;利用libdxfrw的接口类dx_iface读写图形文件。

2.1 地图分幅功能实现

基于测区边界指定分幅范围时,要求如下:①边界存储在DWG/DXF文件的同一图层内;②边界以单个或多个闭合多段线表达;③边界间不能交叉,单个边界不能自交叉。

考虑到测区可能由多个在空间上不重叠的小测区构成,且测区可能带洞,所以本文定义测区为MultiPolygon[20]的对象,定义图幅为Polygon[20]的对象。调用测区对象的intersects函数判断测区对象和图幅对象是否相交。

在经纬度分幅中,使用PROJ的pj_init_plus函数定义坐标系,pj_transform实现坐标转换,pj_free释放坐标系对象。

在保存接合表时各元素采用的libdxfrw类如下:①文字样式:DRW_Textstyle;②顶点:DRW_Vertex;③图廓:DRW_Polyline;④图幅编号:DRW_Text。

图幅编号属性如下:①基点为图幅中心;②第二点为图幅中心东偏一个小的距离;③水平居中对齐;④文字高度限定为图幅高度的0.05~0.08倍之间。

在保存接合表时,所有图廓存储在同一图层,所有图幅编号存储在同一图层。

2.2 图廓整饰功能实现

批量图廓整饰要求接合表以DWG/DXF格式存储,图廓存储在一个图层,编号存储在一个图层。

在读取接合表时,用DRW_LWPolyline(节点为DRW_Vertex2D类型)或DRW_Polyline(节点为DRW_Vertex类型)解析图廓,存储为Polygon对象;用DRW_Text解析编号,获取基点坐标和编号内容。

在分别得到图廓和图幅编号后,需要对二者建立映射,获得图幅的图廓和编号。对某图廓,遍历所有图幅编号,调用Polygon的contains函数,判断图廓是否包含当前编号的基点坐标对应的Point类型对象。若包含,则当前编号为图廓对应的图幅编号,新建一个图幅对象。若图廓内没有图幅编号,则图幅无效。

图廓文件主要绘图元素采用的libdxfrw类如下:①图形范围:DRW_Variant;②视图:DRW_Vport;③文字样式:DRW_Textstyle;④内图廓:DRW_Polyline;⑤外图廓:DRW_LWPolyline;⑥坐标网线:DRW_Polyline;⑦文字注记:DRW_Text;⑧线段:DRW_Line;⑨邻接图表中的本图幅:DRW_Hatch;⑩邻接图表中的相邻图幅:DRW_Polyline和DRW_Text;11比例尺:DRW_LWPolyline、DRW_Polyline和DRW_Text。

绘图元素的写入顺序应考虑显示要求。可以被压盖的元素,如数字正射影像(digital orthophoto map,DOM),应先写入;不能被压盖的元素,如坐标注记,可以靠后写入。

对DOM生产来说,图廓文件内要附着DOM[23]。为方便管理,本文建议:①以图幅编号为DOM文件名;②将图廓文件和DOM文件放在同一目录内。

要使DOM显示在准确的位置,需要获取DOM大小、分辨率和左上角坐标。利用GDAL接口类GDALDataset的GetRasterXSize和GetRasterYSize函数获得DOM大小。如果DOM有配套的TFW文件,则从TFW文件读取分辨率和左上角坐标;如果DOM存储了坐标和分辨率信息,如GeoTiff格式,则利用GDALDataset的GetGeoTransform函数读取分辨率和左上角坐标。

设DOM左上角坐标为(xul, yul),在X方向大小为Ncol,分辨率为Cx;在Y方向大小为Nrow,分辨率为Cy(一般为-Cx)。定义附着的DOMlibdxfrw中类dx_ifaceImg的对象,其属性如下:①基点坐标:(xul, yul+CyNrow);②第二点坐标:(Cx, 0);③单像素的V方向向量:(0, -Cy);④U方向影像大小:Ncol;⑤V方向影像大小:Nrow;⑥影像路径:“./XX.ext”。其中XX为DOM文件名,ext为DOM扩展名。使用相对路径可以避免图廓文件绝对路径的变化对DOM加载的影响。

3 软件效果 3.1 地图分幅效果

在配置Intel Core i5-2300的CPU、16 GB内存的电脑上,如图 4(a)的经纬度分幅耗时4.303 s,生成包含2 392个图幅的接合表(见图 6(a))。图 6(a)采用1∶2 000分幅,基于1∶5 000比例尺,其中黄绿线为测区边界,红框为图廓,黑字为图幅编号;图 4(b)的矩形分幅耗时3.208 s,生成包含1 956个图幅的接合表(见图 6(b))。图 6(b)采用1∶2 000分幅,分幅大小50 cm×50 cm,采用图廓西南角坐标编号法进行编号,其中黄绿线为测区边界,红框为图廓,黑字为图幅编号。无论是经纬度分幅还是矩形分幅,生成的图幅准确覆盖测区,没有测区外图幅,也没有遗漏测区内图幅。

图 6 分幅接合表示例 Fig.6 Example of Map Subdivision

3.2 图廓整饰效果

在图廓整饰中,图 6(a)的接合表平均1 min生成492个图廓文件;图 6(b)的接合表平均1 min生成533个图廓文件。生成1∶2 000的分幅图廓文件如图 7所示,含有国标[2]中规定的所有图廓元素,位置准确,标注清晰。

图 7 图廓整饰示例 Fig.7 Example of Map Decoration

4 结束语

基于开源软件开发地图分幅软件对于掌握中国测绘领域的自主知识产权有积极意义。本文设计实现的软件全面支持基本比例尺地图分幅的国家标准,且能满足部分地图分幅编号的个性化需求。

在PROJ的支撑下,软件可以支持更多的坐标系。如果提供了图幅编号和图幅名的映射表,则批量图廓整饰可以自动生成带图幅名的图廓文件。经过简单的修改和适配,软件即可在不同操作系统上运行。在引入新的开源库后,软件可以实现对更多格式的测区边界文件、图幅接合表和图廓文件的支持。

参考文献
[1]
中华人民共和国国家质量监督检验检疫总局, 中国国家标准化管理委员会. 国家基本比例尺地形图分幅和编号: GB/T 13989-2012[S]. 北京: 中国标准出版社, 2012
[2]
中华人民共和国国家质量监督检验检疫总局, 中国国家标准化管理委员会. 国家基本比例尺地图图式第1部分: 1∶500 1∶1 000 1∶2 000地形图图式: GB/T 20257.1-2017[S]. 北京: 中国标准出版社, 2017
[3]
中华人民共和国国家质量监督检验检疫总局, 中国国家标准化管理委员会. 国家基本比例尺地图图式第2部分: 1∶5 000 1∶10 000地形图图式: GB/T 20257.2-2017[S]. 北京: 中国标准出版社, 2017
[4]
中华人民共和国国家质量监督检验检疫总局, 中国国家标准化管理委员会. 国家基本比例尺地图图式第3部分: 1∶25 000 1∶50 000 1∶100 000地形图图式: GB/T 20257.3-2017[S]. 北京: 中国标准出版社, 2017
[5]
中华人民共和国国家质量监督检验检疫总局, 中国国家标准化管理委员会. 国家基本比例尺地图图式第4部分: 1∶250 000 1∶500 000 1∶1 000 000地形图图式: GB/T 20257.4-2017[S]. 北京: 中国标准出版社, 2017
[6]
黎杰, 吴新广. 大比例尺数字地形图虚拟分幅技术研究[J]. 水力发电, 2018, 44(7): 34-37. DOI:10.3969/j.issn.0559-9342.2018.07.009
[7]
Autodesk. Autodesk欧特克官网-三维设计、工程和娱乐软件[EB/OL]. [2020-08-3]. https://www.autodesk.com.cn
[8]
胡炳辉, 周雅丽, 沈迎光. 基于AutoCAD二次开发的图框批量生成[J]. 测绘技术装备, 2016, 18(4): 52-53. DOI:10.3969/j.issn.1674-4950.2016.04.014
[9]
李贺. 基于Web的地形图分幅与编号处理系统[J]. 地理空间信息, 2019, 17(10): 99-101. DOI:10.3969/j.issn.1672-4623.2019.10.028
[10]
梁林峰. 地形图图幅号查询转换方法及计算器程序设计[J]. 林业建设, 2016(2): 29-34.
[11]
丁亚杰, 陈再春. 基于FME的地形图批量分幅方法研究[J]. 城市勘测, 2016(1): 126-128. DOI:10.3969/j.issn.1672-8262.2016.01.030
[12]
王大江, 李国营, 高晨, 等. AutoCAD大比例尺地形图制图工具包的开发与应用[J]. 测绘与空间地理信息, 2017, 40(6): 169-172. DOI:10.3969/j.issn.1672-5867.2017.06.056
[13]
The Qt Company. Qt | Cross-Platform Software Development for Embeded & Desktop[EB/OL]. [2020-08-04]. https://www.qt.io
[14]
Free Software Foundation. GNU Lesser General Public License[EB/OL]. [2020-08-03]. http://www.gnu.org/licenses/lgpl-3.0.html
[15]
libdxfrw Contributors. libdxfrw[EB/OL]. [2020-08-03]. https://sourceforge.net/projects/libdxfrw
[16]
Free Software Foundation. GNU General Public License, Version 2[EB/OL]. [2020-08-03]. http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
[17]
Open Source Geospatial Foundation. Homepage - OSGeo[EB/OL]. [2020-08-10]. https://www.osgeo.org
[18]
GEOS Contributors. GEOS[EB/OL]. [2020-08-03]. https://trac.osgeo.org/geos
[19]
GDAL/OGR Contributors. GDAL/OGR Geospatial Data Abstraction Software Library[EB/OL]. [2020-08-04]. https://gdal.org
[20]
PROJ Contributors. PROJ Coordinate Transformation Software Library[EB/OL]. [2020-08-04]. https://proj.org
[21]
Open Source Initiative. The MIT License[EB/OL]. [2020-08-03]. https://opensource.org/licenses/MIT
[22]
吴曜宏, 乔俊军, 胡冯伟. 求解制图区域的地图图幅编号的算法研究[J]. 地理信息世界, 2017, 24(4): 64-68.
[23]
唐国礼. 影像挂图编制技术和方法探讨[J]. 测绘地理信息, 2016, 41(2): 74-76.