Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fe8896e870 | |||
| c99517572e | |||
| 0b7f30a7c4 | |||
| fcfaf043c4 | |||
| 0393a330a6 | |||
| 2fdb58bc7d | |||
| c758bda1a9 | |||
| 88e301e2a2 | |||
| 161c664e08 | |||
| a0408ec798 | |||
| 480d5586b9 | |||
| 7b49018593 | |||
| 4b447a9b9d | |||
| 443feb2bfa | |||
| 8710101a78 | |||
| 2c20148e64 | |||
| ffc0e84788 | |||
| 2d2004e447 | |||
| 4a7cfc113d | |||
| f03ad5a0e9 | |||
| 7f5b83f9d8 | |||
| 5a8f93e225 | |||
| 668b0f6b23 | |||
| fc1eb5a408 | |||
| 561c7e22b3 | |||
| ce067d4ff0 | |||
| 7361b54255 | |||
| 9e2334ca83 |
|
Before Width: | Height: | Size: 339 KiB After Width: | Height: | Size: 313 KiB |
|
After Width: | Height: | Size: 729 KiB |
|
After Width: | Height: | Size: 308 KiB |
|
Before Width: | Height: | Size: 1.7 MiB After Width: | Height: | Size: 525 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 710 KiB |
|
Before Width: | Height: | Size: 2.8 MiB |
|
Before Width: | Height: | Size: 348 KiB |
@@ -31,10 +31,8 @@ import bikerouterGravel from './custom/bikerouter-gravel.json';
|
||||
export const maptilerKeyPlaceHolder = 'MAPTILER_KEY';
|
||||
|
||||
export const basemaps: { [key: string]: string | StyleSpecification } = {
|
||||
maptilerStreets: `https://api.maptiler.com/maps/streets-v4/style.json?key=${maptilerKeyPlaceHolder}`,
|
||||
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}`,
|
||||
topo: 'https://raw.githubusercontent.com/gpxstudio/styles/refs/heads/main/topo.json',
|
||||
satellite: 'https://raw.githubusercontent.com/gpxstudio/styles/refs/heads/main/satellite.json',
|
||||
esriSatellite: {
|
||||
version: 8,
|
||||
sources: {
|
||||
@@ -799,10 +797,8 @@ export type LayerTreeType = { [key: string]: LayerTreeType | boolean };
|
||||
export const basemapTree: LayerTreeType = {
|
||||
basemaps: {
|
||||
world: {
|
||||
maptilerStreets: true,
|
||||
maptilerTopo: true,
|
||||
maptilerOutdoors: true,
|
||||
maptilerSatellite: true,
|
||||
topo: true,
|
||||
satellite: true,
|
||||
esriSatellite: true,
|
||||
openStreetMap: true,
|
||||
openTopoMap: true,
|
||||
@@ -936,7 +932,7 @@ export const overpassTree: LayerTreeType = {
|
||||
};
|
||||
|
||||
// Default basemap used
|
||||
export const defaultBasemap = 'maptilerStreets';
|
||||
export const defaultBasemap = 'topo';
|
||||
|
||||
// Default overlays used (none)
|
||||
export const defaultOverlays: LayerTreeType = {
|
||||
@@ -1025,10 +1021,8 @@ export const defaultOverpassQueries: LayerTreeType = {
|
||||
export const defaultBasemapTree: LayerTreeType = {
|
||||
basemaps: {
|
||||
world: {
|
||||
maptilerStreets: true,
|
||||
maptilerTopo: true,
|
||||
maptilerOutdoors: true,
|
||||
maptilerSatellite: true,
|
||||
topo: true,
|
||||
satellite: true,
|
||||
esriSatellite: false,
|
||||
openStreetMap: true,
|
||||
openTopoMap: true,
|
||||
@@ -1487,14 +1481,11 @@ export const overpassQueryData: Record<string, OverpassQueryData> = {
|
||||
};
|
||||
|
||||
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: {
|
||||
type: 'raster-dem',
|
||||
url: 'https://tiles.mapterhorn.com/tilejson.json',
|
||||
url: 'https://tiles.gpx.studio/mapterhorn.json',
|
||||
encoding: 'terrarium',
|
||||
},
|
||||
};
|
||||
|
||||
export const defaultTerrainSource = 'maptiler-dem';
|
||||
export const defaultTerrainSource = 'mapterhorn';
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
...others
|
||||
}: {
|
||||
iconOnly?: boolean;
|
||||
company?: 'gpx.studio' | 'maptiler' | 'github' | 'crowdin' | 'facebook' | 'reddit';
|
||||
company?: 'gpx.studio' | 'github' | 'crowdin' | 'facebook' | 'reddit';
|
||||
[key: string]: any;
|
||||
} = $props();
|
||||
</script>
|
||||
@@ -19,12 +19,6 @@
|
||||
alt="Logo of gpx.studio."
|
||||
{...others}
|
||||
/>
|
||||
{:else if company === 'maptiler'}
|
||||
<img
|
||||
src="{base}/maptiler-logo{mode.current === 'dark' ? '-dark' : ''}.svg"
|
||||
alt="Logo of Maptiler."
|
||||
{...others}
|
||||
/>
|
||||
{:else if company === 'github'}
|
||||
<svg
|
||||
role="img"
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<script lang="ts">
|
||||
import maptilerTopoMap from '$lib/assets/img/home/maptiler-topo.png?enhanced';
|
||||
import waymarkedMap from '$lib/assets/img/home/waymarked.png?enhanced';
|
||||
import topoMap from '$lib/assets/img/docs/maps/topo.png?enhanced';
|
||||
import waymarkedMap from '$lib/assets/img/docs/maps/waymarked.png?enhanced';
|
||||
</script>
|
||||
|
||||
<div class="relative h-80 aspect-square rounded-2xl shadow-xl overflow-clip">
|
||||
<enhanced:img src={maptilerTopoMap} alt="MapTiler Topo map screenshot." class="absolute" />
|
||||
<enhanced:img src={topoMap} alt="Topo map screenshot." class="absolute" />
|
||||
<enhanced:img
|
||||
src={waymarkedMap}
|
||||
alt="Waymarked Trails map screenshot."
|
||||
|
||||
@@ -29,7 +29,7 @@ export const defaultEmbeddingOptions = {
|
||||
key: '',
|
||||
files: [],
|
||||
ids: [],
|
||||
basemap: 'maptilerStreets',
|
||||
basemap: 'topo',
|
||||
elevation: {
|
||||
show: true,
|
||||
height: 170,
|
||||
@@ -125,9 +125,7 @@ export function convertOldEmbeddingOptions(options: URLSearchParams): any {
|
||||
}
|
||||
if (options.has('source')) {
|
||||
let basemap = options.get('source')!;
|
||||
if (basemap === 'satellite') {
|
||||
newOptions.basemap = 'maptilerSatellite';
|
||||
} else if (basemap === 'otm') {
|
||||
if (basemap === 'otm') {
|
||||
newOptions.basemap = 'openTopoMap';
|
||||
} else if (basemap === 'ohm') {
|
||||
newOptions.basemap = 'openHikingMap';
|
||||
|
||||
@@ -10,7 +10,8 @@ import {
|
||||
import { getLayers } from '$lib/components/map/layer-control/utils';
|
||||
import { i18n } from '$lib/i18n.svelte';
|
||||
|
||||
const { currentBasemap, currentOverlays, customLayers, opacities, terrainSource } = settings;
|
||||
const { currentBasemap, currentOverlays, customLayers, opacities, terrainSource, distanceUnits } =
|
||||
settings;
|
||||
|
||||
const emptySource: maplibregl.GeoJSONSourceSpecification = {
|
||||
type: 'geojson',
|
||||
@@ -57,15 +58,21 @@ export class StyleManager {
|
||||
opacities.subscribe(() => this.updateOverlays());
|
||||
terrainSource.subscribe(() => this.updateTerrain());
|
||||
customLayers.subscribe(() => this.updateBasemap());
|
||||
distanceUnits.subscribe(() => {
|
||||
if (get(currentBasemap) === 'topo') this.updateBasemap();
|
||||
});
|
||||
}
|
||||
|
||||
updateBasemap() {
|
||||
const map_ = get(this._map);
|
||||
if (!map_) return;
|
||||
this.buildStyle().then((style) => map_.setStyle(style));
|
||||
let basemap = get(currentBasemap);
|
||||
this.buildStyle(basemap).then((style) => {
|
||||
if (get(currentBasemap) === basemap) map_.setStyle(style);
|
||||
});
|
||||
}
|
||||
|
||||
async buildStyle(): Promise<maplibregl.StyleSpecification> {
|
||||
async buildStyle(basemap: string): Promise<maplibregl.StyleSpecification> {
|
||||
const custom = get(customLayers);
|
||||
|
||||
const style: maplibregl.StyleSpecification = {
|
||||
@@ -79,22 +86,31 @@ export class StyleManager {
|
||||
layers: [],
|
||||
};
|
||||
|
||||
let basemap = get(currentBasemap);
|
||||
const basemapInfo = basemaps[basemap] ?? custom[basemap]?.value ?? basemaps[defaultBasemap];
|
||||
|
||||
let basemapStyle = basemaps.openStreetMap as maplibregl.StyleSpecification;
|
||||
try {
|
||||
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) {
|
||||
console.error(e.message);
|
||||
}
|
||||
this.merge(style, basemapStyle);
|
||||
|
||||
if (this._maptilerKey !== '') {
|
||||
const terrain = this.getCurrentTerrain();
|
||||
style.sources[terrain.source] = terrainSources[terrain.source];
|
||||
style.terrain = terrain.exaggeration > 0 ? terrain : undefined;
|
||||
}
|
||||
const terrain = this.getCurrentTerrain();
|
||||
style.sources[terrain.source] = terrainSources[terrain.source];
|
||||
style.terrain = terrain.exaggeration > 0 ? terrain : undefined;
|
||||
|
||||
style.layers.push(...anchorLayers);
|
||||
|
||||
@@ -166,7 +182,6 @@ export class StyleManager {
|
||||
}
|
||||
|
||||
updateTerrain() {
|
||||
if (this._maptilerKey === '') return;
|
||||
const map_ = get(this._map);
|
||||
if (!map_) return;
|
||||
|
||||
@@ -189,9 +204,6 @@ export class StyleManager {
|
||||
): Promise<maplibregl.StyleSpecification> {
|
||||
if (typeof styleInfo === 'string') {
|
||||
let styleUrl = styleInfo as string;
|
||||
if (styleUrl.includes(maptilerKeyPlaceHolder)) {
|
||||
styleUrl = styleUrl.replace(maptilerKeyPlaceHolder, this._maptilerKey);
|
||||
}
|
||||
const response = await fetch(styleUrl, { cache: 'force-cache' });
|
||||
if (!response.ok) {
|
||||
throw new Error(`HTTP error fetching style "${styleInfo}": ${response.status}`);
|
||||
@@ -205,17 +217,23 @@ export class StyleManager {
|
||||
|
||||
merge(style: maplibregl.StyleSpecification, other: maplibregl.StyleSpecification) {
|
||||
style.sources = { ...style.sources, ...other.sources };
|
||||
const units = get(distanceUnits);
|
||||
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']) {
|
||||
const textField = layer.layout['text-field'];
|
||||
if (
|
||||
Array.isArray(textField) &&
|
||||
textField.length >= 2 &&
|
||||
textField[0] === 'coalesce' &&
|
||||
Array.isArray(textField[1]) &&
|
||||
textField[1][0] === 'get' &&
|
||||
typeof textField[1][1] === 'string' &&
|
||||
textField[1][1].startsWith('name')
|
||||
textField.length == 4 &&
|
||||
Array.isArray(textField[3]) &&
|
||||
textField[3][0] === 'coalesce' &&
|
||||
Array.isArray(textField[3][1]) &&
|
||||
textField[3][1][0] === 'get' &&
|
||||
typeof textField[3][1][1] === 'string' &&
|
||||
textField[3][1][1].startsWith('name')
|
||||
) {
|
||||
layer.layout['text-field'] = [
|
||||
'coalesce',
|
||||
@@ -236,10 +254,6 @@ export class StyleManager {
|
||||
|
||||
getCurrentTerrain() {
|
||||
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);
|
||||
return {
|
||||
source: terrain,
|
||||
|
||||
@@ -163,6 +163,9 @@ export class ReducedGPXLayerCollection {
|
||||
reduce() {
|
||||
let itemsAndPoints = new Map<ListItem, TrackPoint[]>();
|
||||
this._simplified.forEach(([item, maxPts, points], itemFullId) => {
|
||||
if (!get(selection).hasAnyParent(item)) {
|
||||
return;
|
||||
}
|
||||
itemsAndPoints.set(
|
||||
item,
|
||||
points
|
||||
|
||||
@@ -59,7 +59,7 @@ Only one basemap can be displayed at a time.
|
||||
<DocsLayers />
|
||||
<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 <a href="https://www.maptiler.com/maps/outdoor-topo/" target="_blank">MapTiler Topo</a> 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 topographic basemap.
|
||||
|
||||
</span>
|
||||
</div>
|
||||
|
||||
@@ -18,7 +18,7 @@ This tool allows you to add elevation data to traces and [points of interest](..
|
||||
|
||||
<DocsNote>
|
||||
|
||||
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://docs.maptiler.com/guides/map-tiling-hosting/data-hosting/rgb-terrain-by-maptiler/" target="_blank">documentation</a>.
|
||||
Elevation data is provided by <a href="https://mapterhorn.com" target="_blank">Mapterhorn</a>.
|
||||
You can learn more about its origin and accuracy in the <a href="https://mapterhorn.com/attribution/" target="_blank">documentation</a>.
|
||||
|
||||
</DocsNote>
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Clean
|
||||
title: Rens
|
||||
---
|
||||
|
||||
<script>
|
||||
@@ -9,9 +9,9 @@ title: Clean
|
||||
|
||||
# <SquareDashedMousePointer size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
|
||||
|
||||
When the clean tool is selected, dragging the map will create a rectangular selection.
|
||||
Når rensverktøyet er valgt, markeres et område ved å tegne et rektangel på kartet.
|
||||
|
||||
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.
|
||||
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.
|
||||
|
||||
<div class="flex flex-row justify-center">
|
||||
<Clean class="text-foreground p-3 border rounded-md shadow-lg" />
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
---
|
||||
title: Points of interest
|
||||
title: Interessepunkt
|
||||
---
|
||||
|
||||
<script>
|
||||
@@ -9,19 +9,19 @@ title: Points of interest
|
||||
|
||||
# <MapPin size="24" class="inline-block" style="margin-bottom: 5px" /> { title }
|
||||
|
||||
[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.
|
||||
[Interessepunkt](../gpx) kan legges til GPX filer for å markere punkter av interesse for å vises på en GPS-enhet.
|
||||
|
||||
### Creating a point of interest
|
||||
### Opprettelse av interessepunkt
|
||||
|
||||
To create a point of interest, fill in the form shown below.
|
||||
You can choose the location of the point of interest either by clicking on the map or by entering the coordinates manually.
|
||||
Validate the form when you are done.
|
||||
Fyll ut skjemaet nedenfor for å opprette et interessepunkt.
|
||||
Ved å klikke på kartet eller skrive inn koordinatene, kan du angi plassering til interessepunktet.
|
||||
Bekreft skjemaet når du er ferdig.
|
||||
|
||||
<div class="flex flex-row justify-center">
|
||||
<Waypoint class="text-foreground p-3 border rounded-md shadow-lg" />
|
||||
</div>
|
||||
|
||||
### Editing a point of interest
|
||||
### Redigering av interessepunkt
|
||||
|
||||
The form above can also be used to edit an existing point of interest after selecting it on the map.
|
||||
If you only need to move the point of interest, you can drag it to the desired location.
|
||||
Et eksisterende interessepunkt kan også redigeres ved å velge det på kartet og deretter bruke skjemaet over.
|
||||
Interessepunktet kan flyttes ved å dra det til ønsket plassering.
|
||||
|
||||
@@ -47,11 +47,11 @@ title: Файлы и статистика
|
||||
|
||||
Щелкнув правой кнопкой мыши на вкладке файла, вы можете получить доступ к тем же действиям, что и в [меню редактирования](./menu/edit).
|
||||
|
||||
### Tree layout
|
||||
### Древовидное представление
|
||||
|
||||
As mentioned in the [view options section](./menu/view), you can switch to a tree layout for the files list.
|
||||
This layout is ideal for managing a large number of open files, as it organizes them into a vertical list on the right side of the map.
|
||||
In addition, the file tree view enables you to inspect the [tracks, segments, and points of interest](./gpx) contained inside the files through collapsible sections.
|
||||
Как указано в разделе [Варианты отображения](./menu/view), вы можете переключаться на древовидное представление для списка файлов.
|
||||
Эта раскладка идеально подходит для управления большим количеством открытых файлов, так как она упорядочивает их в вертикальный список справа от карты.
|
||||
Кроме того, древовидное представление файлов позволяет вам исследовать [треки, сегменты и точки интереса](./gpx) содержащиеся в файлах через выпадающие списки.
|
||||
|
||||
Вы также можете применять [действия редактирования](./menu/edit) и [инструменты](./toolbar) к внутренним элементам файла.
|
||||
Кроме того, вы можете перетаскивать внутренние элементы, чтобы изменить их порядок, перемещать их в иерархии или даже в другой файл.
|
||||
@@ -98,12 +98,12 @@ In addition, the file tree view enables you to inspect the [tracks, segments, an
|
||||
/>
|
||||
</div>
|
||||
|
||||
### Additional data
|
||||
### Дополнительная информация
|
||||
|
||||
Using the <kbd><ChartNoAxesColumn size="16" class="inline-block" style="margin-bottom: 2px"/></kbd> button at the bottom-right of the elevation profile, you can optionally color the elevation profile by:
|
||||
С помощью кнопки <kbd><ChartNoAxesColumn size="16" class="inline-block" style="margin-bottom: 2px"/></kbd> справа от профиля высоты можно добавить цветовое выделение профиля на основе:
|
||||
|
||||
- **slope** information computed from the elevation data, or
|
||||
- **surface** or **category** data coming from <a href="https://www.openstreetmap.org/" target="_blank">OpenStreetMap</a>'s <a href="https://wiki.openstreetmap.org/wiki/Key:surface" target="_blank">surface</a> and <a href="https://wiki.openstreetmap.org/wiki/Key:highway" target="_blank">highway</a> tags.
|
||||
This is only available for files created with **gpx.studio**.
|
||||
- **угла наклона** информации, вычисленной на основе данных о высоте, или
|
||||
- **поверхности** или **категории** - данных, полученных из меток <a href="https://wiki.openstreetmap.org/wiki/Key:surface" target="_blank">Поверхность</a> и <a href="https://wiki.openstreetmap.org/wiki/Key:highway" target="_blank">Шоссе</a> карт <a href="https://www.openstreetmap.org/" target="_blank">OpenStreetMap</a>'s.
|
||||
Данная возможность доступна только для файлов, созданных в **gpx.studio**.
|
||||
|
||||
If your selection includes it, you can also visualize: **speed**, **heart rate**, **cadence**, **temperature** and **power** data on the elevation profile.
|
||||
Если выбрана данная опция, вы также можете добавить визуализацию данных **Скорости**, **Пульса**, **Темпа**, **Температуры** и **Мощности** на профиле высоты.
|
||||
|
||||
@@ -18,7 +18,7 @@ Hide the elevation profile to make room for the map, or show it to inspect the c
|
||||
### <ListTree size="16" class="inline-block" style="margin-bottom: 2px" /> File tree
|
||||
|
||||
Toggle the tree layout for the [file list](../files-and-stats).
|
||||
This layout is ideal for managing a large number of open files, as it organizes them into a vertical list on the right side of the map.
|
||||
Эта раскладка идеально подходит для управления большим количеством открытых файлов, так как она упорядочивает их в вертикальный список справа от карты.
|
||||
In addition, the file tree view enables you to inspect the [tracks, segments, and points of interest](../gpx) contained inside the files through collapsible sections.
|
||||
|
||||
### <Map size="16" class="inline-block" style="margin-bottom: 2px" /> Switch to previous basemap
|
||||
|
||||
@@ -210,7 +210,7 @@ type RoutingProfile =
|
||||
| 'motorcycle'
|
||||
| 'water'
|
||||
| 'railway';
|
||||
type TerrainSource = 'maptiler-dem' | 'mapterhorn';
|
||||
type TerrainSource = 'mapterhorn';
|
||||
type StreetViewSource = 'mapillary' | 'google';
|
||||
|
||||
export const settings = {
|
||||
@@ -308,7 +308,7 @@ export const settings = {
|
||||
terrainSource: new Setting<TerrainSource>(
|
||||
'terrainSource',
|
||||
defaultTerrainSource,
|
||||
getValueValidator(['maptiler-dem', 'mapterhorn'], defaultTerrainSource)
|
||||
getValueValidator(['mapterhorn'], defaultTerrainSource)
|
||||
),
|
||||
directionMarkers: new Setting('directionMarkers', false),
|
||||
distanceMarkers: new Setting('distanceMarkers', false),
|
||||
|
||||
@@ -7,7 +7,6 @@ import maplibregl from 'maplibre-gl';
|
||||
import { pointToTile, pointToTileFraction } from '@mapbox/tilebelt';
|
||||
import type { GPXStatisticsTree } from '$lib/logic/statistics-tree';
|
||||
import { ListTrackSegmentItem } from '$lib/components/file-list/file-list';
|
||||
import { PUBLIC_MAPTILER_KEY } from '$env/static/public';
|
||||
|
||||
export function cn(...inputs: ClassValue[]) {
|
||||
return twMerge(clsx(inputs));
|
||||
@@ -101,7 +100,7 @@ export function getClosestTrackSegments(
|
||||
|
||||
export function getElevation(
|
||||
points: (TrackPoint | Waypoint | Coordinates)[],
|
||||
ELEVATION_ZOOM: number = 13,
|
||||
ELEVATION_ZOOM: number = 12,
|
||||
tileSize = 512
|
||||
): Promise<number[]> {
|
||||
let coordinates = points.map((point) =>
|
||||
@@ -122,10 +121,9 @@ export function getElevation(
|
||||
};
|
||||
|
||||
let promises = uniqueTiles.map((tile) =>
|
||||
fetch(
|
||||
`https://api.maptiler.com/tiles/terrain-rgb-v2/${ELEVATION_ZOOM}/${tile[0]}/${tile[1]}.webp?key=${PUBLIC_MAPTILER_KEY}`,
|
||||
{ cache: 'force-cache' }
|
||||
)
|
||||
fetch(`https://tiles.gpx.studio/mapterhorn/${ELEVATION_ZOOM}/${tile[0]}/${tile[1]}.webp`, {
|
||||
cache: 'force-cache',
|
||||
})
|
||||
.then((response) => response.blob())
|
||||
.then(
|
||||
(blob) =>
|
||||
@@ -180,10 +178,10 @@ export function getElevation(
|
||||
_y + (_y + 1 == tileSize ? 0 : 1)
|
||||
);
|
||||
|
||||
let ele00 = -10000 + (p00[0] * 256 * 256 + p00[1] * 256 + p00[2]) * 0.1;
|
||||
let ele01 = -10000 + (p01[0] * 256 * 256 + p01[1] * 256 + p01[2]) * 0.1;
|
||||
let ele10 = -10000 + (p10[0] * 256 * 256 + p10[1] * 256 + p10[2]) * 0.1;
|
||||
let ele11 = -10000 + (p11[0] * 256 * 256 + p11[1] * 256 + p11[2]) * 0.1;
|
||||
let ele00 = -32768 + p00[0] * 256 + p00[1] + p00[2] / 256;
|
||||
let ele01 = -32768 + p01[0] * 256 + p01[1] + p01[2] / 256;
|
||||
let ele10 = -32768 + p10[0] * 256 + p10[1] + p10[2] / 256;
|
||||
let ele11 = -32768 + p11[0] * 256 + p11[1] + p11[2] / 256;
|
||||
|
||||
return (
|
||||
ele00 * (1 - dx) * (1 - dy) +
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
},
|
||||
"elevation": {
|
||||
"button": "Request elevation data",
|
||||
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.",
|
||||
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from Mapterhorn.",
|
||||
"help_no_selection": "Select a file item to request elevation data."
|
||||
},
|
||||
"waypoint": {
|
||||
@@ -304,10 +304,8 @@
|
||||
"switzerland": "Switzerland",
|
||||
"united_kingdom": "United Kingdom",
|
||||
"united_states": "United States",
|
||||
"maptilerStreets": "MapTiler Streets",
|
||||
"maptilerTopo": "MapTiler Topo",
|
||||
"maptilerOutdoors": "MapTiler Outdoors",
|
||||
"maptilerSatellite": "MapTiler Satellite",
|
||||
"topo": "Topo",
|
||||
"satellite": "Satellite",
|
||||
"esriSatellite": "Esri Satellite",
|
||||
"openStreetMap": "OpenStreetMap",
|
||||
"openTopoMap": "OpenTopoMap",
|
||||
@@ -388,7 +386,6 @@
|
||||
"tram-stop": "Tram Stop",
|
||||
"bus-stop": "Bus Stop",
|
||||
"ferry": "Ferry",
|
||||
"maptiler-dem": "MapTiler DEM",
|
||||
"mapterhorn": "Mapterhorn"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
"undo": "Batalkan",
|
||||
"redo": "Ulangi",
|
||||
"delete": "Hapus",
|
||||
"delete_all": "Delete all",
|
||||
"delete_all": "Hapus Semua",
|
||||
"select_all": "Pilih Semua",
|
||||
"view": "Lihat",
|
||||
"elevation_profile": "Profil ketinggian",
|
||||
@@ -36,7 +36,7 @@
|
||||
"switch_basemap": "Beralih ke peta dasar sebelumnya",
|
||||
"toggle_overlays": "Beralih lapisan",
|
||||
"toggle_3d": "Beralih 3D",
|
||||
"fullscreen": "Full screen",
|
||||
"fullscreen": "Layar Penuh",
|
||||
"settings": "Pengaturan",
|
||||
"distance_units": "Satuan jarak",
|
||||
"metric": "Metrik",
|
||||
@@ -64,7 +64,7 @@
|
||||
"ctrl": "Ctrl",
|
||||
"click": "Klik",
|
||||
"drag": "Seret",
|
||||
"right_click_drag": "Right-click drag",
|
||||
"right_click_drag": "Klik kanan geser",
|
||||
"metadata": {
|
||||
"button": "Info...",
|
||||
"name": "Nama",
|
||||
@@ -82,7 +82,7 @@
|
||||
"center": "Tengah",
|
||||
"open_in": "Buka di",
|
||||
"copy_coordinates": "Salin koordinat",
|
||||
"edit_osm": "Edit in OpenStreetMap"
|
||||
"edit_osm": "Ubah di OpenStreetMap"
|
||||
},
|
||||
"toolbar": {
|
||||
"routing": {
|
||||
@@ -192,8 +192,8 @@
|
||||
"from": "Titik awal terlalu jauh dari jalan terdekat",
|
||||
"via": "Titik via terlalu jauh dari jalan terdekat",
|
||||
"to": "Titik akhir terlalu jauh dari jalan terdekat",
|
||||
"distance": "The end point is too far from the start point",
|
||||
"connection": "No connection found between the points",
|
||||
"distance": "Titik akhir terlalu jauh dari jalan terdekat",
|
||||
"connection": "Tidak ditemukan koneksi antar titik-titik tersebut",
|
||||
"timeout": "Perhitungan rute memakan waktu terlalu lama, coba tambahkan titik-titik yang lebih dekat satu sama lain"
|
||||
}
|
||||
},
|
||||
@@ -235,7 +235,7 @@
|
||||
},
|
||||
"elevation": {
|
||||
"button": "Minta data elevasi",
|
||||
"help": "Requesting elevation data will erase the existing elevation data, if any, and replace it with data from MapTiler.",
|
||||
"help": "Meminta data elevasi akan menghapus data elevasi yang ada, jika ada, dan menggantinya dengan data dari MapTiler.",
|
||||
"help_no_selection": "Pilih item file untuk meminta data elevasi."
|
||||
},
|
||||
"waypoint": {
|
||||
@@ -277,7 +277,7 @@
|
||||
"new": "Lapisan kustom baru",
|
||||
"edit": "Edit lapisan kustom",
|
||||
"urls": "URL",
|
||||
"url_placeholder": "WMTS, WMS or MapLibre style JSON",
|
||||
"url_placeholder": "WMTS, WMS, atau JSON style MapLibre",
|
||||
"max_zoom": "Zoom maksimum",
|
||||
"layer_type": "Tipe lapisan",
|
||||
"basemap": "Peta dasar",
|
||||
@@ -286,7 +286,7 @@
|
||||
"update": "Perbarui lapisan"
|
||||
},
|
||||
"opacity": "Opasitas Overlay",
|
||||
"terrain": "Terrain source",
|
||||
"terrain": "Sumber medan",
|
||||
"label": {
|
||||
"basemaps": "Peta dasar",
|
||||
"overlays": "Overlay",
|
||||
@@ -363,7 +363,7 @@
|
||||
"water": "Air",
|
||||
"shower": "Mandi",
|
||||
"shelter": "Penampungan",
|
||||
"cemetery": "Cemetery",
|
||||
"cemetery": "Pemakaman",
|
||||
"motorized": "Mobil dan Motor",
|
||||
"fuel-station": "Stasiun bahan bakar",
|
||||
"parking": "Parkir",
|
||||
@@ -477,55 +477,55 @@
|
||||
"shelter": "Penampungan",
|
||||
"shopping_center": "Pusat Perbelanjaan",
|
||||
"shower": "Mandi",
|
||||
"summit": "Summit",
|
||||
"telephone": "Telephone",
|
||||
"tunnel": "Tunnel",
|
||||
"water_source": "Water Source"
|
||||
"summit": "Puncak",
|
||||
"telephone": "Telepon",
|
||||
"tunnel": "Terowongan",
|
||||
"water_source": "Sumber Air"
|
||||
}
|
||||
},
|
||||
"homepage": {
|
||||
"website": "Website",
|
||||
"home": "Home",
|
||||
"app": "App",
|
||||
"contact": "Contact",
|
||||
"website": "Situs Web",
|
||||
"home": "Beranda",
|
||||
"app": "Aplikasi",
|
||||
"contact": "Kontak",
|
||||
"reddit": "Reddit",
|
||||
"facebook": "Facebook",
|
||||
"github": "GitHub",
|
||||
"crowdin": "Crowdin",
|
||||
"email": "Email",
|
||||
"contribute": "Contribute",
|
||||
"supported_by": "supported by",
|
||||
"features": "Features",
|
||||
"route_planning": "Route planning",
|
||||
"route_planning_description": "An intuitive interface to create itineraries tailored to each sport, based on OpenStreetMap data.",
|
||||
"contribute": "Kontribusi",
|
||||
"supported_by": "didukung oleh",
|
||||
"features": "Fitur",
|
||||
"route_planning": "Perencanaan rute",
|
||||
"route_planning_description": "Antarmuka intuitif untuk membuat rencana perjalanan yang disesuaikan dengan setiap olahraga, berdasarkan data OpenStreetMap.",
|
||||
"file_processing": "Pengolahan file lanjutan",
|
||||
"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": "Global and local maps",
|
||||
"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": "Data visualization",
|
||||
"data_visualization_description": "An interactive elevation profile with detailed statistics to analyze recorded activities and future objectives.",
|
||||
"philosophy": "Philosophy",
|
||||
"foss": "Free, ad-free and open source",
|
||||
"foss_description": "The website is free to use, without ads, and the source code is publicly available on GitHub.",
|
||||
"privacy": "Privacy-friendly",
|
||||
"privacy_description": "Your GPX files never leave your browser. No tracking, no data collection.",
|
||||
"community": "Made possible by the community",
|
||||
"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": "Support gpx.studio on Open Collective",
|
||||
"translate_button": "Help translate the website on Crowdin"
|
||||
"file_processing_description": "Seperangkat alat untuk melakukan semua tugas pemrosesan file umum, dan yang dapat diterapkan pada banyak file sekaligus.",
|
||||
"maps": "Peta global dan lokal",
|
||||
"maps_description": "Koleksi besar peta dasar, lapisan peta, dan tempat menarik untuk membantu Anda merencanakan petualangan luar ruangan berikutnya, atau memvisualisasikan pencapaian terbaru Anda.",
|
||||
"data_visualization": "Visualisasi data",
|
||||
"data_visualization_description": "Profil ketinggian interaktif dengan statistik terperinci untuk menganalisis aktivitas yang tercatat dan tujuan di masa mendatang.",
|
||||
"philosophy": "Filosofi",
|
||||
"foss": "Gratis, tanpa iklan, dan open source",
|
||||
"foss_description": "Situs web ini gratis untuk digunakan, tanpa iklan, dan kode sumbernya tersedia untuk umum di GitHub.",
|
||||
"privacy": "Ramah privasi",
|
||||
"privacy_description": "File GPX Anda tidak pernah meninggalkan browser Anda. Tidak ada pelacakan, tidak ada pengumpulan data.",
|
||||
"community": "Terwujud berkat komunitas",
|
||||
"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.",
|
||||
"support_button": "Dukung gpx.studio di Open Collective",
|
||||
"translate_button": "Bantu menerjemahkan situs web di Crowdin"
|
||||
},
|
||||
"docs": {
|
||||
"translate": "Improve the translation on Crowdin",
|
||||
"answer_not_found": "Did not find what you were looking for?",
|
||||
"ask_on_reddit": "Ask the community on Reddit",
|
||||
"translate": "Perbaiki kualitas terjemahan di Crowdin",
|
||||
"answer_not_found": "Tidak menemukan apa yang Anda cari?",
|
||||
"ask_on_reddit": "Tanyakan kepada komunitas di Reddit",
|
||||
"search": {
|
||||
"search": "Search",
|
||||
"clear": "Clear",
|
||||
"cancel": "Cancel",
|
||||
"recent": "Recent searches",
|
||||
"no_recent": "No recent searches",
|
||||
"save": "Save this search",
|
||||
"remove": "Remove this search from history",
|
||||
"search": "Cari",
|
||||
"clear": "Bersihkan",
|
||||
"cancel": "Batalkan",
|
||||
"recent": "Pencarian terakhir",
|
||||
"no_recent": "Tidak Ada Pencarian Baru",
|
||||
"save": "Simpan pencarian ini",
|
||||
"remove": "Hapus pencarian ini dari riwayat",
|
||||
"favorites": "Favorites",
|
||||
"remove_favorite": "Remove this search from favorites",
|
||||
"to_select": "to select",
|
||||
|
||||
@@ -401,7 +401,7 @@
|
||||
"elevation_gain_loss": "Stijging en daling",
|
||||
"temperature": "Temperatuur",
|
||||
"speed": "Snelheid",
|
||||
"pace": "Snelheid",
|
||||
"pace": "Tempo",
|
||||
"heartrate": "Hartslag",
|
||||
"cadence": "Cadans",
|
||||
"power": "Kracht",
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"switch_basemap": "Bytt til forrige basekart",
|
||||
"toggle_overlays": "Vis eller skjul kartlag",
|
||||
"toggle_3d": "Skru av/på 3D",
|
||||
"fullscreen": "Full screen",
|
||||
"fullscreen": "Fullskjerm",
|
||||
"settings": "Innstillinger",
|
||||
"distance_units": "Avstandsenhet",
|
||||
"metric": "Metrisk",
|
||||
@@ -64,7 +64,7 @@
|
||||
"ctrl": "Ctrl",
|
||||
"click": "Klikk",
|
||||
"drag": "Dra",
|
||||
"right_click_drag": "Right-click drag",
|
||||
"right_click_drag": "Høyreklikk dra",
|
||||
"metadata": {
|
||||
"button": "Informasjon...",
|
||||
"name": "Navn",
|
||||
@@ -192,8 +192,8 @@
|
||||
"from": "Startpunktet er for langt unna nærmeste vei",
|
||||
"via": "Via-punktet er for langt fra nærmeste vei",
|
||||
"to": "Sluttpunktet er for langt unna nærmeste vei",
|
||||
"distance": "The end point is too far from the start point",
|
||||
"connection": "No connection found between the points",
|
||||
"distance": "Sluttpunktet er for langt fra startpunktet",
|
||||
"connection": "Ingen forbindelse mellom punktene funnet",
|
||||
"timeout": "Ruteberegning tok for lang tid, prøv å legge til flere punkter"
|
||||
}
|
||||
},
|
||||
|
||||
@@ -19,8 +19,8 @@
|
||||
return;
|
||||
}
|
||||
embeddingOptions = getMergedEmbeddingOptions(options);
|
||||
if (embeddingOptions.key === '' && embeddingOptions.basemap.startsWith('maptiler')) {
|
||||
embeddingOptions.basemap = 'openStreetMap';
|
||||
if (embeddingOptions.key === '' && embeddingOptions.basemap === 'satellite') {
|
||||
embeddingOptions.basemap = 'topo';
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,45 +0,0 @@
|
||||
<?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>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |