"Jāņa sēta" piedāvā vairākus uz OSRM bāzes un saviem ceļa datiem veidotus servisus.
- Standarta maršruta izveides serviss (route) ļauj izveidot maršrutu starp diviem vai vairākiem punktiem.
- Maršruta optimizācijas serviss (trip) piedāvā laika ziņā optimālāko maršrutēšanu starp vairākiem punktiem.
- Attāluma tabulas serviss (table) atgriež attāluma un ceļā pavadāmā laika vērtības starp definētajiem sākumpunktiem un galapunktiem, ļaujot atrast katram sākumpunktam tuvākos galapunktus.
Ja ir vēlme izmantot citus servisus (nearest, match, tile), sazinieties ar mums!
Kā maršrutēšanas dzinējs izmantots OSRM, taču maršrutu veidošanai un citiem servisiem tiek izmantoti "Jāņa sētas" ceļu dati — pilnvērtīgākais ceļu tīkls Latvijā. Patlaban piedāvājam maršrutēšanu gan autotransportam, gan gājējiem. Pilnu dokumentāciju var skatīt šeit.
Maršruta izveides serviss
Maršruta izveides serviss ļauj izveidot maršrutu starp diviem vai vairākiem punktiem
Servisa URL
Servisa saitei jāatbilst šādai formai:
https://api.kartes.lv/v3//directions/{profile}/{service}/{coordinates}?
Atgriezto datu formāts ir JSON.
HTTP metode var būt GET vai POST.
Standarta maršruta izveide
Standarta maršruta izveides serviss (route) ļauj izveidot maršrutu starp diviem vai vairākiem punktiem (maksimāli 50 punkti).
Servisa saitei jāatbilst šādai formai:
https://api.kartes.lv/v3//directions/{profile}/route/{coordinates}?
Pieprasījuma parametri
Iespējams padot šādus GET parametrus:
Parametrs | Skaidrojums | Vērtības |
---|---|---|
profile | Maršrutēšanas veids. Patlaban sagatavoti divi profili: autotransporta un gājēju | Parametrs ir obligāts
|
coordinates | Maršruta galapunktu koordinātas (koordināšu pāri WGS-84 (EPSG:4326) koordinātu sistēmā). Iespējams padot līdz 50 punktiem. | Parametrs ir obligāts x1,y1;x2,y2;…;xn,yn, kur:
|
alternatives | Alternatīvo maršrutu skaits. | Atgriež atkarībā no maršruta
|
geometries | Atgrieztās ģeometrijas formāts. |
|
steps | Maršruta informācija pa tā posmiem. |
|
overview | Pārskata ģeometrija — vienkāršota vai detalizēta. |
|
summary | Maršrutu posma aprakstošs nosaukums (piemēram, "Daugavgrīvas iela, Krišjāņa Valdemāra iela"). | Parametrs aktuāls, ja izvēlas steps=true
|
annotations | Atgriež papildu metadatus par katru maršruta koordinātu. |
|
continue_straight | Norāda, vai maršruta galapunktos drīkst apgriezties braukšanai pretējā virzienā. |
|
skip_waypoints | Vai izlaist informāciju par galapunktiem (waypoints objektu) no atbildes. |
|
generate_hints | Atgriež informāciju par hintiem (unikālajiem identifikatoriem). |
|
approaches | Vai būtiski galapunktos ievērot ceļa puses (piebraukšana no "pareizās" puses) | Formāts: galapunkts 1;galapunkts 2
|
Atbildes parametri
Atbildē tiek atgriezti šādi parametri un objekti:
Parametrs | Skaidrojums |
---|---|
code | Pieprasījuma sekmīgums. Ja sekmīgs, atbilde ir ok. |
waypoints | Galapunktu objekts |
hint | Unikāls iekšējais identifikators. |
distance | Attālums no dotajām koordinātām līdz galapunkta koordinātām metros. |
location | Atrašanās vietas (galapunkta, krustojuma, manevra) koordinātas, kuras tiek izmantotas doto koordinātu vietā (atrodas uz dotā ceļa tīkla). |
name | Galapunkta ielas nosaukums (ja ir). |
routes | Maršrutu objekts. |
legs | Maršruta posma starp diviem galapunktiem (RoutLeg) objekts. Posmam vai posmiem (ja ir vairāk nekā divi galapunkti) seko distance, duration, weight, summary parametri. |
steps | Maršruta soļu apraksta objekts. Solim seko vairāki parametri (skat. OSRM API dokumentāciju, to skaitā location (atrašanās vietas (galapunkta, krustojuma, manevra) koordinātas, kuras tiek izmantotas doto koordinātu vietā (atrodas uz ceļa tīkla)). |
weight | Svars (tiek izmantots prioritizēšanā). |
distance | Garums metros. |
summary | Maršruta posma aprakstošs nosaukums (piemēram, "Daugavgrīvas iela, Krišjāņa Valdemāra iela"). Nosaka pieprasījuma parametrs summary. |
duration | Ilgums sekundēs. |
weight_name | Svara profila nosaukums. |
geometry | Maršruta ģeometrija. Atkarīga no overview parametra, formātu nosaka geometries parametrs. |
weight | Svars (tiek izmantots maršrutu prioritizēšanā). |
distance | Garums metros. |
duration | Ilgums sekundēs. |
Kļūdu kodi
Kods | Skaidrojums |
---|---|
200 | Wrong input data. Tiek atgriezts, ja vaicājumā nav ievadīti vai nav korekti ievadīti pieprasījuma parametri. |
404 | No location found. Tiek atgriezts, ja nekas nav ticis atrasts. |
5xx | Servera kļūda. |
Paraugi
Pieprasījums:
https://api.kartes.lv/v3//directions/driving/route/24.106237,56.964682;24.094009,56.960553?overview=full&annotations=true&steps=true&geometries=geojson
Atbilde:
{
"code": "Ok",
"routes": [
{
"geometry":
{
"coordinates": [
[
24.106207,
56.964683
],
...
[
24.09501,
56.95942
]
],
"type":"LineString"
},
"legs": [
{
"steps": [
{
"geometry": "g|tzIyfcrCbBFpBF|@BlAPf@H",
"maneuver": {
"bearing_after": 182,
"bearing_before": 0,
"location": [
24.106207,
56.964683
],
"type": "depart"
},
"mode": "driving",
"ref": "P1",
"driving_side": "right",
"name": "Pulkveža Brieža iela",
"intersections": [
{
"out": 0,
"entry": [
true
],
"location": [
24.106207,
56.964683
],
"bearings": [
182
]
},
{
"out": 1,
"in": 0,
"entry": [
false,
true,
true
],
"bearings": [
0,
180,
270
],
"location": [
24.10617,
56.96418
]
}
],
"weight": 26.1,
"duration": 29.3,
"distance": 220.1
},...
],
"summary": "Hanzas iela, Eksporta iela",
"weight": 208.1,
"duration": 220,
"annotation": {
"speed": [
13.7,
13.8,
...
],
"metadata": {
"datasource_names": [
"lua profile"
]
},
"nodes": [
4777473,
3090436,
...
],
"duration": [
4.1,
4.6,
...
],
"distance": [
55.991795,
63.44537,
...
],
"weight": [
3.6,
4.1,
...
],
"datasources": [
0,
0,
...
]
},
"distance": 1631.1
}
],
"weight_name": "routability"
"weight": 208.1,
"duration": 220,
"distance": 1631.1
}
],
"waypoints": [
{
"hint": "aC0AgP___38DAAAAJwAAAAAAAAAAAAAAupanQDs9YEIAAAAAAAAAAAMAAAAsAAAAAAAAAAAAAAAgAAAA39RvAUs2ZQP91G8BSjZlAwAAbwsqWsg3",
"distance": 1.827851,
"name": "Pulkveža Brieža iela",
"location": [
24.106207,
56.964683
]
},
{
"hint": "Wm8KgHNvCoAAAAAACQAAABwCAAB-AQAAAAAAAJEqrUA5zG1Dpi5fQwAAAAAKAAAANwIAAJEBAAAgAAAAIqlvAbwhZQM5pW8BKSZlAwIAfw4qWsg3",
"distance": 140.090272,
"name": "",
"location": [
24.09501,
56.95942
]
}
]
}
Pielietošanas piemērs
Pielietošanas piemērs maršrutēšanas servisa pielietošanai un attēlošanai Leaflet karšu bibliotēkā.
Jāimportē Leaflet bibliotēka (vajadzētu izmantot aktuālo versiju atbilstoši dokumentācijai):
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"
integrity="sha256-p4NxAoJBhIIN+hmNHrzRCf9tD/miZyoHS5obTRR9BMY="
crossorigin=""/>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"
integrity="sha256-20nQCchB9co0qIjJZRGuk2/Z9VM+kNiyxNV1lvTlZBo="
crossorigin=""></script>
HTML kodā jāizveido kartes elements:
<div id="map" style="width: 100%; height: 100vh;"></div>
JavaScript kodā jāizveido karte im jādefinē maršrutēšanas API klase:
const api_key = 'your_api_key_here'; // Replace with your actual API key
const map = L.map('map', {
layers: [
L.tileLayer.wms(`https://wms{s}.kartes.lv/${api_key}/wgs/15bw/`, {
subdomains: ['', '1', '2', '3', '4'],
attribution: '<a href="https://balticmaps.eu" target="_blank">Jāņa sēta</a>',
}),
],
center: [56.96, 24.11],
zoom: 12,
})
class DirectionsApi {
constructor() {
this.apiKey = api_key;
this.baseUrl = 'https://api.kartes.lv/v3';
}
// Method to fetch directions
async getDirections(coordinates, options = {}) {
const coords = coordinates.map(innerArray => innerArray.join(',')).join(';');
// Allow various options to be passed to the API
const queryString = new URLSearchParams({
overview: options.overview || 'full',
annotations: options.annotations || 'true',
steps: options.steps || 'true',
geometries: options.geometries || 'geojson',
source: options.source || 'first',
destination: options.destination || 'last',
roundtrip: options.roundtrip || 'false',
}).toString();
const url = `${this.baseUrl}/${this.apiKey}/directions/driving/route/${coords}?${queryString}`;
try {
const response = await fetch(url);
// Check if the response is ok (status code 200-299)
if (!response.ok) {
throw new Error(`Error fetching data: ${response.statusText}`);
}
const data = await response.json();
return { success: true, data };
} catch (error) {
console.error('Fetch error:', error);
return { success: false, error: error.message };
}
}
}
Vēl nepieciešams maršrutu pārveidot attēlojamā GeoJSON formātā. To var izdarīt, piemēram, ar šādu funkciju, kas GeoJSON formātā ieraksta gan visu maršrutu, gan tā posmus, gan pieturpunktus:
const convertToGeoJSON = (data) => {
if (data.code !== "Ok") {
throw new Error("Invalid data");
}
const geojson = {
type: "FeatureCollection",
features: []
};
// Convert trips to GeoJSON features
data.trips.forEach(trip => {
// Add the main trip route as a LineString
geojson.features.push({
type: "Feature",
geometry: trip.geometry,
properties: {
type: "trip",
summary: trip.legs.map(leg => leg.summary).join(", "),
weight: trip.weight,
duration: trip.duration,
distance: trip.distance
}
});
// Add each step in the trip as a separate feature
trip.legs.forEach(leg => {
leg.steps.forEach(step => {
geojson.features.push({
type: "Feature",
geometry: step.geometry,
properties: {
type: "step",
mode: step.mode,
maneuver: step.maneuver,
name: step.name,
duration: step.duration,
distance: step.distance,
drivingSide: step.driving_side,
intersections: step.intersections
}
});
});
});
});
// Convert waypoints to GeoJSON features
data.waypoints.forEach(waypoint => {
geojson.features.push({
type: "Feature",
geometry: {
type: "Point",
coordinates: waypoint.location
},
properties: {
type: "waypoint",
waypoint_index: waypoint.waypoint_index,
trips_index: waypoint.trips_index,
hint: waypoint.hint,
distance: waypoint.distance,
name: waypoint.name
}
});
});
return geojson;
}
Visbeidzot iespējams pielietot izveidoto API klasi:
// Instantiate the DirectionsAPI class with your API key
const api = new DirectionsAPI(api_key);
// Example stops
const coordinates = [
[24.12, 56.92],
[24.13, 56.95],
[24.11, 56.91],
[24.16, 56.98]
];
api.getDirections(coordinates)
.then(result => {
if (!result.success) {
console.error('Error:', result.error); // Handle the error
return;
}
// Add the route in GeoJSON format to the map
L.geoJSON(convertToGeoJSON(result.data), {
style: (feature) => {
color: "rgba(20, 137, 255, 0.7)",
weight: 5
}
}).bindPopup((layer) => {
return `${layer.feature.properties.distance} m`
}).addTo(map);
});
Rezultāts kartē izskatās šādi:
Maršrutu optimizācijas serviss
Maršrutu optimizācijas jeb ceļojošā tirgotāja (Travelling salesman problem) serviss balstīts uz OSRM trip servisu. Serviss optimizē līdz 50 punktiem viena maršruta ietvaros. Tas darbojas, maršrutēšanas pieprasījumiem norādot secības (order) parametru. Iespējams veidot lineārus vai riņkveida maršrutus. Serviss atgriež punktu secību.
Optimizācijas pieprasījuma papildu parametri
Servisa saitei jāatbilst šādai formai:
https://api.kartes.lv/v3//directions/{profile}/trip/{coordinates}?
Papildu maršrutu izveides servisam padotajiem parametriem, pieejami šādi papildu parametri:
Parametrs | Skaidrojums | Vērtības |
---|---|---|
roundtrip | Vai maršruts atgriežas sākumpunktā (ir apļveida)? |
|
source | Nosaka maršruta sākumpunkta noteiktību. |
|
destination | Nosaka maršruta beigu punkta noteiktību. |
|
Ja gan source, destination vērtība ir any, tomēr tiek pieņemts, ka apļveida maršruts sāksies galapunktā, kura koordinātas dotas kā pirmās.
Optimizācijas atbildes papildu parametri
Parametrs | Skaidrojums |
---|---|
code | Pieprasījuma sekmīgums. Ja sekmīgs, atbilde ir ok. |
waypoints | Galapunktu objekts, kas apraksta galapunktu un satur name, hint, location, distance (šeit - attālums no dotajām koordinātām līdz galapunkta koordinātām) parametrus. Galapunkti atgriezti dotajā secībā |
waypoint_index | Galapunkta secības numurs optimizētajā maršrutā. |
trips | Maršruta objekts (maršruta izklāsts pa posmiem). |
Paraugi
Pieprasījums:
https://api.kartes.lv/v3//directions/driving/trip/24.12,56.92;24.13,56.95;24.11,56.91;24.16,56.98?overview=full&annotations=true&steps=true&geometries=geojson&source=first&destination=last
Atbilde:
{
"code": "Ok",
"trips": [
{
"geometry": {
"coordinates": [
[
24.120225,
56.920305
],
...
[
24.120225,
56.920305
]
],
"type": "LineString"
},
"legs": [
{
"steps": [
{
"geometry": {
"coordinates": [
[
24.120225,
56.920305
],...
],
"type": "LineString"
},
"maneuver": {
"bearing_after": 292,
"bearing_before": 0,
"location": [
24.120225,
56.920305
],
"modifier": "left",
"type": "depart"
},
"mode": "driving",
"driving_side": "right",
"name": "",
"intersections": [
{
"classes": [
"unpaved"
],
"out": 0,
"entry": [
true
],
"bearings": [
292
],
"location": [
24.120225,
56.920305
]
},...
],
"weight": 138.3,
"duration": 138.3,
"distance": 737.7
},...
],
"summary": "Mūkusalas iela, Tumes iela",
"weight": 434.5,
"duration": 465.8,
"annotation": {
"metadata": {
"datasource_names": [
"lua profile"
]
},
"datasources": [
0,
0,
...
],
"weight": [
2.5,
19.7,
...
],
"nodes": [
4539416,
5195632,
...
],
"distance": [
13.413894,
109.603385,
...
],
"duration": [
2.5,
19.7,
...
],
"speed": [
5.4,
5.6,
...
],
"distance": 3852.5
}
},...
],
"weight_name": "routability",
"weight": 2680.1,
"duration": 2885.3,
"distance": 26133.8
}
],
"waypoints": [
{
"waypoint_index": 0,
"trips_index": 0,
"hint": "Ev8JgE3_CYAiAAAAGQAAAF8AAADFAAAAmvGaQZ47V0EvUFNCIdLbQiIAAAAZAAAAXwAAAMUAAAAgAAAAoQtwAfGIZAPACnABwIdkAwMAPxIqWsg3",
"distance": 36.624429,
"name": "",
"location": [
24.120225,
56.920305
]
},
{
"waypoint_index": 2,
"trips_index": 0,
"hint": "ym0KgDVuCoBLAAAAAAAAAAAAAAA9AAAAVEIuQgAAAAAAAAAANckPQk4AAAAAAAAAAAAAAEAAAAAgAAAANDJwAcj8ZAPQMXAB8PxkAwAArxUqWsg3",
"distance": 7.544916,
"name": "",
"location": [
24.1301,
56.94996
]
},
{
"waypoint_index": 1,
"trips_index": 0,
"hint": "iB4BgKgeAYAeAAAAAAAAAPsAAAAFAAAA4KXHQQAAAAAhDlJDgfyMQB4AAAAAAAAA-wAAAAUAAAAgAAAAAuJvAQRiZAOw428BsGBkAw4Afw4qWsg3",
"distance": 46.035301,
"name": "Tumes iela",
"location": [
24.10957,
56.91034
]
},
{
"waypoint_index": 3,
"trips_index": 0,
"hint": "3WQKgPNkCoANAAAABwAAAGEBAAC0AAAAzD8DQab_YEAlWk5DVMvSQg4AAAAHAAAAcQEAAL4AAAAgAAAA_qZwASByZQMAp3ABIHJlAwgAXxUqWsg3",
"distance": 0.12163,
"name": "",
"location": [
24.159998,
56.98
]
}
]
}
Attālumu tabulas (distance matrix) serviss
Attālumu tabulas jeb matricas (distance matrix) serviss ļauj saņemt attālumu un pārvietošanās laiku starp visiem norādītajiem koordināšu pāriem (piem., novērtēt visus attālumus starp četrām Latvijas pilsētām, iegūstot vērtības Rīga—Cēsis, Rīga—Valmiera, Rīga—Sigulda, Valmiera—Cēsis, Valmiera—Sigulda, Sigulda—Cēsis; atrast ātrāk sasniedzamo veikalu no konkrētas vietas (piem., pašreizējās atrašanās vietas koordinātām)). Servisam var padot ne vairāk kā 50 koordinātu pāru. Pieprasījumā jādefinē, kuras koordinātas ir "izejas punkti"/sākumpunkti (sources) un uz kuriem punktiem jāveic ceļš (destinations). Var izmantot gan autobraucēju, gan gājēju profilu.
Attālumu tabulas pieprasījuma papildu parametri
Servisa saitei jāatbilst šādai formai:
https://api.kartes.lv/v3//directions/{profile}/table/{coordinates}?
Papildu maršrutu izveides servisam padotajiem parametriem, jāizmanto šādi papildu parametri:
Parametrs | Skaidrojums | Vērtības |
---|---|---|
sources | Definē, kuri no koordinātu pāriem ir sākumpunkti, no kurienes jārēķina pārvietošanās ilgums vai attālums. Tie jānorāda, balstoties ievadīto koordināšu secībā. |
|
destinations | Definē, kuri no koordinātu pāriem ir galamērķi, uz kuriem jārēķina pārvietošanās ilgums vai attālums. Tie jānorāda, balstoties ievadīto koordināšu secībā. |
|
annotations | Norāda, vai tiks atgrieztas attāluma vai ilguma vērtības. |
|
fallback_speed | Aktivizē iespēju saņemt attālumu pa gaisa līniju, ja nav iespējams izveidot maršrutu pa ceļiem. Šajā parametrā var norādīt ātrumu (kilometrus stundā), kas tiek izmantots šim aprēķinam. | Decimālskaitlis |
fallback_coordinate | Gaisa līnijas attāluma gadījumā: vai aprēķinam izmantot dotās koordinātas, vai t.s. navigācijas koordinātas (uz ceļu tīkla). |
|
scale_factor | Ja tiks atgrieztas ilguma (duration) vērtība, ir iespējams šīs vērtības proporcionāli mainīt, izmantojot šo reizinātāju. | Decimālskaitlis |
Ja skip_waypoints vērtība ir true , gan sources , gan destinations masīvi netiks atgriezti.
Attālumu tabulas papildu parametri
Parametrs | Skaidrojums |
---|---|
code | Pieprasījuma sekmīgums. Ja sekmīgs, atbilde ir ok. Ja nesekmīgs, atgriež NoTable. |
durations | Divdimensiju masīvs ar matricu, kas atgriež pārvietošanās laika vērtības sākumpunkts-galapunkts secībā. Šajā gadījumā minētā secība attiecas nevis uz ievadīto objektu secību, bet secību un skaitu sources un destinations parametros (tā 2;3 kļūst par 0;1 atbildes masīvā). Ilgums tiek atgriezts sekundēs. |
distances | Divdimensiju masīvs ar matricu, kas atgriež attāluma vērtības sākumpunkts-galapunkts secībā. Analoģiski ar durations masīvu minētā secība attiecas nevis uz ievadīto objektu secību, bet secību un skaitu sources un destinations parametros (tā 2;3 kļūst par 0;1 atbildes masīvā). Attālums tiek atgriezts metros. |
sources | Koordināšu pāru, kas izmantotas sākumpunktiem, jaunie identifikatori (kārtas numuri) un koordinātas (location masīvā) |
destinations | Koordināšu pāru, kas izmantotas galapunktiem, jaunie identifikatori (kārtas numuri) un koordinātas (location masīvā) |
fallbackspeedcells | Ja tiek izmantots fallback_speed parametrs, šajā atbildes parametrā tiek atgrieztas to sākumpunktu un galapunktu vērtības, kas tikušas aprēķinātas pa gaisa līniju. |
Paraugi
Pieprasījums (lai atgrieztu ilgumus starp atrašanās vietām, braucot ar auto, nav pieejams ar DEMO atslēgu):
https://api.kartes.lv/v3//directions/driving/table/23.401222,57.135960;23.212738,57.364682;22.920227,57.486678;24.036434,56.928184?sources=0;1&destinations=2;3
Atbilde:
{
"code":"Ok",
"destinations":[
{
"hint":"hZAPgAiRD4AKAAAAAAAAAMcBAAAAAAAA3HUJQQAAAAD1Vb5DAAAAAAoAAAAAAAAAxwEAAAAAAAAjAAAAMgFdARL2bAMjvF0BVi1tAwgA3wgZvrSg",
"distance":3275.246139,
"name":"",
"location":[
22.87237,
57.47253
]
},
{
"hint":"NGkKgFIsAYAOAAAABAAAAAAAAAB2AAAA1gdzQfBGR0AAAAAAYF7yQg8AAAAEAAAAAAAAAHwAAAAjAAAATcRuAY6nZANSxG4BuKdkAwAA3wUZvrSg",
"distance":4.687027,
"name":"Remtes iela",
"location":[
24.036429,
56.928142
]
}
],
"durations":[
[
2937.2,
3077.2
],
[
1261.8,
5107.9
]
],
"sources":[
{
"hint":"3wAXgEgBF4AAAAAAJAAAAAAAAAB0AgAAAAAAAJ8OoUEAAAAA-8WuQwAAAAAkAAAAAAAAAHQCAAAjAAAAxnBjARDMZgMGE2UBWNNnAwAAvw0ZvrSg",
"distance":9919.644635,
"name":"",
"location":[
23.29415,
57.06856
]
},
{
"hint":"b9gPgPvYD4AAAAAAJQAAAAAAAAAFAgAAAAAAAOiWJEEAAAAAEH8QQwAAAAAlAAAAAAAAAAUCAAAjAAAA7vVgAeA9awPCMmIBylBrAwAAbxMZvrSg",
"distance":4909.313667,
"name":"",
"location":[
23.13163,
57.35984
]
}
],
}