作者:LX

前言

MVT全称是Mapbox Vector Tile,是Mapbox标准的矢量切片。矢量瓦片具有创建效率高、传输和渲染速度快、数据和风格样式独立,更改配图方案无需重新创建瓦片、高显示质量,能够很好地支持高分辨率显示屏等特点。SuperMap iClient产品很好的支持了MVT矢量瓦片在Web端的加载,本文主要以iClient for OpenLayers为例给大家展示一下如何在Web实现MVT瓦片的展示、查询和编辑。

一、 支持的MVT矢量瓦片坐标系

iClient for Openlayer默认支持4326,3857坐标系MVT矢量瓦片的对接,对于非4326和3857的坐标系需要先通过proj4.defs()来定义,再进行对接,如China2000坐标系定义:
proj4.defs(“EPSG:4490”,"+proj=longlat +ellps=GRS80 +no_defs");
PS:proj4的使用方法可以参考博客《JavaScript利器分享之Proj4js》

二、 支持的MVT服务来源

SuperMap iServer 提供了矢量瓦片图层源,以下面两种方式提供:
1) iServer发布的地图服务的矢量切片(tileFeature)资源的mvt表述
2) iServer发布的矢量瓦片服务(vectortile)资源

三、 实战演练

Web端加载MVT瓦片其实就是从服务端获取矢量瓦片资源然后在客户端实现解析数据和完成绘制。主要思路就是:
1、解析iServer提供的服务
2、实现在客户端的绘制
3、瓦片要素的查询
4、图层风格的修改

下面我将以China2000坐标系的MVT瓦片服务为例展示一下iClient for Openlayers实现对MVT瓦片的对接、要素查询以及瓦片风格的修改。

开发代码:

1、引入Mapbox风格库

<script type="text/javascript" include='ol-debug,ol-mapbox-style,proj4' src="../../dist/openlayers/include-openlayers.js"></script>

PS:如果不需要自定义坐标系,可以不引入proj4

2、定义坐标系(对于4326和3857的坐标系,此步骤可以省略)

//定义China2000坐标系
proj4.defs("EPSG:4490","+proj=longlat +ellps=GRS80 +no_defs");
var projection = ol.proj.get('EPSG:4490');
projection.setExtent([-180,-85.05,180,85.05]);

3、定义Openlayers的map对象

  //计算分辨率//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/512var topResolution = 360.0 / 512;var resolutions = [];for (var zoom = 0; zoom < 9; zoom++) {resolutions.push(topResolution / Math.pow(2, zoom));}//定义Openlayers的map对象var map = new ol.Map({target: 'map',view: new ol.View({center: [0,0],zoom:0,minZoom:0,maxZoom:8,projection: projection,resolutions:resolutions})});

4、定义矢量瓦片风格

//Mapbox 矢量瓦片风格
var style = new ol.supermap.MapboxStyles({map: map,url: url,source: 'testdata',resolutions: resolutions})

