var currentPosition = { lat: 51.0420162, lon: 13.7976983 } var geoListeners = [] function POI(info) { this.info = info } POI.prototype.getDistance = function() { return WGS84Util.distanceBetween({ coordinates: [this.info.lon, this.info.lat] }, { coordinates: [currentPosition.lon, currentPosition.lat] }) } POI.prototype.makeArrowEl = function() { var el = $('

') var update = function() { var bearing = -180.0 * Math.atan2( this.info.lat - currentPosition.lat, this.info.lon - currentPosition.lon ) / Math.PI el.find('.arrow span').css('transform', 'rotate(' + (bearing - (currentPosition.heading || 0)) + 'deg)') if (typeof currentPosition.heading === 'number') el.find('.arrow span').text("➡") el.find('.dist').text(formatDistance(this.getDistance())) }.bind(this) // Initialize: update() // hook onGeo listener geoListeners.push(update) return el } function onGeo(geo) { console.log("onGeo", geo) currentPosition = { lat: geo.coords.latitude, lon: geo.coords.longitude, heading: geo.heading } // call listeners geoListeners.forEach(function(f) { f(currentPosition) }) } function formatDistance(x) { if (x >= 1000) { return (Math.round(x / 100) / 10) + " km" } else { return Math.round(x) + " m" } } function makeLink(link) { var a = $('') a.attr('href', link.indexOf("://") < 0 ? "http://" + link : link) a.text(link.replace(/^\w+?:\/\//, "").replace(/\/+$/, "")) return a } navigator.geolocation.getCurrentPosition(function(geo) { onGeo(geo) navigator.geolocation.watchPosition(onGeo, null, { enableHighAccuracy: true }) }) var h3 = $('

Imbißmöglichkeiten anzeigen

') $('article').append(h3) var ran = false h3.click(function() { if (ran) return ran = true h3.addClass('expanded') h3.text("Lade Imbißmöglichkeiten...") $.ajax({ url: "pois.json", success: function(json) { var pois = json.elements.map(function(info) { return new POI(info) }).filter(function(poi) { return poi.getDistance() <= 1000 }).sort(function(a, b) { return a.getDistance() - b.getDistance() }) var dl = $('
') pois.forEach(function(poi) { if (!poi.info.tags.name) { console.warn("No name:", poi.info) return // Skip } var dt = $('
') dt.find('a'). attr('href', "https://www.openstreetmap.org/" + poi.info.type + "/" + poi.info.id). text(poi.info.tags.name) if (poi.info.tags['addr:street'] && poi.info.tags['addr:housenumber']) { var addr = $('') addr.text(poi.info.tags['addr:street'] + " " + poi.info.tags['addr:housenumber']) dt.append(addr) } if (poi.info.tags.website) { var addr = $('') addr.append(makeLink(poi.info.tags.website)) dt.append(addr) } dt.prepend(poi.makeArrowEl()) dl.append(dt) if (poi.info.tags.opening_hours) { poi.info.tags.opening_hours.split(/\s*;\s*/g).forEach(function(range) { var dd = $('
') dd.text(range) dl.append(dd) }) } }) $('article').append(dl) h3.text("Imbißmöglichkeiten in der Umgebung") $('article').append("

Quelle: OpenStreetMap. Stündlich aktualisiert mithilfe Overpass Turbo.

") }, error: function() { h3.text("Fehler! Versuch z.B. osm24.eu stattdessen.") } }) })