摘要:EPS2020平臺是北京山維公司面向前端采集和后期數(shù)據(jù)建庫一體化的測繪平臺,目前可以支撐3000平方公里左右的中型城市的大比例尺數(shù)據(jù)建庫需求,管理的對象條目接近1億。隨著大比例尺前端采集與后端建庫一體化的加深,對城市級的數(shù)據(jù)要素加工、跨平臺數(shù)據(jù)遷移提出更高的要求。在EPS2020升級開發(fā)過程中,基于ERSI FileGDB通用數(shù)據(jù)格式,為后臺數(shù)據(jù)庫的GIS輸出,設(shè)計了一種較為高效的整體方案,簡化了底出輸出結(jié)構(gòu),適合數(shù)據(jù)庫級的海量輸出。
關(guān)鍵詞:EPS2020;數(shù)據(jù)庫;FileGDB格式
一、前言
EPS2020目前還處于初步完善階段,目標是依據(jù)國標完善編碼體系,以及提升數(shù)據(jù)量的支撐能力[1]。其上一個較為成熟的版本是EPS2008。在EPS2008平臺中,大比例尺測圖一般以基本比例尺編號為文件名(后綴*.edb),逐文件保存。一般的GIS數(shù)據(jù)輸出作業(yè)中,效率要求不高,數(shù)據(jù)體量偏小,往往通過VBS腳本,使用平臺的通用輸出函數(shù)ExportData,循環(huán)模式單個文件輸出為SHP文件(ESRI Shapefile) 即可滿足需求。升級為EPS2020平臺后,原有SHP輸出方案的輸出效率、數(shù)據(jù)承載力都無法滿足需求。本文在EPS2020平臺進行二次開發(fā),省去原有通用的ExportData函數(shù)輸出對象,而采用直接輸出GIS格式,提升了平臺GIS輸出效率,且支撐了更大輸出體量。其中,輸出格式采用ESRI公司的FileGDB格式。FileGDB不僅支持1TB級的數(shù)據(jù)量,ESRI公司還為其提供了開發(fā)接口。同時,本文使用了開源軟件GDAL中間件,其對矢量格式和柵格格式進行了廣泛支持,對FileGDB進行了更為抽象GIS風格封裝,更有利于移植使用。
二、 開發(fā)技術(shù)
(一)FileGDB及開發(fā)包
FileGDB是ESRI公司開發(fā)的一種非公開文件地理數(shù)據(jù)庫承載格式,是磁盤上某個文件夾中文件的集合,可以存儲、查詢和管理空間數(shù)據(jù)和非空間數(shù)據(jù)。從Windows 資源管理器查看,是以.gdb為后綴的文件夾(見圖1),和任何其他文件夾一樣可以查看它里面的內(nèi)容。文件夾內(nèi)使用隱含命名文件存儲地理數(shù)據(jù)、屬性數(shù)據(jù)、索引文件、lock 文件、特征文件以及其他文件。地理數(shù)據(jù)庫中的每個要素類或表存儲在兩個或多個文件中,并不能明確地說出任何給定的數(shù)據(jù)集是由哪些文件所組成[2]。
在ArcMap軟件中,可從目錄樹或者使用創(chuàng)建文件地理數(shù)據(jù)庫地理處理工具創(chuàng)建文件地理數(shù)據(jù)庫。文件數(shù)據(jù)庫由系統(tǒng)表及用戶數(shù)據(jù)組成,可以存儲在以下類型的數(shù)據(jù)集中:
· 要素類
· 要素數(shù)據(jù)集
· 鑲嵌數(shù)據(jù)集
· 柵格數(shù)據(jù)集
· 邏輯示意圖數(shù)據(jù)集(需要 ArcGIS Schematics extension)
· 表(非空間)
· 工具箱
要素類和表可包含子類型、附件并使用關(guān)系類關(guān)聯(lián)到另一個要素類和表。要素數(shù)據(jù)集可包含要素類以及以下類型的數(shù)據(jù)集:
· 幾何網(wǎng)絡
· 網(wǎng)絡數(shù)據(jù)集(需要 ArcGIS Network Analyst extension)
· 宗地結(jié)構(gòu)
· 地形(需要 ArcGIS 3D Analyst extension)
· 拓撲
默認情況下,GDB數(shù)據(jù)庫中數(shù)據(jù)集(表或要素)的最大大小為1 TB,大型數(shù)據(jù)集的最大大小可增加到 256 TB,它們由配置關(guān)鍵字即可控制。要素類和表的數(shù)量、要素類或表中的行數(shù)、文本字段的長度可以達2,147,483,647。要素類或表中的字段數(shù)為65,534。
可以說,F(xiàn)ileGDB存儲能力非常強大,符合EPS2020平臺建庫數(shù)據(jù)輸出GIS數(shù)據(jù)的數(shù)據(jù)承載力。雖然ESRI公司并沒有完全公開GDB格式底層,但其提供了File Geodatabase API接口,可以在包括windows、mac、linux等多個操作系統(tǒng)上獨立地訪問GDB數(shù)據(jù)。目前官方網(wǎng)址公布的版本是1.4,GITHUB上已經(jīng)更新到1.5.2。
(二)GDAL FileGDB API庫
GDAL(Geospatial Data Abstraction Library)是一個基于C++代碼的開源GIS 庫,支持X/MIT許可協(xié)議,它利用抽象數(shù)據(jù)模型來表達所支持的各種文件格式。GDAL支持各種柵格地理數(shù)據(jù)格式,同時包括了操作矢量數(shù)據(jù)的OGR(OpenGIS Simple Feature Reference)庫。一般將這兩個庫合稱為GDAL/OGR,或者簡稱GDAL。GDAL是由Frank Warmerdam于1998年開始開發(fā)的,在GDAL 1.3.2版本之后,正式由開源空間信息基金會下的GDAL/OGR項目管理委員會對其進行維護。由于MIT協(xié)議的開放性,任何人都可以基于GDAL庫來編譯自己的軟件而不需要原作者的授權(quán),許多著名的GIS軟件可以接入GDAL庫,如ESRI的ArcGIS,Google的Google Earth等系統(tǒng)。特別是一些開源項目(如GRASS GIS、QGIS等)更是將GDAL作為基礎(chǔ)支撐。
GDAL支持包括GeoTiff,Eradas Imagine,ECW,MrSID,JPEG2000,DTED,NITF,GeoPackage等155類柵格數(shù)據(jù)的支持;支持包括ESRI Shape,ESRI ArcSDE,ESRI FileGDB,MapInfo(tab and mid/mif),GML,MKL,PostGIS,Oracle Spatial等95類矢量數(shù)據(jù)的支持。默認情況下,GDAL使用OpenFileGDB驅(qū)動只讀性地打開GDB數(shù)據(jù)庫,讀寫操作則需要將ESRI公司的File Geodatabase API接口接入進來,其接入驅(qū)動名為ESRI File Geodatabase (FileGDB) Driver[3]。
GDAL FileGDB驅(qū)動程序提供對ArcGIS 10及以上版本創(chuàng)建的文件geodatabase(.gdb目錄)的矢量層的讀寫訪問[4]。數(shù)據(jù)集名稱必須是目錄/文件夾名稱,并且必須以.gdb擴展名結(jié)尾。GDAL FileGDB驅(qū)動程序支持批量功能加載,以加快數(shù)據(jù)的插入,即FGDB_BULK_LOAD 選項設(shè)置為YES。此配置選項的作用是執(zhí)行寫鎖定并臨時禁用索引。在關(guān)閉數(shù)據(jù)源或完成讀取操作時還原這些數(shù)據(jù)。對于新創(chuàng)建的圖層,默認情況下啟用批量加載。另外,GDAL FileGDB驅(qū)動支持在數(shù)據(jù)集上執(zhí)行SQL語句,以及如下創(chuàng)建參數(shù):
FEATURE_DATASET :在命名的FeatureDataset文件夾中創(chuàng)建新層;如果文件夾不存在,將創(chuàng)建它。
LAYER_ALIAS =string:(GDALgt;=2.3)設(shè)置層名稱別名。
GEOMETRY_NAME :在新層中設(shè)置幾何列的名稱。默認為“SHAPE”。
GEOMETRY_NULLABLE :(GDALgt;=2.0)幾何列的值是否可以為空。
FID :要創(chuàng)建的OID列的名稱。默認為“OBJECTID”。
XYTOLERANCE, ZTOLERANCE:這些參數(shù)控制用于高級ArcGIS功能(如網(wǎng)絡和拓撲規(guī)則)的捕捉公差。
XORIGIN、YORIGIN、ZORIGIN、XYSCALE、ZSCALE :坐標參數(shù)精度。網(wǎng)格的尺寸由原點和比例決定。原點定義參考柵格點在空間中的位置。比例是分辨率的倒數(shù)。
XORIGIN, YORIGIN, ZORIGIN, XYSCALE, ZSCALE:指定的域 (xmin=XORIGIN, ymin=YORIGIN, xmax=(XORIGIN + 9E+15 / XYSCALE), ymax=(YORIGIN + 9E+15 / XYSCALE)) 需要包含要素類的所有可能的坐標值。
XML_DEFINITION :設(shè)置此選項時,其值將用作創(chuàng)建新表的XML定義。
CREATE_MULTIPATCH = YES:設(shè)置此選項時,MultiPolygon類型圖層的幾何圖形將寫入MultiPatch。
CONFIGURATION_KEYWORD = DEFAULTS/TEXT_UTF16/MAX_FILE_SIZE_4GB/MAX_FILE_SIZE_256TB/GEOMETRY_OUTOFLINE/BLOB_OUTOFLINE/GEOMETRY_AND_BLOB_OUTOFLINE : 自定義數(shù)據(jù)存儲方式。默認情況下,文本采用UTF-8格式,數(shù)據(jù)最大為1TB。
(三) EPS2020二次開發(fā)
北京山維公司EPS地理信息工作站是測繪及GIS數(shù)據(jù)采集建庫更新平臺。平臺數(shù)據(jù)接口SunwaySDE除支持原生的EDB格式存儲外,還支持基于常規(guī)Oracle、SqlServer等數(shù)據(jù)庫級的存儲,同時也可以支持柵格影像等數(shù)據(jù)的顯示。另外,對ArcSDE接口再封裝,形成了SunwaySDE for ArcSDE。目前,原生的SunwaySDE是主要的發(fā)展方向,本次的二次開發(fā)即是在其環(huán)境下對CGeoBase的再輸出。
EPS平臺支持C++嵌入式開發(fā),SDL(Sunway Dynamic linked Library)是其提供的基于VC++6.0(SP2)環(huán)境下的二次開發(fā)包。通過SDL開發(fā)包,可以在EPS平臺上定制功能強大和專業(yè)的應用。EPS平臺下的部分應用模塊均是采用SDL的方式開發(fā)而成的。
三、對象映射關(guān)系
本文拋棄原有EPS圖層對GIS圖層的轉(zhuǎn)換關(guān)系,提出按EPS編碼對應GIS圖層的映射關(guān)系。對于從EPS平臺向GIS平臺的數(shù)據(jù)輸出后,由于符號化方法和曲線平滑算法上的差異,在其他GIS 平臺上的可視化效果肯定無法精確還原,但可以完整地保留對象一一對應的關(guān)系,以及單個對象的全部信息。因此,對象是可以在兩種數(shù)據(jù)之間無損轉(zhuǎn)換的,僅在對象的組織形式有所不同,有如下映射關(guān)系。
(一)編碼對圖層映射
EPS平臺是一個基于地物編碼的對象化平臺。相同地物編碼的對象在EPS平臺擁有相同的幾何類型、屬性[5]。
FileGDB是通用的OGC標準點、線和面對象,每一層代表一類對象集(FeatureClass)。因此,EPS平臺中的一個圖層并不能直接對應FileGDB中的數(shù)據(jù)集??紤]到在EPS平臺中不同對象可能掛接一個或多種屬性表,這里使用EPS平臺中相同的編碼對象集對應FileGDB中一個圖層(對象集)。
(二)基本元數(shù)據(jù)屬性映射
對于對象化的EPS平臺管理元數(shù)據(jù),按元數(shù)據(jù)的默認名稱存放到FileGDB對象集的屬性表中,如FeatureGUID、CreateTime、Code等。
對于EPS平臺對象的基本屬性,按顯示名稱存放到FileGDB對象集屬性字段,例如圖層名、工程信息、采集時間等。
對于EPS平臺單一對象空間位置點列上的每個特征點,因為還存在特征點類型Integer屬性,將其放置到FileGDB對象的M值中。
四、代碼與測試
(一) GDAL代碼中植入FileGDB
在VisualStudio2017編譯GDAL源代碼時添加對FileGDB的支持。首先修改編譯參數(shù),在GDAL自定義編譯參數(shù)文件nmake.local中補充*.h頭文件位置和*.lib資源文件位置,并設(shè)置FGDB_ENABLED=YES。其次使用cmd命令行編譯,在“開始菜單\所有程序\Microsoft Visual Studio 2017\Visual Studio Tools\ Visual Studio 2017命令提示”,點擊“Visual Studio 2017 命令提示”彈出經(jīng)過常量初始化后的CMD窗口。接著使用cd命令,切換到GDAL的源代碼目錄,并依次使用如下命令等待編譯結(jié)束即可:
nmake -f makefile.vc
nmake -f makefile.vc install
nmake -f makefile.vc devinstall
nmake -f makefile.vc clean
最后編譯出GDAL.DLL文件。
(二) EPS對象輸出
EPS2020N二次開發(fā)是在VC6.0的環(huán)境中完成。打開EPS數(shù)據(jù)集后,獲取EPS對象CGeoBase,然后按上一節(jié)描述的映射關(guān)系,創(chuàng)建FileGDB圖層,即列舉全部EPS對象的編碼,創(chuàng)建相應的同名FileGDB圖層。
由于FileGDB已由GDAL封裝,在GDAL的數(shù)據(jù)庫集對象GDALDataset上,使用函數(shù)CreateLayer完成FileGDB圖層的創(chuàng)建,然后逐一對EPS對象CGeoBase轉(zhuǎn)化GDAL對象OGRFeature。核心函數(shù)如下(以線對象為例):
bool gdalAddLine(OGRLayer * gdal_layer," CGeoBase * pObj) {
OGRErr err;
OGRFeature * gdal_line_feature = OGRFeature::CreateFeature(gdal_layer-gt;GetLayerDefn());
// add filed
gdal_line_feature-gt;SetField(\"CODE\", pObj-gt;GetCode());
...
// geometry
OGRLineString gdal_line_geometry;
POINT3DLIST objPl;
pObj-gt;GetPointList(objPl);
for (int j = 0, jSize = objPl.GetSize(); j lt; jSize; ++j) {
OGRPoint gdal_point(objPl[j].x, objPl[j].y, objPl[j].z, objPl[j].nType);
gdal_line_geometry.addPoint(amp;gdal_point);
}
err = gdal_line_feature-gt;SetGeometry(amp;gdal_line_geometry);
err = gdal_layer-gt;CreateFeature(gdal_line_feature);
OGRFeature::DestroyFeature(gdal_line_feature);
return err == OGRERR_NONE;
}
五、結(jié)語
隨著數(shù)據(jù)體量的增長,測繪編輯對EPS2020平臺提出更高的要求。本文在EPS平臺直接輸出對象化GIS數(shù)據(jù),通過將GDAL開源組件的接入,彌補了EPS2020平臺與其他平臺數(shù)據(jù)交換中表現(xiàn)出的數(shù)據(jù)量小、效率相對較低和無損互轉(zhuǎn)的問題。從初步的實踐結(jié)果來看,3000平方公里左右的1:500地形圖直接輸出為*.gdb文件,然后編碼分層地在ArcMap軟件中查看,數(shù)據(jù)信息通暢、結(jié)構(gòu)完整。下一步,需進一步實現(xiàn)基于“EPS2020模板結(jié)構(gòu)”的GIS數(shù)據(jù)向EPS數(shù)據(jù)的轉(zhuǎn)換,從而完成EPS平臺與GIS平臺之間的無損互轉(zhuǎn)。
參考文獻
[1] 北京山維科技有限公司.EPS SDL開發(fā)入門與實戰(zhàn)2019版[EB/OL].[2023-01-01]. http://www.sunwaysurvey.com.cn/
[2] ESRI.File GeoDatabase API[EB/OL].[2023-01-01].https://github.com/Esri/file-geodatabase-api/.
[3] GDAL.ORG,GDALFileGDB Driver[EB/OL].[2023-01-01].https://gdal.org/drivers/vector/filegdb.html.
[4] 李凱,葉水全.GDAL 坐標轉(zhuǎn)換功能改寫[J]. 測繪與空間地理信息,2020,43(06):185-187.
[5] 重慶市勘測院.《1:500地形數(shù)據(jù)編繪技術(shù)要求》Q/CKC CH06-2021[Z].重慶:重慶市勘測院,2021.
作者單位:重慶市勘測院
責任編輯:張津平