overpass-frontend
Version:
A JavaScript (NodeJS/Browser) library to easily access data from OpenStreetMap via Overpass API or from an OSM File. The objects can directly be used with LeafletJS or exported to GeoJSON. Data will be cached in the browser memory.
148 lines (123 loc) • 3.77 kB
JavaScript
const ee = require('event-emitter')
const SortedCallbacks = require('./SortedCallbacks')
/**
* A compiled query
* @typedef {Object} Request#SubRequest
* @property {string} query - The compiled code
* @property {object[]} parts - An entry for each part (separated by the 'out count' separator)
* @property {int} parts[].properties - The properties which each returned map feature has set (TAGS, BBOX, ...)
* @property {int} effort - Supposed "effort" of this query
* @property {int} count - Count of discovered items
* @property {Request} request - The request this compiled query belongs to
*/
/**
* An unspecified request
* @param {OverpassFrontend} overpass
* @param {object} options
*/
class Request {
constructor (overpass, data) {
this.overpass = overpass
for (const k in data) {
this[k] = data[k]
}
if (!this.options) {
this.options = {}
}
this.priority = 'priority' in this.options ? this.options.priority : 0
const callbacks = new SortedCallbacks(this.options, this.featureCallback, this.finalCallback)
this.featureCallback = callbacks.next.bind(callbacks)
this.finalCallback = callbacks.final.bind(callbacks)
this.count = 0
this.callCount = 0
this.timestampPreprocess = 0
}
/**
* Request got aborted
* @event Request#abort
*/
/**
* abort this request
*/
abort () {
this.aborted = true
this.emit('abort')
this.overpass._abortRequest(this)
}
/**
* Request is finished
* @event Request#finish
* @param {Error|null} - null if no error occured
*/
/**
* request is finished
* @param {Error|null} err - null if no error occured
*/
finish (err) {
if (!this.aborted) {
this.finalCallback(err)
}
this.overpass._finishRequest(this)
this.finished = true
this.emit('finish', err)
}
/**
* shall this Request be included in the current call?
* @param {OverpassFrontend#Context} context - Current context
* @return {boolean} - yes|no
*/
willInclude (context) {
return true
}
/**
* @typedef {Object} Request#minMaxEffortResult
* @property {number} Remaining minimal effort of this request
* @property {number|null} Remaining maximum effort (or null if unknown)
*/
/**
* how much effort can a call to this request use
* @return {Request#minMaxEffortResult} - minimum and maximum effort
*/
minMaxEffort () {
return { minEffort: 0, maxEffort: 0 }
}
/**
* SubRequest got compiled
* @event Request#subrequest-compiile
* @param {Request#SubRequest} subRequest - the sub request
*/
/**
* compile the query
* @param {OverpassFrontend#Context} context - Current context
* @return {Request#SubRequest} - the compiled query
*/
compileQuery (context) {
const subRequest = this._compileQuery(context)
this.emit('subrequest-compile', subRequest)
this.callCount++
return subRequest
}
/**
* receive an object from OverpassFronted -> enter to cache, return to caller
* @param {OverpassObject} ob - Object which has been received
* @param {Request#SubRequest} subRequest - sub request which is being handled right now
* @param {int} partIndex - Which part of the subRequest is being received
*/
receiveObject (ob) {
this.count++
}
/**
* SubRequest got finished
* @event Request#subrequest-finished
* @param {Request#SubRequest} subRequest - the sub request
*/
/**
* the current subrequest is finished -> update caches, check whether request is finished
* @param {Request#SubRequest} subRequest - the current sub request
*/
finishSubRequest (subRequest) {
this.emit('subrequest-finish', subRequest)
}
}
ee(Request.prototype)
module.exports = Request