UNPKG

2.72 kBJavaScriptView Raw
1import adiffParser from 'osm-adiff-parser-saxjs';
2import jsonParser from 'real-changesets-parser';
3import { query } from './query';
4import { config } from './config';
5
6export 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 // Fallback to overpass
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
29function 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
69function 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
79function getBboxParam(bbox) {
80 return [bbox.left, bbox.bottom, bbox.right, bbox.top].join(',');
81}
82
83function 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}