mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-03-13 16:22:59 +00:00
Compare commits
33 Commits
main
...
f3c298642c
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3c298642c | ||
|
|
b2568aa338 | ||
|
|
77ca98d2f5 | ||
|
|
aa370b6961 | ||
|
|
4bb77f113c | ||
|
|
5319733cf3 | ||
|
|
84883f44c0 | ||
|
|
92f442a79e | ||
|
|
dd2637971b | ||
|
|
0667f6ece2 | ||
|
|
c62b75c6ef | ||
|
|
2fb7e77b63 | ||
|
|
f4ced434a7 | ||
|
|
03dec13229 | ||
|
|
411afdfdb1 | ||
|
|
adbdf86de4 | ||
|
|
866a6a6916 | ||
|
|
bd42a7e270 | ||
|
|
2b951615ae | ||
|
|
fabf36c2ba | ||
|
|
d216b36ed6 | ||
|
|
e8f40fe206 | ||
|
|
3dc24d95e5 | ||
|
|
744f36f981 | ||
|
|
2e24dedcb2 | ||
|
|
e380764188 | ||
|
|
47c3edd496 | ||
|
|
d6eeddaa0e | ||
|
|
e57692c4f0 | ||
|
|
8c77490f1b | ||
|
|
6c4baf76bc | ||
|
|
64e1c24a58 | ||
|
|
87e2571170 |
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2026 gpx.studio
|
||||
Copyright (c) 2025 gpx.studio
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
}
|
||||
},
|
||||
"sprite": "https://demotiles.maplibre.org/styles/osm-bright-gl-style/sprite",
|
||||
"glyphs": "https://api.maptiler.com/fonts/{fontstack}/{range}.pbf?key={key}",
|
||||
"layers": [
|
||||
{
|
||||
"id": "background",
|
||||
|
||||
@@ -22,7 +22,7 @@ import {
|
||||
Binoculars,
|
||||
Toilet,
|
||||
} from 'lucide-static';
|
||||
import { type RasterDEMSourceSpecification, type StyleSpecification } from 'mapbox-gl';
|
||||
import { type StyleSpecification } from 'mapbox-gl';
|
||||
import ignFrTopo from './custom/ign-fr-topo.json';
|
||||
import ignFrPlan from './custom/ign-fr-plan.json';
|
||||
import ignFrSatellite from './custom/ign-fr-satellite.json';
|
||||
@@ -388,22 +388,6 @@ export const overlays: { [key: string]: string | StyleSpecification } = {
|
||||
},
|
||||
],
|
||||
},
|
||||
mapterhornHillshade: {
|
||||
version: 8,
|
||||
sources: {
|
||||
mapterhornHillshade: {
|
||||
type: 'raster-dem',
|
||||
url: 'https://tiles.mapterhorn.com/tilejson.json',
|
||||
},
|
||||
},
|
||||
layers: [
|
||||
{
|
||||
id: 'mapterhornHillshade',
|
||||
type: 'hillshade',
|
||||
source: 'mapterhornHillshade',
|
||||
},
|
||||
],
|
||||
},
|
||||
swisstopoSlope: {
|
||||
version: 8,
|
||||
sources: {
|
||||
@@ -835,9 +819,8 @@ export const overlayTree: LayerTreeType = {
|
||||
waymarkedTrailsHorseRiding: true,
|
||||
waymarkedTrailsWinter: true,
|
||||
},
|
||||
bikerouterGravel: true,
|
||||
cyclOSMlite: true,
|
||||
mapterhornHillshade: true,
|
||||
bikerouterGravel: true,
|
||||
openRailwayMap: true,
|
||||
},
|
||||
countries: {
|
||||
@@ -921,9 +904,8 @@ export const defaultOverlays: LayerTreeType = {
|
||||
waymarkedTrailsHorseRiding: false,
|
||||
waymarkedTrailsWinter: false,
|
||||
},
|
||||
bikerouterGravel: false,
|
||||
cyclOSMlite: false,
|
||||
mapterhornHillshade: false,
|
||||
bikerouterGravel: false,
|
||||
openRailwayMap: false,
|
||||
},
|
||||
countries: {
|
||||
@@ -1058,9 +1040,8 @@ export const defaultOverlayTree: LayerTreeType = {
|
||||
waymarkedTrailsHorseRiding: false,
|
||||
waymarkedTrailsWinter: false,
|
||||
},
|
||||
bikerouterGravel: false,
|
||||
cyclOSMlite: false,
|
||||
mapterhornHillshade: false,
|
||||
bikerouterGravel: false,
|
||||
openRailwayMap: false,
|
||||
},
|
||||
countries: {
|
||||
@@ -1453,18 +1434,3 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
|
||||
symbol: 'Anchor',
|
||||
},
|
||||
};
|
||||
|
||||
export const terrainSources: { [key: string]: RasterDEMSourceSpecification } = {
|
||||
'mapbox-dem': {
|
||||
type: 'raster-dem',
|
||||
url: 'mapbox://mapbox.mapbox-terrain-dem-v1',
|
||||
tileSize: 512,
|
||||
maxzoom: 14,
|
||||
},
|
||||
mapterhorn: {
|
||||
type: 'raster-dem',
|
||||
url: 'https://tiles.mapterhorn.com/tilejson.json',
|
||||
},
|
||||
};
|
||||
|
||||
export const defaultTerrainSource = 'mapbox-dem';
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
href="https://github.com/gpxstudio/gpx.studio/blob/main/LICENSE"
|
||||
target="_blank"
|
||||
>
|
||||
MIT © 2026 gpx.studio
|
||||
MIT © 2025 gpx.studio
|
||||
</Button>
|
||||
<LanguageSelect class="w-40 mt-3" />
|
||||
</div>
|
||||
|
||||
@@ -34,10 +34,11 @@
|
||||
import { editStyle } from '$lib/components/file-list/style/utils.svelte';
|
||||
import { getSymbolKey, symbols } from '$lib/assets/symbols';
|
||||
import { selection, copied, cut } from '$lib/logic/selection';
|
||||
import { map } from '$lib/components/map/map';
|
||||
import { fileActions, pasteSelection } from '$lib/logic/file-actions';
|
||||
import { allHidden } from '$lib/logic/hidden';
|
||||
import { boundsManager } from '$lib/logic/bounds';
|
||||
import { gpxColors, gpxLayers } from '$lib/components/map/gpx-layer/gpx-layers';
|
||||
import { gpxLayers } from '$lib/components/map/gpx-layer/gpx-layers';
|
||||
import { fileStateCollection } from '$lib/logic/file-state';
|
||||
import { waypointPopup } from '$lib/components/map/gpx-layer/gpx-layer-popup';
|
||||
import { allowedPastes } from './sortable-file-list';
|
||||
@@ -57,11 +58,19 @@
|
||||
|
||||
let singleSelection = $derived($selection.size === 1);
|
||||
|
||||
let nodeColors: string[] = $derived.by(() => {
|
||||
let nodeColors: string[] = $state([]);
|
||||
|
||||
$effect.pre(() => {
|
||||
let colors: string[] = [];
|
||||
if (node) {
|
||||
if (node && $map) {
|
||||
if (node instanceof GPXFile) {
|
||||
let defaultColor = $gpxColors.get(item.getFileId());
|
||||
let defaultColor = undefined;
|
||||
|
||||
let layer = gpxLayers.getLayer(item.getFileId());
|
||||
if (layer) {
|
||||
defaultColor = layer.layerColor;
|
||||
}
|
||||
|
||||
let style = node.getStyle(defaultColor);
|
||||
colors = style.color;
|
||||
} else if (node instanceof Track) {
|
||||
@@ -74,14 +83,14 @@
|
||||
colors.push(style['gpx_style:color']);
|
||||
}
|
||||
if (colors.length === 0) {
|
||||
let defaultColor = $gpxColors.get(item.getFileId());
|
||||
if (defaultColor) {
|
||||
colors.push(defaultColor);
|
||||
let layer = gpxLayers.getLayer(item.getFileId());
|
||||
if (layer) {
|
||||
colors.push(layer.layerColor);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return colors;
|
||||
nodeColors = colors;
|
||||
});
|
||||
|
||||
let symbolKey = $derived(node instanceof Waypoint ? getSymbolKey(node.sym) : undefined);
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
language = 'en';
|
||||
}
|
||||
|
||||
map.init(language, hash, geocoder, geolocate);
|
||||
map.init(PUBLIC_MAPBOX_TOKEN, language, hash, geocoder, geolocate);
|
||||
});
|
||||
|
||||
onDestroy(() => {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<script lang="ts">
|
||||
import { onDestroy } from 'svelte';
|
||||
import { onDestroy, onMount } from 'svelte';
|
||||
import { gpxLayers } from '$lib/components/map/gpx-layer/gpx-layers';
|
||||
import { DistanceMarkers } from '$lib/components/map/gpx-layer/distance-markers';
|
||||
import { StartEndMarkers } from '$lib/components/map/gpx-layer/start-end-markers';
|
||||
@@ -9,10 +9,13 @@
|
||||
let distanceMarkers: DistanceMarkers;
|
||||
let startEndMarkers: StartEndMarkers;
|
||||
|
||||
map.onLoad((map_) => {
|
||||
onMount(() => {
|
||||
gpxLayers.init();
|
||||
startEndMarkers = new StartEndMarkers();
|
||||
distanceMarkers = new DistanceMarkers();
|
||||
});
|
||||
|
||||
map.onLoad((map_) => {
|
||||
createPopups(map_);
|
||||
});
|
||||
|
||||
|
||||
@@ -41,7 +41,6 @@
|
||||
<Button
|
||||
size="sm"
|
||||
variant="outline"
|
||||
class="justify-start"
|
||||
href={`https://www.openstreetmap.org/edit?#map=${(($map?.getZoom() ?? 17) + 1).toFixed(0)}/${trackpoint.item.getLatitude().toFixed(5)}/${trackpoint.item.getLongitude().toFixed(5)}`}
|
||||
target="_blank"
|
||||
>
|
||||
|
||||
@@ -3,7 +3,7 @@ import { gpxStatistics } from '$lib/logic/statistics';
|
||||
import { getConvertedDistanceToKilometers } from '$lib/units';
|
||||
import type { GeoJSONSource } from 'mapbox-gl';
|
||||
import { get } from 'svelte/store';
|
||||
import { ANCHOR_LAYER_KEY, map } from '$lib/components/map/map';
|
||||
import { map } from '$lib/components/map/map';
|
||||
import { allHidden } from '$lib/logic/hidden';
|
||||
|
||||
const { distanceMarkers, distanceUnits } = settings;
|
||||
@@ -44,8 +44,7 @@ export class DistanceMarkers {
|
||||
});
|
||||
}
|
||||
if (!map_.getLayer('distance-markers')) {
|
||||
map_.addLayer(
|
||||
{
|
||||
map_.addLayer({
|
||||
id: 'distance-markers',
|
||||
type: 'symbol',
|
||||
source: 'distance-markers',
|
||||
@@ -80,9 +79,9 @@ export class DistanceMarkers {
|
||||
'text-halo-width': 2,
|
||||
'text-halo-color': 'white',
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.distanceMarkers
|
||||
);
|
||||
});
|
||||
} else {
|
||||
map_.moveLayer('distance-markers');
|
||||
}
|
||||
} else {
|
||||
if (map_.getLayer('distance-markers')) {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { get, type Readable } from 'svelte/store';
|
||||
import mapboxgl, { type FilterSpecification } from 'mapbox-gl';
|
||||
import { ANCHOR_LAYER_KEY, map } from '$lib/components/map/map';
|
||||
import { map } from '$lib/components/map/map';
|
||||
import { waypointPopup, trackpointPopup } from './gpx-layer-popup';
|
||||
import {
|
||||
ListTrackSegmentItem,
|
||||
@@ -22,7 +22,6 @@ import { fileActionManager } from '$lib/logic/file-action-manager';
|
||||
import { fileActions } from '$lib/logic/file-actions';
|
||||
import { splitAs } from '$lib/components/toolbar/tools/scissors/scissors';
|
||||
import { mapCursor, MapCursorState } from '$lib/logic/map-cursor';
|
||||
import { gpxColors } from '$lib/components/map/gpx-layer/gpx-layers';
|
||||
|
||||
const colors = [
|
||||
'#ff0000',
|
||||
@@ -44,35 +43,16 @@ for (let color of colors) {
|
||||
}
|
||||
|
||||
// Get the color with the least amount of uses
|
||||
function getColor(fileId: string) {
|
||||
function getColor() {
|
||||
let color = colors.reduce((a, b) => (colorCount[a] <= colorCount[b] ? a : b));
|
||||
colorCount[color]++;
|
||||
gpxColors.update((colors) => {
|
||||
colors.set(fileId, color);
|
||||
return colors;
|
||||
});
|
||||
return color;
|
||||
}
|
||||
|
||||
function replaceColor(fileId: string, oldColor: string, newColor: string) {
|
||||
if (colorCount.hasOwnProperty(oldColor)) {
|
||||
colorCount[oldColor]--;
|
||||
}
|
||||
colorCount[newColor]++;
|
||||
gpxColors.update((colors) => {
|
||||
colors.set(fileId, newColor);
|
||||
return colors;
|
||||
});
|
||||
}
|
||||
|
||||
function removeColor(fileId: string, color: string) {
|
||||
function decrementColor(color: string) {
|
||||
if (colorCount.hasOwnProperty(color)) {
|
||||
colorCount[color]--;
|
||||
}
|
||||
gpxColors.update((colors) => {
|
||||
colors.delete(fileId);
|
||||
return colors;
|
||||
});
|
||||
}
|
||||
|
||||
export function getSvgForSymbol(symbol?: string | undefined, layerColor?: string | undefined) {
|
||||
@@ -141,7 +121,7 @@ export class GPXLayer {
|
||||
constructor(fileId: string, file: Readable<GPXFileWithStatistics | undefined>) {
|
||||
this.fileId = fileId;
|
||||
this.file = file;
|
||||
this.layerColor = getColor(fileId);
|
||||
this.layerColor = getColor();
|
||||
this.unsubscribe.push(
|
||||
map.subscribe(($map) => {
|
||||
if ($map) {
|
||||
@@ -178,7 +158,7 @@ export class GPXLayer {
|
||||
file._data.style.color &&
|
||||
this.layerColor !== `#${file._data.style.color}`
|
||||
) {
|
||||
replaceColor(this.fileId, this.layerColor, `#${file._data.style.color}`);
|
||||
decrementColor(this.layerColor);
|
||||
this.layerColor = `#${file._data.style.color}`;
|
||||
}
|
||||
|
||||
@@ -196,8 +176,7 @@ export class GPXLayer {
|
||||
}
|
||||
|
||||
if (!_map.getLayer(this.fileId)) {
|
||||
_map.addLayer(
|
||||
{
|
||||
_map.addLayer({
|
||||
id: this.fileId,
|
||||
type: 'line',
|
||||
source: this.fileId,
|
||||
@@ -210,9 +189,7 @@ export class GPXLayer {
|
||||
'line-width': ['get', 'width'],
|
||||
'line-opacity': ['get', 'opacity'],
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.tracks
|
||||
);
|
||||
});
|
||||
|
||||
_map.on('click', this.fileId, this.layerOnClickBinded);
|
||||
_map.on('contextmenu', this.fileId, this.layerOnContextMenuBinded);
|
||||
@@ -235,8 +212,7 @@ export class GPXLayer {
|
||||
}
|
||||
|
||||
if (!_map.getLayer(this.fileId + '-waypoints')) {
|
||||
_map.addLayer(
|
||||
{
|
||||
_map.addLayer({
|
||||
id: this.fileId + '-waypoints',
|
||||
type: 'symbol',
|
||||
source: this.fileId + '-waypoints',
|
||||
@@ -247,9 +223,7 @@ export class GPXLayer {
|
||||
'icon-padding': 0,
|
||||
'icon-allow-overlap': true,
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.waypoints
|
||||
);
|
||||
});
|
||||
|
||||
_map.on(
|
||||
'mouseenter',
|
||||
@@ -298,7 +272,7 @@ export class GPXLayer {
|
||||
'text-halo-color': 'white',
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.directionMarkers
|
||||
_map.getLayer('distance-markers') ? 'distance-markers' : undefined
|
||||
);
|
||||
}
|
||||
} else {
|
||||
@@ -390,7 +364,7 @@ export class GPXLayer {
|
||||
|
||||
this.unsubscribe.forEach((unsubscribe) => unsubscribe());
|
||||
|
||||
removeColor(this.fileId, this.layerColor);
|
||||
decrementColor(this.layerColor);
|
||||
}
|
||||
|
||||
moveToFront() {
|
||||
@@ -399,13 +373,13 @@ export class GPXLayer {
|
||||
return;
|
||||
}
|
||||
if (_map.getLayer(this.fileId)) {
|
||||
_map.moveLayer(this.fileId, ANCHOR_LAYER_KEY.tracks);
|
||||
_map.moveLayer(this.fileId);
|
||||
}
|
||||
if (_map.getLayer(this.fileId + '-waypoints')) {
|
||||
_map.moveLayer(this.fileId + '-waypoints', ANCHOR_LAYER_KEY.waypoints);
|
||||
_map.moveLayer(this.fileId + '-waypoints');
|
||||
}
|
||||
if (_map.getLayer(this.fileId + '-direction')) {
|
||||
_map.moveLayer(this.fileId + '-direction', ANCHOR_LAYER_KEY.directionMarkers);
|
||||
_map.moveLayer(this.fileId + '-direction');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
import { GPXFileStateCollectionObserver } from '$lib/logic/file-state';
|
||||
import { writable } from 'svelte/store';
|
||||
import { GPXLayer } from './gpx-layer';
|
||||
|
||||
export class GPXLayerCollection {
|
||||
@@ -43,4 +42,3 @@ export class GPXLayerCollection {
|
||||
}
|
||||
|
||||
export const gpxLayers = new GPXLayerCollection();
|
||||
export const gpxColors = writable(new Map<string, string>());
|
||||
|
||||
@@ -13,7 +13,6 @@
|
||||
overlays,
|
||||
overlayTree,
|
||||
overpassTree,
|
||||
terrainSources,
|
||||
} from '$lib/assets/layers';
|
||||
import { getLayers, isSelected, toggle } from '$lib/components/map/layer-control/utils';
|
||||
import { i18n } from '$lib/i18n.svelte';
|
||||
@@ -32,7 +31,6 @@
|
||||
currentOverpassQueries,
|
||||
customLayers,
|
||||
opacities,
|
||||
terrainSource,
|
||||
} = settings;
|
||||
|
||||
const { isLayerFromExtension, getLayerName } = extensionAPI;
|
||||
@@ -235,23 +233,6 @@
|
||||
</ScrollArea>
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
<Accordion.Item value="terrain-source">
|
||||
<Accordion.Trigger>{i18n._('layers.terrain')}</Accordion.Trigger>
|
||||
<Accordion.Content class="flex flex-col gap-3 overflow-visible">
|
||||
<Select.Root bind:value={$terrainSource} type="single">
|
||||
<Select.Trigger class="mr-1 w-full" size="sm">
|
||||
{i18n._(`layers.label.${$terrainSource}`)}
|
||||
</Select.Trigger>
|
||||
<Select.Content class="h-fit max-h-[40dvh] overflow-y-auto">
|
||||
{#each Object.keys(terrainSources) as id}
|
||||
<Select.Item value={id}>
|
||||
{i18n._(`layers.label.${id}`)}
|
||||
</Select.Item>
|
||||
{/each}
|
||||
</Select.Content>
|
||||
</Select.Root>
|
||||
</Accordion.Content>
|
||||
</Accordion.Item>
|
||||
</Accordion.Root>
|
||||
</ScrollArea>
|
||||
</Sheet.Header>
|
||||
|
||||
@@ -54,27 +54,28 @@
|
||||
|
||||
<Card.Root class="border-none shadow-md text-base p-2 max-w-[50dvw] gap-0">
|
||||
<Card.Header class="p-0 gap-0">
|
||||
<Card.Title class="text-md flex flex-row">
|
||||
<Card.Title class="text-md">
|
||||
<div class="flex flex-row gap-3">
|
||||
<div class="flex flex-col">
|
||||
<p>{name}</p>
|
||||
{name}
|
||||
<div class="text-muted-foreground text-xs font-normal">
|
||||
{poi.item.lat.toFixed(6)}° {poi.item.lon.toFixed(6)}°
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Button
|
||||
class="ml-auto"
|
||||
variant="outline"
|
||||
size="icon-sm"
|
||||
href="https://www.openstreetmap.org/edit?editor=id&{poi.item.type ?? 'node'}={poi
|
||||
.item.id}"
|
||||
size="icon"
|
||||
href="https://www.openstreetmap.org/edit?editor=id&{poi.item.type ??
|
||||
'node'}={poi.item.id}"
|
||||
target="_blank"
|
||||
>
|
||||
<PencilLine size="16" />
|
||||
</Button>
|
||||
</div>
|
||||
</Card.Title>
|
||||
</Card.Header>
|
||||
<Card.Content class="flex flex-col gap-1 p-0 text-sm whitespace-normal break-all">
|
||||
<Card.Content class="flex flex-col p-0 text-sm mt-1 whitespace-normal break-all">
|
||||
<ScrollArea class="flex flex-col max-h-[30dvh]">
|
||||
{#if tags.image || tags['image:0']}
|
||||
<div class="w-full rounded-md overflow-clip my-2 max-w-96 mx-auto">
|
||||
@@ -99,14 +100,8 @@
|
||||
{/each}
|
||||
</div>
|
||||
</ScrollArea>
|
||||
<Button
|
||||
size="sm"
|
||||
class="mt-1 justify-start"
|
||||
variant="outline"
|
||||
disabled={$selection.size === 0}
|
||||
onclick={addToFile}
|
||||
>
|
||||
<MapPin size="14" />
|
||||
<Button class="mt-2" variant="outline" disabled={$selection.size === 0} onclick={addToFile}>
|
||||
<MapPin size="16" />
|
||||
{i18n._('toolbar.waypoint.add')}
|
||||
</Button>
|
||||
</Card.Content>
|
||||
|
||||
@@ -6,7 +6,6 @@ import { overpassQueryData } from '$lib/assets/layers';
|
||||
import { MapPopup } from '$lib/components/map/map-popup';
|
||||
import { settings } from '$lib/logic/settings';
|
||||
import { db } from '$lib/db';
|
||||
import { ANCHOR_LAYER_KEY } from '$lib/components/map/map';
|
||||
|
||||
const { currentOverpassQueries } = settings;
|
||||
|
||||
@@ -86,8 +85,7 @@ export class OverpassLayer {
|
||||
}
|
||||
|
||||
if (!this.map.getLayer('overpass')) {
|
||||
this.map.addLayer(
|
||||
{
|
||||
this.map.addLayer({
|
||||
id: 'overpass',
|
||||
type: 'symbol',
|
||||
source: 'overpass',
|
||||
@@ -97,9 +95,7 @@ export class OverpassLayer {
|
||||
'icon-padding': 0,
|
||||
'icon-allow-overlap': ['step', ['zoom'], false, 14, true],
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.overpass
|
||||
);
|
||||
});
|
||||
|
||||
this.map.on('mouseenter', 'overpass', this.onHoverBinded);
|
||||
this.map.on('click', 'overpass', this.onHoverBinded);
|
||||
|
||||
@@ -3,16 +3,8 @@ import MapboxGeocoder from '@mapbox/mapbox-gl-geocoder';
|
||||
import { get, writable, type Writable } from 'svelte/store';
|
||||
import { settings } from '$lib/logic/settings';
|
||||
import { tick } from 'svelte';
|
||||
import { terrainSources } from '$lib/assets/layers';
|
||||
|
||||
const {
|
||||
treeFileView,
|
||||
elevationProfile,
|
||||
bottomPanelSize,
|
||||
rightPanelSize,
|
||||
distanceUnits,
|
||||
terrainSource,
|
||||
} = settings;
|
||||
const { treeFileView, elevationProfile, bottomPanelSize, rightPanelSize, distanceUnits } = settings;
|
||||
|
||||
let fitBoundsOptions: mapboxgl.MapOptions['fitBoundsOptions'] = {
|
||||
maxZoom: 15,
|
||||
@@ -20,28 +12,6 @@ let fitBoundsOptions: mapboxgl.MapOptions['fitBoundsOptions'] = {
|
||||
easing: () => 1,
|
||||
};
|
||||
|
||||
const emptySource: mapboxgl.GeoJSONSourceSpecification = {
|
||||
type: 'geojson',
|
||||
data: {
|
||||
type: 'FeatureCollection',
|
||||
features: [],
|
||||
},
|
||||
};
|
||||
export const ANCHOR_LAYER_KEY = {
|
||||
mapillary: 'mapillary-end',
|
||||
tracks: 'tracks-end',
|
||||
directionMarkers: 'direction-markers-end',
|
||||
distanceMarkers: 'distance-markers-end',
|
||||
interactions: 'interactions-end',
|
||||
overpass: 'overpass-end',
|
||||
waypoints: 'waypoints-end',
|
||||
};
|
||||
const anchorLayers: mapboxgl.LayerSpecification[] = Object.values(ANCHOR_LAYER_KEY).map((id) => ({
|
||||
id: id,
|
||||
type: 'symbol',
|
||||
source: 'empty-source',
|
||||
}));
|
||||
|
||||
export class MapboxGLMap {
|
||||
private _map: Writable<mapboxgl.Map | null> = writable(null);
|
||||
private _onLoadCallbacks: ((map: mapboxgl.Map) => void)[] = [];
|
||||
@@ -51,15 +21,19 @@ export class MapboxGLMap {
|
||||
return this._map.subscribe(run, invalidate);
|
||||
}
|
||||
|
||||
init(language: string, hash: boolean, geocoder: boolean, geolocate: boolean) {
|
||||
init(
|
||||
accessToken: string,
|
||||
language: string,
|
||||
hash: boolean,
|
||||
geocoder: boolean,
|
||||
geolocate: boolean
|
||||
) {
|
||||
const map = new mapboxgl.Map({
|
||||
container: 'map',
|
||||
style: {
|
||||
version: 8,
|
||||
sources: {
|
||||
'empty-source': emptySource,
|
||||
},
|
||||
layers: anchorLayers,
|
||||
sources: {},
|
||||
layers: [],
|
||||
imports: [
|
||||
{
|
||||
id: 'basemap',
|
||||
@@ -68,6 +42,11 @@ export class MapboxGLMap {
|
||||
{
|
||||
id: 'overlays',
|
||||
url: '',
|
||||
data: {
|
||||
version: 8,
|
||||
sources: {},
|
||||
layers: [],
|
||||
},
|
||||
},
|
||||
],
|
||||
},
|
||||
@@ -144,14 +123,34 @@ export class MapboxGLMap {
|
||||
});
|
||||
map.addControl(scaleControl);
|
||||
map.on('style.load', () => {
|
||||
map.addSource('mapbox-dem', {
|
||||
type: 'raster-dem',
|
||||
url: 'mapbox://mapbox.mapbox-terrain-dem-v1',
|
||||
tileSize: 512,
|
||||
maxzoom: 14,
|
||||
});
|
||||
if (map.getPitch() > 0) {
|
||||
map.setTerrain({
|
||||
source: 'mapbox-dem',
|
||||
exaggeration: 1,
|
||||
});
|
||||
}
|
||||
map.setFog({
|
||||
color: 'rgb(186, 210, 235)',
|
||||
'high-color': 'rgb(36, 92, 223)',
|
||||
'horizon-blend': 0.1,
|
||||
'space-color': 'rgb(156, 240, 255)',
|
||||
});
|
||||
map.on('pitch', this.setTerrain.bind(this));
|
||||
this.setTerrain();
|
||||
map.on('pitch', () => {
|
||||
if (map.getPitch() > 0) {
|
||||
map.setTerrain({
|
||||
source: 'mapbox-dem',
|
||||
exaggeration: 1,
|
||||
});
|
||||
} else {
|
||||
map.setTerrain(null);
|
||||
}
|
||||
});
|
||||
});
|
||||
map.on('style.import.load', () => {
|
||||
const basemap = map.getStyle().imports?.find((imprt) => imprt.id === 'basemap');
|
||||
@@ -163,7 +162,6 @@ export class MapboxGLMap {
|
||||
this._map.set(map); // only set the store after the map has loaded
|
||||
window._map = map; // entry point for extensions
|
||||
this.resize();
|
||||
this.setTerrain();
|
||||
scaleControl.setUnit(get(distanceUnits));
|
||||
|
||||
this._onLoadCallbacks.forEach((callback) => callback(map));
|
||||
@@ -179,7 +177,6 @@ export class MapboxGLMap {
|
||||
scaleControl.setUnit(units);
|
||||
})
|
||||
);
|
||||
this._unsubscribes.push(terrainSource.subscribe(() => this.setTerrain()));
|
||||
}
|
||||
|
||||
onLoad(callback: (map: mapboxgl.Map) => void) {
|
||||
@@ -220,29 +217,6 @@ export class MapboxGLMap {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
setTerrain() {
|
||||
const map = get(this._map);
|
||||
if (map) {
|
||||
const source = get(terrainSource);
|
||||
try {
|
||||
if (!map.getSource(source)) {
|
||||
map.addSource(source, terrainSources[source]);
|
||||
}
|
||||
if (map.getPitch() > 0) {
|
||||
map.setTerrain({
|
||||
source: source,
|
||||
exaggeration: 1,
|
||||
});
|
||||
} else {
|
||||
map.setTerrain(null);
|
||||
}
|
||||
} catch (e) {
|
||||
// No reliable way to check if the map is ready to add sources and layers
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export const map = new MapboxGLMap();
|
||||
|
||||
@@ -2,7 +2,6 @@ import mapboxgl, { type LayerSpecification, type VectorSourceSpecification } fro
|
||||
import { Viewer, type ViewerBearingEvent } from 'mapillary-js/dist/mapillary.module';
|
||||
import 'mapillary-js/dist/mapillary.css';
|
||||
import { mapCursor, MapCursorState } from '$lib/logic/map-cursor';
|
||||
import { ANCHOR_LAYER_KEY } from '$lib/components/map/map';
|
||||
|
||||
const mapillarySource: VectorSourceSpecification = {
|
||||
type: 'vector',
|
||||
@@ -100,10 +99,10 @@ export class MapillaryLayer {
|
||||
this.map.addSource('mapillary', mapillarySource);
|
||||
}
|
||||
if (!this.map.getLayer('mapillary-sequence')) {
|
||||
this.map.addLayer(mapillarySequenceLayer, ANCHOR_LAYER_KEY.mapillary);
|
||||
this.map.addLayer(mapillarySequenceLayer);
|
||||
}
|
||||
if (!this.map.getLayer('mapillary-image')) {
|
||||
this.map.addLayer(mapillaryImageLayer, ANCHOR_LAYER_KEY.mapillary);
|
||||
this.map.addLayer(mapillaryImageLayer);
|
||||
}
|
||||
this.map.on('style.load', this.addBinded);
|
||||
this.map.on('mouseenter', 'mapillary-image', this.onMouseEnterBinded);
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
import { onDestroy, onMount } from 'svelte';
|
||||
import { getURLForLanguage } from '$lib/utils';
|
||||
import { Trash2 } from '@lucide/svelte';
|
||||
import { ANCHOR_LAYER_KEY, map } from '$lib/components/map/map';
|
||||
import { map } from '$lib/components/map/map';
|
||||
import type { GeoJSONSource } from 'mapbox-gl';
|
||||
import { selection } from '$lib/logic/selection';
|
||||
import { fileActions } from '$lib/logic/file-actions';
|
||||
@@ -63,8 +63,7 @@
|
||||
});
|
||||
}
|
||||
if (!$map.getLayer('rectangle')) {
|
||||
$map.addLayer(
|
||||
{
|
||||
$map.addLayer({
|
||||
id: 'rectangle',
|
||||
type: 'fill',
|
||||
source: 'rectangle',
|
||||
@@ -72,9 +71,7 @@
|
||||
'fill-color': 'SteelBlue',
|
||||
'fill-opacity': 0.5,
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.interactions
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
import { Button } from '$lib/components/ui/button';
|
||||
import Help from '$lib/components/Help.svelte';
|
||||
import { MountainSnow } from '@lucide/svelte';
|
||||
import { map } from '$lib/components/map/map';
|
||||
import { i18n } from '$lib/i18n.svelte';
|
||||
import { getURLForLanguage } from '$lib/utils';
|
||||
import { selection } from '$lib/logic/selection';
|
||||
@@ -19,7 +20,11 @@
|
||||
variant="outline"
|
||||
class="whitespace-normal h-fit"
|
||||
disabled={!validSelection}
|
||||
onclick={() => fileActions.addElevationToSelection()}
|
||||
onclick={() => {
|
||||
if ($map) {
|
||||
fileActions.addElevationToSelection($map);
|
||||
}
|
||||
}}
|
||||
>
|
||||
<MountainSnow size="16" class="shrink-0" />
|
||||
{i18n._('toolbar.elevation.button')}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
import { ListItem, ListTrackSegmentItem } from '$lib/components/file-list/file-list';
|
||||
import { ANCHOR_LAYER_KEY, map } from '$lib/components/map/map';
|
||||
import { map } from '$lib/components/map/map';
|
||||
import { fileActions } from '$lib/logic/file-actions';
|
||||
import { GPXFileStateCollectionObserver, type GPXFileState } from '$lib/logic/file-state';
|
||||
import { selection } from '$lib/logic/selection';
|
||||
@@ -144,8 +144,7 @@ export class ReducedGPXLayerCollection {
|
||||
});
|
||||
}
|
||||
if (!map_.getLayer('simplified')) {
|
||||
map_.addLayer(
|
||||
{
|
||||
map_.addLayer({
|
||||
id: 'simplified',
|
||||
type: 'line',
|
||||
source: 'simplified',
|
||||
@@ -153,9 +152,9 @@ export class ReducedGPXLayerCollection {
|
||||
'line-color': 'white',
|
||||
'line-width': 3,
|
||||
},
|
||||
},
|
||||
ANCHOR_LAYER_KEY.interactions
|
||||
);
|
||||
});
|
||||
} else {
|
||||
map_.moveLayer('simplified');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -8,7 +8,6 @@ import { get } from 'svelte/store';
|
||||
import { fileStateCollection } from '$lib/logic/file-state';
|
||||
import { fileActions } from '$lib/logic/file-actions';
|
||||
import { mapCursor, MapCursorState } from '$lib/logic/map-cursor';
|
||||
import { ANCHOR_LAYER_KEY } from '$lib/components/map/map';
|
||||
|
||||
export class SplitControls {
|
||||
map: mapboxgl.Map;
|
||||
@@ -109,8 +108,7 @@ export class SplitControls {
|
||||
}
|
||||
|
||||
if (!this.map.getLayer('split-controls')) {
|
||||
this.map.addLayer(
|
||||
{
|
||||
this.map.addLayer({
|
||||
id: 'split-controls',
|
||||
type: 'symbol',
|
||||
source: 'split-controls',
|
||||
@@ -120,14 +118,14 @@ export class SplitControls {
|
||||
'icon-padding': 0,
|
||||
},
|
||||
filter: ['<=', ['get', 'minZoom'], ['zoom']],
|
||||
},
|
||||
ANCHOR_LAYER_KEY.interactions
|
||||
);
|
||||
});
|
||||
|
||||
this.map.on('mouseenter', 'split-controls', this.layerOnMouseEnterBinded);
|
||||
this.map.on('mouseleave', 'split-controls', this.layerOnMouseLeaveBinded);
|
||||
this.map.on('click', 'split-controls', this.layerOnClickBinded);
|
||||
}
|
||||
|
||||
this.map.moveLayer('split-controls');
|
||||
} catch (e) {
|
||||
// No reliable way to check if the map is ready to add sources and layers
|
||||
}
|
||||
|
||||
@@ -31,7 +31,7 @@ Create a copy of the currently selected files.
|
||||
|
||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete
|
||||
|
||||
.
|
||||
Delete the currently selected files.
|
||||
|
||||
### <FileX size="16" class="inline-block" style="margin-bottom: 2px" /> Delete all
|
||||
|
||||
|
||||
@@ -807,7 +807,7 @@ export const fileActions = {
|
||||
});
|
||||
});
|
||||
},
|
||||
addElevationToSelection: async () => {
|
||||
addElevationToSelection: async (map: mapboxgl.Map) => {
|
||||
if (get(selection).size === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,6 @@ import {
|
||||
defaultOverlayTree,
|
||||
defaultOverpassQueries,
|
||||
defaultOverpassTree,
|
||||
defaultTerrainSource,
|
||||
type CustomLayer,
|
||||
} from '$lib/assets/layers';
|
||||
import { browser } from '$app/environment';
|
||||
@@ -155,7 +154,6 @@ export const settings = {
|
||||
customLayers: new Setting<Record<string, CustomLayer>>('customLayers', {}),
|
||||
customBasemapOrder: new Setting<string[]>('customBasemapOrder', []),
|
||||
customOverlayOrder: new Setting<string[]>('customOverlayOrder', []),
|
||||
terrainSource: new Setting('terrainSource', defaultTerrainSource),
|
||||
directionMarkers: new Setting('directionMarkers', false),
|
||||
distanceMarkers: new Setting('distanceMarkers', false),
|
||||
streetViewSource: new Setting('streetViewSource', 'mapillary'),
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Actualitza la capa"
|
||||
},
|
||||
"opacity": "Opacitat de la superposició",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Mapes base",
|
||||
"overlays": "Capes",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Estació de tren",
|
||||
"tram-stop": "Parada de tramvia",
|
||||
"bus-stop": "Parada d'autobús",
|
||||
"ferry": "Ferri",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferri"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Aktualizovat vrstvu"
|
||||
},
|
||||
"opacity": "Průhlednost překryvu",
|
||||
"terrain": "Zdroj terénu",
|
||||
"label": {
|
||||
"basemaps": "Základní mapy",
|
||||
"overlays": "Překrytí",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Vrstevnice",
|
||||
"swisstopoHiking": "swisstopo Turistická",
|
||||
"swisstopoHikingClosures": "swisstopo Turistické uzávěry",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Železniční stanice",
|
||||
"tram-stop": "Zastávka tramvaje",
|
||||
"bus-stop": "Autobusová zastávka",
|
||||
"ferry": "Trajekt",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Trajekt"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Layer aktualisieren"
|
||||
},
|
||||
"opacity": "Deckkraft der Überlagerung",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basiskarte",
|
||||
"overlays": "Ebenen",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Neigung",
|
||||
"swisstopoHiking": "swisstopo Wandern",
|
||||
"swisstopoHikingClosures": "swisstopo Wanderungen Schließungen",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Bahnhof",
|
||||
"tram-stop": "Straßenbahnhaltestelle",
|
||||
"bus-stop": "Bushaltestelle",
|
||||
"ferry": "Fähre",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Fähre"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Actualizar capa"
|
||||
},
|
||||
"opacity": "Opacidad de la capa superpuesta",
|
||||
"terrain": "Origen del terreno",
|
||||
"label": {
|
||||
"basemaps": "Mapas base",
|
||||
"overlays": "Capas",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "Gravel bikerouter.de",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Senderismo",
|
||||
"swisstopoHikingClosures": "swisstopo Rutas Senderismo",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Estación de tren",
|
||||
"tram-stop": "Parada de tranvía",
|
||||
"bus-stop": "Parada de autobús",
|
||||
"ferry": "Ferri",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferri"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Eguneratu geruza"
|
||||
},
|
||||
"opacity": "Geruzaren opakutasuna",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Oinarrizko mapak",
|
||||
"overlays": "Geruzak",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Malda",
|
||||
"swisstopoHiking": "swisstopo Mendi ibilaldiak",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Tren geltokia",
|
||||
"tram-stop": "Tranbia geltokia",
|
||||
"bus-stop": "Autobus geltokia",
|
||||
"ferry": "Ferria",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferria"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Päivitä karttataso"
|
||||
},
|
||||
"opacity": "Peitetason läpinäkyvyys",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Taustakartat",
|
||||
"overlays": "Peitetasot",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Rinnekaltevuus",
|
||||
"swisstopoHiking": "swisstopo Retkeilyreitit",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Rautatieasemat",
|
||||
"tram-stop": "Raitiovaunupysäkit",
|
||||
"bus-stop": "Linja-autopysäkit",
|
||||
"ferry": "Lautat",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Lautat"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Mettre à jour la couche"
|
||||
},
|
||||
"opacity": "Opacité de la surcouche",
|
||||
"terrain": "Source du relief",
|
||||
"label": {
|
||||
"basemaps": "Fonds de carte",
|
||||
"overlays": "Surcouches",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Relief",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Pente",
|
||||
"swisstopoHiking": "swisstopo Randonnée",
|
||||
"swisstopoHikingClosures": "swisstopo Fermetures de randonnée",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Gare",
|
||||
"tram-stop": "Arrêt de tram",
|
||||
"bus-stop": "Arrêt de bus",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Réteg feltöltése"
|
||||
},
|
||||
"opacity": "Átfedés átlátszósága",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Alaptérkép",
|
||||
"overlays": "Térkép rétegek",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "kerékpár és terepkerékpár út",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Lejtő",
|
||||
"swisstopoHiking": "swisstopo Túra",
|
||||
"swisstopoHikingClosures": "swisstopo túralezárások",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Vasútállomás",
|
||||
"tram-stop": "Villamos megálló",
|
||||
"bus-stop": "Buszmegálló",
|
||||
"ferry": "Komp",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Komp"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Perbarui lapisan"
|
||||
},
|
||||
"opacity": "Opasitas Overlay",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Peta dasar",
|
||||
"overlays": "Overlay",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Kemiringan",
|
||||
"swisstopoHiking": "swisstopo Pendakian",
|
||||
"swisstopoHikingClosures": "Penutupan Jalur Pendakian swisstopo",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Stasiun kereta api",
|
||||
"tram-stop": "Halt trem",
|
||||
"bus-stop": "Pemberhentian Bus",
|
||||
"ferry": "Feri",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Feri"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Aggiorna livello"
|
||||
},
|
||||
"opacity": "Opacità di sovrapposizione",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Mappe di base",
|
||||
"overlays": "Sovrapposizioni",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Pendenza",
|
||||
"swisstopoHiking": "swisstopo Escursione",
|
||||
"swisstopoHikingClosures": "swisstopo Fine escursione",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Stazione ferroviaria",
|
||||
"tram-stop": "Fermata del tram",
|
||||
"bus-stop": "Fermata dell'autobus",
|
||||
"ferry": "Traghetto",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Traghetto"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "레이어 갱신"
|
||||
},
|
||||
"opacity": "오버레이 투명도",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "배경 지도",
|
||||
"overlays": "오버레이",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "철도역",
|
||||
"tram-stop": "트램 정류장",
|
||||
"bus-stop": "버스 정류장",
|
||||
"ferry": "페리",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "페리"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Naujinti sluoksnį"
|
||||
},
|
||||
"opacity": "Sluoksnio skaidrumas",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Pagrindo žemėlapiai",
|
||||
"overlays": "Sluoksniai",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Geležinkelio stotis",
|
||||
"tram-stop": "Tramvajaus stotelė",
|
||||
"bus-stop": "Autobusų stotelė",
|
||||
"ferry": "Keltas",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Keltas"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update laag"
|
||||
},
|
||||
"opacity": "Laag Transparantie",
|
||||
"terrain": "Terrein bron",
|
||||
"label": {
|
||||
"basemaps": "Basis kaarten",
|
||||
"overlays": "Lagen",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Grind",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Helling",
|
||||
"swisstopoHiking": "swisstopo Wandelen",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Sluiting",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Treinstation",
|
||||
"tram-stop": "Tramhalte",
|
||||
"bus-stop": "Bushalte",
|
||||
"ferry": "Veerboot",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Veerboot"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Oppdater lag"
|
||||
},
|
||||
"opacity": "Gjennomsiktighet for overlegg",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basiskart",
|
||||
"overlays": "Overlag",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "sykkelrute Grus",
|
||||
"cyclOSMlite": "SyklOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "SyklOSM Lite",
|
||||
"swisstopoSlope": "swisstopografisk helningskart",
|
||||
"swisstopoHiking": "swisstopografisk Fottur",
|
||||
"swisstopoHikingClosures": "swisstopografi Stengte turstier",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Jernbanestasjon",
|
||||
"tram-stop": "Trikkestopp",
|
||||
"bus-stop": "Bussholdeplass",
|
||||
"ferry": "Ferge",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferge"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Zaktualizuj warstwę"
|
||||
},
|
||||
"opacity": "Przezroczystość nakładki",
|
||||
"terrain": "Źródło danych terenowych",
|
||||
"label": {
|
||||
"basemaps": "Mapy bazowe",
|
||||
"overlays": "Nakładki",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Stoki",
|
||||
"swisstopoHiking": "swisstopo Szlaki Turystyczne",
|
||||
"swisstopoHikingClosures": "swisstopo Zamknięcia Szlaków",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Stacja kolejowa",
|
||||
"tram-stop": "Przystanek tramwajowy",
|
||||
"bus-stop": "Przystanek autobusowy",
|
||||
"ferry": "Prom",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Prom"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Atualizar camada"
|
||||
},
|
||||
"opacity": "Opacidade de sobreposição",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Mapa base",
|
||||
"overlays": "Sobreposições",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Estações ferroviárias",
|
||||
"tram-stop": "Parada de bonde",
|
||||
"bus-stop": "Parada de Ônibus",
|
||||
"ferry": "Balsa",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Balsa"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Atualizar camada"
|
||||
},
|
||||
"opacity": "Opacidade da sobreposição",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Mapas base",
|
||||
"overlays": "Sobreposições",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Estações ferroviárias",
|
||||
"tram-stop": "Parada de bonde",
|
||||
"bus-stop": "Parada de Ônibus",
|
||||
"ferry": "Balsa",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Balsa"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Actualizează stratul"
|
||||
},
|
||||
"opacity": "Opacitatea overlay-ului",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Hărți de bază",
|
||||
"overlays": "Suprapuneri",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Gară",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Stație de autobuz",
|
||||
"ferry": "Feribot",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Feribot"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Обновить слой"
|
||||
},
|
||||
"opacity": "Прозрачность наложения",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Основные карты",
|
||||
"overlays": "Наложения",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Железнодорожная станция",
|
||||
"tram-stop": "Трамвайная остановка",
|
||||
"bus-stop": "Автобусная остановка",
|
||||
"ferry": "Паром",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Паром"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Ažurirajte sloj"
|
||||
},
|
||||
"opacity": "Providnost preklapanja",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Osnovne mape",
|
||||
"overlays": "Preklapanja",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Železnička stanica",
|
||||
"tram-stop": "Tramvajsko stajalište",
|
||||
"bus-stop": "Autobusko stajalište",
|
||||
"ferry": "Trajekt",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Trajekt"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Baskartor",
|
||||
"overlays": "Lager",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Järnvägsstation",
|
||||
"tram-stop": "Spårvagnshållplats",
|
||||
"bus-stop": "Busshållplats",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Katman güncelle"
|
||||
},
|
||||
"opacity": "Katman şeffaflığı",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Temel haritalar",
|
||||
"overlays": "Katmanlar",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Eğim",
|
||||
"swisstopoHiking": "swisstopo Yürüyüş",
|
||||
"swisstopoHikingClosures": "swisstopo Yürüyüş Sonu",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Tren istasyonu",
|
||||
"tram-stop": "Tramvay Durağı",
|
||||
"bus-stop": "Otobüs Durağı",
|
||||
"ferry": "Feribot",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Feribot"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Оновити шар"
|
||||
},
|
||||
"opacity": "Непрозорість накладання",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Базові карти",
|
||||
"overlays": "Накладання",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Залізнична Станція",
|
||||
"tram-stop": "Трамвайна Зупинка",
|
||||
"bus-stop": "Автобусна Зупинка",
|
||||
"ferry": "Пором",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Пором"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "Update layer"
|
||||
},
|
||||
"opacity": "Overlay opacity",
|
||||
"terrain": "Terrain source",
|
||||
"label": {
|
||||
"basemaps": "Basemaps",
|
||||
"overlays": "Overlays",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "Mapterhorn Hillshade",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "swisstopo Slope",
|
||||
"swisstopoHiking": "swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "Railway Station",
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "Ferry"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
@@ -282,7 +282,6 @@
|
||||
"update": "更新图层"
|
||||
},
|
||||
"opacity": "图层透明度",
|
||||
"terrain": "地形来源",
|
||||
"label": {
|
||||
"basemaps": "底图",
|
||||
"overlays": "叠加层",
|
||||
@@ -325,9 +324,8 @@
|
||||
"bgMountains": "BGMountains",
|
||||
"usgs": "USGS",
|
||||
"bikerouterGravel": "bikerouter.de Gravel",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"mapterhornHillshade": "山体阴影",
|
||||
"openRailwayMap": "OpenRailwayMap",
|
||||
"cyclOSMlite": "CyclOSM Lite",
|
||||
"swisstopoSlope": "Swisstopo Slope",
|
||||
"swisstopoHiking": "Swisstopo Hiking",
|
||||
"swisstopoHikingClosures": "Swisstopo Hiking Closures",
|
||||
@@ -380,9 +378,7 @@
|
||||
"railway-station": "火车站",
|
||||
"tram-stop": "有轨电车站",
|
||||
"bus-stop": "小型公交站台",
|
||||
"ferry": "渡口",
|
||||
"mapbox-dem": "Mapbox DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
"ferry": "渡口"
|
||||
}
|
||||
},
|
||||
"chart": {
|
||||
|
||||
Reference in New Issue
Block a user