nakarte

Source code of https://map.sikmir.ru (fork)
git clone git://git.sikmir.ru/nakarte
Log | Files | Refs | LICENSE

commit c7590c36ce60dafad385ddb810d02fb984d758f3
parent 57215a908ab74e3e9f5640bac2add2ff23a64c96
Author: Sergej Orlov <wladimirych@gmail.com>
Date:   Fri,  3 Mar 2017 02:17:17 +0300

[print] waypoints and westra passes are now printed as overlays at target canvas resolution

Diffstat:
Msrc/lib/leaflet.control.printPages/map-render.js | 4++--
Msrc/lib/leaflet.layer.rasterize/CanvasMarkers.js | 44+++++++++++++++++++++++++++++++++++++++++---
Msrc/lib/leaflet.layer.rasterize/WestraPasses.js | 44+++++++++++++++++---------------------------
Msrc/lib/leaflet.layer.westraPasses/westraPassesMarkers.js | 1+
4 files changed, 61 insertions(+), 32 deletions(-)

diff --git a/src/lib/leaflet.control.printPages/map-render.js b/src/lib/leaflet.control.printPages/map-render.js @@ -121,7 +121,7 @@ class PageComposer { } let zoom; if (tileInfo.isOverlay) { - zoom = 'overlay'; + zoom = tileInfo.overlaySolid ? 'solidOverlay' : 'overlay'; } else { zoom = tileInfo.zoom; } @@ -141,7 +141,7 @@ class PageComposer { setupCurrentCanvas(zoom) { let size; - if (zoom === 'overlay') { + if (zoom === 'overlay' || zoom === 'solidOverlay') { size = this.destSize; } else { const q = 1 << (24 - zoom); diff --git a/src/lib/leaflet.layer.rasterize/CanvasMarkers.js b/src/lib/leaflet.layer.rasterize/CanvasMarkers.js @@ -1,8 +1,6 @@ import L from "leaflet"; import 'lib/leaflet.layer.canvasMarkers' -import {CanvasLayerGrabMixin} from './TileLayer'; -L.Layer.CanvasMarkers.include(CanvasLayerGrabMixin); L.Layer.CanvasMarkers.include({ _printProgressWeight: 0.1, @@ -22,9 +20,49 @@ L.Layer.CanvasMarkers.include({ }, cloneForPrint: function(options) { - options = L.Util.extend({}, this.options, {iconScale: 1, labelFontSize: 12}); + options = L.Util.extend({}, this.options); return new L.Layer.CanvasMarkers(this.cloneMarkers(), options); + }, + + getTilesInfo: async function(printOptions) { + this.options.iconScale = printOptions.resolution / 90 * 0.75; + const scale = printOptions.pixelBounds.getSize().x / printOptions.destPixelSize.x; + const pixelExtents = { + tileN: printOptions.pixelBounds.getTopRight().y / scale, + tileS: printOptions.pixelBounds.getBottomLeft().y / scale, + tileE: printOptions.pixelBounds.getTopRight().x / scale, + tileW: printOptions.pixelBounds.getBottomLeft().x / scale + }; + const crs = L.CRS.EPSG3857; + if (!this._map) { + const dummyMap = { + project: crs.latLngToPoint.bind(crs), + unproject: crs.pointToLatLng.bind(crs), + }; + this._map = dummyMap; + } + const zoom = crs.zoom((1 / scale) * crs.scale(printOptions.zoom)); + const {iconUrls, markerJobs, pointsForLabels} = this.selectMarkersForDraw(pixelExtents, zoom, false); + console.log(iconUrls, markerJobs, pointsForLabels); + await this.preloadIcons(iconUrls); + return { + iterateTilePromises: (function*() { + yield { + tilePromise: Promise.resolve({ + draw: (canvas) => { + this.drawSelectedMarkers(canvas, pixelExtents, markerJobs, pointsForLabels, zoom); + }, + isOverlay: true, + overlaySolid: true + } + ), + abortLoading: () => { + } + } + }).bind(this), + count: 1 + }; } } ); diff --git a/src/lib/leaflet.layer.rasterize/WestraPasses.js b/src/lib/leaflet.layer.rasterize/WestraPasses.js @@ -1,32 +1,8 @@ import L from "leaflet"; import 'lib/leaflet.layer.westraPasses'; import {WestraPassesMarkers} from 'lib/leaflet.layer.westraPasses/westraPassesMarkers'; -import {CanvasLayerGrabMixin} from './TileLayer'; import 'lib/leaflet.layer.canvasMarkers' - -const WestraPrint = L.Layer.CanvasMarkers.extend({ - includes: CanvasLayerGrabMixin, - - initialize: function(srcLayer, options) { - this.srcLayer = srcLayer; - L.Layer.CanvasMarkers.prototype.initialize.call(this, null, options); - }, - - waitTilesReadyToGrab: function() { - let promise; - if (this.srcLayer._dataLoaded) { - promise = Promise.resolve(null); - } else { - // FIXME: handle data load errors - promise = new Promise((resolve) => { - this.srcLayer.once('data-loaded', resolve); - }) - } - return promise.then(() => { - this.addMarkers(this.srcLayer.rtree.all()); - }) - }, -}); +import './CanvasMarkers'; L.Layer.WestraPasses.addInitHook(function() { this.markers.options.print = this.options.print; @@ -34,8 +10,22 @@ L.Layer.WestraPasses.addInitHook(function() { }); WestraPassesMarkers.include({ + waitDataReady: function() { + if (this._dataLoaded) { + return Promise.resolve() + } + return new Promise((resolve) => { + this.on('data-loaded', resolve); + }); + }, + cloneForPrint: function (options) { - return new WestraPrint(this, L.Util.extend( - {}, this.options, {iconScale: 1.5, labelFontSize: 14}, options)); + options = L.Util.extend({}, options); + return new WestraPassesMarkers(this._baseUrl, options); + }, + + getTilesInfo: async function(printOptions) { + await this.waitDataReady(); + return await L.Layer.CanvasMarkers.prototype.getTilesInfo.call(this, printOptions); } }); diff --git a/src/lib/leaflet.layer.westraPasses/westraPassesMarkers.js b/src/lib/leaflet.layer.westraPasses/westraPassesMarkers.js @@ -17,6 +17,7 @@ const WestraPassesMarkers = L.Layer.CanvasMarkers.extend({ initialize: function(baseUrl, options) { L.Layer.CanvasMarkers.prototype.initialize.call(this, null, options); this.on('markerclick', this.showPassDescription, this); + this._baseUrl = baseUrl; this.url = baseUrl + this.options.filePasses; },