From fa93cf6bb158533f9c4d8a26436425039240bc84 Mon Sep 17 00:00:00 2001
From: Tor-Einar Skog <tor-einar.skog@nibio.no>
Date: Mon, 23 Oct 2023 12:31:30 +0200
Subject: [PATCH] First working slider prototype

---
 spatial/static/spatial/js/slidingMap.js   | 67 +++++++++++++++++++++++
 spatial/templates/spatial/slidingMap.html | 32 +++++++++++
 spatial/urls.py                           |  1 +
 spatial/views.py                          |  4 ++
 4 files changed, 104 insertions(+)
 create mode 100644 spatial/static/spatial/js/slidingMap.js
 create mode 100644 spatial/templates/spatial/slidingMap.html

diff --git a/spatial/static/spatial/js/slidingMap.js b/spatial/static/spatial/js/slidingMap.js
new file mode 100644
index 00000000..0d8e39eb
--- /dev/null
+++ b/spatial/static/spatial/js/slidingMap.js
@@ -0,0 +1,67 @@
+proj4.defs(
+    'EPSG:25833',
+    '+proj=utm +zone=33 +ellps=GRS80 +units=m +no_defs'
+);
+
+let layers = [];
+
+function switchLayer(visibleLayerIndex)
+{
+    console.info(layers.length + " layers available. Index=" + visibleLayerIndex);
+    for(let i=0;i<layers.length;i++)
+    {
+        layers[i].setVisible(i==visibleLayerIndex);
+    }
+}
+
+function initSlidingMap(lonLat, zoomLevel, mapAttribution) {
+	var map;
+
+    var backgroundLayer = new ol.layer.Tile({
+		source: new ol.source.OSM({
+			attributions: [
+				new ol.Attribution({
+					html: mapAttribution
+				})
+			]
+		})
+	});
+
+    for(let i=2;i<=6;i++)
+    {
+        layers.push(
+            new ol.layer.Image({
+                source: new ol.source.ImageWMS({
+                    url: 'https://testvips.nibio.no/cgi-bin/SEPTREFHUM',
+                    params: { 'LAYERS': 'SEPTREFHUM.WARNING_STATUS 2023-10-0' + i, 'TRANSPARENT': 'TRUE' },
+                    serverType: 'mapserver',
+                    ratio: 1,
+                    projection: ol.proj.get('EPSG:25833')
+                }),
+                visible: (i==2),
+                opacity: 0.5
+            })
+        );
+    }
+
+    
+
+
+	// Creating the map
+	map = new ol.Map({
+		target: "mapContainer",
+		layers: [backgroundLayer].concat(layers),
+		renderer: 'canvas'
+	});
+
+
+	// Setting zoom and center for the map (need to do this after creating map. so that we can transform our
+	// center to correct map projection)
+	var view = new ol.View({
+		center: ol.proj.transform(lonLat, 'EPSG:4326', map.getView().getProjection().getCode()),
+		zoom: 5,
+		maxMapZoom: 10,
+	});
+	map.setView(view);
+
+}
\ No newline at end of file
diff --git a/spatial/templates/spatial/slidingMap.html b/spatial/templates/spatial/slidingMap.html
new file mode 100644
index 00000000..03dd72a3
--- /dev/null
+++ b/spatial/templates/spatial/slidingMap.html
@@ -0,0 +1,32 @@
+{% extends "base.html" %}
+
+{% load i18n l10n static forecast_extras template_helper %}
+{% block title%}{% trans "Welcome" %}{%endblock%}
+{% block customCSS %}
+<link rel="stylesheet" href="{% static "css/3rdparty/ol.css" %}" type="text/css">
+{% endblock %}
+{% block customJS %}
+<script type="text/javascript" src="{% url "javascript-catalog" %}"></script>
+<script type="text/javascript" src="{% static "js/3rdparty/ol.js" %}"></script>
+<script type="text/javascript" src="{% static "js/3rdparty/proj4.js" %}"></script>
+<script type="text/javascript" src="{% static "js/3rdparty/moment.min.js" %}"></script>
+<script type="text/javascript" src="{% static "js/util.js" %}"></script>
+<script type="text/javascript" src="{% url "views.settings_js" %}"></script>
+<script type="text/javascript" src="{% static "spatial/js/slidingMap.js" %}"></script>
+<script type="text/javascript">
+	$(document).ready(function() {
+		var longitude = {{settings.MAP_CENTER_LONGITUDE|unlocalize}};
+		var latitude = {{settings.MAP_CENTER_LATITUDE|unlocalize}};
+		var zoomLevel = {{settings.MAP_ZOOMLEVEL}};
+		initSlidingMap([longitude,latitude],zoomLevel,"{{settings.MAP_ATTRIBUTION|safe}}");
+	});
+</script>
+{% endblock %}
+
+{% block content %}
+		<!-- Start map container -->
+		<div class="col-md-12" id="mapContainer" />
+        <div class="slidecontainer">
+            <input type="range" min="0" max="4" value="0" id="myRange" onchange="switchLayer(parseInt(this.value));">
+          </div>
+{% endblock %}
\ No newline at end of file
diff --git a/spatial/urls.py b/spatial/urls.py
index face25c4..8b214f93 100644
--- a/spatial/urls.py
+++ b/spatial/urls.py
@@ -6,4 +6,5 @@ app_name='spatial'
 
 urlpatterns = [
     re_path(r'^$', views.index, name='index'),
+    re_path(r'slidingmap/', views.slidingmap, name='slidingmap'),
 ]
diff --git a/spatial/views.py b/spatial/views.py
index ab1cdacc..d5fac614 100644
--- a/spatial/views.py
+++ b/spatial/views.py
@@ -4,3 +4,7 @@ from django.shortcuts import render
 def index(request):
     context = {}
     return render(request, 'spatial/index.html', context)
+
+def slidingmap(request):
+    context = {}
+    return render(request, 'spatial/slidingMap.html', context)
-- 
GitLab