--- /dev/null
+<?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&v=2&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>