ArcGIS Server 切片數學關係闡釋,小區域切圖頻繁出錯解決方法

直擊:

Tile|SuperTile|Bundle的關係

1、緊湊型切片中Tile|SuperTile|Bundle關係爲:

1
2
3
4
5
6
7
8
9
如果:
    Tile = 256 × 256 pixel             # 256×256 是ArcGIS Server默認的切片大小
    Supertile = 4096 × 4096 pixel      # 未開抗鋸齒情況下是 4096×4096
那麼:
	Supertile = 16 × 16 Tile           
已知:
	Bundle = 128 × 128 Tile            
因此:
	Bundle 範圍是 N-3 級的 Supertile 範圍

2、矢量切片中Tile|SuperTile|Bundle關係爲:

                已知: Supertile = 128 × 128 Bundle

                因此:Bundle 範圍是 N-7 級的 Supertile 範圍.

展開:

supertile和bundle

       要深入瞭解ArcGIS在切圖時的工作機制,有兩個概念必須明白,就是supertile和bundle。
  假設一個tile(切片)的大小是256*256,在切圖時如果按照這個大小直接exportmap,開啓了動態標註的地圖服務上線圖層和麪圖層就會有很多重複的標註。因爲exportmap時,每個tile都會包含一個要素的標註,如果一個要素橫跨了多個tile(這在大比例尺下基本是肯定的),那麼這些tile上就會出現相同的標註,exportmap時並不知道相鄰的tile上已經有了該要素的標註。

 爲了解決這個問題,ArcGIS在切圖時引入了supertile的概念,開啓抗鋸齒時supertile大小爲2048*2048,反之爲4096*4096。真正切圖時會首先exportmap出一個supertile,然後將它們分割成指定大小的tile。對於每個要素,每個supertile中只包含一次標註,這樣保證一個superfile大小的範圍內不會出現重複標註。事實上在繪製supertile時,會盡可能多地包含周圍的標註,所以在每個supertile的邊界周圍仍會有重複標註。解決重複標註的根本辦法就是使用annotation,而不是label。
  ArcGIS 10中推出了新的compact緩存格式,將原來離散的每個tile圖片(exploded格式),保存成連續的二進制文件(.bundle),每個.bundle文件最多可存儲128*128個tile。相比以前成千上萬的tile文件,這樣做有明顯的好處:易於緩存遷移,減少佔用磁盤空間,減少硬盤i/o等,esri在任何時候都推薦使用compact格式來創建緩存,除非你需要自己讀取每個tile(技術上來說這點可以不成立)。ArcGIS 10在切圖時,也採用了bundle的概念:對於每一級比例尺,首先從tiling scheme origin開始,將切圖範圍分成若干個bundle,每個bundle覆蓋的範圍是128*128個tile大小。比如在1:4096比例尺時,如果tile大小是256*256,DPI爲96,那麼每個bundle範圍的大小是:((4096*2.54/96)/100/1000*256*128)^2=1261.086平方千米。之後,有且僅有(這麼做是爲了避免多個進程同時讀寫一個磁盤文件)一個服務實例/一個arcsoc.exe進程(如果是high isolated)來負責此bundle範圍的切圖,先輸出supertile,然後再切成tile。即使選擇了exploded緩存格式,ArcGIS 10中也會採用這種機制來切圖。

9.3.1及以前版本中,每個服務實例工作的單位是supertile。即一個arcsoc.exe負責生成一個supertile,然後切成tile,再繼續生成下一個supertile……相比supertile這種處理單位來說,採用bundle作爲處理單位的ArcGIS 10中的服務實例可以將更多精力投入到連續切圖中去,而不是頻繁切換自己負責的範圍。在大比例尺切圖中,這種新機制能很大程度上減少切圖時間;但在小比例尺切圖中,這種新機制有可能反而增加切圖時間。因爲小比例尺時可能全圖範圍只有不到一個bundle範圍大小,這樣只會有一個服務實例來切圖,其他實例都處於空閒狀態,而9.3.1及以前版本中,所有服務實例都會“蜂擁而上”。

網格切圖和按featureclass範圍切圖

  有過大比例尺範圍切圖經驗的朋友肯定會知道,一般切圖策略是:小比例尺全圖直接切,較小比例尺可能按照某個featureclass範圍來切,而大比例尺一般是按照包含網格(grid)的featureclass範圍來切。以我國全範圍切圖爲例,小比例尺時全圖切沒有問題,大比例尺時如果仍然全圖範圍(包絡矩形)切的話,會將周邊其他的國家也包含進來,這並不需要的額外工作量在大比例尺時會是一場噩夢。

image

而之所以不僅要按指定featureclass範圍切圖,而且featureclass裏要包含網格的原因在於,便於細化和跟蹤切圖進度。切圖工具會給你指定的featureclass創建一個新的Cached字段,將已經切好的feature標記爲YES,以便在選擇Recreate Empty Cache時避免重複切圖,從而可以將切圖工作分爲多次來進行,或者以便在切圖失敗後排查原因,繼續切圖工作。
  在指定featureclass範圍切圖時,是順序處理該featureclass中的所有feature的。所有的服務實例會首先集體處理一個feature範圍,切出該feature範圍內所有要求的比例尺級別的結果。此時ArcGIS Server會重啓該服務。然後所有服務實例再去切下一個feature範圍……所以與每個feature邊界相交的supertile可能會被創建兩次或多次(多個feature的相交處),這也是爲什麼在使用featureclass切圖前,需要分別對它進行GeneralizeAggregateDissolve的原因。

image

 結合之前bundle的機制我們知道,如果一個feature範圍恰好只包含一個bundle,那麼就杯具了,因爲對該feature切圖時,只會有一個服務實例進行工作(一個bundle同時由且僅由一個服務實例處理),其他服務實例全部處於空閒狀態。因此,比較理想的情況是,每個feature至少包含比服務實例數更多的bundle時,才能充分利用硬件資源來對其切圖。
  這就會引出一個問題,就是如何來確定某個比例尺下一個bundle的大小,從而生成這樣的featureclass呢?ArcGIS 10中,給我們提供了一個新的GP工具Map Server Cache Tiling Scheme To Polygons,利用它,我們可以針對某個地圖服務,生成每個需要切圖比例尺下所有的supertile,進而得到以每個supertile爲一個feature的featureclass。以全國地圖爲例,在1:288,895比例尺(ArcGIS Online Tiling Scheme的第12級)下生成的supertile是這樣的:

image

我們需要的是某個比例尺下bundle的範圍,如何根據supertile來確定bundle的大小呢?在N級比例尺時,一個supertile是16*16個tile,第N+1級比例尺時,該supertile會覆蓋32*32個tile,第N+2級比例尺時,覆蓋64*64個tile,第N+3級比例尺時,這個第N級的supertile會覆蓋128*128個tile,眼熟吧,這正是一個bundle的大小。由於supertile和bundle都是從tiling scheme origin往右下角算起的,因此第N級一個supertile的範圍正是第N+3級一個bundle的範圍。由此如果我們要生成第15級的bundle網格,只需要用Map Server Cache Tiling Scheme To Polygons工具生成第12級supertile的網格即可,如上圖。
  以此爲例,我們來說明如何有效進行大比例尺切圖的問題。假設我們需要對1:36,111(ArcGIS Online Tiling Scheme的第15級)這個比例尺進行切圖,我們首先生成該範圍的bundle網格,恰好是第12級的supertile網格,如上圖。爲了簡便起見,我們只取其中8個feature來做說明,地圖服務的最大實例數是4個(機器是單cpu,4核)。如果每個feature恰好是一個bundle,那麼一個feature只能被一個arcsoc.exe處理,而其他3個服務實例均處在空閒狀態(佔用內存最少的那個arcsoc.exe是用來清空工作目錄的,與具體服務無關):

image

而我們對這個featureclass做一個處理,將4個feature(恰好是一個bundle)合併成一個feature(bundle cluster),這樣每個feature就恰好包含了4個bundle,如此我們所開啓的4個服務實例就可全速工作了,發揮了機器的最大性能:

image

ps:Map Server Cache Tiling Scheme To Polygons工具生成的supertile是從tiling scheme origin開始計算的,而不是地圖服務的fullextent左上角,因此利用它生成的supertile合併出來的bundle是最合理的,恰好與理想的bundle分界處一致。因此在大比例尺下利用featureclass切圖時,應當利用Map Server Cache Tiling Scheme To Polygons來生成網格,而不是fishnet工具。在ArcGIS 10.1中,將會推出新的GP工具,會根據cpu核數來生成合理的包含bundle cluster大小feature的featureclass。
  其他方面還有一些問題,比如切圖時最大服務實例數設置多少爲好(一般是cpu核數+1),即使所有實例全部工作cpu佔用率依然低於90%(有可能是內存不足)等問題,與切圖機制無關,就不在此討論了。
  總之,切圖是一個技術活,要求還比較高,需要考慮的問題很多。

小區域切圖頻繁出錯解決方法

