UNPKG

1.63 kBJavaScriptView Raw
1var collect = require('collect-stream')
2var pumpify = require('pumpify')
3var mapStream = require('through2-map')
4var collectTransform = require('collect-transform-stream')
5var defork = require('osm-p2p-defork')
6var through = require('through2')
7
8var refs2nodes = require('../lib/util').refs2nodes
9var checkRefExist = require('../lib/check_ref_ex.js')
10
11module.exports = function (osm) {
12 return function getMap (bbox, opts, cb) {
13 if (typeof opts === 'function') {
14 cb = opts
15 opts = {}
16 }
17 opts.forks = opts.forks || false
18
19 var query = [[bbox[1], bbox[3]], [bbox[0], bbox[2]]] // left,bottom,right,top
20
21 // For now, filter deletions (until downstream can handle them)
22 var deletionFilter = through.obj(function (chunk, enc, next) {
23 if (!chunk.deleted) next(null, chunk)
24 else next()
25 })
26
27 var pipeline = [
28 osm.queryStream(query, opts),
29 deletionFilter,
30 checkRefExist(osm),
31 mapStream.obj(refs2nodes)
32 ]
33
34 // If forks ought to be filtered out, add another step to the pipeline that
35 // does so.
36 if (!opts.forks) {
37 pipeline.push(deforkStream())
38 }
39
40 var queryStreamJson = pumpify.obj.apply(this, pipeline)
41 if (cb) {
42 collect(queryStreamJson, function (err, elements) {
43 if (err) return cb(err)
44 cb(null, elements)
45 })
46 } else {
47 return queryStreamJson
48 }
49 }
50}
51
52function deforkStream () {
53 return collectTransform(function (res) {
54 return defork(res).sort(cmpType)
55 })
56}
57
58var typeOrder = { node: 0, way: 1, relation: 2 }
59function cmpType (a, b) {
60 return typeOrder[a.type] - typeOrder[b.type]
61}