brouter-web/bower_components/leaflet-routing/app.js
2014-05-14 11:40:52 +02:00

228 lines
7.1 KiB
JavaScript

/*
Routing capability using the Leaflet framework
Copyright (c) 2013, Turistforeningen, Hans Kristian Flaatten
https://github.com/Turistforeningen/leaflet-routing
*/
var routing, data;
(function() {
"use strict";
jQuery(function($) {
var api, apiKey, rUrl, sUrl, topo, map, snapping, inport, myRouter;
api = window.location.hash.substr(1).split('@');
if (api.length === 2) {
rUrl = 'http://' + api[1] + '/route/?coords='
sUrl = 'http://' + api[1] + '/bbox/?bbox=';
apiKey = api[0];
} else {
throw new Error('API auth failed');
}
topo = L.tileLayer('http://opencache.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=topo2&zoom={z}&x={x}&y={y}', {
maxZoom: 16,
attribution: '<a href="http://www.statkart.no/">Statens kartverk</a>'
});
var summer = L.tileLayer('http://mt3.turistforeningen.no/prod/trail_summer/{z}/{x}/{y}.png', {
maxZoom: 16,
attribution: '<a href="http://www.turistforeningen.no/">DNT</a>'
});
var winter = L.tileLayer('http://mt3.turistforeningen.no/prod/trail_winter/{z}/{x}/{y}.png', {
maxZoom: 16,
attribution: '<a href="http://www.turistforeningen.no/">DNT</a>'
});
var cabin = L.tileLayer('http://mt3.turistforeningen.no/prod/cabin/{z}/{x}/{y}.png', {
maxZoom: 16,
attribution: '<a href="http://www.turistforeningen.no/">DNT</a>'
});
map = new L.Map('map', {
layers: [topo]
,center: new L.LatLng(61.5, 9)
,zoom: 13
});
cabin.addTo(map);
summer.addTo(map);
L.control.layers({'Topo 2': topo}, {
'DNTs merkede stier': summer
,'DNTs merkede vinterruter': winter
,'DNTs turisthytter': cabin
}, {
position: 'topleft'
}).addTo(map);
// Import Layer
inport = new L.layerGroup(null, {
style: {
opacity:0.5
,clickable:false
}
}).addTo(map);
// Snapping Layer
snapping = new L.geoJson(null, {
style: {
opacity:0
,clickable:false
}
}).addTo(map);
map.on('moveend', function() {
if (map.getZoom() > 12) {
var url;
url = sUrl + map.getBounds().toBBoxString() + '&callback=?';
$.getJSON(url).always(function(data, status) {
if (status === 'success') {
data = JSON.parse(data);
if (data.geometries && data.geometries.length > 0) {
snapping.clearLayers();
snapping.addData(data);
}
} else {
console.error('Could not load snapping data');
}
});
} else {
snapping.clearLayers();
}
});
map.fire('moveend');
// Routing Function
// @todo speed up geometryToLayer()
myRouter = function(l1, l2, cb) {
var req = $.getJSON(rUrl + [l1.lng, l1.lat, l2.lng, l2.lat].join(',') + '&callback=?');
req.always(function(data, status) {
if (status === 'success') {
try {
L.GeoJSON.geometryToLayer(JSON.parse(data)).eachLayer(function (layer) {
// 14026
var d1 = l1.distanceTo(layer._latlngs[0]);
var d2 = l2.distanceTo(layer._latlngs[layer._latlngs.length-1]);
if (d1 < 10 && d2 < 10) {
return cb(null, layer);
} else {
return cb(new Error('This has been discarded'));
}
});
} catch(e) {
return cb(new Error('Invalid JSON'));
}
} else {
return cb(new Error('Routing failed'));
}
});
}
// Leaflet Routing Module
routing = new L.Routing({
position: 'topleft'
,routing: {
router: myRouter
}
,snapping: {
layers: [snapping]
,sensitivity: 15
,vertexonly: false
}
});
map.addControl(routing);
routing.draw(true); // enable drawing mode
$('#eta-export').hide();
$('#eta-export').on('click', function() {
var id = $('#eta-id').val();
if (!id) { alert('Ingen tp_id definert!'); return; }
if (confirm('Eksport til ETA vil overskrive eksisterende geometri!')) {
var coords = routing.toGeoJSON().coordinates;
var data = [];
for (var i = 0; i < coords.length; i++) {
data.push(coords[i][0] + ' ' + coords[i][1]);
}
data = 'LINESTRING(' + data.join(',') + ')';
$.post('http://mintur.ut.no/lib/ajax/post_geom.php?api_key=' + apiKey + '&tp_id=' + id, {coords: data}, function(data) {
if (data.error) {
alert('Eksport feilet med feilkode ' + data.error);
} else if (data.success) {
window.location.href = 'http://mintur.ut.no/index.php?tp_id=' + id + '&tab=kart';
//alert('Eksport suksess!');
}
});
}
});
$('#eta-import').on('click', function() {
var id = $('#eta-id').val();
if (!id) { alert('Ingen tp_id definert!'); return; }
$.get('http://mintur.ut.no/lib/ajax/post_geom.php?api_key=' + apiKey + '&tp_id=' + id, function(data) {
if (data.error) {
alert('Import feilet med feilkode ' + data.error);
} else if (typeof data.coords !== 'undefined') {
$('#eta-import').hide();
$('#eta-export').show();
$('#eta-id').attr('readonly', 'readonly');
if (data.coords) {
data.coords = data.coords.replace('LINESTRING(', '').replace(')', '').split(',');
for (var i = 0; i < data.coords.length; i++) {
data.coords[i] = new L.LatLng(data.coords[i].split(' ')[1], data.coords[i].split(' ')[0]);
}
inport.clearLayers();
var p = new L.Polyline(data.coords, {clickable:false, color: '#000000', opacity: 0.4});
inport.addLayer(p);
map.fitBounds(p.getBounds());
}
}
});
});
function fetchSsrAc(search, cb) {
var result = [];
$.ajax({
url: "https://ws.geonorge.no/SKWS3Index/ssr/sok?navn=" + search + "*&epsgKode=4326&antPerSide=10"
,type: "GET"
,dataType: 'xml'
,success: function(xml) {
$(xml).find('sokRes > stedsnavn').each(function(){
result.push({
title: $(this).find('stedsnavn').text()
,lat: $(this).find('aust').text()
,lng: $(this).find('nord').text()
});
});
cb(null, result);
}
});
}
$('#ssr-search').typeahead({
remote: {
url: 'https://ws.geonorge.no/SKWS3Index/ssr/sok?navn=%QUERY*&epsgKode=4326&antPerSide=10',
dataType: 'xml',
filter: function(xml) {
var result = [];
$(xml).find('sokRes > stedsnavn').each(function(){
result.push({
value: $(this).find('stedsnavn').text()
,tokens: [$(this).find('stedsnavn').text()]
,lat: $(this).find('nord').text()
,lng: $(this).find('aust').text()
});
});
return result;
}
}
});
$('#ssr-search').on('typeahead:selected', function(e, object) {
var ll = new L.LatLng(object.lat, object.lng);
map.panTo(ll);
$('#ssr-search').val('');
})
});
}).call(this);