WebWorldWind/examples/LayerManager.js

239 lines
8.5 KiB
JavaScript

/*
* Copyright (C) 2014 United States Government as represented by the Administrator of the
* National Aeronautics and Space Administration. All Rights Reserved.
*/
/**
* @exports LayerManager
*/
define(function () {
"use strict";
/**
* Constructs a layer manager for a specified {@link WorldWindow}.
* @alias LayerManager
* @constructor
* @classdesc Provides a layer manager to interactively control layer visibility for a World Window.
* @param {WorldWindow} worldWindow The World Window to associated this layer manager with.
*/
var LayerManager = function (worldWindow) {
var thisExplorer = this;
this.wwd = worldWindow;
this.roundGlobe = this.wwd.globe;
this.createProjectionList();
$("#projectionDropdown").find(" li").on("click", function (e) {
thisExplorer.onProjectionClick(e);
});
this.synchronizeLayerList();
$("#searchBox").find("button").on("click", function (e) {
thisExplorer.onSearchButton(e);
});
this.geocoder = new WorldWind.NominatimGeocoder();
this.goToAnimator = new WorldWind.GoToAnimator(this.wwd);
$("#searchText").on("keypress", function (e) {
thisExplorer.onSearchTextKeyPress($(this), e);
});
//
//this.wwd.redrawCallbacks.push(function (worldWindow, stage) {
// if (stage == WorldWind.AFTER_REDRAW) {
// thisExplorer.updateVisibilityState(worldWindow);
// }
//});
};
LayerManager.prototype.onProjectionClick = function (event) {
var projectionName = event.target.innerText || event.target.innerHTML;
$("#projectionDropdown").find("button").html(projectionName + ' <span class="caret"></span>');
if (projectionName === "3D") {
if (!this.roundGlobe) {
this.roundGlobe = new WorldWind.Globe(new WorldWind.EarthElevationModel());
}
if (this.wwd.globe !== this.roundGlobe) {
this.wwd.globe = this.roundGlobe;
}
} else {
if (!this.flatGlobe) {
this.flatGlobe = new WorldWind.Globe2D();
}
if (projectionName === "Equirectangular") {
this.flatGlobe.projection = new WorldWind.ProjectionEquirectangular();
} else if (projectionName === "Mercator") {
this.flatGlobe.projection = new WorldWind.ProjectionMercator();
} else if (projectionName === "North Polar") {
this.flatGlobe.projection = new WorldWind.ProjectionPolarEquidistant("North");
} else if (projectionName === "South Polar") {
this.flatGlobe.projection = new WorldWind.ProjectionPolarEquidistant("South");
} else if (projectionName === "North UPS") {
this.flatGlobe.projection = new WorldWind.ProjectionUPS("North");
} else if (projectionName === "South UPS") {
this.flatGlobe.projection = new WorldWind.ProjectionUPS("South");
} else if (projectionName === "North Gnomonic") {
this.flatGlobe.projection = new WorldWind.ProjectionUPS("North");
} else if (projectionName === "South Gnomonic") {
this.flatGlobe.projection = new WorldWind.ProjectionUPS("South");
}
if (this.wwd.globe !== this.flatGlobe) {
this.wwd.globe = this.flatGlobe;
}
}
this.wwd.redraw();
};
LayerManager.prototype.onLayerClick = function (layerButton) {
var layerName = layerButton.text();
// Update the layer state for the selected layer.
for (var i = 0, len = this.wwd.layers.length; i < len; i++) {
var layer = this.wwd.layers[i];
if (layer.hide) {
continue;
}
if (layer.displayName === layerName) {
layer.enabled = !layer.enabled;
if (layer.enabled) {
layerButton.addClass("active");
} else {
layerButton.removeClass("active");
}
this.wwd.redraw();
break;
}
}
};
LayerManager.prototype.synchronizeLayerList = function () {
var layerListItem = $("#layerList");
layerListItem.find("button").off("click");
layerListItem.find("button").remove();
// Synchronize the displayed layer list with the World Window's layer list.
for (var i = 0, len = this.wwd.layers.length; i < len; i++) {
var layer = this.wwd.layers[i];
if (layer.hide) {
continue;
}
var layerItem = $('<button class="list-group-item btn btn-block">' + layer.displayName + '</button>');
layerListItem.append(layerItem);
if (layer.showSpinner && Spinner) {
var opts = {
scale: 0.9,
};
var spinner = new Spinner(opts).spin();
layerItem.append(spinner.el);
}
if (layer.enabled) {
layerItem.addClass("active");
} else {
layerItem.removeClass("active");
}
}
var self = this;
layerListItem.find("button").on("click", function (e) {
self.onLayerClick($(this));
});
};
//
//LayerManager.prototype.updateVisibilityState = function (worldWindow) {
// var layerButtons = $("#layerList").find("button"),
// layers = worldWindow.layers;
//
// for (var i = 0; i < layers.length; i++) {
// var layer = layers[i];
// for (var j = 0; j < layerButtons.length; j++) {
// var button = layerButtons[j];
//
// if (layer.displayName === button.innerText) {
// if (layer.inCurrentFrame) {
// button.innerHTML = "<em>" + layer.displayName + "</em>";
// } else {
// button.innerHTML = layer.displayName;
// }
// }
// }
// }
//};
LayerManager.prototype.createProjectionList = function () {
var projectionNames = [
"3D",
"Equirectangular",
"Mercator",
"North Polar",
"South Polar",
"North UPS",
"South UPS",
"North Gnomonic",
"South Gnomonic"
];
var projectionDropdown = $("#projectionDropdown");
var dropdownButton = $('<button class="btn btn-info btn-block dropdown-toggle" type="button" data-toggle="dropdown">3D<span class="caret"></span></button>');
projectionDropdown.append(dropdownButton);
var ulItem = $('<ul class="dropdown-menu">');
projectionDropdown.append(ulItem);
for (var i = 0; i < projectionNames.length; i++) {
var projectionItem = $('<li><a >' + projectionNames[i] + '</a></li>');
ulItem.append(projectionItem);
}
ulItem = $('</ul>');
projectionDropdown.append(ulItem);
};
LayerManager.prototype.onSearchButton = function (event) {
this.performSearch($("#searchText")[0].value)
};
LayerManager.prototype.onSearchTextKeyPress = function (searchInput, event) {
if (event.keyCode === 13) {
searchInput.blur();
this.performSearch($("#searchText")[0].value)
}
};
LayerManager.prototype.performSearch = function (queryString) {
if (queryString) {
var thisLayerManager = this,
latitude, longitude;
if (queryString.match(WorldWind.WWUtil.latLonRegex)) {
var tokens = queryString.split(",");
latitude = parseFloat(tokens[0]);
longitude = parseFloat(tokens[1]);
thisLayerManager.goToAnimator.goTo(new WorldWind.Location(latitude, longitude));
} else {
this.geocoder.lookup(queryString, function (geocoder, result) {
if (result.length > 0) {
latitude = parseFloat(result[0].lat);
longitude = parseFloat(result[0].lon);
WorldWind.Logger.log(
WorldWind.Logger.LEVEL_INFO, queryString + ": " + latitude + ", " + longitude);
thisLayerManager.goToAnimator.goTo(new WorldWind.Location(latitude, longitude));
}
});
}
}
};
return LayerManager;
});