mirror of https://github.com/espruino/BangleApps
156 lines
5.3 KiB
HTML
156 lines
5.3 KiB
HTML
<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>
|