PageSourceSearch

https://www.geoapify.com/component---src-template-post-js-content-…p-routing-index-mdx-435f19439905752e218e.js

js geoapify.com collected 2026-09-24 15:23:42 UTC 46,583 bytes, 2 lines download raw bytes

1"use strict";(self.webpackChunkgeoapify_home=self.webpackChunkgeoapify_home||[]).push([[5417],{5531:function(e,t,a){a.r(t),a.d(t,{default:function(){return H}});var n=a(8453),l=a(6540);function o(e){const t=Object.assign({p:"p",em:"em",a:"a",strong:"strong",h2:"h2",h3:"h3",span:"span",ul:"ul",li:"li",table:"table",thead:"thead",tr:"tr",th:"th",tbody:"tbody",td:"td",h5:"h5",code:"code"},(0,n.RP)(),e.components);return l.createElement(l.Fragment,null,l.createElement(t.p,null,"Every day, thousands of people and businesses rely on routing services to plan their routes. So whether you're a small, medium, or big business, you probably need a routing service too - ",l.createElement(t.em,null,"find optimal routes"),", ",l.createElement(t.em,null,"plan delivery routes"),", ",l.createElement(t.em,null,"schedule service work in multiple locations"),"."),"\n",l.createElement(t.p,null,l.createElement(t.a,{href:"https://wiki.openstreetmap.org/wiki/Routing",target:"_blank",rel:"nofollow"},"Routing services")," are part of well-known platforms such as ",l.createElement(t.em,null,"Google Maps"),", ",l.createElement(t.em,null,"Bing Maps"),", and ",l.createElement(t.em,null,"TomTom"),".\nThese services have been around for a long time, dictating their terms and prices.\nBut OpenStreetMap Routing is changing the game!"),"\n",l.createElement(t.p,null,"In this post, we'll focus on ",l.createElement(t.strong,null,"OpenStreetMap Routing (or Directions)")," and see if you can and why you should choose it for your business. We also explore the pros and cons of using OSM-based routing to give you a thorough understanding of the topic.\nFinally, we introduce you to ",l.createElement(t.a,{href:"/routing-api/"},"Geoapify Routing"),", which is based on OpenStreetMap and helps solve route calculation and optimization tasks."),"\n",l.createElement(t.h2,null,"Why are more and more companies switching to OpenStreetMap Routing?"),"\n",l.createElement(t.p,null,"It is no secret that more and more companies are shifting to OSM-based services and products. The reasons behind this shift are not hard to find: it's affordable, flexible, and permissive. Let's go deeper and look at each of these and other reasons in detail."),"\n",l.createElement(t.h3,null,"OpenStreetMap project and data"),"\n",l.createElement(t.p,null,"OpenStreetMap is a truly unique project! OpenStreetMap continues to grow at an incredible pace. The number of contributors steadily rises, and new data are being added. As the chart below shows, contributors to the OpenStreetMap project surpassed 8 million in 2021:"),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; '>\n      <a class='gatsby-resp-image-link' href='/static/3f29f3cb2c40a9c811b7007396ad5b9e/5a190/Osmdbstats1_users-800px.png' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 70.66666666666667%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRlIAAABXRUJQVlA4IEYAAACwAwCdASoUAA4APtFUo0uoJKMhsAgBABoJZwAAW54dJVJNp/vAAAD+7lomQYGJBw+LT9vYoLDnlXTBqKIsEY0RPsM1RpAA'); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='Accumulated registered users' title='' src='/static/3f29f3cb2c40a9c811b7007396ad5b9e/0a47e/Osmdbstats1_users-800px.png' srcset='/static/3f29f3cb2c40a9c811b7007396ad5b9e/5a46d/Osmdbstats1_users-800px.png 300w,\n/static/3f29f3cb2c40a9c811b7007396ad5b9e/fc2a6/Osmdbstats1_users-800px.png 450w,\n/static/3f29f3cb2c40a9c811b7007396ad5b9e/0a47e/Osmdbstats1_users-800px.png 600w,\n/static/3f29f3cb2c40a9c811b7007396ad5b9e/5a190/Osmdbstats1_users-800px.png 800w' sizes='(max-width: 600px) 100vw, 600px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}}),"\n",l.createElement("div",{className:"image-caption"},l.createElement(t.p,null,"Accumulated registered users according to OSM Wiki Statistics")),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"This makes OSM geodata ",l.createElement(t.strong,null,"the most up-to-date")," and actively edited geodata source.\nIn addition, ",l.createElement(t.strong,null,"the road network is very well covered"),", which is especially important for routing."),"\n",l.createElement(t.li,null,"It's also important to note that ",l.createElement(t.strong,null,"OpenStreetMap data is very diverse")," - contributors have different points of view, interests, and hobbies.\nFor example, some people map driving roads and essential features, while others focu
1s on biking routes, hiking trails, and their properties.\nHere is an example of data that a tiny part of a road contains (",l.createElement(t.a,{href:"https://www.openstreetmap.org/way/43169918",target:"_blank",rel:"nofollow"},"Bubenholztunnel, Switzerland"),"):"),"\n"),"\n",l.createElement(t.table,null,l.createElement(t.thead,null,l.createElement(t.tr,null,l.createElement(t.th,null,"Tag name"),l.createElement(t.th,null,"Tag value"))),l.createElement(t.tbody,null,l.createElement(t.tr,null,l.createElement(t.td,null,"alt_name"),l.createElement(t.td,null,"Flughafenautobahn")),l.createElement(t.tr,null,l.createElement(t.td,null,"avz"),l.createElement(t.td,null,"241")),l.createElement(t.tr,null,l.createElement(t.td,null,"highway"),l.createElement(t.td,null,"motorway")),l.createElement(t.tr,null,l.createElement(t.td,null,"lanes"),l.createElement(t.td,null,"3")),l.createElement(t.tr,null,l.createElement(t.td,null,"layer"),l.createElement(t.td,null,"-1")),l.createElement(t.tr,null,l.createElement(t.td,null,"lit"),l.createElement(t.td,null,"yes")),l.createElement(t.tr,null,l.createElement(t.td,null,"maxspeed"),l.createElement(t.td,null,"100")),l.createElement(t.tr,null,l.createElement(t.td,null,"nat_name"),l.createElement(t.td,null,"N11")),l.createElement(t.tr,null,l.createElement(t.td,null,"old_name"),l.createElement(t.td,null,"A51")),l.createElement(t.tr,null,l.createElement(t.td,null,"oneway"),l.createElement(t.td,null,"yes")),l.createElement(t.tr,null,l.createElement(t.td,null,"ref"),l.createElement(t.td,null,"A11")),l.createElement(t.tr,null,l.createElement(t.td,null,"ssvz"),l.createElement(t.td,null,"865N")),l.createElement(t.tr,null,l.createElement(t.td,null,"surface"),l.createElement(t.td,null,"asphalt")),l.createElement(t.tr,null,l.createElement(t.td,null,"toll"),l.createElement(t.td,null,"yes")),l.createElement(t.tr,null,l.createElement(t.td,null,"tunnel"),l.createElement(t.td,null,"yes")),l.createElement(t.tr,null,l.createElement(t.td,null,"tunnel:name"),l.createElement(t.td,null,"Bubenholztunnel")))),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"OpenStreetMap is a community project and not a business project, and so you have much more ",l.createElement(t.strong,null,"freedom")," in how you can use routing data\nand store it. You can find OSM License details on the ",l.createElement(t.a,{href:"https://wiki.osmfoundation.org/wiki/Licence",target:"_blank",rel:"nofollow"},"OSM Foundation Wiki page >>")),"\n"),"\n",l.createElement(t.h3,null,"OpenStreetMap-based routing services"),"\n",l.createElement(t.p,null,"OSM-based routing is one of the mapping services in high demand. There are many companies offering products and solutions to the market there. One of them is ",l.createElement(t.a,{href:"/"},"Geoapify"),"."),"\n",l.createElement(t.p,null,"Thanks to the OpenStreetMap community, we have access to the already mapped road network data, and can focus all of our energy on creating a superior product and service on top of it. As a result, we keep ",l.createElement(t.strong,null,"our prices low and affordable"),".\nAdditionally, we want to encourage the use of OSM data by offering free OpenStreetMap-based routing services to small businesses and non-commercials."),"\n",l.createElement(t.p,null,"As well, we believe that open data and the results drawn from it should remain open. Hence, our ",l.createElement(t.strong,null,"conditions are very permissive")," - you can for example store and reuse calculated routes."),"\n",l.createElement(t.h2,null,"Why do some companies stay with Google Maps, TomTom, etc."),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; '>\n      <a class='gatsby-resp-image-link' href='/static/c8fb639424400ee1d48d585f3bc208df/4b190/Traffic_jam_in_Haikou%2C_Hainan%2C_China_01.jpg' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 66.66666666666666%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRpIAAABXRUJQVlA4IIYAAAAwBACdASoUAA0APtFUo0uoJKMhsAgBABoJYwCpBf/gLVq9Ir5a43P8/EgA/h4GwY6+wT+rjMuj32mqffb0jGomPRpMnLPrfXo/ahE4bT8cLVyojXIYBv934Q0S5OwXO8VjHdyxcZo59QHFamM6R5HNxQcKWoNswbaMgM66uD6+zArfb3pIAA=='); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='Traffic jam at 17:30 downtown Haikou City, Hainan Province, China' title='' src='/static/c8fb639424400ee1d48d585f3bc208df/b4294/Traffic_jam_in_Haikou%2C_Hainan%2C_China_01.jpg' srcset='/static/c8fb639424400ee1d48d585f3bc208df/f93b5/Traffic_jam_in_Haikou%2C_Hainan%2C_China_01.jpg 300w,\n/static/c8fb639424400ee1d48d585f3bc208df/20e5d/Traffic_jam_in_Haikou%2C_Hainan%2C_China_01.jpg 450w,\n/static/c8fb639424400ee1d48d585f3bc208df/b4294/Traffic_jam_in_Haikou%2C_Hainan%2C_China_01.jpg 600w,\n/static/c8fb639424400ee1d48d585f3bc208df/4b190/Traffic_jam_in_Haikou%2C_Hainan%2C_China_01.jpg 800w' sizes='(max-width: 600px) 100v
1w, 600px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}}),"\n",l.createElement("div",{className:"image-caption"},l.createElement(t.p,null,"Traffic jam in Haikou City, Hainan Province, China")),"\n",l.createElement(t.p,null,"Well, the biggest reason is traffic-influenced routing, especially accounting for a live traffic situation."),"\n",l.createElement(t.p,null,"OpenStreetMap focuses on the static features, and traffic conditions or schedules are normally out of scope. On the other hand, usually, traffic data is created and maintained by a commercial company. So if you need traffic or live-traffic data for your routing, then a pure OSM solution will not serve your purpose."),"\n",l.createElement(t.p,null,"However, there are a few solutions that you may wish to try if you need routing with traffic data:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,"Because OpenStreetMap provides extensive details about roads and surroundings, it is possible to estimate the traffic flow. Geoapify's routing parameter ",l.createElement(t.strong,null,"traffic=approximated")," does precisely that."),"\n",l.createElement(t.li,null,"Some companies provide traffic data, which can be licensed for specific regions. So if you need to focus on some particular area, try to find local companies that offer OSM routing with traffic."),"\n"),"\n",l.createElement(t.p,null,"Fortunately, a trend in recent years has shown that the number of municipalities and companies interested in having open traffic data collected in one place is rapidly increasing. For example, here is ",l.createElement(t.a,{href:"https://github.com/graphhopper/open-traffic-collection",target:"_blank",rel:"nofollow"},"Graphhopper's collection of open traffic sources"),"."),"\n",l.createElement(t.p,null,"So it may happen that OpenStreetMap Routing will be enriched by traffic data very soon."),"\n",l.createElement(t.h2,null,"OSM-based Routing: Free or Not?"),"\n",l.createElement(t.p,null,'As the OpenStreetMap data is free and publically available, you would probably wonder if OSM routing is Free or not. In short, the answer depends on what you mean by "Free".'),"\n",l.createElement(t.p,null,"There are open-source routing solutions that theoretically let you start your routing service at no cost on licenses and adapt the software to fit your needs. ",l.createElement(t.strong,null,"Still, you need to consider hardware, maintenance, and upgrade costs.")),"\n",l.createElement(t.p,null,"Just a quick bit of info, the Valhalla routing engine, one of the least demanding, requires a server with at least 32 gigabytes of RAM and 2 terabytes of SSDs to support planet-wide routing with elevation and at least one full-time person who can do server and data maintenance. And if something doesn't work as expected, you're on your own to understand and fix it."),"\n",l.createElement(t.h3,null,"Open-source Routing Engines based on OSM"),"\n",l.createElement(t.p,null,"If you decide to run your own OSM-based routing server, here are the most popular open-source routing engines that work on OpenStreetMap data:"),"\n",l.createElement(t.table,null,l.createElement(t.thead,null,l.createElement(t.tr,null,l.createElement(t.th,null,"OSM Routing Engine"),l.createElement(t.th,null,"Language"),l.createElement(t.th,null,"Name"),l.createElement(t.th,null,"Description"))),l.createElement(t.tbody,null,l.createElement(t.tr,null,l.createElement(t.td,null,l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 100px; '>\n      <a class='gatsby-resp-image-link' href='/static/c04611d9bcb5dbaa4d53faf6f483b34b/7e516/valhalla-logo-100.png' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRvoBAABXRUJQVlA4WAoAAAAQAAAAEwAAEwAAQUxQSPEAAAABkLNt2/m3C7rf9401OZnyFWw7mWwnm21tLEbbdrce3bR3szvZeH//5y7+iIgJAKAMwmp2nj27rToYRsGtRu9LCil80gLtRqldFLGOY0W4CQ1AY4u/Hbp1LJdgoFFAEXoU/kqCVrhCSy8tj0Aj7gPFG+HrCKCE4oOkAHV00SthCVBOEa/IDCDxG314GwmFW3S8cXgR2qCR1rtyGCicoPUglruhAYWIm3RZty5eDoICoFTg2g8KKfy6aLTC/0ojYfz6vTuXx+JhFDyOH1qoWN3sLJiag3ZnsPHm9tj9B/uGbhyEcaeR1N/WMdTR3TeQAwUAAFZQOCDiAAAAsAUAnQEqFAAUAD7RYKhPqCUjoigIAQAaCWcAw+ndFXj/ugYSadNYlb4f6SZkHoxGCCgEngCAAPvFQ8egIGxP6cPV93fxEuYKZ2tx3GZl1U+WLM/2A5d6bZJI2uZ1UCp2YQr4IozIe1v1qt9kiKiF4EaQbwELYjB3hvs88dGKMSk1RXzqMq2KJB/axj5tlx3S9DKPm+S+MFZ3VJO5cpp/oy/XE+ctGZu074XYW3lPMXhyyOTxlPBClY1mFouXXm4vIBVIk4EYtjy44oWKMXgnwY5wFEPZbXgK36sTth8cPFIAAA=='); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='Valhalla logo' title='' src='/static/c04611d9bcb5dbaa4d53faf6f483b34b/7e516/valhalla-logo-100.png' srcset='/static/c04611d9bcb5dbaa4d53faf6f483b34b/7e516/valhalla-logo-100.png 100w' sizes='(max-width: 100px) 100v
1w, 100px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}})),l.createElement(t.td,null,"C++"),l.createElement(t.td,null,l.createElement(t.a,{href:"https://github.com/valhalla/valhalla",target:"_blank",rel:"nofollow"},"Valhalla")),l.createElement(t.td,null,"Valhalla is a feature-rich, flexible, and fast routing engine. One instance of Valhalla can cover the whole planet. In addition, the Valhalla routing engine supports dynamic routing profiles, so you can easily add new profiles or extend existing ones. For example, you can create a new profile for super long-distance hauling or a heavy truck. But calculating long routes and isolines can take some time.")),l.createElement(t.tr,null,l.createElement(t.td,null,l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 100px; '>\n      <a class='gatsby-resp-image-link' href='/static/d7984dcc89755bc53bacd907f523cf2f/7e516/otp-logo.png' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 100%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRjYCAABXRUJQVlA4WAoAAAAQAAAAEwAAEwAAQUxQSD4BAAABkGPbtmlbc+/z7OjVgAXAt63Qtq3Itm1bsW1F9g9/BR723WeN7zJEREouUdHQi99Dw6czA4uUOEnyGvQdw8D4NkhektcWLI0pN+cvuA9b5OW1nRAx5sg7LYOt8hpENCI35Pp1U/IMBqn4A9EsMFt9oYPWwIfiMUQgcqjLEdI2WksTw1qNHjJ06NChQ8ZNGT6kXrmvCFzQ/5zcJmKGL4uWLFm8ZMuqhYsWLVq48tONGRkIBsaV/j16dOvWo3vnCrV8SPNHmpgtr799tvrw5SK8zdeEc3vW7zh1/NJstyFwYRicU00DxwuHEHn9iMDQ4rdcVdndhl4aRHNMyfChWANprldxuXSNiMXIQHlt4U2tVLYXgxjYKi+vTYSXt36QWkyNLfKSvAZ8wzAwvg+SlySXqHDA6S8hfLs4uEiJkwBWUDgg0gAAAPAGAJ0BKhQAFAA+0VynTiglI6IoCqkAGglqAJ0yhHRX1h0QegB+meWAfsB1phEXBVemSt8NM/rFi/bWAnXRDwgA/ZSiD8YEpUDNa1v2hfOCHvcHA1+SxhWj77cbhfxlJoWSntvxwC6CKtMYgRs6AMY4VHnmtyY2/pzfCO3WHoHvsS3uV5x3JcHJidMUuRS8M80AMfPi/RVntfYNjVA1acJMd9SJuaC/hHNdWGAN1tjA2dFm9m7S2VxXTq7Jku3JRuIQzHU3GpIeLV3XPzas+lKAAA=='); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='OpenTripPlanner logo' title='' src='/static/d7984dcc89755bc53bacd907f523cf2f/7e516/otp-logo.png' srcset='/static/d7984dcc89755bc53bacd907f523cf2f/7e516/otp-logo.png 100w' sizes='(max-width: 100px) 100vw, 100px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}})),l.createElement(t.td,null,"Java"),l.createElement(t.td,null,l.createElement(t.a,{href:"https://www.opentripplanner.org/",target:"_blank",rel:"nofollow"},"OpenTripPlanner")),l.createElement(t.td,null,"Focused on ",l.createElement(t.a,{href:"/how-to-make-travel-time-maps-for-public-transport/"},"public transportation, allows you to calculate routes and isolines"),", and thus can be used in conjunction with customized GTFS data. Works for small regions and or city areas, however it is very difficult to scale it to support country or continent scale routing.")),l.createElement(t.tr,null,l.createElement(t.td,null,l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 100px; '>\n      <a class='gatsby-resp-image-link' href='/static/3afa1f2a4c1970c23d3c4f079a108e5d/7e516/osrm-logo-100.png' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 34%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRjIBAABXRUJQVlA4WAoAAAAQAAAAEwAABgAAQUxQSI0AAAAATpiXagApn54fga6UnRCEynNRz3ajbHOWWYFoazuJTnBueLBok7hNm3eLgoF4hX2ZF4GIeXVorJtpnh6gfYOKd4QRh2yEdoJdrBGLoKynI5yngn2tMGOAlWN5j0GCTnp50JaNnB9rbzEAFnNaAzc6GSUyMiM0Ko1GGQ4PDx4ZDgsSFRMSHBIQHhETEREAVlA4IH4AAADQBACdASoUAAcAPtFWpEuoJKOhsAgBABoJbACdMoO4B8AMEA/YAB2Te2QBw+IbAAD+2MDy652tlfU2mesAfomouoZmx8FDdoMNHqIEU55iqj/f9yNF1mDR8L1L07DRXmT/Sw9G8UlwDr+lyUfZOE8wgcgXtwONA47k0dCAAAA='); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='OpenSourceRoutingMachine logo' title='' src='/static/3afa1f2a4c1970c23d3c4f079a108e5d/7e516/osrm-logo-100.png' srcset='/static/3afa1f2a4c1970c23d3c4f079a108e5d/7e516/osrm-logo-100.png 100w' sizes='(max-width: 100px) 100v
1w, 100px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}})),l.createElement(t.td,null,"C++"),l.createElement(t.td,null,l.createElement(t.a,{href:"http://project-osrm.org/",target:"_blank",rel:"nofollow"},"OSRM")),l.createElement(t.td,null,"Open Source Routing Machine (OSRM) is a high-performance routing engine offering turn-by-turn routing and time-distance matrices. The OSRM is very fast, but it requires profile data to be precalculated, and may require more than 128GB of memory.")),l.createElement(t.tr,null,l.createElement(t.td,null,l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 100px; '>\n      <a class='gatsby-resp-image-link' href='/static/8ab511724804bf6d6b551ffb6426ccef/7e516/graphhopper-100.png' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 16%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRqwAAABXRUJQVlA4WAoAAAAQAAAAEwAAAgAAQUxQSD0AAAAAvX8XWF4pQ3Jwda9kTypGND9RN1a/lsSD1cq13LDTkeC4wsC9yMvYYyPTdR9TpoY/QFQ3V2Gvf7NCOUIeAFZQOCBIAAAAcAMAnQEqFAADAD7RWKRMKCUjojAIAQAaCWkAAFRjYSnkqPOQAP7swm5cPwTH8hBP/+COOfWnSvkvjPmsie7SUre5lHWQAAAA'); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='Graphhopper logo' title='' src='/static/8ab511724804bf6d6b551ffb6426ccef/7e516/graphhopper-100.png' srcset='/static/8ab511724804bf6d6b551ffb6426ccef/7e516/graphhopper-100.png 100w' sizes='(max-width: 100px) 100vw, 100px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}})),l.createElement(t.td,null,"Java"),l.createElement(t.td,null,l.createElement(t.a,{href:"https://github.com/graphhopper/graphhopper",target:"_blank",rel:"nofollow"},"Graphhopper")),l.createElement(t.td,null,"GraphHopper is a fast and efficient routing engine written in Java that provides turn-by-turn instructions and many road attributes for a route between two or more points. Similar to Valhalla, the Graphhopper lets to define dynamic route profiles making you more flexible.")))),"\n",l.createElement(t.p,null,"Depending on your needs and experience, one or another routing engine might suit you better. However, it is probably not the best option if you simply want to save money."),"\n",l.createElement(t.h3,null,"Geoapify Routing API: features & pricing"),"\n",l.createElement(t.p,null,"Geoapify offers OSM Routing as a service. We made our ",l.createElement(t.a,{href:"/routing-api/"},"Routing API")," robust, feature-rich, and easy to use.\nWe run Geoapify Routing on dozens of high-performance servers and can dynamically scale up to meet demand by starting additional cloud servers, making the system consistent, stable, and reliable."),"\n",l.createElement(t.p,null,"The API works vis HTTP Get/Post and returns GeoJSON, JSON, or XML objects. For a demo of the API, check out ",l.createElement(t.a,{href:"https://apidocs.geoapify.com/playground/routing/",target:"_blank",rel:"nofollow"},"API Playground"),"."),"\n",l.createElement(t.h5,null,"Routing modes"),"\n",l.createElement(t.p,null,"Geoapify Routing supports many travel modes for driving, bicycling, walking, and public transport:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,l.createElement(t.code,null,"drive"),", ",l.createElement(t.code,null,"light_truck")),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"medium_truck"),", ",l.createElement(t.code,null,"truck"),", ",l.createElement(t.code,null,"heavy_truck"),", ",l.createElement(t.code,null,"truck_dangerous_goods"),", ",l.createElement(t.code,null,"long_truck")),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"bus")),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"scooter"),", ",l.createElement(t.code,null,"motorcycle")),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"bicycle"),", ",l.createElement(t.code,null,"mountain_bike"),", ",l.createElement(t.code,null,"road_bike")),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"walk"),", ",l.createElement(t.code,null,"hike")),"\n",l.createElement(t.li,null,l.createElement(t.code,null,"transit")),"\n"),"\n",l.createElement(t.p,null,"For more information, please visit the ",l.createElement(t.a,{href:"https://apidocs.geoapify.com/docs/routing/",target:"_blank",rel:"nofollow"},"Routing API documentation page"),"."),"\n",l.createElement(t.h5,null,"Turn-by-turn navigation"),"\n",l.createElement(t.p,null,"Turn-by-turn instructions (or Directions) help create a navigation app that guides your users to their destination."),"\n",l.createElement(t.p,null,"You receive basic driving instructions when you call the Geoapify Routing API without any additional parameters. However, if you add the details parameter, you'll receive detailed instructions:"),"\n",l.createElement("div",{className:"width-default"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-remark-copy-button-container">\n              <button\n                class="gatsby-remark-copy-button"\n                onClick="copyToClipboard(`&quot;instruction&quot;:{\n    &quot;text&quot;:&quot;Turn right onto Krausnickstraße.&quot;,\n    &quot;type&quot;:&quot;Right&quot;,\n    &quot;transition_instruction&quot;:&quot;Turn right.&quot;,\n    &quot;pre_transition_instruction&quot;:&quot;Turn right onto Krausnickstraße.&quot;,\n    &quot;post_transition_instruction&quot;:&quot;Continue for 300 meters.&quot;,\n    &quot;streets&quot;:[\n      &quot;Krausnickstraße&quot;\n    ]\n}`, this)"\n              >\n                <svg class="copy-icon" width="16" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">\x3c!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--\x3e<path fill="#FFFFFF" d="M384 336H192c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16l140.1 0L400 115.9V320c0 8.8-7.2 16-16 16zM192 384H384c35.3 0 64-28.7 64-64V115.9c0-12.7-5.1-24.9-14.1-33.9L366.1 14.1c-9-9-21.2-14.1-33.9-14.1H192c-35.3 0-64 28.7-64 64V320c0 35.3 28.7 64 64 64zM64 128c-35.3 0-64 28.7-64 64V448c0 35.3 28.7 64 64 64H256c35.3 0 64-28.7 64-64V416H272v32c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V192c0-8.8 7.2-16 16-16H96V128H64z"/></svg><svg class="success-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
1<path d="M0 0h24v24H0z" fill="none"/><path fill="#fff" d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>\n              </button>\n            </div>'}}),l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"><span class="token property">"instruction"</span><span class="token operator">:</span><span class="token punctuation">{</span>\n    <span class="token property">"text"</span><span class="token operator">:</span><span class="token string">"Turn right onto Krausnickstraße."</span><span class="token punctuation">,</span>\n    <span class="token property">"type"</span><span class="token operator">:</span><span class="token string">"Right"</span><span class="token punctuation">,</span>\n    <span class="token property">"transition_instruction"</span><span class="token operator">:</span><span class="token string">"Turn right."</span><span class="token punctuation">,</span>\n    <span class="token property">"pre_transition_instruction"</span><span class="token operator">:</span><span class="token string">"Turn right onto Krausnickstraße."</span><span class="token punctuation">,</span>\n    <span class="token property">"post_transition_instruction"</span><span class="token operator">:</span><span class="token string">"Continue for 300 meters."</span><span class="token punctuation">,</span>\n    <span class="token property">"streets"</span><span class="token operator">:</span><span class="token punctuation">[</span>\n      <span class="token string">"Krausnickstraße"</span>\n    <span class="token punctuation">]</span>\n<span class="token punctuation">}</span></code></pre></div>'}})),"\n",l.createElement(t.h5,null,"Route details"),"\n",l.createElement(t.p,null,"The OpenStreetMap data has a lot of useful information about its road network. You can use this information to visualize routes while providing helpful labels or classify the roads based on speed limits or surface."),"\n",l.createElement(t.p,null,"With the parameter details=route_details, you get more information about each route step. Here is an example of the additional data:"),"\n",l.createElement("div",{className:"width-default"},l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-remark-copy-button-container">\n              <button\n                class="gatsby-remark-copy-button"\n                onClick="copyToClipboard(`{\n  &quot;speed&quot;:30,\n  &quot;speed_limit&quot;:30,\n  &quot;truck_limit&quot;:30,\n  &quot;surface&quot;:&quot;paved_smooth&quot;,\n  &quot;lane_count&quot;:1,\n  &quot;road_class&quot;:&quot;residential&quot;,\n  &quot;name&quot;:&quot;Krausnickstraße&quot;,\n  &quot;rightside&quot;:true,\n  &quot;traversability&quot;:&quot;both&quot;,\n  &quot;elevation&quot;:39,\n  &quot;from_index&quot;:13,\n  &quot;to_index&quot;:20,\n  &quot;distance&quot;:278,\n  &quot;time&quot;:35.30002150537634,\n  &quot;instruction&quot;:{\n     ...\n  }\n}`, this)"\n              >\n                <svg class="copy-icon" width="16" height="16" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512">\x3c!--!Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc.--\x3e<path fill="#FFFFFF" d="M384 336H192c-8.8 0-16-7.2-16-16V64c0-8.8 7.2-16 16-16l140.1 0L400 115.9V320c0 8.8-7.2 16-16 16zM192 384H384c35.3 0 64-28.7 64-64V115.9c0-12.7-5.1-24.9-14.1-33.9L366.1 14.1c-9-9-21.2-14.1-33.9-14.1H192c-35.3 0-64 28.7-64 64V320c0 35.3 28.7 64 64 64zM64 128c-35.3 0-64 28.7-64 64V448c0 35.3 28.7 64 64 64H256c35.3 0 64-28.7 64-64V416H272v32c0 8.8-7.2 16-16 16H64c-8.8 0-16-7.2-16-16V192c0-8.8 7.2-16 16-16H96V128H64z"/></svg><svg class="success-icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24"><path d="M0 0h24v24H0z" fill="none"/><path fill="#fff" d="M19 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.11 0 2-.9 2-2V5c0-1.1-.89-2-2-2zm-9 14l-5-5 1.41-1.41L10 14.17l7.59-7.59L19 8l-9 9z"/></svg>\n              </button>\n            </div>'}}),l.createElement(t.span,{dangerouslySetInnerHTML:{__html:'<div class="gatsby-highlight" data-language="json"><pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>\n  <span class="token property">"speed"</span><span class="token operator">:</span><span class="token number">30</span><span class="token punctuation">,</span>\n  <span class="token property">"speed_limit"</span><span class="token operator">:</span><span class="token number">30</span><span class="token punctuation">,</span>\n  <span class="token property">"truck_limit"</span><span class="token operator">:</span><span class="token number">30</span><span class="token punctuation">,</span>\n  <span class="token property">"surface"</span><span class="token operator">:</span><span class="token string">"paved_smooth"</span><span class="token punctuation">,</span>\n  <span class="token property">"lane_count"</span><span class="token operator">:</span><span class="token number">1</span><span class="token punctuation">,</span>\n  <span class="token property">"road_class"</span><span class="token operator">:</span><span class="token string">"residential"</span><span class="token punctuation">,</span>\n  <span class="token property">"name"</span><span class="token operator">:</span><span class="token string">"Krausnickstraße"</span><span class="token punctuation">,</span>\n  <span class="token property">"rightside"</span><span class="token operator">:</span><span class="token boolean">true</span><span class="token punctuation">,</span>\n  <span class="token property">"traversability"</span><span class="token operator">:</span><span class="token string">"both"</span><span class="token punctuation">,</span>\n  <span class="token property">"elevation"</span><span class="token operator">:</span><span class="token number">39</span><span class="token punctuation">,</span>\n  <span class="token property">"from_index"</span><span class="token operator">:</span><span class="token number">13</span><span class="token punctuation">,</span>\n  <span class="token property">"to_index"</span><span class="token operator">:</span><span class="token number">20</span><span class="token punctuation">,</span>\n  <span class="token property">"distance"</span><span class="token operator">:</span><span class="token number">278</span><span class="token punctuation">,</span>\n  <span class="token property">"time"</span><span class="token operator">:</span><span class="token number">35.30002150537634</span><span class="token punctuation">,</span>\n  <span class="token property">"instruction"</span><span class="token operator">:</span><span class="token punctuation">{</span>\n     ...\n  <span class="token punctuation">}</span>\n<span class="token punctuation">}</span></code></pre></div>'}})),"\n",l.createElement(t.h5,null,"Route elevation profile"),"\n",l.createElement(t.p,null,"Another useful feature is altitude or elevation information which you can get with the ",l.createElement(t.code,null,"details=elevation")," parameter."),"\n",l.createElement(t.span,{dangerouslySetInnerHTML:{__html:"<span class='gatsby-resp-image-wrapper' style='position: relative; display: block; margin-left: auto; margin-right: auto; max-width: 600px; '>\n      <a class='gatsby-resp-image-link' href='/static/da36f437e915b16f16af64918e71a6cb/fdaf8/route-elevations.png' style='display: block' target='_blank' rel='noopener'>\n    <span class='gatsby-resp-image-background-image' style=\"padding-bottom: 42%; position: relative; bottom: 0; left: 0; background-image: url('data:image/webp;base64,UklGRloAAABXRUJQVlA4IE4AAADwAwCdASoUAAgAPtFUo0uoJKMhsAgBABoJQBOmUABqr6TT3yZKEKwAAP71AlzB0ld/mxF7M1ElpFBbMpDv3a94oqDLK2/JhYP0kKoAAAA='); background-size: cover; display: block;\"></span>\n  <img class='gatsby-resp-image-image' alt='Hiking route elevation profile from Thoiry, France to Chézery-Forens, France' title='' src='/static/da36f437e915b16f16af64918e71a6cb/0a47e/route-elevations.png' srcset='/static/da36f437e915b16f16af64918e71a6cb/5a46d/route-elevations.png 300w,\n/static/da36f437e915b16f16af64918e71a6cb/fc2a6/route-elevations.png 450w,\n/static/da36f437e915b16f16af64918e71a6cb/0a47e/route-elevations.png 600w,\n/static/da36f437e915b16f16af64918e71a6cb/fdaf8/route-elevations.png 674w' sizes='(max-width: 600px) 100v
1w, 600px' style='width:100%;height:100%;margin:0;vertical-align:middle;position:absolute;top:0;left:0;' loading='lazy' decoding='async'>\n  </a>\n    </span>"}}),"\n",l.createElement("div",{className:"image-caption"},l.createElement(t.p,null,"Hiking route elevation profile from Thoiry, France to Chézery-Forens, France")),"\n",l.createElement(t.p,null,'Route elevation profiles are essential tools for hiking or biking routes. Using them, you can categorize the difficulty of any path by examining its "ups and downs".'),"\n",l.createElement(t.p,null,"It also helps figure out how much fuel you'll need on the trip or how far you can go on the battery for cars and trucks."),"\n",l.createElement(t.h5,null,"More APIs for routes and optimization"),"\n",l.createElement(t.p,null,"The Routing API is a member of the large Geoapify routing services family. These are other APIs based on OSM road network data. They offer a good set of tools to analyze routes and locations, find optimal travel plans and schedules:"),"\n",l.createElement(t.ul,null,"\n",l.createElement(t.li,null,l.createElement(t.a,{href:"/map-matching-api/"},"Map Matching API")," - allows you to match GPS tracks to existing road network and get extended road details;"),"\n",l.createElement(t.li,null,l.createElement(t.a,{href:"/route-matrix-api/"},"Distance Matrix API")," - calculates a matrix of distances and travel times between multiple source and target locations;"),"\n",l.createElement(t.li,null,l.createElement(t.a,{href:"/route-planner-api/"},"Route Planner API")," - finds an optimal route between multiple locations and for multiple vehicles or agents to solve, for example, delivery planning task;"),"\n",l.createElement(t.li,null,l.createElement(t.a,{href:"/isoline-api/"},"Isolines API")," - returns an area reachable from a location within a given time or distance; it shows how far one can go from a given location."),"\n"),"\n",l.createElement(t.h5,null,"Pricing"),"\n",l.createElement(t.p,null,"Geoapify's location platform is a cost-effective solution for any business. We have a variety of ",l.createElement(t.a,{href:"/pricing/"},"Pricing Plans")," that let you choose the one that best suits your needs."),"\n",l.createElement(t.p,null,"Not sure how many routes you'll run? Then start for Free! You can try the API and evaluate Geoapify against your requirements."),"\n",l.createElement(t.h2,null,"The Pros and Cons of Using OpenStreetMap Routing"),"\n",l.createElement(t.p,null,"OpenStreetMap is an promising alternative to proprietary map databases. We went through the main aspects of OpenStreetMap-based routing services and checked their strong and weak side. Then, let's gather their pros and cons in a summary table:"),"\n",l.createElement("table",{className:"table-fixed"},l.createElement("thead",null,l.createElement("tr",null,l.createElement("th",
1null,"Pros"),l.createElement("th",null,"Cons"))),l.createElement("tbody",null,l.createElement("tr",null,l.createElement("td",{className:"bg-green-100"},l.createElement("div",null,l.createElement("div",{className:"font-medium mb-1"},"Affordability"),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"Based on community-driven OpenStreetMap data, OpenStreetMap Routing\nis usually more affordable than services based on proprietary data.")),l.createElement("div",{className:"font-medium mb-1"},"Up-to-date"),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"Millions of people contribute to OpenStreetMap, making it an\nextremely up-to-date map.")),l.createElement("div",{className:"font-medium mb-1"},"Permissive"),l.createElement("div",{className:"text-sm text-gray-800"},l.createElement(t.p,null,"The OpenStreetMap data is open, so the routes built from it are\nassumed* to be open too.")),l.createElement("div",{className:"text-xs text-gray-600 mb-5"},l.createElement(t.p,null,"*To be sure, read the terms and conditions of a service provider")),l.createElement("div",{className:"font-medium mb-1"},"Information-rich"),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"OpenStreetMap contains lots of valuable information for routing\napplications - road surface, road class, speed limits, etc.")),l.createElement("div",{className:"font-medium mb-1"},"Powerful and flexible"),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"OpenStreetMap Routing doesn't limit you to some travel modes, like\ndriving, biking, walking, but enables defining custom modes, such as\ndelivery robots, campers, e-drive.")),l.createElement("div",{className:"font-medium mb-1"},"Large number of providers"),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"OpenStreetMap is available to everybody so that many companies can\noffer OSM-based routing services and APIs. That way, you have the\nbest conditions at your disposal.")))),l.createElement("td",{className:"bg-red-100"},l.createElement("div",null,l.createElement("div",{className:"font-medium mb-1"},"No Traffic data"),l.createElement("div",{className:"text-sm text-gray-800 mb-2"},l.createElement(t.p,null,"OpenStreetMap doesn't contain traffic data by design, so there is no\nstandard way to add it to the OpenStreetMap Routing solutions.")),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"But the availability of open traffic data is growing. In addition,\nestimating traffic flow by using vehicle registrations can also be a\nfeasible alternative to direct observation.")),l.createElement("div",{className:"font-medium mb-1"},"No Live traffic"),l.createElement("div",{className:"text-sm text-gray-800 mb-2"},l.createElement(t.p,null,"Live traffic needs to be collected from end-user devices, such as\nmobile network providers tracking the locations of phones, apps like\nGoogle or Facebook using location data, or navigation systems with\nSIM cards. And this is definitely out of the scope of OpenStreetMap.")),l.createElement("div",{className:"text-sm text-gray-800 mb-5"},l.createElement(t.p,null,"Live traffic is proprietary data that belong to certain companies.\nThey may provide OSM-based traffic but you need to read their terms\nof use for details."))))))),"\n",l.createElement(t.p,null,"We've identified some pros and cons here, but there's no way to know if they apply to you or your business requirements. The choice is ultimately yours; OSM provides a good alternative if you're looking for one."))}var s=function(e){void 0===e&&(e={});const{wrapper:t}=Object.assign({},(0,n.RP)(),e.components);return t?l.createElement(t,e,l.createElement(o,e)):o(e)},r=a(4794),i=a(2532),c=a(8154),p=a(1574),m=a(7127),u=a(1543),d=a(3428),g=a(369),f=a(2992),h=a(3481),b=a(9911),y=a(9856),E=a(529),A=a(8818),w=a(1435),v=a(5898),k=a(2389),x=a(118),S=a(2833),_=a(9816),M=a(3008),I=a(3960),T=a(7358),O=a(6649);
1const N={Link:r.Link,SplitSection:h.A,BackgroundPanel:b.A,Card:y.A,Button:E.A,ButtonGroup:A.A,Banner:w.A,PageList:v.A,FAQStructutedData:M.A,HowToStructuredData:k.A,FAQWithStructuredData:x.A,InputCheckbox:S.A,TryGeolocation:_.A,JSONTree:p.d,TableOfContent:I.A,PostImage:T.A,VerticalTimeline:O.VerticalTimeline,VerticalTimelineElement:O.VerticalTimelineElement},q=e=>{let{data:{post:t,logo:a,siteData:o,postFormattedData:s,prevPost:r,nextPost:p},children:h,pageContext:{modifiedTime:b}}=e;const y=t.frontmatter.featuredImage?t.frontmatter.featuredImage.childImageSharp.original:{},E=t.frontmatter.twitterImage2x1?t.frontmatter.twitterImage2x1.childImageSharp.original:{},A=t.frontmatter.categories?t.frontmatter.categories.map((e=>d.A.find((t=>t.id===e)))):null,w=t.frontmatter.tags?t.frontmatter.tags.map((e=>g.A.find((t=>t.id===e)))):null,v=w?w.map((e=>e.label)):null,k=E.src||y.src,x=k?[`https://www.geoapify.com${k}`]:null,S=s.frontmatter.featuredImage?s.frontmatter.featuredImage.childImageSharp.gatsbyImageData:null,_="home"===t.frontmatter.slug.split("/").join("")?"https://www.geoapify.com/":`https://www.geoapify.com/${t.frontmatter.slug}/`;return l.createElement(l.Fragment,null,l.createElement(c.m,null,l.createElement("link",{rel:"canonical",href:_,"data-baseprotocol":"https:","data-basehost":"www.geoapify.com"})),l.createElement(u.A,{webpageTitle:t.frontmatter.title_60,webpageDescription:t.frontmatter.description_120,slug:t.frontmatter.slug,imageSrc:y.src,imageWidth:y.width,imageHeight:y.height,imageAlt:t.frontmatter.featuredImageAlt_120,ogType:"article",twitterImageSrc:E.src,twitterTitle:t.frontmatter.twitterTitle_70,twitterImageAlt:t.frontmatter.twitterImageAlt_420,twitterDescription:t.frontmatter.twitterDescription_200,articleSection:"Geo information systems (GIS)",articleTags:v,created:t.frontmatter.first_publiched_date||t.frontmatter.date,modified:b}),l.createElement(f.A,{geoapifySlogan:o.siteMetadata.slogan,companyName:o.siteMetadata.company,logoSrc:a.childImageSharp.gatsbyImageData.src,logoWidth:a.childImageSharp.gatsbyImageData.width,logoHeight:a.childImageSharp.gatsbyImageData.height,slug:t.frontmatter.slug,articleName:t.frontmatter.title_60,articleHeadline:t.frontmatter.headline_110,published:t.frontmatter.first_publiched_date||t.frontmatter.date,modified:b,images:x}),l.createElement(m.A,null,l.createElement("article",{className:"geoapify-post"},l.createElement("header",{className:"geoapify-post-header"},l.createElement("div",{className:"geoapify-post-meta"},l.createElement("span",null,s.frontmatter.date),l.createElement("span",{className:"mx-1"}," / "),t.frontmatter.author?l.createElement("span",null,"by ",l.createElement("a",{rel:"noopener noreferrer",target:"_blank",href:t.frontmatter.authorUrl},t.frontmatter.author)):l.createElement("span",null,"by Geoapify"),A&&A.length?l.createElement("span",{className:"ml-1"}," / in "):null,A&&A.length?A.map(((e,t)=>l.createElement("span",{key:e.id},t?l.createElement("span",null,", "):null,l.createElement("a",{href:`/category/${e.slug}/`},e.label)))):null),l.createElement("h1",null,t.frontmatter.title),t.frontmatter.subtitle?l.createElement("h2",{className:"text-xl text-gray-700 mx-2 font-light"},t.frontmatter.subtitle):null,S?l.createElement("div",{className:"geoapify-post-featured-image"},l.createElement(i.G,{image:S,alt:t.frontmatter.featuredImageAlt_120})):null,t.frontmatter.featuredImageAlt_120?l.createElement("div",{className:"text-center mt-2 mb-10 text-sm italic text-gray-600",dangerouslySetInnerHTML:{__html:t.frontmatter.featuredImageAlt_120}}):l.createElement("div",{className:"mb-10"})),l.createElement("section",{className:"geoapify-post-body"},l.createElement(n.xA,{components:N},h))),l.createElement("div",{className:"mx-5 lg:mx-auto tag-list"},w?w.map((e=>l.createElement("a",{className:"tag",href:`/tag/${e.slug}/`,key:e.id},e.label))):null),l.createElement("div",{className:"post-navigation"},l.createElement("div",{className:"post-navigation-buttons flex flex-col md:flex-row"},r?l.createElement("div",{className:"previous-post"},l.createElement("a",{href:`/${r.frontmatter.slug}/`,rel:"prev"},l.createElement("div",{className:"previous"},l.createElement("span",{className:"chevron lnr lnr-chevron-left"}),l.createElement("div",{className:"title"},l.createElement("span",{className:"meta"},"Previous Post"),l.createElement("span",{className:"post-title"},r.frontmatter.title))))):null,p?l.createElement("div",{className:"next-post"},l.createElement("a",{href:`/${p.frontmatter.slug}/`,rel:"next"},l.createElement("div",{className:"next"},l.createElement("div",{className:"title"},l.createElement("span",{className:"meta"},"Next Post"),l.createElement("span",{className:"post-title"},p.frontmatter.title)),l.createElement("span",{className:"chevron lnr lnr-chevron-right"})))):null))))};function H(e){return l.createElement(q,e,l.createElement(s,e))}}}]);
2//# sourceMappingURL=component---src-template-post-js-content-file-path-src-posts-2022-01-19-openstreetmap-routing-index-mdx-435f19439905752e218e.js.map

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.