mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-04-28 06:15:54 +00:00
Compare commits
5 Commits
c91baf7c83
...
graphhoppe
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5ff11a32c9 | ||
|
|
01a7ec916e | ||
|
|
dd94a7d613 | ||
|
|
089b88c62d | ||
|
|
a01ca79a82 |
42
README.md
42
README.md
@@ -27,8 +27,8 @@ Any help is greatly appreciated!
|
|||||||
|
|
||||||
The code is split into two parts:
|
The code is split into two parts:
|
||||||
|
|
||||||
- `gpx`: a Typescript library for parsing and manipulating GPX files,
|
- `gpx`: a Typescript library for parsing and manipulating GPX files,
|
||||||
- `website`: the website itself, which is a [SvelteKit](https://kit.svelte.dev/) application.
|
- `website`: the website itself, which is a [SvelteKit](https://kit.svelte.dev/) application.
|
||||||
|
|
||||||
You will need [Node.js](https://nodejs.org/) to build and run these two parts.
|
You will need [Node.js](https://nodejs.org/) to build and run these two parts.
|
||||||
|
|
||||||
@@ -55,25 +55,25 @@ npm run dev
|
|||||||
|
|
||||||
This project has been made possible thanks to the following open source projects:
|
This project has been made possible thanks to the following open source projects:
|
||||||
|
|
||||||
- Development:
|
- Development:
|
||||||
- [Svelte](https://github.com/sveltejs/svelte) and [SvelteKit](https://github.com/sveltejs/kit) — seamless development experience
|
- [Svelte](https://github.com/sveltejs/svelte) and [SvelteKit](https://github.com/sveltejs/kit) — seamless development experience
|
||||||
- [MDsveX](https://github.com/pngwn/MDsveX) — allowing a Markdown-based documentation
|
- [MDsveX](https://github.com/pngwn/MDsveX) — allowing a Markdown-based documentation
|
||||||
- Design:
|
- Design:
|
||||||
- [shadcn-svelte](https://github.com/huntabyte/shadcn-svelte) — beautiful components
|
- [shadcn-svelte](https://github.com/huntabyte/shadcn-svelte) — beautiful components
|
||||||
- [@lucide/svelte](https://github.com/lucide-icons/lucide/tree/main/packages/svelte) — beautiful icons
|
- [@lucide/svelte](https://github.com/lucide-icons/lucide/tree/main/packages/svelte) — beautiful icons
|
||||||
- [tailwindcss](https://github.com/tailwindlabs/tailwindcss) — easy styling
|
- [tailwindcss](https://github.com/tailwindlabs/tailwindcss) — easy styling
|
||||||
- [Chart.js](https://github.com/chartjs/Chart.js) — beautiful and fast charts
|
- [Chart.js](https://github.com/chartjs/Chart.js) — beautiful and fast charts
|
||||||
- Logic:
|
- Logic:
|
||||||
- [immer](https://github.com/immerjs/immer) — complex state management
|
- [immer](https://github.com/immerjs/immer) — complex state management
|
||||||
- [Dexie.js](https://github.com/dexie/Dexie.js) — IndexedDB wrapper
|
- [Dexie.js](https://github.com/dexie/Dexie.js) — IndexedDB wrapper
|
||||||
- [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) — fast GPX file parsing
|
- [fast-xml-parser](https://github.com/NaturalIntelligence/fast-xml-parser) — fast GPX file parsing
|
||||||
- [SortableJS](https://github.com/SortableJS/Sortable) — creating a sortable file tree
|
- [SortableJS](https://github.com/SortableJS/Sortable) — creating a sortable file tree
|
||||||
- Mapping:
|
- Mapping:
|
||||||
- [Mapbox GL JS](https://github.com/mapbox/mapbox-gl-js) — beautiful and fast interactive maps
|
- [Mapbox GL JS](https://github.com/mapbox/mapbox-gl-js) — beautiful and fast interactive maps
|
||||||
- [brouter](https://github.com/abrensch/brouter) — routing engine
|
- [GraphHopper](https://github.com/graphhopper/graphhopper) — routing engine
|
||||||
- [OpenStreetMap](https://www.openstreetmap.org) — map data used by Mapbox and brouter
|
- [OpenStreetMap](https://www.openstreetmap.org) — map data used by Mapbox and GraphHopper
|
||||||
- Search:
|
- Search:
|
||||||
- [DocSearch](https://github.com/algolia/docsearch) — search engine for the documentation
|
- [DocSearch](https://github.com/algolia/docsearch) — search engine for the documentation
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -731,17 +731,7 @@ export class RoutingControls {
|
|||||||
try {
|
try {
|
||||||
response = await route(targetCoordinates);
|
response = await route(targetCoordinates);
|
||||||
} catch (e: any) {
|
} catch (e: any) {
|
||||||
if (e.message.includes('from-position not mapped in existing datafile')) {
|
toast.error(i18n._(e.message, e.message));
|
||||||
toast.error(i18n._('toolbar.routing.error.from'));
|
|
||||||
} else if (e.message.includes('via1-position not mapped in existing datafile')) {
|
|
||||||
toast.error(i18n._('toolbar.routing.error.via'));
|
|
||||||
} else if (e.message.includes('to-position not mapped in existing datafile')) {
|
|
||||||
toast.error(i18n._('toolbar.routing.error.to'));
|
|
||||||
} else if (e.message.includes('Time-out')) {
|
|
||||||
toast.error(i18n._('toolbar.routing.error.timeout'));
|
|
||||||
} else {
|
|
||||||
toast.error(e.message);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,12 +53,63 @@ const mtbRatingToScale: { [key: string]: string } = {
|
|||||||
'6': '5',
|
'6': '5',
|
||||||
'7': '6',
|
'7': '6',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const graphhopperBlockPrivateCustomModels: { [key: string]: any } = {
|
||||||
|
bike: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'bike_road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
racingbike: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'bike_road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
gravelbike: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'bike_road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
mtb: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'bike_road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
foot: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'foot_road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
motorcycle: {
|
||||||
|
priority: [
|
||||||
|
{
|
||||||
|
if: 'road_access == PRIVATE',
|
||||||
|
multiply_by: '0.0',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
};
|
||||||
async function getGraphHopperRoute(
|
async function getGraphHopperRoute(
|
||||||
points: Coordinates[],
|
points: Coordinates[],
|
||||||
graphHopperProfile: string,
|
graphHopperProfile: string,
|
||||||
privateRoads: boolean
|
privateRoads: boolean
|
||||||
): Promise<TrackPoint[]> {
|
): Promise<TrackPoint[]> {
|
||||||
let response = await fetch('https://graphhopper-a.gpx.studio/route', {
|
let response = await fetch('https://graphhopper.gpx.studio/route', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
headers: {
|
headers: {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
@@ -71,19 +122,27 @@ async function getGraphHopperRoute(
|
|||||||
details: graphhopperDetails,
|
details: graphhopperDetails,
|
||||||
custom_model: privateRoads
|
custom_model: privateRoads
|
||||||
? {}
|
? {}
|
||||||
: {
|
: graphhopperBlockPrivateCustomModels[graphHopperProfile] || {},
|
||||||
priority: [
|
|
||||||
{
|
|
||||||
if: 'road_access == PRIVATE',
|
|
||||||
multiply_by: '0.0',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
}),
|
}),
|
||||||
});
|
});
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`${await response.text()}`);
|
const error = await response.json();
|
||||||
|
if (error.message.includes('Cannot find point 0')) {
|
||||||
|
throw new Error('toolbar.routing.error.from');
|
||||||
|
} else if (error.message.includes('Cannot find point 1')) {
|
||||||
|
if (points.length == 3) {
|
||||||
|
throw new Error('toolbar.routing.error.via');
|
||||||
|
} else {
|
||||||
|
throw new Error('toolbar.routing.error.to');
|
||||||
|
}
|
||||||
|
} else if (error.hints[0].details.includes('PointDistanceExceededException')) {
|
||||||
|
throw new Error('toolbar.routing.error.distance');
|
||||||
|
} else if (error.hints[0].details.includes('ConnectionNotFoundException')) {
|
||||||
|
throw new Error('toolbar.routing.error.connection');
|
||||||
|
} else {
|
||||||
|
throw new Error(error.message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let json = await response.json();
|
let json = await response.json();
|
||||||
@@ -142,7 +201,18 @@ async function getBRouterRoute(
|
|||||||
let response = await fetch(url);
|
let response = await fetch(url);
|
||||||
|
|
||||||
if (!response.ok) {
|
if (!response.ok) {
|
||||||
throw new Error(`${await response.text()}`);
|
const error = await response.text();
|
||||||
|
if (error.includes('from-position not mapped in existing datafile')) {
|
||||||
|
throw new Error('toolbar.routing.error.from');
|
||||||
|
} else if (error.includes('via1-position not mapped in existing datafile')) {
|
||||||
|
throw new Error('toolbar.routing.error.via');
|
||||||
|
} else if (error.includes('to-position not mapped in existing datafile')) {
|
||||||
|
throw new Error('toolbar.routing.error.to');
|
||||||
|
} else if (error.includes('Time-out')) {
|
||||||
|
throw new Error('toolbar.routing.error.timeout');
|
||||||
|
} else {
|
||||||
|
throw new Error(error);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let geojson = await response.json();
|
let geojson = await response.json();
|
||||||
|
|||||||
@@ -190,6 +190,8 @@
|
|||||||
"from": "The start point is too far from the nearest road",
|
"from": "The start point is too far from the nearest road",
|
||||||
"via": "The via point is too far from the nearest road",
|
"via": "The via point is too far from the nearest road",
|
||||||
"to": "The end point is too far from the nearest road",
|
"to": "The end point is too far from the nearest road",
|
||||||
|
"distance": "The end point is to far from the start point",
|
||||||
|
"connection": "No connection found between the points",
|
||||||
"timeout": "Route calculation took too long, try adding points closer together"
|
"timeout": "Route calculation took too long, try adding points closer together"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user