從bundle的存儲機制和這種基於bundle的切圖機制出發,我們不難想到一種基於先按bundle區域分塊切片,再合併的切片的想法。這種想法很自然地也會引出一個問題,我們如何來確定某個比例尺級別一個bundle的大小,又如何生成以爲bundle大小爲單位的要素圖層?爲了解決這個問題,我們現需要了解supertile的概念。supertile的概念最早的引入是爲了解決重複標註的問題,此處我們暫且不講它爲何能一定程度上解決標註重複的問題(有興趣的朋友可以去閱讀菩提老王的舊文或者查閱相關資料),只來談談它和bundle的關係以及我們怎麼從supertile要素圖層來獲得bundle要素圖層。我們知道一個瓦片(tile)的大小是256x256 px,而supertile(可以稱之爲超切片吧)在抗鋸齒和非抗鋸齒下有不同大小:在開啓抗鋸齒時大小爲2048x2048 px,未開啓時爲4096x4096 px。此處我們以未開啓抗鋸齒爲例,我們可以計算得到一個supertile對應16x16個瓦片。據此,我們可以進一步計算出某一比例級別的一個bundle含有該級別的8x8個supertile。那麼我們怎麼獲得supertile和bundle呢?從ArcGIS 10開始提供了一個Map Server Cache Tiling Scheme to Polygon的工具,使用該工具可以針對某個切片方案,生成該切片方案所有比例尺的supertile。那麼已知比例尺級別之間的關係是:n級的比例尺x2 = n+1級別的比例尺和1個bundle = 8x8 supertile,我們不難推斷出n級的supertile所覆蓋的區域就是n+3級的一個bundle覆蓋的區域。至此,我們已經清楚如何獲得的表示bundle的要素圖層了:爲了獲得m級的bundle的要素圖層,我們只需使用Map Server Cache Tiling Scheme to Polygon工具來獲得m-3級supertile的要素圖層即可。 
有了bundle要素圖層後,我們可以分別導出要素圖層成中的每個bundle作爲一個獨立的要素圖層。之後,我們可以使用Manage Tile Cache工具根據每個獨立bundle要素圖層進行感興趣區切圖。在獲得了不同bundle區域的切片後,我們只需要將它們複製粘貼到同一個mxd發佈的空切片服務下的相應文件夾即可。
12级Supertileåºå

上圖內影像爲東北地區一景landsat8影像,使用Map Server Cache Tiling Scheme根據默認的ArcGIS Online切片方案對第12級生成的supertile要素圖層,當然也就是15級bundle要素圖層。

上圖爲導出的每個bundle區域的要素圖層,使用這些單個bundle要素圖層對15級進行感興趣區分塊切圖。

è¿éåå¾çæè¿°

上圖爲導入分塊切的bundle文件,可以注意到每個框內的三個文件來自於一個bundle區域(測試環境爲10.3.1,其他版本文件名可能不同)。在分塊切圖之後,將生成的bundle文件複製粘貼到一個空的切片服務相應的L15(15級)文件夾內,重新啓動服務即可完成。

附件 :

關於像素、分辨率、DPI等術語,請參考:關於像素、分辨率、PPI、DPI等概念的分析

按照ArcGIS切圖方案配置(Schemes)文件進行切圖,成果包括:地圖瓦片(緩存)和conf.xml、conf.cdi文件。

conf.xml存儲了切片方案配置信息:

        TileOrigin表示切片方案原點。

        TileCols和TileRows表示單張切片所佔的像素長度。

        DPI表示切片圖片的一英寸長度的像素數。

        LODInfos裏則存儲了切片的各級信息。

        PacketSize表示單個bundle文件裏存儲的行/列數。

        Scale表示切片各個級別的地圖比例尺。

        LODInfo的Resolution表示的是地圖上每個像素表示的實際長度(地圖單位)。

conf.cdi存儲了切片的範圍

 

        其他參數比較好理解,下面分析一下Scale與Resolution的關係。

Scale:地圖比例尺,比例尺是表示圖上距離比實地距離縮小的程度,也叫縮尺。公式爲:比例尺=圖上距離/實地距離。

Resolution:地圖分辨率。表示當前地圖範圍內(一定的Scale條件下),1像素代表多少實際地圖單位(N地圖單位/像素),地圖單位取決於數據本身的空間參考(平面座標的單位是米,地理座標的單位是度)。Resolution跟dpi(dpi代表每英寸的像素數)有關,跟scale有關。

1.如果地圖的座標單位是米

        假設切圖設置dpi=96,

        那麼,1英寸 =  2.54釐米 = 0.0254米 = 96像素

        即 1像素 = 0.0254/96 米

公式:Scale = 1 : (96 * Resolution / 0.0254)

即Resolution = 0.0254 / (Scale * dpi)     地圖分辨率跟比例尺和切圖dpi有關

         如果Scale =1:500,dpi=96

         那麼,Resolution =0.0254/ ((1/500)*96) =0.13229166666米,即圖上1像素代表實地距離是0.13229166666米。        

         ArcGIS爲了高精度,一般1英寸 = 0.0254000508米

2. 如果地理座標系是WGS84,地圖的單位是度       

        公式:Scale = 1 : (dpi * 2 * Math.PI * 6378137 * Resolution / 360 / 0.0254); 

        那麼:Resolution = (360*0.0254) /  (Scale * dpi * 2 *  Math.PI * 6378137)   ,

        其中,

        2 *  Math.PI * 6378137 = 地球的周長,這裏有一個常識需要講解:赤道上經度的每度大約相當於111km,經度的每度的距離從0km到111km不等。它的距離隨緯度的不同而變化,等於111km乘緯度的餘弦。不過這個距離還不是相隔一經度的兩點之間最短的距離,最短的距離是連接這兩點之間的大圓的弧的距離,它比上面所計算出來的距離要小一些。

        假設切圖設置dpi=96

        其中,1度 = 111194.872221777米;

        如果Scale =1:500,

        那麼,Resolution = 0.13229166666米,即圖上1像素代表實地距離是0.13229166666米。

        將米換成度:0.13229166666/111194.872221777 = 0.00000118972度

        即圖上1像素代表實地是0.00000118972度
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章