1. 程式人生 > >WebGIS 之 ArcGIS API for JavaScript 總結(一)

WebGIS 之 ArcGIS API for JavaScript 總結(一)

幾天時間過完了一本《WebGIS 從基礎到開發實踐》

如今閱讀技術書籍也同讀小說一樣,風裡來雨裡去,恢巨集鉅著,從洪荒原始到當今現代。由於是媳婦在圖書館給借的書,在這裡將這本書做一個總結和筆記。

一、為什麼要讀這本書。

美國的esri公司,全稱美國環境系統研究所公司(Environmental Systems Research Institute, Inc.)是全世界最大的最專業最領先的地理資訊軟體及解決方案提供商,相當於oracle在資料庫行業的地位,也相當於windows在作業系統領域的地位,也相當於IBM在伺服器行業的地位,還相當於EMC在儲存裝置領域的地位。沒錯,esri是一家技術壟斷的商業公司,因此它能夠提供眾多的,全面的,可靠的,專業的地理資訊解決方案。

但是,既然涉足資訊科技領域,那麼就必然有開源社群與之匹配(作對),由於本人目前只專注webgis領域,故僅提web的B/S兩端。WebGIS的伺服器端主要負責將目前所有的地圖儲存格式及地理資訊,進行適當的格式化,並按照一定的規則提供成為Web上面能夠訪問的資源。esri的產品叫做ArcGIs server,相應的開源軟體叫做geoServer。WebGIS的客戶端都是基於javascript語言的,主要功能為獲取WebGIS伺服器資源,適當組織後展示給使用者,並提供一些互動功能。esri在前端的產品就是這個ArcGIS API forJavaScript框架,這個東西應該是隨著其他產品附送的,沒有看到有收費要求,在官網上面註冊就可以下載(2018年中美貿易大戰,禁止中國區下載,可以到

此處下載),也可以使用CDN的線上版本。相應的前端開源軟體為大名鼎鼎的openlayers。

二、這本書的內容範圍

這本書針對前端應用,介紹了gis的一下基礎知識,對於ArcGIS server僅簡單介紹釋出服務的方法,另介紹了dojo的使用,介紹了ArcGIS API for JavaScript框架的使用。書中內容繁雜,略去所有無用的東西,只留乾貨。

三、地圖資源

自己釋出

可以使用ArcMap或者ArcCatalog軟體來發布自己的ArcGIS服務,ArcGIS server釋出的服務預設都是REST風格的,當然也支援其他風格供需要的客戶端使用。ArcGIS server釋出的服務的url類似於:http://<hostname>:<port>/arcgis/rest/services。

線上資源

ArcGIS Online提供了一些esri公司提供的公共的線上的ArcGIS server服務,主要有下面三個位置:

訪問進去之後即可看到所有服務的詳細內容,預設是REST風格。可以看到:圖層名稱、文件資訊、支援的程式介面等。

另外還有眾多的其他的線上資源,例如國內的百度地圖(需要做特殊的座標轉換),天地圖,高德地圖,國外的bing地圖,谷歌地圖等等。

這麼多的地圖資源,無論是來自於建設規劃、商業設計還是線上應用等領域的需求,基本上都能滿足。

四、ArcGIS API for JavaScript

dojo

這個框架基於dojo框架,開發。本人也是第一次學習dojo框架,之前看到相關的語法(reqire/define)都會避之不及,通過學習,認為dojo還是一個不錯的框架。dojo基本上可以實現jquery及其一些組建(例如easyui)的大部分類似功能,其幾乎包含了js操作的所有需求。其與其他框架最打的區別是按需載入,僅載入有用的組建。可以很大的減少網路開銷,提高頁面相應效率。所以說,對於ol辦公系統,jquery系列還算可以,但是如果是使用者群裡較大,訪問較為頻繁的web站點,那麼應該是使用dojo。至於為什麼要使用框架,一方面是加快開發速度,統一頁面風格,提高程式碼質量,另外一方面很大的原因是要解決跨瀏覽器的問題,這個做個前端的人都可以理解。在這裡還要推薦一個解決跨瀏覽器問題的小的工具,叫做Ployfill,具體自己百度。

哈哈,書上兩章的內容,我一段話帶過。具體學習的話可以直接上dojo toolkit的官網,翔實的學習資料,眾多的demo,跟著做幾個就明白它的套路了。

地圖物件(Layer-Map-View)

本文不分析框架結構,有興趣的可以直接上API網站自行組織,本人發現這個框架(名字太長,後面通稱‘這個框架’)的結構有一定的變化,畢竟是商業公司的程式碼,改起來好不心疼,只要是領導覺得對,就改。

1.攜帶地圖資源的物件是Layer(直接決定了能夠顯示的線上地圖種類)

最主要的是TileLayer,可以載入所有符合WMS標準的SOAP格式的地圖Web服務,不需要問這些名詞是什麼,只管用就行。ArcGIS server釋出的地圖服務一般都支援這個格式。其他的伺服器釋出的也基本上都支援。

