【轉】10.4新特性-ArcGIS 10.4矢量切片介紹


原文地址:http://zhihu.esrichina.com.cn/article/567

1、矢量切片簡介
GIS的底圖一直使用金字塔技術進行切圖,使用戶能夠快速訪問指定級別的地圖或者影像。但是切圖本身是一張圖片,無法進行交互。於是又引入了矢量圖層用來顯示矢量點線面,這通常需要先獲取矢量地理數據(例如GeoJson),然后通過前端將其繪制成不同元素便能通過鼠標進行響應交互了。

這種GIS組織方式在數據量比較小的時候並沒有什么大問題,但是在數據量比較大時(例如全國的詳細街區數據)存在以下幾個問題。首先,同一套數據的展示在不同的需求下可能需要不同的樣式(例如,白天和夜間模式)而對於傳統柵格切片對此需求必須重新進行切片;第二,由於切片的分辨率固定,分辨率過高切片體積過大,分辨率過低高清屏無法清晰顯示。第三,矢量數據的請求如果是按需請求每次都向服務器請求數據加重服務器壓力,如果一次請求按需展示,當矢量數據過大時(例如全國的水系數據)對於前端的壓力過大。

現在,矢量切片利用一些新技術來控制動態的可交互的地圖展示方式,這種新技術可以讓個人在移動端或者瀏覽器端自定義地圖樣式。矢量切片底圖可以將基礎底圖和工作數據進行融合,擴展了底圖的交互性。人們可以動態的賦予基礎底圖樣式以及通過配合可交互的工作數據來設計底圖樣式,根據內容進行智能制圖和實時分析並展示在基礎地圖上。那么,究竟什么是矢量切片技術?

矢量切片是一種利用協議緩沖(Protocol Buffers)技術的緊湊的二進制格式用來傳遞信息。當渲染地圖時矢量切片使用一系列儲存的內部數據進行制圖。被組織到矢量切片的圖層(比如道路、水、區域),每一層都有包含幾何圖形和可變屬性的獨立要素(例如姓名、類型等等)。通俗的說,就是將矢量數據以建立金字塔的方式,像柵格切片那樣分割成一個一個描述性文件,以GeoJson格式或者以pbf等自定義格式組織,然后在前端根據顯示需要按需請求不同的矢量瓦片數據進行Web繪圖。

矢量切片有切片的優勢——成熟的緩存、縮放比例技術,另外還有矢量數據能夠快速的提供地圖映射的優勢。一個矢量切片會以緊湊的解析的格式包含所有相對應的幾何圖形和元數據,像道路名稱、用地類型、建築物的高。因此矢量切片是一種高性能的格式,這種格式在樣式、輸出格式以及交互性方面提供了高度的靈活性。如下圖所示傳統金字塔方式進行切圖時在並沒有要素或者要素相同的區域依然需要進行多級切片,而矢量切片只需要設定不同要素顯示的級別即可。


             (1)矢量切片


        (2)傳統金字塔

目前如OpenStreetMap和Mapnik等開放社區平台倡導的矢量切片標准在過去幾年已經被一些主流的客戶端設備和制圖平台所采納。最近Mapbox的團隊為矢量切片開發了一套開放的說明,這個說明已經成為社區支持的標准。現在已經有十多個公司以及開源項目使用這種標准格式的矢量切片。相對於構建一個矢量切片的新接口說明,ArcGIS更傾向於通過采用並改進已有矢量切片說明來支持這種興起於社區的標准。這意味着ArcGIS中的350000個組織用戶可以通過矢量切片或者通過其他資源發布的可視化切片的形式來發布他們自己的數據。這將會使交互地圖和數據生態系統更加興旺。

