1 | import adiffParser from 'osm-adiff-parser-saxjs';
|
2 | import jsonParser from 'real-changesets-parser';
|
3 | import { query } from './query';
|
4 | import { config } from './config';
|
5 |
|
6 | export function getChangeset(changesetID, overpassBase = config.overpassBase) {
|
7 | return query(changesetID).then(changeset => {
|
8 | var url = config.S3_URL + changesetID + '.json';
|
9 | return fetch(url)
|
10 | .then(r => {
|
11 | if (r.ok) return r.json();
|
12 |
|
13 | return Promise.reject();
|
14 | })
|
15 | .then(r => {
|
16 | var geojson = jsonParser(r);
|
17 | var featureMap = getFeatureMap(geojson);
|
18 | var ret = {
|
19 | geojson: geojson,
|
20 | featureMap: featureMap,
|
21 | changeset: changeset
|
22 | };
|
23 | return ret;
|
24 | })
|
25 | .catch(() => fetchFromOverPass(changesetID, changeset, overpassBase));
|
26 | });
|
27 | }
|
28 |
|
29 | function fetchFromOverPass(changesetID, changeset, overpassBase) {
|
30 | var data = getDataParam(changeset);
|
31 | var bbox = getBboxParam(changeset.bbox);
|
32 | var url = overpassBase + '?data=' + data + '&bbox=' + bbox;
|
33 |
|
34 | return fetch(url, {
|
35 | 'Response-Type': 'application/osm3s+xml'
|
36 | })
|
37 | .then(r => r.text())
|
38 | .then(response => {
|
39 | return new Promise((res, rej) => {
|
40 | adiffParser(response, null, (err, json) => {
|
41 | if (err) {
|
42 | return rej({
|
43 | msg: 'Failed to parser adiff xml.',
|
44 | error: err
|
45 | });
|
46 | }
|
47 | var geojson = jsonParser({
|
48 | elements: json[changesetID]
|
49 | });
|
50 | var featureMap = getFeatureMap(geojson);
|
51 |
|
52 | var ret = {
|
53 | geojson: geojson,
|
54 | featureMap: featureMap,
|
55 | changeset: changeset
|
56 | };
|
57 | return res(ret);
|
58 | });
|
59 | });
|
60 | })
|
61 | .catch(err =>
|
62 | Promise.reject({
|
63 | msg: 'Overpass query failed.',
|
64 | error: err
|
65 | })
|
66 | );
|
67 | }
|
68 |
|
69 | function getDataParam(c) {
|
70 | return (
|
71 | '[out:xml][adiff:%22' +
|
72 | c.from.toString() +
|
73 | ',%22,%22' +
|
74 | c.to.toString() +
|
75 | '%22];(node(bbox)(changed);way(bbox)(changed);relation(bbox)(changed));out%20meta%20geom(bbox);'
|
76 | );
|
77 | }
|
78 |
|
79 | function getBboxParam(bbox) {
|
80 | return [bbox.left, bbox.bottom, bbox.right, bbox.top].join(',');
|
81 | }
|
82 |
|
83 | function getFeatureMap(geojson) {
|
84 | var features = geojson.features;
|
85 | var featureMap = {};
|
86 |
|
87 | for (var i = 0, len = features.length; i < len; i++) {
|
88 | var id = features[i].properties.id;
|
89 | featureMap[id] = featureMap[id] || [];
|
90 | featureMap[id].push(features[i]);
|
91 | }
|
92 |
|
93 | return featureMap;
|
94 | }
|