概述
在實際項目中,客戶經常糾結面狀圖層的Label標注重復問題,見下圖:

image.png
猜測:因為項目中多用的是瓦片圖層,Geoserver在渲染單個瓦片時,總是試圖在每個瓦片中都顯示一個Label標注。驗證如下(單張瓦片的情況下并不會出現標注重復的問題):

image.png
解決思路:
1、將瓦片的大小修改更大
實際項目中單個瓦片會有性能問題,見下圖,適當的將瓦片修改更大一些,可以有效的解決標注重復的問題,并且實踐證明與底圖的[256,256]瓦片能夠套合。但是不能徹底解決,因為也有可能512像素也不能包含一個面時,標注會出現重復,不過看上去會好一些。

image.png
2、修改SLD,將標注改為以面的中心點進行標注
SLD參考如下:
image.png

image.png
效果如下圖:

image.png
為防止Point Label因避讓或其他規(guī)則設置導致不顯示,加上以下設置:(使其Label始終顯示)
<VendorOption name="spaceAround">-1</VendorOption>
<VendorOption name="conflictResolution">false</VendorOption>
<VendorOption name="partials">true</VendorOption>
幾個設置項的官方解釋如下:
spaceAround:image.png
conflictResolution:image.png
最重要這個選項:partials配合這個選項還需要設置圖層的"Default Rendering Buffer",根據圖標或Label的長度設置,單位像素:image.pngimage.png
如果不設置Default Rendering Buffer,可能的效果如下圖:
image.png
如果不設置partials參數,這種情況下就不會顯示Label?。?!
缺點:
此方法能有效的解決標注重復問題,缺點是如果PolygonFeature較大的情況下,會出現看不見標注的情況。因為標注只會在中心點的固定位置渲染,而不會隨可視范圍變化。

image.png
3、在前端渲染標注
參考:http://openlayers.org/en/master/examples/vector-layer.html?q=text
http://openlayers.org/en/master/examples/street-labels.html?q=text
數據量大的情況下,前端渲染存在性能瓶頸。




