最近因为工作需要学习了GeoWebCache,有了一些实战经验跟大家分享一下。
废话不多说,直接上问题!
1、切片的缓存问题
当地图服务(这里默认指WMS)的数据更新时,GeoWebCache的切片如何随之更新,客户浏览器上的缓存如何更新成了一个绕不开的问题。GeoWebCache提供了相应的配置项供我们自定义服务端和客户端的切片保存时间。
<!-- 可选:一个瓦片在服务器保持可用的秒数。后续请求将取回的结果是一个新的瓦片。默认是永久cache。参数列表应该常常以minZoom=""开头,然后单调递增。特殊值:-1表示从不缓存,-2表示从不过期 -->
<expireCacheList>
<expirationRule minZoom="" expiration="" />
<expirationRule minZoom="" expiration="" />
</expireCacheList>
<!-- 可选:客户端从GWC收到瓦片之后,需要缓存的时间(秒为单位)。默认值使用和WMS服务器提供的过期时间相同。如果值不可用,缓存2小时,参见expireCacheList -->
<expireClientsList>
<expirationRule minZoom="" expiration="" />
<expirationRule minZoom="" expiration="" />
</expireClientsList>
如果你不设置该配置项,服务端和客户端的默认缓存时间都是两个小时,你也可以根据需要单独设置任何一个缩放级别的缓存时间。
2、图片格式和图片压缩的问题
切片的一般是在浏览器上使用的,切片传到浏览器给客户展现出来需要考虑到使用的流量和需要的时间的问题,最好可以做到加载时间短,占用浏览少,试了很多办法,最有效的就是压缩切片。 GeoWebCache提供了相应的压缩切片的配置,我试了一下感觉效果最明显的还是对JPEG格式图片的压缩,大家可以试试,如果有问题可以跟我说。
<!-- 可选:格式修改器,这些也可以通过对各个图层单独定义 -->
<formatModifiers>
<!-- 能够有一个和多个这样的元素 -->
<formatModifier>
<!-- 必要:应用于JPEG -->
<responseFormat>image/jpeg</responseFormat>
<!-- 可选:从后端的PNG请求时,阻止双重压缩 -->
<requestFormat>image/png</requestFormat>
<!-- 可选:透明度支持 -->
<transparent>false</transparent>
<!-- 可选:背景颜色 -->
<bgColor>0xFFFFFF</bgColor>
<!-- 可选WMS服务器使用的调色板 -->
<palette>somepalette</palette>
<!-- 可选:调节压缩等级,.0是最佳质量 -->
<compressionQuality>0.9</compressionQuality>
</formatModifier>
</formatModifiers>
这里需要注意的是,最好把bgColor调为白色,这样图片大小会小一些,而且效果也会好一些,而compressionQuality最好不要小于0.75(官网上说0.75以上图片质量基本无损),当然还是要根据使用中的具体情况来调整,我就是用的0.5,完全满足要求。
3、使用ArcGIS Server发布地图服务的问题
ArcGIS Server很强大,美中不足的是它提供的Javascript api过于庞大,不适合手机上使用,于是就会想到用openlayers,但openlayers调用ArcGIS Server的切片服务的显示效果又很差(尤其是自定义坐标系),于是,我才会想到用GeoWebCache,还好GeoWebCache支持ArcGIS Server的WMS服务。
<wmsLayer>
<name>NEW-layer2</name>
<mimeFormats>
<string>image/jpeg</string>
</mimeFormats>
<!-- Grid Subset Example -->
<gridSubsets>
<gridSubset>
<gridSetName>EPSG:</gridSetName>
<extent>
<coords>
<double>-</double>
<double>-</double>
<double></double>
<double></double>
</coords>
</extent>
</gridSubset>
</gridSubsets>
<wmsUrl>
<string>http://test/arcgis/services/NEW-layer2/layer2/MapServer/WMSServer?</string>
</wmsUrl>
<wmsLayers></wmsLayers>
<transparent>false</transparent>
<bgColor>0xFFFFFF</bgColor>
</wmsLayer>
这里需要注意的是引用ArcGIS Sever发布的WMS服务的时候别忘了最后的那个"?",不加可能会有问题。还有就是要根据具体的需求配置好wmsLayers项,这个配置项是指你要在切片中显示的图层,多配或者少配显示效果都不对。再就是要配置正确你的坐标系和坐标范围,这些信息都可以从ArcGIS Server找到,如果这个设置有问题很可能会出现坐标计算不正确或者图像超出范围等问题。