diff --git a/index.html b/index.html index 465c80b3a3ea87ad38bb09c6cb72afad5153f592..64f15a1c0c3726630f8bdc985ab7fdd543058245 100644 --- a/index.html +++ b/index.html @@ -76,7 +76,7 @@ <button id="exampleData" class="onClick" onclick="loadExampleData()">Click here to load the sample datasets</button> </div> - <div id="layers" style="font-family: monospace; margin-left: 1vw; margin-top: 2vh; font-size: 18px; height: 53vh; overflow-y: scroll;"></div> + <div id="layers" style="font-family: monospace; margin-left: 1vw; margin-top: 2vh; font-size: 18px; height: 52vh; overflow-y: scroll;"></div> </div> <div id="map" style="position: relative; z-index: 1; height: 80vh;"> @@ -203,7 +203,7 @@ <path d="M16 8A8 8 0 1 1 0 8a8 8 0 0 1 16 0zM5.354 4.646a.5.5 0 1 0-.708.708L7.293 8l-2.647 2.646a.5.5 0 0 0 .708.708L8 8.707l2.646 2.647a.5.5 0 0 0 .708-.708L8.707 8l2.647-2.646a.5.5 0 0 0-.708-.708L8 7.293 5.354 4.646z"/> </svg> </div> - + <p>Choose map layers in prioritised order:</p> <div id="priorityDiv"> @@ -217,7 +217,11 @@ </div> </div> - <p>Hei 8)</p> + <p>Give this suitability analyse a cathegory name:</p> + + <input id="suitabilityName"><br> + + <button class="button" style="font-size: 25px; margin-top: 4vh;" onclick="suitability()">Calculate suitable areas</button> </div> <div id="unionBox" class="box"> diff --git a/javascript/leafletLayerControl.js b/javascript/leafletLayerControl.js index 998ffb727c26cb8384763c13fc739285d50ed22a..aed39662e70ab26dabd559148b1f5b20c8813d09 100644 --- a/javascript/leafletLayerControl.js +++ b/javascript/leafletLayerControl.js @@ -85,7 +85,7 @@ function checkExampleData() { exampleLoaded = false; document.getElementById("exampleData").style.display = "block"; - document.getElementById("layers").style.height = "53vh"; + document.getElementById("layers").style.height = "52vh"; } function handleLayer(name) { // Funksjon som viser og skjuler kartlag i kartet og endrer farge på knappene i sidebaren avhengig av lagets synlighet @@ -121,3 +121,12 @@ function doLayerExist(name) { } return false; } + +function doLayerExist2(name) { + for (key in overlayMaps) { + if (key.toString().slice(0, -1) == name) { + return true; + } + } + return false; +} diff --git a/javascript/suitability.js b/javascript/suitability.js index 74f7ca7e8250a64918e0a1ce01930ac315de7070..8e7fa27c0bdd30640c823afe63ca2c918ff60a76 100644 --- a/javascript/suitability.js +++ b/javascript/suitability.js @@ -24,5 +24,185 @@ function removePrioritizedLayer(numb) { } function suitability() { + // Sjekker at det er gitt inn navn: + var regex = /^[a-zA-Z_0-9]+$/; + if (!document.getElementById("suitabilityName").value) { + return alert("You need to choose a name for the new layer!"); + } else if (!document.getElementById("suitabilityName").value.match(regex)) { + return alert("The new name must consist of normal letters!"); + } else if (doLayerExist2(document.getElementById("suitabilityName").value)) { + return alert("Choose another name! There exists already a layer with that name.") + } + categoryName = document.getElementById("suitabilityName").value; + + // Henter aktuelle element: + var numb = document.getElementById("priorityDiv").childElementCount; + var priEl = []; + for (var i = 1; i < numb + 1; i++) { + priEl.push("priority" + i.toString()); + } + + // Finner alle mulige kombinasjoner av elementene: + priEl = getCombinations(priEl); + + // Beregner poengscore for hver kombinasjon: + + var scores = getScores(numb, priEl); + + // Sorterer lista basert på score: + + priEl = insertionSort(priEl, scores); + + // Lager de ulike kartlagene med intersect: + + var newLayers = []; + + for (var i = 0; i < priEl.length; i++) { + if (priEl[i].length == 1) { + var a = getMapLayer(priEl[i][0]); + if (a == null) { + return alert("You need to choose all layers!"); + } + newLayers.push(a); + } else { + var a = getMapLayer(priEl[i][0]); + if (a == null) { + return alert("You need to choose all layers!"); + } + var newLayer = featureCollectionToMultiPolygon(a); + for (var j = 1; j < priEl[i].length; j++) { + var b = getMapLayer(priEl[i][j]); + if (b == null) { + return alert("You need to choose all layers!"); + } + var layer = featureCollectionToMultiPolygon(b); + newLayer = turf.intersect(newLayer, layer); + } + newLayers.push(newLayer); + } + } + + // Bruker difference for å unngå overlappende kartlag: + + for (var i = 1; i < newLayers.length; i++) { + for (var j = 0; j < i; j++) { + + var a = newLayers[i]; + var b = newLayers[j]; + + if (a == undefined || b == undefined) { + break; + } + + if (!isMultiPolygon(a)) { + a = featureCollectionToMultiPolygon(a); + } + if (!isMultiPolygon(b)) { + b = featureCollectionToMultiPolygon(b); + } + + newLayers[i] = turf.difference(a, b); + } + } + + // Gjør om tilbake til FeatureCollection fra MultiPolygon: + for (var i = 0; i < newLayers.length; i++) { + if (newLayers[i] == undefined) { + continue; + } else if (isMultiPolygon(newLayers[i])) { + newLayers[i] = multiPolygonToFeatureCollection(newLayers[i]); + } + } + + // Legger til de nye lagene som har innhold i kartet: + + // Karakteristiske farger for lagene: + // Rødt: "rgb(255,0,0)" Grønt: "rgb(0,255,0)" + + var intervall = 255 / (newLayers.length - 1); + var r = 0; + var g = 255; -} \ No newline at end of file + for (var i = 0; i < newLayers.length; i++) { + if (newLayers[i] == undefined) { + continue; + } + var name = categoryName + (i+1).toString(); + + var newLayer = L.geoJSON(newLayers[i], {style: {color: "rgb(" + r.toString() + "," + g.toString() + ",0)"}}); + r += intervall; + g += -intervall; + overlayMaps[name] = newLayer; + updateSidebar(); + handleLayer(name); + } + + document.getElementById("suitabilityName").value = ""; + for (var i = 2; i <= numb; i++) { + removePrioritizedLayer(i); + } + fillSelect("priority1"); +} + +function getCombinations(valuesArray) { + var combi = []; + var temp = []; + var slent = Math.pow(2, valuesArray.length); + + for (var i = 0; i < slent; i++) { + temp = []; + for (var j = 0; j < valuesArray.length; j++) { + if ((i & Math.pow(2, j))) { + temp.push(valuesArray[j]); + } + } + if (temp.length > 0) { + combi.push(temp); + } + } + + combi.sort((a, b) => b.length - a.length); + //console.log(combi.join("\n")); + return combi; +} + +function getScores(numb, list) { + var scores = {}; + for (var i = 0; i < list.length; i++) { + var score = 0; + for (var j = 0; j < list[i].length; j++) { + score += numb + 1 - parseInt(list[i][j].slice(-1)); + } + scores[list[i]] = score; + } + return scores; +} + +function insertionSort(list, dict) { + sorted = [list[0]] + for (var i = 1; i < list.length; i++) { + if (dict[list[i]] < dict[sorted[sorted.length - 1]]) { + sorted.push(list[i]); + } else { + for (var j = 0; j < sorted.length; j++) { + if (dict[sorted[j]] <= dict[list[i]]) { + sorted.push(sorted[sorted.length - 1]); + for (var k = sorted.length - 2; k > j; k--) { + sorted[k] = sorted[k - 1]; + } + sorted[j] = list[i]; + break; + } + } + } + } + return sorted; +} + +function getMapLayer(string) { + var input = document.getElementById(string).value; + if (input == "- - -") { + return null; + } + return overlayMaps[input].toGeoJSON(); +}