mirror of
https://github.com/medialab-prado/poblados-colonizacion-colonias-penitenciarias.git
synced 2024-12-26 20:41:23 +01:00
211 lines
7.1 KiB
JavaScript
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);
|
|
};
|