羅海燕,何 潔
(湖南省第一測繪院,湖南 衡陽 421001)
?
CAD平臺下矢量數(shù)據(jù)建庫系統(tǒng)的設(shè)計與實現(xiàn)
羅海燕,何潔
(湖南省第一測繪院,湖南 衡陽 421001)
摘要:CAD平臺具有強大的矢量數(shù)據(jù)編輯能力與圖形表現(xiàn)能力,通過對其薄弱的空間分析能力和相關(guān)業(yè)務(wù)能力進行擴展,可以使其成為一個良好的矢量數(shù)據(jù)建庫系統(tǒng)。本文結(jié)合工作實際,探討、設(shè)計了其擴展的方法,并成功實現(xiàn)。
關(guān)鍵詞:CAD;矢量數(shù)據(jù)庫;擴展;GIS;設(shè)計與實現(xiàn)
以AutoCAD、Microstation等為代表的主流制圖平臺矢量圖形操作簡單,圖形編輯功能強大,并且體系結(jié)構(gòu)開放,同時具備強大的二次開發(fā)能力,這使得其在測繪地理信息行業(yè)數(shù)據(jù)采集過程中得到了廣泛運用。但由于缺乏空間參考系統(tǒng)與空間分析(主要是缺乏拓撲功能)、數(shù)據(jù)庫管理方面能力薄弱等原因,使得這些平臺在地理信息數(shù)據(jù)庫建設(shè)中的應(yīng)用受到制約。如果能夠通過二次開發(fā)對CAD平臺進行擴展,為其建立一套拓撲工具,并對其數(shù)據(jù)庫系統(tǒng)進行擴充,揚長避短,將極大地提高其在GIS領(lǐng)域的生命力。本文就如何擴充CAD平臺的空間分析與數(shù)據(jù)庫管理能力進行分析、設(shè)計與實現(xiàn)。
一、矢量數(shù)據(jù)建庫系統(tǒng)的基本需求及CAD平臺需要滿足的條件
1) 系統(tǒng)要能夠表現(xiàn)GIS的基本要素:點、線、面、體、注記,為了簡化系統(tǒng)處理,線要素不含曲線,且不考慮網(wǎng)狀要素。要求能夠方便對圖形數(shù)據(jù)進行輸入、修改與刪除,因此CAD平臺需要具備相應(yīng)的圖形元素來完成表現(xiàn)。
2) 系統(tǒng)具備一定的空間分析能力,能夠滿足建庫過程中各類圖形拓撲需要,主要實現(xiàn)基本的圖形運算:求交、求并、求差、求異、包含、覆蓋等,并在此基礎(chǔ)上進行靈活擴充。要求能夠?qū)崿F(xiàn)快速運算,時間復(fù)雜度不大于O(n)。
3) 系統(tǒng)具備一定的數(shù)據(jù)管理能力,能夠?qū)D形數(shù)據(jù)與屬性數(shù)據(jù)進行關(guān)聯(lián),并且方便進行錄入、修改、刪除、查詢等操作,同時能夠?qū)傩詳?shù)據(jù)與多種數(shù)據(jù)庫關(guān)聯(lián),如SQL Server、Access mdb數(shù)據(jù)庫等,同時能夠根據(jù)需要連接不同的數(shù)據(jù)庫。
4) 系統(tǒng)具備美觀、友好的UI界面。系統(tǒng)功能的擴展導(dǎo)致用戶界面的增加,因此還需要CAD平臺提供有UI開發(fā)接口。同時,新擴展的功能需要與用戶進行交互,這就需要視圖操作接口及圖形對象互動接口。
5) 系統(tǒng)能夠與主流的GIS平臺進行數(shù)據(jù)交換,交換后的圖形與數(shù)據(jù)庫經(jīng)直接或簡單映射即可使用。
經(jīng)過分析,目前應(yīng)用廣泛的AutoCAD、Microstation對條件1)、4)容易實現(xiàn),條件5)通過輸入輸出GIS平臺交換格式可滿足;而條件2)、3)實現(xiàn)困難,本文將重點闡述這兩點如何設(shè)計與實現(xiàn)。
二、選擇設(shè)計框架
良好的設(shè)計框架對成功實現(xiàn)軟件系統(tǒng)很重要。分析可知,該系統(tǒng)的目標是通過具備一定條件的CAD平臺表達GIS數(shù)據(jù),并實現(xiàn)功能的擴充。它與軟件工程中MVC框架非常類似,該模式如圖1所示。其中,View為視圖,Model為數(shù)據(jù)模型,Controller為控制器。如果將CAD平臺視為View,GIS數(shù)據(jù)模型或相關(guān)業(yè)務(wù)模型視為Model,那么需要建立的就是Controller。Controller的功能強弱決定了CAD數(shù)據(jù)對GIS數(shù)據(jù)的表達能力;同時,Controller與View、Model的耦合度決定了其適應(yīng)性,耦合度越低其依賴于某個CAD平臺或某個GIS數(shù)據(jù)模型的程度就越低。
三、概要設(shè)計
為了保證同一種控制器模型能為不同的CAD平臺使用,同時使得設(shè)計的軟件方便移植與維護,本文采用分層設(shè)計的方式,將CAD平臺視為一個抽象層,并在其與具體的功能實現(xiàn)間建立一個映射接口,使得CAD平臺與功能實現(xiàn)分離。同理,將具體的數(shù)據(jù)庫視為數(shù)據(jù)訪問層,在其與功能實現(xiàn)間設(shè)置一個數(shù)據(jù)接口,使得同一功能實現(xiàn)能很方便地在不同CAD平臺間移植,同時能從不同數(shù)據(jù)源獲取數(shù)據(jù)。設(shè)計概要如圖2所示。
圖1 MVC設(shè)計模式
圖2 分層架構(gòu)
四、詳細設(shè)計
GIS數(shù)據(jù)包括圖形要素與非圖形要素兩部分。圖形基本要素包括點、線、面、體,另外還存在一些復(fù)合業(yè)務(wù)要素,如地籍系統(tǒng)中的宗地要素等;其中體屬于三維對象,為了簡化系統(tǒng)暫不考慮該對象。非圖形要素一般可用數(shù)據(jù)表來呈現(xiàn)。該系統(tǒng)詳細設(shè)計的重點在于點、線、面、表這4類要素的表現(xiàn)與相關(guān)處理。
1. 基礎(chǔ)接口與實體類設(shè)計
為了統(tǒng)一表達空間對象,先設(shè)計幾何基礎(chǔ)接口IGeometry,再設(shè)計點、線、面3種空間對象接口,均繼承自IGeometry接口。另外,為了將圖形和相關(guān)屬性數(shù)據(jù)合成為一個整體要素,設(shè)計Feature類,它由空間對象接口IGeometry與數(shù)據(jù)訪問接口IDataAccess復(fù)合而成,要素實例的空間對象與相關(guān)屬性通過此類進行一致性操縱。為了對同一類型要素進行一致性管理,設(shè)計FeatureClass類統(tǒng)一維護Feature實例對象。實體類與基礎(chǔ)接口主要設(shè)計如圖3所示。
2. 數(shù)據(jù)表示層設(shè)計
數(shù)據(jù)表示層主要負責將GIS數(shù)據(jù)映射為CAD數(shù)據(jù)數(shù)據(jù),主要包括3方面:符號表達系統(tǒng)設(shè)計、圖形繪制系統(tǒng)設(shè)計、界面設(shè)計。這一層的設(shè)計與具體的CAD平臺相關(guān),并且已經(jīng)有許多成熟的實現(xiàn)方案,如南方CASS、GeoOne等軟件。
圖3 實體類與基礎(chǔ)接口主要部分
3. 業(yè)務(wù)功能接口及實現(xiàn)
系統(tǒng)需要擴展的業(yè)務(wù)功能實際需要與建庫過程具體需求有關(guān),現(xiàn)以基本業(yè)務(wù)功能的圖形拓撲運算為例進行說明。
(1) 業(yè)務(wù)功能接口設(shè)計
為了實現(xiàn)幾何對象的拓撲運算功能,首先定義業(yè)務(wù)功能接口ITopologyOperator,如圖4所示。
圖4 業(yè)務(wù)功能接口ITopologyOperator
(2) 業(yè)務(wù)功能的實現(xiàn)
業(yè)務(wù)功能的實現(xiàn)有兩種方式:一是在基礎(chǔ)接口和實體類的基礎(chǔ)上定義新的功能類來實現(xiàn)IToplogyOperator接口;二是在目標CAD平臺上包裝現(xiàn)有實體對象實現(xiàn)IToplogyOperator接口。前者需要自行實現(xiàn)空間對象點、線、面基本圖形運算;后者可以利用目標平臺本身提供的基本圖形運算API。現(xiàn)以在AutoCAD平臺中使用C#實現(xiàn)IPolyline接口中IToplogyOperator的IntersectOperater操作為實例來說明拓撲運算功能的具體實現(xiàn):
public class TPolyline:IPolyline
{
internal Polyline m_pline = null;
…
∥IToplogyOperator中的IntersectOperater接口實現(xiàn)
public IGeometry[] IntectOperater(IGeometry geo)
{
if (geo is TPolyline)
return getIntersect((TPolyline)geo);
else if (geo is TGeoPoint)
return getIntersect ((TGeoPoint)geo);
else if (geo is TPolygon)
return getIntersect ((TPolygon)geo);
else
return geo.IntectOperater(this);
}
與多段線交集運算
需與本體進行交叉運算的多段線
private IGeometry[] getIntersect (TPolyline pline)
{
Point3dCollection pts = new Point3dCollection();
m_pline.IntersectWith(pline.m_pline, Intersect.OnBothOperands, new Plane(), pts, 0, 0);
if (pts.Count == 0)
return null;
List
foreach (Point3d pt in pts)
{
if (pt.DistanceTo(m_pline.GetClosestPointTo(pt, false)) < m_Tolerance &&
pt.DistanceTo(pline.m_pline.GetClosestPointTo(pt, false)) < m_Tolerance)
realIntectPts.Add(new TGeoPoint(pt.X,pt.Y,pt.Z));
}
return realIntectPts.ToArray();
}
…
}
在客戶端調(diào)用函數(shù):IGeometry[] geoAry=pline. IntectOperater(otherPline),即可進行多段線求交集操作,達到業(yè)務(wù)功能的實現(xiàn)。
對于其他類似的業(yè)務(wù)功能,只要先定義相應(yīng)的業(yè)務(wù)功能接口,然后在不同的CAD平臺進行實現(xiàn),就可以很方便地進行業(yè)務(wù)功能的移植和擴展。如可以將空間索引作為一個業(yè)務(wù)功能進行擴展,為不同CAD平臺提供空間索引服務(wù),使得大數(shù)據(jù)量的空間計算可以快速進行。
4. 數(shù)據(jù)訪問接口設(shè)計
數(shù)據(jù)訪問接口主要負責圖形屬性數(shù)據(jù)的訪問操作,因此需要讀、寫、刪除和查詢功能。根據(jù)需要定義IDataTable接口,通過在數(shù)據(jù)層中具體實現(xiàn)該接口,可以方便擴展對各類數(shù)據(jù)庫的操作,這樣通過在數(shù)據(jù)層中的不同實現(xiàn),使得建庫系統(tǒng)既可以用CAD平臺的內(nèi)置數(shù)據(jù)庫,又可以實現(xiàn)使用各種通用數(shù)據(jù)庫,甚至可以實現(xiàn)自定義的數(shù)據(jù)表。如圖5所示。
5. 數(shù)據(jù)層實現(xiàn)
為了能使建庫系統(tǒng)具備對空間數(shù)據(jù)相關(guān)的屬性數(shù)據(jù)訪問能力,必須針對相應(yīng)的數(shù)據(jù)庫實現(xiàn)具體的數(shù)據(jù)接口,現(xiàn)以C#語言封裝OLEDB組件實現(xiàn)IDataTable接口來說明實現(xiàn)方法。
圖5 數(shù)據(jù)訪問接口族主要部分
public class OLEDBDataTable:IDataTable
{
const string connectionString ="provider=Microsoft.JET.OLEDB.4.0;" +
"data source=";
SD.IDataAdapter m_dataAdapter = null;
SD.DataTable m_sdTable = null;
public AccessMdbDataTable(string dbName, string tableName)
{
SD.IDataAdapter dataAdapter = new OleDbDataAdapter(
string.Format("Select*From{0}", tableName), connectionString + dbName);
SD.DataSet dataset = null;
dataAdapter.Fill(dataset);
dataAdapter.FillSchema(dataset, SD.SchemaType.Mapped);
m_sdTable = dataset.Tables[tableName];
}
public DataOperationMessage GetData(Identify id,IField field,out object value)
{
SD.DataView dv = new SD.DataView(m_sdTable);
dv.RowFilter = id.value;
value = null;
if(dv.Count > 0)
return new DataOperationMessage(DataOperationResultEnum.GetFailed,"指定id不唯一");
else if(dv.Count == 0)
return new DataOperationMessage(DataOperationResultEnum.GetFailed,"指定id無記錄");
try{
value = dv[0][field.GetFieldName()];
}catch(Exception e){
return new DataOperationMessage(DataOperationResultEnum.GetFailed,
"字段" + field.GetFieldName() + "獲取失敗:" + e.Message);
}
return new DataOperationMessage(DataOperationResultEnum.SUCCESS,"");
}
public DataOperationMessage SetData(Identify id,IField field,object value)
{略}
public DataOperationMessage EraseData(Identify id)
{略}
public DataOperationMessage ListField(out IField[] fields)
{略}
}
以上代碼實現(xiàn)對OLEDB組件的包裝并實現(xiàn)IDataTable接口。同樣的,通過對CAD平臺內(nèi)置數(shù)據(jù)庫的包裝并實現(xiàn)IDataTable接口,便可在業(yè)務(wù)功能中使用IDataTable接口獲取不同數(shù)據(jù)庫的無區(qū)別一致性訪問,使得業(yè)務(wù)功能與具體的數(shù)據(jù)庫及CAD平臺無關(guān)。
五、實施案例
完成矢量建庫系統(tǒng)的各項單元及集成測試后,便可以對具體的業(yè)務(wù)項目進行定制。2014年通過對本系統(tǒng)的擴展,在AutoCAD 2007平臺上成功開發(fā)了湖南省農(nóng)村土地集體土地調(diào)查軟件。該軟件除具備常規(guī)的圖形繪制、屬性錄入管理功能外,還有如下功能:
1) 以空間拓撲及運算擴展庫為基礎(chǔ),實現(xiàn)了對權(quán)屬圖斑的空間拓撲檢查、自動構(gòu)面、空間對象邏輯性檢查、四至自動填寫、圖形自動編號等業(yè)務(wù)功能。
2) 以對空間對象與相關(guān)屬性數(shù)據(jù)的包裝為基礎(chǔ),實現(xiàn)了各類權(quán)屬要素及相關(guān)要素(地塊、界址點線、圖斑等)的集成管理,通過對CAD平臺內(nèi)置數(shù)據(jù)庫與mdb數(shù)據(jù)庫的包裝實現(xiàn)了一致性訪問,除可以非常容易地對各類空間對象屬性與非空間屬性進行操作外,還實現(xiàn)了各類屬性及屬性間的約束性檢查、類型檢查及邏輯一致性檢查等業(yè)務(wù)功能。
3) 以空間實體、屬性接口與實體類為基礎(chǔ),實現(xiàn)了SHP格式的數(shù)據(jù)交換業(yè)務(wù)功能(根據(jù)需要也可以很容易實現(xiàn)其他類型的數(shù)據(jù)交換格式擴展)。
4) 基于數(shù)據(jù)接口提供了各類報表的輸出功能等。整個軟件系統(tǒng)通過將邏輯與實現(xiàn)分離,使得程序易于維護、擴展與移植,如對于Microstation用戶,可以在不改動業(yè)務(wù)功能代碼的情況下,通過將表示層重寫,并對內(nèi)置數(shù)據(jù)庫進行重包裝,實現(xiàn)對數(shù)據(jù)接口層的移植,移植的工作量大為減少。同樣的,對于不同業(yè)務(wù)需求,只需要定義業(yè)務(wù)功能接口并實現(xiàn)后即可重用數(shù)據(jù)訪問層、表示層。
六、結(jié)束語
本文展示了一種將CAD平臺擴展為矢量建庫系統(tǒng)的方法,該方法改造的建庫系統(tǒng)繼承了CAD本身強大的圖形編輯與擴展能力,并在此基礎(chǔ)上擴展了該建庫系統(tǒng)的空間分析與屬性管理能力。筆者組織開發(fā)的湖南省農(nóng)村土地權(quán)屬調(diào)查軟件集數(shù)據(jù)的前端采集與后期圖形屬性建庫能力于一體,在湖南省農(nóng)村土地所有權(quán)與經(jīng)營權(quán)確權(quán)項目實施過程中發(fā)揮了重要作用,取得了良好的社會效益與經(jīng)濟效益,受到了省內(nèi)使用單位的廣泛好評。
參考文獻:
[1]王要沛,賀學(xué)文,賈復(fù)生. 基于AutoCAD.NET平臺下的C#語言開發(fā)測量軟件技術(shù)[J].測繪與空間地理信息,2013,36(7):243-245.
[2]索俊鋒,趙軍. 基于MicroStation的地籍測量系統(tǒng)的設(shè)計與實現(xiàn)[J].測繪科學(xué),2006(5):113-114.
[3]劉仁峰,艾馳,聶智龍,等. 基于AutoCAD數(shù)據(jù)采編平臺開發(fā)與實現(xiàn)[J].測繪地理信息,2013,38(2):76-78.
[4]胡慶武,陳亞男,周洋,等. 開源GIS進展及其典型應(yīng)用研究[J] .地理信息世界,2009(1):46-55.
[5]張林.軟件工程[M].北京:中國鐵道出版社,2009:35-38.
[6]曾洪飛,盧擇臨,張帆.AutoCADVBA&VB.NET開發(fā)基礎(chǔ)與實例教[M]. 北京:中國電力出版社,2013:245-257.
[7]王珂珂,張立朝,寇靜行,等. 空間位置驅(qū)動的地理信息系統(tǒng)軟件集成[J].測繪通報,2009(12):49-52.
[8]郭慶勝,馬瀟雅,王琳,等. 基于插件技術(shù)的地理信息時空分布與變化特征提取系統(tǒng)的設(shè)計與實現(xiàn)[J].測繪通報,2013(4):18-20.
Design and Realization of Vector Database Construction Based on CAD Platform
LUO Haiyan,HE Jie
收稿日期:2015-07-15; 修回日期: 2015-11-03
作者簡介:羅海燕(1968—),男,碩士,高級工程師,主要從事地理信息系統(tǒng)研究與軟件開發(fā)工作。E-mail:hnhy_lhy@163.com
中圖分類號:P208
文獻標識碼:B
文章編號:0494-0911(2016)06-0105-04
引文格式: 羅海燕,何潔. CAD平臺下矢量數(shù)據(jù)建庫系統(tǒng)的設(shè)計與實現(xiàn)[J].測繪通報,2016(6):105-108.DOI:10.13474/j.cnki.11-2246.2016.0202.