Igor Eliezer
6 years ago
committed by
GitHub
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
42 changed files with 607 additions and 103 deletions
-
10README.md
-
24doc/Icons.md
-
5index.php
-
7lang/ast.json
-
7lang/ca.json
-
7lang/cs.json
-
7lang/da.json
-
7lang/de.json
-
7lang/el.json
-
7lang/en.json
-
7lang/es.json
-
7lang/et.json
-
7lang/fr.json
-
7lang/hu.json
-
7lang/it.json
-
7lang/ja.json
-
7lang/nl.json
-
7lang/pl.json
-
7lang/pt-br.json
-
7lang/pt.json
-
7lang/ro.json
-
7lang/ru.json
-
7lang/sr.json
-
7lang/template.json
-
7lang/uk.json
-
2lib/modulekit/form
-
2modulekit.php
-
11package.json
-
12repo.php
-
4src/CategoryBase.js
-
19src/CategoryIndex.js
-
21src/CategoryOverpass.js
-
34src/ExportGeoJSON.js
-
24src/ExportOSMJSON.js
-
20src/ExportOSMXML.js
-
33src/RepositoryGit.php
-
96src/addCategories.js
-
9src/chunkSplit.js
-
153src/exportAll.js
-
21src/index.js
-
37src/maki.js
-
19style.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 (!this.conf.singleFeature) { |
|||
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,153 @@ |
|||
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) |
|||
} |
|||
|
|||
if (data.length !== 0) { |
|||
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() |
|||
|
|||
conf.singleFeature = true |
|||
|
|||
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