Commit 3f7776db authored by Muharemi's avatar Muharemi
Browse files

Merge branch 'dev' into 'master'

Finale Merge of the dev branch into master

See merge request !1
parents 47071eb3 3e8d28a8
Pipeline #5783 passed with stage
in 49 seconds
public/node_modules/
\ No newline at end of file
{
"indent_size": 4,
"indent_char": " ",
"indent_level": 0,
"end-with-newline": true,
"indent_with_tabs": false,
"preserve_newlines": true,
"max_preserve_newlines": 10,
"jslint_happy": false,
"space_after_anon_function": false,
"brace_style": "collapse,preserve-inline",
"keep_array_indentation": false,
"keep_function_indentation": false,
"space_before_conditional": true,
"break_chained_methods": false,
"eval_code": false,
"unescape_strings": false,
"wrap_line_length": 0,
"css": {
"selector_separator_newline": false
}
}
\ No newline at end of file
......@@ -84,7 +84,7 @@
}
#sidebar div.list div.item{
padding:15px 10px;
padding:25px 10px;
border-bottom:1px solid #444;
color:#fcfcfc;
text-transform:uppercase;
......@@ -106,6 +106,8 @@
overflow-y: auto;
}
.dropdown-btn {
padding: 15px 10px;
text-decoration: none;
......@@ -125,6 +127,10 @@
color: white;
}
select { width: 170px;
height: 40px;
}
/* Dropdown container (hidden by default). Optional: add a lighter background color and some left padding to change the design of the dropdown content */
.dropdown-container {
display: none;
......
//Shadow palette for coloring the roofs
// color pallet from https://colorbrewer2.org/#type=sequential&scheme=BuGn&n=3
var pvPotentialPallet = ['#d0d1e6', '#a6bddb', '#74a9cf', '#3690c0', '#0570b0', '#034e7b']
pvPotentialPallet = pvPotentialPallet.reverse();
//color pallet white->black
var colorPalette = ['#bdbdbd', '#969696', '#737373', '#525252', '#252525'];
const shadowPalette = colorPalette;
//returns the responding color from the shadowPalette, depending on the inputShadowValue(0 to 1 in float)
function getShadowPalette(inputShadowValue) {
//checking for the float values
var index = Math.ceil((shadowPalette.length - 1) * inputShadowValue);
//console.log(inputShadowValue,"---",shadowPalette[index]);
return shadowPalette[index];
}
/** returns a color from the chosen colorpalette, depending on the inputvalue
* @param {float} inputValue - inputValue on which the colorpalette should be calculated (normalized range 0.0-1.0)
* @param {string} colorPalette - "pvPotential" or "shadowValue"
* @returns {string} a hex color string
*/
function getColorFromPalette(inputValue,colorPalette) {
//returns the responding color from the shadowPalette, depending on the inputShadowValue(0 to 1 in float)
if(colorPalette==="shadowValue"){
var index = Math.ceil((shadowPalette.length - 1) * inputValue); //checking for the float values
return shadowPalette[index];
}else if(colorPalette==="pvPotential"){
var index = Math.ceil((pvPotentialPallet.length - 1) * inputValue); //checking for the float values
return pvPotentialPallet[index];
}else{
throw "chose wrong colorPalette";
}
}
var coordinatesBB = []
var url = "https://simstadt-api.iaf-ex.hft-stuttgart.de:8080/workflow/execute"
//var url = "https://simstadt-api.iaf-ex.hft-stuttgart.de:8080/workflow/execute" //old link
var url = "http://vm24.fkc.hft-stuttgart.de:8082/workflow/execute" // URL to API
var url2 = "http://vm24.fkc.hft-stuttgart.de:8082/workflow/timedShadowValueByDay/"
var pvURL = "http://vm24.fkc.hft-stuttgart.de:8082/workflow/readPVPotential"
var localShadowData = "/public/test/APIdata/shadowData.json"
var localPvpotentialData = "/public/test/APIdata/buildingInformation.json"
var buildingFunctionSort
var constructionYearSortPick
......@@ -8,12 +15,73 @@ var heatedVolumeSortPick
var totalSurfaceAreaSortPick
var roofTypeSortPick
var uValueSortPick
var shadowdata
var pvPotentialSurfaces; //array which holds the pvpotential of all surfaces
async function fetchPvPotentialJSON() {
var bottomLat = coordinatesBB[1]
var leftLng = coordinatesBB[0]
var rightLng = coordinatesBB[2]
var topLat = coordinatesBB[3]
const response = await fetch(pvURL, {
method: "POST",
body: JSON.stringify({
"boundingBox": {
"bottomLat": bottomLat, //48.779004965,
"leftLng": leftLng, //9.1686843081,
"lodType": "LOD2",
"rightLng": rightLng, //9.175336684,
"topLat": topLat //48.7822869656
},
"cityGMLRef": "campusLOD2"
}),
headers: {
"Content-Type": "application/json",
"Authorization": "Basic YWRtaW46YWRtaW4xMjM="
}
})
const data = await response.json();
return data
}
async function fetchshadowDataJSON() {
var bottomLat = coordinatesBB[1]
var leftLng = coordinatesBB[0]
var rightLng = coordinatesBB[2]
var topLat = coordinatesBB[3] //
var day = "1";
const response = await fetch(url2 + day, {
method: "POST",
body: JSON.stringify({
"boundingBox": {
"bottomLat": bottomLat, //48.779004965,
"leftLng": leftLng, //9.1686843081,
"lodType": "LOD2",
"rightLng": rightLng, //9.175336684,
"topLat": topLat //48.7822869656
},
"cityGMLRef": "campusLOD2"
}),
headers: {
"Content-Type": "application/json",
"Authorization": "Basic YWRtaW46YWRtaW4xMjM="
}
})
const data = await response.json();
return data
}
async function fetchDataJSON() {
var bottomLat = coordinatesBB[1]
var leftLng = coordinatesBB[0]
var rightLng = coordinatesBB[2]
var topLat = coordinatesBB[3]//
var topLat = coordinatesBB[3] //
const response = await fetch(url, {
method: "POST",
......@@ -25,7 +93,7 @@ async function fetchDataJSON() {
"rightLng": rightLng, //9.175336684,
"topLat": topLat //48.7822869656
},
// "cityGMLRef": "campus",
"cityGMLRef": "campusLOD2",
"interestedAttributes": [
"uValue",
"volume",
......@@ -51,22 +119,52 @@ async function fetchDataJSON() {
const data = await response.json()
return data
}
document.getElementById("loader").style.visibility = "hidden"
function processData() {
console.log(coordinatesBB)
async function getLocalShadowdata() {
// gets the response from localShadowData and put it inside a constant
const response = await fetch(localShadowData);
//the response have to be converted to json type file, so it can be used
const data = await response.json();
//console.log(data)
return data;
}
async function processData() {
console.log("Waiting for data....")
shadowdata = await getLocalShadowdata()
//waiting 25sec for the shadowData fetch from server: catching error if no answer in 25sec
timeout(25000, fetchshadowDataJSON()).then((response) => {
shadowdata = response;
}).catch((error) => { //catching the error(no connection)/ timeout and displaying an alert for the user
console.log(shadowdata);
})
timeout(10000, fetchPvPotentialJSON()).then((response) => {
pvPotentialSurfaces = getPvPotentialOfSurfaces(response["buildings"]);
}).catch((error) => {
console.log(error)
})
timeout(10000, fetchDataJSON()).then((response) => {
calculateData(response);
}).catch((error) => {
console.log(error)
fetch(localPvpotentialData)
.then(response => response.text())
.then(text => calculateData(JSON.parse(text)))
})
}
fetchDataJSON().then(data => {
console.log(data);
function calculateData(data) {
document.getElementById("cesiumContainer").style.opacity = "1";
document.getElementById("loader").style.visibility = "hidden"
console.log("....received data")
var buildingsMAP = new Map()
data.buildings.forEach(bu => {
var partsArray = []
var surefacesArray = []
......@@ -88,7 +186,6 @@ function processData() {
p.attributes.roofType)))
buildingsMAP.set(bu.id, new Building(bu.id, partsArray)) //puts buildings with parts and surfaces in a map
})
var partHeightMAP = new Map()
......@@ -187,7 +284,7 @@ function processData() {
availableAttributes()
//color buildings with heating demand
document.getElementById("checkbox2").addEventListener("change", function () {
document.getElementById("checkbox2").addEventListener("change", function() {
if (this.checked) {
tileContent.forEach(t => {
let tileID = t.getProperty("gml_parent_id")
......@@ -206,7 +303,7 @@ function processData() {
})
//color surfaces with uValue
document.getElementById("checkbox1").addEventListener("change", function () {
document.getElementById("checkbox1").addEventListener("change", function() {
if (this.checked) {
tileContent.forEach(t => {
let tileID = t.getProperty("gml_id")
......@@ -223,10 +320,6 @@ function processData() {
console.log("not colored")
}
})
}).catch((err) => {
console.log(err)
})
}
function showAllUVales() {
......@@ -269,54 +362,103 @@ var modal = document.getElementById("myModal");
var span = document.getElementsByClassName("close")[0];
//close the modal
span.onclick = function () {
span.onclick = function() {
modal.style.display = "none";
deleteTilesetButtons()
}
// modal closes, when the user clicks anywhere outside of the modal
window.onclick = function (event) {
window.onclick = function(event) {
if (event.target == modal) {
modal.style.display = "none";
deleteTilesetButtons()
}
}
var tileData = null
var tileset = null
//-------------------------------------------------------------------------------
var tileData = null;
var tileset = null;
var tilesetURL = 'http://vm24.fkc.hft-stuttgart.de:8081/CampusLOD2/tileset.json';
var localTestTileset = getAbsoulteTestPath("/test/gmlTileset_v1.json");
function timeout(ms, promise) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
reject(new Error("timeout"))
}, ms)
promise.then(resolve, reject)
})
}
//getting the pvPotential of all surfaces from the pvPotential array, which the api returns
function getPvPotentialOfSurfaces(pvPotentialarray) {
var pvPotentialArray = [];
pvPotentialarray.forEach(
building => building["parts"].forEach(
parts => parts["surfaces"].forEach(
surface => pvPotentialArray.push(surface)
)
)
);
return pvPotentialArray;
}
//fetching the tileset and handling the connection
//waiting 1sec for the tileSetData fetch from server: catching error if no answer in 1sec
function fetchTileset() {
timeout(1000, fetch(tilesetURL)).then((response) => {
loadAndZoomToTileset(tilesetURL);
}).catch((error) => { //catching the error(no connection)/ timeout and displaying an alert for the user
swal({ text: "Could not connect to Server. Using now: local data", icon: "info" });
console.log("Using local test data");
loadAndZoomToTileset(localTestTileset);
})
}
/*
NOTE #1: -load the models but the are in the too high in the "air"
-building view doesn´t work because all buildings are grouped together
-surfaces are also broken
fetch('https://boxofcare.de/3DContainerTile/collections/')
.then(response => response.json())
.then(data => {
tileData = data
});
-->this fixme is the problem of the backendteam !
? maybe add old menu back and the option to also load the new ones
*/
//loads tileset after submit button is clicked
function loadTileset() {
viewer.scene.primitives.remove(tileset)
tileContent = []
viewer.scene.primitives.remove(tileset);
tileContent = [];
modal.style.display = "block";
console.log(tileData)
fetchTileset();
}
var userurl = document.getElementById("3Durl").value;
//loads the tileset from the url into the cesium viewer and zooms to it
function loadAndZoomToTileset(url) {
tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: url
}));
tileData.collections.forEach(c => {
if (userurl === 'hftcampus' && c.id === "HftCampus") useContent(c.content)
if (userurl === 'paderborn' && c.id === "Paderborn") useContent(c.content)
})
viewer.zoomTo(tileset, new Cesium.HeadingPitchRange(0, -0.5, 0));
modal.style.display = "none";
saveTilesetContent(tileset)
deleteTilesetButtons()
}
function useContent(content) {
function useContent(content) {
content.forEach(cont => {
var element = document.createElement("input")
element.type = "button"
element.value = cont.title
element.value = cont.title
element.name = "individualTileset"
document.getElementById("myList").appendChild(element);
element.onclick = function () {
element.onclick = function() {
tileset = viewer.scene.primitives.add(new Cesium.Cesium3DTileset({
url: cont.href
}));
......@@ -341,9 +483,25 @@ function saveTilesetContent(tileset) {
function deleteTilesetButtons() {
var x = document.getElementsByName("individualTileset")
var len = x.length
//checking if there are even tileset to delete
if (x.length > 0) {
parentNode = x[0].parentNode;
for (var i = 0; i < len; i++) {
parentNode.removeChild(x[0]);
}
}
}
//expects path to test data, from the 'public' folder as origin
// for example: getAbsoulteTestPath("/test/gmlTileset_v1.json")
function getAbsoulteTestPath(testdataPath) {
var a = window.location.pathname.split("/")
a.pop();
a.reverse();
a.pop();
a.reverse()
var path = "";
a.forEach(element => path += "/" + element);
var path = window.location.origin + "/" + path + testdataPath;
return path;
}
......@@ -8,7 +8,7 @@ var rectVisible = false;
var Pickers_3DTile_Activated = true;
var bboxactivated = false;
var currentLayer;
var drawBox = false
var drawBox = false;
//draw rectangle
function drawBounding() {
......@@ -19,6 +19,8 @@ function drawBounding() {
drawBox = true
}
//fills coordinates array (used to fetch data)
function createRequest_BB() {
console.log("-->clicked confirm button")
......
//filling the table in the info sidebar with data
function fillTableProperties(gID, sID) {
if (drawBox === false) {
swal("CAN'T LOAD DATA!", "mark an area first!", "error");
document.getElementById("singleChartContainer").style.visibility = "hidden"
document.getElementsByClassName('cesium-infoBox-defaultTable').style.display = 'none';
} else {
//Property BuildingFunction
buildingFunctionSortPick.forEach((value, key) => {
if (key === gID) {
pickBuildingFunction = value
}
})
//Property Year of Construction
constructionYearSortPick.forEach((value, key) => {
if (key === gID) {
pickYearOfConstruction = value
}
})
//Property height
heightSortPick.forEach((value, key) => {
if (key === gID) {
pickHeight = value
}
})
//Property HeatedVolume
heatedVolumeSortPick.forEach((value, key) => {
if (key === gID) {
pickHeatedVolume = value
}
})
//Property TotalSurfaceArea
totalSurfaceAreaSortPick.forEach((value, key) => {
if (key === gID) {
var sum = 0
value.forEach(element => {
sum += element.totalSurfaceArea
});
pickTotalSurfaceArea = sum
}
})
//Property RoofType
roofTypeSortPick.forEach((value, key) => {
if (key === gID) {
pickRoofType = value
}
})
//Property UValue
uValueSortPick.forEach((value, key) => {
if (key === sID) {
pickUValue = value
}
})
}
}
\ No newline at end of file
......@@ -4,16 +4,26 @@ var viewer = new Cesium.Viewer('cesiumContainer', {
homeButton: false,
baseLayerPicker: false,
navigationHelpButton: false,
timeline: false,
timeline: true,
//shadows:true,
animation: false,
sceneModePicker: false,
geocoder: false,
sceneMode: Cesium.SceneMode.SCENE3D
});
viewer.scene.globe.depthTestAgainstTerrain = true;
//--------------------hover over surfaces--------------------
var singleChart = document.getElementById('singleChartContainer');
var roofViewActivated = false;
var chosenAttributeRadioBtnFlag = "shadowValue";
function chosenAttributeHandler(radioBtnValue) {
chosenAttributeRadioBtnFlag = radioBtnValue.value;
}
// HTML overlay for showing feature name on mouseover
var nameOverlay = document.createElement("div");
viewer.container.appendChild(nameOverlay);
......@@ -26,6 +36,16 @@ nameOverlay.style["pointer-events"] = "none";
nameOverlay.style.padding = "4px";
nameOverlay.style.backgroundColor = "white";
var chosenDate = new Cesium.GregorianDate(2021, 12, 2, 11); //the chosen Date from the Timeline
//getting clicked Date from the timeline element
viewer.timeline.container.onmouseup = (e) => {
var julianDate = viewer.clock.currentTime;
Cesium.JulianDate.toGregorianDate(julianDate, chosenDate);
//console.log(chosenDate);
}
// An entity object which will hold info about the currently selected feature for infobox display
var selectedEntity = new Cesium.Entity();
......@@ -44,23 +64,18 @@ var highlightedFeatures = [];
//conatins currently selected features
var selectedFeatures = [];
var hoverpid;
var selectpid;
var pickedselect = true;
var pickedhigh = false;
var pickedalreadyselect = false;
var radio = document.getElementById('radio-group');
//selected gmlID
var gmlID
var gmlID;
radio.addEventListener('click', function () {
radio.addEventListener('click', function() {
//hide chart for individual buildings
singleChart.style.visibility = 'hidden';
......@@ -102,6 +117,7 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
return;
}
//Surface-View @onMouseMove
if (document.getElementById("surface").checked) {
// A feature was picked, so show it's overlay content
......@@ -114,10 +130,10 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
return;
}
var name = pickedFeature.getProperty("gml_id");
nameOverlay.textContent = name;
var shadowhourvaluepercent = 0;
nameOverlay.textContent = "ID: " + name;
//nameOverlay.textContent = "ID: " + name + "\t shadowvalue:" + shadowhourvaluepercent;
// Highlight the feature if it's not already selected.
selectedFeatures.forEach(s => {
if (s.feature === pickedFeature) {
......@@ -130,15 +146,21 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
if (pickedselect) {
tileContent.forEach(t => {
if (t === pickedFeature) {
if (t.getProperty("feature_type") === "RoofSurface") {
highlightedFeatures.push(new featurevar(t, t.color));
t.color = Cesium.Color.GREEN;
} else {
highlightedFeatures.push(new featurevar(t, t.color));
t.color = Cesium.Color.YELLOW;
}
}
});
}
}
else {
//Building View
else if (document.getElementById("building").checked) {
// A feature was picked, so show it's overlay content
nameOverlay.style.display = "block";
nameOverlay.style.bottom = viewer.canvas.clientHeight - movement.endPosition.y + "px";
......@@ -151,7 +173,7 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
name = pickedFeature.getProperty("gml_parent_id");
hoverpid = name
hoverpid = name;
nameOverlay.textContent = name;
// Highlight the feature if it's not already selected.
......@@ -164,17 +186,31 @@ viewer.screenSpaceEventHandler.setInputAction(function onMouseMove(movement) {
});
}
}
},
//Roof View
// else if (document.getElementById("roof").checked) {
// console.log("clicked when in roof view and on hover");
// }
else if (document.getElementById("solarPlanner").checked) {
console.log("clicked when in roof view and on hover");
}
},
Cesium.ScreenSpaceEventType.MOUSE_MOVE);
var pickBuildingFunction
var pickYearOfConstruction
var pickHeight
var pickHeatedVolume
var pickTotalSurfaceArea = 0
var pickRoofType
//-----------------------------------------------------------------------------------------------
var pickBuildingFunction;
var pickYearOfConstruction;
var pickHeight;
var pickHeatedVolume;
var pickTotalSurfaceArea = 0;
var pickRoofType;
var pickUValue
var shadowHourValue = 0;
var SurfacePvPotential;
var SurfacePvPotentialObject = []; //object which stores all the pvPotential data
//Color a feature on selection and show metadata in the InfoBox
......@@ -205,6 +241,7 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
clickHandler(movement);
return;
}
selectpid = pickedFeature.getProperty("gml_parent_id");
//Show chart for individual buildings. But only if building view is activated
......@@ -212,18 +249,6 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
singleChart.style.visibility = 'visible';
}
/*select the feature if it's not already selected
selectedFeatures.forEach(s => {
if (pickedFeature === s.feature) {
console.log("return");
pickedalreadyselect = true;
}
});
if(pickedalreadyselect){
return;
}*/
highlightedFeatures.forEach(h => {
if (h.feature === pickedFeature) {
pickedhigh = true;
......@@ -245,7 +270,13 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
//fill variables for Single Building Properties
fillTableProperties(gmlID, surID)
//########################################################################################################################
//Different Views from here
//Surface View @onLeftClick
if (document.getElementById("surface").checked) {
resetRoofColors();
setMinAndMax(chosenAttributeRadioBtnFlag);
//save the selected feature's original color
if (pickedhigh) {
......@@ -255,12 +286,48 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
}
});
highlightedFeatures = [];
//highlight newly selected feature
tileContent.forEach(t => {
if (t === pickedFeature) {
t.color = Cesium.Color.LIME;
//used for debugging, when clicking on a surface
//console.log(t.getProperty("description") + "\n" + t.getProperty("feature_type") + "\n" + t.getProperty("gml_id") + "\n" + t.getProperty("gml_parent_id"));
//color surfaces depending on their shadow value
for (const [key, value] of Object.entries(shadowdata)) { //looping threw the shadowdata array
if (key === t.getProperty("gml_id")) { //checking if the ids of the current surface match the id in the shadowdata array
//console.log("hour:",chosenDate.hour);
shadowHourValue = value[chosenDate.hour - 1] //getting the current chosen hour from the timeline
if (chosenAttributeRadioBtnFlag === "shadowValue") {
t.color = Cesium.Color.fromCssColorString(getColorFromPalette(shadowHourValue, "shadowValue")); //coloring the surface
}
//t.color = Cesium.Color.fromCssColorString(getShadowPalette(shadowHourValue)); //coloring the surface
}
}
//console.log(pvPotentialSurfaces);
//coloring surfaces on pv potential
//console.log("minie maus", minAndMaxPvPotentials);
for (const [key, value] of Object.entries(pvPotentialSurfaces)) {
if (value["id"] === t.getProperty("gml_id") && chosenAttributeRadioBtnFlag !== "shadowValue") { //checking if the ids of the current surface match the id in the shadowdata array
//console.log("hour:",chosenDate.hour);
var normalizedPvValue="";
chosenPvPotentialValue = value["attributes"]["pvPotential"][chosenAttributeRadioBtnFlag];
//console.log("chosenPvPotentialValue",chosenPvPotentialValue);
normalizedPvValue = getNormalizedValue(chosenPvPotentialValue);
console.log("normalisierter", normalizedPvValue);
t.color = Cesium.Color.fromCssColorString(getColorFromPalette(normalizedPvValue, "pvPotential")); //coloring the surface
SurfacePvPotential = chosenPvPotentialValue;
SurfacePvPotentialObject = value["attributes"]["pvPotential"];
console.log(SurfacePvPotentialObject);
}
}
}
});
} else {
tileContent.forEach(t => {
if (t === pickedFeature) {
......@@ -275,9 +342,18 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
});
}
//show the attributes of the chosen surface in the table
var chosenAttribute2Show = "";
var shadowhourvaluepercent = shadowHourValue * 100;
console.log("shadowHourValue:",shadowHourValue*100,"\n shadowhourvaluepercent:",shadowhourvaluepercent);
if(chosenAttributeRadioBtnFlag==="shadowValue"){
chosenAttribute2Show ="<tr><th>shadow value</th><td>" + shadowhourvaluepercent.toFixed(1) + "%" + "</td></tr>";
}else{
chosenAttribute2Show = "<tr><th>"+chosenAttributeRadioBtnFlag+"</th><td>" + SurfacePvPotential + "</td></tr>";
}
//set feature infobox description
//set feature infobox description (surface view)
var featureName = pickedFeature.getProperty("name");
selectedEntity.name = featureName;
selectedEntity.description = 'Loading <div class="cesium-infoBox-loading"></div>';
......@@ -286,11 +362,17 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
'<table class="cesium-infoBox-defaultTable"><tbody>' +
"<tr><th>Surface_ID</th><td>" + pickedFeature.getProperty("gml_id") + "</td></tr>" +
"<tr><th>u_Value</th><td>" + pickUValue + "</td></tr>" +
"<tr><th>description</th><td>" + pickedFeature.getProperty("description") + "</td></tr>" +
"<tr><th>feature_type</th><td>" + pickedFeature.getProperty("feature_type") + "</td></tr>" +
chosenAttribute2Show;
"</tbody></table>";
}
else {
//Building View
else if (document.getElementById("building").checked) {
resetRoofColors();
//save the selected feature's original color
if (pickedhigh) {
highlightedFeatures.forEach(h => {
......@@ -324,7 +406,7 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
buildings(gmlID)
//set feature infobox description
//set feature infobox description (building view)
var featureName = pickedFeature.getProperty("name");
selectedEntity.name = featureName;
selectedEntity.description = 'Loading <div class="cesium-infoBox-loading"></div>';
......@@ -342,74 +424,66 @@ viewer.screenSpaceEventHandler.setInputAction(function onLeftClick(movement) {
}
//solarPlanner View
else if (document.getElementById("solarPlanner").checked) {
resetRoofColors();
//looping threw all surfaces
tileContent.forEach(t => {
for (const [key, value] of Object.entries(pvPotentialSurfaces)) {
if (value["id"] === t.getProperty("gml_id") && chosenAttributeRadioBtnFlag !== "shadowValue") { //checking if the ids of the current surface match the id in the shadowdata array
//console.log("hour:",chosenDate.hour);
var normalizedPvValue="";
chosenPvPotentialValue = value["attributes"]["pvPotential"][chosenAttributeRadioBtnFlag];
//console.log("chosenPvPotentialValue",chosenPvPotentialValue);
normalizedPvValue = getNormalizedValue(chosenPvPotentialValue);
console.log("normalisierter", normalizedPvValue);
t.color = Cesium.Color.fromCssColorString(getColorFromPalette(normalizedPvValue, "pvPotential")); //coloring the surface
SurfacePvPotential = chosenPvPotentialValue;
SurfacePvPotentialObject = value["attributes"]["pvPotential"];
console.log(SurfacePvPotentialObject);
}
}
});
},
Cesium.ScreenSpaceEventType.LEFT_CLICK);
function fillTableProperties(gID, sID) {
if (drawBox === false) {
swal("CAN'T LOAD DATA!", "mark an area first!", "error");
document.getElementById("singleChartContainer").style.visibility = "hidden"
document.getElementsByClassName('cesium-infoBox-defaultTable').style.display = 'none';
} else {
//Property BuildingFunction
buildingFunctionSortPick.forEach((value, key) => {
if (key === gID) {
pickBuildingFunction = value
}
})
//Property Year of Construction
constructionYearSortPick.forEach((value, key) => {
if (key === gID) {
pickYearOfConstruction = value
}
})
/**
* @deprecated roofview is not used anymore, maybe later for "color all surface, depending on one attribute"
*/
else if (document.getElementById("roofView").checked && roofViewActivated){
console.log(pickedhigh,highlightedFeatures,tileContent);
resetRoofColors();
//Property height
heightSortPick.forEach((value, key) => {
if (key === gID) {
pickHeight = value
//looping threw all surfaces
tileContent.forEach(t => {
if (t.getProperty("description").includes("Roof")) { //HACK: checking if the are a roof surface (should come from feature_type)
for (const [key, value] of Object.entries(shadowdata)) { //looping threw the shadowdata array
if (key === t.getProperty("gml_id")) { //checking the id
//console.log(value);
shadowHourValue = value[chosenDate.hour - 1]; //getting the current chosen hour from the timeline
t.color = Cesium.Color.fromCssColorString(getShadowPalette(shadowHourValue)); //coloring the surface
}
}
})
//Property HeatedVolume
heatedVolumeSortPick.forEach((value, key) => {
if (key === gID) {
pickHeatedVolume = value
}
})
//Property TotalSurfaceArea
totalSurfaceAreaSortPick.forEach((value, key) => {
if (key === gID) {
var sum = 0
value.forEach(element => {
sum += element.totalSurfaceArea
});
pickTotalSurfaceArea = sum
}
})
//Property RoofType
roofTypeSortPick.forEach((value, key) => {
if (key === gID) {
pickRoofType = value
}
})
},
Cesium.ScreenSpaceEventType.LEFT_CLICK);
//Property UValue
uValueSortPick.forEach((value, key) => {
if (key === sID) {
pickUValue = value
function resetRoofColors() {
tileContent.forEach(t => {
if (t.getProperty("description").includes("Roof")) {
for (const [key, value] of Object.entries(shadowdata)) {
if (key === t.getProperty("gml_id")) {
t.color = Cesium.Color.WHITE;
}
})
}
}
});
}
/** Documentation:
* Function is used to calculate normalized pvPotential data
* it normalizes every value from the array
*/
var minAndMaxPvPotentials = [];
//getting the min and max for each attributes
function setMinAndMax(pvPotentialValue) {
let pvPotentials = [];
pvPotentialSurfaces.forEach(t => {
for (const [key, value] of Object.entries(t.attributes.pvPotential)) {
if (key === pvPotentialValue) {
pvPotentials.push(value);
}
}
});
pvPotentials = pvPotentials.sort(function(a, b) { return a - b; });
minAndMaxPvPotentials = [];
minAndMaxPvPotentials.push(pvPotentials[0]);
minAndMaxPvPotentials.push(pvPotentials[pvPotentials.length - 1]);
console.log("setMinAndMax calculated");
}
//calculating the normalized value for the selected pvPotential value
function getNormalizedValue(selectedPvPotentialValue) {
var normalizedValue;
if (minAndMaxPvPotentials[1] - minAndMaxPvPotentials[0] !== 0) {
normalizedValue = (selectedPvPotentialValue - minAndMaxPvPotentials[0]) / (minAndMaxPvPotentials[1] - minAndMaxPvPotentials[0]);
} else {
normalizedValue = 1;
}
return normalizedValue;
}
/**
* Used for the search address feature
*/
//load address
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (this.readyState == 4 && this.status == 200) {
var coordinate = JSON.parse(request.responseText);
var lat = coordinate.results[0].geometry.lat;
var lng = coordinate.results[0].geometry.lng;
console.log(lat + " " + lng);
fly(lat, lng);
}
}
//sending a request to the opencage api to convert the input to coordinates
function searchaddress() {
var query = document.getElementById('SearchAddress').value;
request.open("GET", 'https://api.opencagedata.com/geocode/v1/json?key=c73da14969e6408ab4535b3ad6dc43ea&pretty=1&no_annotations=1&q=' + query, true);
request.send();
}
//used to fly to the found position
function fly(lat, lng) {
var pinBuilder = new Cesium.PinBuilder();
var bluePin = viewer.entities.add({
name: "Blank blue pin",
position: Cesium.Cartesian3.fromDegrees(lng, lat),
billboard: {
image: pinBuilder.fromColor(Cesium.Color.ROYALBLUE, 48).toDataURL(),
verticalOrigin: Cesium.VerticalOrigin.BOTTOM,
},
});
viewer.zoomTo(bluePin);
viewer.flyTo(bluePin);
}
\ No newline at end of file
......@@ -4,7 +4,7 @@ var radio = document.getElementById('radio-group');
var filterswitches = document.getElementById('filterswitches');
//Show / hide chart
chartButton.addEventListener('click', function () {
chartButton.addEventListener('click', function() {
//sets as default attribute building function
myChartArea("bar", "Building Function", 1, "Building Type", "Frequency", coloR);
addGlobalData(areaChart, buildingType, btFrequency, btFrequency.length)
......@@ -24,7 +24,7 @@ chartButton.addEventListener('click', function () {
}
}, false);
heatingdemand.addEventListener('click', function () {
heatingdemand.addEventListener('click', function() {
var x = document.getElementById('heat-demand-legend');
if (!document.getElementById('checkbox2').checked) {
x.style.visibility = 'hidden';
......@@ -33,7 +33,7 @@ heatingdemand.addEventListener('click', function () {
}
}, false);
radio.addEventListener('click', function () {
radio.addEventListener('click', function() {
if (document.getElementById("surface").checked) {
document.getElementById("checkbox1").disabled = false;
document.getElementById("checkbox2").disabled = true;
......@@ -42,8 +42,7 @@ radio.addEventListener('click', function () {
document.getElementById('heat-demand-legend').style.visibility = 'hidden';
tileContent.forEach(t => t.color = new Cesium.Color(1, 1, 1, 1))
}
}
else {
} else {
document.getElementById("checkbox1").disabled = true;
document.getElementById("checkbox2").disabled = false;
if (document.getElementById("checkbox1").checked) {
......@@ -53,7 +52,7 @@ radio.addEventListener('click', function () {
}
}, false);
filterswitches.addEventListener('click', function () {
filterswitches.addEventListener('click', function() {
if (drawBox === false) {
swal("CAN'T LOAD DATA!", "mark an area first!", "error");
document.getElementById("checkbox2").disabled = true;
......@@ -62,8 +61,7 @@ filterswitches.addEventListener('click', function () {
if (document.getElementById("surface").checked) {
document.getElementById("checkbox1").disabled = false;
document.getElementById("checkbox2").disabled = true;
}
else {
} else {
document.getElementById("checkbox1").disabled = true;
document.getElementById("checkbox2").disabled = false;
}
......@@ -80,7 +78,7 @@ var dropdown = document.getElementsByClassName("dropdown-btn");
var i;
for (i = 0; i < dropdown.length; i++) {
dropdown[i].addEventListener("click", function () {
dropdown[i].addEventListener("click", function() {
this.classList.toggle("active");
var dropdownContent = this.nextElementSibling;
if (dropdownContent.style.display === "block") {
......
......@@ -104,7 +104,7 @@ function test() {
sortMap()
//color buildings with heating demand
document.getElementById("checkbox2").addEventListener("change", function () {
document.getElementById("checkbox2").addEventListener("change", function() {
if (this.checked) {
tileContent.forEach(t => {
let tileID = t.getProperty("gml_parent_id")
......@@ -124,7 +124,7 @@ function test() {
})
//color surfaces with uValue
document.getElementById("checkbox1").addEventListener("change", function () {
document.getElementById("checkbox1").addEventListener("change", function() {
if (this.checked) {
tileContent.forEach(t => {
let tileID = t.getProperty("gml_id")
......@@ -143,4 +143,3 @@ function test() {
}
})
}
......@@ -8,13 +8,11 @@
<!-- Tell IE to use the latest, best version. -->
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<!-- Make the application on mobile take up the full browser screen and disable user scaling. -->
<meta name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />
<!-- Website Title -->
<title>Team3dViewer!</title>
<!-- import bootstrap -->
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css" integrity="sha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO" crossorigin="anonymous">
<link href="https://cdnjs.cloudflare.com/ajax/libs/flag-icon-css/3.1.0/css/flag-icon.min.css" rel="stylesheet">
<!-- import font-awesome -->
......@@ -33,9 +31,11 @@
margin: 0;
overflow: hidden;
}
</style>
<script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/sweetalert/2.1.2/sweetalert.min.js" integrity="sha512-AA1Bzp5Q0K1KanKKmvN/4d3IRKVlv9PYgwFPvm32nPO6QS8yH1HO7LbgB1pgiOxPtfeg5zEn2ba64MUcqJx6CA==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<!-- TODO: maybe add this to a external js file -->
<script type="text/javascript">
var arrLang = {
'en': {
......@@ -105,22 +105,22 @@
};
// Process translation
$(function () {
$('.translate').click(function () {
$(function() {
$('.translate').click(function() {
var lang = $(this).attr('id');
if (lang === "de") {
document.getElementById("submitID").value = "Senden";
}
else if (lang === "en") {
} else if (lang === "en") {
document.getElementById("submitID").value = "Submit";
}
$('.lang').each(function (index, item) {
$('.lang').each(function(index, item) {
$(this).text(arrLang[lang][$(this).attr('key')]);
});
});
});
</script>
</head>
......@@ -150,8 +150,7 @@
<!--Chart and Dropup Button-->
<div id="areaChartContainer">
<div id="dupbutton" class="btn-group dropup">
<button type="button" class="btn btn-secondary dropdown-toggle lang" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false" key='attributes'>Attributes</button>
<button type="button" class="btn btn-secondary dropdown-toggle lang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" key='attributes'>Attributes</button>
<div class="dropdown-menu">
<button id="surfaceChartAttribute" class="dropdown-item lang" key="surface">Surface</button>
<button id="height" class="dropdown-item lang" type="button" key="height">Height</button>
......@@ -190,8 +189,7 @@
<!--small chart for single Building-->
<div id="singleChartContainer">
<div id="dupbutton2" class="btn-group dropup">
<button type="button" class="btn btn-secondary dropdown-toggle lang" data-toggle="dropdown" aria-haspopup="true"
aria-expanded="false" key="attributes">Attributes
<button type="button" class="btn btn-secondary dropdown-toggle lang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" key="attributes">Attributes
</button>
<div class="dropdown-menu">
<a id="monthlyHeating" class="dropdown-item lang" key="monthlyheating">Monthly Heating</a>
......@@ -211,7 +209,7 @@
</div>
<div class="hilfe">
<p> <a href="/pdf/Benutzerhandbuch.pdf" target="_blank"><button class="lang" id="Handbuch" key="userguide">User Guide</button></a></p>
<p> <a href="/3dclient4simstadtapi/public/pdf/Benutzerhandbuch.pdf" target="_blank"><button class="lang" id="Handbuch" key="userguide">User Guide</button></a></p>
</div>
<!--Sidebar-->
......@@ -235,26 +233,66 @@
<br><br>
<input id="submitID" type="button" class="btn btn-primary" value="Submit">
</div>
<!--SELECT Adresse-->
<div class="item">
<label class="lang" key="chooseaarea" id="arealabel" for="SearchAddress">Search Address:</label>
<input id="SearchAddress" type="text" size="15" name="SearchAddress">
<br><br>
<input id="SerachID" type="button" onclick="searchaddress()" class="btn btn-primary" value="Search">
</div>
<!--SELECT VIEW-->
<div class="item">
<div id="radio-group" class="cc-selector">
<input id="building" type="radio" name="credit-card" value="building" checked>
<div class="lang" key="buildingview">Building-View</div>
<label class="drinkcard-cc building" for="building"></label>
<input id="surface" type="radio" name="credit-card" value="surface">
<div class="lang" key="surfaceview">Surface-View</div>
<label class="drinkcard-cc surface" for="surface"></label>
<!-- <input id="solarPlanner" type="radio" name="credit-card" value="solarPlanner">
<div class="lang" key="solarPlannerView">Solar-Planner</div>
<label class="drinkcard-cc surface" for="solarPlanner"></label> -->
<!-- deprecated: Used for roof-view
<input id="roof" type="radio" name="credit-card" value="roof">
<div class="lang" key="roofview">Roof-View</div>
<label class="drinkcard-cc surface" for="roof"></label> -->
</div>
</div>
<!--Chartbutton-->
<div id="chartButton" class="button">
<div class='lang' key='chart'>Chart</div>
<!--Attributbutton-->
<button class="dropdown-btn">Choose an attribute<em class="fa fa-caret-down"></em></button>
<div class="dropdown-container">
<div class="dropp-header">
<a href="#" class="dropp-header__btn js-dropp-action">
<em class="item"></em>
</a>
</div>
<div class="dropp-body"></div>
<div class="select">
<select id="selectBox" size=1 style-width=100px onchange="chosenAttributeHandler(this);" >
<option selected disabled>Choose one</option>
<option class=specificYield key= specificYield id="specificYield" value="specificYield" type="selectBox">Specific Yield</option>
<option class=totalInvestment key="totalInvestment" id="totalInvestment" value="totalInvestment" type="selectBox">Total Investment</option>
<option class="maintenancePerYear" key="maintenancePerYear" value="maintenancePerYear" type="selectBox">Maintenance Per Year</option>
<option class="netPresentValue" key="netPresentValue" value="netPresentValue" type="selectBox">Net Present Value</option>
<option class="nominalPower" key="nominalPower" value="nominalPower" type="nominalPower">Nominal Power</option>
<option class="paybackPeriod" key="paybackPeriod" value="paybackPeriod" id="selectBox">Payback Period</option>
<option class="levelizedCostOfElectricity" key="levelizedCostOfElectricity" value="levelizedCostOfElectricity" type="selectBox">Levelized Cost Of Electricity</option>
<option class="internalRateOfReturn" key="internalRateOfReturn" value="internalRateOfReturn" type="selectBox">Internal Rate Of Return</option>
<option class="discountedPaybackPeriod" key="discountedPaybackPeriod" value="discountedPaybackPeriod" type="selectBox">Discounted Payback Period</option>
<option class="shadowValue" key="shadowValue" value="shadowValue" type="selectBox">Shadow Value</option>
</select>
<span class="focus"></span>
</div>
</div> <br>
<!--Draw-menu-->
<button class="dropdown-btn"><span class='lang' key='drawbox'>Draw box</span><i class="fa fa-caret-down"></i></button>
<div class="dropdown-container">
<button class="buttonBlue1" type="button" style="background: rgb(208, 247, 37)"
onclick="drawBounding()">
<button class="buttonBlue1" type="button" style="background: rgb(208, 247, 37)" onclick="drawBounding()">
<div class='lang' key='drawbox'>Draw box</div>
</button>
<br>
......@@ -265,7 +303,7 @@
<button class="buttonBlue1" type="button" style="background: rgb(90, 90, 90)" onclick="reset()">
<div class='lang' key='reset'>Reset</div>
</button>
</div>
</div><br>
<button class="dropdown-btn">Filter<i class="fa fa-caret-down"></i></button>
<div id="filterswitches" class="dropdown-container">
<br>
......@@ -283,6 +321,10 @@
<span class="slider round"></span>
</label>
</div>
</div> <br>
<div id="chartButton" class="button">
<div class='lang' key='chart'>Chart</div>
</div>
</div>
</div>
......@@ -327,21 +369,28 @@
</div>
</div>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"
integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous">
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js"
integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js" integrity="sha384-ZMP7rVo3mIykV+2+9J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49" crossorigin="anonymous">
</script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js"
integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous">
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js" integrity="sha384-ChfqqxuZUCnJSK3+MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy" crossorigin="anonymous">
</script>
<script type="text/javascript" src="js/colorPalettes.js"></script>
<script type="text/javascript" src="js/searchadress.js"></script>
<script type="text/javascript" src="js/fillTableProperties.js"></script>
<script type="text/javascript" src="js/sidebar.js"></script>
<script type="text/javascript" src="js/globe.js"></script>
<script type="text/javascript" src="js/areaCharts.js"></script>
<script type="text/javascript" src="js/connectToAPI.js"></script>
<script type="text/javascript" src="js/draw.js"></script>
<script type="text/javascript" src="js/buildingCharts.js"></script>
<script type="text/javascript" src="js/pvPotentialNormalization.js"></script>
</body>
</html>
This diff is collapsed.
This diff is collapsed.
{
"asset" : {
"version" : "0.0"
},
"properties" : {
"gml_id" : {},
"gml_parent_id" : {},
"description" : {},
"feature_type" : {}
},
"geometricError" : 84.7033050210448,
"root" : {
"boundingVolume" : {
"box" : [ 4157183.4193600416, 671263.025354151, 4774688.139831596, 209.53922537481412, 0, 0, 0, 226.20286488952115, 0, 0, 0, 159.76538479700685 ]
},
"geometricError" : 84.7033050210448,
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157183.0913853333, 671276.9167505095, 4774688.139831596, 208.88327595870942, 0, 0, 0, 198.420072172652, 0, 0, 0, 159.76538479700685 ]
},
"url" : "/public/test/tileset/data/data0.b3dm"
},
"children" : [
{
"boundingVolume" : {
"box" : [ 4157228.114850776, 671251.5544893676, 4774660.327885907, 43.80110447667539, 0, 0, 0, 12.856712591368705, 0, 0, 0, 53.52015439514071 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157228.114850776, 671251.5544893676, 4774660.327885907, 43.80110447667539, 0, 0, 0, 12.856712591368705, 0, 0, 0, 53.52015439514071 ]
},
"url" : "/public/test/tileset/data/data1.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157259.0075245854, 671237.0161895596, 4774633.671508187, 58.36289628734812, 0, 0, 0, 60.476301041897386, 0, 0, 0, 50.82873797882348 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157259.0075245854, 671237.0161895596, 4774633.671508187, 58.36289628734812, 0, 0, 0, 60.476301041897386, 0, 0, 0, 50.82873797882348 ]
},
"url" : "/public/test/tileset/data/data2.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157260.196087419, 671251.9858865617, 4774636.8328062985, 25.79576786607504, 0, 0, 0, 29.950261512654833, 0, 0, 0, 44.506141755729914 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157260.196087419, 671251.9858865617, 4774636.8328062985, 25.79576786607504, 0, 0, 0, 29.950261512654833, 0, 0, 0, 44.506141755729914 ]
},
"url" : "/public/test/tileset/data/data3.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157223.877246985, 671278.8423610204, 4774660.5079447515, 20.377759689930826, 0, 0, 0, 193.8928428903455, 0, 0, 0, 22.34141970332712 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157223.877246985, 671278.8423610204, 4774660.5079447515, 20.377759689930826, 0, 0, 0, 193.8928428903455, 0, 0, 0, 22.34141970332712 ]
},
"url" : "/public/test/tileset/data/data4.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157211.0689755557, 671179.0722945668, 4774667.161378037, 61.64202992897481, 0, 0, 0, 58.29674572101794, 0, 0, 0, 57.427568226121366 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157211.0689755557, 671179.0722945668, 4774667.161378037, 61.64202992897481, 0, 0, 0, 58.29674572101794, 0, 0, 0, 57.427568226121366 ]
},
"url" : "/public/test/tileset/data/data5.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157225.063591961, 671175.3949235276, 4774673.084528787, 21.286791074555367, 0, 0, 0, 20.521639954065904, 0, 0, 0, 20.94711357820779 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157225.063591961, 671175.3949235276, 4774673.084528787, 21.286791074555367, 0, 0, 0, 20.521639954065904, 0, 0, 0, 20.94711357820779 ]
},
"url" : "/public/test/tileset/data/data6.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157172.530755615, 671226.8655617537, 4774696.573534641, 138.71846981020644, 0, 0, 0, 106.83504467795137, 0, 0, 0, 116.25188143644482 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157172.530755615, 671226.8655617537, 4774696.573534641, 138.71846981020644, 0, 0, 0, 106.83504467795137, 0, 0, 0, 116.25188143644482 ]
},
"url" : "/public/test/tileset/data/data7.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157234.735237984, 671184.0981509301, 4774663.504809576, 1.9434990277513862, 0, 0, 0, 3.1151851491304114, 0, 0, 0, 1.7876751571893692 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157234.735237984, 671184.0981509301, 4774663.504809576, 1.9434990277513862, 0, 0, 0, 3.1151851491304114, 0, 0, 0, 1.7876751571893692 ]
},
"url" : "/public/test/tileset/data/data8.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157192.6996459886, 671343.1874950464, 4774673.3595239995, 76.89431473286822, 0, 0, 0, 65.87858309876174, 0, 0, 0, 87.54443842731416 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157192.6996459886, 671343.1874950464, 4774673.3595239995, 76.89431473286822, 0, 0, 0, 65.87858309876174, 0, 0, 0, 87.54443842731416 ]
},
"url" : "/public/test/tileset/data/data9.b3dm"
}
},
{
"boundingVolume" : {
"box" : [ 4157146.0018855724, 671293.6001087409, 4774719.744891234, 134.70427643693984, 0, 0, 0, 99.23852986039128, 0, 0, 0, 96.55526552256197 ]
},
"refine" : "ADD",
"content" : {
"boundingVolume" : {
"box" : [ 4157146.0018855724, 671293.6001087409, 4774719.744891234, 134.70427643693984, 0, 0, 0, 99.23852986039128, 0, 0, 0, 96.55526552256197 ]
},
"url" : "/public/test/tileset/data/data10.b3dm"
}
}
]
}
}
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment