Stephan Bösch-Plepelits
6 years ago
35 changed files with 331 additions and 33 deletions
-
1index.php
-
3lang/ast.json
-
3lang/ca.json
-
3lang/cs.json
-
3lang/da.json
-
3lang/de.json
-
3lang/el.json
-
5lang/en.json
-
3lang/es.json
-
3lang/et.json
-
3lang/fr.json
-
3lang/hu.json
-
3lang/it.json
-
3lang/ja.json
-
3lang/nl.json
-
3lang/pl.json
-
3lang/pt-br.json
-
3lang/pt.json
-
3lang/ro.json
-
3lang/ru.json
-
3lang/sr.json
-
3lang/template.json
-
3lang/uk.json
-
2lib/modulekit/form
-
1package.json
-
4src/CategoryBase.js
-
19src/CategoryIndex.js
-
8src/CategoryOverpass.js
-
34src/ExportGeoJSON.js
-
24src/ExportOSMJSON.js
-
20src/ExportOSMXML.js
-
9src/chunkSplit.js
-
148src/exportAll.js
-
21src/index.js
-
5style.css
@ -1 +1 @@ |
|||||
Subproject commit 8a2d3015ec181b14441037a79e7db3869453b135 |
|
||||
|
Subproject commit 5d39b2f61b7eda9a635414acaeb3c4e0dc524490 |
@ -0,0 +1,34 @@ |
|||||
|
class ExportGeoJSON { |
||||
|
constructor (conf) { |
||||
|
this.conf = conf |
||||
|
} |
||||
|
|
||||
|
each (ob, callback) { |
||||
|
ob.object.exportGeoJSON(this.conf, callback) |
||||
|
} |
||||
|
|
||||
|
finishOne (object) { |
||||
|
return { |
||||
|
content: JSON.stringify(object, null, ' '), |
||||
|
fileType: 'application/json', |
||||
|
extension: 'geojson' |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
finish (list) { |
||||
|
if (list.length) { |
||||
|
list = { |
||||
|
type: 'FeatureCollection', |
||||
|
features: list |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return { |
||||
|
content: JSON.stringify(list, null, ' '), |
||||
|
fileType: 'application/json', |
||||
|
extension: 'geojson' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ExportGeoJSON |
@ -0,0 +1,24 @@ |
|||||
|
class ExportOSMXML { |
||||
|
constructor (conf) { |
||||
|
this.conf = conf |
||||
|
this.elements = {} |
||||
|
} |
||||
|
|
||||
|
each (ob, callback) { |
||||
|
ob.object.exportOSMJSON(this.conf, this.elements, callback) |
||||
|
} |
||||
|
|
||||
|
finish (list) { |
||||
|
return { |
||||
|
content: JSON.stringify({ |
||||
|
version: '0.6', |
||||
|
generator: 'OpenStreetBrowser', |
||||
|
elements: Object.values(this.elements) |
||||
|
}, null, ' '), |
||||
|
fileType: 'application/json', |
||||
|
extension: 'osm.json' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ExportOSMXML |
@ -0,0 +1,20 @@ |
|||||
|
class ExportOSMXML { |
||||
|
constructor (conf) { |
||||
|
this.conf = conf |
||||
|
this.parentNode = document.createElement('osm') |
||||
|
} |
||||
|
|
||||
|
each (ob, callback) { |
||||
|
ob.object.exportOSMXML(this.conf, this.parentNode, callback) |
||||
|
} |
||||
|
|
||||
|
finish (list) { |
||||
|
return { |
||||
|
content: '<?xml version="1.0" encoding="UTF-8"?><osm version="0.6" generator="OpenStreetBrowser">' + this.parentNode.innerHTML + '</osm>', |
||||
|
fileType: 'application/xml', |
||||
|
extension: 'osm.xml' |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
module.exports = ExportOSMXML |
@ -0,0 +1,9 @@ |
|||||
|
module.exports = function chunkSplit (data, size=1000) { |
||||
|
let result = [] |
||||
|
|
||||
|
for (let i = 0; i < data.length; i += size) { |
||||
|
result.push(data.slice(i, i + size)) |
||||
|
} |
||||
|
|
||||
|
return result |
||||
|
} |
@ -0,0 +1,148 @@ |
|||||
|
const tabs = require('modulekit-tabs') |
||||
|
const async = require('async') |
||||
|
const FileSaver = require('file-saver') |
||||
|
|
||||
|
const chunkSplit = require('./chunkSplit') |
||||
|
|
||||
|
const types = { |
||||
|
GeoJSON: require('./ExportGeoJSON'), |
||||
|
OSMXML: require('./ExportOSMXML'), |
||||
|
OSMJSON: require('./ExportOSMJSON') |
||||
|
} |
||||
|
|
||||
|
let tab |
||||
|
let formExport |
||||
|
|
||||
|
function prepareDownload (callback) { |
||||
|
let conf = formExport.get_data() |
||||
|
|
||||
|
global.baseCategory.allMapFeatures((err, data) => { |
||||
|
if (err) { |
||||
|
return callback(err) |
||||
|
} |
||||
|
|
||||
|
createDownload(conf, data, callback) |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
function createDownload (conf, data, callback) { |
||||
|
let type = types[conf.type] |
||||
|
let exportFun = new type(conf) |
||||
|
|
||||
|
let chunks = chunkSplit(data, 1000) |
||||
|
let parentNode |
||||
|
|
||||
|
async.mapLimit( |
||||
|
chunks, |
||||
|
1, |
||||
|
(chunk, done) => { |
||||
|
async.map(chunk, |
||||
|
(ob, done) => exportFun.each(ob, done), |
||||
|
(err, result) => { |
||||
|
global.setTimeout(() => done(err, result), 0) |
||||
|
} |
||||
|
) |
||||
|
}, |
||||
|
(err, data) => { |
||||
|
if (err) { |
||||
|
return callback(err) |
||||
|
} |
||||
|
|
||||
|
data = data.reduce((all, chunk) => all.concat(chunk)) |
||||
|
|
||||
|
let result = exportFun.finish(data) |
||||
|
|
||||
|
var blob = new Blob([ result.content ], { type: result.fileType + ';charset=utf-8' }) |
||||
|
FileSaver.saveAs(blob, 'openstreetbrowser.' + result.extension) |
||||
|
|
||||
|
callback() |
||||
|
} |
||||
|
) |
||||
|
} |
||||
|
|
||||
|
function formDef () { |
||||
|
let values = {} |
||||
|
Object.keys(types).forEach(type => |
||||
|
values[type] = lang('export:' + type) |
||||
|
) |
||||
|
|
||||
|
return { |
||||
|
type: { |
||||
|
name: 'Type', |
||||
|
type: 'radio', |
||||
|
values, |
||||
|
default: Object.keys(types)[0] |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
register_hook('init', function () { |
||||
|
tab = new tabs.Tab({ |
||||
|
id: 'export' |
||||
|
}) |
||||
|
global.tabs.add(tab) |
||||
|
|
||||
|
tab.header.innerHTML = '<i class="fa fa-download" aria-hidden="true"></i>' |
||||
|
tab.header.title = lang('export-all') |
||||
|
tab.content.innerHTML = '<h3>' + lang('export-all') + '</h3>' |
||||
|
|
||||
|
formExport = new form('export', formDef()) |
||||
|
|
||||
|
let domForm = document.createElement('form') |
||||
|
tab.content.appendChild(domForm) |
||||
|
formExport.show(domForm) |
||||
|
|
||||
|
let submit = document.createElement('input') |
||||
|
submit.type = 'submit' |
||||
|
submit.value = lang('export-prepare') |
||||
|
submit.onclick = () => { |
||||
|
let progressIndicator = document.createElement('div') |
||||
|
progressIndicator.innerHTML = '<i class="fa fa-spinner fa-pulse fa-fw"></i> ' + lang('loading') |
||||
|
tab.content.appendChild(progressIndicator) |
||||
|
submit.style.display = 'none' |
||||
|
|
||||
|
prepareDownload((err) => { |
||||
|
if (err) { |
||||
|
alert(err) |
||||
|
} |
||||
|
|
||||
|
submit.style.display = 'block' |
||||
|
tab.content.removeChild(progressIndicator) |
||||
|
tab.unselect() |
||||
|
}) |
||||
|
} |
||||
|
tab.content.appendChild(submit) |
||||
|
|
||||
|
tab.on('select', () => { |
||||
|
formExport.resize() |
||||
|
}) |
||||
|
}) |
||||
|
|
||||
|
module.exports = (data, div) => { |
||||
|
let formExport = new form('exportOne', formDef()) |
||||
|
|
||||
|
let domForm = document.createElement('form') |
||||
|
div.appendChild(domForm) |
||||
|
formExport.show(domForm) |
||||
|
|
||||
|
let submit = document.createElement('input') |
||||
|
submit.type = 'submit' |
||||
|
submit.value = lang('export-prepare') |
||||
|
submit.onclick = () => { |
||||
|
let progressIndicator = document.createElement('div') |
||||
|
progressIndicator.innerHTML = '<i class="fa fa-spinner fa-pulse fa-fw"></i> ' + lang('loading') |
||||
|
div.appendChild(progressIndicator) |
||||
|
submit.style.display = 'none' |
||||
|
|
||||
|
let conf = formExport.get_data() |
||||
|
createDownload(conf, [ data ], (err) => { |
||||
|
if (err) { |
||||
|
alert(err) |
||||
|
} |
||||
|
|
||||
|
submit.style.display = 'block' |
||||
|
div.removeChild(progressIndicator) |
||||
|
}) |
||||
|
} |
||||
|
div.appendChild(submit) |
||||
|
} |
Write
Preview
Loading…
Cancel
Save
Reference in new issue