5、定义矢量瓦片图层源

 var source=new ol.source.VectorTileSuperMapRest({url: url,projection: projection,format: new ol.format.MVT()  //MVT格式})

6、创建矢量瓦片图层,并添加到地图上

 var vectorLayer;//监听styleloaded,等style加载完再进行瓦片渲染,不然会瓦片丢失风格style.on('styleloaded', function () {vectorLayer = new ol.layer.VectorTile({//设置避让参数declutter: true,source:source,style: style.getStyleFunction()});map.addLayer(vectorLayer);})

MVT瓦片对接结果展示:

7、要素查询

map.on('click', function (e) {map.forEachFeatureAtPixel(e.pixel, function (feature) {style.setSelectedId(feature.getId(),feature.getProperties().layer);return true;}, {hitTolerance: 5});vectorLayer.changed();})

查询结果:

8、修改瓦片图层样式

map.on('pointermove', function (e) {var features = map.getFeaturesAtPixel(e.pixel);if (features) {var paint;var layername=features[0].get('layer'); //获取瓦片图层名称//判断图层,不同的图层设置不同的样式if(layername=="World_Continent_txt@China"){paint={"text-halo-color":"rgba(236,233,216,1.00)","text-color":"rgba(224, 17, 17,1.00)","text-halo-width":4}                changestyle(layername,paint);}else if(layername=="World_Continent_pg@China"){paint={"fill-antialias": true,"fill-color": "rgba(105, 100, 100,1.00)"}                changestyle(layername,paint);}else if(layername=="World_Division_pg@China"){paint= {"fill-antialias": true,"fill-color": "rgba(0,0,0,1.00)"}               changestyle(layername,paint);}}});//图层样式改变方法function changestyle(layername,paint){layerStyleArr = style.getStylesBySourceLayer(layername);style.updateStyles([{"id": layerStyleArr[0].id,"paint": paint}]);source.changed();//在popup中显示图层名称content.innerHTML = "Layer: " + layername;container.style.opacity = 1;return;}

图层样式修改结果:

测试数据及完整代码:
https://download.csdn.net/download/supermapsupport/11209359

Web端MVT矢量瓦片加载之OpenLayers篇相关推荐

  1. cesium 入门开发系列矢量瓦片加载展示(附源码下载)

    前言 cesium 入门开发系列环境知识点了解: cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等 cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 ...

  2. 关于MVT矢量瓦片,你不知道的事

    作者:LX 其实博主已经在前面的系列文章中介绍了矢量瓦片,比如 <创建矢量瓦片之制图最佳实践>介绍了制作瓦片的注意事项: <SuperMap地图系列:矢量瓦片的应用>介绍了矢量 ...

  3. 移动端加载MVT矢量瓦片

    在SuperMap iMobile for Android 9D(2019)版本中,新增了加载MVT矢量瓦片的接口.矢量瓦片具有创建效率高.传输和渲染速度快.数据和风格样式独立,更改配图方案无需重新创 ...

  4. iClient for Leaflet加载MVT矢量瓦片并注册鼠标事件

    作者:刘大 使用背景 需要在前端动态更改地图样式,并高效进行鼠标交互获取要素的业务场景时,我们会采取MVT矢量瓦片来解决此类问题,但是web应用开发已经选用Leaflet地图框架的情况下怎么办呢,这时 ...

  5. WebGIS 瓦片地图引擎实现之——地图瓦片加载计算原理介绍

    1. 背景 1.1 地图瓦片之前 在地图瓦片技术使用之前,用户使用在线地图,一般都是客户端把将要显示的地理范围传送到服务端,服务器端将地理范围内的地理数据都查询出来,然后在服务端按照预先定义的专题地图 ...

  6. Unity3D 网页插件Embedded Browser(ZFBrowser)PC端打包文件无法加载网页解决方法

    网页插件Embedded Browser(ZFBrowser)PC端打包文件无法加载网页 介绍:使用Embedded Browser开发unity项目内嵌网页,打包后发现出现一个问题网页插件无响应,而 ...

  7. 在HBuilder创建前端web项目时,图片加载不出来,怎么解决?

    在HBuilder创建前端web项目时,图片加载不出来,如下: 解决方法: 将图片文件路径减少,可正常显示,如图:

  8. 移动端网页如何实现加载更多分页

    移动端网页如何实现加载更多分页 实例代码如下 jq $(window).scroll(function(){ var scrollTop = $(this).scrollTop(); //滚动条距离顶 ...

  9. 第61篇一对多之老师端私有白板点击上共享白板及老师端学生私有白板加载多次及点头像出私有白板列表周四

    关键词:老师端私有白板点击上共享白板,老师端学生私有白板加载多次,点头像出私有白板列表 一.私有白板向老师端传图片数据 1.1 服务器运行平台 老师端:https://localhost:9101/d ...

最新文章

  1. seaborn系列(1) | 关系类图relplot用法
  2. mysql注入ctf_CTF SQL注入
  3. Redis的常用命令——hash的常用命令
  4. 杀毒软件对Platform Builder编译的影响
  5. Android学习笔记44:JSON数据解析
  6. wordpress 主题教程-笔记
  7. 判断html()中有长度,VBS 字符串长度判断的问题
  8. 为翻译软件提供云端语料库支持,Tmxmall 瞄准了语言领域的大数据
  9. kafka生产者集群和分区,消费者轮询接收
  10. 数据库技术-计算机三级考试介绍
  11. 【代码笔记】Web--使用Chrome来查看网页源代码
  12. java实现MongoDB中unwind与match用法
  13. 问学计算机的同学买什么电脑,学生用的笔记本电脑什么样的好
  14. ruby 安装问题的 一二事
  15. 计算机网路基础课后习题答案 主编刘建友
  16. 一些学习编程的优质网站
  17. 《勋伯格和声学》读书笔记(一):大调三和弦的排列与结构
  18. Linux程序设计(第4版)
  19. IIR滤波器极点分析--关于稳定度
  20. 方正科技携手华育国际 助力职业教育发展

热门文章

  1. PHP开发_入门基础2
  2. 深入理解Java虚拟机(第二版) 第九章:类加载及执行子系统的案例与实战
  3. 如何获取oss视频资源的时长
  4. EBS之实现excel批量导入数据库
  5. friendly发音_“friendly”的反义词是什么? friendly 用中文怎么读
  6. 新版本win10查看无线密码
  7. 固定资产标签模板_数字资产组合–网站模板
  8. vue-element-admin使用CDN引入element-ui时改变全局配置(size,zIndex)
  9. 2022年电工高级技师(一级)考点及答案
  10. 角谷猜想(Collatz conjecture)--用 python 语言实现