Data Inspector themes
Themes are used to describe the visual appearance of geometries. These are TypeScript or JSON files describing a set of styles for geometries. There are different types of geometries and corresponding styles which can customize the appearance of these geometries.
To understand the basic principles of styling geometries, let us take a look at a simple theme used by the SpeedLimitsDataSource sample. It is located in the src/datasources/speedLimitsDataSource/theme/speedLimitTheme.ts file of the @here/olp-examples package.
This file exports a SpeedLimitTheme object with a string name of theme and styles array.
It defines styles for lines of different color and one style for an invisible line.
Each style object must have two string properties - when and technique, some optional properties, and a set of additional properties in attr which are specific to each style.
when: An expression describing when this style should be applied. This expression is used byStyleSetEvaluatorto retrieve the requiredtechnique. You can examine theSpeedLimitsTile.createSpeedLimitsMaterialmethod for an example of its usage.technique: A property specifying the style's geometry type and must be one of"line","fill","solid-line","dashed-line","extruded-line","extruded-polygon","text","landmark","line","segments", or"none".attr: Attributes that are specific for eachtechniqueand describe the visual appearance of a geometry.description: Optional, a human readable description.renderOrder: Optional, a geometry's render order.transparent: Optional, set totrueif a line should appear transparent. Rendering transparent lines may come with a slight performance impact.opacity: Optional, for transparent lines, set a value between0.0for fully transparent and to1.0for fully opaque.
First, let us examine the styles of solid lines used to visualize speed limits. There are three of them so common attributes are placed in the lineAttributes object which is reused for all the lines.
Solid lines have styles with the solid-line technique and represent a solid line geometry. Its appearance can be customized by specifying the following attributes:
lineWidth: Line width in meters. It is an array of widths for different zoom levels that can have a single element with onlyvaluein it if there is no need to apply different widths on different zoom levels, or can have multiple elements withminLevel,maxLevel, andvalueto specify zoom level ranges with certain line widths.color: Line color in hexadecimal or CSS-style notation, for example:"#e4e9ec","#fff","rgb(255, 0, 0)", or"hsl(35, 11%, 88%)".clipping: If set totrueor omitted, a line will be clipped by tile bounds. If set tofalse, the line will be rendered even outside of the tile.
There is a special style with the segments technique. This technique is used to create line geometries of one-pixel width, however, in this case, it has an attribute visible set to false. This is done to improve performance. This style is applied to invisible lines which are used only for detecting intersections of the mouse pointer with geometries. It is preferable to use visible: false instead of opacity: 0 because rendering will not perform actual draw calls for geometry with visible set to false, thus improving performance.
The speed limits theme:
// Common styles for speed limit line.
const lineAttributes = {
lineWidth: 4,
metricUnit: "Pixel",
clipping: false // Line will not be clipped by tile bounds
};
/** Theme for visualization of speed limits geometries. */
export const SpeedLimitTheme = {
name: "speedlimits", // Theme name.
styles: [
{
description: "Style for visualizing low speed limits.",
when: "type == 'speedlimit-line-low'",
technique: "solid-line",
renderOrder: 1010,
attr: { color: "rgb(191,33,47)", ...lineAttributes }
},
{
description: "Style for visualizing medium speed limits.",
when: "type == 'speedlimit-line-medium'",
technique: "solid-line",
renderOrder: 1009,
attr: { color: "rgb(249,167,62)", ...lineAttributes }
},
{
description: "Style for visualizing high speed limits.",
when: "type == 'speedlimit-line-high'",
technique: "solid-line",
renderOrder: 1008,
attr: { color: "rgb(39,179,118)", ...lineAttributes }
}
]
};Updated 2 days ago