鐘立明,景 寧,熊 偉
(國(guó)防科技大學(xué)電子科學(xué)學(xué)院,長(zhǎng)沙 410000)
地理信息系統(tǒng)(GIS)的開發(fā)與應(yīng)用是近年來學(xué)術(shù)界研究的熱點(diǎn),特別是Web 端的應(yīng)用也是越來越廣泛,用戶只需要在瀏覽器上便可以迅速地實(shí)現(xiàn)瀏覽地圖、定位位置、路徑規(guī)劃、查找想知道的興趣點(diǎn)等等,動(dòng)態(tài)交互性強(qiáng),極大地方便了我們的工作和生活。另外,使用JavaScript 開發(fā)的Web 端比使用C#、ArcGIS Engine 為代表的C/S 開發(fā)更具優(yōu)勢(shì),JavaScript 可以通過HTML5輕松實(shí)現(xiàn)跨平臺(tái)[1],開發(fā)起來更加系統(tǒng)高效,可移植性好。
ArcGIS API for JavaScript 是美國(guó)Esri 公司推出的一套網(wǎng)頁(yè)端用戶二次開發(fā)接口[2],它是基于REST 服務(wù)接口和dojo 框架技 術(shù) 實(shí) 現(xiàn) 的,包 括Map、Layer、Graphic、Geometry、Point、Polyline、Polygon 等300多個(gè)類。
可以快速創(chuàng)建交互式地圖應(yīng)用;可以調(diào)用ArcGIS Server的GP 服務(wù),提供專業(yè)的分析結(jié)果;可以使用ArcGIS Server 的REST API,提供顯示、查詢、分析等功能;可以同時(shí)調(diào)用多個(gè)ArcGIS Server 的服務(wù),輕松實(shí)現(xiàn)Mashup。
用戶通過Web 瀏覽器端發(fā)出請(qǐng)求(比如點(diǎn)擊、瀏覽操作地圖等行為),Web 瀏覽器端對(duì)JavaScript 腳本代碼解釋,通過網(wǎng)絡(luò)將用戶請(qǐng)求發(fā)送至ArcGIS Server,ArcGIS Server 對(duì)發(fā)送過來的數(shù)據(jù)進(jìn)行分析處理,并按要求在數(shù)據(jù)庫(kù)中作出查詢處理,然后將查詢處理的數(shù)據(jù)結(jié)果返回至ArcGIS Server,ArcGIS Server 通過TCP/IP 協(xié)議傳遞給Web 瀏覽器,瀏覽器端將結(jié)果展現(xiàn)出來給用戶[3,4]。
工作原理如圖1所示。
圖1 工作原理
總體思想是:通過ArcMAP 建立地理數(shù)據(jù)庫(kù),創(chuàng)建所需要的網(wǎng)絡(luò)數(shù)據(jù)集,利用ArcGIS Server 發(fā)布Map 服務(wù),建立GPModel,利用ArcGIS Server 發(fā)布GPModel 服務(wù)[5],實(shí)現(xiàn)網(wǎng)絡(luò)分析功能,最后通過調(diào)用ArcGIS API for JavaScript 的有關(guān)接口,實(shí)現(xiàn)路徑規(guī)劃。
實(shí)現(xiàn)過程如圖2所示。
圖2 實(shí)現(xiàn)過程
ArcGIS 地理數(shù)據(jù)庫(kù)是存儲(chǔ)在通用文件系統(tǒng)文件夾或多用戶關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)(DBMS)(如Oracle、Microsoft SQL Server或PostgreSQL)中的各種類型地理數(shù)據(jù)的集合。
在ArcMap 中創(chuàng)建地理數(shù)據(jù)庫(kù)的步驟如下:
(1)創(chuàng)建與數(shù)據(jù)庫(kù)的文件連接。
(2)在文件連接目錄里,創(chuàng)建文件地理數(shù)據(jù)庫(kù)目錄。
(3)在文件地理數(shù)據(jù)庫(kù)目錄里,導(dǎo)入單個(gè)或多個(gè)要素類、單個(gè)或多個(gè)表、柵格數(shù)據(jù)集。
本文使用ArcMap10.4軟件對(duì)長(zhǎng)沙市地圖SHP(shapefile)數(shù)據(jù)建立地理數(shù)據(jù)庫(kù)。
路徑規(guī)劃是建立在網(wǎng)絡(luò)分析層的基礎(chǔ)上實(shí)現(xiàn)的。在ArcMap中,系統(tǒng)提供數(shù)據(jù)集構(gòu)建向?qū)?,首先在?dǎo)航數(shù)據(jù)道路層基礎(chǔ)上創(chuàng)建網(wǎng)絡(luò)數(shù)據(jù)集,其次在網(wǎng)絡(luò)數(shù)據(jù)集中創(chuàng)建網(wǎng)絡(luò)分析圖層,最后發(fā)布地圖服務(wù)。
2.2.1 創(chuàng)建網(wǎng)絡(luò)數(shù)據(jù)集
網(wǎng)絡(luò)數(shù)據(jù)集是由網(wǎng)絡(luò)元素組成。
網(wǎng)絡(luò)元素分為三種類型[6]:邊:網(wǎng)絡(luò)中必備元素。用于連接至其他元素(交匯點(diǎn)),也就是網(wǎng)絡(luò)中的線要素類。
交匯點(diǎn):網(wǎng)絡(luò)中必備元素。用于連接邊,便于兩條邊之間的導(dǎo)航。
轉(zhuǎn)彎:網(wǎng)絡(luò)中的可選元素。用于存儲(chǔ)于特定轉(zhuǎn)彎移動(dòng)方式有關(guān)的信息,如限制轉(zhuǎn)向。
在ArcMap 中建立網(wǎng)絡(luò)數(shù)據(jù)集的步驟如下:
(1)選擇地理數(shù)據(jù)庫(kù)目錄中shapefile 文件,新建網(wǎng)絡(luò)數(shù)據(jù)集。(2)添加新建網(wǎng)絡(luò)數(shù)據(jù)集名稱和要素。(3)選擇網(wǎng)絡(luò)連通性策略。(4)高程建模,默認(rèn)即可。
最后完成網(wǎng)絡(luò)數(shù)據(jù)集的建立。
新建網(wǎng)絡(luò)數(shù)據(jù)集如圖3所示。
2.2.2 創(chuàng)建網(wǎng)絡(luò)分析圖層
網(wǎng)絡(luò)分析圖層主要用于存儲(chǔ)網(wǎng)絡(luò)分析過程中的輸入和輸出,網(wǎng)絡(luò)分析執(zhí)行的對(duì)象始終是網(wǎng)絡(luò)數(shù)據(jù)集。
圖3 路網(wǎng)數(shù)據(jù)集
在ArcMap 中創(chuàng)建網(wǎng)絡(luò)分析圖層的步驟如下:(1)將新建的網(wǎng)絡(luò)數(shù)據(jù)集和要素類添加到地圖。(2)選擇自定義窗口工具條,激活Network Analyst 模塊。(3)新建路徑,使用創(chuàng)建網(wǎng)絡(luò)位置工具選擇2個(gè)??奎c(diǎn)代表起點(diǎn)和終點(diǎn)。(4)求解運(yùn)算。
網(wǎng)絡(luò)分析圖層如圖4所示。
圖4 網(wǎng)絡(luò)分析圖層結(jié)果
2.2.3 發(fā)布地圖服務(wù)
地圖服務(wù)是一種利用ArcGIS 將地圖文檔作為服務(wù)發(fā)布到Server 站點(diǎn)上,通過Web 瀏覽器進(jìn)行訪問的方法。使用ArcMap軟件,打開地圖文檔,從主菜單中選擇文件共享為服務(wù),選擇發(fā)布服務(wù)。
地圖服務(wù)發(fā)布成功,如圖5所示。
圖5 地圖服務(wù)發(fā)布截圖
GP 全名是Geoprocessing,又叫地理處理[7,8]。在WebGIS實(shí)際開發(fā)中,盡管ArcGIS API 提供了很多接口功能,但用戶需求是多樣化的,部分需求可能在API 中沒有實(shí)現(xiàn),而GP 服務(wù)剛好能夠彌補(bǔ)這一點(diǎn)。因此,可以發(fā)布GP 服務(wù),供前端使用。
結(jié)合路徑規(guī)劃模型建立一個(gè)GPModel,如圖6所示。
圖6 GPModel
GPModel 建立后,通過編譯成功運(yùn)行后,即可發(fā)布共享為地理處理服務(wù)。
Esri 公司提供在線的ArcGIS API for JavaScript,在Web 應(yīng)用中可直接引用,無需下載安裝;也可以下載API,然后安裝部署到所需的Web 服務(wù)器。
ArcGIS API for JavaScript 應(yīng)用程序部署的步驟是:①下載安裝。②配置IIS。打開打開控制面板-程序-打開或關(guān)閉Windows功能,勾選FTP 服務(wù)和Web 管理工具中的IIS 選項(xiàng)。ISS 功能打開之后,C 盤目錄下會(huì)多一個(gè)inetpub 文件夾,里面的wwwroot文件夾就是服務(wù)根目錄。③修改dojo.js 和init.js 文件的訪問路徑。④瀏覽器訪問init.js 文件測(cè)試部署是否成功。
Map 類包含儲(chǔ)存、管理和覆蓋視圖共有圖層的屬性和方法。通過在require()函數(shù)內(nèi)部引用的esri/Map 資源來創(chuàng)建一個(gè)新的Map 類。
部分代碼如下:
require([ "esri/map","dojo/domReady!"],function (Map){var map = new Map("map",{basemap:"osm",});
map.centerAndZoom(new esri.geometry.Point()});
ArcGISDynamicMapServiceLayer 允許調(diào)用ArcGIS Server REST API 公開的動(dòng)態(tài)地圖服務(wù)資源[9]。每次用戶請(qǐng)求進(jìn)入時(shí),動(dòng)態(tài)地圖服務(wù)都會(huì)在服務(wù)器上生成地圖圖像。
調(diào)用動(dòng)態(tài)地圖服務(wù)主要通過以下兩步實(shí)現(xiàn):
一是通過地圖服務(wù)創(chuàng)建ArcGISDynamicMapServiceLayer 對(duì)象。
部分代碼如下:
Var dlLayer = new ArcGISDynamicMapServiceLayer(dlLayerPath)});
二是將動(dòng)態(tài)地圖服務(wù)的對(duì)象添加到地圖容器中。
部分代碼如下:
require(["esri/layers/ArcGISDynamicMapServiceLayer",
"dojo/domReady!"],
Function(ArcGISDynamicMapServiceLayer){Var dlLayerPath =
http://localhost:6080/arcgis/rest/services/changsha/MapServer};
繪制主要使用Toolar 里的Draw 工具,實(shí)現(xiàn)的步驟如下:(1)創(chuàng)建繪圖對(duì)象;(2)激活繪圖工具;(3)繪制幾何圖形;(4)創(chuàng)建圖像;(5)加載到地圖。部分代碼如下:
require([ "esri/toolbars/draw","esri/graphic",
"esri/symbols/SimpleLineSymbol",
"esri/geometry/Polyline",
"dojo/domReady!"],
function (Draw,Graphic,SimpleLineSymbol,Color,Polyline){
map.addLayer(dlLayer);
var draw = new Draw(map);draw.on("draw-end",result);var drawqspoint = document.getElementById("drawstartpoint");
var drawjspoint = document.getElementById("draw-endpoint");var symbol1 = new esri.symbol.SimpleMarkerSymbol();var symbol2 = new esri.symbol.SimpleMarkerSymbol();}Web 瀏覽器運(yùn)行效果如圖7所示。
圖7 路徑規(guī)劃截圖
本文對(duì)基于ArcGIS API for JavaScript 的路徑規(guī)劃方法實(shí)現(xiàn)進(jìn)行了研究,結(jié)合長(zhǎng)沙市道路地圖數(shù)據(jù)進(jìn)行了Web 應(yīng)用上的驗(yàn)證。由于ArcGIS API for JavaScript 是在dojo 框架之上建立的[10],遵循AMD(異步模塊加載機(jī)制)規(guī)范,這種規(guī)范讓JavaScript 就像其它面向?qū)ο笳Z(yǔ)言一樣,通過模塊去管理代碼,可移植性和擴(kuò)展性強(qiáng),后續(xù)也可以根據(jù)用戶的實(shí)際需求對(duì)ArcGIS 進(jìn)行二次開發(fā)。