概述
在实际项目中,客户经常纠结面状图层的Label标注重复问题,见下图:
猜测:因为项目中多用的是瓦片图层,Geoserver在渲染单个瓦片时,总是试图在每个瓦片中都显示一个Label标注。验证如下(单张瓦片的情况下并不会出现标注重复的问题):
解决思路:
1、将瓦片的大小修改更大
实际项目中单个瓦片会有性能问题,见下图,适当的将瓦片修改更大一些,可以有效的解决标注重复的问题,并且实践证明与底图的[256,256]瓦片能够套合。但是不能彻底解决,因为也有可能512像素也不能包含一个面时,标注会出现重复,不过看上去会好一些。
2、修改SLD,将标注改为以面的中心点进行标注
SLD参考如下:效果如下图:
为防止Point Label因避让或其他规则设置导致不显示,加上以下设置:(使其Label始终显示)
<VendorOption name="spaceAround">-1</VendorOption>
<VendorOption name="conflictResolution">false</VendorOption>
<VendorOption name="partials">true</VendorOption>
几个设置项的官方解释如下:
spaceAround:
conflictResolution:
最重要这个选项:partials配合这个选项还需要设置图层的"Default Rendering Buffer",根据图标或Label的长度设置,单位像素:
如果不设置Default Rendering Buffer,可能的效果如下图:
如果不设置partials参数,这种情况下就不会显示Label!!!
缺点:
此方法能有效的解决标注重复问题,缺点是如果PolygonFeature较大的情况下,会出现看不见标注的情况。因为标注只会在中心点的固定位置渲染,而不会随可视范围变化。
3、在前端渲染标注
参考:http://openlayers.org/en/master/examples/vector-layer.html?q=text
http://openlayers.org/en/master/examples/street-labels.html?q=text
数据量大的情况下,前端渲染存在性能瓶颈。