/** * @fileoverview * * Interface with the OpenStreetMap collaborative mapping database. */ const axios = require("axios"); const { isObject } = require("../../util"); /** * Submit a query to an Overpass endpoint. * * See for more * information on the Overpass Query Language (Overpass QL). * @async * @param {string} query Query to send. * @param {string} [endpoint] Overpass endpoint to use. * @returns {string|Object} Results returned by the endpoint. If JSON output * is requested in the query, the result will automatically be parsed into * a JS object. */ const runQuery = ( query, endpoint = "https://lz4.overpass-api.de/api/interpreter" ) => ( axios.post(endpoint, `data=${query}`) .then(res => res.data) ); exports.runQuery = runQuery; /** * Create a link to view a node. * @param {string|number} id Identifier for the node to view. * @returns {string} Link to view this node on the OSM website. */ const viewNode = id => `https://www.osm.org/node/${id}`; exports.viewNode = viewNode; /** * Determine if an OSM way is one-way or not. * * See for details. * @param {Object} obj OSM way object. * @returns {boolean} Whether the way is one-way. */ const isOneWay = obj => ( obj.type === "way" && isObject(obj.tags) && (obj.tags.oneway === "yes" || obj.tags.junction === "roundabout" || obj.tags.highway === "motorway") ); exports.isOneWay = isOneWay; /** * Determine if an OSM object is a public transport line (route master). * * See * and . * @param {Object} obj OSM relation object. * @returns {boolean} Whether the relation is a public transport line. */ const isTransportLine = obj => ( obj.type === "relation" && isObject(obj.tags) && obj.tags.type === "route_master" ); exports.isTransportLine = isTransportLine;