-
Notifications
You must be signed in to change notification settings - Fork 2
/
parser.js
78 lines (78 loc) · 3.63 KB
/
parser.js
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
76
77
78
self.addEventListener('message', function(e) {
self.postMessage('parsing')
var view = new Uint8Array(e.data.data)
var approxLength = ~~(view.length / 15 / e.data.numWorkers); // 15 -> empirical guestimate (i.e. number of lines in tiles-*.txt divided by file size in bytes)
var dataX = Array.apply(null, new Array(e.data.numWorkers)).map(function() {return new Uint32Array(approxLength)})
var dataY = Array.apply(null, new Array(e.data.numWorkers)).map(function() {return new Uint32Array(approxLength)})
var dataZ = Array.apply(null, new Array(e.data.numWorkers)).map(function() {return new Uint8Array(approxLength)})
var dataC = Array.apply(null, new Array(e.data.numWorkers)).map(function() {return new Uint32Array(approxLength)})
var dataI = Array.apply(null, new Array(e.data.numWorkers)).map(function() {return new Uint32Array(approxLength)})
var maxCountByZoom = {}
var currentInt = 0
var currentCoords = [0,0,0]
var currentCoordsIndex = 0
var currentIndex = Array.apply(null, new Array(e.data.numWorkers)).map(function() {return 0})
var appendLine = function() {
var bin = ~~(currentCoords[1]/256) % e.data.numWorkers
var binCurrentIndex = currentIndex[bin]
if (binCurrentIndex >= approxLength) {
// we need to make our data arrays a bit bigger to accomodate all data
console.log("expand internal data arrays")
function expand(oldData, newLength, ArrayType) {
var temp = new ArrayType(newLength)
temp.set(oldData)
return temp
}
approxLength = ~~(approxLength * 1.2)
dataX[bin] = expand(dataX[bin], approxLength, Uint32Array)
dataY[bin] = expand(dataY[bin], approxLength, Uint32Array)
dataZ[bin] = expand(dataZ[bin], approxLength, Uint8Array)
dataC[bin] = expand(dataC[bin], approxLength, Uint32Array)
dataI[bin] = expand(dataI[bin], approxLength, Uint32Array)
}
dataX[bin][binCurrentIndex] = currentCoords[1]
dataY[bin][binCurrentIndex] = currentCoords[2]
dataZ[bin][binCurrentIndex] = currentCoords[0]
dataC[bin][binCurrentIndex] = currentInt
dataI[bin][binCurrentIndex] = binCurrentIndex
if (currentInt > (maxCountByZoom[currentCoords[0]] || -1)) {
maxCountByZoom[currentCoords[0]] = currentInt
}
currentIndex[bin]++;
currentCoordsIndex = 0
currentInt = 0
}
for (var i = 0; i<view.length; i++) {
switch (view[i]) {
default: // 0-9
currentInt = currentInt*10 + (view[i] & 0x0f)
break;
case 10: // '\n'
appendLine()
break;
case 32: // ' '
case 47: // '/'
currentCoords[currentCoordsIndex++] = currentInt
currentInt = 0
break;
}
}
appendLine()
dataX = dataX.map(function(d,i) {return d.slice(0, currentIndex[i]-1).buffer})
dataY = dataY.map(function(d,i) {return d.slice(0, currentIndex[i]-1).buffer})
dataZ = dataZ.map(function(d,i) {return d.slice(0, currentIndex[i]-1).buffer})
dataC = dataC.map(function(d,i) {return d.slice(0, currentIndex[i]-1).buffer})
dataI = dataI.map(function(d,i) {return d.slice(0, currentIndex[i]-1).buffer})
self.postMessage(
dataX.map(function(_, index) {return {
x: dataX[index],
y: dataY[index],
z: dataZ[index],
count: dataC[index],
maxCountByZoom: maxCountByZoom,
indices: dataI[index]
}}),
[dataX, dataY, dataZ, dataC, dataI].reduce(function (a,b) {return a.concat(b)}, [])
)
self.postMessage('build spatial index')
}, false)