[150] | 1 | var REGIONSIZE = 512;
|
---|
| 2 | var CHUNKSIZE = 16;
|
---|
| 3 | var TILESIZE = 128;
|
---|
| 4 | var MAXZOOM = 4;
|
---|
| 5 |
|
---|
[133] | 6 | SDTD_Projection = {
|
---|
| 7 | project: function (latlng) {
|
---|
| 8 | return new L.Point(latlng.lng / 16, latlng.lat / 16);
|
---|
| 9 | },
|
---|
| 10 |
|
---|
| 11 | unproject: function (point) {
|
---|
| 12 | return new L.LatLng(point.y * 16, point.x * 16);
|
---|
| 13 | }
|
---|
| 14 | };
|
---|
| 15 |
|
---|
| 16 | SDTD_CRS = L.extend({}, L.CRS.Simple, {
|
---|
| 17 | projection: SDTD_Projection,
|
---|
| 18 | transformation: new L.Transformation(1, 0, -1, 0),
|
---|
| 19 |
|
---|
| 20 | scale: function (zoom) {
|
---|
| 21 | return Math.pow(2, zoom);
|
---|
| 22 | }
|
---|
| 23 | });
|
---|
| 24 |
|
---|
[149] | 25 | var CoordToChunk = function(latlng) {
|
---|
[150] | 26 | var x = Math.floor(((latlng.lng + 16777216) / CHUNKSIZE) - (16777216 / CHUNKSIZE));
|
---|
| 27 | var y = Math.floor(((latlng.lat + 16777216) / CHUNKSIZE) - (16777216 / CHUNKSIZE));
|
---|
[149] | 28 | return L.latLng(y, x);
|
---|
| 29 | }
|
---|
| 30 |
|
---|
| 31 | var CoordToRegion = function(latlng) {
|
---|
[150] | 32 | var x = Math.floor(((latlng.lng + 16777216) / REGIONSIZE) - (16777216 / REGIONSIZE));
|
---|
| 33 | var y = Math.floor(((latlng.lat + 16777216) / REGIONSIZE) - (16777216 / REGIONSIZE));
|
---|
[149] | 34 | return L.latLng(y, x);
|
---|
| 35 | }
|
---|
| 36 |
|
---|
| 37 | var FormatCoord = function(latlng) {
|
---|
| 38 | return Math.abs(latlng.lat)+ (latlng.lat>=0 ? " N" : " S") + " / " + Math.abs(latlng.lng) + (latlng.lng>=0 ? " E" : " W");
|
---|
| 39 | }
|
---|
| 40 |
|
---|
[150] | 41 | var FormatRegionFileName = function(latlng) {
|
---|
| 42 | return "r." + latlng.lng + "." + latlng.lat + ".7rg";
|
---|
| 43 | }
|
---|
| 44 |
|
---|
[133] | 45 | var map = L.map('map', {
|
---|
| 46 | zoomControl: true,
|
---|
| 47 | attributionControl: false,
|
---|
| 48 | crs: SDTD_CRS
|
---|
| 49 | }).setView([0, 0], 0);
|
---|
| 50 |
|
---|
[150] | 51 | var tileLayer = L.tileLayer('../../map/{z}/{x}/{y}.png?t={time}', {
|
---|
| 52 | maxZoom: MAXZOOM+1,
|
---|
[133] | 53 | minZoom: 0,
|
---|
[150] | 54 | maxNativeZoom: MAXZOOM,
|
---|
| 55 | tileSize: TILESIZE,
|
---|
[133] | 56 | continuousWorld: true,
|
---|
| 57 | tms: true,
|
---|
| 58 | unloadInvisibleTiles: true,
|
---|
| 59 | time: function() { return new Date().getTime(); }
|
---|
[150] | 60 | });
|
---|
| 61 |
|
---|
| 62 | var regionLayer = L.tileLayer.canvas({
|
---|
| 63 | maxZoom: MAXZOOM+1,
|
---|
| 64 | minZoom: 0,
|
---|
| 65 | maxNativeZoom: MAXZOOM+1,
|
---|
| 66 | tileSize: TILESIZE,
|
---|
| 67 | continuousWorld: true
|
---|
| 68 | });
|
---|
| 69 |
|
---|
| 70 | regionLayer.drawTile = function(canvas, tilePoint, zoom) {
|
---|
| 71 | var blockWorldSize = TILESIZE * Math.pow(2, MAXZOOM-zoom);
|
---|
| 72 | var tileLeft = tilePoint.x * blockWorldSize;
|
---|
| 73 | var tileBottom = (-1-tilePoint.y) * blockWorldSize;
|
---|
| 74 | var blockPos = L.latLng(tileBottom, tileLeft);
|
---|
| 75 |
|
---|
| 76 | var ctx = canvas.getContext('2d');
|
---|
| 77 |
|
---|
| 78 | ctx.strokeStyle = "lightblue";
|
---|
| 79 | ctx.fillStyle = "lightblue";
|
---|
| 80 | ctx.lineWidth = 1;
|
---|
| 81 | ctx.font="14px Arial";
|
---|
| 82 |
|
---|
| 83 | var lineCount = blockWorldSize / REGIONSIZE;
|
---|
| 84 | if (lineCount >= 1) {
|
---|
| 85 | var pos = 0;
|
---|
| 86 | while (pos < TILESIZE) {
|
---|
| 87 | // Vertical
|
---|
| 88 | ctx.beginPath();
|
---|
| 89 | ctx.moveTo(pos, 0);
|
---|
| 90 | ctx.lineTo(pos, TILESIZE);
|
---|
| 91 | ctx.stroke();
|
---|
| 92 |
|
---|
| 93 | // Horizontal
|
---|
| 94 | ctx.beginPath();
|
---|
| 95 | ctx.moveTo(0, pos);
|
---|
| 96 | ctx.lineTo(TILESIZE, pos);
|
---|
| 97 | ctx.stroke();
|
---|
| 98 |
|
---|
| 99 | pos += TILESIZE / lineCount;
|
---|
| 100 | }
|
---|
| 101 | ctx.fillText(FormatRegionFileName(CoordToRegion(blockPos)), 4, TILESIZE-5);
|
---|
| 102 | } else {
|
---|
| 103 | if ((tileLeft % REGIONSIZE) == 0) {
|
---|
| 104 | // Vertical
|
---|
| 105 | ctx.beginPath();
|
---|
| 106 | ctx.moveTo(0, 0);
|
---|
| 107 | ctx.lineTo(0, TILESIZE);
|
---|
| 108 | ctx.stroke();
|
---|
| 109 | }
|
---|
| 110 | if ((tileBottom % REGIONSIZE) == 0) {
|
---|
| 111 | // Horizontal
|
---|
| 112 | ctx.beginPath();
|
---|
| 113 | ctx.moveTo(0, TILESIZE);
|
---|
| 114 | ctx.lineTo(TILESIZE, TILESIZE);
|
---|
| 115 | ctx.stroke();
|
---|
| 116 | }
|
---|
| 117 | if ((tileLeft % REGIONSIZE) == 0 && (tileBottom % REGIONSIZE) == 0) {
|
---|
| 118 | ctx.fillText(FormatRegionFileName(CoordToRegion(blockPos)), 4, TILESIZE-5);
|
---|
| 119 | }
|
---|
| 120 | }
|
---|
| 121 |
|
---|
| 122 | var pos = tileLeft;
|
---|
| 123 |
|
---|
| 124 | }
|
---|
| 125 |
|
---|
| 126 | var baseLayers = {
|
---|
| 127 | //"Map": tileLayer
|
---|
| 128 | };
|
---|
| 129 |
|
---|
| 130 | var overlays = {
|
---|
| 131 | "Region files": regionLayer
|
---|
| 132 | };
|
---|
| 133 |
|
---|
| 134 | tileLayer.addTo(map);
|
---|
| 135 | L.control.layers(baseLayers, overlays, {
|
---|
| 136 | collapsed: false
|
---|
[133] | 137 | }).addTo(map);
|
---|
| 138 |
|
---|
| 139 | map.on('mousemove', function(e) {
|
---|
[149] | 140 | L.DomUtil.get('pos').textContent = FormatCoord(e.latlng);
|
---|
[133] | 141 | });
|
---|