mirror of
https://github.com/sbrl/terrain50-cli.git
synced 2024-11-26 07:33:00 +00:00
Terrain50Renderer: update to add class binning support
This commit is contained in:
parent
6ec176d895
commit
e11c2e0f3d
1 changed files with 25 additions and 6 deletions
|
@ -16,6 +16,11 @@ class Terrain50Renderer {
|
||||||
"#efefef",
|
"#efefef",
|
||||||
]).mode('lrgb');
|
]).mode('lrgb');
|
||||||
this.colour_nodata = chroma("#f97153").rgba();
|
this.colour_nodata = chroma("#f97153").rgba();
|
||||||
|
|
||||||
|
thiis.colour_scale_classes = chroma.scale([
|
||||||
|
"#00ff00",
|
||||||
|
"#ff0000"
|
||||||
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -24,7 +29,7 @@ class Terrain50Renderer {
|
||||||
* You probably want the .render() method, which returns a buffer
|
* You probably want the .render() method, which returns a buffer
|
||||||
* containing a png-encoded image.
|
* containing a png-encoded image.
|
||||||
* @param {Terrain50} terrain The Terrain50 object instance to render.
|
* @param {Terrain50} terrain The Terrain50 object instance to render.
|
||||||
* @param {[number, number][]} classes The classes to bin the values into. If not specified, values are not binned into classes. Warning: Values *must* fit into a bin. It is recommended to use -Infinity and Infinity in the first and last bins.
|
* @param {{min:number,max:number}[]} classes The classes to bin the values into. If not specified, values are not binned into classes. Warning: Values *must* fit into a bin. It is recommended to use -Infinity and Infinity in the first and last bins.
|
||||||
* @return {ArrayBuffer} A canvas with the image rendered on it.
|
* @return {ArrayBuffer} A canvas with the image rendered on it.
|
||||||
*/
|
*/
|
||||||
async do_render(terrain, classes = null) {
|
async do_render(terrain, classes = null) {
|
||||||
|
@ -41,6 +46,11 @@ class Terrain50Renderer {
|
||||||
l.log(`[Terrain50Renderer] Static colour domain: ${this.colour_domain[0]} - ${this.colour_domain[1]}`);
|
l.log(`[Terrain50Renderer] Static colour domain: ${this.colour_domain[0]} - ${this.colour_domain[1]}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(classes != null)
|
||||||
|
colour_domain = this.colour_scale_classes.domain([
|
||||||
|
0, classes.length
|
||||||
|
]);
|
||||||
|
|
||||||
let width = Math.floor(terrain.meta.ncols / this.scale_factor),
|
let width = Math.floor(terrain.meta.ncols / this.scale_factor),
|
||||||
height = Math.floor(terrain.meta.nrows / this.scale_factor);
|
height = Math.floor(terrain.meta.nrows / this.scale_factor);
|
||||||
|
|
||||||
|
@ -65,10 +75,19 @@ class Terrain50Renderer {
|
||||||
if(typeof terrain.data[a_y] !== "undefined" &&
|
if(typeof terrain.data[a_y] !== "undefined" &&
|
||||||
terrain.data[a_y][a_x] !== terrain.meta.NODATA_value) {
|
terrain.data[a_y][a_x] !== terrain.meta.NODATA_value) {
|
||||||
|
|
||||||
|
if(classes == null) {
|
||||||
colour = colour_domain(
|
colour = colour_domain(
|
||||||
terrain.data[a_y][a_x]
|
terrain.data[a_y][a_x]
|
||||||
).rgba(); // 0: r, 1: g, 2: b, a: 3
|
).rgba(); // 0: r, 1: g, 2: b, a: 3
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
for(let i in classes) {
|
||||||
|
if(terrain.data[a_y][a_x] >= classes[i].min && terrain.data[a_y][a_x] < classes[i].max) {
|
||||||
|
colour = colour_domain(i).rgba(); // 0: r, 1: g, 2: b, a: 3
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// colour = chroma("red").rgba();
|
// colour = chroma("red").rgba();
|
||||||
colour[3] = Math.floor(colour[3] * 255); // Scale the alpha value from 0-1 to 0-255
|
colour[3] = Math.floor(colour[3] * 255); // Scale the alpha value from 0-1 to 0-255
|
||||||
|
@ -105,7 +124,7 @@ class Terrain50Renderer {
|
||||||
* Returns a buffer containing a PNG-encoded image, which is ready to be
|
* Returns a buffer containing a PNG-encoded image, which is ready to be
|
||||||
* written to disk for example.
|
* written to disk for example.
|
||||||
* @param {Terrain50} terrain The terrain object to render.
|
* @param {Terrain50} terrain The terrain object to render.
|
||||||
* @param {[number, number][]} classes The classes to bin the values into. If not specified, values are not binned into classes. Warning: Values *must* fit into a bin. It is recommended to use -Infinity and Infinity in the first and last bins.
|
* @param {{min:number,max:number}[]} classes The classes to bin the values into. If not specified, values are not binned into classes. Warning: Values *must* fit into a bin. It is recommended to use -Infinity and Infinity in the first and last bins.
|
||||||
* @return {Buffer} The terrain object as a png, represented as a buffer.
|
* @return {Buffer} The terrain object as a png, represented as a buffer.
|
||||||
*/
|
*/
|
||||||
async render(terrain, classes = null) {
|
async render(terrain, classes = null) {
|
||||||
|
|
Loading…
Reference in a new issue