mapbox矢量切片标准_Cesium 加载矢量切片(MapBox Vector Tile)

矢量切片(vector tile)是当前 WebGIS 较热技术,国内的高德、百度等在线地图都使用了矢量切片技术。相较于传统栅格切片,矢量切片好处很多。简单几点就是:轻量、客户端渲染、还可加密(栅格切片容易被爬取)。矢量切片格式一般有 GeoJSON、TopoJSON 、MVT (MapBox Vector Tile)、PBF。

下面是 Cesium 加载 MVT 矢量切片的代码,由于样式渲染使用的了 openlayers,所以首先需要安装 openlayers。

一、安装 openlayers

npm install openlayers

二、MVT 加载核心代码

```javascript

// mvtProvider.js

import * as Cesium from 'cesium'

import ol from 'openlayers/dist/ol-debug'

export function MVTProvider (options) {

options = Cesium.defaultValue(options, Cesium.defaultValue.EMPTY_OBJECT)

this._tilingScheme = Cesium.defined(options.tilingScheme) ? options.tilingScheme : new Cesium.WebMercatorTilingScheme({ ellipsoid: options.ellipsoid })

this._tileWidth = Cesium.defaultValue(options.tileWidth, 512)

this._tileHeight = Cesium.defaultValue(options.tileHeight, 512)

this._readyPromise = Cesium.when.resolve(true)

this._ol = ol

this._mvtParser = new this._ol.format.MVT()

this._styleFun = Cesium.defined(options.styleFun) ? options.styleFun : createMapboxStreetsV6Style

this._key = Cesium.defaultValue(options.key, '')

this._url = Cesium.defaultValue(options.url, 'https://a.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf?access_token={k}')

var sw = this._tilingScheme._rectangleSouthwestInMeters

var ne = this._tilingScheme._rectangleNortheastInMeters

var mapExtent = [sw.x, sw.y, ne.x, ne.y]

this._resolutions = ol.tilegrid.resolutionsFromExtent(mapExtent, 22, this._tileWidth)

this._pixelRatio = 1

this._transform = [0.125, 0, 0, 0.125, 0, 0]

this._replays = ['Default', 'Image', 'Polygon', 'LineString', 'Text']

this._tileQueue = new Cesium.TileReplacementQueue()

this._cacheSize = 1000

}

Object.defineProperties(MVTProvider.prototype, {

proxy: {

get () {

return undefined

}

},

tileWidth: {

get () {

return this._tileWidth

}

},

tileHeight: {

get () {

return this._tileHeight

}

},

maximumLevel: {

get () {

return undefined

}

},

minimumLevel: {

get () {

return undefined

}

},

tilingScheme: {

get () {

return this._tilingScheme

}

},

rectangle: {

get () {

return this._tilingScheme.rectangle

}

},

tileDiscardPolicy: {

get () {

return undefined

}

},

errorEvent: {

get () {

return this._errorEvent

}

},

ready: {

get () {

return true

}

},

readyPromise: {

get () {

return this._readyPromise

}

},

credit: {

get () {

return undefined

}

},

hasAlphaChannel: {

get () {

return true

}

}

})

MVTProvider.prototype.getTileCredits = function () {

return undefined

}

function findTileInQueue (x, y, level, tileQueue) {

var item = tileQueue.head

while (item !== undefined && !(item.xMvt === x && item.yMvt === y && item.zMvt === level)) {

item = item.replacementNext

}

return item

}

function remove (tileReplacementQueue, item) {

var previous = item.replacementPrevious

var next = item.replacementNext

if (item === tileReplacementQueue._lastBeforeStartOfFrame) {

tileReplacementQueue._lastBeforeStartOfFrame = next

}

if (item === tileReplacementQueue.head) {

tileReplacementQueue.head = next

} else {

previous.replacementNext = next

}

if (item === tileReplacementQueue.tail) {

tileReplacementQueue.tail = previous

} else {

next.replacementPrevious = previous

}

item.replacementPrevious = undefined

item.replacementNext = undefined

--tileReplacementQueue.count

}

function trimTiles (tileQueue, maximumTiles) {

var tileToTrim = tileQueue.tail

while (tileQueue.count > maximumTiles &&

Cesium.defined(tileToTrim)) {

var previous = tileToTrim.replacementPrevious

remove(tileQueue, tileToTrim)

tileToTrim = null

tileToTrim = previous

}

}

MVTProvider.prototype.requestImage = function (x, y, level) {

var cacheTile = findTileInQueue(x, y, level, this._tileQueue)

if (cacheTile !== undefined) {

return cacheTile

}

var that = this

var url = this._url

url = url.replace('{x}', x).replace('{y}', y).replace('{z}', level).replace('{k}', this._key);

(function (x, y, z) {

var resource = Cesium.Resource.createIfNeeded(url)

return resource.fetchArrayBuffer().then((arrayBuffer) => {

var canvas = document.createElement('canvas')

canvas.width = 512

canvas.height = 512

var vectorContext = canvas.getContext('2d')

var features = that._mvtParser.readFeatures(arrayBuffer)

var styleFun = that._styleFun()

var extent = [0, 0, 4096, 4096]

var _replayGroup = new ol.render.canvas.ReplayGroup(0, extent, 8, true, 100)

for (var i = 0; i < features.length; i++) {

var feature = features[i]

var styles = styleFun(features[i], that._resolutions[level])

for (var j = 0; j < styles.length; j++) {

ol.renderer.vector.renderFeature_(_replayGroup, feature, styles[j], 16)

}

}

_replayGroup.finish()

_replayGroup.replay(vectorContext, that._pixelRatio, that._transform, 0, {}, that._replays, true)

if (that._tileQueue.count > that._cacheSize) {

trimTiles(that._tileQueue, that._cacheSize / 2)

}

canvas.xMvt = x

canvas.yMvt = y

canvas.zMvt = z

that._tileQueue.markTileRendered(canvas)

_replayGroup = null

return canvas

}).otherwise(() => {

})

}(x, y, level))

}

MVTProvider.prototype.pickFeatures = function () {

return undefined

}

function createMapboxStreetsV6Style () {

var fill = new ol.style.Fill({ color: '' })

var stroke = new ol.style.Stroke({ color: '', width: 1 })

var polygon = new ol.style.Style({ fill })

var strokedPolygon = new ol.style.Style({ fill, stroke })

var line = new ol.style.Style({ stroke })

var text = new ol.style.Style({

text: new ol.style.Text({

text: '', fill, stroke

})

})

var iconCache = {}

function getIcon (iconName) {

var icon = iconCache[iconName]

if (!icon) {

icon = new ol.style.Style({

image: new ol.style.Icon({

src: https://cdn.rawgit.com/mapbox/maki/master/icons/${iconName}-15.svg,

imgSize: [15, 15]

})

})

iconCache[iconName] = icon

}

return icon

}

var styles = []

return function (feature, resolution) {

var length = 0

var layer = feature.get('layer')

var cls = feature.get('class')

var type = feature.get('type')

var scalerank = feature.get('scalerank')

var labelrank = feature.get('labelrank')

var adminLevel = feature.get('admin_level')

var maritime = feature.get('maritime')

var disputed = feature.get('disputed')

var maki = feature.get('maki')

var geom = feature.getGeometry().getType()

if (layer === 'landuse' && cls === 'park') {

fill.setColor('#d8e8c8')

styles[length++] = polygon

} else if (layer === 'landuse' && cls === 'cemetery') {

fill.setColor('#e0e4dd')

styles[length++] = polygon

} else if (layer === 'landuse' && cls === 'hospital') {

fill.setColor('#fde')

styles[length++] = polygon

} else if (layer === 'landuse' && cls === 'school') {

fill.setColor('#f0e8f8')

styles[length++] = polygon

} else if (layer === 'landuse' && cls === 'wood') {

fill.setColor('rgb(233,238,223)')

styles[length++] = polygon

} else if (layer === 'waterway' &&

cls !== 'river' && cls !== 'stream' && cls !== 'canal') {

stroke.setColor('#a0c8f0')

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528130.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

d630无电池升级bios_太重要,你想要的电脑BIOS全面解读与设置(下)

设置意外断电后恢复状态通常在电脑意外断电后&#xff0c;需要重新启动电脑&#xff0c;但在 BIOS 中可以对断电恢 复进行设置&#xff0c;一旦电源恢复&#xff0c;电脑将自动启动。下面就在 UEFIBIOS 中设置电 脑的自动断电后重启&#xff0c;具体操作步骤如下。 STEP 1 选择…

MySQL的乱码解决方案

1.如果第一次安装MySQL数据库: 在选择编码时&#xff0c;选择最后一项&#xff0c;并指定编码为utf8或者gbk&#xff08;这两种编码支持中文,是我们比较常用的&#xff09; 如果已经按照完成了MySQL数据库&#xff0c;那么可以进行重新配置修改: 在开始菜单中找到: 然后重复第…

pg数据库开启远程连接_疫情之下,开启在家办公模式,远程连接工具篇之向日葵...

1月30号本来就要返程去上班了&#xff0c;接到公司通知&#xff0c;根据当前疫情的形势&#xff0c;假期延长到3号&#xff0c;退车票&#xff0c;候补抢票一顿操作&#xff0c;将票改到了3号&#xff0c;3号又接到通知假期延长到10号。作为一个一线的销售人员&#xff0c;工作…

谈谈对MVC的理解(View+Model+Controller)

1) 什么是MVC&#xff1f; MVC是一种设计思想&#xff0c;根据职责不同将程序中的组件分成以下3个部分。 V&#xff08;View视图&#xff09;&#xff1a;负责与用户交互。将数据展现&#xff0c;或者是接收数据 M&#xff08;Model模型&#xff09;&#xff1a;负责业务处理。…

吃下去的东西老是往上翻上来_食管裂孔疝的这个诱因你知道吗?医生:不要再吃过烫的食物...

食管裂孔疝的忌吃辣门诊遇见一个爱吃热、辣食物的患者。她自述饭后老是反酸水呕吐&#xff0c;本来以为只是普通胃病&#xff0c;最近到我们医院一查&#xff0c;结果让她大吃一惊&#xff0c;本在腹腔的胃竟然有部分“跑”进了胸腔&#xff01;两年多前&#xff0c;这个女士发…

物理搬砖问题_全职业通用,搬砖市场装备

更多原创文章可关注微信公众号&#xff1a;地下城勤帝 查看大家好&#xff0c;我是勤帝&#xff0c;我只写大家能看懂的文章搬砖市场的角色更新了一些&#xff0c;装备都有所不同&#xff0c;今天我给大家一个可以通用的装备&#xff0c;这套装备虽然成型不快&#xff0c;但是…

Oracle中表连接的方式有哪些

内连接(自然连接) 等值连接、自然连接和不等值连接 &#xff5b;内连接是join 关键字连接两个表&#xff0c;语法为 table1 join table2 on 条件。 根据使用的比较方式不同&#xff0c;内连接又分为等值连接、自然连接和不等值连接。 等值连接&#xff1a;所谓等值连接&…

快手通过标签添加的我_快手怎么上热门?快手短视频推荐指标有哪些?

“快手怎么才能上热门&#xff1f;快手上热门都有哪些技巧&#xff1f;”其实这些问题&#xff0c;除了通过提高短视频质量&#xff0c;还可以通过分析推荐指数的方式解决。运营者想要有效提升短视频的播放量&#xff0c;想让快手短视频快速上热门&#xff0c;还可以从推荐指数…

JAVA的数据类型有哪些?

⑴基本数据类型&#xff08;八种&#xff09;&#xff1a; 整型&#xff1a; byte 1字节, short 2字节, int 4字节, long 8字节 浮点型&#xff1a; float 4字节, double 8字节 【float 类型共 32位&#xff08;不 int相同&#xff09;&#xff0c;其中 1位为符号位…

python机器学习算法.mobi_机器学习之ID3算法详解及python代码实现

在生活中我们经常会用到决策树算法&#xff0c;最简单的就是二叉树了&#xff1b;相信大家也会又同样的困扰&#xff0c;手机经常收到各种短信&#xff0c;其中不乏很多垃圾短信、此时只要设置这类短信为垃圾短信手机就会自动进行屏蔽、减少被骚扰的次数&#xff0c;同时正常短…

java中的4种访问制权限有哪些?分别作用范围是什么?

(1).public&#xff1a;最大访问控制权限&#xff0c;对所有的类都可见。 (2).protect&#xff1a;修饰的&#xff0c;在类内部、同一个包、子类中能访问 (3).default&#xff1a;包访问权限&#xff0c;即同一个包中的类可以可见。默认不显式指定访问控制权限时就是default包…

打docker镜像_从安全到镜像流水线,Docker 最佳实践与反模式一览

作者 | Timothy Mugayi译者 | 弯月&#xff0c;责编 | 夕颜封图 | CSDN付费下载自视觉中国出品 | CSDN(ID:CSDNnews)在使用Docker的大部分时间里&#xff0c;我们并不关心其内部的工作原理。仅凭启动一个Docker容器并且让应用程序运行良好&#xff0c;并不能说明你已经实现了一…

JAVA重载和重写的区别?

重载&#xff1a;方法名相同&#xff0c;参数不同&#xff08;参数类型或者长度&#xff09; 重载和修饰符和返回类型无关。 一是方法的参数列表必须改变&#xff0c;包括参数的类型&#xff0c;参数的个数多少&#xff0c;参数顺序。 二是重载对返回类型&#xff0c;访问修饰…

详细关闭iiop方法_疏通暖气片堵塞的方法,看完你就知道了!

冬季几乎家家户户都会安装暖气片来进行采暖&#xff0c;但在使用过程中&#xff0c;通常会出现暖气片被堵&#xff0c;用户不知道被堵的原因又不知从哪下手&#xff0c;今天金旗舰旗哥带大家来了解一下暖气片被堵塞的原因及疏通方法。一、堵塞暖气片的原因&#xff1a;1、暖气片…

谈谈对集合框架的理解?

集合框架包括集合不映射&#xff08;Collection and Map&#xff09; List 元素有先后次序的集合, 元素有 index 位置, 元素可以重复&#xff0c;继承自 Collection 接口,实现类: ArrayList, Vector, LinkedList List 表示有先后次序的对象集合 ArrayList是使用变长数组算法…

17 软件源_9成职场人支持“准点下班”,2020年度职场报告:工作是最大焦虑源

如果所有人都拒绝996&#xff0c;能否改变职场内卷生态&#xff1f;职场社交平台脉脉站内的数据显示&#xff0c;在一则&#xff1a;“准点下班VS加班谁才是好员工”的问答中&#xff0c;8.1万的投票者选择“准点”下班&#xff0c;占89%&#xff1b;只有9968名投票者认为“加班…

前端三大框架

一、web前端之Angularjs框架 如果您对最新的web开发技术有所了解&#xff0c;那么Angularjs对您来说是一个熟悉的名称。AngularJS是一个客户端的JavaScript MVC开源框架&#xff0c;特别为使用MVC架构模式的单页面web应用而设计&#xff0c;可用于开发动态Web应用程序。它不是…

js如何在当前页面加载springmvc返回的页面_手写SpringMVC学习

前面我们学习了spring框架源码&#xff0c;做了一些自己手写的学习&#xff0c;最近&#xff0c;我们开始学习springMVC框架的学习 &#xff0c;springMVC框架&#xff0c;相信大家不陌生了&#xff0c;所以这里不做过多的介绍了。SpringMVC以DispatcherServlet为核心&#xff…

用python做简单的地理聚类分析案例_用Python做一个简单的翻译工具

编程本身是跟年龄无关的一件事&#xff0c;不论你现在是十四五岁&#xff0c;还是四五十岁&#xff0c;如果你热爱它&#xff0c;并且愿意持续投入其中&#xff0c;必定会有所收获。本文就来自编程教室一位“小”读者的投稿&#xff08;互助学习1群里的同学应该对作者的名字很熟…

echarts柱图根据值显示不同颜色_视频 | Origin画3D柱图,这篇讲透了!

视频教程东华大学的汪博士提出一个问题&#xff1a;怎样画三维柱状图。汪博士提供了一篇王中林院士的文献图&#xff0c;画一个只有四根柱子的三维柱图。画了一个草图&#xff0c;A0、A1安排在第二行&#xff0c;A3、A2安排在第一行。相信很多同学在画3D柱图时&#xff0c;都很…