ArcGIS JS API使用PrintTask列印地圖問題解決匯總

環境:來源於工作過程,使用的API是  arcgis js 3.*  3系API,4.*暫時沒測試;

1、數據與列印服務跨域情況下,不能列印問題。

一般情況下,我們發布的數據服務和列印服務是在一台伺服器上,但業務中經常會調用別家單位的服務,要實現列印怎麼辦?

解決:通過設置通用代理,arcgis js api提供了基於.NET /JAVA的代理,在proxy.config裡面設置好服務的IP即可。

 

2、列印中文亂碼。

這個情況一般都是伺服器的列印模板MXD字體默認是ESRI美國的字體,需要更改為中文編碼格式,比如:宋體,

修改路徑:安裝ArcGIS Server的文件夾,\ArcGIS\Server\Templates\ExportWebMapTemplates\,在下面修改要用到的排版樣式的字體和排版布局。

 

3、PictureMarkerSymbol等一些自定義樣式,使用自己的圖標無法列印出來。

這裡由於列印內部程式碼沒有支援自定義圖標,所以一般只能顯示在GraphicsLayer中,但無法列印出來。

解決:使用arcgis中SimpleMarkerSymbol的默認樣式,雖然圖標沒有那麼明確,但可以列印。

 

4、圖例列印出來顯示 override。

一般使用graphicsLayer來顯示,如果不過濾那麼,列印的時候一般都是以override1、override2的形式來顯示圖例。

這個問題主要就是因為內部自動使用ColorInfo渲染,可以改變渲染方式來實現。

解決:1) 使用renderer代替setSymbol來渲染顏色;2)還一種方式:設置PrintTemplate的LayoutOptions裡面參數LegendLayers為服務圖層,即不顯示GraphicsLayer的圖例。

 

5、列印服務圖層,圖例均不能顯示,比如一個土地利用規劃,N個圖例都不顯示。

一般我們顯示圖層都是自己設置圖層名稱,直接使用Layer.id=圖層名稱 ,來載入設置,不顯示圖層都沒有特別提示,這個問題估計難倒了一大批GIS開發人員,新手熟手都一直沒解決。

終於功夫不誤有心人,在GeoNet、stackexchange網上終於摸到了一些蛛絲馬跡:【LegendLayer.layerId property stands for the assigned ID string of the layer in the map, not in the service.】

意思就是圖例圖層layerId 要顯示的是默認載入到Map中ID(一般是layer1這樣的形式),而不是我們給圖層指定的圖層名稱,這個才是真的關鍵。

解決:對於要載入圖例的動態服務、瓦片服務、要素服務,不指定ID=圖層名稱,默認載入後獲取layer.id,然後賦予給LegendLayer.layerId,即能顯示圖層圖例。

 

 

6、圖例對一些服務支援的格式不支援,存在漏洞BUG。

Legend images are unsupported for .emf, .gif, .pdf, .svg, .svgz, and .tif image formats. These formats are supported for classic map services (MXD).