矢量切片正逐步在ArcGIS的WebGIS平台上得到支持,目前JS API 3.15/4.0beta已經支持矢量切片的調用,ArcGIS Pro1.2增加了創建並可以發布到ArcGIS for Server 10.4或者ArcGIS Online的功能,同時在ArcGIS Online上也提供了一套在線的基礎矢量底圖,可以通過修改樣式文件對基礎矢量底圖樣式進行自定義修改。下一步矢量切片將會更加完善,並且在ArcGIS Runtimes以至於整個WebGIS平台上進行支持。Esri希望未來能夠在使用柵格切片的地方都可以使用矢量切片。

2、ArcGIS Online的基礎矢量底圖
2.1 基礎矢量底圖簡介
2015年早些時候,Esri宣布了ArcGIS平台引入矢量切片的計划現在我們已經初步支持矢量切片作為圖層加載到web map中了。作為其中的一部分,Esri提供了一系列可更新的矢量基礎底圖(目前是beta版)可用於ArcGIS Online構建地圖和應用。

目前Esri基礎矢量底圖包含八種不同的地圖風格並且使用同一個地圖服務器。這一系列矢量基礎底圖可以在Esri矢量基礎底圖組 中通過搜索“esri_vector” 找到。這個組中包含多種樣式的矢量基礎底圖,一些很接近原有的Esri基礎底圖(比如Streets, Topographic, Light Gray Canvas等),另外還有一些是新的樣式(比如Streets at Night, Navigation, and Imagery Hybrid)。這些矢量基礎底圖都可以作為web map使用,通過樣式修改可以保存成自定義的基礎矢量底圖,自定義的底圖可以作為基礎底圖添加其他圖層或者作為切片圖層添加到已有的地圖中。具體操作會在下面的章節中介紹。



Esri矢量底圖中有多種底圖樣式可用,點擊圖片進入Esri矢量基礎底圖

2.2 自定義基礎矢量底圖樣式
本節主要講述怎樣自定義基礎矢量底圖的樣式。下圖的例子 是一個根據ArcGIS Online 上的Light Gray Canvas tile layer 底圖重新自定義樣式的基礎矢量底圖。

那么怎樣自定義基礎矢量底圖的樣式呢?步驟其實很簡單:

第一步:創建一個屬於你自己的新的切片圖層項目

1 使用你的賬號登錄ArcGIS Online,並點擊“地圖”
2 添加一個矢量切片圖層,點擊“添加”按鈕選擇“搜索圖層”,查找輸入“esri_vector”,范圍選擇“生動地圖集圖層”,點擊“轉到”

3 選擇一個矢量切片圖層,點擊“添加”,再點擊“添加完畢”
4 點擊矢量圖層更多選項(標志為‘…’)選擇復制

5 重命名復制的圖層並點擊“保存圖層”(注意這里是點擊下圖中菜單里面的“保存圖層”而不是保存web map),點擊“創建項目”


第二步:為你的新的切片圖層更新樣式

1 查看項目詳情,選擇“顯示項目詳細信息”


2 下載樣式,點擊“打開”選擇“下載樣式”,得到一個root.json的文件。

3 修改樣式,通過工具或者記事本打開root.json根據下節對樣式結構的介紹修改樣式,並保存(為防止混淆和自行重命名為“myroot.json”)。

4 更新樣式,點擊“更新”選擇自定義的json文件,點擊更新項目即可更新基礎矢量底圖的樣式



第三步:使用新的切片圖層創建地圖

1 你可以選擇將自定義的矢量切片底圖作為一個web map的一個圖層,點擊“添加”“搜索圖層”,在“范圍”中選擇“我的內容”,選擇剛才自定義的矢量底圖,點擊“添加”。


2 你可以選擇將自定義的矢量切片底圖作為一個web map的底圖,點擊“添加”“搜索圖層”,在“范圍”中選擇“我的內容”,點擊剛才自定義的矢量底圖,選擇“作為底圖”。


以上就是自定義並使用一個基礎矢量底圖的步驟,未來還會有更多的基礎矢量底圖發布,並且會有更多相應的工具和功能。

