poblados-colonizacion-colon.../docs/colonizacion-leaflet/js/leaflet.timedimension.layer.geojson.js
2017-06-18 04:33:09 +02:00

211 lines
7.1 KiB
JavaScript

/*
* 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);
};