47 Commits

Author SHA1 Message Date
vcoppe 1f3165f66f New translations view.mdx (Russian)
[ci skip]
2026-05-07 11:36:34 +02:00
vcoppe c08aac3654 New translations files-and-stats.mdx (Russian)
[ci skip]
2026-05-07 11:36:32 +02:00
vcoppe 824464eda2 New translations elevation.mdx (Dutch)
[ci skip]
2026-05-02 13:36:11 +02:00
vcoppe b0e09b3616 New translations map-controls.mdx (Dutch)
[ci skip]
2026-05-02 13:36:09 +02:00
vcoppe b0c5b2b8cf New translations elevation.mdx (Dutch)
[ci skip]
2026-05-02 11:49:45 +02:00
vcoppe 3949369f34 New translations en.json (Russian) 2026-04-26 20:01:24 +02:00
vcoppe 0b4ca57050 New translations integration.mdx (Serbian (Latin)) 2026-04-24 23:27:48 +02:00
vcoppe 68a5937a43 New translations gpx.mdx (Serbian (Latin)) 2026-04-24 23:27:47 +02:00
vcoppe 4f725ca01e New translations scissors.mdx (Serbian (Latin)) 2026-04-24 02:44:10 +02:00
vcoppe 71eb90fd25 New translations routing.mdx (Serbian (Latin)) 2026-04-24 02:44:09 +02:00
vcoppe 7463f30d1f New translations toolbar.mdx (Serbian (Latin)) 2026-04-24 02:44:08 +02:00
vcoppe 8ea60d93a1 New translations view.mdx (Serbian (Latin)) 2026-04-24 02:44:07 +02:00
vcoppe f2aa3de846 New translations file.mdx (Serbian (Latin)) 2026-04-24 02:44:05 +02:00
vcoppe 21568b0ff9 New translations edit.mdx (Serbian (Latin)) 2026-04-24 02:44:04 +02:00
vcoppe 11a3163f3d New translations menu.mdx (Serbian (Latin)) 2026-04-24 02:44:03 +02:00
vcoppe f70ef1c20d New translations map-controls.mdx (Serbian (Latin)) 2026-04-24 02:44:01 +02:00
vcoppe 3a8c6c1565 New translations integration.mdx (Serbian (Latin)) 2026-04-24 02:44:00 +02:00
vcoppe df2739807d New translations files-and-stats.mdx (Serbian (Latin)) 2026-04-24 02:43:59 +02:00
vcoppe c635a17256 New translations integration.mdx (Serbian (Latin)) 2026-04-24 01:30:19 +02:00
vcoppe e2c3100019 New translations faq.mdx (Serbian (Latin)) 2026-04-23 22:45:51 +02:00
vcoppe b164d5839d New translations routing.mdx (Serbian (Latin)) 2026-04-23 22:45:49 +02:00
vcoppe 6af76a9b6e New translations minify.mdx (Serbian (Latin)) 2026-04-23 22:45:48 +02:00
vcoppe 9ff91480db New translations elevation.mdx (Serbian (Latin)) 2026-04-23 21:50:10 +02:00
vcoppe 0d8bf54b42 New translations time.mdx (Serbian (Latin)) 2026-04-23 21:50:08 +02:00
vcoppe 648f19f217 New translations scissors.mdx (Serbian (Latin)) 2026-04-23 21:50:06 +02:00
vcoppe 408686ccba New translations routing.mdx (Serbian (Latin)) 2026-04-23 21:50:04 +02:00
vcoppe d77a01ec22 New translations poi.mdx (Serbian (Latin)) 2026-04-23 21:49:59 +02:00
vcoppe 2da1103853 New translations merge.mdx (Serbian (Latin)) 2026-04-23 21:49:57 +02:00
vcoppe 469d7a5a06 New translations extract.mdx (Serbian (Latin)) 2026-04-23 21:49:55 +02:00
vcoppe 385f07172f New translations clean.mdx (Serbian (Latin)) 2026-04-23 21:49:53 +02:00
vcoppe 2d9dad994b New translations view.mdx (Serbian (Latin)) 2026-04-23 21:49:52 +02:00
vcoppe 9d25045f15 New translations settings.mdx (Serbian (Latin)) 2026-04-23 21:49:50 +02:00
vcoppe 29feaa48bb New translations file.mdx (Serbian (Latin)) 2026-04-23 21:49:49 +02:00
vcoppe 80e6f544e4 New translations edit.mdx (Serbian (Latin)) 2026-04-23 21:49:47 +02:00
vcoppe 29d3128a99 New translations files-and-stats.mdx (Serbian (Latin)) 2026-04-23 21:49:46 +02:00
vcoppe 02cf5edfda New translations en.json (Serbian (Latin)) 2026-04-23 21:49:44 +02:00
vcoppe 09797f026c New translations elevation.mdx (Serbian (Latin)) 2026-04-23 20:20:34 +02:00
vcoppe b4e92a662e New translations edit.mdx (Serbian (Latin)) 2026-04-23 20:20:33 +02:00
vcoppe 33f9b1d0d4 New translations files-and-stats.mdx (Serbian (Latin)) 2026-04-23 20:20:32 +02:00
vcoppe 035c411b57 New translations map-controls.mdx (Chinese Simplified) 2026-04-23 05:26:17 +02:00
vcoppe 380e968dbc New translations view.mdx (Chinese Simplified) 2026-04-23 04:27:43 +02:00
vcoppe 0e0f689b2a New translations en.json (Chinese Simplified) 2026-04-23 04:27:41 +02:00
vcoppe f7df5873f5 New translations view.mdx (Dutch) 2026-04-20 12:55:30 +02:00
vcoppe da53f62072 New translations view.mdx (Spanish) 2026-04-20 12:55:29 +02:00
vcoppe 7cd320f8f9 New translations en.json (Spanish) 2026-04-20 12:55:27 +02:00
vcoppe 897ba92a85 New translations view.mdx (Dutch) 2026-04-20 10:34:01 +02:00
vcoppe 29fb08dd34 New translations en.json (Dutch) 2026-04-20 10:33:59 +02:00
26 changed files with 235 additions and 138 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 339 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 729 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 308 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 525 KiB

After

Width:  |  Height:  |  Size: 1.7 MiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 710 KiB

After

Width:  |  Height:  |  Size: 1.9 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

+19 -10
View File
@@ -31,8 +31,10 @@ import bikerouterGravel from './custom/bikerouter-gravel.json';
export const maptilerKeyPlaceHolder = 'MAPTILER_KEY'; export const maptilerKeyPlaceHolder = 'MAPTILER_KEY';
export const basemaps: { [key: string]: string | StyleSpecification } = { export const basemaps: { [key: string]: string | StyleSpecification } = {
topo: 'https://raw.githubusercontent.com/gpxstudio/styles/refs/heads/main/topo.json', maptilerStreets: `https://api.maptiler.com/maps/streets-v4/style.json?key=${maptilerKeyPlaceHolder}`,
satellite: 'https://raw.githubusercontent.com/gpxstudio/styles/refs/heads/main/satellite.json', maptilerTopo: `https://api.maptiler.com/maps/topo-v4/style.json?key=${maptilerKeyPlaceHolder}`,
maptilerOutdoors: `https://api.maptiler.com/maps/outdoor-v4/style.json?key=${maptilerKeyPlaceHolder}`,
maptilerSatellite: `https://api.maptiler.com/maps/hybrid-v4/style.json?key=${maptilerKeyPlaceHolder}`,
esriSatellite: { esriSatellite: {
version: 8, version: 8,
sources: { sources: {
@@ -797,8 +799,10 @@ export type LayerTreeType = { [key: string]: LayerTreeType | boolean };
export const basemapTree: LayerTreeType = { export const basemapTree: LayerTreeType = {
basemaps: { basemaps: {
world: { world: {
topo: true, maptilerStreets: true,
satellite: true, maptilerTopo: true,
maptilerOutdoors: true,
maptilerSatellite: true,
esriSatellite: true, esriSatellite: true,
openStreetMap: true, openStreetMap: true,
openTopoMap: true, openTopoMap: true,
@@ -932,7 +936,7 @@ export const overpassTree: LayerTreeType = {
}; };
// Default basemap used // Default basemap used
export const defaultBasemap = 'topo'; export const defaultBasemap = 'maptilerStreets';
// Default overlays used (none) // Default overlays used (none)
export const defaultOverlays: LayerTreeType = { export const defaultOverlays: LayerTreeType = {
@@ -1021,8 +1025,10 @@ export const defaultOverpassQueries: LayerTreeType = {
export const defaultBasemapTree: LayerTreeType = { export const defaultBasemapTree: LayerTreeType = {
basemaps: { basemaps: {
world: { world: {
topo: true, maptilerStreets: true,
satellite: true, maptilerTopo: true,
maptilerOutdoors: true,
maptilerSatellite: true,
esriSatellite: false, esriSatellite: false,
openStreetMap: true, openStreetMap: true,
openTopoMap: true, openTopoMap: true,
@@ -1481,11 +1487,14 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
}; };
export const terrainSources: { [key: string]: RasterDEMSourceSpecification } = { export const terrainSources: { [key: string]: RasterDEMSourceSpecification } = {
'maptiler-dem': {
type: 'raster-dem',
url: `https://api.maptiler.com/tiles/terrain-rgb-v2/tiles.json?key=${maptilerKeyPlaceHolder}`,
},
mapterhorn: { mapterhorn: {
type: 'raster-dem', type: 'raster-dem',
url: 'https://tiles.gpx.studio/mapterhorn.json', url: 'https://tiles.mapterhorn.com/tilejson.json',
encoding: 'terrarium',
}, },
}; };
export const defaultTerrainSource = 'mapterhorn'; export const defaultTerrainSource = 'maptiler-dem';
+7 -1
View File
@@ -8,7 +8,7 @@
...others ...others
}: { }: {
iconOnly?: boolean; iconOnly?: boolean;
company?: 'gpx.studio' | 'github' | 'crowdin' | 'facebook' | 'reddit'; company?: 'gpx.studio' | 'maptiler' | 'github' | 'crowdin' | 'facebook' | 'reddit';
[key: string]: any; [key: string]: any;
} = $props(); } = $props();
</script> </script>
@@ -19,6 +19,12 @@
alt="Logo of gpx.studio." alt="Logo of gpx.studio."
{...others} {...others}
/> />
{:else if company === 'maptiler'}
<img
src="{base}/maptiler-logo{mode.current === 'dark' ? '-dark' : ''}.svg"
alt="Logo of Maptiler."
{...others}
/>
{:else if company === 'github'} {:else if company === 'github'}
<svg <svg
role="img" role="img"
@@ -1,10 +1,10 @@
<script lang="ts"> <script lang="ts">
import topoMap from '$lib/assets/img/docs/maps/topo.png?enhanced'; import maptilerTopoMap from '$lib/assets/img/home/maptiler-topo.png?enhanced';
import waymarkedMap from '$lib/assets/img/docs/maps/waymarked.png?enhanced'; import waymarkedMap from '$lib/assets/img/home/waymarked.png?enhanced';
</script> </script>
<div class="relative h-80 aspect-square rounded-2xl shadow-xl overflow-clip"> <div class="relative h-80 aspect-square rounded-2xl shadow-xl overflow-clip">
<enhanced:img src={topoMap} alt="Topo map screenshot." class="absolute" /> <enhanced:img src={maptilerTopoMap} alt="MapTiler Topo map screenshot." class="absolute" />
<enhanced:img <enhanced:img
src={waymarkedMap} src={waymarkedMap}
alt="Waymarked Trails map screenshot." alt="Waymarked Trails map screenshot."
@@ -29,7 +29,7 @@ export const defaultEmbeddingOptions = {
key: '', key: '',
files: [], files: [],
ids: [], ids: [],
basemap: 'topo', basemap: 'maptilerStreets',
elevation: { elevation: {
show: true, show: true,
height: 170, height: 170,
@@ -125,7 +125,9 @@ export function convertOldEmbeddingOptions(options: URLSearchParams): any {
} }
if (options.has('source')) { if (options.has('source')) {
let basemap = options.get('source')!; let basemap = options.get('source')!;
if (basemap === 'otm') { if (basemap === 'satellite') {
newOptions.basemap = 'maptilerSatellite';
} else if (basemap === 'otm') {
newOptions.basemap = 'openTopoMap'; newOptions.basemap = 'openTopoMap';
} else if (basemap === 'ohm') { } else if (basemap === 'ohm') {
newOptions.basemap = 'openHikingMap'; newOptions.basemap = 'openHikingMap';
+23 -37
View File
@@ -10,8 +10,7 @@ import {
import { getLayers } from '$lib/components/map/layer-control/utils'; import { getLayers } from '$lib/components/map/layer-control/utils';
import { i18n } from '$lib/i18n.svelte'; import { i18n } from '$lib/i18n.svelte';
const { currentBasemap, currentOverlays, customLayers, opacities, terrainSource, distanceUnits } = const { currentBasemap, currentOverlays, customLayers, opacities, terrainSource } = settings;
settings;
const emptySource: maplibregl.GeoJSONSourceSpecification = { const emptySource: maplibregl.GeoJSONSourceSpecification = {
type: 'geojson', type: 'geojson',
@@ -58,21 +57,15 @@ export class StyleManager {
opacities.subscribe(() => this.updateOverlays()); opacities.subscribe(() => this.updateOverlays());
terrainSource.subscribe(() => this.updateTerrain()); terrainSource.subscribe(() => this.updateTerrain());
customLayers.subscribe(() => this.updateBasemap()); customLayers.subscribe(() => this.updateBasemap());
distanceUnits.subscribe(() => {
if (get(currentBasemap) === 'topo') this.updateBasemap();
});
} }
updateBasemap() { updateBasemap() {
const map_ = get(this._map); const map_ = get(this._map);
if (!map_) return; if (!map_) return;
let basemap = get(currentBasemap); this.buildStyle().then((style) => map_.setStyle(style));
this.buildStyle(basemap).then((style) => {
if (get(currentBasemap) === basemap) map_.setStyle(style);
});
} }
async buildStyle(basemap: string): Promise<maplibregl.StyleSpecification> { async buildStyle(): Promise<maplibregl.StyleSpecification> {
const custom = get(customLayers); const custom = get(customLayers);
const style: maplibregl.StyleSpecification = { const style: maplibregl.StyleSpecification = {
@@ -86,31 +79,22 @@ export class StyleManager {
layers: [], layers: [],
}; };
let basemap = get(currentBasemap);
const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap]; const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap];
let basemapStyle = basemaps.openStreetMap as maplibregl.StyleSpecification; let basemapStyle = basemaps.openStreetMap as maplibregl.StyleSpecification;
try { try {
basemapStyle = await this.get(basemapInfo); basemapStyle = await this.get(basemapInfo);
for (const source in basemapStyle.sources) {
const src = basemapStyle.sources[source];
if (
src &&
typeof src === 'object' &&
'url' in src &&
typeof src.url === 'string' &&
src.url.includes(maptilerKeyPlaceHolder)
) {
src.url = src.url.replace(maptilerKeyPlaceHolder, this._maptilerKey);
}
}
} catch (e) { } catch (e) {
console.error(e.message); console.error(e.message);
} }
this.merge(style, basemapStyle); this.merge(style, basemapStyle);
const terrain = this.getCurrentTerrain(); if (this._maptilerKey !== '') {
style.sources[terrain.source] = terrainSources[terrain.source]; const terrain = this.getCurrentTerrain();
style.terrain = terrain.exaggeration > 0 ? terrain : undefined; style.sources[terrain.source] = terrainSources[terrain.source];
style.terrain = terrain.exaggeration > 0 ? terrain : undefined;
}
style.layers.push(...anchorLayers); style.layers.push(...anchorLayers);
@@ -182,6 +166,7 @@ export class StyleManager {
} }
updateTerrain() { updateTerrain() {
if (this._maptilerKey === '') return;
const map_ = get(this._map); const map_ = get(this._map);
if (!map_) return; if (!map_) return;
@@ -204,6 +189,9 @@ export class StyleManager {
): Promise<maplibregl.StyleSpecification> { ): Promise<maplibregl.StyleSpecification> {
if (typeof styleInfo === 'string') { if (typeof styleInfo === 'string') {
let styleUrl = styleInfo as string; let styleUrl = styleInfo as string;
if (styleUrl.includes(maptilerKeyPlaceHolder)) {
styleUrl = styleUrl.replace(maptilerKeyPlaceHolder, this._maptilerKey);
}
const response = await fetch(styleUrl, { cache: 'force-cache' }); const response = await fetch(styleUrl, { cache: 'force-cache' });
if (!response.ok) { if (!response.ok) {
throw new Error(`HTTP error fetching style "${styleInfo}": ${response.status}`); throw new Error(`HTTP error fetching style "${styleInfo}": ${response.status}`);
@@ -217,23 +205,17 @@ export class StyleManager {
merge(style: maplibregl.StyleSpecification, other: maplibregl.StyleSpecification) { merge(style: maplibregl.StyleSpecification, other: maplibregl.StyleSpecification) {
style.sources = { ...style.sources, ...other.sources }; style.sources = { ...style.sources, ...other.sources };
const units = get(distanceUnits);
for (let layer of other.layers ?? []) { for (let layer of other.layers ?? []) {
if ('source' in layer) {
if (layer.source == 'contours_m' && units === 'imperial') continue;
if (layer.source == 'contours_ft' && units !== 'imperial') continue;
}
if (layer.type === 'symbol' && layer.layout && layer.layout['text-field']) { if (layer.type === 'symbol' && layer.layout && layer.layout['text-field']) {
const textField = layer.layout['text-field']; const textField = layer.layout['text-field'];
if ( if (
Array.isArray(textField) && Array.isArray(textField) &&
textField.length == 4 && textField.length >= 2 &&
Array.isArray(textField[3]) && textField[0] === 'coalesce' &&
textField[3][0] === 'coalesce' && Array.isArray(textField[1]) &&
Array.isArray(textField[3][1]) && textField[1][0] === 'get' &&
textField[3][1][0] === 'get' && typeof textField[1][1] === 'string' &&
typeof textField[3][1][1] === 'string' && textField[1][1].startsWith('name')
textField[3][1][1].startsWith('name')
) { ) {
layer.layout['text-field'] = [ layer.layout['text-field'] = [
'coalesce', 'coalesce',
@@ -254,6 +236,10 @@ export class StyleManager {
getCurrentTerrain() { getCurrentTerrain() {
const terrain = get(terrainSource); const terrain = get(terrainSource);
const source = terrainSources[terrain];
if (source.url && source.url.includes(maptilerKeyPlaceHolder)) {
source.url = source.url.replace(maptilerKeyPlaceHolder, this._maptilerKey);
}
const map_ = get(this._map); const map_ = get(this._map);
return { return {
source: terrain, source: terrain,
@@ -163,9 +163,6 @@ export class ReducedGPXLayerCollection {
reduce() { reduce() {
let itemsAndPoints = new Map<ListItem, TrackPoint[]>(); let itemsAndPoints = new Map<ListItem, TrackPoint[]>();
this._simplified.forEach(([item, maxPts, points], itemFullId) => { this._simplified.forEach(([item, maxPts, points], itemFullId) => {
if (!get(selection).hasAnyParent(item)) {
return;
}
itemsAndPoints.set( itemsAndPoints.set(
item, item,
points points
+1 -1
View File
@@ -59,7 +59,7 @@ Only one basemap can be displayed at a time.
<DocsLayers /> <DocsLayers />
<span class="text-sm text-center mt-2"> <span class="text-sm text-center mt-2">
Hover over the map to show the <a href="https://hiking.waymarkedtrails.org" target="_blank">Waymarked Trails hiking</a> overlay on top of the topographic basemap. Hover over the map to show the <a href="https://hiking.waymarkedtrails.org" target="_blank">Waymarked Trails hiking</a> overlay on top of the <a href="https://www.maptiler.com/maps/outdoor-topo/" target="_blank">MapTiler Topo</a> basemap.
</span> </span>
</div> </div>
@@ -18,7 +18,7 @@ This tool allows you to add elevation data to traces and [points of interest](..
<DocsNote> <DocsNote>
Elevation data is provided by <a href="https://mapterhorn.com" target="_blank">Mapterhorn</a>. Elevation data is provided by <a href="https://maptiler.com" target="_blank">MapTiler</a>.
You can learn more about its origin and accuracy in the <a href="https://mapterhorn.com/attribution/" target="_blank">documentation</a>. You can learn more about its origin and accuracy in the <a href="https://docs.maptiler.com/guides/map-tiling-hosting/data-hosting/rgb-terrain-by-maptiler/" target="_blank">documentation</a>.
</DocsNote> </DocsNote>
+3 -3
View File
@@ -1,5 +1,5 @@
--- ---
title: Rens title: Clean
--- ---
<script> <script>
@@ -9,9 +9,9 @@ title: Rens
# <SquareDashedMousePointer size="24" class="inline-block" style="margin-bottom: 5px" /> { title } # <SquareDashedMousePointer size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
Når rensverktøyet er valgt, markeres et område ved å tegne et rektangel på kartet. When the clean tool is selected, dragging the map will create a rectangular selection.
Avhengig av alternativene som er valgt i dialogboksen nedenfor, fjerner slett-knappen GPS-punkter og/eller [interessepunkter POI](../gpx) enten innenfor eller utenfor det merkede området. Depending on the options selected in the dialog shown below, clicking the delete button will remove GPS points and/or [points of interest](../gpx) located either inside or outside the selection.
<div class="flex flex-row justify-center"> <div class="flex flex-row justify-center">
<Clean class="text-foreground p-3 border rounded-md shadow-lg" /> <Clean class="text-foreground p-3 border rounded-md shadow-lg" />
+9 -9
View File
@@ -1,5 +1,5 @@
--- ---
title: Interessepunkt title: Points of interest
--- ---
<script> <script>
@@ -9,19 +9,19 @@ title: Interessepunkt
# <MapPin size="24" class="inline-block" style="margin-bottom: 5px" /> { title } # <MapPin size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
[Interessepunkt](../gpx) kan legges til GPX filer for å markere punkter av interesse for å vises på en GPS-enhet. [Points of interest](../gpx) can be added to GPX files to mark locations of interest on the map and display them on your GPS device.
### Opprettelse av interessepunkt ### Creating a point of interest
Fyll ut skjemaet nedenfor for å opprette et interessepunkt. To create a point of interest, fill in the form shown below.
Ved å klikke på kartet eller skrive inn koordinatene, kan du angi plassering til interessepunktet. You can choose the location of the point of interest either by clicking on the map or by entering the coordinates manually.
Bekreft skjemaet når du er ferdig. Validate the form when you are done.
<div class="flex flex-row justify-center"> <div class="flex flex-row justify-center">
<Waypoint class="text-foreground p-3 border rounded-md shadow-lg" /> <Waypoint class="text-foreground p-3 border rounded-md shadow-lg" />
</div> </div>
### Redigering av interessepunkt ### Editing a point of interest
Et eksisterende interessepunkt kan også redigeres ved å velge det på kartet og deretter bruke skjemaet over. The form above can also be used to edit an existing point of interest after selecting it on the map.
Interessepunktet kan flyttes ved å dra det til ønsket plassering. If you only need to move the point of interest, you can drag it to the desired location.
+2 -2
View File
@@ -210,7 +210,7 @@ type RoutingProfile =
| 'motorcycle' | 'motorcycle'
| 'water' | 'water'
| 'railway'; | 'railway';
type TerrainSource = 'mapterhorn'; type TerrainSource = 'maptiler-dem' | 'mapterhorn';
type StreetViewSource = 'mapillary' | 'google'; type StreetViewSource = 'mapillary' | 'google';
export const settings = { export const settings = {
@@ -308,7 +308,7 @@ export const settings = {
terrainSource: new Setting<TerrainSource>( terrainSource: new Setting<TerrainSource>(
'terrainSource', 'terrainSource',
defaultTerrainSource, defaultTerrainSource,
getValueValidator(['mapterhorn'], defaultTerrainSource) getValueValidator(['maptiler-dem', 'mapterhorn'], defaultTerrainSource)
), ),
directionMarkers: new Setting('directionMarkers', false), directionMarkers: new Setting('directionMarkers', false),
distanceMarkers: new Setting('distanceMarkers', false), distanceMarkers: new Setting('distanceMarkers', false),
+10 -8
View File
@@ -7,6 +7,7 @@ import maplibregl from 'maplibre-gl';
import { pointToTile, pointToTileFraction } from '@mapbox/tilebelt'; import { pointToTile, pointToTileFraction } from '@mapbox/tilebelt';
import type { GPXStatisticsTree } from '$lib/logic/statistics-tree'; import type { GPXStatisticsTree } from '$lib/logic/statistics-tree';
import { ListTrackSegmentItem } from '$lib/components/file-list/file-list'; import { ListTrackSegmentItem } from '$lib/components/file-list/file-list';
import { PUBLIC_MAPTILER_KEY } from '$env/static/public';
export function cn(...inputs: ClassValue[]) { export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs)); return twMerge(clsx(inputs));
@@ -100,7 +101,7 @@ export function getClosestTrackSegments(
export function getElevation( export function getElevation(
points: (TrackPoint | Waypoint | Coordinates)[], points: (TrackPoint | Waypoint | Coordinates)[],
ELEVATION_ZOOM: number = 12, ELEVATION_ZOOM: number = 13,
tileSize = 512 tileSize = 512
): Promise<number[]> { ): Promise<number[]> {
let coordinates = points.map((point) => let coordinates = points.map((point) =>
@@ -121,9 +122,10 @@ export function getElevation(
}; };
let promises = uniqueTiles.map((tile) => let promises = uniqueTiles.map((tile) =>
fetch(`https://tiles.gpx.studio/mapterhorn/${ELEVATION_ZOOM}/${tile[0]}/${tile[1]}.webp`, { fetch(
cache: 'force-cache', `https://api.maptiler.com/tiles/terrain-rgb-v2/${ELEVATION_ZOOM}/${tile[0]}/${tile[1]}.webp?key=${PUBLIC_MAPTILER_KEY}`,
}) { cache: 'force-cache' }
)
.then((response) => response.blob()) .then((response) => response.blob())
.then( .then(
(blob) => (blob) =>
@@ -178,10 +180,10 @@ export function getElevation(
_y + (_y + 1 == tileSize ? 0 : 1) _y + (_y + 1 == tileSize ? 0 : 1)
); );
let ele00 = -32768 + p00[0] * 256 + p00[1] + p00[2] / 256; let ele00 = -10000 + (p00[0] * 256 * 256 + p00[1] * 256 + p00[2]) * 0.1;
let ele01 = -32768 + p01[0] * 256 + p01[1] + p01[2] / 256; let ele01 = -10000 + (p01[0] * 256 * 256 + p01[1] * 256 + p01[2]) * 0.1;
let ele10 = -32768 + p10[0] * 256 + p10[1] + p10[2] / 256; let ele10 = -10000 + (p10[0] * 256 * 256 + p10[1] * 256 + p10[2]) * 0.1;
let ele11 = -32768 + p11[0] * 256 + p11[1] + p11[2] / 256; let ele11 = -10000 + (p11[0] * 256 * 256 + p11[1] * 256 + p11[2]) * 0.1;
return ( return (
ele00 * (1 - dx) * (1 - dy) + ele00 * (1 - dx) * (1 - dy) +
+6 -3
View File
@@ -235,7 +235,7 @@
}, },
"elevation": { "elevation": {
"button": "Request elevation data", "button": "Request elevation data",
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from Mapterhorn.", "help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.",
"help_no_selection": "Select a file item to request elevation data." "help_no_selection": "Select a file item to request elevation data."
}, },
"waypoint": { "waypoint": {
@@ -304,8 +304,10 @@
"switzerland": "Switzerland", "switzerland": "Switzerland",
"united_kingdom": "United Kingdom", "united_kingdom": "United Kingdom",
"united_states": "United States", "united_states": "United States",
"topo": "Topo", "maptilerStreets": "MapTiler Streets",
"satellite": "Satellite", "maptilerTopo": "MapTiler Topo",
"maptilerOutdoors": "MapTiler Outdoors",
"maptilerSatellite": "MapTiler Satellite",
"esriSatellite": "Esri Satellite", "esriSatellite": "Esri Satellite",
"openStreetMap": "OpenStreetMap", "openStreetMap": "OpenStreetMap",
"openTopoMap": "OpenTopoMap", "openTopoMap": "OpenTopoMap",
@@ -386,6 +388,7 @@
"tram-stop": "Tram Stop", "tram-stop": "Tram Stop",
"bus-stop": "Bus Stop", "bus-stop": "Bus Stop",
"ferry": "Ferry", "ferry": "Ferry",
"maptiler-dem": "MapTiler DEM",
"mapterhorn": "Mapterhorn" "mapterhorn": "Mapterhorn"
} }
}, },
+47 -47
View File
@@ -28,7 +28,7 @@
"undo": "Batalkan", "undo": "Batalkan",
"redo": "Ulangi", "redo": "Ulangi",
"delete": "Hapus", "delete": "Hapus",
"delete_all": "Hapus Semua", "delete_all": "Delete all",
"select_all": "Pilih Semua", "select_all": "Pilih Semua",
"view": "Lihat", "view": "Lihat",
"elevation_profile": "Profil ketinggian", "elevation_profile": "Profil ketinggian",
@@ -36,7 +36,7 @@
"switch_basemap": "Beralih ke peta dasar sebelumnya", "switch_basemap": "Beralih ke peta dasar sebelumnya",
"toggle_overlays": "Beralih lapisan", "toggle_overlays": "Beralih lapisan",
"toggle_3d": "Beralih 3D", "toggle_3d": "Beralih 3D",
"fullscreen": "Layar Penuh", "fullscreen": "Full screen",
"settings": "Pengaturan", "settings": "Pengaturan",
"distance_units": "Satuan jarak", "distance_units": "Satuan jarak",
"metric": "Metrik", "metric": "Metrik",
@@ -64,7 +64,7 @@
"ctrl": "Ctrl", "ctrl": "Ctrl",
"click": "Klik", "click": "Klik",
"drag": "Seret", "drag": "Seret",
"right_click_drag": "Klik kanan geser", "right_click_drag": "Right-click drag",
"metadata": { "metadata": {
"button": "Info...", "button": "Info...",
"name": "Nama", "name": "Nama",
@@ -82,7 +82,7 @@
"center": "Tengah", "center": "Tengah",
"open_in": "Buka di", "open_in": "Buka di",
"copy_coordinates": "Salin koordinat", "copy_coordinates": "Salin koordinat",
"edit_osm": "Ubah di OpenStreetMap" "edit_osm": "Edit in OpenStreetMap"
}, },
"toolbar": { "toolbar": {
"routing": { "routing": {
@@ -192,8 +192,8 @@
"from": "Titik awal terlalu jauh dari jalan terdekat", "from": "Titik awal terlalu jauh dari jalan terdekat",
"via": "Titik via terlalu jauh dari jalan terdekat", "via": "Titik via terlalu jauh dari jalan terdekat",
"to": "Titik akhir terlalu jauh dari jalan terdekat", "to": "Titik akhir terlalu jauh dari jalan terdekat",
"distance": "Titik akhir terlalu jauh dari jalan terdekat", "distance": "The end point is too far from the start point",
"connection": "Tidak ditemukan koneksi antar titik-titik tersebut", "connection": "No connection found between the points",
"timeout": "Perhitungan rute memakan waktu terlalu lama, coba tambahkan titik-titik yang lebih dekat satu sama lain" "timeout": "Perhitungan rute memakan waktu terlalu lama, coba tambahkan titik-titik yang lebih dekat satu sama lain"
} }
}, },
@@ -235,7 +235,7 @@
}, },
"elevation": { "elevation": {
"button": "Minta data elevasi", "button": "Minta data elevasi",
"help": "Meminta data elevasi akan menghapus data elevasi yang ada, jika ada, dan menggantinya dengan data dari MapTiler.", "help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.",
"help_no_selection": "Pilih item file untuk meminta data elevasi." "help_no_selection": "Pilih item file untuk meminta data elevasi."
}, },
"waypoint": { "waypoint": {
@@ -277,7 +277,7 @@
"new": "Lapisan kustom baru", "new": "Lapisan kustom baru",
"edit": "Edit lapisan kustom", "edit": "Edit lapisan kustom",
"urls": "URL", "urls": "URL",
"url_placeholder": "WMTS, WMS, atau JSON style MapLibre", "url_placeholder": "WMTS, WMS or MapLibre style JSON",
"max_zoom": "Zoom maksimum", "max_zoom": "Zoom maksimum",
"layer_type": "Tipe lapisan", "layer_type": "Tipe lapisan",
"basemap": "Peta dasar", "basemap": "Peta dasar",
@@ -286,7 +286,7 @@
"update": "Perbarui lapisan" "update": "Perbarui lapisan"
}, },
"opacity": "Opasitas Overlay", "opacity": "Opasitas Overlay",
"terrain": "Sumber medan", "terrain": "Terrain source",
"label": { "label": {
"basemaps": "Peta dasar", "basemaps": "Peta dasar",
"overlays": "Overlay", "overlays": "Overlay",
@@ -363,7 +363,7 @@
"water": "Air", "water": "Air",
"shower": "Mandi", "shower": "Mandi",
"shelter": "Penampungan", "shelter": "Penampungan",
"cemetery": "Pemakaman", "cemetery": "Cemetery",
"motorized": "Mobil dan Motor", "motorized": "Mobil dan Motor",
"fuel-station": "Stasiun bahan bakar", "fuel-station": "Stasiun bahan bakar",
"parking": "Parkir", "parking": "Parkir",
@@ -477,55 +477,55 @@
"shelter": "Penampungan", "shelter": "Penampungan",
"shopping_center": "Pusat Perbelanjaan", "shopping_center": "Pusat Perbelanjaan",
"shower": "Mandi", "shower": "Mandi",
"summit": "Puncak", "summit": "Summit",
"telephone": "Telepon", "telephone": "Telephone",
"tunnel": "Terowongan", "tunnel": "Tunnel",
"water_source": "Sumber Air" "water_source": "Water Source"
} }
}, },
"homepage": { "homepage": {
"website": "Situs Web", "website": "Website",
"home": "Beranda", "home": "Home",
"app": "Aplikasi", "app": "App",
"contact": "Kontak", "contact": "Contact",
"reddit": "Reddit", "reddit": "Reddit",
"facebook": "Facebook", "facebook": "Facebook",
"github": "GitHub", "github": "GitHub",
"crowdin": "Crowdin", "crowdin": "Crowdin",
"email": "Email", "email": "Email",
"contribute": "Kontribusi", "contribute": "Contribute",
"supported_by": "didukung oleh", "supported_by": "supported by",
"features": "Fitur", "features": "Features",
"route_planning": "Perencanaan rute", "route_planning": "Route planning",
"route_planning_description": "Antarmuka intuitif untuk membuat rencana perjalanan yang disesuaikan dengan setiap olahraga, berdasarkan data OpenStreetMap.", "route_planning_description": "An intuitive interface to create itineraries tailored to each sport, based on OpenStreetMap data.",
"file_processing": "Pengolahan file lanjutan", "file_processing": "Pengolahan file lanjutan",
"file_processing_description": "Seperangkat alat untuk melakukan semua tugas pemrosesan file umum, dan yang dapat diterapkan pada banyak file sekaligus.", "file_processing_description": "A suite of tools for performing all common file processing tasks, and which can be applied to multiple files at once.",
"maps": "Peta global dan lokal", "maps": "Global and local maps",
"maps_description": "Koleksi besar peta dasar, lapisan peta, dan tempat menarik untuk membantu Anda merencanakan petualangan luar ruangan berikutnya, atau memvisualisasikan pencapaian terbaru Anda.", "maps_description": "A large collection of basemaps, overlays and points of interest to help you craft your next outdoor adventure, or visualize your latest achievement.",
"data_visualization": "Visualisasi data", "data_visualization": "Data visualization",
"data_visualization_description": "Profil ketinggian interaktif dengan statistik terperinci untuk menganalisis aktivitas yang tercatat dan tujuan di masa mendatang.", "data_visualization_description": "An interactive elevation profile with detailed statistics to analyze recorded activities and future objectives.",
"philosophy": "Filosofi", "philosophy": "Philosophy",
"foss": "Gratis, tanpa iklan, dan open source", "foss": "Free, ad-free and open source",
"foss_description": "Situs web ini gratis untuk digunakan, tanpa iklan, dan kode sumbernya tersedia untuk umum di GitHub.", "foss_description": "The website is free to use, without ads, and the source code is publicly available on GitHub.",
"privacy": "Ramah privasi", "privacy": "Privacy-friendly",
"privacy_description": "File GPX Anda tidak pernah meninggalkan browser Anda. Tidak ada pelacakan, tidak ada pengumpulan data.", "privacy_description": "Your GPX files never leave your browser. No tracking, no data collection.",
"community": "Terwujud berkat komunitas", "community": "Made possible by the community",
"community_description": "gpx.studio memiliki komunitas luar biasa yang telah menutupi biaya operasionalnya melalui donasi selama bertahun-tahun, sekaligus membentuk proyek ini melalui saran fitur, laporan bug, dan terjemahan ke dalam banyak bahasa.", "community_description": "gpx.studio has an amazing community that has covered its costs through donations for years, while shaping the project through feature suggestions, bug reports, and translations into many languages.",
"support_button": "Dukung gpx.studio di Open Collective", "support_button": "Support gpx.studio on Open Collective",
"translate_button": "Bantu menerjemahkan situs web di Crowdin" "translate_button": "Help translate the website on Crowdin"
}, },
"docs": { "docs": {
"translate": "Perbaiki kualitas terjemahan di Crowdin", "translate": "Improve the translation on Crowdin",
"answer_not_found": "Tidak menemukan apa yang Anda cari?", "answer_not_found": "Did not find what you were looking for?",
"ask_on_reddit": "Tanyakan kepada komunitas di Reddit", "ask_on_reddit": "Ask the community on Reddit",
"search": { "search": {
"search": "Cari", "search": "Search",
"clear": "Bersihkan", "clear": "Clear",
"cancel": "Batalkan", "cancel": "Cancel",
"recent": "Pencarian terakhir", "recent": "Recent searches",
"no_recent": "Tidak Ada Pencarian Baru", "no_recent": "No recent searches",
"save": "Simpan pencarian ini", "save": "Save this search",
"remove": "Hapus pencarian ini dari riwayat", "remove": "Remove this search from history",
"favorites": "Favorites", "favorites": "Favorites",
"remove_favorite": "Remove this search from favorites", "remove_favorite": "Remove this search from favorites",
"to_select": "to select", "to_select": "to select",
+1 -1
View File
@@ -401,7 +401,7 @@
"elevation_gain_loss": "Stijging en daling", "elevation_gain_loss": "Stijging en daling",
"temperature": "Temperatuur", "temperature": "Temperatuur",
"speed": "Snelheid", "speed": "Snelheid",
"pace": "Tempo", "pace": "Snelheid",
"heartrate": "Hartslag", "heartrate": "Hartslag",
"cadence": "Cadans", "cadence": "Cadans",
"power": "Kracht", "power": "Kracht",
+4 -4
View File
@@ -36,7 +36,7 @@
"switch_basemap": "Bytt til forrige basekart", "switch_basemap": "Bytt til forrige basekart",
"toggle_overlays": "Vis eller skjul kartlag", "toggle_overlays": "Vis eller skjul kartlag",
"toggle_3d": "Skru av/på 3D", "toggle_3d": "Skru av/på 3D",
"fullscreen": "Fullskjerm", "fullscreen": "Full screen",
"settings": "Innstillinger", "settings": "Innstillinger",
"distance_units": "Avstandsenhet", "distance_units": "Avstandsenhet",
"metric": "Metrisk", "metric": "Metrisk",
@@ -64,7 +64,7 @@
"ctrl": "Ctrl", "ctrl": "Ctrl",
"click": "Klikk", "click": "Klikk",
"drag": "Dra", "drag": "Dra",
"right_click_drag": "Høyreklikk dra", "right_click_drag": "Right-click drag",
"metadata": { "metadata": {
"button": "Informasjon...", "button": "Informasjon...",
"name": "Navn", "name": "Navn",
@@ -192,8 +192,8 @@
"from": "Startpunktet er for langt unna nærmeste vei", "from": "Startpunktet er for langt unna nærmeste vei",
"via": "Via-punktet er for langt fra nærmeste vei", "via": "Via-punktet er for langt fra nærmeste vei",
"to": "Sluttpunktet er for langt unna nærmeste vei", "to": "Sluttpunktet er for langt unna nærmeste vei",
"distance": "Sluttpunktet er for langt fra startpunktet", "distance": "The end point is too far from the start point",
"connection": "Ingen forbindelse mellom punktene funnet", "connection": "No connection found between the points",
"timeout": "Ruteberegning tok for lang tid, prøv å legge til flere punkter" "timeout": "Ruteberegning tok for lang tid, prøv å legge til flere punkter"
} }
}, },
@@ -19,8 +19,8 @@
return; return;
} }
embeddingOptions = getMergedEmbeddingOptions(options); embeddingOptions = getMergedEmbeddingOptions(options);
if (embeddingOptions.key === '' && embeddingOptions.basemap === 'satellite') { if (embeddingOptions.key === '' && embeddingOptions.basemap.startsWith('maptiler')) {
embeddingOptions.basemap = 'topo'; embeddingOptions.basemap = 'openStreetMap';
} }
}); });
</script> </script>
+47
View File
@@ -0,0 +1,47 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 812 212" style="enable-background:new 0 0 812 212;" xml:space="preserve">
<style type="text/css">
.st0{fill:#3A1888;}
.st1{fill:#03A1C4;}
.st2{fill:#05D0DF;}
.st3{fill:#761FE8;}
.st4{fill:#FFAA01;}
.st5{fill:#F1175D;}
.st6{fill:#FB3A1B;}
.st7{fill:#FBC935;}
.st8{fill:#FFFFFF;}
</style>
<g>
<path class="st0" d="M94.3,164.2c9.2,9.2,33.8,34.3,33.8,34.3c-0.1,0.2,24.4-24.5,34.2-34.2l-34.1-34.1L94.3,164.2z"/>
<path class="st1" d="M128.3,130.2l34.1,34.1c0.1-0.1,0.1-0.1,0.2-0.2l34-34L162.5,96L128.3,130.2z"/>
<path class="st2" d="M196.6,130.1L196.6,130.1c18.9-18.9,18.9-49.4,0.1-68.3L162.5,96L196.6,130.1z"/>
<path class="st3" d="M94.1,96l-34,34c0,0,0,0,0,0l34.1,34.1c0,0,0,0,0.1,0.1l34-34L94.1,96z"/>
<path class="st4" d="M128.3,61.8L162.5,96l34.2-34.2c0,0,0,0-0.1-0.1l-34.1-34.1c0,0,0,0,0,0L128.3,61.8z"/>
<path class="st5" d="M60,61.9c-18.7,18.9-18.6,49.3,0.1,68.1l34-34L60,61.9z"/>
<path class="st6" d="M128.3,61.8L94.2,27.7l-34,34c-0.1,0.1-0.1,0.1-0.2,0.2L94.1,96L128.3,61.8z"/>
<path class="st7" d="M162.5,27.6c-18.9-18.8-49.4-18.8-68.2,0l-0.1,0.1l34.1,34.1L162.5,27.6z"/>
</g>
<path class="st8" d="M303.8,138.6v-34.9c0-8.6-4.5-16.4-13.3-16.4c-8.7,0-13.9,7.8-13.9,16.4v34.9h-16.1V73.4h14.9l1.2,7.9
c3.4-6.6,11-9,17.2-9c7.8,0,15.6,3.2,19.3,12.2c5.8-9.2,13.3-11.9,21.8-11.9c18.5,0,27.6,11.4,27.6,30.9v35.1h-16.1v-35.1
c0-8.6-3.6-15.9-12.3-15.9c-8.7,0-14.1,7.5-14.1,16.1v34.9H303.8z"/>
<path class="st8" d="M430.5,73.5h15.5v65.1h-15.2l-0.8-9.5c-3.7,7.7-13.9,11.4-21.1,11.5c-19.3,0.1-33.6-11.8-33.6-34.6
c0-22.5,14.9-34.2,34-34.1c8.7,0,17,4.1,20.7,10.6L430.5,73.5z M391.4,106c0,12.4,8.6,19.8,19.3,19.8c25.4,0,25.4-39.5,0-39.5
C399.9,86.3,391.4,93.6,391.4,106z"/>
<path class="st8" d="M459.5,165.8V73.5h15.1l1.1,9c5-7.3,13.7-10.4,21.1-10.4c20.1,0,33.4,14.9,33.4,34.1c0,19-12,34.1-32.9,34.1
c-6.9,0-17-2.1-21.7-9.3v34.9H459.5z M514.1,106.1c0-10.2-6.9-18.5-18.5-18.5c-11.6,0-18.5,8.3-18.5,18.5c0,10.2,7.5,18.5,18.5,18.5
C506.6,124.6,514.1,116.3,514.1,106.1z"/>
<path class="st8" d="M559,53.7v19.7h22.2v5.4H559v39.8c0,8.8,1.9,15.1,12,15.1c3.2,0,6.7-1.1,10-2.6l2.2,5.3
c-4.1,2-8.2,3.3-12.3,3.3c-13.9,0-18.4-8.2-18.4-21V78.8h-13.9v-5.4h13.9v-19L559,53.7z"/>
<path class="st8" d="M604.7,52.1c0,6.9-10.4,6.9-10.4,0C594.3,45.2,604.7,45.2,604.7,52.1z M596.1,73.1v65.5h6.5V73.1H596.1z"/>
<path class="st8" d="M627.6,46.2v92.5h-6.5V46.2H627.6z"/>
<path class="st8" d="M730.2,73.4l0.3,11.6c4.1-8.9,13.3-12.3,21.7-12.3c4.9-0.1,9.6,1.2,14,3.8l-2.9,5.3c-3.4-2.1-7.3-3-11.1-3
c-12.2,0.1-21.5,9.9-21.5,21.8v38h-6.5V73.4H730.2z"/>
<g>
<path class="st8" d="M675.1,134.7c-11.5,0-21.4-7.2-25.5-17.4l0,0l0,0c0,0,0,0,0,0l52.8-14c0,0,0,0,0,0.1l5.6-1.5
c-2.3-16.5-16.2-29.3-33-29.3c-18.4,0-33.3,15.2-33.3,34c0,18.8,14.9,34,33.3,34c13.8,0,25.6-8.5,30.6-20.7l-5.3-2.3
C696.2,127.6,686.4,134.7,675.1,134.7z M647.5,106.6c0-15.5,12.3-28.1,27.5-28.1c11.9,0,22,7.7,25.9,18.5L647.9,111
C647.6,109.5,647.5,108.1,647.5,106.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

+45
View File
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 23.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Vrstva_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 812 212" style="enable-background:new 0 0 812 212;" xml:space="preserve">
<style type="text/css">
.st0{fill:#3A1888;}
.st1{fill:#03A1C4;}
.st2{fill:#05D0DF;}
.st3{fill:#761FE8;}
.st4{fill:#FFAA01;}
.st5{fill:#F1175D;}
.st6{fill:#FB3A1B;}
.st7{fill:#FBC935;}
.st8{fill:#333359;}
</style>
<path class="st0" d="M94.3,164.2c9.2,9.2,33.8,34.3,33.8,34.3c-0.1,0.2,24.4-24.5,34.2-34.2l-34.1-34.1L94.3,164.2z"/>
<path class="st1" d="M128.3,130.2l34.1,34.1c0.1-0.1,0.1-0.1,0.2-0.2l34-34L162.5,96L128.3,130.2z"/>
<path class="st2" d="M196.6,130.1L196.6,130.1c18.9-18.9,18.9-49.4,0.1-68.3L162.5,96L196.6,130.1z"/>
<path class="st3" d="M94.1,96l-34,34c0,0,0,0,0,0l34.1,34.1c0,0,0,0,0.1,0.1l34-34L94.1,96z"/>
<path class="st4" d="M128.3,61.8L162.5,96l34.2-34.2c0,0,0,0-0.1-0.1l-34.1-34.1c0,0,0,0,0,0L128.3,61.8z"/>
<path class="st5" d="M60,61.9c-18.7,18.9-18.6,49.3,0.1,68.1l34-34L60,61.9z"/>
<path class="st6" d="M128.3,61.8L94.2,27.7l-34,34c-0.1,0.1-0.1,0.1-0.2,0.2L94.1,96L128.3,61.8z"/>
<path class="st7" d="M162.5,27.6c-18.9-18.8-49.4-18.8-68.2,0l-0.1,0.1l34.1,34.1L162.5,27.6z"/>
<path class="st8" d="M303.7,138.6v-34.9c0-8.6-4.5-16.4-13.3-16.4c-8.7,0-13.9,7.8-13.9,16.4v34.9h-16.1V73.4h14.9l1.2,7.9
c3.4-6.6,11-9,17.2-9c7.8,0,15.6,3.2,19.3,12.2c5.8-9.2,13.3-11.9,21.8-11.9c18.5,0,27.6,11.4,27.6,30.9v35.1h-16.1v-35.1
c0-8.6-3.6-15.9-12.3-15.9c-8.7,0-14.1,7.5-14.1,16.1v34.9H303.7z"/>
<path class="st8" d="M430.3,73.5h15.5v65.1h-15.2l-0.8-9.5c-3.7,7.7-13.9,11.4-21.1,11.5c-19.3,0.1-33.6-11.8-33.6-34.6
c0-22.5,14.9-34.2,34-34.1c8.7,0,17,4.1,20.7,10.6L430.3,73.5z M391.2,106c0,12.4,8.6,19.8,19.3,19.8c25.4,0,25.4-39.5,0-39.5
C399.8,86.3,391.2,93.6,391.2,106z"/>
<path class="st8" d="M459.4,165.8V73.5h15.1l1.1,9c5-7.3,13.7-10.4,21.1-10.4c20.1,0,33.4,14.9,33.4,34.1c0,19-12,34.1-32.9,34.1
c-6.9,0-17-2.1-21.7-9.3v34.9H459.4z M514,106.1c0-10.2-6.9-18.5-18.5-18.5c-11.6,0-18.5,8.3-18.5,18.5c0,10.2,7.5,18.5,18.5,18.5
C506.4,124.6,514,116.3,514,106.1z"/>
<path class="st8" d="M558.9,53.7v19.7h22.2v5.4h-22.2v39.8c0,8.8,1.9,15.1,12,15.1c3.2,0,6.7-1.1,10-2.6l2.2,5.3
c-4.1,2-8.2,3.3-12.3,3.3c-13.9,0-18.4-8.2-18.4-21V78.8h-13.9v-5.4h13.9v-19L558.9,53.7z"/>
<path class="st8" d="M604.6,52.1c0,6.9-10.4,6.9-10.4,0C594.1,45.2,604.6,45.2,604.6,52.1z M596,73.1v65.5h6.5V73.1H596z"/>
<path class="st8" d="M627.4,46.2v92.5H621V46.2H627.4z"/>
<path class="st8" d="M730.1,73.4l0.3,11.6c4.1-8.9,13.3-12.3,21.7-12.3c4.9-0.1,9.6,1.2,14,3.8l-2.9,5.3c-3.4-2.1-7.3-3-11.1-3
c-12.2,0.1-21.5,9.9-21.5,21.8v38H724V73.4H730.1z"/>
<g>
<path class="st8" d="M674.9,134.7c-11.5,0-21.4-7.2-25.5-17.4l0,0l0,0c0,0,0,0,0,0l52.8-14c0,0,0,0,0,0.1l5.6-1.5
c-2.3-16.5-16.2-29.3-33-29.3c-18.4,0-33.3,15.2-33.3,34c0,18.8,14.9,34,33.3,34c13.8,0,25.6-8.5,30.6-20.7l-5.3-2.3
C696.1,127.6,686.3,134.7,674.9,134.7z M647.4,106.6c0-15.5,12.3-28.1,27.5-28.1c11.9,0,22,7.7,25.9,18.5L647.7,111
C647.5,109.5,647.4,108.1,647.4,106.6z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB