Compare commits

...

2 Commits

Author SHA1 Message Date
e0970aacb9 backend: Add support for streets 2020-04-17 16:43:34 +02:00
7b65ef6ee4 Fix formatting 2020-04-17 16:20:22 +02:00
2 changed files with 155 additions and 128 deletions

View File

@ -1,36 +1,33 @@
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
<title>LinuxWorks Minetest Map (unofficial)</title>
<title>LinuxWorks Minetest Map (unofficial)</title> <meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8" /> <link rel="stylesheet" href="fa/css/all.css">
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="awesomemarkers/leaflet.awesome-markers.css">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/>
<link rel="stylesheet" href="fa/css/all.css" > <script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js" integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" crossorigin=""></script>
<link rel="stylesheet" href="awesomemarkers/leaflet.awesome-markers.css"> <script src="awesomemarkers/leaflet.awesome-markers.js"></script>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/> </head>
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js" integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" crossorigin=""></script>
<script src="awesomemarkers/leaflet.awesome-markers.js"></script>
</head>
<body style="position: absolute; padding: 0px; margin: 0px; width:100%; height:100%;"> <body style="position: absolute; padding: 0px; margin: 0px; width:100%; height:100%;">
<div id="mapid" style="width: 100%; height: 100%;"></div> <div id="mapid" style="width: 100%; height: 100%;"></div>
<style> <style>
.leaflet-tooltip.city-names { .leaflet-tooltip.city-names {
background-color: transparent; background-color: transparent;
border: transparent; border: transparent;
box-shadow: none; box-shadow: none;
font-weight: bold;
font-weight: bold; font-size: 14pt;
font-size: 14pt; opacity: 1.0;
opacity:1.0; color: white;
color: white; text-shadow: 0px 0px 5px black;
text-shadow: 0px 0px 5px black; }
}
a.new { a.new {
color: red; color: red;
} }
</style> </style>
<script src="mapscript.js"> </script> <script src="mapscript.js"></script>
</body> </body>
</html> </html>

View File

