/* * L.TimeDimension.Layer.GeoJson: */ L.TimeDimension.Layer.GeoJson = L.TimeDimension.Layer.extend({ initialize: function(layer, options) { L.TimeDimension.Layer.prototype.initialize.call(this, layer, options); this._updateTimeDimension = this.options.updateTimeDimension || false; this._updateTimeDimensionMode = this.options.updateTimeDimensionMode || 'extremes'; // 'union', 'replace' or extremes this._duration = this.options.duration || null; this._addlastPoint = this.options.addlastPoint || false; this._waitForReady = this.options.waitForReady || false; this._defaultTime = 0; this._availableTimes = []; this._loaded = false; if (this._baseLayer.getLayers().length == 0) { if (this._waitForReady){ this._baseLayer.on("ready", this._onReadyBaseLayer, this); }else{ this._loaded = true; } } else { this._loaded = true; this._setAvailableTimes(); } // reload available times if data is added to the base layer this._baseLayer.on('layeradd', (function () { if (this._loaded) { this._setAvailableTimes(); } }).bind(this)); }, onAdd: function(map) { L.TimeDimension.Layer.prototype.onAdd.call(this, map); if (this._loaded) { this._setAvailableTimes(); } }, eachLayer: function(method, context) { if (this._currentLayer) { method.call(context, this._currentLayer); } return L.TimeDimension.Layer.prototype.eachLayer.call(this, method, context); }, isReady: function(time) { return this._loaded; }, _update: function() { if (!this._map) return; if (!this._loaded) { return; } var time = this._timeDimension.getCurrentTime(); var maxTime = this._timeDimension.getCurrentTime(), minTime = 0; if (this._duration) { var date = new Date(maxTime); L.TimeDimension.Util.subtractTimeDuration(date, this._duration, true); minTime = date.getTime(); } // new coordinates: var layer = L.geoJson(null, this._baseLayer.options); var layers = this._baseLayer.getLayers(); for (var i = 0, l = layers.length; i < l; i++) { var feature = this._getFeatureBetweenDates(layers[i].feature, minTime, maxTime); if (feature) { layer.addData(feature); if (this._addlastPoint && feature.geometry.type == "LineString") { if (feature.geometry.coordinates.length > 0) { var properties = feature.properties; properties.last = true; layer.addData({ type: 'Feature', properties: properties, geometry: { type: 'Point', coordinates: feature.geometry.coordinates[feature.geometry.coordinates.length - 1] } }); } } } } if (this._currentLayer) { this._map.removeLayer(this._currentLayer); } if (layer.getLayers().length) { layer.addTo(this._map); this._currentLayer = layer; } }, _setAvailableTimes: function() { var times = []; this._availableTimes = []; var layers = this._baseLayer.getLayers(); for (var i = 0, l = layers.length; i < l; i++) { if (layers[i].feature) { times = L.TimeDimension.Util.union_arrays( times, this._getFeatureTimes(layers[i].feature) ); } } // String dates to ms for (var i = 0, l = times.length; i < l; i++) { var time = times[i] if (typeof time == 'string' || time instanceof String) { time = Date.parse(time.trim()); } this._availableTimes.push(time); } if (this._timeDimension && (this._updateTimeDimension || this._timeDimension.getAvailableTimes().length == 0)) { this._timeDimension.setAvailableTimes(this._availableTimes, this._updateTimeDimensionMode); } }, _getFeatureTimes: function(feature) { if (!feature.properties) { return []; } if (feature.properties.hasOwnProperty('coordTimes')) { return feature.properties.coordTimes; } if (feature.properties.hasOwnProperty('times')) { return feature.properties.times; } if (feature.properties.hasOwnProperty('linestringTimestamps')) { return feature.properties.linestringTimestamps; } if (feature.properties.hasOwnProperty('time')) { return [feature.properties.time]; } return []; }, _getFeatureBetweenDates: function(feature, minTime, maxTime) { var featureStringTimes = this._getFeatureTimes(feature); if (featureStringTimes.length == 0) { return feature; } var featureTimes = []; for (var i = 0, l = featureStringTimes.length; i < l; i++) { var time = featureStringTimes[i] if (typeof time == 'string' || time instanceof String) { time = Date.parse(time.trim()); } featureTimes.push(time); } if (featureTimes[0] > maxTime || featureTimes[l - 1] < minTime) { return null; } var index_min = null, index_max = null, l = featureTimes.length; if (featureTimes[l - 1] > minTime) { for (var i = 0; i < l; i++) { if (index_min === null && featureTimes[i] > minTime) { // set index_min the first time that current time is greater the minTime index_min = i; } if (featureTimes[i] > maxTime) { index_max = i; break; } } } if (index_min === null) { index_min = 0; } if (index_max === null) { index_max = l; } var new_coordinates = []; if (feature.geometry.coordinates[0].length) { new_coordinates = feature.geometry.coordinates.slice(index_min, index_max); } else { new_coordinates = feature.geometry.coordinates; } return { type: 'Feature', properties: feature.properties, geometry: { type: feature.geometry.type, coordinates: new_coordinates } }; }, _onReadyBaseLayer: function() { this._loaded = true; this._setAvailableTimes(); this._update(); }, }); L.timeDimension.layer.geoJson = function(layer, options) { return new L.TimeDimension.Layer.GeoJson(layer, options); };