1 | var collect = require('collect-stream')
|
2 | var pumpify = require('pumpify')
|
3 | var mapStream = require('through2-map')
|
4 | var collectTransform = require('collect-transform-stream')
|
5 | var defork = require('osm-p2p-defork')
|
6 | var through = require('through2')
|
7 |
|
8 | var refs2nodes = require('../lib/util').refs2nodes
|
9 | var checkRefExist = require('../lib/check_ref_ex.js')
|
10 |
|
11 | module.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]]]
|
20 |
|
21 |
|
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 |
|
35 |
|
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 |
|
52 | function deforkStream () {
|
53 | return collectTransform(function (res) {
|
54 | return defork(res).sort(cmpType)
|
55 | })
|
56 | }
|
57 |
|
58 | var typeOrder = { node: 0, way: 1, relation: 2 }
|
59 | function cmpType (a, b) {
|
60 | return typeOrder[a.type] - typeOrder[b.type]
|
61 | }
|