/** * @fileoverview * * Interface with the OpenStreetMap collaborative mapping database. */ import axios from "axios"; import { isObject } from "../../util.js"; /** * 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. */ export const runQuery = ( query, endpoint = "https://lz4.overpass-api.de/api/interpreter" ) => ( axios.post(endpoint, `data=${query}`) .then(res => res.data) ); /** * 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. */ export const viewNode = id => `https://www.osm.org/node/${id}`; /** * 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. */ export const isOneWay = obj => ( obj.type === "way" && isObject(obj.tags) && (obj.tags.oneway === "yes" || obj.tags.junction === "roundabout" || obj.tags.highway === "motorway") ); /** * Determine if a node is a railway crossing or not. * * See for details. * @param {Object} obj OSM node object. * @return {boolean} Whether the node is a railway crossing. */ export const isRailwayCrossing = obj => ( obj.type === "node" && isObject(obj.tags) && (obj.tags.railway === "railway_crossing") ); /** * 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. */ export const isTransportLine = obj => ( obj.type === "relation" && isObject(obj.tags) && obj.tags.type === "route_master" );