mirror of https://github.com/espruino/BangleApps
remove map from testing - now in openstreetmap
parent
abcfca83e9
commit
7b404cb12f
|
@ -1,3 +0,0 @@
|
|||
This code can take an image file, split it into tiles, and then render those tiles on the watch - making them fit with the GPS data.
|
||||
|
||||
Problem is right now I can't automate getting the rendered area of map, so can't turn it into a very useful tool for BangleApps.
|
|
@ -1,83 +0,0 @@
|
|||
require("Storage").write('+map',{
|
||||
name:"Map",
|
||||
icon:"*map",
|
||||
src:"-map"
|
||||
});
|
||||
require("Storage").write('*map',require("heatshrink").decompress(atob("mEwghC/AH4AWh//mcwBZIWI/4ABmYABBZAgIC4oyDBYggIC4wABBYoX/C90imcykYXUkYBB+YyDC5E/F5EykQXKHwYVCL4YXNkQ+BC4wICHgIvJ+QVBC4oYBkUvO5QXCU4wXBF5INCCwqMDAYTXUC6xHNC5Z3LI5UyF6oADF9ZfL+fTAIIUCkUjR5397s9C4LxBC4MykfzDYYvI7vdC4cyDIciO5c97s/C4QABF4IBBC5QvEAAk/+ZdBC5JfEX6XzmaPEa7oX8+AGBgYXHBYQXHBAoXFCowXCEA4yCBZIA/AH4AO")));
|
||||
|
||||
require("Storage").write("-map",`
|
||||
var s = require("Storage");
|
||||
var hs = require("heatshrink");
|
||||
var map = {
|
||||
imgx : 831,
|
||||
imgy : 656,
|
||||
tilesize : 64,
|
||||
scale : 20000,
|
||||
lat : 51.7075,
|
||||
lon : -1.2948
|
||||
};
|
||||
|
||||
|
||||
map.center = Bangle.project({lat:map.lat,lon:map.lon});
|
||||
var lat = map.lat, lon = map.lon;
|
||||
var fix = {};
|
||||
|
||||
|
||||
function redraw() {
|
||||
var cx = g.getWidth()/2;
|
||||
var cy = g.getHeight()/2;
|
||||
var p = Bangle.project({lat:lat,lon:lon});
|
||||
var ix = (p.x-map.center.x)*4096/map.scale + (map.imgx/2) - cx;
|
||||
var iy = (map.center.y-p.y)*4096/map.scale + (map.imgy/2) - cy;
|
||||
//console.log(ix,iy);
|
||||
var tx = 0|(ix/map.tilesize);
|
||||
var ty = 0|(iy/map.tilesize);
|
||||
var ox = (tx*map.tilesize)-ix;
|
||||
var oy = (ty*map.tilesize)-iy;
|
||||
for (var x=ox,ttx=tx;x<g.getWidth();x+=map.tilesize,ttx++) {
|
||||
for (var y=oy,tty=ty;y<g.getHeight();y+=map.tilesize,tty++) {
|
||||
var img = s.read("t"+ttx+"x"+tty);
|
||||
//print(x,y,ttx,tty,"t"+ttx+"x"+tty,img?"ok":"-");
|
||||
if (img) g.drawImage(hs.decompress(img),x,y);
|
||||
else g.clearRect(x,y,x+map.tilesize-1,y+map.tilesize-1);
|
||||
}
|
||||
}
|
||||
g.setColor(1,0,0);
|
||||
/*g.fillRect(cx-10,cy-1,cx+10,cy+1);
|
||||
g.fillRect(cx-1,cy-10,cx+1,cy+10);*/
|
||||
if (fix.fix)
|
||||
g.fillRect(cx-2,cy-2,cx+2,cy+2);
|
||||
}
|
||||
redraw();
|
||||
|
||||
var fix;
|
||||
Bangle.on('GPS',function(f) {
|
||||
fix=f;
|
||||
g.clearRect(0,0,240,8);
|
||||
g.setColor(1,1,1);
|
||||
g.setFont("6x8");
|
||||
g.setFontAlign(0,0);
|
||||
var txt = fix.satellites+" satellites";
|
||||
if (!fix.fix)
|
||||
txt += " - NO FIX";
|
||||
g.drawString(txt,120,4);
|
||||
if (fix.fix) {
|
||||
var p = Bangle.project({lat:lat,lon:lon});
|
||||
var q = Bangle.project(fix);
|
||||
var cx = g.getWidth()/2;
|
||||
var cy = g.getHeight()/2;
|
||||
var ix = (q.x-p.x)*4096/map.scale + cx;
|
||||
var iy = (q.y-p.y)*4096/map.scale + cy;
|
||||
g.fillRect(ix-2,iy-2,ix+2,iy+2);
|
||||
}
|
||||
});
|
||||
Bangle.setGPSPower(1);
|
||||
redraw();
|
||||
|
||||
setWatch(function() {
|
||||
if (!fix.fix) return;
|
||||
lat = fix.lat;
|
||||
lon = fix.lon;
|
||||
redraw();
|
||||
}, BTN2, {repeat:true});
|
||||
`);
|
|
@ -1,155 +0,0 @@
|
|||
<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>
|
Loading…
Reference in New Issue