第二章 組件式GIS與MapX 一、 組件技術(shù) 組件技術(shù)的興起 目前,在軟件開發(fā)領(lǐng)域,一場新的革命正在悄悄興起,這是由日 趨成熟的組件技術(shù)引發(fā)的。幾年以前,當微軟公司首先使用OLE的時 候,其初衷是為了增強軟件的互操作性。然而在使用過程中,人們逐 漸認識到這一技術(shù)背后的實質(zhì)性內(nèi)容和它在軟件開發(fā)中所扮演的重要 角色。組件技術(shù)以前所未有的方式提高了軟件產(chǎn)業(yè)的生產(chǎn)效率,這一 點已逐步成為軟件開發(fā)人員的共識。傳統(tǒng)的C/S結(jié)構(gòu)、群件、中間件 等大型軟件系統(tǒng)的構(gòu)成形式,都將在組件的基礎上重新構(gòu)造。 組件技術(shù)使近二十年來興起的面向?qū)ο蠹夹g(shù)進入到成熟的實用化 階段。在組件技術(shù)的概念模式下,軟件系統(tǒng)可以被視為相互協(xié)同工作 的對象集合,其中每個對象都會提供特定的服務,發(fā)出特定的消息, 并且以標準形式公布出來,以便其他對象了解和調(diào)用。組件間的接口 通過一種與平臺無關(guān)的語言IDL(InterfaceDefineLanguage)來定義 ,而且是二進制兼容的,使用者可以直接調(diào)用執(zhí)行模塊來獲得對象提 供的服務。早期的類庫,提供的是原代碼級的重用,只適用于比較小 規(guī)模的開發(fā)形式;而組件則封裝得更加徹底,更易于使用,并且不限 于C++之類的語言,可以在各種開發(fā)語言和開發(fā)環(huán)境中使用。 由于組件技術(shù)的出現(xiàn),軟件產(chǎn)業(yè)的形式也隨之發(fā)生了很大的變化 。大量組件生產(chǎn)商涌現(xiàn)出來,并推出各具特色的組件產(chǎn)品;軟件集成 商則利用適當?shù)慕M件快速生產(chǎn)出用戶需要的某些應用系統(tǒng);大而全的 通用產(chǎn)品逐步減少;很多相對較為專業(yè),但用途廣泛的軟件,如GIS 、語音識別系統(tǒng)等,都以組件的形式組裝和擴散到一般的軟件產(chǎn)品中 。 COM與DCOM COM是組件式對象模型(Component Object Model)的英文縮寫, 是組件之間相互接口的規(guī)范,是OLE(Object Linking & Embedding) 和ActiveX共同的基礎,其作用是使各種軟件構(gòu)件和應用軟件能夠用 一種統(tǒng)一的標準方式進行交互。COM不是一種面向?qū)ο蟮恼Z言,而是 一種與源代碼無關(guān)的二進制標準。COM所建立的是一個軟件模塊與另 一個軟件模塊之間的鏈接,當這種鏈接建立之后,模塊之間就可以通 過稱之為“接口”的機制來進行通信。COM標準增加了保障系統(tǒng)和組 件完整的安全機制,并擴展到分布式環(huán)境。 COM本質(zhì)上仍然是客戶/服務器模式??蛻簦ㄍǔJ菓贸绦颍┱?/P> 求創(chuàng)建COM對象并通過COM對象的接口操縱COM對象。服務器根據(jù)客戶 的請求創(chuàng)建并管理COM對象。客戶和服務器這兩種角色并不是絕對的 。 基于分布式環(huán)境下的COM被稱作DCOM(Distribute COM,分布式構(gòu) 件對象模型)。DCOM是ActiveX的基礎,它實現(xiàn)了COM對象與遠程計算 機上的另一個對象之間直接進行交互。DCOM規(guī)范定義了分散對象創(chuàng)建 和對象間通信的機制,規(guī)范本身并不依賴于任何特定的編程語言和操 作系統(tǒng),但目前該標準只在Microsoft Windows平臺實現(xiàn),這就意味 著其它的操作系統(tǒng)平臺(如UNIX)目前還不支持ActiveX。 DCOM的實現(xiàn)采用了DCOM庫的形式,當DCOM客戶對象需要DCOM服務 器對象的服務時,DCOM庫負責生成DCOM服務器對象并在客戶對象和服 務器對象之間建立初始連接,一旦返回服務器對象指針,DCOM庫就不 再參與客戶對象與服務器對象之間的工作,兩個對象之間可以自由地 進行通信。 DCOM接口實際上時邏輯上和語義上相關(guān)聯(lián)的函數(shù)集。服務器對象 通過DCOM接口為客戶對象提供服務,客戶對象不需了解服務器對象的 內(nèi)部數(shù)據(jù)表示。接口可以看成兩個軟件構(gòu)件之間的一種協(xié)議,協(xié)議表 明服務器對象為客戶對象提供一種且僅此一種服務。接口采用全局唯 一標識符(GUID)來保證服務的唯一性。通常的DCOM構(gòu)件提供多種服 務,那么服務器對象為每一種服務實現(xiàn)一個接口。當客戶對象指針指 向相應的服務器對象時,它就激活服務器對象接口的相應函數(shù)。具體 過程是:客戶對象通過DCOM對象必須支持的IunKnown接口獲得其它接 口的指針。客戶對象也許并不知道服務器對象的每個接口,但這并不 妨礙客戶對象對服務器對象的使用,它只用它知道的接口。當客戶對 象用完服務器對象的服務時,它會通知服務器對象,服務器對象就釋 放它所占有的內(nèi)存。 DCOM的好處是顯而易見的。由于接口的定義和功能保持不變,DC OM構(gòu)件開發(fā)者可以改變接口功能、為對象增加新功能、用更好的對象 來代替原有對象,而建立在構(gòu)件基礎上的應用程序幾乎不用修改,大 大提高了代碼的重用性。 ActiveX與ActiveX控件 (1)、 ActiveX ActiveX是微軟公司的構(gòu)件技術(shù)標準,實際上是對象嵌入與煉接 (OLE)的新版本,使OLE接口加強了對數(shù)據(jù)和特性的管理,效率更高 ,而且更加便于進行Internet互操作。作為針對Internet應用開發(fā)的 技術(shù),ActiveX被廣泛應用于WEB服務器以及客戶端的各個方面。同時 ,ActiveX技術(shù)也被用于方便地創(chuàng)建普通的桌面應用程序。 ActiveX既包含服務器端技術(shù),也包含客戶端技術(shù)。其主要內(nèi)容 是: ? ActiveX控制(ActiveX Control):用于向WEB頁面、Microsoft Word等支持ActiveX 的容器 (Container)中插入COM對象; ? ActiveX文檔(ActiveX Document):用于在Web Browser或者 其它支持ActiveX的容器中瀏覽復合文檔(非HTML文檔),例如Micro soft Word文檔、Microsoft Excel文檔或者用戶自定義的文檔等; ? ActiveX腳本描述(ActiveX Scripting):用于從客戶端或者 服務器端操縱ActiveX控制和Java程序、傳遞數(shù)據(jù)以及協(xié)調(diào)它們之間 的操作等; ? ActiveX服務器框架(ActiveX Server Framework):提供了 一系列針對Web服務器應用程序設計各個方面的函數(shù)及其封裝類,諸 如服務器過濾器、HTML數(shù)據(jù)流控制等; ? 在Internet Explorer中內(nèi)置Java虛擬機(Java Virtual Machine),從而使Java Applet能夠在Internet Explorer上運行, 并可以與ActiveX控制通過腳本描述語言進行通信。 ?。?)、 ActiveX控件 ActiveX控件是充分利用OLE和ActiveX技術(shù)的自定義控件,是基 于與應用程序無關(guān)的思想而設計的,其目標是提供一種面向?qū)ο蟆⑴c 操作系統(tǒng)無關(guān)、與機器平臺無關(guān)、可以在應用程序之間互相訪問對象 地機制。 ActiveX控件是建立在COM標準上的獨立的軟件元件,提供給用戶 應用接口,發(fā)送相應的事件,開發(fā)者則可以截取這些事件,執(zhí)行相應 的功能。ActiveX控件開發(fā)端和使用端是完全獨立的,可以用Delphi 、VB等各種語言來開發(fā),又可以用于不同語言、不同開發(fā)平臺、不同 的系統(tǒng)環(huán)境中。ActiveX控件與VBX不同,VBX的標準是建立在16位段 式結(jié)構(gòu)的基礎上,并不適用于32位環(huán)境。ActiveX控件可以在32位環(huán) 境下提供與VBX相類似的功能。一個或多個ActiveX控件會保存在一個 動態(tài)鏈接庫中,但它是一種特殊的動態(tài)鏈接庫,其擴展名不是DLL而 是OCX。 從本質(zhì)上講,ActiveX控件是一個ActiveX服務器,它能提供所有 的OLE功能和服務,包括可視化編輯、拖放和OLE Automation。與所 有的ActiveX服務器一樣,要使用ActiveX控件,必須先對ActiveX控 件進行注冊,應用程序通過注冊后得到的類ID號找到控件的數(shù)據(jù)源進 行訪問。ActiveX控件可以由VB、VC、Delphi等開發(fā)工具生成OCX文件 時自動進行注冊,也可以手工注冊,其實質(zhì)都是通過運行應用程序Re gsvr32.exe來實現(xiàn)。Regsvr32.exe一般在操作系統(tǒng)的系統(tǒng)文件目錄下 ,如Windows 85/98的windowssystem目錄、Windows NT的winntsystem32目錄。在Regsvr32.exe應用程序的命令行中輸入A ctiveX控件的網(wǎng)絡共享路徑。網(wǎng)絡路徑的形式為\機器名共享目錄名 文件名。假如,服務器名為mainserver,目錄名為controls,控件名 為MapX,則注冊命令為: Regsvr32 \mainservercontrolsmapx.ocx ?。?)、 ActiveX與ActiveX控件的區(qū)別 ActiveX技術(shù)是OLE技術(shù)在Internet上的重定義,而ActiveX控件 則是OLE控件在Internet上的擴展。 ActiveX不等同于ActiveX構(gòu)件,從上面的介紹可知,ActiveX是 一個很寬的技術(shù)家族的標識,而ActiveX構(gòu)件只是那個家族的一個特 定技術(shù)。 二、 組件技術(shù)與GIS的發(fā)展 引言 組件式軟件技術(shù)已經(jīng)成為當今軟件技術(shù)的潮流之一,為了適應這 種技術(shù)潮流,GIS軟件象其他軟件一樣,已經(jīng)或正在發(fā)生著革命性的 變化,即由過去廠家提供了全部系統(tǒng)或者具有二次開發(fā)功能的軟件, 過渡到提供組件由用戶自己再開發(fā)的方向上來。無疑,組件式GIS技 術(shù)將給整個GIS技術(shù)體系和應用模式帶來巨大影響。 GIS技術(shù)的發(fā)展,在軟件模式上經(jīng)歷了功能模塊、包式軟件、核 心式軟件,從而發(fā)展到組件式GIS和WebGIS的過程。傳統(tǒng)GIS雖然在功 能上已經(jīng)比較成熟,但是由于這些系統(tǒng)多是基于十多年前的軟件技術(shù) 開發(fā)的,屬于獨立封閉的系統(tǒng)。同時,GIS軟件變得日益龐大,用戶 難以掌握,費用昂貴,阻礙了GIS的普及和應用。組件式GIS的出現(xiàn)為 傳統(tǒng)GIS面臨的多種問題提供了全新的解決思路。 組件式GIS的基本思想是把GIS的各大功能模塊劃分為幾個控件, 每個控件完成不同的功能。各個GIS控件之間,以及GIS控件與其它非 GIS控件之間,可以方便地通過可視化的軟件開發(fā)工具集成起來,形 成最終的GIS應用??丶缤欢迅魇礁鳂拥姆e木,他們分別實現(xiàn)不 同的功能(包括GIS和非GIS功能),根據(jù)需要把實現(xiàn)各種功能的 “積 木”搭建起來,就構(gòu)成應用系統(tǒng)。 組件式GIS系統(tǒng)的特點 把GIS的功能適當抽象,以組件形式供開發(fā)者使用,將會帶來許 多傳統(tǒng)GIS工具無法比擬的優(yōu)點。 ?。?)、 小巧靈活、價格便宜 由于傳統(tǒng)GIS結(jié)構(gòu)的封閉性,往往使得軟件本身變得越來越龐大 ,不同系統(tǒng)的交互性差,系統(tǒng)的開發(fā)難度大。在組件模型下,各組件 都集中地實現(xiàn)與自己最緊密相關(guān)的系統(tǒng)功能,用戶可以根據(jù)實際需要 選擇所需控件,最大限度地降低了用戶的經(jīng)濟負擔。。組件化的GIS 平臺集中提供空間數(shù)據(jù)管理能力,并且能以靈活的方式與數(shù)據(jù)庫系統(tǒng) 連接。在保證功能的前提下,系統(tǒng)表現(xiàn)得小巧靈活,而其價格僅是傳 統(tǒng)GIS開發(fā)工具的十分之一,甚至更少。這樣,用戶便能以較好的性 能價格比獲得或開發(fā)GIS應用系統(tǒng)。 ?。?)、 無須專門GIS開發(fā)語言,直接嵌入MIS開發(fā)工具 傳統(tǒng)GIS往往具有獨立的二次開發(fā)語言,對用戶和應用開發(fā)者而 言存在學習上的負擔。而且使用系統(tǒng)所提供的二次開發(fā)語言,開發(fā)往 往受到限制,難以處理復雜問題。而組件式GIS建立在嚴格的標準之 上,不需要額外的GIS二次開發(fā)語言,只需實現(xiàn)GIS的基本功能函數(shù), 按照Microsoft的ActiveX控件標準開發(fā)接口。這有利于減輕GIS軟件 開發(fā)者的負擔,而且增強了GIS軟件的可擴展性。GIS應用開發(fā)者,不 必掌握額外的GIS開發(fā)語言,只需熟悉基于Windows平臺的通用集成開 發(fā)環(huán)境,以及GIS各個控件的屬性、方法和事件,就可以完成應用系 統(tǒng)的開發(fā)和集成。目前,可供選擇的開發(fā)環(huán)境很多,如Visual C++、 Visual Basic、Visual FoxPro、Borland C++、Delphi、C++ Builder以及Power Builder等都可直接成為GIS或GMIS的優(yōu)秀開發(fā)工 具,它們各自的優(yōu)點都能夠得到充分發(fā)揮。這與傳統(tǒng)GIS專門性開發(fā) 環(huán)境相比,是一種質(zhì)的飛躍。 ?。?)、 強大的GIS功能 新的GIS組件都是基于32位系統(tǒng)平臺的,采用InProc直接調(diào)用形 式,所以無論是管理大數(shù)據(jù)的能力還是處理速度方面均不比傳統(tǒng)GIS 軟件遜色。小小的GIS組件完全能提供拼接、裁剪、疊合、緩沖區(qū)等 空間處理能力和豐富的空間查詢與分析能力。 (4)、 開發(fā)簡捷 由于GIS組件可以直接嵌入MIS開發(fā)工具中,對于廣大開發(fā)人員來 講,就可以自由選用他們熟悉的開發(fā)工具。而且,GIS組件提供的API 形式非常接近MIS工具的模式,開發(fā)人員可以像管理數(shù)據(jù)庫表一樣熟 練地管理地圖等空間數(shù)據(jù),無須對開發(fā)人員進行特殊的培訓。在GIS 或GMIS的開發(fā)過程中,開發(fā)人員的素質(zhì)與熟練程度是十分重要的因素 。這將使大量的MIS開發(fā)人員能夠較快地過渡到GIS或GMIS的開發(fā)工作 中,從而大大加速GIS的發(fā)展。 ?。?)、 更加大眾化 組件式技術(shù)已經(jīng)成為業(yè)界標準,用戶可以象使用其他ActiveX控 件一樣使用GIS控件,使非專業(yè)的普通用戶也能夠開發(fā)和集成GIS應用 系統(tǒng),推動了GIS大眾化進程。組件式GIS 的出現(xiàn)使GIS不僅是專家們 的專業(yè)分析工具,同時也成為普通用戶對地理相關(guān)數(shù)據(jù)進行管理的的 可視化工具。 組件式GIS開發(fā)平臺的結(jié)構(gòu) 組件式GIS開發(fā)平臺通??稍O計為三級結(jié)構(gòu): ? 基礎組件 面向空間數(shù)據(jù)管理,提供基本的交互過程,并能以靈活的方式與 數(shù)據(jù)庫系統(tǒng)連接; ? 高級通用組件 由基礎組件構(gòu)造而成,面向通用功能,簡化用戶開發(fā)過程,如顯 示工具組件、選擇工具組件、編輯工具組件、屬性瀏覽器組件等等。 它們之間的協(xié)同控制消息都被封裝起來。這級組件經(jīng)過封裝后,使二 次開發(fā)更為簡單。如一個編輯查詢系統(tǒng),若用基礎平臺開發(fā),需要編 寫大量的代碼,而利用高級通用組件,只需幾句程序就夠了。面向通 用功能; ? 行業(yè)性組件 抽象出行業(yè)應用的特定算法,固化到組件中,進一步加速開發(fā)過 程。以GPS監(jiān)控為例。對于GPS應用,除了需要地圖顯示、信息查詢等 一般的GIS功能外,還需要特定的應用功能,如動態(tài)目標顯示、目標 鎖定、軌跡顯示等。這些GPS行業(yè)性應用功能組件被封裝起來后,開 發(fā)者的工作就可簡化為設置顯示目標的圖例、軌跡顯示的顏色、鎖定 的目標,以及調(diào)用、接受數(shù)據(jù)的方法等。 GIS組件的構(gòu)成 GIS軟件的模型包含若干功能單元,諸如空間數(shù)據(jù)獲取、坐標轉(zhuǎn) 換、圖形編輯、數(shù)據(jù)存儲、數(shù)據(jù)查詢、數(shù)據(jù)分析、制圖表示等??梢?/P> 想象要把這些所有的功能放在一個控件中幾乎是不可能的,即使實現(xiàn) 也會帶來系統(tǒng)效率上的低下。一般可以認為GIS構(gòu)件的設計主要遵循 應用領(lǐng)域地需求。例如ESRI地MapObjects就是以空間數(shù)據(jù)訪問、查詢 、制圖為主要目標的GIS構(gòu)件。 GIS組件產(chǎn)品 GIS組件的代表作應首推MapObjects以及MapX等。其中MapObject s由全球最大的GIS廠商ESRI(美國環(huán)境研究所)推出;MapX由著名的桌 面GIS廠商美國MapInfo公司推出。另外還有加拿大阿波羅科技集團的 TITAN等。下表是MapObjects和MapX的主要功能對比。 功能 MapObjects MapX 顯示的地圖數(shù)據(jù)格式 Arcview的SHP、ARC/INFO的coverage、SDE圖層 MapInfo的數(shù)據(jù)格式 疊加柵格圖像 有 有 對地圖的常用操作 放大、縮小、漫游等 放大、縮小、漫游等 圖層控制 增加、移走、設置當前層 增加、移走、設置當前層 屬性數(shù)據(jù)綁定 有 有 地圖信息查詢方式 1. 通過鼠標選取特征 2. 通過SQL查找特征 3. 通過空間操作選取特征 1. 通過鼠標選取特征 2. 通過SQL查找特征 3. 通過空間操作選取特征 專題地圖 較弱 有 GPS集成 有 有 用戶繪圖圖層 無 有 生成/編輯地圖對象 較弱 較弱 地圖標注 有 有 地圖符號化 較弱 較強 分析功能 無 無 地理編碼 有 有 可使用的開發(fā)語言 VC、VB、PowerBuilder、Delphi、Access等 VC、 VB、PowerBuilder、Delphi、Lotus Notes等 表4.1 MapObjects 和MapX的主要功能對比 應用及評價 軟件的構(gòu)件化已成為軟件技術(shù)發(fā)展的潮流?;贒COM的ActiveX 構(gòu)件實現(xiàn),已成為軟件工業(yè)的一種標準。伴隨著未來其它非Windows 平臺對ActiveX的支持,ActiveX構(gòu)件化的GIS軟件系統(tǒng)將對GIS的體系 結(jié)構(gòu)和GIS將來的應用前景產(chǎn)生深遠影響。 雖然采用GIS構(gòu)件在開發(fā)上有許多優(yōu)勢,但是不可避免的也存在 一些功能上的欠缺和技術(shù)上的不成熟,主要包括以下幾個方面: ? 與專業(yè)的GIS客戶端軟件相比,采用構(gòu)件技術(shù)不可避免的帶來 效率上的相對低下,這在訪問超大空間數(shù)據(jù)(如大數(shù)據(jù)量的遙感圖象 )的時候表現(xiàn)得尤為明顯; ? 支持的空間數(shù)據(jù)量有限; ? 支持的功能有限,由于是構(gòu)件,只覆蓋了GIS系統(tǒng)的部分功能 ,于是對于特殊領(lǐng)域,它就顯得無能為力; ? 系統(tǒng)的可靠性、容錯性有待提高。DCOM的一大特點是:開發(fā)及 使用過程中必須時刻注意Windows系統(tǒng)OLE系統(tǒng)注冊表的正確。 三、 MapInfo相關(guān)技術(shù) MapInfo公司及其產(chǎn)品 美國MapInfo公司致力于為用戶提供先進的數(shù)據(jù)可視化、信息地 圖化技術(shù),并將這些技術(shù)與主流業(yè)務系統(tǒng)集成,提供完整的解決方案 。MapInfo吸取了傳統(tǒng)GIS系統(tǒng)的精華,并借助于計算機技術(shù)的發(fā)展, 及時將GIS概念從中大型計算機的專用工作站上介紹至普通桌面PC上 ,開創(chuàng)了嶄新桌面地圖信息系統(tǒng)。MapInfo公司的主要系列產(chǎn)品有: ? 桌面地理信息系統(tǒng)MapInfo Professional ? 網(wǎng)絡解決方案MapInfo ProSerev ? 數(shù)據(jù)庫服務器產(chǎn)品MapInfo Spatialware ? MapInfo ActiveX ? DEC Alpha NT產(chǎn)品MapInfo Professional for DEC Alpha NT ? 開發(fā)工具MapInfo MapBasic MapInfo空間數(shù)據(jù)的拓撲關(guān)系模型 空間數(shù)據(jù)的拓撲關(guān)系模型是地理信息系統(tǒng)的基石。當前商用地理 信息系統(tǒng)中,主要采用POLYVRT結(jié)構(gòu)和“空間實體+空間索引”兩種模 型。 MapInfo采用稱作“空間實體+空間索引”的的拓撲關(guān)系模型。80年代 中后期出現(xiàn)的商用地理信息系統(tǒng),尤其是桌面地理信息系統(tǒng)大多采用 這種方式,包括ESRI的ArcView。而采用POLYVRT模型的系統(tǒng)主要是以 Arc/Info為代表的一些專業(yè)GIS產(chǎn)品。 “空間實體+空間索引”模型的基礎是“空間實體”??臻g實體 是地理實體的抽象,主要包括點、線、面三種類型。每個空間實體對 象都維護著自己的所有屬性。多個空間實體組成一個圖層。 “空間實體+空間索引”模型的空間查詢功能是通過“空間索引 ”技術(shù)來實現(xiàn)的??臻g索引的目的是對給定的空間坐標,能夠以盡快 的速度搜索到坐標范圍內(nèi)的空間對象。MapInfo采用R-Tree技術(shù)將空 間實體的最小外接矩形(MBR)存儲在索引中,并按從大到小的順序 進行索引搜索。建立了空間索引,就能快速地進行空間分析了。 相對于,POLYVRT的優(yōu)點是多個不同的對象可以共用相同的結(jié)點 ,節(jié)省存儲空間,但由此產(chǎn)生的問題是其結(jié)構(gòu)更加復雜,數(shù)據(jù)的編輯 和維護比較困難。而“空間實體+空間索引”模型雖然會造成公共結(jié) 點的重復存儲,但是其結(jié)構(gòu)化的實體模型使得對某個對象的更改不會 影響到其它對象的定義,從而大大增強了空間數(shù)據(jù)的可維護性。 另外,基于POLYVRT結(jié)構(gòu)的空間數(shù)據(jù)組織不能被規(guī)范為關(guān)系模式 ,而基于“空間實體+空間索引”模型可以規(guī)范為“實體-關(guān)系”模型 ,從而可以與關(guān)系數(shù)據(jù)庫系統(tǒng)結(jié)合,在關(guān)系數(shù)據(jù)庫內(nèi)實現(xiàn)對空間數(shù)據(jù) 的查詢、分析和處理等操作。 主要技術(shù)特點 ?。?)、 以表(Table)的形式組織信息 每一個表都是一組MapInfo文件,這些文件組成了地圖文件和數(shù) 據(jù)庫文件。為使用MapInfo,就需要有組成表的用戶數(shù)據(jù)和地圖文件 。這些文件可以來自MapInfo或者由用戶創(chuàng)建。用戶要想在MapInfo中 工作,就必須打開一個或多個表。 MapInfo通過表的形式將數(shù)據(jù)與地圖有機地結(jié)合在一起。當用戶在Map Info中打開數(shù)據(jù)文件時,MapInfo將創(chuàng)建一個表。這個表至少由兩個 獨立的文件組成,一個是包含數(shù)據(jù)結(jié)構(gòu)的文件,另一個是包含原始數(shù) 據(jù)的文件。一個典型的MapInfo表將主要由*.tab、*.dat、*.wks、*. dbf、*.xls、*.map、*.id、*.ind文件格式組成。 ?。?)、 圖形對象 MapInfo內(nèi)置的數(shù)據(jù)庫管理系統(tǒng)是一種關(guān)系型數(shù)據(jù)庫管理系統(tǒng), 也是用二維表組織數(shù)據(jù)。與其它關(guān)系型數(shù)據(jù)庫不同的是表結(jié)構(gòu)中除可 包含常用類型的屬性列外,還引入一個圖形對象列(OBJ列),用于 存儲圖形對象(如線、區(qū)域等)。MapInfo提供許多圖形對象的操作 接口,利用這些接口可以生成和處理所需要的各種圖形。 ?。?)、 地圖圖層化 MapInfo是按圖層組織計算機地圖的。也就是說,將一幅計算機 地圖加工成多個層層疊加的透明層,這個透明層就稱為圖層。每個圖 層包含了整個地圖的一個不同方面。例如,第一個圖層包含省邊界, 第二個圖層表示省府的符號,第三個圖層由標注文本組成,把它們層 層疊加就形成一幅完整的地圖。在創(chuàng)建每一個圖層時,都要為其建立 一張表,MapInfo就是通過這種方式使表與地圖之間建立了聯(lián)系。 也就是說,MapInfo是以表的形式來進行管理的,每個表一般包含兩 部份:地圖部分和數(shù)據(jù)庫(屬性)部份。 ?。?)、 專題地圖 提供多種數(shù)據(jù)可視化的專題地圖,能將數(shù)據(jù)庫中的信息進行直觀 的可視化分析。使用專題渲染在地圖上顯示數(shù)據(jù)時,可以清楚地看出 在數(shù)據(jù)記錄中難以發(fā)現(xiàn)的模式或趨勢,為用戶的決策提供依據(jù)。專題 地圖包括范圍值、點密度、柱狀圖、等級符號、餅圖和獨立值六種形 式。 ?。?)、 內(nèi)置ODBC MapInfo內(nèi)置ODBC,支持各種關(guān)系型數(shù)據(jù)庫,支持SQL查詢,從而 保證了對原有數(shù)據(jù)庫的沿用和對遠程數(shù)據(jù)庫地訪問。具備空間查詢的 功能擴展(如緩沖區(qū)、疊加等),采用數(shù)據(jù)倉庫的最新技術(shù)OLAP(On line Analytical Processing)的聯(lián)機事物處理,對于應用程序?qū)崿F(xiàn) 圖形查詢和表查詢提供了強大的手段。 ?。?)、 支持多種數(shù)據(jù)格式及其轉(zhuǎn)換 MapInfo既支持數(shù)字化儀的圖形輸入方式,直接生成矢量圖,也 支持目前市場上流行的圖形圖象格式??山邮蹵utoCAD的DWG、DXF標 準文件格式,還可通過MIF及MID文件與其它軟件建立數(shù)據(jù)的接口。其 中MIF文件內(nèi)保存有圖形信息,MID文件內(nèi)保存有圖形的屬性信息。MI F及MID文件通過MapInfo的菜單命令I(lǐng)mport和Export來輸入和產(chǎn)生。 ?。?)、 二次開發(fā)工具MapBasic 作為一個系統(tǒng)軟件,MapInfo提供了可以將其所有的功能用程序 來驅(qū)動的方法,內(nèi)置標準的二次開發(fā)工具——MapBasic。MapBasic不 僅與大眾化的Basic語法相一致,具有基本一致的常用函數(shù)集(計算 、字符串處理、文件I/O、DLL調(diào)用等),而且利用MapBasic語言所提 供的函數(shù)、過程和語句命令可以完成許多有關(guān)圖形對象管理的復雜操 作和運算。它的真正優(yōu)勢在于對MapInfo中的Table及其圖形對象的管 理所提供的特性和強大功能。采用面向?qū)ο蠹笆录?qū)動編程 ?。?)、 集成二次開發(fā)能力 具有OLE和OLE Automation功能,可以方便地使用Delphi、VB、VC等多種開發(fā)工具, 保證了新的應用程序與原有的應用界面保持一致,為日后的深層開發(fā) 提供一個擴展空間。 MapInfo的數(shù)據(jù)組織 MapInfo采用雙數(shù)據(jù)庫存儲模式,即其空間數(shù)據(jù)與屬性數(shù)據(jù)是分 開來存儲的。屬性數(shù)據(jù)存儲在關(guān)系數(shù)據(jù)庫的若干屬性表中,而空間數(shù) 據(jù)則以MapInfo的自定義格式保存于若干文件中,二者通過一定的索 引機制聯(lián)系起來。為了提高查詢和處理效率,MapInfo采用層次結(jié)構(gòu) 對空間數(shù)據(jù)進行組織,即根據(jù)不同的專題將地圖分層(圖層還可以分 成若干圖幅),每個圖層存儲為若干個基本文件。 ?。?)、 屬性數(shù)據(jù)的表結(jié)構(gòu)文件.TAB 屬性數(shù)據(jù)表結(jié)構(gòu)文件定義了地圖屬性數(shù)據(jù)的表結(jié)構(gòu),包括字段數(shù) 、字段名稱、字段類型和字段寬度、索引字段及相應圖層的一些關(guān)鍵 空間信息描述。.TAB文件實際上是一個文本文件,可以在寫字板中打 開觀察其內(nèi)容。 (2)、 屬性數(shù)據(jù)文件.DAT 屬性數(shù)據(jù)文件中存放完整的地圖屬性數(shù)據(jù)。在文件頭之后,為表 結(jié)構(gòu)描述,其后首尾相接地緊跟著各條具體地屬性數(shù)據(jù)記錄。 ?。?)、 交叉索引文件.ID 交叉索引文件記錄了地圖中每一個空間對象在空間數(shù)據(jù)文件(.M AP)中的位置指針。每四個字節(jié)構(gòu)成一個指針。指針排列的順序與屬 性數(shù)據(jù)文件(.DAT)中屬性數(shù)據(jù)記錄存放的順序一致。交叉索引文件 實際上是一個空間對象的定位表。 ?。?)、 空間數(shù)據(jù)文件.MAP 具體包含了各地圖對象的空間數(shù)據(jù)??臻g數(shù)據(jù)包括空間對象的幾 何類型、坐標信息和顏色信息等。另外還描述了與該空間對象對應的 屬性數(shù)據(jù)記錄在屬性數(shù)據(jù)文件(.DAT)中的記錄號。這樣,當用戶從 地圖上查詢某一地圖對象時,就能夠方便地查到與之相關(guān)的屬性信息 。
圖2.1 MapInfo的文件格式 及數(shù)據(jù)關(guān)聯(lián)機制 (5)、 索引文件.IND 索引文件并不是必須的,只有當用戶規(guī)定了數(shù)據(jù)庫的索引字段后 mapinfo才會自動產(chǎn)生索引文件。索引文件中對應于每個索引字段都 有一個索引表。在每個索引表中,先給出總的數(shù)據(jù)庫記錄數(shù)目,然后 按照索引順序給出每條屬性數(shù)據(jù)記錄在對應的索引字段處的具體屬性 數(shù)據(jù)和該記錄在屬性文件(.DAT)及交叉索引文件(.ID)中的記錄 號。 圖2.2表示了MapInfo的索引文件機制。
圖2.2 MapInfo的索引文件 格式及數(shù)據(jù)關(guān)聯(lián)機制 四、 MapX研究 MapX簡介 MapX是MapInfo公司向用戶提供的具有強大地圖分析功能的Activ eX控件產(chǎn)品。由于它是一種基于Windows操作系統(tǒng)的標準控件,因而 能支持絕大多數(shù)標準的可視化開發(fā)環(huán)境如Visual C++、Visual Basic 、Delphi、PowerBuilder等。編程人員在開發(fā)過程中可以選用自己最 熟悉的開發(fā)語言,輕松地將地圖功能嵌入到應用中,并且可以脫離Ma pInfo的軟件平臺運行。利用MapX,能夠簡單快速地在企業(yè)應用中嵌 入地圖化功能,增強企業(yè)應用的空間分析能力,實現(xiàn)企業(yè)應用的增值 。MapX采用基于MapInfo Professional的相同的地圖化技術(shù),可以實 現(xiàn)MapInfo Professional具有的絕大部分地圖編輯和空間分析功能。 而且,MapX提供了各種工具、屬性和方法,實現(xiàn)這些功能是非常容易 的。 MapX的空間數(shù)據(jù)結(jié)構(gòu) 空間數(shù)據(jù)結(jié)構(gòu),是GIS的基石,GIS就是通過這種地理空間拓撲結(jié) 構(gòu)建立地理圖形的空間數(shù)據(jù)模型并定義各空間數(shù)據(jù)之間的關(guān)系,從而 實現(xiàn)地理圖形和數(shù)據(jù)庫的結(jié)合。 圖2.3 MapX的空間數(shù)據(jù) 結(jié)構(gòu) 從橫向分析,MapX采取的空間數(shù)據(jù)結(jié)構(gòu)是基于空間實體和空間索 引相結(jié)合的一種結(jié)構(gòu)。空間實體是地理圖形的抽象模型,主要包括點 、線、面三種類型。任何點、線、面實體都可以用直角坐標點x、y來 表示。點可以表示成一組坐標(x,y),對于線和面,則均被表示成 多組坐標(x1,y1;x2,y2;xn,yn)。空間索引是查詢空間實體的 一種機制,通過空間索引,就能夠以盡量快的速度查詢到給定坐標范 圍內(nèi)的空間實體及其所對應的數(shù)據(jù)。 從縱向分析,MapX的空間數(shù)據(jù)結(jié)構(gòu)是一種分層存放的結(jié)構(gòu)。用戶 可以通過圖形分層技術(shù),根據(jù)自己的需求或一定的標準對各種空間實 體進行分層組合,將一張地圖分成不同圖層。采用這種分層存放的結(jié) 構(gòu),可以提高圖形的搜索速度,便于各種不同數(shù)據(jù)的靈活調(diào)用、更新 和管理。
圖2.4 MapX的模型結(jié)構(gòu) MapX組件的模型結(jié)構(gòu) MapX組件的基本組成單元是Object(單個對象)和Collection( 集合)。其中集合包括對象,是多個對象的組合。每種對象和集合負 責處理地圖某一方面的功能。 由圖2.4可以看出,位于頂層的是Map對象本身,其它均由Map對 象繼承。Layers、DataSets、Annotations是Map對象下面的三個重要 的分支。其中Layer主要用于操作地圖的圖層,DataSet用于訪問空間 數(shù)據(jù)表,Annotation用于在地圖上增加文本或者符號。 MapX的顯著特征 ? 專題地圖 將數(shù)據(jù)庫表中的特定值賦給地圖對象的顏色、圖案或符號從而創(chuàng) 建不同的專題地圖;可創(chuàng)建范圍值、等級符號、點密度、獨立值、直 方圖和餅圖6種方式的專題地圖; ? 可深入的地圖 通過簡單的點擊方式可瀏覽與地圖對象相連的數(shù)據(jù)信息; ? 數(shù)據(jù)綁定 地圖可通過嵌入OCX的容器與數(shù)據(jù)庫相連,并提供了幾種不同的 數(shù)據(jù)綁定方式包括ZIP Code-level地理編碼法; ? 注解 可提供方向、加亮顯示特殊數(shù)據(jù),還可加入文本、符號、表格使 地圖信息更加豐富直觀; ? 圖層 顯示和控制圖層的縮放、使用或創(chuàng)建無縫地圖、還可支持一些特 殊的應用,比如用于實時跟蹤的活動圖層和可繪制特殊圖形的用戶自 定義圖層(如logo圖案); ? 柵格圖象 采用柵格圖象作為地圖的基礎圖層可使其它圖層有一個更細致的 背景; ? 自動標記 自動在地圖上加入標記,同時標記屬性和顯示; ? 選擇 可在地圖上拖動鼠標以在圓、矩形或特定的點上選擇一個或多個 對象或記錄以供分析; ? 對象庫 可以使用FeatureFactory對象,創(chuàng)建、聯(lián)接或刪除點、線、區(qū)域 圖形對象; ? 工具 使用MapX的標準工具或根據(jù)需要自己創(chuàng)建的自定義工具,用戶可 通過點擊或拖拽對地圖直接進行操作; ? 地圖編輯 允許用戶添加、修改、刪除地圖上的文本、編輯區(qū)域、點等特殊 對象; ? 投影與坐標系 MapX允許用戶調(diào)整地圖的顯示、用本地坐標系處理X-Y坐標數(shù)據(jù) ; ? 遠程空間數(shù)據(jù)服務器 可以訪問存儲在Oracle8i 和MapInfo SpatialWare中的遠程地圖 數(shù)據(jù)。空間數(shù)據(jù)服務器如SpatialWare和Oracle8i等都提供了先進的 查詢處理能力 ,提高了空間數(shù)據(jù)組織的性能。將空間數(shù)據(jù)存儲到關(guān) 系型數(shù)據(jù)庫中,可以增加應用程序的靈活性,同時也要求在地圖編輯 和大數(shù)據(jù)集方面做更多的工作。 MapX的基本屬性 ? Map 每個Map對象主要包括Datasets、Layers、Annotations三個對象 集合。 Map對象有一些主要的屬性,如Zoom用來設置放大級別(在地圖 上顯示的大小),Rotation控制地圖的旋轉(zhuǎn)角度,CenterX和CenterY 用于設置x和y的坐標系,這要取決于地圖的投影。 Map對象的許多屬性本身又是一個對象,比如說一幅地圖由多個 圖層組成,則在一個Map對象中存在一個單獨的layers集合,其中包 含所有圖層的信息。 ? Layers 在MapX中,每張單獨的地圖都被表示成單獨的一個圖層,所有的 圖層存儲在layers集合中。Layers集合由Layer對象組成,按順序編 號為0到n。Layer對象由features對象組成,features對象又是由Fea ture對象組成,對應于地圖中的點、線、區(qū)域或符號。 最上面一層為Layers(1),Layers(2)位于Layers(1)的下面,以 次類推。最下面的圖層最先繪制,最上面的圖層最后繪制。在應用程 序中,合理地安排好每層在Layers中的順序是至關(guān)重要的。比如說有 兩個圖層,一層為點,一層為區(qū)域,則應將點層放到區(qū)域?qū)拥纳戏剑?/P> 否則區(qū)域會將點覆蓋。 另外,在進行地圖選擇操作時,根據(jù)要求調(diào)整圖層的順序也是十 分重要的。MapX中的選擇工具總是從可選擇圖層中的最上層開始選擇 ,如果在地圖上的同一位置存在多個位于不同層的地圖對象,其結(jié)果 是很難精確地選擇到目標對象。因此,最好將被選擇圖層提到最上層 顯示。 ? GeoSets GeoSet是在GeoManager中建立好的.GST文件,類似MapInfo中的W orkSpace概念,是圖層及其設置的集合,控制程序中顯示的地圖。也 可以在運行階段設置GeoSet,此時將導致已經(jīng)加載的所有圖層和Data Set被刪除而由GeoSet中定義的圖層所代替。如果單純地想刪除所有 圖層,只需給GeoSet賦一個空字符串即可。 可以使用GeoSet Manager程序來管理GeoSet 文件(*.GST)。默 認情況下.GST文件存儲在…\mapxmaps目錄下,可以調(diào)用GeoDictiona ry Manager程序進行修改,指向用戶程序數(shù)據(jù)所在的位置。 ? Datasets Datasets用于實現(xiàn)地圖與數(shù)據(jù)的綁定。舉例說明,有一個關(guān)于城 市銷售情況的MSAccess 數(shù)據(jù)庫和一張該城市的地圖,則可以將二者 綁定,在地圖上形象地顯示出各城市銷售業(yè)績的趨勢,這一點是表格 數(shù)據(jù)無法做到的。 建立地圖信息與屬性數(shù)據(jù)之間聯(lián)系的過程稱之為自動綁定或自動 匹配(autobinding /automatching)。要實現(xiàn)這一過程,必須首先 將地圖在GeoDictionary 中注冊。 屬性數(shù)據(jù)表示的可視化使得創(chuàng)建專題地圖成為可能。 數(shù)據(jù)綁定"Putting Your Data on the Map" 專題地圖"Theme Mapping and Analysis" ? Annotations Annotations集合提供了操縱地圖中文字和符號的簡單方法。Ann otations位于所有其它圖層的上方并且不與任何數(shù)據(jù)連接,有點兒象 MapInfo中的透明圖層。 Annotations包括以下主要的屬性與方法:AddSymbol在Annotati ons中增加符號,符號類型使用Map.DefaultStyle定義;AddText在 Annotations中增加文本;Remove刪除特定的標注.;Type取值為mi SymbolAnnotation或miTextAnnotation。 Annotations還有一個非常重要的屬性Graphic,其定義為Graphi c對象,在該對象中包含了符號或文本的樣式、位置等信息,即Graph ic的Caption、Position、Style 、X、Y屬性。如Annotations的Type 屬性定義為miTextAnnotation,則可以定義Graphic的Caption屬性設 置標注的字符串。 ? 可創(chuàng)建對象 在MapX對象模型中,以下對象是可以被創(chuàng)建的: AffineTransform、BindLayer、BitmapSymbols、CoordSys、Dat um、Feature、Fields、LayerInfo、Map、 ODBCQueryInfo、 Parts 、Point、Points、Rectangle、RowValue、RowValues、Style、Vari ables、NotesQueryInfo、NotesViewInfo。 在Delphi中創(chuàng)建這些對象需要注意一點,即在后面注明MapX的版本。 如在本課題實現(xiàn)過程中,由于使用的是MapX 4.0版本,因此創(chuàng)建語句 要寫成 s := CreateOleObject(′MapX.Style.3′); 五、 MapX的兩個實用應用程序 Geodictionary Manager Geodictionary其實是一個二進制文件,默認文件名為GeoDict.d ct,在這個文件中包含了MapX進行自動數(shù)據(jù)綁定時可以進行匹配的Ma pInfo表的注冊信息。只有能夠被匹配的MapInfo表可以在Geodiction ary中注冊。需要注意的是,沒必要將應用程序中用到的所有表(.ta b文件)注冊,因為注冊一些不必要的表將導致額外的開銷。 應用程序Geodictionary Manager的作用是用來操縱與管理Geodictionary。可執(zhí)行文件GeoDic tionaryManager40.exe既可以運行于圖形界面也可以使用命令行參數(shù) ,在進行程序安裝時,命令行參數(shù)可以用來調(diào)用GeoDictionaryManag er40.exe以注冊相關(guān)的MapInfo表。 每當創(chuàng)建一幅地圖時,MapX就會在注冊表的 HKEY_LOCAL_MACHINESoftwareMapInfoMapX4.0 中查詢GeoDic tionary的注冊鍵值。注冊鍵值主要包括兩方面的信息:一是GeoDict ionary,用于定位.DCT文件;二是SearchPaths,其值是缺省的數(shù)據(jù) 目錄,用于定位.GST文件,可以是多個目錄,之間用逗號隔開。 對于注冊鍵可以有三種取值: ?、侔珿eodictionary文件的完整目錄,如C:Program FilesMapInfo MapXMapsgeodict.dct。 數(shù)據(jù)目錄被設置成相應的目 錄,在上例中為C:Program FilesMapInfo MapXMaps。 ②只包含目錄信息如C:Program FilesMapInfo MapXMaps。 數(shù)據(jù) 目錄也被設置成這個目錄。 ?、蹫榭罩? Map.GeoDictionary的缺省值時"GeoDictionary",這就意味著Ma pX會在注冊表中查詢HKEY_LOCAL_MACHINESoftwareMapInfoMapX4.0Ge oDictionary。 除了使用默認的GeoDict.DCT文件,也可以根據(jù)需要自己建立。 新建一個.DCT文件,在Geodictionary Manager中打開,注冊必要的.TAB文件并進行相應的設置即可。 在MapX 4.0和更高版本中,MapX的運行不再需要一個永久的Geodictionary文 件。 GeoSet Manager 在MapX中,地圖是分層顯示的,每一層都對應一個表,即.TAB文 件。我們的工作往往不是只針對某一個表,如果每次開始工作都重復 性地將所用到的表一一打開,不僅麻煩,而且浪費時間。通過使用Ge oset Manager,可以將所有的工作表集中在一起,連同每一層的設置 一并存儲到一個.GST文件中,下次使用時,只需打開此文件就可以了 。 在Geoset Manager中,可以瀏覽已定義的GeoSet,也可以建立新 的GeoSet??梢哉{(diào)出Layers控制對話框?qū)γ恳粓D層分別進行設置,還 可以改變投影方式。另外,在tools菜單中提供了Register Layers in GeoDictionary項,可以將當前.GST中的某些或全部.TAB文件直接 注冊到GeoDictionary中。 難點篇第三章 關(guān)鍵技術(shù)分析與難點攻克 一、 地圖的獲取 空間地理數(shù)據(jù)的獲取方式 地理信息系統(tǒng)的最主要特點是能以電子地圖的形式,直觀地表現(xiàn) 背景地物信息,并可做圖文互查、綜合分析等。因此,在系統(tǒng)開發(fā)的 最初階段,首要的問題就是準備一張包括相關(guān)地理信息的電子地圖。 空間地理數(shù)據(jù)的獲取主要有以下幾種方式: ? 使用數(shù)字化儀 使用手扶跟蹤數(shù)字化儀,通過人工選點或跟蹤線段產(chǎn)生坐標數(shù)據(jù) 。一般用于比較規(guī)則的地圖或原圖質(zhì)量不太理想的地圖,可利用AUTO CAD軟件進行編輯修改。 ? 利用掃描儀 利用掃描儀把圖紙信息掃描后以柵格數(shù)據(jù)結(jié)構(gòu)形式存儲,再經(jīng)其 它圖象處理軟件進一步處理改善圖象質(zhì)量,如圖形拼接、降噪、細化 等,并把柵格數(shù)據(jù)轉(zhuǎn)換為矢量數(shù)據(jù)格式。這種方式要求圖紙質(zhì)量較好 軟件自動化程度高,交互式工具方便可靠。 ? 鍵盤鍵入 顧名思義,就是通過手工在計算機終端上輸入地圖數(shù)據(jù)。 ? 購買商業(yè)性數(shù)據(jù) 商業(yè)性數(shù)據(jù)可以拿來直接使用。目前電子地圖作為一種信息商品 ,日益受到各界青睞,常見的產(chǎn)品有:衛(wèi)星影象圖——地球資源衛(wèi)星 獲得的地表景觀影象數(shù)據(jù);電子地形圖——通過分層技術(shù)將多種地理 要素分成獨立的信息層,每層具有同一屬性的地理要素,如等高線、 行政界線、道路、水系等;專題電子地圖——如土壤類型圖、人口專 題圖等。 ? 從其它部門獲得數(shù)字拷貝 根據(jù)某些部門標準的原始數(shù)據(jù)文件,進行數(shù)據(jù)格式轉(zhuǎn)換,最終形 成MapInfo可以識別的數(shù)據(jù)格式。MapInfo雖然沒有公開其內(nèi)部的數(shù)據(jù) 結(jié)構(gòu),但它給出了用于格式交換的數(shù)據(jù)結(jié)構(gòu),即MIF與MID,其中MIF 文件保存圖形,MID文件保存文本數(shù)據(jù)。將其它形式的地圖數(shù)據(jù)轉(zhuǎn)成M IF與MID格式,然后利用MapInfo菜單中的Import命令就可以導入,從 而完成轉(zhuǎn)換。另外,MapInfo也支持標準的AUTOCAD數(shù)據(jù)格式.DXF。 應用分析 在上面談到的多種方式中,前兩種方式獲取數(shù)據(jù)比較精確,也十 分專業(yè),但是均需要購買昂貴的專用設備及數(shù)字化軟件包(常用的有 AUTOCAD、CorelDraw等),成本太高;純粹的手工操作費時費力,容 易出錯,已無法滿足現(xiàn)時的需要。 在世行項目中,主要涉及到陜西省行政界線、灌區(qū)位置等地理信 息,地理數(shù)據(jù)精度要求不高,不牽涉復雜的拓撲關(guān)系及計算。 開始,希望能夠直接得到標準的矢量地圖數(shù)據(jù)。在網(wǎng)上反復查找 ,能夠利用的只有“圖行天下”網(wǎng)站(WWW.GO2MAP.COM)可供下載的 柵格數(shù)據(jù)。于是,最終采用的方法如下: ?。?)、 下載陜西省行政區(qū)界地圖,存成柵格文件; ?。?)、 在MapInfo中調(diào)入該文件,設置投影方式; ?。?)、以配準后得到的地圖為藍本,采用手工繪制方法,自定 義新的圖層并繪制相關(guān)地理對象,包括行政區(qū)劃界線、灌區(qū)位置、地 級市等; 配準方法與投影選擇 柵格圖象也稱為位圖,由象素組成。MapInfo支持BMP、GIF、JPE G、PCX、SPOT、TARGA和TIFF七種柵格圖象文件格式。 在MapInfo中打開柵格文件時會顯示一個信息框,詢問是只簡單 顯示還是要進行配準。如果選擇簡單顯示,則MapInfo自動生成一個 與該柵格文件同名的.TAB文件,并在地圖窗口中顯示,此時的圖層稱 為柵格圖層。柵格圖象只用于顯示柵格圖層,而不能象矢量圖象圖層 那樣附加數(shù)據(jù),因此最適合用作矢量圖象圖層的背景,從而提供比矢 量圖象更細致的圖象。 如果要同時使用柵格圖象與矢量圖象則必須首先進行圖象配準, 這樣,MapInfo才能在地圖窗口中確切地放置圖象。配準過程在圖象 配準對話框中進行,主要有兩方面的工作,一是提供準確的控制點信 息,二是指定柵格圖象的投影。 實際應用中,將從WWW.GO2MAP.COM下載的多幅gif格式的地圖在 圖形處理軟件中進行拼接,最終形成一幅完整的陜西省地圖,并存為 .BMP文件。在MapInfo中打開,新建圖層并覆蓋在該BMP圖象之上,將 其作為編輯矢量地圖圖層的參考。這種基于屏幕圖象來進行編輯的過 程稱為“屏幕數(shù)字化”。 由于此處柵格圖象只用作背景參考,因此不必進行柵格圖象配準 ;倘若與矢量圖象一起使用,則必須進行配準。 投影是一種方法,用于減少球面上的對象顯示在平面上時產(chǎn)生的 變形。有許多不同類型的投影,每種投影都是針對某一給定區(qū)域的, 但是允許使用不同的投影來顯示同一幅地圖。投影最常用于數(shù)字化有 明確投影的地圖。 坐標系是與投影密切相關(guān)的一個概念。一個坐標系是一組參數(shù), 說明如何判斷對象的定位坐標,其中一個參數(shù)就是投影。因此可以認 為投影是坐標系的一部分。 地圖可以區(qū)分為地球地圖何非地球地圖兩類,通常需要進行不同 的處理。地球地圖包含在地球表面有特定位置的對象,坐標一般用經(jīng) 緯度代表對象的位置;非地球地圖包含在地球表面沒有特定位置的對 象且其對象并不顯式地參照地球表面位置的地圖,如樓層平面圖地功 能。非地球地圖不包含投影。 小結(jié) 充分利用現(xiàn)有資源,發(fā)揮柵格圖在矢量圖層建立過程中的作用, 大大減少了地圖的準備工作,降低了開發(fā)過程中的設備投入和成本, 縮短了系統(tǒng)的開發(fā)周期。因此選用柵格圖作為背景地圖,無疑對地理 信息系統(tǒng)的開發(fā)起到很大的幫助。 在數(shù)據(jù)準備過程中,深刻體會到國家基礎地理數(shù)據(jù)的缺乏。幾個 大型的GIS專業(yè)網(wǎng)站基本上只提供地圖的在線瀏覽和查詢,用戶無法 直接使用相關(guān)的地圖數(shù)據(jù);商品化的地理數(shù)據(jù)也并不完善;只有國家 基礎地理信息系統(tǒng)網(wǎng)站提供一些數(shù)據(jù)的下載,包括國界、省級行政區(qū) 劃、一級河流、二級河流等,無法進行進一步細致的開發(fā)。 二、 地圖數(shù)據(jù)與屬性數(shù)據(jù)的關(guān)聯(lián) 開發(fā)過程中涉及的數(shù)據(jù)主要包括兩個來源:一部分是Geoset中包 含的地圖數(shù)據(jù)文件,即Djqh.tab、Djs.tab和Gq.tab;其它所有的非 幾何數(shù)據(jù)即屬性數(shù)據(jù)均由MS SQL Server管理。因此,要實現(xiàn)圖文互 動,必須建立幾何數(shù)據(jù)和屬性數(shù)據(jù)之間的關(guān)系。 MapX支持的外部數(shù)據(jù) 在MapX中可以引用多種類型的外部數(shù)據(jù)。 (1)、 地圖數(shù)據(jù):如果用戶已經(jīng)購買了或是利用MapInfo創(chuàng)建了MapInfo地圖 ,可以直接將它們在應用中打開。 (2)、 遠程空間數(shù)據(jù)庫:利用MapX可以訪問保存在Oracle8i及MapInfo SpatialWare中的地圖數(shù)據(jù)。其中,對Oracle8i的支持是MapX 4.0的 新特性。通過Oracle8 Call Interface(OCI),MapX可以將存儲在Oracle8i數(shù)據(jù)庫服務器中的Ma pInfo空間數(shù)據(jù)和屬性數(shù)據(jù)同時下載到本地。 (3)、 其它遠程數(shù)據(jù):MapX支持多種對外遠程數(shù)據(jù)的訪問方式, 如ADO、DAO、及RDO等,更可以通過ODBC使用更廣范圍內(nèi)的數(shù)據(jù)。 數(shù)據(jù)庫設計原則 GIS系統(tǒng)中涉及的數(shù)據(jù)包括圖形矢量數(shù)據(jù)、空間屬性數(shù)據(jù)和工程 管理數(shù)據(jù)。為了增強整個系統(tǒng)數(shù)據(jù)處理的靈活性,采用分開存儲的方 法。圖形矢量數(shù)據(jù)以MapInfo標準文件格式存儲在特定目錄下,圖形 中每個地物均有其對應的唯一的標識(ID號),系統(tǒng)以此為索引建立 該地物的圖形數(shù)據(jù)文件??臻g屬性數(shù)據(jù)與工程管理數(shù)據(jù)均采用MS SQL Server來存儲,各地物屬性記錄的關(guān)鍵字為圖形文件中該地物的ID號 ,由此便實現(xiàn)了圖形文件與屬性文件的一一對應關(guān)系。 圖3.1 圖形數(shù)據(jù)與屬性數(shù)據(jù)的關(guān)聯(lián) 關(guān)系 關(guān)聯(lián)屬性數(shù)據(jù)的方法 在MapX中,屬性數(shù)據(jù)與幾何數(shù)據(jù)的關(guān)聯(lián)是通過數(shù)據(jù)綁定實現(xiàn)的。 ?。?)、 什么叫數(shù)據(jù)綁定 數(shù)據(jù)綁定是將外部數(shù)據(jù)引入MapX的過程。 可以綁定的數(shù)據(jù)源包括以下類型: 類型 描述 ADO 使用ADO(Active data objects) DAO DAO對象,可以是VB中的data control、Access表格等,也可自 己創(chuàng)建 Delphi 使用Borland BDE數(shù)據(jù)源 Global Handle lets you pass in a block of tab-delimited data Layer 創(chuàng)建一個Dataset,使用MapInfo表字段 Notes View/NotesQuery 專門用于Lotus Notes ODBC 可以使用ODBC從任何ODBC數(shù)據(jù)源中獲取數(shù)據(jù) OLE Data 用于containers,如PowerBuilder RDO MS Remote Data Objects和RDO結(jié)果集對象 safeArra COM數(shù)據(jù)集,與safearray中的數(shù)據(jù)進行靜態(tài)綁定 Unbound 兼容其它 ?。?)、 數(shù)據(jù)綁定的強大作用 數(shù)據(jù)綁定主要有兩個作用。 ? 以地圖中的圖形對象來顯示數(shù)據(jù) 通過數(shù)據(jù)綁定,可以將BindLayer對象作為一個參數(shù),使用Datas ets.Add方法將自己的表轉(zhuǎn)變?yōu)橐粋€DataSet。這將在地圖中創(chuàng)建一個 新的圖層,并且將表中的數(shù)據(jù)以點等圖形對象表示。一旦將數(shù)據(jù)引入 地圖,就可以很容易地使用MapX創(chuàng)建應用程序,并實現(xiàn)多種地圖功能 。 ? 將屬性數(shù)據(jù)綁定到地圖中,并創(chuàng)建專題圖 如果地圖對象中包含相應的屬性信息,也可以使用Datasets.Add 方法將某個屬性字段添加到地圖中,進而就可以按照需要創(chuàng)建相關(guān)的 專題圖。 (3)、 數(shù)據(jù)綁定的實現(xiàn)方法 使用Datasets.Add可以將用戶數(shù)據(jù)綁定到地圖中。 在MapX中,每張地圖對應多個圖層(Layers),每一個圖層(La yer)都有一個Datasets,其中包含DataSet對象。Datasets擁有一些 屬性和方法,用來在集合中添加和刪除Dataset 對象,主要方法包括 Add和Remove。 使用Datasets.Add綁定的最終結(jié)果是Dataset對象的創(chuàng)建。這個D ataset對象被加入到Datasets集合中,包含了被綁定圖層的對象的計 算結(jié)果。比如說,如果數(shù)據(jù)被綁定到US_States地圖,每一個州將對 應一個新的數(shù)據(jù)值,這個數(shù)據(jù)值被用來控制地圖的繪制。如果數(shù)據(jù)源 中含有某個州的多個記錄,則這些記錄的值可以進行累加、平均值等 計算。使用Dataset的Value方法可以取得地圖中每一個對象的計算結(jié) 果。 DataSets.Add方法詳解 Datasets.Add方法的使用主要需確定所綁定數(shù)據(jù)源的類型、綁定 到地圖的哪一層以及與地圖之間關(guān)聯(lián)的字段。語法如下: Datasets.Add Type, SourceData, [Name], [Geofield], [SecondaryGeofield], [BindLayer], [Fields], [Dynamic] []中的參數(shù)是可選的,程序中可以省略或傳遞EmptyParam。Empt yParam在Delphi中已定義的OleVariant類型參數(shù),表示未用參數(shù)。 ? Type Type的取值范圍為DatasetType常量,對應于可綁定的數(shù)據(jù)類型 , DatasetType的定義如下: DatasetType=[miDatasetADO,miDatasetDelphi,……,miData setLayer,miDatasetODBC,miDatasetUnbound] 其中miDatasetLayer表示綁定的是MapInfo表(.TAB),miDatas etODBC表示綁定的是ODBC 數(shù)據(jù)源中的表。 ? SourceData 根據(jù)DatasetType的不同,SourceData有不同的取值,如miDatas etLayer對應MapInfo表,miDatasetODBC對應ODBCQueryInfo對象等等 。因此,在引如ODBC數(shù)據(jù)時,需要首先創(chuàng)建ODBCQueryInfo對象,并 為其參數(shù)ConnectString、Datasource和SqlQuery賦值。 ? Name String類型,唯一標識Dataset,默認名稱為Dataset1、Dataset 2……。 ? Geofield 指定數(shù)據(jù)源中包含地理信息的字段名稱或索引。如果不指定,則 MapX會自動在GeoDictionary中搜索,看哪個字段包含地理信息。比 如在“世行項目”中,表T_DJQH的xzqybh字段其實就是用來標識地圖 中地級行政區(qū)劃的,因此在調(diào)用Datasets.Add時Geofield參數(shù)即傳遞 xzqybh。 如果要將數(shù)據(jù)表示為地圖上的圖形對象,數(shù)據(jù)源中GeoField所表 示的字段必須唯一,并且被用來命名新的圖層中的對象。非唯一值將 在新的圖層中以一點代替,重復記錄對應的數(shù)據(jù)值將被求和。 如果定義了Fields,則Geofield參數(shù)將表示Fields中的字段,而 不是sourcedata。 可以看到,Geofield在幾何數(shù)據(jù)與屬性數(shù)據(jù)關(guān)聯(lián)中起了絕對關(guān)鍵 的作用。 ? Secondary Geofield 只有當被綁定的數(shù)據(jù)集有非唯一主鍵時才定義該參數(shù)。 ? BindLayer 指明外部數(shù)據(jù)應該綁定到地圖中的哪一層。.該參數(shù)可選,未指 定時MapX自動在GeoDictionary中查找相匹配的圖層。但是從性能考 慮,在肯定的情況下應當明確指定。 ? Fields 描述外接數(shù)據(jù)源中的哪些字段被引用,以及當數(shù)據(jù)源中有多條記 錄對應一個地圖對象時使用哪些集合函數(shù),默認的集合函數(shù)是SUM( 求和)。 如果該參數(shù)有定義,則Geofield和SecondaryGeofield參數(shù)均將 其作為參照。 ? Dynamic 布耳類型參數(shù),用于控制數(shù)據(jù)綁定是否動態(tài),默認為False,表 示靜態(tài)綁定,即當數(shù)據(jù)庫被打開時MapX將拷貝所需數(shù)據(jù);如果設定為 True,MapX會以實時的方式訪問數(shù)據(jù)。 三、 專題圖的生成 1、 專題地圖的概念 MapInfo的一個顯著特征就是能將數(shù)據(jù)庫中的信息進行直觀的可 視化分析。專題地圖就是用于分析和表現(xiàn)數(shù)據(jù)的一種強有力的方式。 用戶可以通過使用專題地圖的方式將數(shù)據(jù)圖形化,使數(shù)據(jù)以更直觀的 形式在地圖上體現(xiàn)出來。當使用專題渲染在地圖上顯示數(shù)據(jù)時,可以 清楚地看出在數(shù)據(jù)記錄中難以發(fā)現(xiàn)的模式和趨勢,為用戶的決策支持 提供依據(jù)。專題地圖是MapInfo中的一個重要概念,是用戶使用好Map Info的一種體現(xiàn)。 制作專題地圖是根據(jù)某個特定專題對地圖進行“渲染”的過程。 所謂的專題渲染,就是以某種圖案或顏色填充來表明地圖對象(點、 線、區(qū)域)的某些信息(例如人口、大小、年降雨量、日期等等), 也就是說,這類渲染存在著主題,經(jīng)過這樣渲染的地圖就是專題地圖 。利用MapInfo,可根據(jù)數(shù)據(jù)庫表中特定的值來賦給地圖對象顏色、 圖案或符號,從而創(chuàng)建不同的專題地圖。 2、 專題圖的六種類型 MapInfo為創(chuàng)建專題地圖提供了強有力的支持。用戶可以使用范 圍值、等級符號、點密度、獨立值、直方圖和餅圖等多達六種方式來 創(chuàng)建不同的專題地圖。 ?。?)、 范圍值 按照設置的范圍顯示數(shù)據(jù)。這些范圍用顏色和圖案進行渲染。范 圍專題地圖能夠通過點、線和區(qū)域來說明數(shù)值,在反映數(shù)值和地理區(qū) 域的關(guān)系(如銷售數(shù)字,家庭收入),或顯示比率信息如人口密度(人 口除以面積)時是很有用的。 ?。?)、 等級符號 等級符號為表中每條記錄顯示一個符號,符號大小與數(shù)據(jù)值成比 例。等級符號地圖用特定的數(shù)值來顯示數(shù)據(jù)點,對于闡明定量信息( 如由高到低依次變化)很有用處。符號的大小與該點對應的數(shù)值成比 例,數(shù)值越大點就越大,數(shù)值越小點就越小。因此,等級符號最適合 數(shù)據(jù)值數(shù)據(jù)。 ?。?)、 點密度 在地圖上用點來顯示數(shù)據(jù),每一點都代表一定數(shù)量,某區(qū)域中點 的總數(shù)與該區(qū)域數(shù)值成比例。每個點代表一定數(shù)量的單元,該數(shù)乘以 區(qū)域內(nèi)總的點數(shù),就等于該區(qū)域的數(shù)據(jù)值。 (4)、 獨立值 按獨立數(shù)值渲染地圖,可以表達多個變量。根據(jù)獨立值繪制地圖 對象的專題地圖有助于強調(diào)數(shù)據(jù)的類型差異而不是顯示定量信息(如 給定區(qū)域內(nèi)的商店類型、分區(qū)類型等等)。 ?。?)、 直方圖 將表中每條記錄的專題變量顯示為一個直方圖。使用直方圖可分 析地圖中每條記錄的多個變量。比較每個直方圖中各直方條的大小可 考察表中某條記錄,比較所有直方圖中某一條的大小可考察所有記錄 的某個變量,而比較各直方圖的高度可考察整張表。用直方圖來表達 負值時,該條會沿直方圖反方向伸展。在疊加直方圖中不顯示負值。 ?。?)、 餅圖 以餅圖顯示表中各記錄的專題變量。餅圖可包含多個變量。在地 圖上使用餅圖可一次分析多個變量,比較每個圖中餅扇的大小可考察 表中某條記錄,比較所有餅圖中某一個餅扇,可考察所有記錄中某個 變量的變化,比較各餅圖的直徑可考察整張表。 3、 MapX對專題圖的支持 MapX中使用Themes集合與Theme對象來實現(xiàn)對專題圖的支持,每 個Themes集合中可以包含多個Theme對象,也就是說,針對一個Datas et,可以創(chuàng)建多幅不同的專題地圖。 每個Dataset都擁有一個Themes集合,并以其屬性的形式存在, 即Dataset.Themes。使用Themes的Add、Remove、RemoveAll等方法可 以控制專題的添加和刪除。 ? Add方法:創(chuàng)建一個專題并將其加入到某個特定的DataSet的Themes集 合中, Map1.Datasets(1).Themes.Add(miThemeRanges,’’’are a’,’Myranges Theme’) ? Remove方法:從集合中刪除某一特定的專題圖 Map1.Datasets(1).Themes.Remove "My Ranges Theme" ? RemoveAll方法:從集合中刪除所有的的專題圖 Map1.Datasets(1).Themes.RemoveAll Theme對象用于設置每個專題圖的屬性。 比較重要的有 ? Layer:返回一個Layer對象,表示該專題圖所在的圖層 ? Legend:控制 對專題地圖的說明,即圖例 ? ComputeTheme 控制是否可以對原始數(shù)據(jù)進行計算,默認為True ? Type 即專題圖類型,取值范圍為ThemeTypeConstants ? Fields 只讀屬性,返回該專題圖所基于的Dataset中的字段集 合 ThemeProperties 復合型屬性,對應ThemeProperties對象,包 含了專題圖詳盡的定義信息,如范圍定義、顯示風格設置等。 4、 專題圖的規(guī)劃 在創(chuàng)建專題圖的過程中,有幾個關(guān)鍵因素,包括專題圖變量的確 定、屬性數(shù)據(jù)的獲取以及專題圖層的顯示與控制。 ?。?)、 確定專題圖變量 在專題圖中顯示的數(shù)據(jù)就是專題圖變量。例如在行政區(qū)面積專題 圖中,表示面積的字段“area”就是這個專題地圖的專題地圖變量。 一個專題變量可以是一個字段或表達式。取決于專題圖的類型, 在一張地圖上可以顯示一個或多個專題圖變量。范圍值、等級符號、 點密度和獨立值地圖都只檢查一個變量??梢岳蔑瀳D或直方圖一次 顯示多個專題變量。也可以創(chuàng)建雙變量專題地圖,其中一個地圖對象 可代表兩個不同的數(shù)據(jù),入符號的顏色代表一個專題變量,符號的大 小代表另一個專題變量。 ?。?)、 屬性數(shù)據(jù)的獲取 在創(chuàng)建專題地圖之前,必須確定需要顯示何種信息,信息存儲在 什么位置。它可以在創(chuàng)建地圖時所基于的表中,也可以在ODBC支持的 外部數(shù)據(jù)庫中。數(shù)據(jù)來源于Field對象或Field集合,在Themes.Add方 法中通過Fields參數(shù)傳遞。 ?。?)、 創(chuàng)建專題圖 首先應將某個產(chǎn)生專題圖數(shù)據(jù)的dataset引入地圖中,之后使用T hemes.Add方法創(chuàng)建一個Theme對象。 curmap.Datasets(1).Themes.Add(miThemeRanges,‘TotPop’, ‘’); 語法: Themes.Add [Type], [Field], [Name] Type用于定義要創(chuàng)建的專題圖的類型,它的取值范圍是ThemeTyp eConstants,該參數(shù)可選,如果沒有定義或者定義為miThemeAuto,Ma pX會根據(jù)字段數(shù)以及已經(jīng)存在的專題圖類型自動在ThemeTypeConstan ts中選擇一個。如果MapX無法自行確定專題類型,就會產(chǎn)生一個錯誤 。 Field(s)定義在專題圖中使用的一個或多個字段,可以通過字段名、 字段索引或字段對象來引用。當創(chuàng)建多變量專題圖時,可以使用數(shù)組 表示。該字段是可選的,若不特意指定,MapX會使用DataSet中的第 一個數(shù)字型字段。 Name,即專題圖的名稱,String類型參數(shù),若不指定,MapX會自 動生成一個名字。 ?。?)、 專題圖類型常量 專題圖變量由Theme.Typeproperty取得,其定義如下: miThemeRanged = 0 miThemeBarChart = 1 miThemePieChart = 2 miTheme GradSymbol = 3 miThemeDotDensity = 4 miThemeIndividualValue = 5 miThemeAuto = 6 miThemeNone = 9 5、 控制專題地圖 有兩種方法可以控制專題地圖。 (1)、 使用Theme.ThemeDlg方法 該方法顯示一個對話框,用戶可以直接修改專題圖特性。語句如 下: curmap.Datasets(1).Themes(1).ThemeDlg; 這種方法雖然簡單,但是而且很難與自己的程序風格相一致,用 戶界面不友好,而且在這個默認的對話框中,用戶可以隨意改變?nèi)魏?/P> 設置,使得程序的控制難度加大。 ?。?)、 改變ThemeProperties對象屬性 通過設置ThemeProperties對象屬性,可以使用自己定制的界面 ,給用戶有限的修改能力,實現(xiàn)起來也非常簡單,而且對用戶的操作 有全部的控制權(quán)。 ThemeProperties對象是Themes集合中的一員,主要用于定義專 題地圖的顯示,包括顏色、符號等。不同類型的專題圖有自己與眾不 同的一些特性,在ThemeProperties中有其分別的定義。如DotSize專 用于設定點密度專題圖中點的大小,NumRanges專用于設定范圍值專 題圖中的范圍分布,SymbolStyle控制等級符號專題圖使用的符號類 型,ValuePerDot用于在點密度專題圖中每個點所代表的值。 ThemeProperties對象的屬性中有許多又屬于其他對象,如Range Category、IndividualValue、Style 等,可進行更深層次的設定。 6、 自定義圖例 專題地圖被創(chuàng)建后,MapX會自動生成一個圖例來解釋顏色、符號 或大小所代表的含義。同ThemeDlg一樣,可以直接用LegendDlg 方法 調(diào)用默認的Legend對話框,但更常用的依舊是訪問Theme.Legend 屬 性來進行一些個性化的設置。 如在程序中可以做如下設置: var lgd: CMapXLegend; lgd:=curmap.datasets.item(1).themes.item(1).lege nd; with lgd do begin title:=′面積專題圖′; subtitle:=′圖例′; ShowCount := false;//去掉默認生成的結(jié)果個數(shù) end; 需要注意的是,Legend的Width和Height屬性是只讀的,顯示位 置應該由Top和Left改變,單位為屏幕象素點。 7、 代碼分析 以下是面積專題圖的實現(xiàn)代碼: procedure Tmainform.Ntheme1Click(Sender: TObject); var par : Variant; ds : CMapXdataset; fields: CMapXFields; begin try curmap.datasets.removeall;//清空數(shù)據(jù)集中的所有Data set對象 par := CreateOleObject(′MapX.ODBCQueryInfo.4′);// 創(chuàng)建ODBCQueryInfo對象 //設定ODBCQueryInfo的參數(shù) par.SqlQuery := ′select * from T_DJQH′; par.DataSource := maindm.MYDB.AliasName; //par.ConnectString := ′ODBC;user=user1;pwd=aaa;dlg=2′; //對應ODBC表將要使用的字段引入fields fields := CoFields.Create; fields.Add(′xzqybh′,′xzqybh′,miAggregationIndividu al,miTypeNumeric); fields.Add(′area′, ′area′, miAggregationIndividual,miTypeFloat); //生成Dataset,并建立關(guān)聯(lián) ds := Map1.Datasets.Add(miDataSetODBC, par, EmptyParam, ′xzqybh′, EmptyParam, ′Djqh′, fields, EmptyParam); //專題圖 ds.Themes.Add(miThemeIndividualValue, ′area′, ′mytheme1′,true); //自定義圖例 with ds.Themes.Item(1).legend do begin title:=′面積專題圖′; subtitle:=′圖例′; ShowCount := false; end; except on E: EOleException do Application.MessageBox(PChar(E.Message), ′錯誤′, MB_OK or MB_ICONERROR); end; end; 說明: ?。?)、 curmap是主界面中的地圖變量; ?。?)、 ds也可定義成variant類型變量,但這時無法使用ds.Themes.Item(1) .legend,而且,定義為CmapXdataset后可使用Delphi中的智能代碼 功能,激活實時幫助系統(tǒng),編程更方便; ?。?)、 當使用Datasets.Add方法連接ODBC數(shù)據(jù)源數(shù)據(jù)時,第一 個參數(shù)dataset類型應為miDatasetODBC,同時需要使用ODBCQueryInf o對象作為Datasets.Add方法的第二個參數(shù), ? DataSource屬性 用于設置ODBC數(shù)據(jù)源的名字。如果保留不寫,則在程序運行時會 出現(xiàn)一個對話框,要求用戶選擇。ODBC數(shù)據(jù)源可以在Windows控制面 板中設置。 ? SqlQuery屬性 即從ODBC數(shù)據(jù)庫中選取數(shù)據(jù)的SQL字符串。 ? ConnectString屬性 包含與ODBC數(shù)據(jù)源連接的信息,通常包括"ODBC;"、"uid=", "pwd=", or "DLG="。"uid="表示登錄名, "pwd="表示登錄密碼,"DLG=" 控制登錄對話框的顯示: DLG=0表示不顯示對話框 DLG=1表示總顯示對話框 DLG=2只有當信息不完整時顯示登錄對話框。 mapX的基本 性 MapX的基本屬性 每個Map對象主要包括Datasets、Layers、Annotations三個對象集合 。 Map對象有一些主要的屬性,如Zoom用來設置放大級別(在地圖上顯 示的大?。琑otation控制地圖的旋轉(zhuǎn)角度,CenterX和CenterY用于 設置x和y的坐標系,這要取決于地圖的投影。 Map對象的許多屬性本身又是一個對象,比如說一幅地圖由多個圖層 組成,則在一個Map對象中存在一個單獨的layers集合,其中包含所 有圖層的信息。 ? Layers 在MapX中,每張單獨的地圖都被表示成單獨的一個圖層,所有的圖層 存儲在layers集合中。Layers集合由Layer對象組成,按順序編號為0 到n。Layer對象由features對象組成,features對象又是由Feature 對象組成,對應于地圖中的點、線、區(qū)域或符號。 最上面一層為Layers(1),Layers(2)位于Layers(1)的下面,以次類 推。最下面的圖層最先繪制,最上面的圖層最后繪制。在應用程序中 ,合理地安排好每層在Layers中的順序是至關(guān)重要的。比如說有兩個 圖層,一層為點,一層為區(qū)域,則應將點層放到區(qū)域?qū)拥纳戏?,否則 區(qū)域會將點覆蓋。 另外,在進行地圖選擇操作時,根據(jù)要求調(diào)整圖層的順序也是十分重 要的。MapX中的選擇工具總是從可選擇圖層中的最上層開始選擇,如 果在地圖上的同一位置存在多個位于不同層的地圖對象,其結(jié)果是很 難精確地選擇到目標對象。因此,最好將被選擇圖層提到最上層顯示 。 ? GeoSets GeoSet是在GeoManager中建立好的.GST文件,類似MapInfo中的WorkS pace概念,是圖層及其設置的集合,控制程序中顯示的地圖。也可以 在運行階段設置GeoSet,此時將導致已經(jīng)加載的所有圖層和DataSet 被刪除而由GeoSet中定義的圖層所代替。如果單純地想刪除所有圖層 ,只需給GeoSet賦一個空字符串即可。 可以使用GeoSet Manager程序來管理GeoSet 文件(*.GST)。默認情 況下.GST文件存儲在…\mapxmaps目錄下,可以調(diào)用GeoDictionary Manager程序進行修改,指向用戶程序數(shù)據(jù)所在的位置。 ? Datasets Datasets用于實現(xiàn)地圖與數(shù)據(jù)的綁定。舉例說明,有一個關(guān)于城市銷 售情況的MSAccess 數(shù)據(jù)庫和一張該城市的地圖,則可以將二者綁定 ,在地圖上形象地顯示出各城市銷售業(yè)績的趨勢,這一點是表格數(shù)據(jù) 無法做到的。 建立地圖信息與屬性數(shù)據(jù)之間聯(lián)系的過程稱之為自動綁定或自動匹配 (autobinding /automatching)。要實現(xiàn)這一過程,必須首先將地 圖在GeoDictionary 中注冊。 屬性數(shù)據(jù)表示的可視化使得創(chuàng)建專題地圖成為可能。 數(shù)據(jù)綁定"Putting Your Data on the Map" 專題地圖"Theme Mapping and Analysis" ? Annotations Annotations集合提供了操縱地圖中文字和符號的簡單方法。Annotat ions位于所有其它圖層的上方并且不與任何數(shù)據(jù)連接,有點兒象MapI nfo中的透明圖層。 Annotations包括以下主要的屬性與方法:AddSymbol在Annotations 中增加符號,符號類型使用Map.DefaultStyle定義;AddText在Annot ations中增加文本;Remove刪除特定的標注.;Type取值為miSymbolA nnotation或miTextAnnotation。 Annotations還有一個非常重要的屬性Graphic,其定義為Graphic對 象,在該對象中包含了符號或文本的樣式、位置等信息,即Graphic 的Caption、Position、Style 、X、Y屬性。如Annotations的Type屬 性定義為miTextAnnotation,則可以定義Graphic的Caption屬性設置 標注的字符串。 ? 可創(chuàng)建對象 在MapX對象模型中,以下對象是可以被創(chuàng)建的: AffineTransform、BindLayer、BitmapSymbols、CoordSys、Datum、 Feature、Fields、LayerInfo、Map、 ODBCQueryInfo、 Parts、Point、Points、Rectangle、RowValue、RowValues、Style 、Variables、NotesQueryInfo、NotesViewInfo。 在Delphi中創(chuàng)建這些對象需要注意一點,即在后面注明MapX的版本。 如在本課題實現(xiàn)過程中,由于使用的是MapX 4.0版本,因此創(chuàng)建語句 要寫成 s := CreateOleObject(′MapX.Style.3′); //////////////////////////////////////////// access表-->MI表有兩種途徑: 1.bindlayerXY方式綁定。指定bindlayer.filespec就可以創(chuàng)建永久表,不指定則為臨時表。 Private Sub Command4_Click() '只能創(chuàng)建一個字段,GeoName,來源于City字段。當City字段不能唯 一是,state字段用于限定。 '不能創(chuàng)建索引 Dim BindlayerObject As New mapxlib.BindLayer Dim db As DAO.Database Dim rs As DAO.Recordset Dim ds As mapxlib.Dataset Set db = DBEngine.WorkSpaces(0).Opendatabase("C:\Program Files\MapInfo\MapX 4.0\Data\Mapstats.mdb") Set rs = db.OpenRecordset("US_Cust") BindlayerObject.LayerName = "新圖層名" BindlayerObject.Filespec = App.Path + "\mytab.tab" '若不指定 ,則為臨時表 BindlayerObject.RefColumn1 = "X" BindlayerObject.RefColumn2 = "Y" BindlayerObject.LayerType = miBindLayerTypeXY Set ds = Map1.Datasets.Add(miDataSetDAO, rs, "數(shù)據(jù)集名", "City", "State", BindlayerObject) End Sub 2.layerInfo新建表 layers.add lyrinfo創(chuàng)建好一個有完備字段的空表 ds.rowvalues, lyr.addfeature ftr,rvs填入圖元和屬性 Private Sub Command1_Click() '可以創(chuàng)建多個字段 'mapx5中可以創(chuàng)建索引,mapx4中不可以 Dim rs As DAO.Recordset Dim db As DAO.Database Dim flds As New MapXLib.Fields Dim lyrNew As MapXLib.Layer Dim ptNew As New MapXLib.Point Dim ftrNew As MapXLib.Feature Dim ff As MapXLib.FeatureFactory Dim li As New MapXLib.LayerInfo Dim rvs As New MapXLib.Rowvalues Dim ds As MapXLib.Dataset Set db = DBEngine.OpenDatabase("C:\Program Files\MapInfo\MapX 4.0\data\mapstats.mdb") Set rs = db.OpenRecordset("US_Cust") Set ff = Map1.FeatureFactory flds.AddStringField "Company", 50 ,true 'mapx5中可以創(chuàng)建索引 , 'flds.AddStringField "Company", 50 'mapx4中不可以創(chuàng)建索引, flds.AddStringField "City", 50 flds.AddStringField "State", 2 flds.AddNumericField "Order_Amt", 12, 2 li.Type = miLayerInfoTypeNewTable li.AddParameter "FileSpec", App.Path & "\custtab.tab" li.AddParameter "Name", "mycustomers" li.AddParameter "Fields", flds Map1.Layers.Add li, 1 '到此為止,已經(jīng)用access表建好mapinfo表,也設置好了字段,但是 沒有圖元在上面,也沒有記錄。 '下面從access表中x,y創(chuàng)建點圖元,同時把其屬性數(shù)據(jù)也添加進去 '----------------------------------------------------------- --------- Set lyrNew = Map1.Layers(1) Set ds = Map1.Datasets.Add(miDataSetLayer, lyrNe //////////////////////////////////////////////////////////////////////////////////////// 網(wǎng)上找到的!感覺應該有點用!需要了解的同志可以看看!本人正在學習中,,,,還沒弄明白,如果有高手或者先龍明白的請指點指點!?。。。?/P> |
|
來自: 昵稱QAb6ICvc > 《gis應用》