BangleApps/testing/map/maploader.html

156 lines
5.3 KiB
HTML
Raw Normal View History

2019-11-11 18:40:04 +00:00
<html>
<head>
</head>
<body>
<script src="https://espruino.github.io/EspruinoWebTools/heatshrink.js"></script>
<script src="https://espruino.github.io/EspruinoWebTools/imageconverter.js"></script>
<!--<script src="https://espruino.github.io/EspruinoWebTools/uart.js"></script>-->
<script src="file:///home/gw/workspace/EspruinoWebTools/uart.js"></script>
<p>An online map loader for Espruino...</p>
Scale <input type="text" id="scale" value="20000"></input><br/>
Geo URI <input type="text" id="uri" value="geo:51.7079,-1.2926?z=16"></input><br/>
<button id="geturl">Get URL</button><a name="url"></a><br/>
<input type="file" id="fileLoader"/><br/>
<img id="mapimg"/><br/>
<canvas id="canvas" style="display:none;"></canvas>
<button id="upload" style="display:none;">Upload</button>
<pre id="log"></pre>
<!--
We can request this directly, eg:
https://render.openstreetmap.org/cgi-bin/export?bbox=-1.27,51.64,-1.26,51.65&scale=20000&format=png
https://render.openstreetmap.org/cgi-bin/export?bbox=-1.2731999999999999,51.6472,-1.2632,51.6572&scale=20000&format=png
then we need:
var map = {
imgx : 361,
imgy : 343,
tilesize : 64,
scale : 20000, // scale
lat : 51.65270, // coords of center
lon : -1.27052
};
find lat/lon? https://help.openstreetmap.org/questions/2702/extracting-coordinates-by-clicking-on-an-openstreetmap
-->
<script>
TILESIZE = 64;
var img;
var tiles = [];
function log(x) {
document.getElementById("log").innerText += x+"\n";
console.log(x);
}
function getURL() {
var uri = document.getElementById("uri").value;
var latlon = uri.match("geo:(-?[0-9\.]+),(-?[0-9\.]+)?");
if (latlon==null) {
log("Invalid URI!");
return;
}
var map = {
imgx :img?img.width:0,
imgy : img?img.height:0,
lat : parseFloat(latlon[1]),
lon : parseFloat(latlon[2]),
tilesize : TILESIZE,
scale : parseInt(document.getElementById("scale").value)
};
log(JSON.stringify(map,null,2));
var s = 0.005;
var x1 = map.lon-s,
x2 = map.lon+s,
y1 = map.lat-s,
y2 = map.lat+s;
var url = "https://render.openstreetmap.org/cgi-bin/export?bbox="+x1+","+y1+","+x2+","+y2+"&scale="+map.scale+"&format=png"
document.getElementById("url").href = url;
document.getElementById("url").innerText = url;
/*var mapimg = document.getElementById("mapimg");
mapimg.src = url;
mapimg.onload = function() {
log("Image loaded!");
}*/
}
function imageLoaded() {
if (img === undefined) return;
var options = { compression:true, mode:"web", output:"string"};
var canvas = document.getElementById("canvas")
canvas.width = TILESIZE*2;
canvas.height = TILESIZE;
canvas.style = "display:block;border:1px solid black;margin:8px;"
var ctx = canvas.getContext("2d");
console.log(img.width+"x"+img.height);
var w = Math.round(img.width / TILESIZE);
var h = Math.round(img.height / TILESIZE);
console.log("->"+w+"x"+h);
for (var y=0;y<h;y++) {
for (var x=0;x<w;x++) {
ctx.fillStyle = 'black';
ctx.fillRect(0,0,TILESIZE,TILESIZE);
ctx.drawImage(img,-x*TILESIZE,-y*TILESIZE);
var imageData = ctx.getImageData(0, 0, TILESIZE, TILESIZE);
var rgba = imageData.data;
options.rgbaOut = rgba;
options.width = TILESIZE;
options.height = TILESIZE;
var imgstr = imageconverter.RGBAtoString(rgba, options);
ctx.putImageData(imageData,TILESIZE,0);
var compress = 'require("heatshrink").decompress('
if (!imgstr.startsWith(compress)) throw "Data in wrong format";
imgstr = imgstr.slice(compress.length,-1);
tiles.push({
name:"t"+x+"x"+y,
value:imgstr
});
}
}
log("Tiling finished. "+tiles.length+" tiles");
document.getElementById("upload").style.display = "block";
}
function handleFileSelect(event) {
if (event.target.files.length != 1) return;
var reader = new FileReader();
reader.onload = function(event) {
img = new Image();
img.onload = imageLoaded;
img.src = event.target.result;
};
reader.readAsDataURL(event.target.files[0]);
};
document.getElementById('fileLoader').addEventListener('change', handleFileSelect, false);
document.getElementById('geturl').addEventListener('click', getURL);
document.getElementById('upload').addEventListener('click', function() {
UART.write("\x03s=require('Storage');\n", function() {
log("Connected");
function upload() {
if (!tiles.length) {
log("Success!");
return;
}
var tile = tiles.shift();
log("Uploading "+tile.name);
UART.eval('s.write('+JSON.stringify(tile.name)+','+tile.value+')',function(r) {
log("Returned "+r);
upload();
});
}
upload();
});
}, false);
</script>
</body>
</html>