]> ToastFreeware Gitweb - philipp/winterrodeln/wradmin.git/commitdiff
Created a tool to determine coordinates from points
authorphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Mon, 6 Apr 2009 20:24:01 +0000 (20:24 +0000)
committerphilipp <philipp@7aebc617-e5e2-0310-91dc-80fb5f6d2477>
Mon, 6 Apr 2009 20:24:01 +0000 (20:24 +0000)
git-svn-id: http://www.winterrodeln.org/svn/servermediawiki/trunk/wradmin@447 7aebc617-e5e2-0310-91dc-80fb5f6d2477

wradmin/wradmin/controllers/maptool.py [new file with mode: 0644]
wradmin/wradmin/public/gmapGasthaus.png [new file with mode: 0644]
wradmin/wradmin/public/gmap_rodelbahn_c.png [new file with mode: 0644]
wradmin/wradmin/public/gmap_rodelbahn_c_s.png [new file with mode: 0644]
wradmin/wradmin/templates/maptool.html [new file with mode: 0644]
wradmin/wradmin/templates/master.html

diff --git a/wradmin/wradmin/controllers/maptool.py b/wradmin/wradmin/controllers/maptool.py
new file mode 100644 (file)
index 0000000..b4efafa
--- /dev/null
@@ -0,0 +1,22 @@
+#!/usr/bin/python2.5
+# -*- coding: iso-8859-15 -*-
+
+from pylons.decorators import jsonify
+from wradmin.lib.base import BaseController, render
+import wradmin.model as model
+
+
+class MaptoolController(BaseController):
+
+    def index(self):
+        return render('maptool.html')
+    
+    @jsonify
+    def ajax_sledding(self):
+        # Putting the result in a dict is not necessary but avoids a warning that array type jsonified data are cross-site data leak attackable
+        return {'sledding': model.meta.Session.query(model.WrSleddingCache.page_title, model.WrSleddingCache.position_latitude, model.WrSleddingCache.position_longitude).filter('position_latitude is not null and position_longitude is not null').all()}
+
+    @jsonify
+    def ajax_inns(self):
+        # Putting the result in a dict is not necessary but avoids a warning that array type jsonified data are cross-site data leak attackable
+        return {'inns': model.meta.Session.query(model.WrInnCache.page_title, model.WrInnCache.position_latitude, model.WrInnCache.position_longitude).filter('position_latitude is not null and position_longitude is not null').all()}
diff --git a/wradmin/wradmin/public/gmapGasthaus.png b/wradmin/wradmin/public/gmapGasthaus.png
new file mode 100644 (file)
index 0000000..9aae161
Binary files /dev/null and b/wradmin/wradmin/public/gmapGasthaus.png differ
diff --git a/wradmin/wradmin/public/gmap_rodelbahn_c.png b/wradmin/wradmin/public/gmap_rodelbahn_c.png
new file mode 100644 (file)
index 0000000..f81be25
Binary files /dev/null and b/wradmin/wradmin/public/gmap_rodelbahn_c.png differ
diff --git a/wradmin/wradmin/public/gmap_rodelbahn_c_s.png b/wradmin/wradmin/public/gmap_rodelbahn_c_s.png
new file mode 100644 (file)
index 0000000..1c56435
Binary files /dev/null and b/wradmin/wradmin/public/gmap_rodelbahn_c_s.png differ
diff --git a/wradmin/wradmin/templates/maptool.html b/wradmin/wradmin/templates/maptool.html
new file mode 100644 (file)
index 0000000..3d3d249
--- /dev/null
@@ -0,0 +1,279 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
+                      "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+    xmlns:py="http://genshi.edgewall.org/"
+    xmlns:xi="http://www.w3.org/2001/XInclude">
+<xi:include href="master.html" />
+
+<head>
+<title>Map-Tool</title>
+
+<script type="text/javascript"> </script>
+<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAVDRl0qsoeYOspQi0txxVEhTO7xxs0m3ls_NApg8LzilP9E0D3hScAc_5O_qu8-pbIbSF5h8xfGEcjA" type="text/javascript"> </script>
+<script src="/yui/yahoo-dom-event/yahoo-dom-event.js" type="text/javascript"> </script>
+<script src="/yui/connection/connection-min.js" type="text/javascript"> </script>
+<script src="/yui/json/json-min.js" type="text/javascript"> </script>
+
+<script type="text/javascript">
+// <![CDATA[
+
+// Functions for simulated assoziative array
+// -----------------------------------------
+// key is integer, value is GMarker
+// as described in file:///usr/share/doc/selfhtml/html/javascript/objekte/array.htm
+// aa has to be created with new Object()
+//
+// Remove an element: delete aa[key];
+// Return an element: aa[key]
+
+
+// Appends the value and returns the key
+function aa_get_unused_key(aa) {
+    var key = 1;
+    for (var k in aa) if (Number(k) >= key) key = Number(k) + 1;
+    return key;
+}
+
+// Appends the value and returns the key
+function aa_insert(aa, value) {
+    var key = aa_get_unused_key(aa);
+    aa[key] = value;
+    return key;
+}
+
+// Length of the assoziative array
+function aa_length(aa) {
+    var length = 0;
+    for (var key in aa) ++length;
+    return length;
+}
+
+
+// The map
+// -------
+var wrMap;
+
+
+// Marker Lists
+// ------------
+var wrSleddingMarkers = new Array(); // contains all sledding route markers
+var wrInnMarkers = new Array(); // contains all inn markers
+var wrRefMarkers = new Object(); // contains all reference markers as simulated assoziative array
+
+
+// Accuracy info
+// -------------
+
+function setAccuracyInfo(html) {
+    document.getElementById("accuracy").innerHTML = html;
+}
+
+
+function updateAccuracyInfo(wrMap, latlng) {
+    var pixel = wrMap.fromLatLngToContainerPixel(latlng);
+    var pixel_d = new GPoint(pixel.x - 1, pixel.y + 1)
+    var latlng_d = wrMap.fromContainerPixelToLatLng(pixel_d);
+    var accuracy = latlng.distanceFrom(latlng_d); // in m
+    var accuracy_s = (accuracy > 10) ? accuracy.toFixed(0) : accuracy.toFixed(1);
+    setAccuracyInfo("Genauigkeit: 1 Pixel entspricht " + accuracy_s + " Metern");
+}
+
+
+// Position info
+// -------------
+
+function setPositionInfo(html) {
+    document.getElementById("mapinfo").innerHTML = html;
+}
+
+
+// The precision digits is optional
+function updatePositionInfo(wrMap, latlng, description, digits) {
+    var pixel = wrMap.fromLatLngToContainerPixel(latlng);
+    var pixel_d = new GPoint(pixel.x - 1, pixel.y + 1)
+    var latlng_d = wrMap.fromContainerPixelToLatLng(pixel_d);
+    if (YAHOO.lang.isUndefined(digits)) {
+        var fix_lat = Math.ceil(Math.abs(Math.log(latlng.lat() - latlng_d.lat())/Math.LN10))
+        var fix_lng = Math.ceil(Math.abs(Math.log(latlng.lng() - latlng_d.lng())/Math.LN10))
+    } else {
+        var fix_lat = digits;
+        var fix_lng = digits;
+    }
+    var lat_s = latlng.lat().toFixed(fix_lat);
+    var lng_s = latlng.lng().toFixed(fix_lng);
+    setPositionInfo(description + ": <strong>" + lat_s + " N " + lng_s + " E</strong> (" + lat_s + ", " + lng_s + ")");
+}
+
+
+// Sledding and Inn lists
+// ----------------------
+
+function initSledding(wrMap) {
+    // Icon
+    var wrSleddingIcon = new GIcon(G_DEFAULT_ICON);
+    wrSleddingIcon.image = "/gmap_rodelbahn_c.png";
+    wrSleddingIcon.shadow = "/gmap_rodelbahn_c_s.png";
+    wrSleddingIcon.iconSize = new GSize(17, 17);
+    wrSleddingIcon.shadowSize = new GSize(23, 23);
+    wrSleddingIcon.iconAnchor = new GPoint(9, 9);
+    wrSleddingIcon.infoWindowAnchor = new GPoint(9, 9);
+    
+    // Add one sledding route
+    function addSleddingMarker(latitude, longitude, name) {
+        var latlng = new GLatLng(latitude, longitude);
+        var marker = new GMarker(latlng, {icon: wrSleddingIcon, title: name});
+        function openSleddingInfoWindow() {
+            var lat_s = latlng.lat().toFixed(6);
+            var lng_s = latlng.lng().toFixed(6);
+            marker.openInfoWindowHtml(name + "<br/><strong>" + lat_s + " N " + lng_s + " E</strong><br/>" + lat_s + ", " + lng_s);
+        }
+        GEvent.addListener(marker, "click", openSleddingInfoWindow);
+        wrSleddingMarkers.push(marker);
+        wrMap.addOverlay(marker);
+        return marker;
+    }
+    
+    // AJAX call
+    var callback = {
+        success: function(o) {
+            sleddings = YAHOO.lang.JSON.parse(o.responseText).sledding;
+            for (var i = 0; i < sleddings.length; ++i) addSleddingMarker(sleddings[i][1], sleddings[i][2], sleddings[i][0]);
+        },
+        failure: function(o) {alert("Konnte die Rodelbahnen-Daten nicht vom Server laden");}
+    }
+    var url = "${h.url_for(controller='maptool', action='ajax_sledding')}";
+    YAHOO.util.Connect.asyncRequest('GET', url, callback, null);
+}
+
+
+function initInns(wrMap) {
+    // Icon
+    var wrInnIcon = new GIcon(G_DEFAULT_ICON);
+    wrInnIcon.image = "/gmapGasthaus.png";
+    
+    // Add one inn
+    function addInnMarker(latitude, longitude, name) {
+        var latlng = new GLatLng(latitude, longitude);
+        var marker = new GMarker(latlng, {icon: wrInnIcon, title: name});
+        function openInnInfoWindow() {
+            var lat_s = latlng.lat().toFixed(6);
+            var lng_s = latlng.lng().toFixed(6);
+            marker.openInfoWindowHtml(name + "<br/><strong>" + lat_s + " N " + lng_s + " E</strong><br/>" + lat_s + ", " + lng_s);
+        }
+        GEvent.addListener(marker, "click", openInnInfoWindow);
+        wrInnMarkers.push(marker);
+        wrMap.addOverlay(marker);
+        return marker;
+    }
+    
+    // AJAX call
+    var callback = {
+        success: function(o) {
+            inns = YAHOO.lang.JSON.parse(o.responseText).inns;
+            for (var i = 0; i < inns.length; ++i) addInnMarker(inns[i][1], inns[i][2], inns[i][0]);
+        },
+        failure: function(o) {alert("Konnte die Hütten-Daten nicht vom Server laden");}
+    }
+    var url = "${h.url_for(controller='maptool', action='ajax_inns')}";
+    YAHOO.util.Connect.asyncRequest('GET', url, callback, null);
+}
+
+
+function showMarkers(markers, show) {
+    for (var i = 0; i != markers.length; ++i) 
+        if (show) markers[i].show(); else markers[i].hide();
+}
+
+
+function removeRefMarker(refMarkerId) {
+    refMarker = wrRefMarkers[refMarkerId];
+    wrMap.removeOverlay(refMarker);
+    delete refMarker;
+    delete wrRefMarkers[refMarkerId];
+}
+
+
+// Done when loading HTML
+// ----------------------
+function initialize() {
+    if (GBrowserIsCompatible()) {
+        wrMap = new GMap2(document.getElementById('map'), {'mapTypes': [G_NORMAL_MAP, G_HYBRID_MAP, G_PHYSICAL_MAP, G_SATELLITE_MAP]});
+        wrMap.addControl(new GLargeMapControl());
+        wrMap.addControl(new GMapTypeControl());
+        wrMap.addControl(new GScaleControl());
+        wrMap.setCenter(new GLatLng(47.22, 11.42), 10);
+        // wrMap.enableGoogleBar();
+        wrMap.setMapType(G_PHYSICAL_MAP);
+        wrMap.enableScrollWheelZoom();
+        updateAccuracyInfo(wrMap, wrMap.getCenter());
+        updatePositionInfo(wrMap, wrMap.getCenter(), "Zentrum der Karte");
+        initSledding(wrMap);
+        initInns(wrMap);
+        
+        // Event at wrMap move
+        GEvent.addListener(wrMap, "moveend", function() {updateAccuracyInfo(wrMap, wrMap.getCenter()); updatePositionInfo(wrMap, wrMap.getCenter(), "Zentrum der Karte");});
+        
+        // Event at wrMap click
+        function onMapClick(overlay, latlng) {
+            if (YAHOO.lang.isUndefined(latlng)) {
+                // setPositionInfo(""); // would override coordinates shown when a user clicks on a marker
+            } else {
+                updateAccuracyInfo(wrMap, latlng);
+                if (overlay == null) {
+                    // Create refMarker
+                    var refMarker = new GMarker(latlng, {title: "Koordinaten-Markierung (kann gezogen werden)", draggable: true});
+                    var refMarkerId = aa_insert(wrRefMarkers, refMarker); // add it to the ref marker assoziative array
+                    // Event at click on marker
+                    function onRefMarkerClick() {
+                        var lat_s = refMarker.getLatLng().lat().toFixed(6);
+                        var lng_s = refMarker.getLatLng().lng().toFixed(6);
+                        refMarker.openInfoWindowHtml("Koordinaten<br/><strong>" + lat_s + " N " + lng_s + " E</strong><br/>" + lat_s + ", " + lng_s + "<br/><a onclick=\"removeRefMarker(" + refMarkerId + ")\" href=\"javascript:void(0)\">Marker entfernen</a>");
+                        updatePositionInfo(wrMap, refMarker.getLatLng(), "Koordinaten des Markers", 6);
+                    }
+                    GEvent.addListener(refMarker, "click", onRefMarkerClick);
+                    // Event at drag marker
+                    function onRefMarkerDragEnd() {updatePositionInfo(wrMap, refMarker.getLatLng(), "Neue Koordinaten des Markers");}
+                    GEvent.addListener(refMarker, "dragend", onRefMarkerDragEnd);
+                    wrMap.addOverlay(refMarker);
+                    updatePositionInfo(wrMap, latlng, "Koordinaten des neuen Markers");
+                } else {
+                    // Set info text
+                    updatePositionInfo(wrMap, latlng, "Koordinaten des letzten Klicks");
+                }
+            }
+        }
+        GEvent.addListener(wrMap, "click", onMapClick);
+        
+        // Show markers
+        document.getElementById("show_sledding").checked = true;
+        document.getElementById("show_inns").checked = true;
+    }
+}
+
+// ]]>
+</script>
+
+</head>
+
+<body onload="initialize()" onunload="GUnload()">
+
+<h2>Map-Tool</h2>
+
+<p>Werkzeug für die Landkartenbearbeitung.</p>
+
+<h3>Georeferenzierung</h3>
+
+<p id="accuracy"/>
+<div id="map" style="width: 100%; height: 450px; border-style:none;"></div>
+<p id="mapinfo"/>
+
+<p>
+<input id="show_sledding" type="checkbox" onclick="showMarkers(wrSleddingMarkers, this.checked);"/><label for="show_sledding">Rodelbahnen zeigen</label><br/>
+<input id="show_inns" type="checkbox" onclick="showMarkers(wrInnMarkers, this.checked);"/><label for="show_inns">Hütten zeigen</label>
+</p>
+
+
+
+</body>
+</html>
index a3f2ecb2ec29e025faa8764ca6c23e78865fae7a..9421e3b38df5ae556d41ce8761b818bf3960ad1e 100644 (file)
@@ -13,6 +13,7 @@
     <meta name="robots" content="noindex, nofollow" />
     <link rel="stylesheet" type="text/css" media="screen" href="${h.url_for('/style.css')}" />
     <link rel="shortcut icon" href="${h.url_for('/favicon.png')}" />
+    ${Markup(unicode(select('script')))}
 </head>
 </py:match>
 
@@ -26,6 +27,7 @@
     <li><a href="${h.url_for(controller='rodelbahn', action='list')}">Rodelbahnen</a></li>
     <li><a href="${h.url_for(controller='bericht', action='list')}">Rodelbahnberichte</a></li>
     <li><a href="${h.url_for(controller='gasthaus', action='list')}">Gasthäuser</a></li>
+    <li><a href="${h.url_for(controller='maptool', action='index')}">Map-Tool</a></li>
 </ul>
 
 <div py:if="session.has_key('flash')" class="${session.pop('flashclass', 'flash')}">${session.pop('flash')}<?python session.save() ?></div>