1地理信息系統(tǒng)的發(fā)展
地理信息系統(tǒng)(GIS:Geographic Information System)作為一門綜合性的技術(shù),是一種對(duì)空間數(shù)據(jù)進(jìn)行采集、存儲(chǔ)、更新、分析、輸出等處理的工具,而軟件是其核心內(nèi)容之一。GIS技術(shù)的發(fā)展,在軟件模式上經(jīng)歷了功能模塊、包式軟件、核心式軟件,從而發(fā)展到組件式GIS和WebGIS的過程。傳統(tǒng)GIS雖然在功能上已經(jīng)比較成熟,但是由于這些系統(tǒng)多是基于十多年前的軟件技術(shù)開發(fā)的,屬于獨(dú)立封閉的系統(tǒng)。同時(shí),GIS軟件變得日益龐大,用戶難以掌握,費(fèi)用昂貴,阻礙了GIS的普及和應(yīng)用。組件式GIS的出現(xiàn)為傳統(tǒng)GIS面臨的多種問題提供了全新的解決思路。
2 組件式GIS
2.1 組件式GIS的基本思想及特點(diǎn)
組件式GIS(Components GIS,以下簡(jiǎn)稱ComGIS)是指基于組件對(duì)象平臺(tái),具有標(biāo)準(zhǔn)的接口,允許跨語言應(yīng)用,因而使GIS軟件的可配置性、可擴(kuò)展性和開放性更強(qiáng),使用更靈活,二次開發(fā)更方便。其基本思想是把GIS的各大功能模塊劃分為幾個(gè)控件,每個(gè)控件完成不同的功能。各個(gè)GIS控件之間,以及GIS控件與其它非GIS控件之間,可以方便地通過可視化的軟件開發(fā)工具集成起來,形成最終的GIS應(yīng)用。
把GIS的功能適當(dāng)抽象,以組件形式供開發(fā)者使用,將會(huì)帶來許多傳統(tǒng)GIS工具無法比擬的優(yōu)點(diǎn)。主要優(yōu)點(diǎn):
(1)小巧靈活、價(jià)格適中,性價(jià)比高;
(2)無須利用專門GIS開發(fā)語言,可直接嵌入MIS開發(fā)工具進(jìn)行開發(fā);
(3)可以實(shí)現(xiàn)強(qiáng)大的GIS功能;
(4)開發(fā)更簡(jiǎn)捷,代碼實(shí)現(xiàn)簡(jiǎn)易。
2.2 目前流行的組件式GIS軟件平臺(tái)
目前應(yīng)用比較廣泛的是:MapInfo開發(fā)的MapX以及ERIS公司開發(fā)的MapObjects。下面將重點(diǎn)對(duì)利用MapInfo公司開發(fā)的MapX進(jìn)行GIS軟件開發(fā)特點(diǎn)以及主要過程進(jìn)行分析。
MapX是具有強(qiáng)大地圖分析功能的ActiveX控件產(chǎn)品,能支持絕大多數(shù)標(biāo)準(zhǔn)的可視化開發(fā)環(huán)境如Visual C++、VisualBasic、Delphi、PowerBuilder等。編程人員在開發(fā)過程中可以選用自己最熟悉的開發(fā)語言,輕松地將地圖功能嵌入到應(yīng)用中,并且可以脫離MapInfo的軟件平臺(tái)運(yùn)行。MapX提供了各種工具、屬性和方法,熟練的運(yùn)用這些工具、屬性、方法通過編程可以滿足不同開發(fā)需求。
用MapX開發(fā)ComGIS系統(tǒng)的基本方法如下圖1示:
2.3 MapX簡(jiǎn)介
2.3.1 MapX的數(shù)據(jù)組織
MapX中的數(shù)據(jù)分為空間數(shù)據(jù)和屬性數(shù)據(jù).其中圖形矢量數(shù)據(jù)以MapInfo標(biāo)準(zhǔn)文件格式.tab存貯和管理,屬性數(shù)據(jù)用關(guān)系數(shù)據(jù)庫進(jìn)行管理,屬性數(shù)據(jù)和空間數(shù)據(jù)之間通過目標(biāo)標(biāo)識(shí)進(jìn)行關(guān)聯(lián)。空間數(shù)據(jù)在MapX控件中采用分層存放的結(jié)構(gòu),每張單獨(dú)的地圖被表示成一個(gè)圖層,每個(gè)圖層存儲(chǔ)為4個(gè)基本文件:屬性數(shù)據(jù)的表結(jié)構(gòu)文件.tab,屬性數(shù)據(jù)文件.dat,交叉索引文件.id,空間數(shù)據(jù)文件.map. 這種分層存放的結(jié)構(gòu),可以提高圖形的搜索速度,便于各種不同數(shù)據(jù)的靈活調(diào)用、更新和管理。屬性數(shù)據(jù)是用來反映與空間實(shí)體相對(duì)應(yīng)的屬性,在系統(tǒng)中用關(guān)系數(shù)據(jù)庫的二維關(guān)系表進(jìn)行存儲(chǔ)和管理。
2.3.2 MapX的模型結(jié)構(gòu)
MapX組件的基本組成單元是Object(單個(gè)對(duì)象)和Collection(集合)。其中集合包括對(duì)象,是多個(gè)對(duì)象的組合。每種對(duì)象和集合負(fù)責(zé)處理地圖某一方面的功能.位于頂層的是Map對(duì)象,Layers、DataSets、Annotations是Map對(duì)象下面的3個(gè)重要的分支。其中Layer主要用于操作地圖的圖層,DataSet用于實(shí)現(xiàn)地圖與數(shù)據(jù)的綁定,訪問空間數(shù)據(jù)表,Annotation用于在地圖上增加文本或者符號(hào)。
3 利用VB,MapX,SQL開發(fā)ComGIS系統(tǒng)
結(jié)合筆者所開發(fā)的一個(gè)電力地理信息系統(tǒng)來看如何開發(fā)ComGIS系統(tǒng)。
3.1 編輯功能實(shí)現(xiàn)
?屬性數(shù)據(jù)的編輯
包括對(duì)高壓線路,配電線路,電力電纜線路,變電站,配電變壓器,道路,建筑物,行政區(qū)域等屬性數(shù)據(jù)庫表的錄入與修改。可采用SQL Server等關(guān)系數(shù)據(jù)庫來存儲(chǔ),這樣便于數(shù)據(jù)的維護(hù)和共享使用。
?圖形數(shù)據(jù)的編輯
包括對(duì)圖形對(duì)象點(diǎn),線,面錄入與修改,以及對(duì)其風(fēng)格進(jìn)行編輯。
GeoSet是在Geo Manager中建立好的GST文件,是圖層及其設(shè)置的集合,控制程序中顯示的地圖,對(duì)圖層進(jìn)行編輯和管理.通過對(duì)GeoSet屬性賦值可方便的引入所需的地圖集,并在引入的同時(shí)對(duì)Map對(duì)象初始化。
Map1.GetSet=opendialog1.filename // 從地圖文件夾中引入地圖
對(duì)于由圖層組織起來的MapX地圖,可通過對(duì)圖層的創(chuàng)建、增加、刪除、移動(dòng)、縮放等來編輯,還可以創(chuàng)建用于實(shí)時(shí)跟蹤的活動(dòng)圖層和可繪制特殊圖形的用戶自定義圖層。
Set lyrMyLayer=Map1.Layers.CreateLayer("MyLayer", , 1) // 新創(chuàng)建一個(gè)圖層
Set Map1.Layers.AnimationLayer=lyrMyLayer // 將新建的圖層設(shè)置為活動(dòng)圖層
通過MapX提供給用戶的一些通用工具,對(duì)Map對(duì)象的Current Tool屬性賦值,可方便的實(shí)現(xiàn)一些諸如放大、縮小、漫游等多種GIS基本操作功能。還可以使用自定義工具來增強(qiáng)這方面的功能。
Map1.ZoomTo(x1,y1,x2,y2); // 將地圖窗口縮放到某一特定位置
Map1.Rotation=45; // 將當(dāng)前地圖窗口旋轉(zhuǎn)45度
Map1.CurrentTool=miPanTool; // 實(shí)現(xiàn)地圖漫游
Map1.CurrentTool=miLableTool; // 指定位置加標(biāo)注
Map1.CreateCustomTool MyTool,miToolTypeLine,miSizeAllCursor // 創(chuàng)建標(biāo)尺工具
MapX提供了四種類型的Feature對(duì)象:區(qū)域、點(diǎn)、線、文本可通過訪問、修改、刪除及自定義feature對(duì)象的各種屬性來實(shí)現(xiàn)對(duì)地圖的編輯。
Dim f As MapXLib.Feature
Dim ps As MapXLib.Points
ps.AddXY x1,y1
ps.AddXY x2,y2 // 畫線
Setf=Map1.Layers(1).AddFeature(Map1.FeatureFactory.CreateLine(ps,Map1.DefaultStyle))
3.2 查詢功能實(shí)現(xiàn)
MapX以Dataset對(duì)象提供的方法進(jìn)行數(shù)據(jù)綁定,實(shí)現(xiàn)與數(shù)據(jù)庫交互,從而實(shí)現(xiàn)對(duì)圖形的屬性信息查詢或通過屬性信息查詢空間目標(biāo)。對(duì)于設(shè)備等的信息管理,可根據(jù)圖庫數(shù)據(jù)一致性對(duì)圖形和屬性進(jìn)行空間查詢。
數(shù)據(jù)綁定: Dim parm As New ODBCQueryInfo
parm.SqlQuery = "select * from 數(shù)據(jù)表名"
parm.DataSource = "數(shù)據(jù)庫名 " // ODBC數(shù)據(jù)源名字
parm.ConnectString = "ODBC; "
Set ds = Map.Datasets.Add(miDataSetODBC, parm)
區(qū)域查詢:可查詢?nèi)魏我粋€(gè)區(qū)域圖元中編輯圖層在該區(qū)域中的圖元數(shù),既可實(shí)時(shí)顯示某一范圍內(nèi)的各種需要的地理信息,又可通過這種方式來判斷地理元素之間的相對(duì)位置及關(guān)系,從而進(jìn)一步分析基于地理接線圖的空間連接關(guān)系,實(shí)現(xiàn)網(wǎng)絡(luò)分析,跟蹤和動(dòng)態(tài)著色。
//查詢編輯圖層上矩形區(qū)域內(nèi)圖元
Dim rect As MapXLib.Rectangle
Dim curFeatures As MapXLib.Features
rect.set(x1,y1,x2,y2)
Set curFeatures = searchLayer.SearchWithinRectangle(rect,searchType)
查找定位:確定查找圖層,找到匹配圖元并將地圖放大,查找結(jié)果定位到地圖中央。
Dim FindObj As MapXLib.Find //據(jù)數(shù)據(jù)庫中的字段值進(jìn)行查找定位
Dim FoundFeature As FindFeature
Set FindObj = Map1.Layers("圖層名稱").Find
Set FindObj.FindDataset = Map1.Datasets("圖層名稱"&"dataset")
Set FindObj.FindField = FindObj.FindDataset.Fields("域名")
Set FoundFeature = FindObj.Search ("域值")
If (FoundFeature.FindRC Mod 10 = 1) Then
Map1.Zoom To 縮放值, FoundFeature.CenterX, FoundFeature.CenterY
3.3 分析功能實(shí)現(xiàn)
?地理運(yùn)算
測(cè)量?jī)蓚€(gè)地理對(duì)象間的直線、折線距離等地理運(yùn)算,需要注意的是鼠標(biāo)在MapX組件中截獲的點(diǎn)的坐標(biāo)是屏幕坐標(biāo),而在計(jì)算中我們往往是使用MapX中的地理坐標(biāo)系,所以坐標(biāo)轉(zhuǎn)換是經(jīng)常而且必要的步驟。Map1.CreateCustomTool (CUSTOM_MEASURE_TOOL,miToolTypeLine,miCrossCursor,miArrowCursor,
miArrowCursor,unusedParam)//自定義客戶工具
Private Sub Form_MouseMove (Button As Integer,Shift As Integer, X As Single, Y As Single)
……
If Map1.CurrentTool=CUSTOM_MEATURE_TOOL Then
Map1.ConvertCoord x1, y1, Coordx1,Coordy1, miScreenToMap
distance=Map1.Distance(XDown,YDown,Coordx1,Coordy1) // 對(duì)兩點(diǎn)距離進(jìn)行計(jì)算
End If
End Sub
?空間分析
系統(tǒng)支持空間對(duì)象的緩沖區(qū)分析及多種專題圖分析(范圍值專題圖、獨(dú)立值專題圖、點(diǎn)密度專題圖、等級(jí)符號(hào)專題圖、直方圖專題圖、餅圖專題圖)。可根據(jù)數(shù)據(jù)庫中不同字段生成相應(yīng)專題圖,通過選擇不同的專題圖種類,得到各種直觀的專題圖信息。
Dataset.Themes.Add (專題圖類型,字段名,專題圖名稱)
Legend對(duì)象用于修改專題地圖的圖例;Themeproperties用于修改專題圖的顯示屬性.還可利用專題圖來動(dòng)態(tài)顯示帶電區(qū)、停電區(qū)和恢復(fù)路徑,基于某一屬性可表達(dá)出不同的區(qū)域及線對(duì)象。
3.4 地圖導(dǎo)出的實(shí)現(xiàn)
MapX以矢量化的形式,將地圖對(duì)象存儲(chǔ)在地圖文件,只有在安裝了MapX或Mapinfo相應(yīng)產(chǎn)品的客戶機(jī)上才能夠顯示地圖,而利用MapX提供的導(dǎo)出功能,將地圖對(duì)象轉(zhuǎn)換成BMP等標(biāo)準(zhǔn)的光柵圖形格式,就可供其他應(yīng)用程序使用了。
Map1.ExportMap(Location,Format,[W],[H]) Location:導(dǎo)出后的光柵圖像文件名
Format:導(dǎo)出時(shí)的格式
[W]:導(dǎo)出時(shí)的橫向放大倍數(shù) [H]:導(dǎo)出時(shí)的縱向放大倍數(shù)
Map1.ExportMap("c:\pincture\pic1.jpg",miFormatJPEG,2,2),則將當(dāng)前地圖導(dǎo)出到c:\picture\pic1.jpg文件中,并將地圖縱,橫同時(shí)放大為原來的兩倍
4 結(jié)束語
在實(shí)際的開發(fā)過程中可以根據(jù)具體的需要來選擇開發(fā)方式。筆者利用MapX和VB,SQL實(shí)現(xiàn)的電力GIS系統(tǒng),不僅開發(fā)周期短,而且系統(tǒng)運(yùn)行穩(wěn)定,具有很好的可擴(kuò)充性。相信隨著GIS技術(shù)的發(fā)展以及市場(chǎng)需求不斷增加,組件式GIS技術(shù)會(huì)得到更廣泛的應(yīng)用。