2020-04-17 16:43:34 +02:00
|
|
|
var streetLabelsRenderer = new L.StreetLabels({
|
|
|
|
collisionFlg: true,
|
|
|
|
propertyName: 'name',
|
|
|
|
showLabelIf: function (layer) {
|
|
|
|
return layer.geometry.type == "LineString";
|
|
|
|
},
|
|
|
|
fontStyle: {
|
|
|
|
dynamicFontSize: false,
|
|
|
|
fontSize: 10,
|
|
|
|
fontSizeUnit: "px",
|
|
|
|
lineWidth: 4.0,
|
|
|
|
fillStyle: "black",
|
|
|
|
strokeStyle: "white",
|
|
|
|
},
|
|
|
|
});
|
|
|
|
|
2020-04-15 01:08:31 +02:00
|
|
|
// Projection fix from: https://gis.stackexchange.com/questions/200865/leaflet-crs-simple-custom-scale
|
2020-04-17 16:14:57 +02:00
|
|
|
var factorx = 1 / 256 * 4;
|
2020-04-15 01:08:31 +02:00
|
|
|
var factory = factorx;
|
|
|
|
var originx = 7000;
|
|
|
|
var originy = 7000;
|
|
|
|
var zoom_level_real = 6;
|
|
|
|
|
|
|
|
L.CRS.pr = L.extend({}, L.CRS.Simple, {
|
2020-04-17 16:14:57 +02:00
|
|
|
projection: L.Projection.LonLat,
|
|
|
|
transformation: new L.Transformation(factorx,factorx * originx,-factory,factory * originy),
|
|
|
|
|
|
|
|
scale: function(zoom) {
|
|
|
|
return Math.pow(2, zoom);
|
|
|
|
},
|
|
|
|
|
|
|
|
zoom: function(scale) {
|
|
|
|
return Math.log(scale) / Math.LN2;
|
|
|
|
},
|
|
|
|
|
|
|
|
distance: function(latlng1, latlng2) {
|
|
|
|
var dx = latlng2.lng - latlng1.lng
|
|
|
|
, dy = latlng2.lat - latlng1.lat;
|
|
|
|
|
|
|
|
return Math.sqrt(dx * dx + dy * dy);
|
|
|
|
},
|
|
|
|
infinite: true
|
2020-04-15 01:08:31 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
// Init map
|
|
|
|
var mymap = L.map('mapid', {
|
2020-04-17 16:43:34 +02:00
|
|
|
renderer: streetLabelsRenderer,
|
2020-04-17 16:14:57 +02:00
|
|
|
crs: L.CRS.pr
|
2020-04-15 01:08:31 +02:00
|
|
|
}).setView([0, 0], 6);
|
|
|
|
|
|
|
|
var mapheight = 16384;
|
|
|
|
var mapwidth = mapheight;
|
|
|
|
var sw = mymap.unproject([0, 0], zoom_level_real);
|
|
|
|
var ne = mymap.unproject([mapwidth, mapheight], zoom_level_real);
|
2020-04-17 16:14:57 +02:00
|
|
|
var layerbounds = new L.LatLngBounds(sw,ne);
|
2020-04-15 01:08:31 +02:00
|
|
|
|
|
|
|
var layers = L.control.layers({}, {}).addTo(mymap);
|
|
|
|
|
|
|
|
function load_svg(name, url, active=1) {
|
2020-04-17 16:14:57 +02:00
|
|
|
var xhttp_ps = new XMLHttpRequest();
|
|
|
|
xhttp_ps.onreadystatechange = function() {
|
|
|
|
if (this.readyState == 4) {
|
|
|
|
if (this.status == 200) {
|
|
|
|
var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
|
|
|
|
svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
|
|
|
|
svgElement.setAttribute('viewBox', "0 0 16384 16384");
|
|
|
|
svgElement.innerHTML = xhttp_ps.responseText;
|
|
|
|
var svgElementBounds = [[0, 0], [1000, 1000]];
|
|
|
|
var overlay = L.svgOverlay(svgElement, svgElementBounds);
|
|
|
|
layers.addOverlay(overlay, name);
|
|
|
|
if (active)
|
|
|
|
overlay.addTo(mymap);
|
|
|
|
return overlay;
|
|
|
|
} else {
|
|
|
|
alert("Error: Could not load SVG map layer (" + name + ")");
|
|
|
|
}
|
|
|
|
}
|
2020-04-15 01:08:31 +02:00
|
|
|
}
|
2020-04-17 16:14:57 +02:00
|
|
|
;
|
|
|
|
xhttp_ps.open("GET", url, true);
|
|
|
|
xhttp_ps.send();
|
2020-04-15 01:08:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
function load_tiles(name, id) {
|
2020-04-17 16:14:57 +02:00
|
|
|
var satellite = L.tileLayer('https://notsyncing.net/maps.linux-forks.de/tiles/?id={id}&z={z}&x={x}&y={y}', {
|
|
|
|
maxZoom: 8,
|
|
|
|
maxNativeZoom: 6,
|
|
|
|
minNativeZoom: 0,
|
|
|
|
minZoom: 0,
|
|
|
|
noWrap: true,
|
|
|
|
attribution: 'Map data © <a href="https://wiki.linux-forks.de/mediawiki/index.php/Maps">Linux-Forks</a>, ' + 'All rights reserved, ',
|
|
|
|
id: id,
|
|
|
|
tileSize: 256,
|
|
|
|
zoomOffset: 0,
|
|
|
|
opacity: 1.0,
|
|
|
|
bounds: layerbounds
|
|
|
|
});
|
|
|
|
layers.addBaseLayer(satellite, name);
|
|
|
|
return satellite;
|
2020-04-15 01:08:31 +02:00
|
|
|
}
|
|
|
|
|
2020-04-17 16:43:34 +02:00
|
|
|
function load_geojson(name, url, iconname, iconcolor, active=1, style={}) {
|
2020-04-17 16:14:57 +02:00
|
|
|
var xhttp_ps = new XMLHttpRequest();
|
|
|
|
xhttp_ps.onreadystatechange = function() {
|
|
|
|
if (this.readyState == 4) {
|
|
|
|
if (this.status == 200) {
|
2020-04-17 16:43:34 +02:00
|
|
|
switch (iconname) {
|
|
|
|
case "street":
|
|
|
|
onEachFeature = null;
|
|
|
|
pointToLayer = null;
|
|
|
|
break;
|
|
|
|
default: /* else it is a marker with the specified icon */
|
|
|
|
onEachFeature = function(feature, layer) {
|
|
|
|
label = String(feature.properties.name)
|
|
|
|
layer.bindPopup('<h1><a href="https://wiki.linux-forks.de/mediawiki/index.php/' + feature.properties.name + '">' + feature.properties.name + '</a> (' + feature.geometry.coordinates + ')</h1>' + '<p><img style="width:100%" src="' + feature.properties.image + '"></p>' + '<p>' + feature.properties.description + '</p>');
|
|
|
|
layer.bindTooltip(label, {
|
|
|
|
permanent: true,
|
|
|
|
direction: "center",
|
|
|
|
className: "city-names"
|
|
|
|
}).openTooltip();
|
|
|
|
};
|
|
|
|
pointToLayer = function(feature, latlng) {
|
|
|
|
label = String(feature.properties.name)
|
|
|
|
return new L.marker(latlng,{
|
|
|
|
icon: L.AwesomeMarkers.icon({
|
|
|
|
icon: iconname,
|
|
|
|
markerColor: iconcolor
|
|
|
|
})
|
|
|
|
}).bindTooltip(label, {
|
|
|
|
permanent: false,
|
|
|
|
direction: "center",
|
|
|
|
opacity: 0.7
|
|
|
|
}).openTooltip();
|
|
|
|
};
|
|
|
|
break;
|
|
|
|
}
|
2020-04-17 16:14:57 +02:00
|
|
|
var geojson = L.geoJSON(JSON.parse(xhttp_ps.responseText), {
|
2020-04-17 16:43:34 +02:00
|
|
|
style: style,
|
|
|
|
onEachFeature: onEachFeature,
|
|
|
|
pointToLayer: pointToLayer
|
2020-04-17 16:14:57 +02:00
|
|
|
});
|
|
|
|
layers.addOverlay(geojson, name);
|
|
|
|
if (active)
|
|
|
|
geojson.addTo(mymap);
|
|
|
|
return geojson;
|
|
|
|
} else {
|
|
|
|
alert("Error: Could not load geojson map layer (" + name + ").");
|
|
|
|
}
|
|
|
|
}
|
2020-04-15 01:08:31 +02:00
|
|
|
}
|
2020-04-17 16:14:57 +02:00
|
|
|
;
|
|
|
|
xhttp_ps.open("GET", url, true);
|
|
|
|
xhttp_ps.send();
|
2020-04-15 01:08:31 +02:00
|
|
|
}
|
|
|
|
|
2020-04-17 16:14:57 +02:00
|
|
|
load_tiles("Satellite (2020-04-09)", 'world-2020-04-09').addTo(mymap);
|
2020-04-15 01:08:31 +02:00
|
|
|
load_tiles("Satellite (2019-05-04, wrong coords)", 'world-2019-05-04');
|
|
|
|
|
|
|
|
//load_svg("Test", "./overlay.svg", 0);
|
|
|
|
load_geojson("Cities", "./geojson/cities.json", "city", "red");
|
|
|
|
load_geojson("Stations", "./geojson/stations.json", "train", "blue");
|
2020-04-15 13:20:28 +02:00
|
|
|
load_geojson("Shops", "./geojson/shops.json", "shopping-cart", "green");
|
2020-04-15 14:50:50 +02:00
|
|
|
load_geojson("Parks", "./geojson/parks.json", "tree", "darkgreen");
|
|
|
|
load_geojson("Libraries", "./geojson/libraries.json", "book-open", "darkblue");
|
|
|
|
load_geojson("CW Complexes", "./geojson/cw_complexes.json", "border-all", "black");
|
|
|
|
load_geojson("Courts", "./geojson/courts.json", "balance-scale", "black");
|
|
|
|
load_geojson("Waterway", "./geojson/waterway.json", "water", "darkblue");
|
|
|
|
load_geojson("Train Depots", "./geojson/depots.json", "wrench", "violet");
|
2020-04-15 01:08:31 +02:00
|
|
|
|
|
|
|
L.control.scale().addTo(mymap);
|
|
|
|
|
|
|
|
var popup = L.popup();
|
|
|
|
|
|
|
|
L.AwesomeMarkers.Icon.prototype.options.prefix = 'fa';
|
|
|
|
var baseballIcon = L.AwesomeMarkers.icon({
|
2020-04-17 16:14:57 +02:00
|
|
|
icon: 'coffee',
|
|
|
|
markerColor: 'red'
|
2020-04-15 01:08:31 +02:00
|
|
|
});
|
|
|
|
|
|
|
|
function onMapClick(e) {
|
2020-04-17 16:14:57 +02:00
|
|
|
popup.setLatLng(e.latlng).setContent("You clicked the map at " + e.latlng.toString()).openOn(mymap);
|
2020-04-15 01:08:31 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
mymap.on('click', onMapClick);
|