/***************/
/*** General ***/
/***************/
window.app = {};
var app = window.app;
app.mainLayer = new ol.layer.Tile({ source: new ol.source.OSM() });
/****************/
/*** Geometry ***/
/****************/
app.geometry = {}
app.geometry.REarth = 6371000;
app.geometry.toRadians = function(x){ return x * Math.PI / 180; };
app.geometry.haversine = function(lat1, lon1, lat2, lon2){
var lat1 = app.geometry.toRadians(lat1);
var lon1 = app.geometry.toRadians(lon1);
var lat2 = app.geometry.toRadians(lat2);
var lon2 = app.geometry.toRadians(lon2);
var dlat = Math.abs(lat1-lat2);
var dlon = Math.abs(lon1-lon2);
var alpha = Math.pow(Math.sin(dlat/2), 2) + Math.cos(lat1) * Math.cos(lat2) * Math.pow(Math.sin(dlon/2), 2);
var d = Math.atan2(Math.sqrt(alpha), Math.sqrt(1-alpha));
return 2 * app.geometry.REarth * d;
};
app.geometry.equirectangular = function(lat1, lon1, lat2, lon2){
var lat1 = app.geometry.toRadians(lat1);
var lon1 = app.geometry.toRadians(lon1);
var lat2 = app.geometry.toRadians(lat2);
var lon2 = app.geometry.toRadians(lon2);
var x = (lon2-lon1) * Math.cos((lat1+lat2)/2);
var y = (lat2-lat1);
return Math.sqrt(x*x + y*y) * app.geometry.REarth;
};
/***************/
/*** Measure ***/
/***************/
app.measure = {};
app.measure.tooltip_list = [];
app.measure.source = new ol.source.Vector();
app.measure.layer = new ol.layer.Vector({
source: app.measure.source,
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255, 255, 255, 0.2)'
}),
stroke: new ol.style.Stroke({
color: '#FC3',
width: 2
}),
image: new ol.style.Circle({
radius: 7,
fill: new ol.style.Fill({
color: '#FC3'
})
})
})
});
app.measure.pointerMoveHandler = function(evt){
if(evt.dragging){ return; }
var tooltipCoord = evt.coordinate;
if(app.measure.sketch){
var output;
var geom = (app.measure.sketch.getGeometry());
if(geom instanceof ol.geom.LineString){
output = app.measure.formatLength((geom));
tooltipCoord = geom.getLastCoordinate();
}
app.measure.tooltipElement.innerHTML = output;
app.measure.tooltip.setPosition(tooltipCoord);
}
};
app.measure.addInteraction = function(){
app.measure.draw = new ol.interaction.Draw({
source: app.measure.source,
type: ('LineString'),
style: new ol.style.Style({
fill: new ol.style.Fill({
color: 'rgba(255, 255, 255, 0.2)'
}),
stroke: new ol.style.Stroke({
color: 'rgba(0, 0, 0, 0.5)',
lineDash: [10, 10],
width: 2
}),
image: new ol.style.Circle({
radius: 5,
stroke: new ol.style.Stroke({
color: 'rgba(0, 0, 0, 0.7)'
}),
fill: new ol.style.Fill({
color: 'rgba(255, 255, 255, 0.2)'
})
})
})
});
app.map.addInteraction(app.measure.draw);
app.measure.createTooltip();
app.measure.draw.on('drawstart',
function(evt){
app.measure.sketch = evt.feature;
}, this);
app.measure.draw.on('drawend',
function(evt){
app.measure.tooltipElement.className = 'measure-tooltip measure-tooltip-static';
app.measure.tooltip.setOffset([0, -7]);
app.measure.sketch = null;
app.measure.tooltipElement = null;
app.measure.createTooltip();
}, this);
};
app.measure.createTooltip = function(){
if(app.measure.tooltipElement){
app.measure.tooltipElement.parentNode.removeChild(app.measure.tooltipElement);
}
app.measure.tooltipElement = document.createElement('div');
app.measure.tooltipElement.className = 'measure-tooltip measure-tooltip-value';
app.measure.tooltip = new ol.Overlay({
element: app.measure.tooltipElement,
offset: [0, -15],
positioning: 'bottom-center'
});
app.measure.tooltip_list.push(app.measure.tooltip);
app.map.addOverlay(app.measure.tooltip);
};
app.measure.formatLength = function(line){
var length_euclidean = line.getLength();
var length_equirectangular = 0;
var length_haversine = 0;
var coordinates = line.getCoordinates();
var sourceProj = app.map.getView().getProjection();
for(var i = 0, ii = coordinates.length - 1; i < ii; ++i){
var c1 = ol.proj.transform(coordinates[i], sourceProj, 'EPSG:4326');
var c2 = ol.proj.transform(coordinates[i + 1], sourceProj, 'EPSG:4326');
length_equirectangular += app.geometry.equirectangular(c1[1], c1[0], c2[1], c2[0]);
length_haversine += app.geometry.haversine(c1[1], c1[0], c2[1], c2[0]);
}
var disp = function(x){
if(x > 100){
return Math.round(x / 1000 * 1000) / 1000 + 'km';
} else {
return Math.round(x * 1000) / 1000 + 'm';
}
}
var length_euclidean = disp(length_euclidean);
var length_equirectangular = disp(length_equirectangular);
var length_haversine = disp(length_haversine);
var display_euclidean = $('input#measure-euclidean').prop('checked');
var display_equirectangular = $('input#measure-equirectangular').prop('checked');
var display_haversine = $('input#measure-haversine').prop('checked');
var header = true;
if(display_euclidean + display_equirectangular + display_haversine == 1){
header = false;
}
var str = '';
if(display_euclidean){
if(header){ str += 'euclidean: '; }
str += length_euclidean;
}
if(display_equirectangular){
if(header){ if(display_euclidean){ str += '
'; } str += 'equirectangular: '; }
str += length_equirectangular;
}
if(display_haversine){
if(header){ str += '
haversine: '; }
str += length_haversine;
}
return str;
};
/*******************/
/*** DataDisplay ***/
/*******************/
app.dataDisplay = {};
app.dataDisplay.layers = {};
app.dataDisplay.heatmapRadius = 5;
app.dataDisplay.heatmapBlur = 5;
app.dataDisplay.pathPointMode = 1; // endpoints
app.dataDisplay.pathPointResolution = 50;
app.dataDisplay.loadLayer = function(path){
$.ajax({url: path, cache: false, dataType: 'json',
success: function(result){
app.dataDisplay.layers[path] = app.dataDisplay.preprocess(result);
app.map.addLayer(app.dataDisplay.layers[path]);
}
});
};
app.dataDisplay.unloadLayer = function(path){
app.map.removeLayer(app.dataDisplay.layers[path]);
delete app.dataDisplay.layers[path];
};
app.dataDisplay.rawStyle = function(feature, resolution){
var style = [ new ol.style.Style({
stroke: new ol.style.Stroke({
color: '#00F',
width: 5
}),
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color: '#00F'
})
})
}),
new ol.style.Style({
stroke: new ol.style.Stroke({
color: '#000',
width: 2
}),
image: new ol.style.Circle({
radius: 2,
fill: new ol.style.Fill({
color: '#FFF'
})
})
})
];
if(feature.get('display') == 'path' && resolution < app.dataDisplay.pathPointResolution){
if(app.dataDisplay.pathPointMode == 2){
var polyline = feature.getGeometry();
var points = polyline.getCoordinates();
for(var i=1; i= 1){
var polyline = feature.getGeometry();
var first = polyline.getFirstCoordinate();
var last = polyline.getLastCoordinate();
style.push(new ol.style.Style({
geometry: new ol.geom.Point(first),
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color: '#0F0'
})
})
}));
style.push(new ol.style.Style({
geometry: new ol.geom.Point(last),
image: new ol.style.Circle({
radius: 5,
fill: new ol.style.Fill({
color: '#F00'
})
})
}));
}
}
return style;
};
app.dataDisplay.clusterStyleCache = {};
app.dataDisplay.clusterStyle = function(feature, resolution){
var size = feature.get('features').length;
var style = app.dataDisplay.clusterStyleCache[size];
if(!style){
style = [new ol.style.Style({
image: new ol.style.Circle({
radius: 10,
stroke: new ol.style.Stroke({
color: '#FFF'
}),
fill: new ol.style.Fill({
color: '#39C'
})
}),
text: new ol.style.Text({
text: size.toString(),
fill: new ol.style.Fill({
color: '#FFF'
})
})
})];
app.dataDisplay.clusterStyleCache[size] = style;
}
return style;
};
app.dataDisplay.preprocess = function(egj){
var source = new ol.source.GeoJSON({
projection: 'EPSG:3857',
object: egj.data
});
if(egj.type == 'raw'){
return new ol.layer.Vector({
source: source,
style: app.dataDisplay.rawStyle
});
} else if(egj.type == 'cluster'){
return new ol.layer.Vector({
source: new ol.source.Cluster({
distance: 40,
source: source
}),
style: app.dataDisplay.clusterStyle
});
} else if(egj.type == 'heatmap'){
return new ol.layer.Heatmap({
source: source,
blur: app.dataDisplay.heatmapBlur,
radius: app.dataDisplay.heatmapRadius
});
}
};
app.dataDisplay.reloadPathes = function(){
for(var layer in app.dataDisplay.layers){
if(app.dataDisplay.layers[layer].getSource().getFeatures()[0].get('display') == 'path'){
app.dataDisplay.layers[layer].changed();
}
}
};
app.dataDisplay.reloadHeatmaps = function(){
for(var key in app.dataDisplay.layers){
var layer = app.dataDisplay.layers[key];
if(layer instanceof ol.layer.Heatmap){
layer.setBlur(app.dataDisplay.heatmapBlur);
layer.setRadius(app.dataDisplay.heatmapRadius);
}
}
};
/****************/
/*** DataList ***/
/****************/
app.dataList = {};
app.dataList.current = {};
app.dataList.idgen = 0;
app.dataList.init = function(){
app.dataList.elementTree = {};
app.dataList.elementTree.parent = null;
app.dataList.elementTree.children = {};
app.dataList.elementTree.checkbox = null;
app.dataList.elementTree.ul = $('#datalist-tree ul');
app.dataList.updateList();
setInterval(app.dataList.updateList, 1000);
};
app.dataList.updateList = function(){
$.ajax({url: '/ls/', cache: false, dataType: 'json',
success: function(result){
result.forEach(function(file){
file.uri = file.path.join('/') + '/' + file.name
if(file.uri in app.dataList.current){
if(file.mtime > app.dataList.current[file.uri].mtime){
var act = app.dataList.current[file.uri];
if(act.checkbox.prop('checked')){
app.dataList.unloadLayer(file.uri);
app.dataList.loadLayer(file.uri);
}
act.mtime = file.mtime;
}
} else {
app.dataList.insert(file);
}
});
}
});
};
app.dataList.insert = function(file){
var cur = app.dataList.elementTree;
var prev = null;
for(var i = 1; i')
.prop('id', 'folder-'+app.dataList.idgen)
.hide();
var hidelink = $('')
.prop('href', '')
.append('hide')
.hide();
var showlink = $('')
.prop('href', '')
.append('show');
var playlink = $('')
.prop('href', '')
.append('play');
var stoplink = $('')
.prop('href', '')
.append('stop')
.hide();
n.checkbox = $('')
.prop('type', 'checkbox')
.prop('id', 'data-'+app.dataList.idgen)
.prop('name', n.uri);
n.checkbox.change(app.dataList.selectData);
var item = $('')
.append(n.checkbox)
.append($('