UNPKG

@mapgis/webclient-leaflet-plugin

Version:

509 lines (421 loc) 16.2 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> view/utils/mapV/MapVLayerPlugin.js</title> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link type="text/css" rel="stylesheet" href="styles/app.min.css"> <link type="text/css" rel="stylesheet" href="styles/iframe.css"> <link type="text/css" rel="stylesheet" href=""> </head> <body class="layout small-header"> <div id="stickyNavbarOverlay"></div> <div class="top-nav"> <div class="inner"> <a id="hamburger" role="button" class="navbar-burger" aria-label="menu" aria-expanded="false"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </a> <div class="logo"> <h1> MapGIS Client for JavaScript API</h1> </div> <div class="menu"> <div class="navigation"> <a class="link user-link " href="/docs/cesium/index.html" > Cesium </a> <a class="link user-link " href="/docs/mapboxgl/index.html" > MapboxGL </a> <a class="link user-link " href="/docs/leaflet/index.html" > Leaflet </a> <a class="link user-link " href="/docs/openlayers/index.html" > OpenLayers </a> </div> </div> </div> </div> <div id="main"> <div class="sidebar " id="sidebarNav" > <div> <span class="mapgis-api-document-span"><a href="index.html">API文档</a></span> </div> <div class="search-wrapper"> <input id="search" type="text" placeholder="搜索文档..." class="input"> </div> <nav> <div class="category"><div style="font-weight: bold;vertical-align: middle;padding: 0.4rem 0;" class="mapgis-menu-span"><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/m.png" alt="">视图模块</div><ul class="mapgis-sidebar-menus"><li><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/c.png" alt=""><a href="DrawControl.html">DrawControl</a><span style="display: none;"><p>绘制工具</p></span></li><li><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/c.png" alt=""><a href="MapView.html">MapView</a><span style="display: none;"><p>二维场景视图(leaflet引擎),对地图引擎进行管理,如果要对地图图层进行管理请参考[Map]{@link Map},<br/> 参考示例: <a href='#MapView'>[初始化二维场景视图]</a> <br>[ES5引入方式]:<br/> Zondy.MapView() <br/> [ES6引入方式]:<br/> import { MapView } from '@mapgis/webclient-leaflet-plugin' <br/></p></span></li><li><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/c.png" alt=""><a href="Popup.html">Popup</a><span style="display: none;"><p>二维场景信息弹窗(leaflet引擎) 参考示例: <a href='#MapView'>[初始化二维场景视图]</a> [ES6引入方式]:<br/> import { Popup } from '@mapgis/webclient-leaflet-plugin' <br/> 自定义样式说明:<br/> zondy-popup__content 弹窗容器样式<br/> zondy-popup__tip 弹窗对话框箭头样式<br/> zondy-popup__header 弹窗头部样式<br/> zondy-popup__content 弹窗主体样式<br/> zondy-popup__footer 弹窗底部样式<br/></p></span></li><li><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/c.png" alt=""><a href="Screenshot.html">Screenshot</a><span style="display: none;"><p>屏幕打印工具</p></span></li></ul><div style="font-weight: bold;vertical-align: middle;padding: 0.4rem 0;" class="mapgis-menu-span"><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/m.png" alt="">草图编辑模块</div><ul class="mapgis-sidebar-menus"><li><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/c.png" alt=""><a href="SketchEditorLeaflet.html">SketchEditorLeaflet</a><span style="display: none;"><p>二维场景草图编辑类<br/> <br>[ES5引入方式]:<br/> const { SketchEditorLeaflet } = Zondy <br/> [ES6引入方式]:<br/> import { SketchEditorLeaflet } from &quot;@mapgis/webclient-leaflet-plugin&quot; <br/></p></span></li></ul><div style="font-weight: bold;vertical-align: middle;padding: 0.4rem 0;" class="mapgis-menu-span"><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/m.png" alt="">渲染器模块</div><ul class="mapgis-sidebar-menus"><li><img style="width: 20px;margin-right: 6px;vertical-align: middle;" src="./styles/c.png" alt=""><a href="Zondy.ThemeLayer.GraphThemeLayer.html">GraphThemeLayer</a><span style="display: none;"><p>统计专题图通过为每个要素绘制统计图表来反映其对应的专题值的大小。它可同时表示多个字段属性信息,在区域本身与各区域之间形成横向和纵向的对比。<br>统计专题图多用于具有相关数量特征的地图上,比如表示不同地区多年的粮食产量、GDP、人口等,不同时段客运量、地铁流量等。目前提供的统计图类型有:柱状图(Bar),折线图(Line),饼图(Pie),三维柱状图(Bar3D),点状图(Point),环状图(Ring)。</p></span></li></ul></div> </nav> </div> <div class="core" id="main-content-wrapper"> <div class="content"> <header id="page-title" class="page-title"> <span class="page-title-main">类名</span> <span class="page-title-sub">view/utils/mapV/MapVLayerPlugin.js</span> </header> <section> <article> <pre class="prettyprint source linenums"><code>import * as L from '@mapgis/leaflet' import { MapvBaseLayer } from './MapvBaseLayer' import { getMapRotateBounds } from '../support/utils' const MapvLayerConstruct = L.Layer.extend({ initialize(map, dataset, mapvoption, options) { this.map = map this.dataset = dataset || {} this.mapvoption = mapvoption options = options || {} this.render = this.render.bind(this) L.Util.setOptions(this, options) this._canvas = this._createCanvas() L.stamp(this) // 下面5个是leaflet专属事件,clickEvent和mousemoveEvent是mapv内部自带的方法不放出来 this.innerMoveStartEvent = this.moveStartEvent.bind(this) this.innerMoveEndEvent = this.moveEndEvent.bind(this) this.innnerZoomstart = this.zoomStartEvent.bind(this) this.innerViewreset = this.viewresetEvent.bind(this) this.innerResize = this.resizeEvent.bind(this) this.innerRotate = this.rotateEvent.bind(this) }, /** * 增加数据 * @function L.zondy.MapvLayer.prototype.addData * * @param data - {Array} 数据. * @param options - {Object} 只做额外增加的字段作用 */ addData(data, options) { this.mapvBaseLayer.addData(data, options) }, /** * 更新数据 * @function L.zondy.MapvLayer.prototype.addData * * @param data - {Array} 数据. * @param options - {Object} 只做额外增加的字段作用 */ updateData(data, options) { this.mapvBaseLayer.updateData(data, options) }, initDevicePixelRatio() { this.devicePixelRatio = window.devicePixelRatio || 1 }, _createCanvas() { const canvas = document.createElement('canvas') canvas.style.position = 'absolute' canvas.style.top = '0px' canvas.style.left = '0px' canvas.style.pointerEvents = 'none' canvas.style.zIndex = this.options.zIndex || 100 const size = this.map.getSize() canvas.width = size.x canvas.height = size.y canvas.style.width = `${size.x}px` canvas.style.height = `${size.y}px` const devicePixelRatio = this.devicePixelRatio canvas.getContext('2d').scale(devicePixelRatio, devicePixelRatio) if (this.mapvoption.context === '2d') { canvas.getContext('2d').scale(devicePixelRatio, devicePixelRatio) } return canvas }, onAdd(map) { const tilePane = this.getPane() const _container = L.DomUtil.create('div', 'leaflet-layer', tilePane) _container.appendChild(this._canvas) this._container = _container this.mapvBaseLayer = new MapvBaseLayer( map, this.dataset, this.mapvoption, this ) this.bindEvent() if (this.options.tileLoader) { this._initTileLoader() } this._reset() this.fire('loaded') }, bindEvent() { const map = this.map map.on('movestart', this.innerMoveStartEvent) map.on('moveend', this.innerMoveEndEvent) map.on('zoomend', this.innerMoveEndEvent) map.on('zoomstart', this.innnerZoomstart) map.on('viewreset', this.innerViewreset) map.on('resize ', this.innerResize) map.on('rotate', this.innerRotate) this.mapvBaseLayer.bindEvent() }, unbindEvent() { const map = this.map map.off('movestart', this.innerMoveStartEvent) map.off('moveend', this.innerMoveEndEvent) map.on('zoomend', this.innerMoveEndEvent) map.off('zoomstart', this.innnerZoomstart) map.off('viewreset', this.innerViewreset) map.off('resize ', this.innerResize) map.off('rotate', this.innerRotate) this.removeAllData() this.mapvBaseLayer.unbindEvent() }, moveStartEvent() { this.mapvBaseLayer.animatorMovestartEvent() this._unvisiable() }, moveEndEvent() { this.mapvBaseLayer.animatorMoveendEvent() this._reset() this._visiable() }, zoomStartEvent() { this._unvisiable() }, viewresetEvent() { this._reset() this._visiable() }, resizeEvent() { this._reset() this._visiable() }, rotateEvent() { this._reset() this._visiable() }, _animateZoom() { if (!this._animating) { this._animating = true } }, _endZoomAnim() {}, getCanvas() { return this._canvas }, getAttribution() { return this.options.attribution }, draw() { return this._reset() }, onRemove() { L.DomUtil.remove(this._container) this.unbindEvent() this.disposeFlag = true }, /** * 设置透明度 * @function L.zondy.MapvLayer.prototype.setOpacity * @param opacity - {Number} 1.0. */ setOpacity(opacity) { this._canvas.style.opacity = opacity }, /** * 设置Zindex * @function L.zondy.MapvLayer.prototype.setZIndex * @param zIndex - {Number} 10. */ setZIndex(zIndex) { this._canvas.style.zIndex = zIndex }, bringToFront() { return this }, bringToBack() { return this }, _reset() { this.resizeCanvas() this.fixPosition() this.onResize() this.render() }, _visiable() { this.getCanvas().style.display = 'block' }, _unvisiable() { this.getCanvas().style.display = 'none' }, _render() { this.render() }, /** * @description 拖动的时候和放大缩小的时候自定义图层不见得会和地图的像素坐标同步计算 * 因此再绘制自定义图层的时候需要重新计算对应的位置,这里主要是对齐左上角 * */ fixPosition() { const topleft = this.map.getBounds().getNorthWest() const offset = this.map.latLngToLayerPoint(topleft) if (topleft) { L.DomUtil.setPosition(this._canvas, { x: offset.x, y: offset.y }) } }, resizeCanvas() { let size // 根据旋转的范围改变覆盖物图层的容器大小 if (this.map._rotate) { size = getMapRotateBounds(this.map).getSize() } else { size = this.map.getSize() } const canvas = this.getCanvas() canvas.width = size.x canvas.height = size.y canvas.style.width = `${size.x}px` canvas.style.height = `${size.y}px` }, // use direct: true if you are inside an animation frame call redraw(direct) { this.resizeCanvas() this.fixPosition() if (direct) { this.render() } else { this.render() } }, /** * 显示图层 * @function L.zondy.MapvLayer.prototype.show */ show() { this._visiable() }, /** * 隐藏图层 * @function L.zondy.MapvLayer.prototype.hide */ hide() { this._unvisiable() }, /** * 销毁图层 * @function L.zondy.MapvLayer.prototype.destroy */ destroy() { L.DomUtil.remove(this._container) this.unbindEvent() this.disposeFlag = true }, /** * 更新图层 * @function L.zondy.MapvLayer.prototype.update * @param opt.data - {Array} 需要更新的数据 * @param opt.options - {Object} 需要更新的样式 */ update(opt) { if (opt === undefined) { return } this.mapvBaseLayer.updateData(opt.data, opt.options) }, /** * @function L.zondy.MapvLayer.prototype.removeData * @param filter - {Function} 过滤函数,返回true的保留 * @description 移除满足过滤条件的数据 * @example * filter: function(item){ if (item.count > 10 &amp;&amp; item.count &lt; 50) { return true; } else { return false; } } */ removeData(filter) { if (this.mapvBaseLayer) { this.mapvBaseLayer.removeData(filter) } }, /** * @function L.zondy.MapvLayer.prototype.removeAllData * @description 移除全部数据 */ removeAllData() {}, onResize() {}, render() { this.mapvBaseLayer._canvasUpdate() } }) const MapvLayer = function (dataSet, mapVOptions, options) { return new MapvLayerConstruct(dataSet, mapVOptions, options) } export default MapvLayer </code></pre> </article> </section> </div> <footer class="footer"> <div class="content has-text-centered"> <p>文档生成<a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.11</a></p> <p class="sidebar-created-by"> <a href="http://www.smaryun.com" target="_blank">司马云</a> <span>© 2023 云生态圈</span> <a href="http://192.168.82.89:8086/#/index" target="_blank">MapGIS Client for JavaScript</a> </p> </div> </footer> </div> <div id="side-nav" class="side-nav"> <div style="margin-bottom: 10px;"> <img style="vertical-align: middle;margin-right: 10px;width: 30px;" src="./styles/anchor.png"/><a href="#page-title">构造函数</a> </div> <div style="margin-bottom: 10px;"> <img style="vertical-align: middle;margin-right: 10px;width: 30px;" src="./styles/anchor.png"/><a href="#member">成员变量</a> </div> <div style="margin-bottom: 10px;"> <img style="vertical-align: middle;margin-right: 10px;width: 30px;" src="./styles/anchor.png"/><a href="#function">方法</a> </div> <div> <img style="vertical-align: middle;margin-right: 10px;width: 30px;" src="./styles/anchor.png"/><a href="#event">事件</a> </div> </div> </div> <script src="scripts/linenumber.js"> </script> <script src="scripts/search.js"> </script> </body> </html>