-
Notifications
You must be signed in to change notification settings - Fork 1
/
index.js
122 lines (108 loc) · 2.73 KB
/
index.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
var mkdirp = require('mkdirp')
var tiles = require('mapnik-tiles')
var path = require('path')
var fs = require('fs')
var pkg = require('./package')
var plugin = {
name: 'tiles',
type: 'plugin',
version: pkg.version
}
/**
* retrieves a tile
*
* @param {object} params
* @param {object} geojson
* @param {Function} callback
*/
function getTile (params, geojson, callback) {
var x = parseInt(params.x, 10)
var y = parseInt(params.y, 10)
var z = parseInt(params.z, 10)
var key = params.key
var format = params.format
var options = {
name: params.name,
dir: params.dir
}
if (!params.x || !params.y || !params.z || !format || !key) {
callback('Missing parameters', null)
} else {
// check the cache - the local file system
checkFS(x, y, z, key, format, geojson, options, function (err, file) {
if (file) {
callback(err, file)
} else {
callback(err, null)
}
})
}
}
/**
* checks if a tile already exists in the file system
*
* @param {number} x
* @param {number} y
* @param {number} z
* @param {string} key
* @param {string} format
* @param {object} geojson
* @param {object} options
* @param {function} callback
*/
function checkFS (x, y, z, key, format, geojson, options, callback) {
var p = path.join(options.dir, 'tiles', key, format, '' + z, '' + x)
var file = path.join(p, y + '.' + format)
options.size = options.size || 256
mkdirp(p, function () {
if (!fs.existsSync(file)) {
var params = {
format: format,
name: options.name,
z: z,
x: x,
y: y
}
stashTile(file, geojson, params, function (err, newfile) {
callback(err, newfile)
})
} else {
// file already exists
callback(null, file)
}
})
}
/**
* create a new tile using mapnik-tiles
* for json it just writes to disk and returns
* for png, pbf, or utf, it calls mapnik-tiles
*
* @param {string} file
* @param {object} geojson
* @param {object} params
* @param {function} callback
*/
function stashTile (file, geojson, params, callback) {
// for geojson tile just create it and return it
if (params.format === 'json') {
delete geojson.info
delete geojson.name
geojson.type = 'FeatureCollection'
fs.writeFile(file, JSON.stringify(geojson), function () {
callback(null, file)
})
// for any other format call mapnik-tiles
} else {
tiles.generate(geojson, params, function (err, tileBuffer) {
if (err) return callback(err, null)
fs.writeFile(file, tileBuffer, function (err) {
if (err) return callback(err)
callback(null, file)
})
})
}
}
plugin.stashTile = stashTile
plugin.checkFS = checkFS
plugin.getTile = getTile
module.exports = plugin