commit 88f0cfbf1b848a375252bd34c7aa36fd631c7772
parent 186c6e2269b5a49a220c7f59acd1fa7473a699d7
Author: Igor Sidorov <igor.sidorov@onapp.com>
Date: Sun, 27 May 2018 13:33:46 +0300
Modify PDF filename generation logic according to comments
Diffstat:
3 files changed, 132 insertions(+), 46 deletions(-)
diff --git a/src/layers.js b/src/layers.js
@@ -20,6 +20,7 @@ export default function getLayers() {
{
title: 'OpenStreetMap',
description: 'OSM default style',
+ shortName: 'osm',
order: 100,
isOverlay: false,
isDefault: true,
@@ -29,6 +30,7 @@ export default function getLayers() {
},
{
title: 'ESRI Sat',
+ shortName: 'esri',
order: 200,
isOverlay: false,
isDefault: true,
@@ -39,6 +41,7 @@ export default function getLayers() {
},
{
title: 'Yandex map',
+ shortName: 'yandex',
order: 300,
isOverlay: false,
isDefault: true,
@@ -46,6 +49,7 @@ export default function getLayers() {
},
{
title: 'Yandex Satellite',
+ shortName: 'yandex_sat',
order: 400,
isOverlay: false,
isDefault: true,
@@ -53,6 +57,7 @@ export default function getLayers() {
},
{
title: 'Google',
+ shortName: 'google',
order: 500,
isOverlay: false,
isDefault: true,
@@ -60,6 +65,7 @@ export default function getLayers() {
},
{
title: 'Google Satellite',
+ shortName: 'google_sat',
order: 600,
isOverlay: false,
isDefault: true,
@@ -67,6 +73,7 @@ export default function getLayers() {
},
{
title: 'Google Terrain',
+ shortName: 'google_terrain',
order: 650,
isOverlay: false,
isDefault: true,
@@ -74,6 +81,7 @@ export default function getLayers() {
},
{
title: 'Bing Sat',
+ shortName: 'bing',
order: 700,
isOverlay: false,
isDefault: true,
@@ -82,6 +90,7 @@ export default function getLayers() {
{
title: 'marshruty.ru',
+ shortName: 'marshruty',
order: 800,
isOverlay: false,
isDefault: true,
@@ -91,6 +100,7 @@ export default function getLayers() {
},
{
title: 'Topomapper 1km',
+ shortName: 'topomapper_1k',
order: 900,
isOverlay: false,
isDefault: true,
@@ -102,6 +112,7 @@ export default function getLayers() {
{
title: 'Topo 10km',
+ shortName: 'topo_10k',
order: 10100,
isOverlay: true,
isDefault: true,
@@ -111,6 +122,7 @@ export default function getLayers() {
},
{
title: 'GGC 2 km',
+ shortName: 'ggc_2k',
order: 10200,
isOverlay: true,
isDefault: true,
@@ -120,6 +132,7 @@ export default function getLayers() {
},
{
title: 'ArbaletMO',
+ shortName: 'arbalet',
order: 10300,
isOverlay: true,
isDefault: true,
@@ -129,6 +142,7 @@ export default function getLayers() {
},
{
title: 'Slazav mountains',
+ shortName: 'slazav_mountains',
order: 10400,
isOverlay: true,
isDefault: true,
@@ -138,6 +152,7 @@ export default function getLayers() {
},
{
title: 'GGC 1km',
+ shortName: 'ggc_1k',
order: 10500,
isOverlay: true,
isDefault: true,
@@ -147,6 +162,7 @@ export default function getLayers() {
},
{
title: 'Topo 1km',
+ shortName: 'topo_1k',
order: 10600,
isOverlay: true,
isDefault: true,
@@ -156,6 +172,7 @@ export default function getLayers() {
},
{
title: 'GGC 500m',
+ shortName: 'ggc_500',
order: 10700,
isOverlay: true,
isDefault: true,
@@ -165,6 +182,7 @@ export default function getLayers() {
},
{
title: 'Topo 500m',
+ shortName: 'topo_500',
order: 10800,
isOverlay: true,
isDefault: true,
@@ -174,6 +192,7 @@ export default function getLayers() {
},
{
title: 'GGC 250m',
+ shortName: 'ggc_250',
order: 10900,
isOverlay: true,
isDefault: true,
@@ -183,6 +202,7 @@ export default function getLayers() {
},
{
title: 'Slazav map',
+ shortName: 'slazav',
order: 11000,
isOverlay: true,
isDefault: true,
@@ -192,8 +212,10 @@ export default function getLayers() {
},
{
title: 'Races',
+ shortName: 'races',
order: 11050,
isOverlay: true,
+ isOverlayTransparent: true,
isDefault: true,
layer: L.tileLayer("https://tiles.nakarte.tk/adraces/{z}/{x}/{y}",
{code: 'U', tms: true, scaleDependent: false, maxNativeZoom: 15, print: true, jnx: true}
@@ -201,8 +223,10 @@ export default function getLayers() {
},
{
title: 'O-sport',
+ shortName: 'osport',
order: 11100,
isOverlay: true,
+ isOverlayTransparent: true,
isDefault: true,
layer: L.tileLayer("https://tiles.nakarte.tk/osport/{z}/{x}/{y}",
{code: 'R', tms: true, scaleDependent: false, maxNativeZoom: 17, print: true, jnx: true}
@@ -210,6 +234,7 @@ export default function getLayers() {
},
{
title: 'Soviet topo maps grid',
+ shortName: 'soviet_topo_grid',
order: 11200,
isOverlay: true,
isDefault: true,
@@ -217,6 +242,7 @@ export default function getLayers() {
},
{
title: 'Wikimapia',
+ shortName: 'wikimapia',
order: 11300,
isOverlay: true,
isDefault: true,
@@ -224,8 +250,10 @@ export default function getLayers() {
},
{
title: 'Mountain passes (Westra)',
+ shortName: 'westra',
order: 11400,
isOverlay: true,
+ isOverlayTransparent: true,
isDefault: true,
layer: new L.Layer.WestraPasses(config.westraDataBaseUrl, {
code: 'Wp',
@@ -254,6 +282,7 @@ export default function getLayers() {
layers: [
{
title: 'OpenTopoMap',
+ shortName: 'opentopo',
order: 110,
isOverlay: false,
isDefault: false,
@@ -263,6 +292,7 @@ export default function getLayers() {
},
{
title: 'OpenCycleMap',
+ shortName: 'ocm',
description: '<a href="https://www.opencyclemap.org/docs/">(Info and key)</a>',
order: 120,
isOverlay: false,
@@ -273,6 +303,7 @@ export default function getLayers() {
},
{
title: 'OSM Outdoors',
+ shortName: 'osm_outdoors',
order: 130,
isOverlay: false,
isDefault: false,
@@ -287,6 +318,7 @@ export default function getLayers() {
layers: [
{
title: 'Eurasia 25km',
+ shortName: 'eurasia_25k',
description: '1975-80',
order: 10090,
isOverlay: true,
@@ -297,6 +329,7 @@ export default function getLayers() {
},
{
title: 'Caucasus 1km',
+ shortName: 'caucasus_1k',
order: 10610,
isOverlay: true,
isDefault: false,
@@ -306,6 +339,7 @@ export default function getLayers() {
},
{
title: 'Caucasus 500m',
+ shortName: 'caucasus_500',
order: 10810,
isOverlay: true,
isDefault: false,
@@ -315,6 +349,7 @@ export default function getLayers() {
},
{
title: 'Topo 250m',
+ shortName: 'topo_250',
order: 10950,
isOverlay: true,
isDefault: false,
@@ -324,6 +359,7 @@ export default function getLayers() {
},
{
title: 'Montenegro topo 250m',
+ shortName: 'montenegro_250',
description: '1970-72',
order: 10960,
isOverlay: true,
@@ -339,6 +375,7 @@ export default function getLayers() {
layers: [
{
title: 'Mountains by Aleksey Tsvetkov',
+ shortName: 'tsvetkov_mountains',
description: 'Tian Shan, Dzungaria, <a href="http://pereval.g-utka.ru/">http://pereval.g-utka.ru/</a>',
order: 10390,
isOverlay: true,
@@ -364,6 +401,7 @@ export default function getLayers() {
layers: [
{
title: 'Bing imagery acquisition dates',
+ shortName: 'bind_dates',
order: 11110,
isOverlay: true,
isDefault: false,
@@ -378,6 +416,7 @@ export default function getLayers() {
},
{
title: 'geocaching.su',
+ shortName: 'geocaching',
order: 11500,
isOverlay: true,
isDefault: false,
@@ -389,6 +428,7 @@ export default function getLayers() {
},
{
title: 'OpenStreetMap GPS traces',
+ shortName: 'osm_gps_traces',
order: 11120,
isOverlay: true,
isDefault: false,
@@ -398,6 +438,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap (all)',
+ shortName: 'strava',
order: 11130,
isOverlay: true,
isDefault: false,
@@ -408,6 +449,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap (run)',
+ shortName: 'strava_run',
order: 11131,
isOverlay: true,
isDefault: false,
@@ -418,6 +460,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap (ride)',
+ shortName: 'strava_ride',
order: 11132,
isOverlay: true,
isDefault: false,
@@ -428,6 +471,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap (winter)',
+ shortName: 'strava_winter',
order: 11133,
isOverlay: true,
isDefault: false,
@@ -438,6 +482,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap lowres (all)',
+ shortName: 'strava_lowres',
order: 11134,
isOverlay: true,
isDefault: false,
@@ -448,6 +493,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap lowres (run)',
+ shortName: 'strava_lowres_run',
order: 11135,
isOverlay: true,
isDefault: false,
@@ -458,6 +504,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap lowres (ride)',
+ shortName: 'strava_lowres_ride',
order: 11136,
isOverlay: true,
isDefault: false,
@@ -468,6 +515,7 @@ export default function getLayers() {
},
{
title: 'Strava heatmap lowres (winter)',
+ shortName: 'strava_lowres_winter',
order: 11137,
isOverlay: true,
isDefault: false,
@@ -485,6 +533,7 @@ export default function getLayers() {
{
// Вместо 404 отдают 500 для отсутствующих тайлов
title: 'Norway UT map',
+ shortName: 'norway_ut',
order: 5000,
isOverlay: false,
isDefault: false,
@@ -494,6 +543,7 @@ export default function getLayers() {
},
{
title: 'Norway paper map',
+ shortName: 'norway_paper',
order: 10310,
isOverlay: true,
isDefault: false,
@@ -503,6 +553,7 @@ export default function getLayers() {
},
{
title: 'Norway map',
+ shortName: 'norway',
order: 10320,
isOverlay: true,
isDefault: false,
@@ -512,6 +563,7 @@ export default function getLayers() {
},
{
title: 'Norway summer trails',
+ shortName: 'norway_summer',
order: 20000,
isOverlay: true,
isDefault: false,
@@ -521,6 +573,7 @@ export default function getLayers() {
},
{
title: 'Norway winter trails',
+ shortName: 'norway_winter',
order: 20010,
isOverlay: true,
isDefault: false,
@@ -531,6 +584,7 @@ export default function getLayers() {
{
// Вместо 404 отдают 500 для отсутствующих тайлов
title: 'Norway roads',
+ shortName: 'norway_roads',
description: '<a href="https://kart.finn.no/">https://kart.finn.no/</a>',
order: 5030,
isOverlay: false,
@@ -545,6 +599,7 @@ export default function getLayers() {
layers: [
{
title: 'Czech base',
+ shortName: 'czech',
order: 5040,
isOverlay: false,
isDefault: false,
@@ -554,6 +609,7 @@ export default function getLayers() {
},
{
title: 'Czech tourist',
+ shortName: 'czech_tourist',
order: 5050,
isOverlay: false,
isDefault: false,
@@ -563,6 +619,7 @@ export default function getLayers() {
},
{
title: 'Czech summer',
+ shortName: 'czech_summer',
order: 5060,
isOverlay: false,
isDefault: false,
@@ -572,6 +629,7 @@ export default function getLayers() {
},
{
title: 'Czech winter',
+ shortName: 'czech_winter',
order: 5070,
isOverlay: false,
isDefault: false,
@@ -581,6 +639,7 @@ export default function getLayers() {
},
{
title: 'Czech geographical',
+ shortName: 'czech_geo',
order: 5080,
isOverlay: false,
isDefault: false,
@@ -593,6 +652,7 @@ export default function getLayers() {
// TODO: move it to tests
const codes = {};
const orders = {};
+ const shortNames = new Set();
for (let group of layers) {
for (let layer of group.layers) {
if (!layer.layer.options) {
@@ -614,6 +674,14 @@ export default function getLayers() {
throw new Error(`Duplicate layer order "${order}"`);
}
orders[order] = 1;
+ let shortName = layer.shortName;
+ if (!shortName) {
+ throw new Error('Layer without shortName: ' + layer.title);
+ }
+ if (shortNames.has(shortName)) {
+ throw new Error(`Duplicate layer shortName "${shortName}"`);
+ }
+ shortNames.add(shortName);
}
}
return layers;
diff --git a/src/lib/leaflet.control.printPages/control.js b/src/lib/leaflet.control.printPages/control.js
@@ -17,6 +17,7 @@ import logging from 'lib/logging';
import {MagneticMeridians} from './decoration.magnetic-meridians';
import {OverlayScale} from './decoration.scale';
import {Grid} from './decoration.grid';
+import getLayers from 'layers';
ko.extenders.checkNumberRange = function(target, range) {
return ko.pureComputed({
@@ -208,7 +209,6 @@ L.Control.PrintPages = L.Control.extend({
}
);
const resolution = this.resolution();
- const zooms = this.zoomForPrint();
const decorationLayers = [];
if (this.gridOn()) {
decorationLayers.push(new Grid());
@@ -220,18 +220,17 @@ L.Control.PrintPages = L.Control.extend({
renderPages({
map: this._map,
pages,
- zooms,
+ zooms: this.zoomForPrint(),
resolution,
scale: this.scale(),
decorationLayers,
progressCallback: this.incrementProgress.bind(this)
}
- ).then(({images, layers}) => {
+ ).then(({images, renderedLayerCodes}) => {
if (images) {
const fileName = this.getFileName({
- layers,
- zooms,
- extension: 'pdf'
+ renderedLayerCodes,
+ extension: 'pdf'
});
savePagesPdf(images, resolution, fileName);
}
@@ -250,7 +249,6 @@ L.Control.PrintPages = L.Control.extend({
printSize: page.getPrintSize(),
label: page.getLabel()
}];
- const zooms = this.zoomForPrint();
const decorationLayers = [];
if (this.gridOn()) {
decorationLayers.push(new Grid());
@@ -265,20 +263,19 @@ L.Control.PrintPages = L.Control.extend({
renderPages({
map: this._map,
pages,
- zooms,
+ zooms: this.zoomForPrint(),
resolution: this.resolution(),
scale: this.scale(),
decorationLayers,
progressCallback: this.incrementProgress.bind(this)
}
)
- .then(({images, layers}) => {
- const fileName = this.getFileName({
- layers,
- zooms,
- extension: 'jpg'
- });
- savePageJpg(images[0], fileName);
+ .then(({images, renderedLayerCodes}) => {
+ const fileName = this.getFileName({
+ renderedLayerCodes,
+ extension: 'jpg'
+ });
+ savePageJpg(images[0], fileName);
})
.catch((e) => {
logging.captureException(e);
@@ -477,43 +474,59 @@ L.Control.PrintPages = L.Control.extend({
return true;
},
- getFileName: function({layers, zooms, extension}) {
- let fileName = 'nakarte.tk_';
-
- const width = this.pageWidth();
- const height = this.pageHeight();
-
- const currentPageSize = this.pageSizes.find((pageSize) => {
- return (width == pageSize.width) && (height == pageSize.height);
+ getFileName: function({renderedLayerCodes, extension}) {
+ let fileName = '';
+
+ const baseLayers = [];
+ const overlayLayers = [];
+ const transparentOverlayLayers = [];
+
+ getLayers().forEach(({ layers: layerGroup }) => {
+ layerGroup.forEach((layer) => {
+ if (renderedLayerCodes.has(layer.layer.options.code)) {
+ if (layer.isOverlay) {
+ if (layer.isOverlayTransparent) {
+ transparentOverlayLayers.push(layer);
+ } else {
+ overlayLayers.push(layer);
+ }
+ } else {
+ baseLayers.push(layer);
+ }
+ }
+ });
});
- if (currentPageSize) {
- fileName += currentPageSize.name;
- } else {
- fileName += `${width}x${height}`;
+ const compare = (layer1, layer2) => {
+ if (layer1.order < layer2.order) return 1;
+ if (layer1.order > layer2.order) return -1;
+ return 0;
}
+ baseLayers.sort(compare);
+ overlayLayers.sort(compare);
+ transparentOverlayLayers.sort(compare);
- const layerZooms = new Set();
+ const appendLayerShortName = (layer) => {
+ fileName += `${layer.shortName}_`;
+ }
+ if (overlayLayers.length > 0) {
+ appendLayerShortName(overlayLayers[0]);
+ } else if (baseLayers.length > 0) {
+ appendLayerShortName(baseLayers[0]);
+ }
+ transparentOverlayLayers.forEach(appendLayerShortName);
- layers.map((layer) => {
- const { options } = layer
- if (options) {
- const { code, scaleDependent } = options
+ fileName += `${this.scale()}m`;
- if (code) {
- fileName += `_${code}`;
- }
- if (scaleDependent) {
- layerZooms.add(zooms.mapZoom);
- } else {
- layerZooms.add(zooms.satZoom);
- }
- }
+ const width = this.pageWidth();
+ const height = this.pageHeight();
+
+ const currentPageSize = this.pageSizes.find((pageSize) => {
+ return (width == pageSize.width) && (height == pageSize.height);
});
- if (layerZooms.size > 0) {
- let layerZoomsName = [...layerZooms].join('_');
- fileName += `_Z${layerZoomsName}`;
+ if (currentPageSize) {
+ fileName += `_${currentPageSize.name}`;
}
return `${fileName}.${extension}`;
diff --git a/src/lib/leaflet.control.printPages/map-render.js b/src/lib/leaflet.control.printPages/map-render.js
@@ -185,6 +185,7 @@ async function* iterateLayersTiles(layers, latLngBounds, destPixelSize, resoluti
};
let doStop;
for (let layer of layers) {
+ const layerCode = layer.options && layer.options.code;
let zoom;
if (layer.options && layer.options.scaleDependent) {
zoom = zooms.mapZoom;
@@ -217,7 +218,7 @@ async function* iterateLayersTiles(layers, latLngBounds, destPixelSize, resoluti
layerPromises.push(tilePromise.tilePromise);
let progressInc = (layer._printProgressWeight || 1) / count;
tilePromise.tilePromise =
- tilePromise.tilePromise.then((tileInfo) => Object.assign({zoom, progressInc}, tileInfo));
+ tilePromise.tilePromise.then((tileInfo) => Object.assign({zoom, progressInc, layerCode}, tileInfo));
doStop = yield tilePromise;
if (doStop) {
tilePromise.abortLoading();
@@ -276,6 +277,7 @@ async function renderPages({map, pages, zooms, resolution, scale, progressCallba
}
progressRange *= pages.length;
const pageImagesInfo = [];
+ const renderedLayerCodes = new Set();
for (let page of pages) {
let destPixelSize = page.printSize.multiplyBy(resolution / 25.4).round();
let pixelBounds = L.bounds(
@@ -301,6 +303,9 @@ async function renderPages({map, pages, zooms, resolution, scale, progressCallba
}
progressCallback(tileInfo.progressInc, progressRange);
composer.putTile(tileInfo);
+ if (tileInfo.image) {
+ renderedLayerCodes.add(tileInfo.layerCode);
+ }
}
const dataUrl = composer.getDataUrl();
let data = dataUrl.substring(dataUrl.indexOf(',') + 1);
@@ -312,7 +317,7 @@ async function renderPages({map, pages, zooms, resolution, scale, progressCallba
}
);
}
- return { images: pageImagesInfo, layers };
+ return { images: pageImagesInfo, renderedLayerCodes };
}