-
Notifications
You must be signed in to change notification settings - Fork 31
Expand file tree
/
Copy pathsample
More file actions
executable file
·75 lines (68 loc) · 1.84 KB
/
sample
File metadata and controls
executable file
·75 lines (68 loc) · 1.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#!/usr/bin/env node
var fs = require('fs')
var exec = require('child_process').exec
var split = require('split')
var tilebelt = require('tilebelt')
var tiles = process.argv[2]
var trainSize = process.argv[3]
var zoomLevel = (process.argv[4] || '').trim()
var sample
var i = -1
countLines(tiles, function (err, total) {
if (err) { throw err }
fs.createReadStream(tiles)
.pipe(split())
.on('data', function (line) {
if (!sample) {
if (zoomLevel) {
var realZoom = parseInt(line.split(' ')[1], 10)
total = total * Math.pow(4, zoomLevel - realZoom)
}
sample = []
while (sample.length < trainSize && sample.length < total) {
var l = Math.floor(Math.random() * total)
if (sample.indexOf(l) < 0) { sample.push(l) }
}
sample.sort((a, b) => (a - b))
}
if (zoomLevel) {
line = line.split(' ')
var tile = [line[2], line[3], line[1]].map(Number) // zxy -> xyz
var tiles = getDescendants(tile, zoomLevel)
tiles.forEach(function (tile) {
if (sample[0] === i++) {
console.log([line[0], tile[2], tile[0], tile[1]].join(' ')) // xyz -> file z x y
sample.shift()
}
})
} else {
if (sample[0] === i++) {
console.log(line)
sample.shift()
}
}
})
})
function getDescendants (tile, zoom) {
var z = tile[2]
var tiles = [tile]
while (z < zoom) {
var c = 0
var nextTiles = new Array(tiles.length * 4)
for (var i = 0; i < tiles.length; i++) {
var children = tilebelt.getChildren(tiles[i])
for (var j = 0; j < 4; j++) {
nextTiles[c++] = children[j]
}
}
tiles = nextTiles
z++
}
return tiles
}
function countLines (file, cb) {
exec('wc -l ' + file, function (err, result) {
if (err) { return cb(err) }
cb(null, +result.trim().split(' ')[0])
})
}