var BaseIcon = L.Icon.extend({
options : {
iconSize : [ 24, 24 ],
iconAnchor : [ 15, 15 ],
popupAnchor : [ 0, -16 ]
}
});
p1 = new BaseIcon({
iconUrl : 'https://cdn.j2ski.com/m/apt-24.png'
})
p4 = new BaseIcon({
iconUrl : 'https://cdn.j2ski.com/m/ChaletG-24.png'
})
p5 = new BaseIcon({
iconUrl : 'https://cdn.j2ski.com/m/HotelG-24.png'
})
p3 = new BaseIcon({
iconUrl : 'https://cdn.j2ski.com/m/mtn-24.png'
})
p6 = new BaseIcon({
iconUrl : 'https://cdn.j2ski.com/m/ResortG-24.png'
})
p7 = new BaseIcon({
iconUrl : 'https://cdn.j2ski.com/m/ShopG-24.png'
})
function getIcon(feature) {
// Work out which icon to use
switch (feature.properties.iconName) {
case 'Airport':
return p1;
case 'Hotel':
return p5;
case 'Resort':
return p6;
case 'Shop':
return p7;
}
return p6;
}
function airportFilter(feature) {
if (feature.properties.iconName === "Airport") return true
}
function hotelFilter(feature) {
if (feature.properties.iconName === "Hotel") return true
}
function resortFilter(feature) {
if (feature.properties.iconName === "Resort") return true
}
function shopFilter(feature) {
if (feature.properties.iconName === "Shop") return true
}
function initmap() {
var map = L.map('map', {
zoomControl: false
}).setView([ 46.08282,6.72647 ], 11);
L.control.zoom({
position:'bottomright'
}).addTo(map);
var fsControl = new L.Control.FullScreen();
map.addControl(fsControl);
// Initial set-up of layers
var apt;
var hotelLayer;
var skia;
var shops;
var layerscontrol;
loadFeatures();
function onEachFeature(feature, layer) {
if (feature.properties) {
if (feature.properties.htmlNote) {
layer.bindPopup(feature.properties.htmlNote, {autoPan: false, autoClose: false});
}
if (feature.properties.visibleTooltip) {
layer.bindTooltip(feature.properties.visibleTooltip, { permanent: true, offset:[16,0], direction:'right' }).openTooltip();
}
if (feature.properties.popupTooltip) {
layer.bindTooltip(feature.properties.popupTooltip, { offset:[16,0], direction:'right' }).openTooltip();
}
}
}
function loadFeatures() {
var zoom = map.getZoom();
console.log('loadFeatures() called at zoom level=' + zoom);
if (zoom < 4) {
// Clear all layers
if (apt) {
apt.clearLayers();
};
if (hotelLayer) {
hotelLayer.clearLayers();
};
if (skia) {
skia.clearLayers();
};
if (shops) {
shops.clearLayers();
};
} else {
var centre = map.getCenter();
let xhr = new XMLHttpRequest();
xhr.open('GET', '/mapper/' + centre.lat + '/' + centre.lng + '/' + zoom + '/ski-areas.geojson');
// We have to both request and accept json for the xhr.response to
// be of the right type below.
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.responseType = 'json';
xhr.onload = function() {
if (xhr.status !== 200)
return;
var body = xhr.response;
console.log(body);
// Clear all layers before adding new GeoJSON data
if (apt) {
apt.clearLayers();
};
apt = L.geoJSON(body, {
filter: airportFilter,
pointToLayer : function(feature, latlng) {
return L.marker(latlng, {icon : getIcon(feature)});
},
onEachFeature : onEachFeature
}).addTo(map);
if (hotelLayer) {
hotelLayer.clearLayers();
};
hotelLayer = L.geoJSON(body, {
filter: hotelFilter,
pointToLayer : function(feature, latlng) {
return L.marker(latlng, {icon : getIcon(feature)});
},
onEachFeature : onEachFeature
});
// Ski Area Layers
if (skia) {
skia.clearLayers();
};
skia = L.geoJSON(body, {
filter: resortFilter,
pointToLayer : function(feature, latlng) {
return L.marker(latlng, {icon : getIcon(feature)});
},
onEachFeature : onEachFeature
}).addTo(map);
// Shop Layers
if (shops) {
shops.clearLayers();
};
shops = L.geoJSON(body, {
filter: shopFilter,
pointToLayer : function(feature, latlng) {
return L.marker(latlng, {icon : getIcon(feature)});
},
onEachFeature : onEachFeature
});
// Write / Re-write the layers control with the newly refreshed layers loaded above.
if (layerscontrol) {
map.removeControl(layerscontrol);
}
if (zoom < 15) {
layerscontrol = L.control.layers(null, {"Airports":apt,"Ski Resorts":skia}, {collapsed:false}).addTo(map);
layerscontrol.addOverlay(hotelLayer, 'Hotels');
layerscontrol.addOverlay(shops, 'Ski Hire Shops');
} else {
hotelLayer.addTo(map);
shops.addTo(map);
layerscontrol = L.control.layers(null, {"Airports":apt,"Ski Resorts":skia,"Hotels":hotelLayer,"Ski Hire Shops":shops}, {collapsed:false}).addTo(map);
}
};
xhr.send();
}
}
map.on("moveend", function(e) {
loadFeatures()
});
L.control.scale().addTo(map);
var tiles = L.tileLayer(
'https://map.j2ski.com/hot/{z}/{x}/{y}.png', {
attribution : 'Map data © OpenStreetMap contributors, CC-BY-SA',
minZoom : 3,
maxZoom : 18
}
).addTo(map);
var baseMaps = {
"Tiles": tiles
};
}