李 哲, 姜占華+, 秦 俊, 余雪崗, 曲良東
(1.吉林大學計算機科學與技術學院,吉林長春130012;2.吉林大學符號計算與知識工程教育部重點實驗室,吉林長春130012)
地理信息系統(geographic information system,GIS)應用涉及很廣,例如交通、軍事等許多領域,人們已經不滿足單機操作的GIS系統,要求進行信息的交流[1]。如何實現在線電子地圖傳輸,是實現GIS信息交流的核心問題之一。目前國內外對在線電子地圖傳輸有一定研究成果,Buttenfield于2002年提出了一種傳輸單層矢量數據的方法,由于該方法只能處理簡單曲線,所以該方法局限性很大。Bisheng Yang于2005年提出了一種用于電子地圖數據傳輸的方法,但該算法的時間效率不高[2]。由于目前的研究,時間效率都不是很高,針對此問題筆者提出一種基于數據庫預處理的在線電子地圖傳輸方法。
如圖1所示,本系統主要包括兩部分:電子地圖數據庫系統和多線程數據傳輸服務器。
(1)電子地圖數據庫系統:將電子地圖以二進制數據的形式存入數據庫,數據包括電子地圖圖元的經緯度坐標、圖元的屬性信息和圖元的標注信息等。
(2)多線程數據傳輸服務器:接收和解析客戶端請求[3],服務器根據請求從數據庫提取數據傳輸給客戶端。

圖1 系統總體結構
電子地圖數據庫系統預處理的電子地圖是Mapinfo格式的電子地圖。這種格式的電子地圖是由多個透明的圖層疊加到一起的。每個圖層包含了整個電子地圖的一個不同方面。例如:第一個圖層包含國道,第二個圖層包含省道等等,把它們疊加到一起就形成一幅完整的電子地圖[4]。在創建圖層時,都要為其建立一張表,使表與電子地圖建立起聯系。每個表包含兩部分:地圖信息和屬性信息。
電子地圖預處理采用的數據庫為SQL Server 2000。根據Mapinfo的MIF電子地圖公開格式,電子地圖的圖元數據信息包括:圖元的經緯度坐標、圖元的屬性(圖元的樣式、顏色等)、圖元標注信息也就是圖元的名稱、圖元標注信息的屬性(標注的顏色、傾斜角等)。系統將整張電子地圖分成多個塊,每塊為300m*300m。將該塊內的圖元數據信息提取出來,按照自定義協議將數據轉化成二進制存儲到數據庫里。電子地圖數據按照協議存儲,服務器向客戶發送電子地圖數據時直接從數據庫里讀出數據傳輸給客戶,不需要再進行協議轉化,節省處理時間。數據庫表字段定義如表1和表2所示。

表1 MapSummary(電子地圖塊集合)

表2 MapDataNum(電子地圖數據信息集合)
表1存儲的是電子地圖分塊的一些屬性信息。表2存儲的是電子地圖分塊內的圖元數據信息,如果圖元僅有部分內容在某一分塊內,存儲的信息則只包括在該分塊內的信息。電子地圖數據信息在數據庫里以二進制形式存儲,這樣存儲的原因是:電子地圖數據里有些信息是無法以單字節形式存儲的,例如-10,在單字符存儲時顯示為問號。當我們存入數據庫時,數據庫顯示為問號,從數據庫讀出來時如果不經過轉化也就成了問號,而轉化數據需要花費比較多的時間,所以選擇不進行轉化而是將字符數組里的圖元信息轉化成二進制的形式直接存到數據庫里,這樣讀出來就以二進制數據進行傳輸而不會發生解析錯誤。
本協議基于TCP協議設計,因此,數據傳輸基本上認為是可靠的了。在應用層的協議設計過程中不再考慮可靠性問題。具體電子地圖傳輸協議如下所示:

type標識,一個字節長,可以表示0~255,取3位數,個位、十位和百位賦予不同的含義。
type的個位:0表示一個圖層或地圖數據傳輸完畢;1表示傳輸數據類型為點圖元;2表示傳輸數據類型為直線圖元;3表示傳輸數據類型為折線圖元;4表示傳輸數據類型為區域圖元。
type的十位:0表示一個圖層傳完;1表示一個圖層正在傳送;2表示新傳一個圖層。
type的百位:0表示電子地圖傳完;1表示一個電子地圖正在傳送中;2表示新傳電子地圖。
len兩個字節長,數據長度,表示數據的總長度為trilen的長度+dataxy的長度+propertydata的長度。
trilen兩個字節長,屬性數據的長度。
dataxy四個字節長,表示坐標,是由圖元的經緯度坐標轉化而得到的平面坐標,可以有多個坐標。
propertydata兩個字節長,表示屬性數據,例如圖元的名稱等。
本系統采用的軟件平臺為:MapX控件、VisualStudio2005和SQL Server 2000。MapX提供快速、易用、功能強大的電子地圖化組件,只需要設計階段將MapX控件加載到Visual Studio 2005,就可以對其編程,操作方便、簡單[5]。
在VisualStudio2005里把MapX控件加載到項目里,這樣我們就可以調用MapX里的函數對電子地圖進行操作。通過調用MapX函數可以讀出圖元數據信息,其中圖元的經緯度坐標需要轉化成平面坐標,經緯度坐標為double類型,轉化成unsignedshort類型,減少了存儲數據量,可以提高傳輸效率[6]。將數據信息按照協議存儲到字符數組里,之后將字符數組存儲的數據轉化成二進制形式存儲數據庫里。
下面主要介紹電子地圖圖元數據信息提取存入數據庫的流程,如圖2所示:
(1)取出地圖起始點(xs,ys)和終點(xe,ye)經緯度坐標,令x1=xs,y1=ys。
(2)以(x1,y1)為起始點計算出大于x1且距x1為300m處的經度坐標設為x2,同理計算出緯度坐標為y2,(x1,y1)、(x2,y2)就構成了一個300m*300m的矩形,設為矩形A。
(3)選擇圖層,選擇矩形A區域內的所有圖元,包括任何部分在區域內的圖元,得到一個圖元集合。
(4)綁定數據源,使圖層與屬性數據庫建立一個索引關系,通過圖層里的圖元,就可以讀出圖元所對應該的屬性信息。畫一個和矩形A一樣經緯度的矩形圖元。
(5)從圖元集合中取出一個圖元,判斷是否為點圖元,如果不是,則求這個圖元與新畫矩形圖元的交集,并返回這個交集,其實是一個新圖元,如果是點圖元,什么也不操作。
(6)把由步驟(5)得到的圖元的數據信息按協議放到緩沖區里,經緯度坐標需要轉化成平面坐標,并判斷圖元集合內的全部圖元數據信息是否放到緩沖區里,如果不是則跳到步驟(5)。
(7)刪除在步驟(4)畫的矩形圖元。把緩沖區里的信息轉化成二進制形式,之后把相應的信息存入數據庫里。
(8)x1=x2,x1是否大于xe,如果不大于則轉步驟(2)。
(9)y1=y2,y1是否大于ye,如果不大于則轉步驟(2),否則結束。

圖2 地圖數據存入數據庫系統流程
線圖元和區域圖元很有可能與新畫矩形圖元部分相交。如圖3所示,區域圖元A與矩形1和2都部分相交,如果矩形1存儲圖元A的信息,矩形2也存儲了圖元A的信息,圖元A的信息被重復存儲,有的區域圖元面積很大,可能跨越很多矩形塊,由于存在大量重復圖元信息,傳輸時間會加長,所以將圖元分割,只存儲圖元在矩形內的部分。因此需要求圖元的交集,求圖元的交集調用MapX控件里函數。
[Feature=]OBJECT.IntersectFeatures(feature1[feature2])函數。此方法取Feature或Features對象和另一個Feature或Features對象的交集,返回的結果對象作為獨立的圖元。在求圖元交集時,遵循如下規則:
(1)如果區域重疊,則由此返回的圖元也是區域;
(2)區域覆蓋了線的一部分,則交集是由該區域覆蓋的線的一部分,返回的圖元為線圖元。

圖3 圖元相交
(3)如果兩個圖元相交于一點,如圖3中矩形圖元1和線圖元B,返回的圖元為線圖元,但是只有一組坐標點,也就相交點的經緯度坐標,線圖元至少有兩組坐標點,這樣我們認為這是一個非法圖元,對于這樣的圖元我們需要添加缺失的坐標點[7]。對于只有一個交點的兩個圖元求交,如果返回線圖元則補齊一組和交點一樣的經緯度坐標,如果返回區域圖元則補齊3組和交點一樣的經緯度坐標。
傳輸系統主要是從數據庫里讀出電子地圖的二進制數據,直接發送發客戶端。具體如圖4所示:
(1)由于電子地圖數據在傳送過程中要保證數據完整性,如果數據丟失客戶端將無法解析,所以采用TCP協議,這樣能保證數據的完整。首先創建SOCKET。
(2)當客戶端連接服務器時,電子地圖服務器產生一個子線程,在子線程里打開數據庫。
(3)接收客戶端數據,按照協議解析數據。
(4)如果是初始化電子地圖,需要傳送81小塊電子地圖,也就是9大塊電子地圖,每一大塊電子地圖為900m*900m。根據客戶端傳送汽車坐標來定位電子地圖塊號,再以這塊為中心,根據塊號來計算出它周圍的80塊的塊號,把這81塊地圖數據從數據庫中取出傳送給客戶端以畫出電子地圖,這81塊的范圍為2700m*2700m。如果是更新電子地圖則同理算出9小塊地圖傳送給客戶端。之后跳到步驟(2)等待接收客戶端數據。

