UNPKG

@mapgis/webclient-es6-mapboxgl

Version:

80 lines (68 loc) 2.11 kB
import mapboxgl from 'mapbox-gl' import { MapvLayer } from "../MapvLayer" /** * @class MapvStreamLayer * @classdesc SocketLayer MapV渲染器 * @author 基础平台/创新中心 潘卓然 ParnDeedlit * @extends {L.MapVLayer} * @param {string} url - 数据流图层服务地址 * @param {Object} options - 其他参数,先保留。 * * @param {Object} options.field - geojson的唯一标识字段,请确保该字段的唯一性。 */ export class MapvStreamLayer { constructor(map, url, options) { options = options || {} this.mapvOption = options.mapvOption || {} this.data = [] this.lastDate = new Date() this.url = url this.fieldHash = {} this.fieldDeg = options.fieldDeg this.iconUrl = options.iconUrl this.timeSpeed = options.timeSpeed || 100 this.createIcon() this.layer = new MapvLayer(map, new window.mapv.DataSet([]), this.mapvOption, options) } onMessage(msg) { const feature = msg.feature const field = msg.feature.properties[this.options.field] let layer = this.parasIcon(feature) if (field !== undefined && this.fieldHash[field]) { this.data[this.fieldHash[field]] = layer } else { if (field !== undefined) { this.data.push(layer) this.fieldHash[field] = this.data.length - 1 } } this.updateLayer() } createIcon() { var iconUrl = this.iconUrl || "http://client.snanyun.com:8899/img/leaflet/marker/bike.png" this.icon = new Image() this.icon.src = iconUrl } parasIcon(feature) { this.mapvOption = { draw: "icon" } var deg = feature.properties[this.fieldDeg] || 0 var icon = { geometry: { type: "Point", coordinates: feature.geometry.coordinates }, deg: deg, icon: this.icon } return icon } updateLayer() { var currentDate = new Date() if (currentDate - this.lastDate < this.timeSpeed) return this.updateData(this.data, this.mapvOption) this.lastDate = currentDate } }