UNPKG

@goshawk22/leaflet-elevation

Version:

A Leaflet plugin that allows to add elevation profiles using d3js

97 lines (77 loc) 2.63 kB
import * as D3 from './d3.js'; const _ = L.Control.Elevation.Utils; export var Marker = L.Class.extend({ initialize(options, control) { this.options = options; this.control = control switch(this.options.marker) { case 'elevation-line': // this._container = d3.create("g").attr("class", "height-focus-group"); break; case 'position-marker': // this._marker = L.circleMarker([0, 0], { pane: 'overlayPane', radius: 6, fillColor: '#fff', fillOpacity:1, color: '#000', weight:1, interactive: false }); this._marker = L.marker([0, 0], { icon: this.options.markerIcon, zIndexOffset: 1000000, interactive: false }); break; } this._labels = {}; return this; }, addTo(map) { this._map = map; switch(this.options.marker) { case 'elevation-line': this._container = d3.select(map.getPane('elevationPane')).select("svg > g").call(D3.PositionMarker({})); break; case 'position-marker': this._marker.addTo(map, { pane: 'overlayPane' }); break; } return this; }, /** * Update position marker ("leaflet-marker"). */ update(props) { if (props) this._props = props; else props = this._props; if (!props) return; if (props.options) this.options = props.options; if (!this._map) this.addTo(props.map); this._latlng = props.item.latlng; switch(this.options.marker) { case 'elevation-line': if (this._container) { let point = this._map.latLngToLayerPoint(this._latlng); point = L.extend({}, props.item, this._map._rotate ? this._map.rotatedPointToMapPanePoint(point) : point); let yMax = (this.control._height() / props.yCoordMax * point[this.options.yAttr]) / 4; if (!isFinite(yMax) || isNaN(yMax)) yMax = 0; this._container.classed("leaflet-hidden", false); this._container.call(D3.PositionMarker({ theme : this.options.theme, xCoord: point.x, yCoord: point.y, length: point.y - yMax, // normalized Y labels: this._labels, item: point, })); } break; case 'position-marker': _.removeClass(this._marker.getElement(), 'leaflet-hidden'); this._marker.setLatLng(this._latlng); break; } }, /* * Hides the position/height indicator marker drawn onto the map */ remove() { this._props = null; switch(this.options.marker) { case 'elevation-line': this._container && this._container.classed("leaflet-hidden", true); break; case 'position-marker': _.addClass(this._marker.getElement(), 'leaflet-hidden'); break; } }, getLatLng() { return this._latlng; }, _registerTooltip(props) { this._labels[props.name] = props; } });