lifomapserver/htdocs/index.html

204 lines
6.0 KiB
HTML

<!DOCTYPE html>
<html>
<head>
<title>LinuxWorks Minetest Map (unofficial)</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.6.0/dist/leaflet.css" integrity="sha512-xwE/Az9zrjBIphAcBb3F6JVqxf46+CDLwfLMHloNu6KEQCAWi6HcDUbeOfBIptF7tcCzusKFjFw2yuvEpDL9wQ==" crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.6.0/dist/leaflet.js" integrity="sha512-gZwIG9x3wUXg2hdXF6+rVkLF/0Vi9U8D2Ntg4Ga5I5BZpVkVxlJWbSQtXPSiUTtC0TjtGOmxa1AJPuV0CPthew==" crossorigin=""></script>
</head>
<body style="position: absolute; padding: 0px; margin: 0px; width:100%; height:100%;">
<div id="mapid" style="width: 100%; height: 100%;"></div>
<style>
.leaflet-tooltip.city-names {
background-color: transparent;
border: transparent;
box-shadow: none;
font-weight: bold;
font-size: 14pt;
opacity:1.0;
color: white;
text-shadow: 0px 0px 5px black;
}
</style>
<script>
// Projection fix from: https://gis.stackexchange.com/questions/200865/leaflet-crs-simple-custom-scale
var factorx = 1/256 * 4;
var factory = factorx;
var originx = 7000;
var originy = 7000;
var zoom_level_real = 6;
L.CRS.pr = L.extend({}, L.CRS.Simple, {
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
});
// Init map
var mymap = L.map('mapid', {
crs: L.CRS.pr
}).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);
var layerbounds = new L.LatLngBounds(sw, ne);
var layers = L.control.layers({}, {}).addTo(mymap);
function load_svg(name, url, active=1) {
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 + ")");
}
}
};
xhttp_ps.open("GET", url, true);
xhttp_ps.send();
}
function load_tiles(name, id) {
var satellite = L.tileLayer('tiles/?id={id}&z={z}&x={x}&y={y}', {
maxZoom: 8,
maxNativeZoom: 6,
minNativeZoom: 0,
minZoom: 0,
noWrap: true,
attribution: 'Map data &copy; <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;
}
function load_geojson(name, url, active=1, style = {}, onEachFeature = null, onClick=null) {
var xhttp_ps = new XMLHttpRequest();
xhttp_ps.onreadystatechange = function() {
if (this.readyState == 4) {
if (this.status == 200) {
var geojson = L.geoJSON(JSON.parse(xhttp_ps.responseText), {
style: style,
onEachFeature: onEachFeature
});
if (onClick)
geojson.on('click', onClick)
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.send();
}
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_svg("Test", "./overlay.svg", 0);
load_geojson(
"Cities",
"./geojson/cities.json",
1,
{},
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();
},
null);
load_geojson(
"All Places",
"./geojson/all.json",
1,
{},
null,
onClick = function(e){
console.log(e.sourceTarget.feature);
popup
.setLatLng(e.latlng)
.setContent("Here is <a href=\"https://wiki.linux-forks.de/mediawiki/index.php/" + e.sourceTarget.feature.properties.name + "\">" + e.sourceTarget.feature.properties.name + "</a>")
.openOn(mymap);
});
load_geojson(
"Test",
"./geojson/test.json",
0,
{
radius: 8,
fillColor: "#ff7800",
color: "blue",
opacity: 1,
fillOpacity: 0.5
},
null,
onClick = function(e){
console.log(e.sourceTarget.feature);
popup
.setLatLng(e.latlng)
.setContent("You clicked on <a href=\"https://wiki.linux-forks.de/mediawiki/index.php/" + e.sourceTarget.feature.properties.name + "\">" + e.sourceTarget.feature.properties.name + "</a>")
.openOn(mymap);
});
L.control.scale().addTo(mymap);
var popup = L.popup();
function onMapClick(e) {
popup
.setLatLng(e.latlng)
.setContent("You clicked the map at " + e.latlng.toString())
.openOn(mymap);
}
//mymap.on('click', onMapClick);
</script>
</body>
</html>