UNPKG

@mapgis/webclient-leaflet-plugin

Version:

422 lines (355 loc) 16.6 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title> util/extend/map/L.Map.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/extend/map/L.Map.js</span> </header> <section> <article> <pre class="prettyprint source linenums"><code>import * as L from '@mapgis/leaflet' // @link https://github.com/Raruto/leaflet-rotate /** * L.Map */ const mapProto = L.extend({}, L.Map.prototype) L.Map.mergeOptions({ rotate: false, bearing: 0 }) L.Map.include({ initialize(id, options) { // (HTMLElement or String, Object) if (options.rotate) { this._rotate = true this._bearing = 0 } mapProto.initialize.call(this, id, options) if (this.options.rotate) { this.setBearing(this.options.bearing) } }, containerPointToLayerPoint(point) { // (Point) if (!this._rotate) { return mapProto.containerPointToLayerPoint.call(this, point) } return L.point(point) .subtract(this._getMapPanePos()) .rotateFrom(-this._bearing, this._getRotatePanePos()) .subtract(this._getRotatePanePos()) }, getBounds() { if (!this._rotate) { return mapProto.getBounds.call(this) } const size = this.getSize() const topleft = this.layerPointToLatLng( this.containerPointToLayerPoint([0, 0]) ) const topright = this.layerPointToLatLng( this.containerPointToLayerPoint([size.x, 0]) ) const bottomright = this.layerPointToLatLng( this.containerPointToLayerPoint([size.x, size.y]) ) const bottomleft = this.layerPointToLatLng( this.containerPointToLayerPoint([0, size.y]) ) // Use LatLngBounds' build-in constructor that automatically extends the bounds to fit the passed points return new L.LatLngBounds([topleft, topright, bottomright, bottomleft]) }, layerPointToContainerPoint(point) { // (Point) if (!this._rotate) { return mapProto.layerPointToContainerPoint.call(this, point) } return L.point(point) .add(this._getRotatePanePos()) .rotateFrom(this._bearing, this._getRotatePanePos()) .add(this._getMapPanePos()) }, // Rotation methods // setBearing will work with just the 'theta' parameter. setBearing(theta) { if (!L.Browser.any3d || !this._rotate) { return } // 计算旋转容器位置,如果未定义,默认为[0,0] let rotatePanePos = this._getRotatePanePos() const halfSize = this.getSize().divideBy(2) const mapPanePos = this._getMapPanePos() // 计算新的旋转点 this._pivot = mapPanePos.clone().multiplyBy(-1).add(halfSize) // 还原旋转位置 rotatePanePos = rotatePanePos.rotateFrom(-this._bearing, this._pivot) this._bearing = theta * L.DomUtil.DEG_TO_RAD // TODO: mod 360 // 计算新的旋转容器位置 this._rotatePanePos = rotatePanePos.rotateFrom(this._bearing, this._pivot) // 作用旋转容器 L.DomUtil.setPositionBearing( this._rotatePane, rotatePanePos, this._bearing, this._pivot ) this.fire('rotate') }, getBearing() { return this._bearing * L.DomUtil.RAD_TO_DEG }, _initPanes() { const panes = (this._panes = {}) this._paneRenderers = {} // @section // // Panes are DOM elements used to control the ordering of layers on the map. You // can access panes with [`map.getPane`](#map-getpane) or // [`map.getPanes`](#map-getpanes) methods. New panes can be created with the // [`map.createPane`](#map-createpane) method. // // Every map has the following default panes that differ only in zIndex. // // @pane mapPane: HTMLElement = 'auto' // Pane that contains all other map panes this._mapPane = this.createPane('mapPane', this._container) L.DomUtil.setPosition(this._mapPane, new L.Point(0, 0)) if (this._rotate) { this._rotatePane = this.createPane('rotatePane', this._mapPane) this._norotatePane = this.createPane('norotatePane', this._mapPane) // @pane tilePane: HTMLElement = 2 // Pane for tile layers this.createPane('tilePane', this._rotatePane) // @pane overlayPane: HTMLElement = 4 // Pane for overlays like polylines and polygons this.createPane('overlayPane', this._rotatePane) // @pane shadowPane: HTMLElement = 5 // Pane for overlay shadows (e.g. marker shadows) this.createPane('shadowPane', this._norotatePane) // @pane markerPane: HTMLElement = 6 // Pane for marker icons this.createPane('markerPane', this._norotatePane) // @pane tooltipPane: HTMLElement = 650 // Pane for tooltips. this.createPane('tooltipPane', this._norotatePane) // @pane popupPane: HTMLElement = 700 // Pane for popups. this.createPane('popupPane', this._norotatePane) } else { // @pane tilePane: HTMLElement = 2 // Pane for tile layers this.createPane('tilePane') // @pane overlayPane: HTMLElement = 4 // Pane for overlays like polylines and polygons this.createPane('overlayPane') // @pane shadowPane: HTMLElement = 5 // Pane for overlay shadows (e.g. marker shadows) this.createPane('shadowPane') // @pane markerPane: HTMLElement = 6 // Pane for marker icons this.createPane('markerPane') // @pane tooltipPane: HTMLElement = 650 // Pane for tooltips. this.createPane('tooltipPane') // @pane popupPane: HTMLElement = 700 // Pane for popups. this.createPane('popupPane') } if (!this.options.markerZoomAnimation) { L.DomUtil.addClass(panes.markerPane, 'leaflet-zoom-hide') L.DomUtil.addClass(panes.shadowPane, 'leaflet-zoom-hide') } }, // @method rotatedPointToMapPanePoint(point: Point): Point // Converts a coordinate from the rotated pane reference system // to the reference system of the not rotated map pane. rotatedPointToMapPanePoint(point) { // 旋转容器->不旋转容器 return L.point(point).rotate(this._bearing)._add(this._getRotatePanePos()) }, // @method mapPanePointToRotatedPoint(point: Point): Point // Converts a coordinate from the not rotated map pane reference system // to the reference system of the rotated pane. mapPanePointToRotatedPoint(point) { // 不旋转容器->旋转容器 return L.point(point) ._subtract(this._getRotatePanePos()) .rotate(-this._bearing) }, // offset of the specified place to the current center in pixels _getCenterOffset(latlng) { let centerOffset = mapProto._getCenterOffset.call(this, latlng) if (this._rotate) { centerOffset = centerOffset.rotate(this._bearing) } return centerOffset }, _getRotatePanePos() { return this._rotatePanePos || new L.Point(0, 0) }, _getNewPixelOrigin(center, zoom) { // 计算旋转后的像素原点 const viewHalf = this.getSize()._divideBy(2) if (!this._rotate) { mapProto._getNewPixelOrigin.call(this, center, zoom) } return this.project(center, zoom) .rotate(this._bearing) ._subtract(viewHalf) ._add(this._getMapPanePos()) ._add(this._getRotatePanePos()) .rotate(-this._bearing) ._round() }, _handleGeolocationResponse(pos) { const lat = pos.coords.latitude const lng = pos.coords.longitude // TODO: use mapProto._handleGeolocationResponse const hdg = pos.coords.heading const latlng = new L.LatLng(lat, lng) const bounds = latlng.toBounds(pos.coords.accuracy) const options = this._locateOptions if (options.setView) { const zoom = this.getBoundsZoom(bounds) this.setView( latlng, options.maxZoom ? Math.min(zoom, options.maxZoom) : zoom ) } const data = { latlng, bounds, timestamp: pos.timestamp, // TODO: use mapProto._handleGeolocationResponse heading: hdg } for (const i in pos.coords) { if (typeof pos.coords[i] === 'number') { data[i] = pos.coords[i] } } // @event locationfound: LocationEvent // Fired when geolocation (using the [`locate`](#map-locate) method) // went successfully. this.fire('locationfound', data) } }) </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>