UNPKG

@ciniki/iclient-maplibregl

Version:

@supermapgis/iclient-maplibregl 是一套基于 Maplibre GL 的云 GIS 网络客户端开发平台, 支持访问 SuperMap iServer / iEdge / iPortal / iManager / Online 的地图、服务和资源,为用户提供了完整专业的 GIS 能力, 同时提供了优秀的可视化功能。

147 lines (139 loc) 10.2 kB
/* Copyright© 2000 - 2025 SuperMap Software Co.Ltd. All rights reserved. * This program are made available under the terms of the Apache License, Version 2.0 * which accompanies this distribution and is available at http://www.apache.org/licenses/LICENSE-2.0.html.*/ import { DeckglLayerBase } from '@ciniki/iclient-common/overlay/deckgl/DeckglLayerBase'; import maplibregl from 'maplibre-gl'; /** * @class DeckglLayer * @category Visualization DeckGL * @classdesc Deckgl 高效率图层类。该图层为综合图层,通过该图层可创建:高效率点图层、路径图层(线图层)、高效率面图层、曲线图层、 * 正六边形图层(蜂巢图层)、网格图层,只需给定相依配置,因此,在创建图层之前,请仔细阅读参数配置。 * @version 11.1.0 * @modulecategory Overlay * @param {string} layerTypeID - 高效率图层类型 ID,包括 "scatter-plot" 高效率点图层、"path-layer" 路径图层(线图层)、 * "polygon-layer" 高效率面图层、"arc-layer" 曲线图层、"hexagon-layer" 正六边形图层(蜂巢图层)、"screen-grid-layer" 网格图层。 * * @param {Object} options - 图层配置项,包括以下参数: * @param {Object} [options.layerId] - DeckglLayer 图层 Dom 元素 ID。默认使用 CommonUtil.createUniqueID("graphicLayer_" + this.layerTypeID + "_") 创建专题图层 ID。 * @param {Array.<GeoJSONObject>} options.data - 图层数据,支持 GeoJSON 规范数据类型。 * @param {Object} options.callback - deckgl 图层回调函数配置项。 * @param {Object} options.props - deckgl 图层配置项,在该参数下配置图层配置项: * @param {number} [options.props.opacity=1] - 公共配置项:图层不透明度度。 * @param {boolean} [options.props.pickable=false] - 公共配置项:是否响应鼠标事件(鼠标点击,鼠标滑动)。 * @param {function} [options.props.autoHighlight=false] - 公共配置项:鼠标滑动高亮要素。 * @param {function} [options.props.highlightColor=[0, 0, 128, 128]] - 公共配置项:鼠标滑动高亮颜色。 * @param {function} [options.props.onClick] - 公共配置项:鼠标点击事件。 * @param {function} [options.props.onHover] - 公共配置项:鼠标滑动事件。 * @param {number} [options.props.radiusScale=1] - "scatter-plot" 配置项:散点半径比例。 * @param {boolean} [options.props.outline=false] - "scatter-plot" 配置项:是否边线显示。 * @param {number} [options.props.strokeWidth=1] - "scatter-plot" 配置项:边线宽度。 * @param {number} [options.props.radiusMinPixels=0] - "scatter-plot" 配置项:半径最小像素值。 * @param {number} [options.props.radiusMaxPixels=Number.MAX_SAFE_INTEGER] - "scatter-plot" 配置项:半径最大像素值。 * @param {boolean} [options.props.fp64=false] - "scatter-plot" 配置项:是否应以高精度 64 位模式呈现图层。 * @param {number} [options.props.widthScale=1] - "path-layer" 配置项:线宽比例。 * @param {number} [options.props.widthMinPixels=0] - "path-layer" 配置项:线宽最小像素值。 * @param {number} [options.props.widthMaxPixels=Number.MAX_SAFE_INTEGER] - "path-layer" 配置项:线宽最大像素值。 * @param {boolean} [options.props.rounded=false] - "path-layer" 配置项:节点是否绘制为弧形。 * @param {number} [options.props.miterLimit=4] - "path-layer" 配置项:节点相对于线宽的最大范围,仅在 rounded 为 false 时有效; * @param {boolean} [options.props.fp64=false] - "path-layer" 配置项:是否应以高精度 64 位模式呈现图层。 * @param {boolean} [options.props.dashJustified=false] - "path-layer" 配置项:是否虚线形式显示,仅在 getDashArray() 回调函数被指定时有效。 * @param {boolean} [options.props.filled=true] - "polygon-layer" 配置项:是否填充面。 * @param {boolean} [options.props.stroked=true] - "polygon-layer" 配置项:是否绘制边线。 * @param {boolean} [options.props.extruded=false] - "polygon-layer" 配置项:是否拉伸建筑。 * @param {boolean} [options.props.wireframe=false] - "polygon-layer" 配置项:当面被拉伸为建筑时,是否描绘建筑物边线。 * @param {boolean} [options.props.elevationScale=1] - "polygon-layer" 配置项:海拔比例。 * @param {boolean} [options.props.lineWidthScale=1] - "polygon-layer" 配置项:线宽比例。 * @param {boolean} [options.props.lineWidthMinPixels=0] - "polygon-layer" 配置项:线宽最小像素值。 * @param {boolean} [options.props.lineWidthMaxPixels=Number.MAX_SAFE_INTEGER] - "polygon-layer" 配置项:线宽最大像素值。 * @param {boolean} [options.props.lineJointRounded=false] - "polygon-layer" 配置项:节点是否绘制为弧形。 * @param {boolean} [options.props.lineMiterLimit=4] - "polygon-layer" 配置项:节点相对于线宽的最大范围,仅在 lineJointRounded 为 false 时有效。 * @param {boolean} [options.props.lineDashJustified=false] - "polygon-layer" 配置项:是否虚线形式显示,仅在 getLineDashArray() 回调函数被指定时有效。 * @param {boolean} [options.props.fp64=false] - "polygon-layer" 配置项:是否应以高精度 64 位模式呈现图层。 * @param {boolean} [options.props.fp64=false] - "arc-layer" 配置项:是否应以高精度 64 位模式呈现图层。 * @param {boolean} [options.props.strokeWidth=1] - "arc-layer" 配置项:线宽。 * @param {boolean} [options.props.radius=1000] - "hexagon-layer" 配置项:六边形半径值。 * @param {boolean} [options.props.extruded=false] - "hexagon-layer" 配置项:是否拉伸要素。 * @param {boolean} [options.props.upperPercentile=100] - "hexagon-layer" 配置项:筛选并通过 upperPercentile 重新计算颜色。颜色值大于 upperPercentile 的六边形将被隐藏。 * @param {boolean} [options.props.elevationScale=1] - "hexagon-layer" 配置项:高程乘数,实际海拔高度由 elevationScale * getElevation(d)计算。elevationScale 是一个方便的属性,可以在不更新数据的情况下缩放所有六边形。 * @param {boolean} [options.props.colorDomain=false] - "hexagon-layer" 配置项:色阶。 * @param {boolean} [options.props.colorRange=[[255,255,178,255],[254,217,118,255],[254,178,76,255],[253,141,60,255],[240,59,32,255],[189,0,38,255]]] - "hexagon-layer" 配置项:色带。 * @param {number} [options.props.coverage=1] - "hexagon-layer" 配置项:六边形半径乘数,介于 0 - 1 之间。六边形的最终半径通过覆盖半径计算。注意:覆盖范围不会影响分数的分配方式。分配方式的半径仅由半径属性确定; * @param {function} options.props.hexagonAggregator - "hexagon-layer" 配置项:六边形聚合函数。 * @param {Object} options.props.lightSettings - 光照配置项。 * @param {Array} options.props.lightSettings.lightsPosition - 光照配置项:指定为`[x,y,z]`的光在平面阵列中的位置`,在一个平面阵列。长度应该是 `3 x numberOfLights`。 * @param {Array} options.props.lightSettings.lightsStrength - 光照配置项:平面阵列中指定为`[x,y]`的光的强度。长度应该是`2 x numberOfLights`。 * @param {number} [options.props.lightSettings.numberOfLights=1] - 光照配置项:光照值,最大值为 5。 * @param {number} [options.props.lightSettings.coordinateSystem=COORDINATE_SYSTEM.LNGLAT] - 光照配置项:指定灯位置的坐标系。 * @param {number} [options.props.lightSettings.coordinateOrigin=[0, 0, 0]] - 光照配置项:指定灯位置的坐标原点。 * @param {number} [options.props.lightSettings.modelMatrix] - 光照配置项:光位置的变换矩阵。 * @param {number} [options.props.lightSettings.ambientRatio=0.4] - 光照配置项:光照的环境比例。 * @param {number} [options.props.lightSettings.diffuseRatio=0.6] - 光照配置项:光的漫反射率。 * @param {number} [options.props.lightSettings.specularRatio=0.8] - 光照配置项:光的镜面反射率。 * @extends {DeckglLayerBase} * @usage */ export class DeckglLayer extends DeckglLayerBase { constructor(layerTypeID, options) { super(layerTypeID, options); this.type='custom'; this.renderingMode = '3d'; this.overlay = true; } /** * @function DeckglLayer.prototype.onAdd * @param {maplibregl.Map} map - MapLibreGL Map 对象。 */ onAdd(map) { this.map = map; if (this.canvas) { this.mapContainer = this.map.getCanvasContainer(); return this; } if (this._isEPSG3857()) { this.coordinateSystem = 3; this.isGeographicCoordinateSystem = true; } else { this.coordinateSystem = 1; this.isGeographicCoordinateSystem = false; } //创建图层容器 this._initContainer(this.map.getCanvasContainer(), this.map.getCanvas()); //创建 deckgl 图层 this._createLayerByLayerTypeID(); var mapState = this._getState(); let deckOptions = {}; for (let key in mapState) { deckOptions[key] = mapState[key]; } deckOptions.layers = [this.layer]; deckOptions.canvas = this.canvas; this.deckGL = new window.DeckGL.experimental.DeckGLJS(deckOptions); this._draw(); } /** * @function DeckglLayer.prototype.onRemove */ onRemove() { this.map.getCanvasContainer().removeChild(this.canvas); this.clear(); } getMapInfo() { let center = this.map.getCenter(); let zoom = this.map.getZoom(); let maxZoom = this.map.getMaxZoom(); let pitch = this.map.getPitch(); let bearing = this.map.getBearing(); let longitude = center.lng; let latitude = center.lat; return { center, zoom, maxZoom, pitch, bearing, longitude, latitude }; } /** * @function DeckglLayer.prototype.render */ render() { this._draw(); } _isEPSG3857() { return this.map.getCRS && this.map.getCRS() !== maplibregl.CRS.EPSG3857 } }