@ -1,126 +1,159 @@
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",
},
});
// Projection fix from: https://gis.stackexchange.com/questions/200865/leaflet-crs-simple-custom-scale // Projection fix from: https://gis.stackexchange.com/questions/200865/leaflet-crs-simple-custom-scale
var factorx = 1/256 * 4; var factorx = 1 / 256 * 4;
var factory = factorx; var factory = factorx;
var originx = 7000; var originx = 7000;
var originy = 7000; var originy = 7000;
var zoom_level_real = 6; var zoom_level_real = 6;
L.CRS.pr = L.extend({}, L.CRS.Simple, { L.CRS.pr = L.extend({}, L.CRS.Simple, {
projection: L.Projection.LonLat, projection: L.Projection.LonLat,
transformation: new L.Transformation(factorx, factorx * originx, -factory, factory * originy), transformation: new L.Transformation(factorx,factorx * originx,-factory,factory * originy),
scale: function(zoom) {
return Math.pow(2, zoom);
},
zoom: function(scale) { scale: function(zoom) {
return Math.log(scale) / Math.LN2; return Math.pow(2, zoom);
}, },
distance: function(latlng1, latlng2) { zoom: function(scale) {
var dx = latlng2.lng - latlng1.lng, return Math.log(scale) / Math.LN2;
dy = latlng2.lat - latlng1.lat; },
return Math.sqrt(dx * dx + dy * dy); distance: function(latlng1, latlng2) {
}, var dx = latlng2.lng - latlng1.lng
infinite: true , dy = latlng2.lat - latlng1.lat;
return Math.sqrt(dx * dx + dy * dy);
},
infinite: true
}); });
// Init map // Init map
var mymap = L.map('mapid', { var mymap = L.map('mapid', {
crs: L.CRS.pr renderer: streetLabelsRenderer,
crs: L.CRS.pr
}).setView([0, 0], 6); }).setView([0, 0], 6);
var mapheight = 16384; var mapheight = 16384;
var mapwidth = mapheight; var mapwidth = mapheight;
var sw = mymap.unproject([0, 0], zoom_level_real); var sw = mymap.unproject([0, 0], zoom_level_real);
var ne = mymap.unproject([mapwidth, mapheight], zoom_level_real); var ne = mymap.unproject([mapwidth, mapheight], zoom_level_real);
var layerbounds = new L.LatLngBounds(sw, ne); var layerbounds = new L.LatLngBounds(sw,ne);
var layers = L.control.layers({}, {}).addTo(mymap); var layers = L.control.layers({}, {}).addTo(mymap);
function load_svg(name, url, active=1) { function load_svg(name, url, active=1) {
var xhttp_ps = new XMLHttpRequest(); var xhttp_ps = new XMLHttpRequest();
xhttp_ps.onreadystatechange = function() { xhttp_ps.onreadystatechange = function() {
if (this.readyState == 4) { if (this.readyState == 4) {
if (this.status == 200) { if (this.status == 200) {
var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg"); var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg"); svgElement.setAttribute('xmlns', "http://www.w3.org/2000/svg");
svgElement.setAttribute('viewBox', "0 0 16384 16384"); svgElement.setAttribute('viewBox', "0 0 16384 16384");
svgElement.innerHTML = xhttp_ps.responseText; svgElement.innerHTML = xhttp_ps.responseText;
var svgElementBounds = [ [ 0, 0 ], [ 1000, 1000 ] ]; var svgElementBounds = [[0, 0], [1000, 1000]];
var overlay = L.svgOverlay(svgElement, svgElementBounds); var overlay = L.svgOverlay(svgElement, svgElementBounds);
layers.addOverlay(overlay, name); layers.addOverlay(overlay, name);
if (active) if (active)
overlay.addTo(mymap); overlay.addTo(mymap);
return overlay; return overlay;
} else { } else {
alert("Error: Could not load SVG map layer (" + name + ")"); alert("Error: Could not load SVG map layer (" + name + ")");
} }
}
} }
}; ;
xhttp_ps.open("GET", url, true); xhttp_ps.open("GET", url, true);
xhttp_ps.send(); xhttp_ps.send();
} }
function load_tiles(name, id) { function load_tiles(name, id) {
var satellite = L.tileLayer('https://notsyncing.net/maps.linux-forks.de/tiles/?id={id}&z={z}&x={x}&y={y}', { var satellite = L.tileLayer('https://notsyncing.net/maps.linux-forks.de/tiles/?id={id}&z={z}&x={x}&y={y}', {
maxZoom: 8, maxZoom: 8,
maxNativeZoom: 6, maxNativeZoom: 6,
minNativeZoom: 0, minNativeZoom: 0,
minZoom: 0, minZoom: 0,
noWrap: true, noWrap: true,
attribution: 'Map data &copy; <a href="https://wiki.linux-forks.de/mediawiki/index.php/Maps">Linux-Forks</a>, ' + attribution: 'Map data &copy; <a href="https://wiki.linux-forks.de/mediawiki/index.php/Maps">Linux-Forks</a>, ' + 'All rights reserved, ',
'All rights reserved, ', id: id,
id: id, tileSize: 256,
tileSize: 256, zoomOffset: 0,
zoomOffset: 0, opacity: 1.0,
opacity: 1.0, bounds: layerbounds
bounds: layerbounds });
}); layers.addBaseLayer(satellite, name);
layers.addBaseLayer(satellite, name); return satellite;
return satellite;
} }
function load_geojson(name, url, iconname, iconcolor, active=1, style={}) {
var xhttp_ps = new XMLHttpRequest();
function load_geojson(name, url, iconname, iconcolor,active=1) { xhttp_ps.onreadystatechange = function() {
var xhttp_ps = new XMLHttpRequest(); if (this.readyState == 4) {
xhttp_ps.onreadystatechange = function() { if (this.status == 200) {
if (this.readyState == 4) { switch (iconname) {
if (this.status == 200) { case "street":
var geojson = L.geoJSON(JSON.parse(xhttp_ps.responseText), { onEachFeature = null;
onEachFeature: function (feature, layer) { pointToLayer = null;
label = String(feature.properties.name) break;
layer.bindPopup( default: /* else it is a marker with the specified icon */
'<h1><a href="https://wiki.linux-forks.de/mediawiki/index.php/'+feature.properties.name+'">'+feature.properties.name+'</a> ('+feature.geometry.coordinates+')</h1>'+ onEachFeature = function(feature, layer) {
'<p><img style="width:100%" src="' + feature.properties.image + '"></p>' + label = String(feature.properties.name)
'<p>'+feature.properties.description+'</p>' 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, {
layer.bindTooltip(label, {permanent: true, direction: "center", className: "city-names"}).openTooltip(); permanent: true,
}, direction: "center",
pointToLayer: function(feature,latlng){ className: "city-names"
label = String(feature.properties.name) }).openTooltip();
return new L.marker(latlng, {icon: L.AwesomeMarkers.icon({ };
icon: iconname, pointToLayer = function(feature, latlng) {
markerColor: iconcolor label = String(feature.properties.name)
})}).bindTooltip(label, {permanent: false, direction: "center", opacity: 0.7}).openTooltip(); return new L.marker(latlng,{
} icon: L.AwesomeMarkers.icon({
}); icon: iconname,
layers.addOverlay(geojson, name); markerColor: iconcolor
if (active) })
geojson.addTo(mymap); }).bindTooltip(label, {
return geojson; permanent: false,
} else { direction: "center",
alert("Error: Could not load geojson map layer (" + name + ")."); opacity: 0.7
} }).openTooltip();
};
break;
}
var geojson = L.geoJSON(JSON.parse(xhttp_ps.responseText), {
style: style,
onEachFeature: onEachFeature,
pointToLayer: pointToLayer
});
layers.addOverlay(geojson, name);
if (active)
geojson.addTo(mymap);
return geojson;
} else {
alert("Error: Could not load geojson map layer (" + name + ").");
}
}
} }
}; ;
xhttp_ps.open("GET", url, true); xhttp_ps.open("GET", url, true);
xhttp_ps.send(); xhttp_ps.send();
} }
load_tiles("Satellite (2020-04-09)", 'world-2020-04-09').addTo(mymap); load_tiles("Satellite (2020-04-09)", 'world-2020-04-09').addTo(mymap);
load_tiles("Satellite (2019-05-04, wrong coords)", 'world-2019-05-04'); load_tiles("Satellite (2019-05-04, wrong coords)", 'world-2019-05-04');
//load_svg("Test", "./overlay.svg", 0); //load_svg("Test", "./overlay.svg", 0);
@ -140,15 +173,12 @@ var popup = L.popup();
L.AwesomeMarkers.Icon.prototype.options.prefix = 'fa'; L.AwesomeMarkers.Icon.prototype.options.prefix = 'fa';
var baseballIcon = L.AwesomeMarkers.icon({ var baseballIcon = L.AwesomeMarkers.icon({
icon: 'coffee', icon: 'coffee',
markerColor: 'red' markerColor: 'red'
}); });
function onMapClick(e) { function onMapClick(e) {
popup popup.setLatLng(e.latlng).setContent("You clicked the map at " + e.latlng.toString()).openOn(mymap);
.setLatLng(e.latlng)
.setContent("You clicked the map at " + e.latlng.toString())
.openOn(mymap);
} }
mymap.on('click', onMapClick); mymap.on('click', onMapClick);