关于使用瓦片的建议

发送反馈


在某一比例尺中,一幅地图被切割的地图图片越多,地图图片的命中率越高。但是,命中率越高,每次传输的图片个数就会越多,传输图片也会影响地图响应时间,这样就需要在服务器并发量和网络传输量之间寻找一个平衡点,即达到浏览效果最佳,准确的来讲,是显示效率最优。

因此,在对地图服务准备瓦片的时候,您可以综合考虑以下几个方面因素。

瓦片格式

支持对地图服务生成和使用栅格瓦片、矢量瓦片、属性瓦片(已过时),且生成的瓦片包支持分享传播与离线使用。在使用瓦片的时候,您可以根据不同瓦片的特点,结合具体的使用场景来确定使用方式。

将地图中所有图层切分并存储为栅格图片的地图瓦片,支持 FastDFS(已过时) 和 MongoDB 分布式存储、SMTiles 与 MBTiles 格式SuperMap UGC 格式和 GeoPackage 格式。其中,SuperMap UGC 格式是 SuperMap 各个产品间通用的传统栅格瓦片格式,相同版本的地图瓦片可以通用。分布式切图服务支持的“UGCV5”切片类型,就是指5.0版本原始缓存。  

此外,栅格瓦片的图片格式支持 PNG、PNG8、JPG_PNG、JPG、WebP(FastDFS、OTS 瓦片当前不支持 WebP 格式)。如果选择 PNG,且当前地图颜色值数小于等于256,SuperMap iServer 会自动将图片存为 PNG8 格式,以节约存储空间。

将地图中的指定矢量图层以矢量瓦片的形式进行切分和存储,支持 SVTiles 格式

在地图服务的应用中,除了供用户访问浏览地图外,还有为用户提供查询、选择、高亮等操作的实际需求,这时就需要通过要素服务为用户提供上述功能。与地图服务需要通过缓存技术提升访问速度一样,要素服务也需要通过将矢量数据预先生成瓦片来提升客户端的渲染速度,因此矢量瓦片(Vector Tile)就诞生了。矢量数据在存储的时候,其体积比地图瓦片更小,更适合于地图中对时效性要求较高的地物要素的表达,如 POI 信息、路线信息等。常见的在线地图服务,如 Google Maps、百度地图等,都是采用了栅格瓦片做底图,叠加矢量瓦片的做法。

将地图中矢量图层的属性数据以属性瓦片的形式进行存储,支持 UTFGrid 格式

在地图服务的应用中,如果包含较多的鼠标交互操作,传统做法是在地图上叠加要素图层,每个要素具有自己的热点和事件,用于完成鼠标交互。但在大数据量、高并发请求的环境中,客户端尤其是移动终端上,就不能很好地渲染大数据量的地理要素,因此就面临严重的性能问题。这种情况下,出现了一张地图瓦片结合要素属性信息的缓存方式,也就是在传统的地图瓦片的基础上,额外存储了按照格网划分的要素属性信息,这种预先划分的要素属性信息,就成为属性瓦片(也称互动格网瓦片)。地图瓦片结合属性瓦片的这种用法也已经有很多实践应用,最具代表性的是 MBTiles 规范及其附属的 UTFGrid 规范。

瓦片大小

SuperMap iServer 的预缓存服务提供了 512*512 和 256*256 两种尺寸。

因为使用 iClient 客户端的分块图层访问 SuperMap iServer 的地图服务时,默认使用的是 256*256 大小的图片。例如 iClient for Ajax 客户端可使用 SuperMap.Web.Mapping.TiledDynamicRESTLayer(默认为256*256);iClient for Silverlight 客户端可使用 SuperMap.Web.iServerJava6R.TiledDynamicRESTLayer(默认为256*256)。当然,也可以更改 TileSize 为512*512。

在进行缓存时,就需要根据客户端的需要,设置缓存图片的大小,这样才能充分利用预缓存。

比例尺

为了充分利用 SuperMap iServer 的预缓存服务生成的缓存,并能实现多级缩放,可以对一幅地图预先生成多个比例尺的缓存图片,在 SuperMap iServer 客户端 SDK(for JavaScript、for Flash、for Silverlight 等)中的地图接口可以对应服务器上的缓存比例尺,设置对应的比例尺数组,从而限定地图在指定比例尺内缩放,实现多级缩放的效果。

以 iClient for JavaScript 客户端为例,将 Map 的比例尺数组 Scales 设置成与预缓存比例尺相同,这样在进行地图缩放时,地图下所有图层将只显示设置的比例尺,即预缓存图片的比例尺,从而充分利用 SuperMap iServer 预缓存服务生成的缓存图片。

地理范围

用户可以为频繁访问的地图区域生成预缓存,然后根据需要为较少访问的地图区域实时生成缓存,以降低生成和存储缓存的成本。

例如,在访问世界地图时,人烟稀少的地区不是客户端所关注的地方,可以不生成缓存。这样就可以将地理范围指定为下图所示的区域: