制作不同风格的矢量分块地图


矢量瓦片对地图中的矢量图层以瓦片的形式进行切分和存储。相对于传统的栅格格式的地图瓦片,矢量瓦片的体积更小,存储、分发更方便,更适合于地图中对时效性要求较高的地物要素的表达,如 POI 信息、路线信息等。

常见的在线地图服务,如 Google Maps、Mapbox、百度地图等都使用了矢量瓦片。SuperMap服务器端可以通过分布式切图生产矢量瓦片,并在地图服务中直接发布使用(tileFeature资源)。同时,SuperMap的JavaScript客户端对接了矢量瓦片,并封装为矢量瓦片图层TiledVectorLayer,可以直接在客户端快速渲染出图,即矢量分块图。

矢量分块图可以使用默认的风格样式来渲染,也可以结合地图样式表CartoCSS自定义渲染风格。

示例:默认风格的矢量分块图

Step1 地图初始化

本例将使用SuperMap Online发布的在线地图服务map_China4003中的矢量瓦片。

    var map, layer, lat, lon, geolocate, infowin,lonLat,geometryInfo, 
        url = "http://www.supermapol.com/iserver/services/map_China4003/rest/maps/China";

    var value="IbooSg6gIBmhIRaesVgjSED0",
        name = "key";
    SuperMap.Credential.CREDENTIAL = new SuperMap.Credential(value, "key");

    function init() {
        if(!document.createElement('canvas').getContext) {
            alert('您的浏览器不支持 canvas,请升级');
            return;
        }

        map = new SuperMap.Map("map", {controls: [
            new SuperMap.Control.ScaleLine(),
            new SuperMap.Control.Zoom(),
            new SuperMap.Control.Navigation({
                dragPanOptions: {
                    enableKinetic: true
                }
            })]
        });

        ……

    }

Step2 通过 TiledVectorLayer 调用地图服务中的矢量瓦片

        layer = new SuperMap.Layer.TiledVectorLayer("China", url,{cacheEnabled:true},{useLocalStorage:true});

Step3 把矢量分块图层添加到地图上

把上述矢量分块图层,添加到地图中,并设置地图显示的中心点和比例尺级别。

    function addLayer() {
        map.addLayers([layer]);
        var center = new SuperMap.LonLat(0,0);
        map.setCenter(center, 1);
    }
    ……

     layer.events.on({"layerInitialized": addLayer});

在线演示与源码编辑

您可以在线访问完整代码、体验演示效果,也可以直接在线编辑源码并实时查看效果。

示例:自定义HelloKitty风格的矢量分块图

SuperMap JavaScript SDK支持通过CartoCSS自定义矢量瓦片的渲染风格。CartoCSS是Mapbox定义的地图样式预处理器,在制作矢量分块图时,可以使用其中的点、线、面、文本等符号样式。

Step0 使用CartoCSS预定义矢量图层样式

使用CartoCSS自定义矢量瓦片各图层的渲染风格,包括颜色、线宽及透明度等。


        @waterColor:rgb(245,169,193);
        @roadColora:rgb(244,73,116);
        @roadColorb:rgb(244,73,116);
        @railwayColora:rgb(50,50,50);
        @railwayColorb:rgb(255,255,255);
        @vegetationColor:rgb(239,169,193);
        @continentColor:rgb(250,250,250);
        @provinceLineColor:rgb(226,195,19);


        #China_Railway_L___China400::a{

        /*每一段的长度为15px,间隔也是15px*/
        line-color:@railwayColora;
        line-width:2.5;
        }
        #China_Railway_L___China400::b{

        /*每一段的长度为15px,间隔也是15px*/
        line-dasharray:18,18;
        line-color:@railwayColorb;
        line-width:1.5;
        }
        /*底下的地图背景图层*/

        #World_Division___China400{
        polygon-fill:@waterColor;
        }

        /*中国除外的其他国家的图层*/

        #World_Continent___China400{
        polygon-fill:@continentColor;
        line-width:1;
        line-color:@continentColor;
        }
        #China_Province_R___China400{
        polygon-fill:@continentColor;
        line-color:rgba(0,0,0,0);
        }

        #China_Road_L___China400::one{
        line-color:@roadColora;
        line-width:2;}
        #China_Road_L___China400::two{
        line-color:@roadColorb;
        line-width:1;}

        #China_Road_L___China400___1::a{
        line-color:@roadColora;
        line-width:2;}
        #China_Road_L___China400___1::b{
        line-color:@roadColorb;
        line-width:1;}

        #China_Hyd_R___China400{
        polygon-fill:@waterColor;
        line-color:@waterColor;
        }

        #China_Vegetation_R___China400{
        polygon-fill:@vegetationColor;
        line-color:@vegetationColor;
        }
        #China_Hydside_R___China400{
        polygon-fill:@waterColor;
        line-color:@waterColor;
        }

        #China_Provinces_L___China400{
        line-dasharray:10,10;
        line-color:@provinceLineColor;
        line-width:1;
        }

        #World_Division___China400{
        polygon-fill:@waterColor;
        }

Step1 地图初始化

本例将使用SuperMap Online发布的在线地图服务map_China4003中的矢量瓦片。

 var map, layer, lat, lon, geolocate, infowin, lonLat, geometryInfo, cartoCss,
 url = "http://www.supermapol.com/iserver/services/map_China4003/rest/maps/China";

 var value="IbooSg6gIBmhIRaesVgjSED0",
 name = "key";
 SuperMap.Credential.CREDENTIAL = new SuperMap.Credential(value, "key");

 function init() {
 if(!document.createElement('canvas').getContext) {
 alert('您的浏览器不支持 canvas,请升级');
 return;
 }

 map = new SuperMap.Map("map", {controls: [
 new SuperMap.Control.ScaleLine(),
 new SuperMap.Control.Zoom(),
 new SuperMap.Control.Navigation({
 dragPanOptions: {
 enableKinetic: true
 }
 })]
 });

 ……

 }

Step2 创建TiledVectorLayer图层并使用自定义的样式

通过 TiledVectorLayer 调用地图服务中的矢量瓦片,并使用CartoCSS中预定义的样式渲染出图(cartoCss参数)。

        cartoCss=document.getElementById("cartoCssStr").text;
        layer = new SuperMap.Layer.TiledVectorLayer("China", url,{cacheEnabled:true},{useLocalStorage:true,cartoCss:cartoCss});

Step3 把矢量分块图层添加到地图上

把自定义风格的矢量分块图层添加到地图上,并设置地图显示的中心点和比例尺级别。

    function addLayer() {
        map.addLayers([layer]);
        var center = new SuperMap.LonLat(12957388,4853991);
        map.setCenter(center, 11);
    }
    ……
    layer.events.on({"layerInitialized": addLayer});

在线演示与源码编辑

您可以在线访问完整代码、体验演示效果,也可以直接在线编辑源码并实时查看效果。