UNPKG

@mapgis/webclient-leaflet-plugin

Version:

467 lines (408 loc) 16.4 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> util/convertFeatureToLeafletGraphicUtil.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">util/convertFeatureToLeafletGraphicUtil.js</span> </header> <section> <article> <pre class="prettyprint source linenums"><code>// 要素转leaflet图元 import { Log, GeometryType, SymbolType, Feature, SimpleMarkerSymbol } from '@mapgis/webclient-common' import * as L from '@mapgis/leaflet' import ConvertGeometryUtil from './ConvertGeometryUtil' import ConvertSymbolUtil from './ConvertSymbolUtil' import LeafletPlugin from './LeafletPlugin' const toLeafletCoords = ConvertGeometryUtil.toLeafletCoords const toLeafletStyle = ConvertSymbolUtil.convertSymboltoLeafletStyle /** * @description 根据类型创建marker * @public * @param {*} type * @param {*} coords * @param {*} style * @return {*} */ function createGraphic(symbolType, coords, style) { let graphic switch (symbolType) { case SymbolType.simpleMarker: { graphic = new L.ShapeMarker(coords, style) break } case SymbolType.pictureMarker: { graphic = L.marker(coords, style) break } case SymbolType.line: { graphic = L.polyline(coords, style) break } case SymbolType.text: { graphic = L.marker(coords, style) break } case SymbolType.fill: { graphic = L.polygon(coords, style) break } case SymbolType.pictureFill: { graphic = L.polygon(coords, style) break } default: { Log.error('符号类型错误,不合法的符号类型') } } return graphic } function convertPointToGraphic(feature) { const coords = toLeafletCoords(feature.geometry) const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type return createGraphic(symbolType, coords[0], style) } function convertMultiPointToGraphic(feature) { const coords = toLeafletCoords(feature.geometry) const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type const layers = [] coords.forEach((coord) => { const marker = createGraphic(symbolType, coord, style) layers.push(marker) }) return new L.FeatureGroup(layers) } function convertPolylineMarker(marker, width, coordinates) { const layers = [] if (marker) { const { color, style, placement } = marker const markerDetail = LeafletPlugin.calcLineMarkerDetail(coordinates) const { angle1, angle2, latlng1, latlng2 } = markerDetail const leafletStyle = toLeafletStyle( new SimpleMarkerSymbol({ angle: angle1, color, outline: { color, width }, style, size: Math.max(15, 4 * width) }) ) const p1 = createGraphic(SymbolType.simpleMarker, latlng1, leafletStyle) const p2 = createGraphic( SymbolType.simpleMarker, latlng2, toLeafletStyle( new SimpleMarkerSymbol({ angle: angle2, color, outline: { color, width }, style, size: Math.max(15, 4 * width) }) ) ) if (placement === 'begin') { layers.push(p1) } else if (placement === 'end') { layers.push(p2) } else { layers.push(p1) layers.push(p2) } } return layers } function updatePolylineMarkers(feature, graphic) { if (graphic['__marker__group']) { graphic.removeLayer(graphic['__marker__group']) } const width = feature.symbol.width const marker = feature.symbol.marker const layers = convertPolylineMarker( marker, width, feature.geometry.coordinates ) const markerGroup = new L.FeatureGroup(layers) graphic['__marker__group'] = markerGroup graphic.addLayer(markerGroup) } function updateMultiPolylineMarkers(feature, graphic) { if (graphic['__marker__group']) { graphic.removeLayer(graphic['__marker__group']) } const width = feature.symbol.width const marker = feature.symbol.marker let layers = [] feature.geometry.coordinates.forEach((coords) => { const v = convertPolylineMarker(marker, width, coords) layers = layers.concat(v) }) const markerGroup = new L.FeatureGroup(layers) graphic['__marker__group'] = markerGroup graphic.addLayer(markerGroup) } function convertPolylineToGraphic(feature) { const coords = toLeafletCoords(feature.geometry, { additional: feature.additional }) const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type const featureGroup = new L.FeatureGroup() const lineGraphic = createGraphic(symbolType, coords, style) featureGroup['__line__graphic'] = lineGraphic featureGroup.addLayer(lineGraphic) // 转换线首尾角marker if (feature.symbol.marker) { updatePolylineMarkers(feature, featureGroup) } return featureGroup } function convertMultiLineStringToGraphic(feature) { const coords = toLeafletCoords(feature.geometry, { additional: feature.additional }) const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type const featureGroup = new L.FeatureGroup() const lineGraphic = createGraphic(symbolType, coords, style) featureGroup['__line__graphic'] = lineGraphic featureGroup.addLayer(lineGraphic) // 转换线首尾角marker if (feature.symbol.marker) { updateMultiPolylineMarkers(feature, featureGroup) } return featureGroup } function getAreaCoords(symbolType, geometry, feature) { let coords // 如果类型为点,则重新设置几何 if ( SymbolType.simpleMarker === symbolType || SymbolType.text === symbolType || SymbolType.pictureMarker === symbolType ) { coords = LeafletPlugin.getAreaCenter(geometry) } else { coords = toLeafletCoords(geometry, { additional: feature.additional }) } return coords } function convertPolygonToGraphic(feature) { const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type const coords = getAreaCoords(symbolType, feature.geometry, feature) return createGraphic(symbolType, coords, style) } function convertCircleToGraphic(feature) { const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type const coords = getAreaCoords( symbolType, feature.geometry.toPolygon(), feature ) return createGraphic(symbolType, coords, style) } function convertExtentToGraphic(feature) { const style = toLeafletStyle(feature.symbol) const symbolType = feature.symbol.type const coords = getAreaCoords(symbolType, feature.geometry, feature) if (symbolType !== SymbolType.simpleFill) { return createGraphic(symbolType, coords, style) } return L.rectangle(coords, style) } /** * @description 转换要素为几何图形 * @public * @param {Feature} feature * @return {*} */ function convertFeature(feature) { let graphic = null if (!(feature instanceof Feature)) return graphic if (!feature.geometry) { Log.error('几何不存在') return graphic } switch (feature.geometry.type) { case GeometryType.point: { graphic = convertPointToGraphic(feature) break } case GeometryType.lineString: { graphic = convertPolylineToGraphic(feature) break } case GeometryType.multiPolygon: case GeometryType.polygon: { graphic = convertPolygonToGraphic(feature) break } case GeometryType.extent: { graphic = convertExtentToGraphic(feature) break } case GeometryType.circle: { graphic = convertCircleToGraphic(feature) break } case GeometryType.multiPoint: { graphic = convertMultiPointToGraphic(feature) break } case GeometryType.multiLineString: { graphic = convertMultiLineStringToGraphic(feature) break } default: { break } } return graphic } export { convertFeature, createGraphic, updatePolylineMarkers, updateMultiPolylineMarkers, getAreaCoords } </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>