iClient for JavaScript如何以mvt矢量瓦片的形式加载数据服务

刘大

前言

在提到查看iServer REST数据服务的概况的时候,大家总会想到说,通过发布对应的地图服务或者,查询后在前端绘制出来。除此之外,还可以通过矢量瓦片的形式进行展现,本篇文章就带大家来看看如何加载。

1.iServer中的预览页面

在介绍前端iClient加载之前,其实iServer里面也内置有数据服务的矢量瓦片预览页面,使用的是iClient for OpenLayers,入口在具体的数据集页面里,如下图:

矢量瓦片预览位置

2.iClient for JavaScript加载

2.1 构建Style

数据服务相对地服务或者矢量瓦片服务来说,缺少的是矢量瓦片的样式文件(style.json),因此在前端加载的时候,我们主要是要去构建style.json
我们这里以官网示例的world数据服务“http://support.supermap.com.cn:8090/iserver/services/data-world/rest/data/datasources/World/datasets/capital”为例进行说明
先来看下构建的style.json,遵从MapboxGL的样式(https://docs.mapbox.com/help/glossary/style/)

  let style={
    "sources": {
        "pointLayer": {  
            "tiles": [
                "http://support.supermap.com.cn:8090/iserver/services/data-world/rest/data/datasources/World/datasets/capital/tileFeature.mvt?returnAttributes=true&width=512&height=512&x={x}&y={y}&z={z}"
            ],//矢量瓦片路径
            "type": "vector"
        }
    }, //定义数据源(必填)
    "name": "test",//名称,可自定义
    "version": 8,// //版本号(必填,且值必须为 8)
    "layers": [
        {

            "minzoom": 0,//最小可见比例尺
            "maxzoom": 21,//最大可见比例尺
            "paint": {
                "circle-color": "rgba(255,0,0,1.00)",
                "circle-radius": 5
            },//渲染样式,针对不同的矢量数据类型进行设置
            "id": "capital@World", //图层id,可自行定义
            "source": "pointLayer", //与上面定义的source名称对应
            "source-layer": "capital@World",// (必填 且需要写的是数据集名@数据源名)
            "type":'circle'//图层类型
        }
    ]
}

构建好style样式以后,只需要按照平常加载矢量瓦片的方式去加载就好了

2.2 iCient加载

2.2.1Leaflet & MapboxGL

由于Leaflet加载矢量瓦片,采用的是MapboxGL的插件,代码编写上差不多,这里就直接用Leaflet举例了
可参考leaflet加载mvt示例

var gl =  L.mapboxGL({
                        renderWorldCopies: false,
                        style: style,//第一步构建的style
                        crs: 'EPSG:4326',
                        minZoom:0,
                        maxZoom: 13
                    }).addTo(map);

加载结果如图
在这里插入图片描述

2.2.2 OpenLayers

可参考Openlayers加载mvt示例
关键代码如下:

//MVT 矢量瓦片第0级分辨率为全球范围宽度除以瓦片宽度512.
        //常见坐标系第0级分辨率   WebMercator(3857):2*6378137*Math.PI/512    WGS84(4326):360.0/512    China2000(4490):360.0/512    Beijing54(4214):360.0/512     Xian80(4610):360.0/512
        var topResolution = 360.0 / 512;
        var resolutions = [];
        for (var zoom = 0; zoom < 22; zoom++) {
            resolutions.push(topResolution / Math.pow(2, zoom));
        }
        var vectorLayer;
        var map = new ol.Map({
            target: 'map',
            view: new ol.View({
                center: [0, 0],
                zoom: 0,
                projection: 'EPSG:4326',
                resolutions: resolutions
            })
        });
        var format = new ol.format.MVT({
            featureClass: ol.Feature

        });
        var style = new ol.supermap.MapboxStyles({
            style: style2,//第一步构建的style
            resolutions: resolutions,
            map: map
        })
        vectorLayer = new ol.layer.VectorTile({
	                source: new ol.source.VectorTileSuperMapRest({
	                    url: "http://support.supermap.com.cn:8090/iserver/services/data-world/rest/data/datasources/World/datasets/capital",
	                    projection: 'EPSG:4326',
	                    tileGrid: new ol.tilegrid.TileGrid({
	                        resolutions: resolutions,
	                      	origin: [-180,90],
                            minZoom: 0,
	                        tileSize: 512
	                    }),
	                    tileType: "ScaleXY",
	                    format: format
	                }),
	                style: style.getStyleFunction()
	            });
	        	map.addLayer(vectorLayer);

加载结果如下
在这里插入图片描述

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Cesium是一个基于WebGL的3D地图引擎,可以加载各种类型的地理数据。要加载Mapbox矢量瓦片,您可以按照以下步骤进行操作: 1. 获取Mapbox矢量瓦片的URL。您可以在Mapbox Studio中创建和发布矢量瓦片,然后获取其URL。 2. 创建一个Cesium的ImageryProvider对象。您可以使用Cesium的UrlTemplateImageryProvider类来实现这一点,该类可以从一个URL模板加载图像数据。例如: ```javascript var imageryProvider = new Cesium.UrlTemplateImageryProvider({ url: 'https://api.mapbox.com/styles/v1/{username}/{style_id}/tiles/256/{z}/{x}/{y}?access_token={access_token}', credit: 'Mapbox', minimumLevel: 0, maximumLevel: 22, subdomains: ['a', 'b', 'c'], tilingScheme: new Cesium.WebMercatorTilingScheme(), rectangle: Cesium.Rectangle.fromDegrees(-180.0, -85.06, 180.0, 85.06), customTags: { username: 'mapbox', style_id: 'styleid', access_token: 'your_access_token' } }); ``` 在上面的代码中,您需要将URL模板替换为您的Mapbox矢量瓦片的URL,以及您的Mapbox用户名、样式ID和访问令牌。 3. 创建一个Cesium的ImageryLayer图像图层对象,并将ImageryProvider对象作为参数传递给它。例如: ```javascript var imageryLayer = new Cesium.ImageryLayer(imageryProvider); ``` 4. 将ImageryLayer对象添加到Cesium的Viewer视图器中,以便在地图上显示它。例如: ```javascript viewer.imageryLayers.add(imageryLayer); ``` 通过上述步骤,您就可以将Mapbox矢量瓦片加载到Cesium中,实现在3D地图上显示矢量数据的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值