in the flexform of the backend layouts of gridelements is on option for coloured frames (neutral, red, blue, green). Is there a possibility to get coloured frames for my grids when i define the different grids not in the database but in external TS-files?
Thanks!
You're searching for the frame parameter.
title = Full Width
description = Content uses full width of page
frame = 3
icon = EXT:myext/Resources/Public/Images/grid-icons/grid-1col.png
frame can have these values:
1 => Red
2 => Green
3 => Blue
Related
I have an elevation raster layer in my GeoServer with a single channel ("gray").
The "gray" values is elevations values (signed int16).
I have 2 clients:
The first one is using that elevation values as is.
The second one expect to get [Mapbox Terrain-RGB format][1]
I do not want to convert the "gray scale" format to Mapbox Terrain-RGB format and hold duplicate data in the GeoServer.
I was thinking to use the SLD style and elements to map the elevation value to the appropriate RGB value (with gradient interpolation between discrete values).
For example:
<ColorMap>
<ColorMapEntry color="#000000" quantity="-10000" />
<ColorMapEntry color="#FFFFFF" quantity="1667721.5" />
</ColorMap>
It turns out that the above example does not span the full range of colors but rather creates gray values only.
That is, it seems that it interpolate each color (red, green, blue) independent of each other.
Any idea how to make it interpolate values like that: #000000, #000001, #000002, ... , #0000FF, #000100, ..., #0001FF, ..., #FFFFFF?
Tx.
[1]: https://docs.mapbox.com/data/tilesets/reference/mapbox-terrain-rgb-v1/
I'm trying to do the same with no luck, and i think it can't be done... Check this example. It's a "gradient" [-10000, -5000, -1000, -500 ... 100000000000000000, 5000000000000000000, 1000000000000000000] with the Mapbox color codification. The color progression/interpolation is anything but linear, so i think it can't be emulated in an SLD.
If you have the elevation data in the format you desire then that is the easiest option: it just works. However, if you want a more customized solution, here's what I've done for a project using the Mapbox Terrain-RGB format:
I have a scale of colors from dark blue to light blue to white.
I want to be able to specify how many steps are used from light blue to white (default is 10).
This code uses GDAL Python bindings. The following code snippet was used for testing.
It just outputs the color mapping to a GeoTIFF file.
To get values between 0 and 1, simply use value *= 1/num_steps.
You can use that value in the lookup table to get an RGB value.
If you're only interested in outputting the colors, you can ignore everything involving gdal_translate. The colors will automatically be stored in a single-band GeoTIFF. If you do want to re-use those colors, note that this version ignores alpha values (if present). You can use gdal_translate to add those. That code snippet is also available at my gist here.
import numpy as np
import gdal
from osgeo import gdal, osr
def get_color_map(num_steps):
colors = np.zeros((num_steps, 3), dtype=np.uint8)
colors[:, 0] = np.linspace(0, 255, num_steps, dtype=np.uint8)
colors[:, 1] = colors[::-1, 0]
return colors
ds = gdal.Open('/Users/myusername/Desktop/raster.tif')
band = ds.GetRasterBand(1) # Assuming single band raster
arr = band.ReadAsArray()
arr = arr.astype(np.float32)
arr *= 1/num_steps # Ensure values are between 0 and 1 (or use arr -= arr.min() / (arr.max() - arr.min()) to normalize to 0 to 1)
colors = get_color_map(num_steps) # Create color lookup table
colors[0] = [0, 0, 0] # Set black for no data so it doesn't show up as gray in the final product.
# Create new GeoTIFF with colors included (transparent alpha channel if possible). If you don't care about including the colors in the GeoTIFF, skip this.
cols = ds.RasterXSize
rows = ds.RasterYSize
out_ds = gdal.GetDriverByName('GTiff').Create('/Users/myusername/Desktop/raster_color.tif', cols, rows, 4)
out_ds.SetGeoTransform(ds.GetGeoTransform())
out_ds.SetProjection(ds.GetProjection())
band = out_ds.GetRasterBand(1)
band.WriteArray(colors[arr]) # This can be removed if you don't care about including the colors in the GeoTIFF
band = out_ds.GetRasterBand(2)
band.WriteArray(colors[arr]) # This can be removed if you don't care about including the colors in the GeoTIFF
band = out_ds.GetRasterBand(3)
band.WriteArray(colors[arr]) # This can be removed if you don't care about including the colors in the GeoTIFF
band = out_ds.GetRasterBand(4)
alpha = np.zeros((rows, cols), dtype=np.uint8) # Create alpha channel to simulate transparency of no data pixels (assuming 0 is "no data" and non-zero is data). You can remove this if your elevation values are not 0.
alpha[arr == 0] = 255
band.WriteArray(alpha) # This can be removed if you don't care about including the colors in the GeoTIFF
out_ds.FlushCache()
This issue is also present in Rasterio when using a palette with multiple values. Here is an example.
However, if your raster has n-dimensions or is a masked array, the flip operation can be tricky. Here's a solution based on one of the answers in this stackoverflow question: How to vertically flip a 2D NumPy array?.
I need to change value color to black in singlestat pannel, and backgrund color by mertic.
How to change the color of the value separately from the background color?
Example:
Background color green - value color black
Background color red - value color black
In example i do it with F12, and set color manualy, but certainly its not permanent.
Example panel
Those colors below are where you would do it, and make sure to save your graph to persist the changes.
You can think of the single stat as like an "alert",
let's say that
x < 10 is "ok"
10 < x < 25 is "ehhh"
x > 50 is "very bad"
you would have your single-stat display those colors when it is also displaying those values. So
green == "ok"
orange == "ehhh"
red == "very bad"
those values just above the colors you have are where you would set those value/color pairs. If you only want one color, only set one value.
To have the value color follow the status color, click value
Trying to paint a river from black to yellow and I'm having a "small" issue.
The image that given on this problem is a simple grayscale image of a map where there's a river on it (original image).
The task is to "paint" this river from black (0,0,0) to yellow (255,255,0).
As far as I know, we can't actually paint grayscale images without "converting" it to RGB so what I did:
Got the image,
"Read" the image with imread(),
Used the function cat to concatenate my image (and apparently "turn" into a RGB image?),
Looped through each part of my image and checked which ones had values between 0 and 48 (according to what I read there are different shades of black and apparently it goes from 8 to 8 like (0,0,0), (8,8,8) and so on)
If there was a value within that range, I'dd color it yellow (255,255,0)
The problem is that not only the river was painted yellow but a relatively large yellow square has been added to the right side of the image. I'll post the image right after the code.
originalIM_River = imread('fig_lista4_2.bmp');
figure,title('Original image'),imshow(originalIM_River)
imRGB_River = cat(3, originalIM_River, originalIM_River, originalIM_River);
[nLine, nColumn] = size(imRGB_River);
for i = 1 : nLine
for j = 1 : nColumn
if imRGB_River(i,j) >= 0 && imRGB_River(i,j) <= 48
imRGB_River(i,j,:) = [255,255,0]; % (255,255,0) is yellow
end
end
end
figure, title('New imagem - River painted with yellow'),imshow(imRGB_River)
River painted with yellow
I've tried to separate each channel from the image (red , green, blue), find which pixels were within the range of 0 to 48 and paint it yellow to later concatenate them but that didn't work either.
The error lies with this line:
[nLine, nColumn] = size(imRGB_River);
Here imRGB_River is a 3-dimensional matrix, with 3 as the size of the third dimension. Since you only request 2 dimensions from the size function it will return the product of all non-singleton trailing dimensions in the last output, so nColumn will be returned as N*3, or three times bigger than you were expecting. To fix it, you could either use your original image matrix (before replicating the third dimension):
[nLine, nColumn] = size(originalIM_River);
Or call size as follows to ignore additional output dimensions:
[nLine, nColumn, ~] = size(imRGB_River);
I followed the procedures in this question, and also tried setting individual text object with larger fonts. Here is my sample code:
hf = figure;
set(hf, 'DefaultAxesFontSize', 14)
hx = axes('Parent',hf);
[hx,hp1,hp2] = plotyy(hx, rand(10,1),rand(10,1),rand(10,1),rand(10,1),'scatter');
hlx = xlabel(hx(1), 'Only half of this line show up');
hl1 = ylabel(hx(1), 'Not usually truncated but less border');
hl2 = ylabel(hx(2), 'Only part of this line show up');
ht = title(hx(1), 'Too close to border');
As can be seen in the picture, the labels get truncated by the border of the figure. I have to drag the figure to very large - contrary to desired - in order to reveal all text.
How can I automatically set the text box according to the text font size, so that even for small graphs they don't get cut?
I know I can do it manually by setting Position of the axes but it's kind of manual and guess-and-try. Is there any automatic way to calculate the margins?
One thing that can be done is to calculate increased margin according to new text font size. Assume we know Matlab's default font size is 10, or otherwise get it by get(hf,'DefaultAxesFontSize').
Then get the relative position of the axes by get(hx, 'Position'), which gives four percentage values. First two define left and bottom margin. Since it's for the labels, increasing the font size from 10 to 14 means the text box should grow by 1.4 times. The next two numbers define the size of the axis. Since text boxes on both sides grow by 1.4 times, assuming original size being x, then new size is 1-[(1-x)*1.4] = 1.4x - 0.4.
Suggested workaround:
hf = figure;
set(hf, 'DefaultAxesFontSize', 14)
hx = axes('Parent',hf);
set(hx, 'Position', [1.4 1.4 1.4 1.4].*get(hx, 'Position')+ [0 0 -.4 -.4])
[hx,hp1,hp2] = plotyy(hx, rand(10,1),rand(10,1),rand(10,1),rand(10,1),'scatter');
hlx = xlabel(hx(1), 'Only half of this line show up');
hl1 = ylabel(hx(1), 'Not usually truncated but less border');
hl2 = ylabel(hx(2), 'Only part of this line show up');
ht = title(hx(1), 'Too close to border');
You may replace the manually entered number 1.4 with the ratio between newly assigned (bigger, hopefully) font size and the original size which is 10.
There are some white portions in a black object.
I need to cover up the all the white portions in the object with its neighboring black.
The bwlabel function labels the black part as '2' and white part as '1'.
can i somehow change the labels of the required object and cover the white portion with black.
I have isolated the objects individually using the following code:
a=imread('3.jpg');
figure(),imshow(a),title('Original image');
b=im2bw(a, graythresh(a));
figure(),imshow(b),title('Grayscale image');
[c,num]=bwlabel(b);
figure(),imshow(c),title('labelled image');
for i=1:1:num
figure(),imshow(c==i),title('OBJECT');
end
What can i do further ?
Or is there any other way to achieve the same?
Can you do
Find the indices of the white area
ind_white = find(c==1);
Replace the white area with zeros
b(ind_white) = 0;
or you can change the label of the white object to that of the black
c(ind) = 2;