-
Notifications
You must be signed in to change notification settings - Fork 191
/
Copy pathwrite.js
63 lines (52 loc) · 1.68 KB
/
write.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
var types = require('./types');
var dbf = require('dbf');
var prj = require('./prj');
var pointWriter = require('./points');
var polyWriter = require('./poly');
var writers = {
1: pointWriter,
5: polyWriter,
3: polyWriter
};
module.exports = write;
// Low-level writing interface
function write(rows, geometry_type, geometries, callback) {
var TYPE = types.geometries[geometry_type];
var writer = writers[TYPE];
var parts = writer.parts(geometries, TYPE);
var shpLength = 100 + (parts - geometries.length) * 4 + writer.shpLength(geometries);
var shxLength = 100 + writer.shxLength(geometries);
var shpBuffer = new ArrayBuffer(shpLength);
var shpView = new DataView(shpBuffer);
var shxBuffer = new ArrayBuffer(shxLength);
var shxView = new DataView(shxBuffer);
var extent = writer.extent(geometries);
writeHeader(shpView, TYPE);
writeHeader(shxView, TYPE);
writeExtent(extent, shpView);
writeExtent(extent, shxView);
writer.write(geometries, extent,
new DataView(shpBuffer, 100),
new DataView(shxBuffer, 100),
TYPE);
shpView.setInt32(24, shpLength / 2);
shxView.setInt32(24, (50 + geometries.length * 4));
var dbfBuf = dbf.structure(rows);
callback(null, {
shp: shpView,
shx: shxView,
dbf: dbfBuf,
prj: prj
});
}
function writeHeader(view, TYPE) {
view.setInt32(0, 9994);
view.setInt32(28, 1000, true);
view.setInt32(32, TYPE, true);
}
function writeExtent(extent, view) {
view.setFloat64(36, extent.xmin, true);
view.setFloat64(44, extent.ymin, true);
view.setFloat64(52, extent.xmax, true);
view.setFloat64(60, extent.ymax, true);
}