圖4 多線程數據傳輸系統流程
實驗環境的搭建主要有兩臺PC機,它們都安裝了Windows XP。硬件配置:CPU:Interl? Core?2 Dou CPU E7500,主頻:2.93GHz,內存:2G。
如表 3所示,第 2行到第 9行每一行表示 9塊面積300m*300m電子地圖(相當于一塊900m*900m)的數據量、傳輸時間及由此得出的傳輸效率,第10行表示這8次傳輸的總數據量、總傳輸時間和平均傳輸效率。由于采用了基于數據庫預處理方法,傳輸時間主要集中在讀取數據庫表,所以數據庫的設計直接影響傳輸時間,而與電子地圖本身基本無關。

表3 預取時間測試結果
目前在線電子地圖傳輸主要有兩種方式:方法1,是把Mapinfo的.DAT格式電子地圖轉化為.MIF,.DAT電子地圖格式是不公開的,所以有些電子地圖信息我們是得不到的,而.MIF電子地圖格式是公開的,通過這種格式我們可以得到我們想要的一些電子地圖信息[8]。方法2,是直接從Mapinfo電子地圖里讀出圖元數據信息傳送給客戶端。如表4所示:對于這兩種方法我做了一下時間測試,這兩種方我提取圖元的數據信息是相同的,所以傳輸數據量是一樣的。第2行到第9行每一行表示地圖面積為900m*900m的數據量、傳輸時間及由此得出的傳輸效率,電子地圖經緯度范圍與表3對應行地圖的經緯度范圍相同,因為表3把面積為900m*900m的地圖又分割成9塊,每塊面積為300m*300m,所以數據量是不同的,分割電子地圖調用求圖元交集函數時添加一些坐標和產生一部分新圖元,數據量有所增加。由表3、表4比較可知,本文所寫的方法雖然存儲數據量有所增加,但其平均預取數據效率大約是方法1的700倍,是方法2的130倍。

表4 傳統方法預取時間測試結果
從實驗結果來看,與傳統方法相比較,該方法有更好的性能,更高的數據提取效率,在保證了傳輸的實時性的前提下,提高了在線電子地圖的傳輸效率。
本文提出的基于數據庫預處理的在線電子地圖數據庫存儲方法,與前人方法對比,時間效率有明顯提高,達到預期效果。該方法已經在車載信息系統項目中獲得應用,針對電子地圖的預處理和電子地圖傳輸達到良好的效果。隨著研究的深入,今后還將在以下幾方面做深入的研究:研究電子地圖坐標系統,使經緯度坐標轉化平面坐標更精確;壓縮電子地圖數據等。
[1]張立亭,祝國瑞,周世健.基于WebGIS的地圖數據傳輸關鍵技術[J].測繪通報,2004(4):52-55.
[2]劉建忠,齊華.矢量地圖數據漸進式傳輸的研究[J].鐵路計算機應用,2007,16(3):5-7.
[3]霍佳,王英杰,王映輝,等.基于Web的統計電子地圖發布系統設計[J].計算機工程,2009,35(4):258-264.
[4]李勝樂,陸遠忠.MapInfo地理信息系統二次開發實例[M].北京:電子工業出版社,2004.
[5]楊必勝,李清泉.World Wide Web(WWW)上矢量地圖數據的多分辨率傳輸算法[J].測繪學報,2005,34(4):355-360.
[6]胡鋼,徐緒堪,沈波,等.基于mapinfo三層結構水利地理信息系統設計[J].計算機工程與設計,2006,27(22):4319-4321.
[7]王景存,陳彬,陳和平.GIS系統地圖快速顯示模型設計與實現[J].計算機工程與設計,2007,28(5):1179-1181.
[8]陳志軍,王丹.基于MapX的WebGIS系統[J].沈陽航空工業學院學報,2005,22(1):49-51.