對於一些比較浪的地圖服務,你用TileLayer物件無能為力,可以使用WebTiledLayer類來載入,可以自定義載入引數(x,y,z)。

對於比較名牌的地圖服務,比如osm,可以直接在Map物件中,定義basemap屬性為‘osm’來實現。同時Map物件的basemap屬性還支援如下眾多,做地圖的話,個人認為足夠了,如果想使用速度更快的國內底圖,那麼就嘗試前面兩段中的兩個物件吧。

{name:'streets'},
{name:'satellite'},
{name:'hybrid'},
{name:'topo'},
{name:'gray'},
{name:'dark-gray'},
{name:'oceans'},
{name:'national-geographic'},
{name:'terrain'},
{name:'osm'},
{name:'dark-gray-vector'},
{name:'gray-vector'},
{name:'streets-vector'},
{name:'topo-vector'},
{name:'streets-night-vector'},
{name:'streets-relief-vector'},
{name:'streets-navigation-vector'}

WMSLayer/WMTSLayer類是用來載入WMTS規範的地圖的,之間我沒有看出功能上的區別,只是格式不同而已,個人認為屬於比較早期各種技術不太先進的時候,大家做的一套解決方案,現在不知道用的還多不多,理解有限,誠懇希望得到您的矯正。

GraphicLayer是純客戶端的一個layer物件,用來承載資料表,圖形,與Draw工具搭配使用來顯示和符號化Draw繪製出來的圖形。GraphicLayer還可以相應一些事件。

MapImageLayer允許你把一張image展示到地圖上,影象可以來自伺服器,甚至可以來自前端客戶機,但是和影象一同提供的還要有TFW檔案(用來描述影象的空間位置資訊)。

KMLLayer 基於谷歌標準的地圖服務都可以用這個來載入

這個框架不支援熱度圖,因此需要採用第三方工具,例如Patrick Wied,整合一個DynamicMapServiceLayer類,實現熱度圖。

2.組織圖層資源的物件是Map

Map可以將眾多的圖層組織在自己內部(一個數組屬性)

3.呈現地圖的物件是View

這個框架提供了兩個實現MapView和SceneView,前者是2d的地圖,後者是3d的地圖,效果很不錯。

空間參考系統

計算機專業的人對於所謂的參考系統都不是很理解。對於一個基於座標的應用,那麼每個座標都要有其基準,或者說通過什麼來確定這個座標值的相對位置。空間參考系統分為:地理座標系統和投影座標系統。地理座標系統是真實的地球定位座標系統,一般採用經緯度座標系統,也有極座標系統。投影座標系統,是為了解決平面顯示球形物件時候,的一個投影座標系統,將一個球上面的所有點通過一定的投影方式對應到平面上來。由於html5技術的實現,web已經可以進行三維展示,就像上面圖片中的地球一樣,所以這裡投影的目標不一定都是2維的平面,也有可能是三維的球面。

SpatialReference類用來設定空間參考系統。

EPSG,在地理資訊行業這個簡寫經常見到,那麼有多少人知道它的來歷呢。European Petroleum Survery Group歐洲石油調查組織是也。他們對於空間參考系統進行了總結,並且都編上了id,例如id為4326的空間參考系統極為WGS84地理座標系統,id為102113、102100、3857等都是web墨卡託投影,只是其中的引數稍有區別。這個id的全稱為wkid(Well-Known id)。

對於使用地理座標系統和投影座標系統的地圖,都要求切片圖層的空間參考與地圖的空間參考一致。因此涉及到需要將某一種地理座標系統轉換為某一種投影座標系統,或者反過來轉換。這個框架的esri/geometry/webMercatorUtils模組中提供了函式可以進行簡單轉換,對於複雜的轉換需要呼叫後臺的esri/tasks/GeometryService幾何物件服務完成。

一般從網路上通過SOAP或者REST風格介面獲得的符合WMS、WMTS規範的地圖切片資源都會自帶有空間參照系統,可以從Layer物件中獲取出來。如果要指定Map的空間參照系統,則可以在定義Map物件的時候,指定屬性extent,extent屬性中需要包含spatialReference屬性指明即可。

幾何物件

這個是用來實現地圖物件的互動性的,可以自己在地圖上面繪製一些圖形。esri/geometry/Geometry系列物件為幾何圖形類,可以使用esri/toolbars/Draw類來自定義小工具(widget)實現繪製功能。openlayers中實現繪製自定義圖形處理的我覺得比這個框架要好,openlayers中是把自定義圖形做成了一個vectorLayer,和從伺服器載入過來的向量圖層一樣的物件,這樣在控制起來,以及轉換成為其它格式輸出或者提交都更加方便。 暫時結束到這裡,還有要素圖層,專題圖層和空間分析三大塊,這些也是esri家族的拿手好戲,等到下次再總結吧。對於實際程式碼,由於版本更新較快,可以到官網上面查詢最新的demo和api。歡迎留言。