UNPKG

@mapgis/webclient-leaflet-plugin

Version:

530 lines (475 loc) 18.5 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> Widget/Draw/DrawControl.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">Widget/Draw/DrawControl.js</span> </header> <section> <article> <pre class="prettyprint source linenums"><code>import { Zondy, defaultValue, Feature } from '@mapgis/webclient-common' import Widget from '../Widget' import { Circle, LineString, Polygon, Point } from '@mapgis/webclient-common' /** * 绘制工具 * @class DrawControl * @moduleEX ViewModule * @extends Widget * @param {Object} options 构造参数 * @param {complete} [options.complete] 绘制完成后的回调函数 * @example &lt;caption>&lt;h7>初始化绘制工具&lt;/h7>&lt;/caption> * // ES5引入方式 * const { Map, MapView } = Zondy * const { DrawControl } = Zondy.Widget * // ES6引入方式 * import { Map, MapView, DrawControl } from "@mapgis/webclient-leaflet-plugin" * // 初始化图层管理容器 * const map = new Map(); * // 初始化地图视图对象 * const mapView = new MapView({ * // 视图id * viewId: "viewer-id", * // 图层管理容器 * map: map * }); * // 初始化绘制控件 * const drawControl = new DrawControl({ * view: mapView, * visible: true, * complete: function (type, feature) { * console.log("绘制类型:", type, ",绘制完成:", feature); * featureLayer.add(feature); * } * }) * // 开始绘制 * drawControl.start('lineString', {}) * * @example &lt;caption>&lt;h7>通过控件进行绘制&lt;/h7>&lt;/caption> * // ES5引入方式 * const { Map, MapView } = Zondy * const { DrawControl } = Zondy.Widget * // ES6引入方式 * import { Map, MapView, DrawControl } from "@mapgis/webclient-leaflet-plugin" * // 初始化图层管理容器 * const map = new Map(); * // 初始化地图视图对象 * const mapView = new MapView({ * // 视图id * viewId: "viewer-id", * // 图层管理容器 * map: map * }); * // 初始化绘制控件 * const drawControl = new DrawControl({ * view: mapView, * visible: true, * complete: function (type, feature) { * console.log("绘制类型:", type, ",绘制完成:", feature); * featureLayer.add(feature); * } * }) * // 添加控件 * mapView.ui.add(drawControl) */ /** * 绘制完成的回调函数 * @callback complete * @param {Object} result 回调参数 * @param {String} [result.type] 几何类型 * @param {Feature} [result.feature] 绘制完成后返回的要素对象 * @param {Object} [result.drawConfig] 绘制配置 */ class DrawControl extends Widget { constructor(options) { super(options) options = defaultValue(options, {}) this.drawConfig = defaultValue(options.drawConfig, { polygon: { allowIntersection: false, showArea: true }, circlemarker: false }) this._complete = defaultValue(options.complete, function () {}) this._drawHandler = null this._drawTool = null this._initHandler() this._initStyles() } _initHandler() { const mapView = this._view.getInnerView() this._processEvent = this._processEvent.bind(this) if (mapView) { mapView.on(L.Draw.Event.CREATED, this._processEvent) } } _initStyles() { this.styles = { circle: { shapeOptions: { stroke: true, color: '#3388ff', weight: 4, opacity: 0.5, fill: true, fillColor: null, // same as color by default fillOpacity: 0.2, clickable: true }, showRadius: true, metric: true, // Whether to use the metric measurement system or imperial feet: true, // When not metric, use feet instead of yards for display nautic: false // When not metric, not feet use nautic mile for display }, marker: { icon: new L.Icon.Default(), repeatMode: false, zIndexOffset: 2000 // This should be > than the highest z-index any markers }, polygon: { showArea: false, showLength: false, shapeOptions: { stroke: true, color: '#3388ff', weight: 4, opacity: 0.5, fill: true, fillColor: null, // same as color by default fillOpacity: 0.2, clickable: true }, // Whether to use the metric measurement system (truthy) or not (falsy). // Also defines the units to use for the metric system as an array of // strings (e.g. `['ha', 'm']`). metric: true, feet: true, // When not metric, to use feet instead of yards for display. nautic: false, // When not metric, not feet use nautic mile for display // Defines the precision for each type of unit (e.g. {km: 2, ft: 0} precision: {} }, polyline: { allowIntersection: true, repeatMode: false, drawError: { color: '#b00b00', timeout: 2500 }, guidelineDistance: 20, maxGuideLineLength: 4000, shapeOptions: { stroke: true, color: '#3388ff', weight: 4, opacity: 0.5, fill: false, clickable: true }, metric: true, // Whether to use the metric measurement system or imperial feet: true, // When not metric, to use feet instead of yards for display. nautic: false, // When not metric, not feet use nautic mile for display showLength: true, // Whether to display distance in the tooltip zIndexOffset: 2000, // This should be > than the highest z-index any map layers factor: 1, // To change distance calculation maxPoints: 0 // Once this number of points are placed, finish shape }, rectangle: { shapeOptions: { stroke: true, color: '#3388ff', weight: 4, opacity: 0.5, fill: true, fillColor: null, // same as color by default fillOpacity: 0.2, clickable: true }, showArea: true, // Whether to show the area in the tooltip metric: true // Whether to use the metric measurement system or imperial } } } _removeHandler() { const mapView = this._view.getInnerView() if (mapView) { mapView.off(L.Draw.Event.CREATED, this._processEvent) } } _processEvent(event) { if (event &amp;&amp; event.layer) { // 查询几何类型 let type, feature const geoJSON = event.layer.toGeoJSON() type = geoJSON.geometry.type switch (type) { case 'LineString': feature = new Feature({ geometry: new LineString({ coordinates: geoJSON.geometry.coordinates }) }) break case 'Polygon': feature = new Feature({ geometry: new Polygon({ coordinates: geoJSON.geometry.coordinates }) }) break case 'Point': let geometry if (event.layer._mRadius) { geometry = new Circle({ center: [ geoJSON.geometry.coordinates[0], geoJSON.geometry.coordinates[1] ], radius: event.layer._mRadius }) } else if (event.layer._radius) { geometry = new Circle({ center: [ geoJSON.geometry.coordinates[0], geoJSON.geometry.coordinates[1] ], radius: event.layer._radius }) } else { geometry = new Point({ coordinates: geoJSON.geometry.coordinates }) } feature = new Feature({ geometry: geometry }) break } this._complete(type, feature) } } _addView() { super._addView() const mapView = this._view.getInnerView() if (mapView &amp;&amp; this._visible) { // 添加绘制控件 const drawnItems = L.featureGroup().addTo(mapView) this._drawTool = new L.Control.Draw({ edit: { featureGroup: drawnItems, poly: { allowIntersection: false } }, draw: this.drawConfig }) mapView.addControl(this._drawTool) } } _removeView() { super._removeView() const mapView = this._view.getInnerView() if (mapView &amp;&amp; this._visible) { this._removeHandler() if (this._drawTool) { mapView.removeControl(this._drawTool) this._print = null } } } /** * @description 开始绘制 * @param {String} type 绘制类型,lineString,polygon,rectangle,marker,circle * @param drawOptions 绘制参数 */ start(type, drawOptions) { const mapView = this._view.getInnerView() if (!mapView) return if (this._drawHandler) { this._drawHandler.disable() } switch (type) { case 'lineString': { this._drawHandler = new L.Draw.Polyline(mapView, { ...this.styles['polyline'], ...drawOptions }) this._drawHandler.enable() break } case 'polygon': { this._drawHandler = new L.Draw.Polygon(mapView, { ...this.styles['polygon'], ...drawOptions }) this._drawHandler.enable() break } case 'rectangle': { this._drawHandler = new L.Draw.Rectangle(mapView, { ...this.styles['rectangle'], ...drawOptions }) this._drawHandler.enable() break } case 'marker': { this._drawHandler = new L.Draw.Marker(mapView, { ...this.styles['marker'], ...drawOptions }) this._drawHandler.enable() break } case 'circle': { this._drawHandler = new L.Draw.Circle(mapView, { ...this.styles['circle'], ...drawOptions }) this._drawHandler.enable() break } } } /** * @description 结束绘制 */ end() { if (this._drawHandler) { this._drawHandler.disable() this._drawHandler = null } } /** * @description 销毁控件 */ destory() {} } Zondy.Widget.DrawControl = DrawControl export default DrawControl </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>