UNPKG

@mapgis/webclient-leaflet-plugin

Version:

488 lines (415 loc) 19.6 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> document/theme/GeoFeatureThemeLayer.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">document/theme/GeoFeatureThemeLayer.js</span> </header> <section> <article> <pre class="prettyprint source linenums"><code>import { Zondy, FeatureSet, Extent } from '@mapgis/webclient-common' import * as L from '@mapgis/leaflet' // eslint-disable-next-line import/no-extraneous-dependencies import { ShapeFactory, ThemeVector } from '@mapgis/webclient-graphic-render' import ThemeLayer from './ThemeLayer' /** * @class Zondy.ThemeLayer.GeoFeatureThemeLayer * @classdesc 地理几何专题要素型专题图层基类。此类型专题图的专题要素形状就是由 feature.geometry 决定。此类不建议直接实例化调用。 * @extends Zondy.ThemeLayer.ThemeLayer * @param {string} name - 专题图名。 * @param {Object} options - 需要设置的参数对象。 * @param {string} [options.id] - 专题图层 ID。默认使用 CommonUtil.createUniqueID("themeLayer_") 创建专题图层 ID。 * @param {number} [options.opacity=1] - 图层透明度。 * @param {number} [options.nodesClipPixel=2] - 节点抽稀像素距离。 * @param {boolean} [options.isHoverAble=false] - 图形是否在 hover 时高亮。 * @param {boolean} [options.isMultiHover=false] - 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面)。 * @param {boolean} [options.isClickAble=true] - 图形是否可点击。 * @param {boolean} [options.isAllowFeatureStyle=false] - 是否允许 feature 样式(style) 中的有效属性应用到专题图层。禁止对专题要素使用数据(feature)的 style。此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 * @fires Zondy.ThemeLayer.GeoFeatureThemeLayer#beforefeaturesadded */ const GeoFeatureThemeLayer = ThemeLayer.extend({ options: { // {Number} 节点抽稀像素距离,默认值 2。 nodesClipPixel: 2, // {Boolean} 图形是否在 hover 时高亮 ,默认值:false。 isHoverAble: false, // {Boolean} 是否多图形同时高亮,用于高亮同一个数据对应的所有图形(如:多面),默认值:false。 isMultiHover: false, // {Boolean} 图形是否可点击,默认 true isClickAble: true, // 是否允许 feature 样式(style) 中的有效属性应用到专题图层。 // 默认值为: false,禁止对专题要素使用数据(feature)的 style。 // 此属性可强制将数据 feature 的 style 中有效属性应用到专题要素上,且拥有比图层 style 和 styleGroups 更高的优先级,使专题要素的样式脱离专题图层的控制。可以通过此方式实现对特殊数据(feature) 对应专题要素赋予独立 style。 isAllowFeatureStyle: false }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.initialize * @description 初始化。 * @param {string} name - 专题图名。 * @param {Object} options - 需要设置的参数对象。 */ initialize(name, options) { ThemeLayer.prototype.initialize.call(this, name, options) L.Util.setOptions(this, options) const me = this me.cache = {} me.cacheFields = [] me.style = {} me.highlightStyle = {} }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.addFeatures * @description 向专题图图层中添加数据。 * @param {Object} features - 待填加的要素。 */ addFeatures(features) { const me = this /** * @event Zondy.ThemeLayer.GeoFeatureThemeLayer#beforefeaturesadded * @description 向专题图图层中添加数据之前触发。 * @property {Object} features - 事件对象。 */ me.fire('beforefeaturesadded', { features }) if (features instanceof FeatureSet) { const attrs = null const attstruct = features.AttStruct const feaArr = features.SFEleArray if (feaArr !== null &amp;&amp; feaArr.length > 0) { for (let j = 0; j &lt; feaArr.length; j++) { const feature = feaArr[j] if (feature.AttValue !== null &amp;&amp; feature.AttValue.length > 0) { const attrs = {} for (let i = 0; i &lt; feature.AttValue.length; i++) { attrs[attstruct.FldName[i]] = feature.AttValue[i] } attrs['FID'] = feature.FID } feature.attributes = attrs me.features.push(feature) } } } if (!me.isCustomSetMaxCacheCount) { me.maxCacheCount = me.features.length * 5 } if (!me.renderer) { return } // 绘制专题要素 if (me._map) { me.redrawThematicFeatures(me._map.getBounds()) } else { me.redrawThematicFeatures() } }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.removeFeatures * @description 从专题图中删除 feature。这个函数删除所有传递进来的矢量要素。参数中的 features 数组中的每一项,必须是已经添加到当前图层中的 feature。 * @param {Object} features - 要删除的要素。 */ removeFeatures(features) { // eslint-disable-line no-unused-vars this.clearCache() ThemeLayer.prototype.removeFeatures.call(this, arguments) }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.removeAllFeatures * @description 清除当前图层所有的矢量要素。 */ removeAllFeatures() { this.clearCache() ThemeLayer.prototype.removeAllFeatures.call(this, arguments) }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.redrawThematicFeatures * @description 重绘所有专题要素。 * 此方法包含绘制专题要素的所有步骤,包含用户数据到专题要素的转换,抽稀,缓存等步骤。 * 地图漫游时调用此方法进行图层刷新。 * @param {L.bounds} bounds - 重绘的范围。 */ redrawThematicFeatures(bounds) { const me = this // 获取高亮专题要素对应的用户 id const hoverone = me.renderer.getHoverOne() let hoverFid = null if (hoverone &amp;&amp; hoverone.refDataID) { hoverFid = hoverone.refDataID } if (bounds &amp;&amp; bounds instanceof L.LatLngBounds) { const crs = this._map.options.crs bounds = L.bounds( crs.project(bounds.getSouthWest()), crs.project(bounds.getNorthEast()) ) bounds = new Extent( bounds.min.x, bounds.min.y, bounds.max.x, bounds.max.y ) } // 清除当前所有可视元素 me.renderer.clearAll() const features = me.features const cache = me.cache const cacheFields = me.cacheFields const cmZoom = me._map.getZoom() const maxCC = me.maxCacheCount for (let i = 0, len = features.length; i &lt; len; i++) { const feature = features[i] const feaBounds = feature.bound // 剔除当前视图(地理)范围以外的数据 if (bounds &amp;&amp; !bounds.intersectsBounds(feaBounds)) { continue } // 缓存字段 const fields = `${feature.FID}_zoom_${cmZoom.toString()}` if (cache[fields]) { cache[fields].updateAndAddShapes() continue } const thematicFeature = me.createThematicFeature(features[i]) // 检查 thematicFeature 是否有可视化图形 if (thematicFeature.getShapesCount() &lt; 1) { continue } // 加入缓存 cache[fields] = thematicFeature cacheFields.push(fields) // 缓存数量限制 if (cacheFields.length > maxCC) { const fieldsTemp = cacheFields[0] cacheFields.splice(0, 1) delete cache[fieldsTemp] } } me.renderer.render() // 地图漫游后,重新高亮图形 if (hoverFid &amp;&amp; me.options.isHoverAble &amp;&amp; me.options.isMultiHover) { const hShapes = this.getShapesByFeatureID(hoverFid) this.renderer.updateHoverShapes(hShapes) } }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.createThematicFeature * @description 创建专题要素。 * @param {Object} feature - 要创建的要素。 */ createThematicFeature(feature) { const me = this const style = me.getStyleByData(feature) // 创建专题要素时的可选参数 const options = {} options.nodesClipPixel = me.options.nodesClipPixel options.isHoverAble = me.options.isHoverAble options.isMultiHover = me.options.isMultiHover options.isClickAble = me.options.isClickAble options.highlightStyle = ShapeFactory.transformStyle(me.highlightStyle) // 将数据转为专题要素(Vector) const thematicFeature = new ThemeVector( feature, me, ShapeFactory.transformStyle(style), options ) // 直接添加图形到渲染器 for (let m = 0; m &lt; thematicFeature.shapes.length; m++) { me.renderer.addShape(thematicFeature.shapes[m]) } return thematicFeature }, getStyleByData(feat) { // 子类必须实现此方法 }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.redraw * @description 重绘该图层。 */ redraw() { this.clearCache() return ThemeLayer.prototype.redraw.apply(this, arguments) }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.clearCache * @description 清除缓存数据。 */ clearCache() { this.cache = {} this.cacheFields = [] }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.clear * @description 清除的内容包括数据(features) 、专题要素、缓存。 */ clear() { const me = this me.renderer.clearAll() me.renderer.refresh() me.removeAllFeatures() me.clearCache() }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.getCacheCount * @description 获取当前缓存数量。 * @returns {number} 返回当前缓存数量。 */ getCacheCount() { return this.cacheFields.length }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.setMaxCacheCount * @description 设置最大缓存数量。 * @param {number} cacheCount - 最大缓存量。 */ setMaxCacheCount(cacheCount) { if (isNaN(cacheCount)) { return } this.maxCacheCount = cacheCount this.isCustomSetMaxCacheCount = true }, /** * @function Zondy.ThemeLayer.GeoFeatureThemeLayer.prototype.getShapesByFeatureID * @description 通过 FeatureID 获取 feature 关联的所有图形。如果不传入此参数,函数将返回所有图形。 * @param {number} featureID - 要素 ID。 */ getShapesByFeatureID(featureID) { const me = this const list = [] const shapeList = me.renderer.getAllShapes() if (!featureID) { return shapeList } for (let i = 0, len = shapeList.length; i &lt; len; i++) { const si = shapeList[i] if (si.refDataID &amp;&amp; featureID === si.refDataID) { list.push(si) } } return list } }) Zondy.ThemeLayer.GeoFeatureThemeLayer = GeoFeatureThemeLayer export default GeoFeatureThemeLayer </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>