Skip to content
Snippets Groups Projects
Commit cc2309e4 authored by Jakob Severin Steffensen Hjelseth's avatar Jakob Severin Steffensen Hjelseth
Browse files

Ferdigstille

parent f52845b3
No related branches found
No related tags found
2 merge requests!73Dev,!72Resolve "Egnethetsanalyse / prioritering"
......@@ -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">
......
......@@ -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;
}
......@@ -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();
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment