@mapgis/webclient-leaflet-plugin
Version:
389 lines (338 loc) • 14.6 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title> document/IGSVectorTileLayerView.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 "@mapgis/webclient-leaflet-plugin" <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">document/IGSVectorTileLayerView.js</span>
</header>
<section>
<article>
<pre class="prettyprint source linenums"><code>import {getZoomOffset, LayerView, proj4} from '@mapgis/webclient-common'
import * as L from '@mapgis/leaflet'
// eslint-disable-next-line import/no-extraneous-dependencies
import { mapboxCustomCRS } from './support/mapbox/mapboxCustomUtil'
// 添加leaflet和mapbox兼容插件
// eslint-disable-next-line import/extensions
import leafletMapbox from './support/mapbox/leafletMapbox.js'
import LeafletPlugin from '../util/LeafletPlugin'
function setLayerOpacity(map, opacity) {
if (!map) return
const canvas = map.getCanvas()
if (canvas) {
canvas.style.opacity = opacity
}
}
function setLayerVisible(layer, style, visible) {
// link https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#layout-line-visibility
layer.sublayers.forEach((sublayer) => {
style.setLayoutProperty(
sublayer.id,
'visibility',
visible ? 'visible' : 'none'
)
})
}
function processStyle(mapboxMap, layerUpdateCotent, layer, innerLayer) {
if (mapboxMap[layerUpdateCotent.name]) {
// eslint-disable-next-line prefer-spread
mapboxMap[layerUpdateCotent.name].apply(mapboxMap, layerUpdateCotent.params)
return
}
switch (layerUpdateCotent.name) {
case 'setPaintProperties': {
const style = mapboxMap.style
const args = layerUpdateCotent.params
// 解析paint style 此参数键值对
const keys = Object.keys(args[1])
const layerId = args[0]
keys.forEach((key) => {
style.setPaintProperty(layerId, key, args[1][key])
})
// 触发更新
if (mapboxMap._update) {
mapboxMap._update(true)
}
break
}
case 'setLayoutProperties': {
const style = mapboxMap.style
const args = layerUpdateCotent.params
// 解析layout style 此参数键值对
const keys = Object.keys(args[1])
const layerId = args[0]
keys.forEach((key) => {
style.setLayoutProperty(layerId, key, args[1][key])
})
// 触发更新
if (mapboxMap._update) {
mapboxMap._update(true)
}
break
}
case 'setStyleLayer': {
mapboxMap.setStyle(layer.style)
break
}
case 'deleteStyleLayer': {
mapboxMap.setStyle(layer.style)
break
}
case 'setStyleLayerFilter': {
const args = layerUpdateCotent.params
mapboxMap.setFilter(args[0], args[1])
break
}
case 'setStyleLayerZoomRange': {
const args = layerUpdateCotent.params
mapboxMap.setLayerZoomRange(args[0], args[1], args[2])
break
}
case 'opacity': {
const args = layerUpdateCotent.params
// 解析layout style 此参数键值对
const opacity = args[0]
setLayerOpacity(mapboxMap, opacity)
// 触发更新
if (mapboxMap._update) {
mapboxMap._update(true)
}
break
}
case 'visible': {
const style = mapboxMap.style
const args = layerUpdateCotent.params
// 解析layout style 此参数键值对
const visible = args[0]
setLayerVisible(layer, style, visible)
// 触发更新
if (mapboxMap._update) {
mapboxMap._update(true)
}
break
}
case 'clippingArea': {
const args = layerUpdateCotent.params
// 解析layout style 此参数键值对
const clippingArea = args[0]
innerLayer.setClippingArea(
LeafletPlugin.convertClippingArea(clippingArea)
)
break
}
default: {
break
}
}
}
function applyVectorTileStyle(mapboxMap, layerUpdateCotent, layer, innerLayer) {
if (layerUpdateCotent) {
if (mapboxMap._loaded) {
processStyle(mapboxMap, layerUpdateCotent, layer, innerLayer)
} else {
mapboxMap.once('load', () => {
processStyle(mapboxMap, layerUpdateCotent, layer, innerLayer)
})
}
}
}
class IGSVectorTileLayerView extends LayerView {
/**
* 添加图层视图
* @param {LayerEvent} 图层事件
* @return {Promise<LayerView>} 图层视图
*/
onAdd(event) {
const layer = this.layer
const innerView = this.innerView
// 获取ZoomOffset
const view = this.view
const viewLod = view.crs.options.lods
const layerLod = layer.tileInfo.lods[0]
const zoomOffset = getZoomOffset(viewLod, layerLod)
const _options = {
style: JSON.parse(JSON.stringify(layer.style)),
noWrap: true,
// 初始化裁剪区
clippingArea: LeafletPlugin.convertClippingArea(layer.clippingArea),
// 偏移级数
zoomOffset
}
if (layer.tokenValue) {
_options.accessToken = layer.tokenValue
}
let mapboxgl
if (typeof module === 'object') {
// eslint-disable-next-line global-require
mapboxgl = require('@mapgis/mapbox-gl')
} else {
mapboxgl = window.mapboxgl
}
// 定义自定义坐标系
mapboxCustomCRS(mapboxgl, proj4)
// 构建L.mapboxGL图层
leafletMapbox(L, mapboxgl)
// 必须设置innerLayer
this.innerLayer = L.mapboxGL(_options).addTo(innerView)
this.innerLayer.commonLayerId = layer.id
const mapboxMap = this.innerLayer.getMapboxMap()
mapboxMap.once('load', () => {
// 初始化透明度和显示隐藏
setLayerVisible(layer, mapboxMap.style, layer._visible)
setLayerOpacity(mapboxMap, layer._opacity)
// 触发更新
if (mapboxMap._update) {
mapboxMap._update(true)
}
})
return Promise.resolve(this)
}
/**
* 移除图层视图
* @param {LayerEvent} 图层事件
* @return {Promise<LayerView>} 图层视图
*/
onRemove(event) {
this.innerView.removeLayer(this.innerLayer)
return Promise.resolve(this)
}
/**
* 更新图层视图
* @param {LayerViewUpdateEvent} 图层事件
* @return {Promise<LayerView>} 图层视图
*/
onUpdate(event) {
const _layer = this.innerLayer
const layer = this.layer
// 更新样式
if (event.updateContent && _layer && _layer.getMapboxMap) {
const mapboxMap = _layer.getMapboxMap()
event.updateContent.forEach((layerUpdateCotent) => {
applyVectorTileStyle(mapboxMap, layerUpdateCotent, layer, _layer)
})
}
return Promise.resolve(this)
}
}
export default IGSVectorTileLayerView
</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>