mirror of
https://github.com/rastapasta/mapscii.git
synced 2024-11-21 23:53:08 +01:00
Decaffeinate remaining methods of the Tile class
This commit is contained in:
parent
0353effa67
commit
bfd5c54fa4
153
src/Tile.coffee
153
src/Tile.coffee
@ -1,153 +0,0 @@
|
||||
###
|
||||
termap - Terminal Map Viewer
|
||||
by Michael Strassburger <codepoet@cpan.org>
|
||||
|
||||
Handling of and access to single VectorTiles
|
||||
###
|
||||
|
||||
VectorTile = require('@mapbox/vector-tile').VectorTile
|
||||
Protobuf = require 'pbf'
|
||||
Promise = require 'bluebird'
|
||||
zlib = require 'zlib'
|
||||
rbush = require 'rbush'
|
||||
x256 = require 'x256'
|
||||
earcut = require 'earcut'
|
||||
|
||||
config = require "./config"
|
||||
utils = require "./utils"
|
||||
|
||||
class Tile
|
||||
layers: {}
|
||||
|
||||
constructor: (@styler) ->
|
||||
|
||||
load: (buffer) ->
|
||||
@_unzipIfNeeded buffer
|
||||
.then (buffer) => @_loadTile buffer
|
||||
.then => @_loadLayers()
|
||||
.then => this
|
||||
|
||||
_loadTile: (buffer) ->
|
||||
@tile = new VectorTile new Protobuf buffer
|
||||
|
||||
_unzipIfNeeded: (buffer) ->
|
||||
new Promise (resolve, reject) =>
|
||||
if @_isGzipped buffer
|
||||
zlib.gunzip buffer, (err, data) ->
|
||||
return reject err if err
|
||||
resolve data
|
||||
else
|
||||
resolve buffer
|
||||
|
||||
_isGzipped: (buffer) ->
|
||||
buffer.slice(0,2).indexOf(Buffer.from([0x1f, 0x8b])) is 0
|
||||
|
||||
_loadLayers: () ->
|
||||
layers = {}
|
||||
colorCache = {}
|
||||
|
||||
for name, layer of @tile.layers
|
||||
nodes = []
|
||||
#continue if name is "water"
|
||||
for i in [0...layer.length]
|
||||
# TODO: caching of similar attributes to avoid looking up the style each time
|
||||
#continue if @styler and not @styler.getStyleFor layer, feature
|
||||
|
||||
feature = layer.feature i
|
||||
feature.properties.$type = type = [undefined, "Point", "LineString", "Polygon"][feature.type]
|
||||
|
||||
if @styler
|
||||
style = @styler.getStyleFor name, feature
|
||||
continue unless style
|
||||
|
||||
color =
|
||||
style.paint['line-color'] or
|
||||
style.paint['fill-color'] or
|
||||
style.paint['text-color']
|
||||
|
||||
# TODO: style zoom stops handling
|
||||
if color instanceof Object
|
||||
color = color.stops[0][1]
|
||||
|
||||
colorCode = colorCache[color] or colorCache[color] = x256 utils.hex2rgb color
|
||||
|
||||
# TODO: monkey patching test case for tiles with a reduced extent 4096 / 8 -> 512
|
||||
# use feature.loadGeometry() again as soon as we got a 512 extent tileset
|
||||
geometries = feature.loadGeometry() #@_reduceGeometry feature, 8
|
||||
|
||||
sort = feature.properties.localrank or feature.properties.scalerank
|
||||
label = if style.type is "symbol"
|
||||
feature.properties["name_"+config.language] or
|
||||
feature.properties.name_en or
|
||||
feature.properties.name or
|
||||
feature.properties.house_num
|
||||
else
|
||||
undefined
|
||||
|
||||
if style.type is "fill"
|
||||
nodes.push @_addBoundaries true,
|
||||
# id: feature.id
|
||||
layer: name
|
||||
style: style
|
||||
label: label
|
||||
sort: sort
|
||||
points: geometries
|
||||
color: colorCode
|
||||
|
||||
else
|
||||
|
||||
for points in geometries
|
||||
nodes.push @_addBoundaries false,
|
||||
# id: feature.id
|
||||
layer: name
|
||||
style: style
|
||||
label: label
|
||||
sort: sort
|
||||
points: points
|
||||
color: colorCode
|
||||
|
||||
|
||||
tree = rbush 18
|
||||
tree.load nodes
|
||||
|
||||
layers[name] =
|
||||
extent: layer.extent
|
||||
tree: tree
|
||||
|
||||
@layers = layers
|
||||
|
||||
_addBoundaries: (deep, data) ->
|
||||
minX = Infinity
|
||||
maxX = -Infinity
|
||||
minY = Infinity
|
||||
maxY = -Infinity
|
||||
|
||||
for p in (if deep then data.points[0] else data.points)
|
||||
minX = p.x if p.x < minX
|
||||
maxX = p.x if p.x > maxX
|
||||
minY = p.y if p.y < minY
|
||||
maxY = p.y if p.y > maxY
|
||||
|
||||
data.minX = minX
|
||||
data.maxX = maxX
|
||||
data.minY = minY
|
||||
data.maxY = maxY
|
||||
data
|
||||
|
||||
_reduceGeometry: (feature, factor) ->
|
||||
for points, i in feature.loadGeometry()
|
||||
reduced = []
|
||||
last = null
|
||||
for point in points
|
||||
p =
|
||||
x: Math.floor point.x/factor
|
||||
y: Math.floor point.y/factor
|
||||
|
||||
if last and last.x is p.x and last.y is p.y
|
||||
continue
|
||||
|
||||
reduced.push last = p
|
||||
|
||||
reduced
|
||||
|
||||
module.exports = Tile
|
38
src/Tile.js
38
src/Tile.js
@ -53,12 +53,11 @@ class Tile {
|
||||
}
|
||||
|
||||
_loadLayers() {
|
||||
var color, colorCache, colorCode, k, layers, len, nodes, points, style, tree;
|
||||
layers = {};
|
||||
colorCache = {};
|
||||
const layers = {};
|
||||
const colorCache = {};
|
||||
for (const name in this.tile.layers) {
|
||||
const layer = this.tile.layers[name];
|
||||
nodes = [];
|
||||
const nodes = [];
|
||||
//continue if name is 'water'
|
||||
for (let i = 0; i < layer.length; i++) {
|
||||
// TODO: caching of similar attributes to avoid looking up the style each time
|
||||
@ -66,13 +65,14 @@ class Tile {
|
||||
|
||||
const feature = layer.feature(i);
|
||||
feature.properties.$type = [undefined, 'Point', 'LineString', 'Polygon'][feature.type];
|
||||
let style;
|
||||
if (this.styler) {
|
||||
style = this.styler.getStyleFor(name, feature);
|
||||
if (!style) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
color = (
|
||||
let color = (
|
||||
style.paint['line-color'] ||
|
||||
style.paint['fill-color'] ||
|
||||
style.paint['text-color']
|
||||
@ -81,7 +81,7 @@ class Tile {
|
||||
if (color instanceof Object) {
|
||||
color = color.stops[0][1];
|
||||
}
|
||||
colorCode = colorCache[color] || (colorCache[color] = x256(utils.hex2rgb(color)));
|
||||
const colorCode = colorCache[color] || (colorCache[color] = x256(utils.hex2rgb(color)));
|
||||
// TODO: monkey patching test case for tiles with a reduced extent 4096 / 8 -> 512
|
||||
// use feature.loadGeometry() again as soon as we got a 512 extent tileset
|
||||
const geometries = feature.loadGeometry(); //@_reduceGeometry feature, 8
|
||||
@ -98,10 +98,9 @@ class Tile {
|
||||
color: colorCode,
|
||||
}));
|
||||
} else {
|
||||
for (k = 0, len = geometries.length; k < len; k++) {
|
||||
points = geometries[k];
|
||||
for (const points of geometries) {
|
||||
nodes.push(this._addBoundaries(false, {
|
||||
// id: feature.id
|
||||
//id: feature.id,
|
||||
layer: name,
|
||||
style,
|
||||
label,
|
||||
@ -112,11 +111,11 @@ class Tile {
|
||||
}
|
||||
}
|
||||
}
|
||||
tree = rbush(18);
|
||||
const tree = rbush(18);
|
||||
tree.load(nodes);
|
||||
layers[name] = {
|
||||
extent: layer.extent,
|
||||
tree: tree,
|
||||
tree,
|
||||
};
|
||||
}
|
||||
return this.layers = layers;
|
||||
@ -142,16 +141,13 @@ class Tile {
|
||||
}
|
||||
|
||||
_reduceGeometry(feature, factor) {
|
||||
var i, j, k, last, len, len1, p, point, points, reduced, ref, results;
|
||||
ref = feature.loadGeometry();
|
||||
results = [];
|
||||
for (i = j = 0, len = ref.length; j < len; i = ++j) {
|
||||
points = ref[i];
|
||||
reduced = [];
|
||||
last = null;
|
||||
for (k = 0, len1 = points.length; k < len1; k++) {
|
||||
point = points[k];
|
||||
p = {
|
||||
const results = [];
|
||||
const geometries = feature.loadGeometry();
|
||||
for (const points of geometries) {
|
||||
const reduced = [];
|
||||
let last;
|
||||
for (const point of points) {
|
||||
const p = {
|
||||
x: Math.floor(point.x / factor),
|
||||
y: Math.floor(point.y / factor)
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user