diff --git a/javascript/buffer.js b/javascript/buffer.js index f1378859efa67c6c3499255d81d1a26c56012995..8521b391f426f094c59cee21380eeeaeda9c56a4 100644 --- a/javascript/buffer.js +++ b/javascript/buffer.js @@ -36,6 +36,11 @@ function makeBuffer() { var buffer = turf.buffer(layer, distance, {units: "meters"}); // Lager buffer if (document.getElementById("bufferCheck").checked) { // Om en har huket av for at en skal 'dissolve' gjøres det + + if (isMultiPolygon(buffer)) { // Kan ikke sende MultiPolygon inn i dissolved + buffer = fixMultiPolygons(buffer); + } + var dissolved = turf.dissolve(buffer); var newLayer = L.geoJSON(dissolved, {style: getStyle()}); } else { // Ellers lager den bare mange ulike buffer-soner diff --git a/javascript/dissolve.js b/javascript/dissolve.js index bd453b3c5319e7c1f1b3cee5fc0557b50437d100..ea1a382a89490cf27c621a13f883f247907dbee2 100644 --- a/javascript/dissolve.js +++ b/javascript/dissolve.js @@ -22,6 +22,11 @@ function doDissolve() { // Prøver å kjøre dissolve-funksjonen: try { + + if (isMultiPolygon(layer)) { // Kan ikke sende MultiPolygon inn i dissolved + layer = fixMultiPolygons(layer); + } + var dissolved = turf.dissolve(layer); // Kjører dissolve var newLayer = L.geoJSON(dissolved, {style: getStyle()}); diff --git a/javascript/sidebar&boxes.js b/javascript/sidebar&boxes.js index 6b6359c40c99129371616f0deff2498e97cc787a..a4c065498974cfd8411974ca8b235db7d7f7d2ca 100644 --- a/javascript/sidebar&boxes.js +++ b/javascript/sidebar&boxes.js @@ -59,13 +59,28 @@ function closeBox(id) { // Lukker aktuell boks og justerer siden motsatt av hva // Fyller select i de ulike boksene med alternativ: +function isPolygon(layer) { + var objects = layer["features"]; + for (var i = 0; i < objects.lenght; i++) { + if (objects[i]["geometry"]["type"] == "Polygon") { + return true; + } + } + return false; +} + function fillSelect(id) { var select = document.getElementById(id); select.innerHTML = ""; select.add(new Option(text="- - -")); for (key in overlayMaps) { - select.add(new Option(text = key, value = key)); + if (id == "bufferSelect") { + select.add(new Option(text = key, value = key)); + } + else if (id != "bufferSelect" && isPolygon(overlayMaps[key])) { + select.add(new Option(text = key, value = key)); + } } } diff --git a/javascript/turfFormatConverter.js b/javascript/turfFormatConverter.js index 6e562a9eb1aece2c5e61acc9bffd730adf641845..85a629fc9a06cebefe4342be445655b6f9211502 100644 --- a/javascript/turfFormatConverter.js +++ b/javascript/turfFormatConverter.js @@ -17,15 +17,33 @@ function featureCollectionToMultiPolygon(layer) { // Funksjon som gjør om featu } function isMultiPolygon(layer) { // Inneholder 'layer' features som er MultiPolygon? - if (layer["geometry"]["type"] == "MultiPolygon") { - return true; + var more = false; + + try { // Justerer i forhold til hvor mye innhold 'layer' har + if (layer["features"]) { + more = true; + } + } catch {} + + if (more) { + for (var i = 0; i < layer["features"].length; i++) { + if (layer["features"][i]["geometry"]["type"] == "MultiPolygon") { + return true; + } + } + } else { + if (layer["geometry"]["type"] == "MultiPolygon") { + return true; + } } return false; } -function multiPolygonToFeatureCollection(layer) {// Funksjon som gjør om features i 'layer' til FeatureCollection istedenfor MultiPolygon +function multiPolygonToFeatureCollection(layer) { // Funksjon som gjør om features i 'layer' til FeatureCollection istedenfor MultiPolygon // 'layer' er her et GeoJSON-lag - var features = []; + + features = []; + for (var i = 0; i < layer["geometry"]["coordinates"].length; i++) { var geometry = { "type": "Polygon", @@ -33,9 +51,47 @@ function multiPolygonToFeatureCollection(layer) {// Funksjon som gjør om featur }; features.push(turf.feature(geometry)); } + return turf.featureCollection(features); } +function fixMultiPolygons(layer) { // Annen variant som løser MultiPolygon-problemet for de ulike GIS-funksjonene + var features = layer["features"]; + var k = features.length; + + for (var i = 0; i < k; i++) { + /* + Her itererer en gjennom alle features i FeatureCollection, + plukker ut alle features som er registrert som MultiPolygon, + og gjør dem om til flere Polygons + */ + if (features[i]["geometry"]["type"] == "MultiPolygon") { // Er det MultiPolygon? + var coord = features[i]["geometry"]["coordinates"]; // Henter geometrien til alle Polygonene + // Oppdaterer første polygon: + features[i]["geometry"]["type"] = "Polygon"; + features[i]["geometry"]["coordinates"] = coord[0]; + for (var j = 1; j < coord.length; j++) { + // Lager så nye features for resten av polygonene i MultiPolygonet: + var newFeature = {}; + for (key in features[i]) { // Vil ha de samme nøklene og deres verdier som originalen + if (key != "geometry") { // ... men ikke lik geometri + newFeature[key] = features[i][key]; + } + } + newFeature["geometry"] = { // Legger til geometri + "type": "Polygon", + "coordinates": coord[j] // Henter koordinat fra original-lista + }; + features.push(newFeature); // Legger til ny feature + } + } + } + + layer["features"] = features; // Oppdaterer features-lista + + return layer; +} + /* Håndtering av input-filer fra bruker for å få de på rett format egnet for turf-operasjoner */