2.3 矢量底圖樣式文件結構
矢量切片一個最大的特點就是你可以根據自己的需要自定義底圖。底圖調整的程度完全取決於你的想法,你可以改變幾個重要的配色來創建一個全新的底圖。上一節介紹了在ArcGIS Online上修改的步驟,本節重點介紹,樣式文件的結構,很好的理解這個JSON文件的結構可以更有利於你進行修改。

打開上節中下載的root.json文件,下圖表示的是JSON文件的主要結構,其中高亮顯示的是編碼結構。右側從上往下是地圖中包含的要素列表(如,背景、海洋深度、土地利用類型等)。左側部分表示要素類型的細節部分(如,填充、划線等)。其中橙色的項目包含填充和邊線樣式,而綠色的項目包含標簽和道路的展示樣式。就像feature根據JSON代碼在地圖中展示一樣,矢量地圖繪制這些背景要素也要按照一定的順序,先填充水域,然后水系、道路,最后展示道路名稱、道路標識以及城市標簽。記住這些通用的代碼組織形式將有助於重新設計你的地圖。


2.3.1包含內容
ArcGIS Pro項目決定着一個要素是否包含在一個特定比例尺或者地圖級別中。因此,如果一個要素並沒有包含在項目中,他是不能被添加進這個數據集中的,另外,無法通過前端對已經發布的矢量切片要素進行修改。但是,你可以將已經存在的要素圖層通過比例尺的控制而隱藏。

“minzoom”:“<value>” 這個是你希望要素顯示的最小地圖級別
“maxzoom”:“<value>” 這個是你希望要素顯示的最大地圖級別
矢量切片參考文檔 包含一個完整的地圖要素列表以及相關的最大/最小地圖級別。
一個要素可以通過添加“layout”的命令控制可見性,從而將其從地圖中(在所有比例尺中)被完全移除。
“layout” : {“visibility” : “none”},
如果你已經將該要素移除,別忘了找到並移除這個要素對應的標簽。

2.3.2設計
這種變化可以僅僅通過操縱演示和線的寬度就可以改變底圖的展示。這樣我們現在只需要關注地圖搭配本身就好了。

顏色

樣式包括顏色的指令通過“paint”命令來控制。下面是一個例子。 

顏色是用“HEX”(16進制)的值來表示的,在這個例子中是淡綠色。 

這個顏色的RGB值為:R218 G224 B178。如果你不習慣使用“HEX”,網上有很多在線的轉換器可以將任何RGB的值轉換成“HEX”值。
為一個多邊形添加一個輪廓可以通過在“paint”中添加一個項目“fill-outline-color” : “#<hexcolor>”

調整多邊形的透明度,可以添加“fill-opacity” : “<value>” 到“paint”命令中。這是一個簡單的線性比例,0表示完全透明,1表示完全不透明。
一些符號使用‘子元素’來生成圖案效果。使用 “fill-pattern” : “<子元素名稱>”添加到“paint”中。



這里有一個線符號的例子: 

線的寬度包含在“paint”命令中,並且以節點的方式書寫。在這個例子中“base”值設為1.2pts。
“stops” 用來添加不同的線寬到不同的比例尺或者地圖級別中。在這個例子中級別1的線寬度為基礎寬度的一半即0.6pts,地圖級別5的線寬度為基礎寬度的1.33倍即1.6pts。線的寬度將會在兩個節點之間進行調整,如果你願意還可以添加更多節點。
如果你想在你的線中使用虛線,那可以添加“line-dasharray”: [ 3.0 , 2.0 ] 到你的“paint”命令行中。在這個例子中,‘3.0’是連接線的長度,‘2.0’是之間的間隔長度。現在只能生成這種簡單的虛線。
如果想控制線的透明度,可以添加“line-opacity” : ”<value>” 到你的“paint”命令行中。與填充命令相似,也是使用一個簡單的線性比例,0表示完全透明,1表示完全不透明。

2.4 通過修改樣式自定義邊界和標注語言
利用矢量切片的可交互的特性,使用Esri基礎矢量底圖還可以更簡單的方式實現一些功能,用於更好的支持本地和國際用戶,例如,你可以在同一個地圖服務下擁有兩套獨立的樣式(例如一個希臘,一個英語),然后基於用戶的位置和區域來顯示適合的標簽;或者對於有爭議的邊界可以使用獨立的樣式來分別顯示有爭議的邊界,同時符合國際和當地的標准,更加方便全球的用戶使用Esri的底圖。矢量底圖這種方式對於之前使用柵格底圖需要重新生成新的圖層的方式更加方便,靈活,同時也大大的減少了服務器的存儲需求。

2.4.1自定義地圖語言
下方顯示的是由Esri矢量基礎底圖創建的自定義地圖示例。



在這個示例中,可以通過切換地圖文本字段的值來更新全球街道地圖切片圖層,在大比例尺顯示當地語言(例如希臘),而不是顯示國際化語言(例如英語)。

 1)所有實例的‘_name_global’ text-field修改為‘_name_local’(例如:“text-field”: “{_name_local}”,)
 2)城市、公園、土地利用和道路標注也是需要顯示為當地語言的要素類。

由於這些圖層在不同縮放級別下多次顯示,所以是由一批查找和替換來實現更新所有適合的圖層。由於參照相同的矢量切片,所以這些變化可用於所有可用的地圖樣式。
Esri社區地圖數據用於構建包含當地語言的矢量切片,包括世界各地的多種要素類。在整個測試期間,我們計划擴大可用語言的區域。目前有一個已知的局限,有些語言從右至左顯示,例如阿拉伯語,不能正確的顯示。點擊這個web map,查看書簽,可以在1:288000或更大比例尺下顯示當地語言。

2.4.2自定義地圖邊界
下方顯示的是由Esri矢量切片基礎底圖創建的自定義地圖示例。


在這個例子中,更改用於行政邊界圖層的 “filter”可以更新全球地圖,這個例子用於顯示蘇里南當地承認的邊界(有爭議):

 1)“Disputed admin0″圖層:將filter改為“filter” : ["!in", "DisputeID", 80, 23, 24, 25, 26, 0],
通過filter將有爭議的邊界23、24、25、26從“Disputed admin0″ 圖層中排除出來。

 2)“Boundary line/Admin0″圖層:將filter改為“filter” : ["any", ["==", "_symbol", 0], ["in", "DisputeID", 24, 25]],
然后通過filter將蘇里南宣稱的24、25邊界加入到"Boundary line/Admin0″圖層中

有時候我們會發現“Disputed admin0”要素層在root.json中出現了兩次。同樣“Admin0”也有相同的現象。這是由於邊界線的樣式是由兩個線樣式疊加形成的






灰色的實線是Boundary line/Admin0/0樣式控制的,黑色的虛線是Boundary line/Admin0/1樣式控制的,雖然他們的樣式不同但是調用的是同一個要素。

那么如何獲取這些爭議邊界的代碼呢?瀏覽這個webmap ,該地圖中包括不同的書簽,顯示了一些目前Esri矢量底圖中包含的有爭議的邊界。當你點擊一些特定的邊界要素,你可以看到彈出窗口“DisputeID”中的重要信息(需要按着上面提到的方法更新filter),提示不同的國家顯示不同的邊界。


在Esri矢量底圖中,國際公認國際邊界(例如美國、加拿大邊界)通常顯示為實線。在某些情況下,一些國家將根據自己的認可對邊界進行渲染顯示。

3、矢量切片的生產發布和使用
在ArcGIS平台目前的版本(ArcGIS Pro 1.2 beta,ArcGIS 10.4 prerelease)下,制作和使用矢量地圖切片的流程如下:

1. 通過ArcGIS Pro來制作矢量切片;
2. 通過Portal for ArcGIS來發布切片;
3. 通過Portal for ArcGIS的Map viewer使用矢量切片;
4. 通過ArcGIS JavaScript API使用矢量切片。


3.1 數據准備
目前要制作矢量切片的數據需要遵循兩個標准:

1. 坐標信息必須與ArcGIS Online底圖保持一致,即采用WGS 1984 Web Mercator(auxiliary sphere)。
2. 只支持ArcGIS Online的schema進行切片的制作。

3.2 使用ArcGIS Pro制作矢量切片
ArcGIS Pro 1.2 beta提供了三個與矢量切片制作相關的工具,位於Toolbox->Data Management Tools->Package下.

· Create Vector Tile Index:創建矢量切片的索引文件;
· Create Vector Tile Package:創建矢量切片包;
· Share Package:共享切片包到ArcGIS Online或Portal for ArcGIS中。



3.2.1 Create Vector Tile Package
該工具是制作矢量切片包的主要工具,用來從地圖中創建切片,並將創建好的切片打包成一個后綴為.vtpk的文件。



工具的主要參數如下:

· Input Map:選擇用來制作矢量切片的地圖,注意去掉map中自帶的底圖,否則會提示“Error 001852:Layer type is not supported for vector tile packages.”
· Output File:選擇.vtpk的存儲位置;
· Tiling Format:意譯的話,是切片模式,有indexed和flat兩種:
· Indexed模式:在制作切片前,需要通過Create Vector Tile Index工具來對數據創建索引,工具會根據數據的疏密程度,創建不同LOD層級的索引網格,數據密集的地方切片層級較高,稀疏的地方層級較低。
· Flat模式:不創建索引,所有范圍內的數據按照同樣的規則進行切圖;
· Indexed方式創建的切片包,相比flat模式,時間短,數據量小;
· Minimum Cached Scale:最小切圖比例尺,目前只支持ArcGIS Online的schema;
· Maximum Cached Scale:最大切圖比例尺,目前只支持ArcGIS Online的schema;
· Index Polygons:輸入通過Create Vector Tile Index工具創建的索引多邊形;如果選擇了indexed模式,需要制定索引多邊形,如果沒有事先做好的多邊形,此參數可以不填,切圖工具會默認生成索引並按照索引進行切圖,但生成的索引並不輸出為要素圖層;
· Summary:摘要,用來在ArcGIS Online或Portal for ArcGIS的內容中顯示;
· Tags:標簽,用來在ArcGIS Online或Portal for ArcGIS中搜索項目用。

配置好這些參數之后,點擊右下角的“run”按鈕,工具就開始創建矢量切片了。

3.2.2 Create Vector Tile Index
如上一步中提到,本工具用來對切圖數據創建索引,主要參數如下:



· Input Map:在ArcGIS Pro中,以map為單位制作矢量切片,所以也是以map為單位創建索引;
· Output Tile Feature Class:指生成的索引文件的存儲位置,選擇合適的位置即可,根據你選擇的位置,最終生成的是shp或者Geodatabase;
· Maximum Vertex Count:每一個索引網格里,最多能容納的多邊形頂點數,初步推測這個值影響的是索引網格的大小,默認為10000,建議保持默認值即可。

填寫好這些參數之后,點擊右下角的“run”,執行制作索引。

3.2.3 Share Package
該工具用來將生成好的矢量切片包上傳到ArcGIS Online或者Portal for ArcGIS中:



· Input Package:輸入已經制作好的矢量切片包;
· Summary:摘要信息;
· Tags:標簽信息;
· Credits:可以填寫些制作者相關的信息;
· Everybody:勾線后,上傳的切片包就對所有人分享了;
· Groups:可以在組織的群組間進行分享,根據需要選擇。

配置好這些信息之后,點擊右下角的“run”,即可上傳切片包。

注1:通常我們也可以通過ArcGIS Online或者Portal for ArcGIS的“我的內容”界面中,選擇“Add Item”->“from my computer”的方式上傳.vtpk,但是如果.vtpk大小超過2G,就只能通過本工具上傳。
注2:本工具只上傳.vtpk,並不進行切片服務的發布。

3.3 通過Portal for ArcGIS發布矢量切片
目前,ArcGIS Online暫不支持自定義的矢量切片底圖的發布。
在上一步中,我們通過share package工具上傳了.vtpk文件,在Portal for ArcGIS中“我的內容”頁面可以看到該item,選中該item進入詳細信息頁面,選擇“Publish”,可將該切片包發布成矢量切片服務;
還可以通過“我的內容”頁面,選擇“add item”-> “from my computer”,彈出以下對話框,選擇.vtpk文件,並勾選“publish the file as a tile layer”,點擊“Add item”即可完成發布。



在Portal for ArcGIS中成功發布好矢量切片服務之后,會在server的工作目錄(安裝時指定,如我的是“D:\arcgisserver”)下的\directories\arcgiscache\VectorCache\Hosted下找到一個與已發布的服務名稱一致的文件夾,其中記錄了該矢量切片的所有信息。


· resources:存放的是與矢量切片服務有關的資源,包括服務的字體文件,樣式文件,以及sprites文件等,其中最重要的是styles文件夾下的root.json文件,里面記錄了該矢量切片服務的樣式,修改服務的樣式就是通過修改該文件來實現的;
· tile:該目錄中存放的是制作好的矢量切片,以2.0版本的boundle格式存儲;
· tilemap:該文件夾中只有一個名為root.json的文件,這其中記錄的是矢量切片服務第一次加載有關的信息;
· root.json文件:記錄的是整個矢量切片的服務信息,包括服務名稱、服務的范圍、坐標參考、切圖等級及比例尺等多種信息。

3.4 通過Portal for ArcGIS使用矢量切片服務
發布成功后我們可以在item詳細頁面看到它的服務類型和服務url,點擊“open”,可以將其加載到Portal for ArcGIS的Map viewer中進行瀏覽。

在Portal for ArcGIS中還可以修改矢量切片底圖的樣式,在3.3文件中介紹過,在ArcGIS for Server的工作目錄下可以找到root.json文件,該文件控制的是底圖的樣式,通過修改該文件可以修改圖層的樣式。具體步驟如下:

1、 將發布好的矢量切片加載到map viewer中;
2、 復制並重命名復制的圖層;
3、 保存該圖層;
4、 進入到該圖層的item詳細信息頁面(或者直接在ArcGIS for Server工作目錄中找到該圖層的樣式文件);
5、 在下拉列表中選擇“下載樣式”;
6、 對下載的樣式進行修改;
7、 在item詳細信息頁面中,選擇“update”,將修改的樣式上傳,並確定;
8、 修改樣式成功,可在map viewer中進行查看。

3.5 通過ArcGIS JavaScript API使用切片
3.5.1 相關類和方法
ArcGIS JavaScript API 3.15即提供了對矢量地圖切片的支持,它提供了一個特定的VectorTileLayer類,用來使用矢量切片服務。該類有1個構造函數,構造函數的2個參數有3種用法:





· 用法1:直接傳入矢量切片服務的url;
· 用法2:直接傳入矢量切片服務的樣式文件(限於ArcGIS Online上供所有人訪問的服務,服務url公開,通過傳入樣式文件可以指定的樣式渲染服務);
· 用法3:傳入矢量切片服務的url以及初始化顯示的信息,如顯示層級、最大最小比例尺、是否可見、透明度等等。



另外,還提供了許多屬性和方法,用來獲取矢量切片服務的信息,這里最重要的屬性是style,因為矢量切片最大的特點就是可以使用客戶端修改樣式:


對應的修改樣式的方法為setStyle(styleURL):


該類還有一些事件,如下:


當修改樣式方法被調用時,會觸發style-change()事件。

3.5.2 示例
以下是在js端修改樣式的簡單示例:



這是該矢量切片服務最開始的樣式,其代碼如下:

通過修改其root.json文件,可以快速的修改其樣式,比如這里我們修改以下第一個圖層的樣式,保存下樣式文件:



這樣再看到的矢量切片服務就變成了一下風格:

 
制定及修訂記錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM