-
Notifications
You must be signed in to change notification settings - Fork 42
VTS Geodata Format
This file format is used to describe geographic features. This file only specifies geo data features and groups, but does not specifies which features will be rendered and how they will be renderer. Which features will be rendered is defined in separate geo layer style sheet file.
For geo data files will be used JSON file format.
{
"version": 1,
"groups": [{
"bbox": [
[471662.7, 5555582.6, 225],
[472440.8, 5555892.9, 241]
],
"resolution": 4096,
"points": [{
"points": [
[612, 140, 6]
],
"properties": {
"kind": "restaurant",
"name": "U Bílého Lva"
}
}],
"lines": [{
"d-lines" : [[
[612, 140, 6],
[20, 10, 0],
[12, 7, 1]
]],
"properties": {
"kind": "road",
"name": "Na Bělidle"
}
}]
"polygons": [{
"vertices": [
612, 140, 6,
20, 10, 0,
120, 70, 1
]
"surface": [
0, 1, 2
],
"borders": [
[0, 1, 2]
],
"middle" : [220, 40, 0]
"properties": {
"kind": "filed",
"name": "Šafářovo Pole"
}
}]
}]
}
{
"version": 1,
"groups": []
}
The coordinates are in physical SRS and are encoded in normalized form as unsigned integers. Each dimension of the group bounding box is thus divided into n positions (n is defined by resolution). Each vertex is rounded to the nearest discrete position within the bounding box.
Vec3 = [double, double, double] # array of three doubles
Vec3ui = [uint, uint, uint] # array of three uints
Vec3iz = [int, int, int] # array of three integers encoded in zig zag format
RGB = [uint8, uint8, uint8] # array of three uints
BBox = [Vec3, Vec3] # two points representing minimum and maximum extends
of bounding box
{
version : uint # file format version
groups : [Group] # array of groups containing geo features
}
Group = {
bbox : BBox # bounding box enclosing all elements
in group
resolution : Number, # set resolution of the coordinates,
which is number of units per bbox
dimension (default=4096)
id : string # optional: id of group
points : [PointArray] # optional: array of PointArrays
lines : [LineString] # optional: array of LineStrings
polygons : [Polygons] # optional: array of Polygons
}
PointArray = {
id : string # optional: id is needed for switching
feature states like hover-style, ...
points : [Vec3ui] # optional: array of points
d-points : [Vec3iz] # optional: compressed alternative
to points, each array member
stores delta values to previous
member
properties: {} # custom properties can be added
}
LineString = {
id : string # optional: id is needed for switching
feature states like hover-style, ...
lines : [[Vec3ui]] # optional: array of lines where line is
defined as array of points
d-lines : [[Vec3iz]] # optional: compressed alternative
to lines, array of lines where line is
defined as array of points, where
each array member stores delta values
to previous member
properties: {} # custom properties can be added
}
Polygons = {
id : string # optional: id is needed for switching
feature states like hover-style, ...
vertices : [uint] # array of vertex coordinates, where
coordinates are represented as
uint x, uint y, unit z
surface : [uint] # array of face indices, where face
is defined as: uint vertexIndex1,
uint vertexIndex2, uint vertexIndex3
borders : [[uint]] # array of line strings, where line
string is defined as array of vertex
indices
middle : [Vec3ui] # optional: center of the face, which can be
used for placing label
properties: {} # custom properties can be added
}
The geo data can by visualized by render layers. Each render layer specifies which features in which group will by rendered. Feature selection is provided by filter conditions and group conditions. The render layer are defined by geo later style sheets which are stored in JSON file format.
{
"constants" : {
"@road-width" : { "lod-scaled": [10, 3] },
"@wide-road-width" : { "lod-scaled": [10, 4] },
"@road-color" : [255,124,10,255],
"@road-visible" : { "discrete": [[4, false], [5, true]] },
"@black" : [0,0,0,255],
"@icon-restaurant" : ["icons", 0, 0, 24, 24]
},
"fonts": {
"noto-basic": "https://cdn.melown.com/libs/vtsjs/fonts/noto-basic/1.0.0/noto.fnt"
},
"bitmaps" : {
"icons" : "http://mapserver.mapy.cz/img/map-icons.png"
},
"layers" : {
"roads" : {
"filter" : ["==", "$kind", "road"],
"line-width" : "@road-width",
"line-color" : "@road-color",
"line-flat" : true,
"visible" : "@road-visible",
},
"wide-roads" : {
"filter" : ["==", "$kind", "highway"],
"inherit" : "roads-border-only",
"line-width" : "@wide-road-width"
},
"roads-with-border" : {
"filter" : ["skip"],
"inherit" : "roads",
"next-pass" : [[0,"roads-border-only"]]
},
"roads-border-only" : {
"filter" : ["skip"],
"inherit" : "wide-roads",
"line-color" : "@black"
},
"restaurant" : {
"filter" : ["==", "$kind", "restaurant"],
"icon" : true,
"icon-source" : "@icon-restaurant",
"label" : true,
"label-font" : ["noto-basic"]
}
}
}
{
constants : {}
fonts : {}
bitmaps : {}
layers : {}
}
The constants define values which can be used across all styles. The constants have following form:
constants : {
@key : value
...
}
This structure defines fonts which can be used across all styles in labels. The fonts have following form:
fonts : {
@fontId: url
...
}
This structure defines bitmaps which can be used across all styles as icons. The bitmaps have following form:
bitmaps : {
@bitmapId: url
...
}
This structure defines render layers. The layers have following form:
layers : {
@layerId: Layer
...
}
Vec2 = [double x, double y] # array of two doubles
RGBA = [uint8 r, uint8 g, uint8 b, uint8 a] # array of four uints
Icon = [string bitmapId, # id of bitmap stored in bitmaps structure
uint left, # coordinates of left top corner of icon
uint top, in pixels
uint width, # size of icon in pixels
uint height]
LineTexture = [string bitmapId, # id of bitmap stored in bitmaps structure
uint top, # vertical texture offset in pixels
uint height] # vertical texture size in pixels
RenderPass = [int zIndex, string layerId]
DepthOffset = [double globalFactor, double distanceFactor, double tiltFactor]
Stick = [double maxHeight, double minHeight, double width, uint8 red, uint8 green, uint8 blue, uint8 alpha]
Margin = [double horizontalMargin, double verticalMargin] # margin values are in pixels
LabelOutline = [double outlineThickness, double textThickness, double textBlurriness, double outlineBlurriness]
# thickeness values have range from 0 to 1.0,
the label glyphs are represented by signed distance fields
where value 0 represents most outer contour of the glyph,
value 1.0 represents most inner contour of the glyph.
# bluriness - reasonable range of values for blurriness is from 0 to 20
where value 0 represents no blur applied
value 20 represents maximum blur applied
LineStyle = enum { # enum value represented by string
solid,
textured
}
Units = enum { # enum value represented by string
pixels,
meters,
ratio
}
PointStyle = enum { # enum value represented by string
solid
}
TextAlign = enum { # enum value represented by string
left,
right,
center
}
Origin = enum { # enum value represented by string
top-left,
top-right,
top-center,
center-left,
center-right,
center-center,
bottom-left,
bottom-right,
bottom-center
}
All layers properties are optional. If property is not defined then default value is assigned.
Layer = {
filter : FilterCondition # see section about filters conditions
(default = null)
inherit : string # id of style from which will be properties
inherited (default = "")
line : bool # draw line feature (default = false)
line-flat : bool # sets whether line will have uniform width or
will have flat shape (default = false)
line-width : double # width of line in meters (flat line) or in
pixels (default = 1)
line-width-units : Units # for line-flat == false are supported units "pixels"
and "ratio". The "ratio" means ratio of
screenHeight (default = "pixels")
for line-flat == true are supported units "meters"
and "ratio". The "ratio" means ratio of
viewExtent (default = "meters")
line-style : LineStyle # (default = "solid")
line-style-texture : LineTexture # sets which texture will be used textured lines
line-style-background : RGBA # sets color for transparent parts of textured
# lines (default = [0,0,0,0])
# (default = null)
line-color : RGBA # (default = [255,255,255,255])
line-label : bool # draw line label, line labels can be used only
for flat lines (default = false)
line-label-font : [string] # see label-font
line-label-color : RGBA # (default = [255,255,255,255])
line-label-color2 : RGBA # color of the text outline
(default = [0,0,0,255])
line-label-outline : LabelOutline # style of the text outline
(default = [0.25,0.75,2.2,2.2])
line-label-source : string # name of feature property from which will be
label text used (default = "$name")
line-label-size : double # font size in meters (default = 1)
line-label-offset : double # offset of label from center of line
(default = 0)
point : bool # draw point (default = false)
point-flat : bool # sets whether point will have uniform shape or
will have flat shape (default = false)
point-radius: double # radius of point in meters(flat point) or in
pixels (default = 1)
point-style: PointStyle # (default = "solid")
point-color : RGBA # (default = [255,255,255,255])
icon : bool # draw icon (default = false)
icon-source : Icon # sets which icon will be drawn (default = null)
icon-scale : double # (default = 1)
icon-offset : Vec2 # offset in pixels (default = [0,0])
icon-origin : Origin # (default = "bottom-center")
icon-stick : Stick # applies stick to the icon
(default = null)
label : bool # draw label (default = false)
label-font : [string] # array of the font Ids set which fonts will
be used for the labels. Fonts array forms
cascade. If the glyph is not found in the
first font, the next font in the array is
used. This way is searched whole array of
the fonts until is font containing desired
glyph found. (default = [#default])
label-source : string # name of feature property from which will be
label text used (default = "$name")
label-size : double # font size in pixels (default = 10)
label-color : RGBA # (default = [0,0,0,255])
label-color2 : RGBA # color of the text outline
(default = [0,0,0,255])
label-outline : LabelOutline # style of the text outline
(default = [0.25,0.75,2.2,2.2])
label-offset : Vec2 # offset in pixels (default = [0,0])
label-origin : Origin # (default = "bottom-center")
label-align : TextAlign # (default = "center")
label-width : double # sets width at which text will be wrapped
(default = 200)
label-stick : Stick # applies stick to the label
(default = null)
label-no-overlap : bool # prevents overlapping labels by hiding labels
which are rendered later (default = true)
label-no-overlap-margin : Margin # sets margin around label
(default = [5,5])
polygon : bool # draw polygon (default = false)
polygon-color : RGBA # color of polygon surface
z-index : int # sets render order, range from -255 to 255
(default = 0)
zbuffer-offset : DepthOffset # sets zbuffer offset of rendered feature
(default = [1,1,1])
selected-layer : string # sets which layer will be used when feature
is selected (default = "")
selected-hover-layer : string # sets which layer will be used when feature
is selected and hovered (default = "")
enter-event : bool # enables enter events (default = false)
leave-event : bool # enables leave events (default = false)
hover-event : bool # enables hover events (default = false)
hover-layer : string # enables change of layer when hover event
occurs (default = "")
click-event : bool # enables click events (default = false)
advanced-hit : bool # when advanced hit is enabled then hover and
# click events report which inner element of
# the feature is interacted
visible : bool # sets whether feature will be visible
(default = true)
visibility : double # set from which distance will be feature
visible. Null value means no visibility
check. (default = null)
visibility-abs : Vec2 # Sets local view extents value range [min,max]
in which is feature visible. You can imagine
local view extent as a distance from the camera
in meters (default = null)
visibility-rel : Vec4 # Sets view extents value range in which is
feature visible. In this case you can imagine
view extent as a value >= 0. Where 1 means that
displayed feature is as large as screen (vertically).
Size of the feature in the real world is defined
by its radius (meters). Used form: [radius,
radiusMultiplicator, minViewExtent, maxViewExtent]
(default = null)
culling : double # sets angle (between eye and feature ground normal)
after which feature will not visible. For example
when features on the opposite side of the planet
should not be visible use value 90. (default = 180)
next-pass : [RenderPass] # feature can be rendered multiple times with
different layers. The z-index value in
RenderPass structure overwrites z-index value
in referred layer. (default = null)
}
The filters decides which feature will be rendered by style layer. Each style layer goes through all features and these features for which filter result positive are rendered with that style layer. Supported filter are:
["==", value1, value2] # value1 == value2
["!=", value1, value2] # value1 != value2
[">", value1, value2] # value1 > value2
["<", value1, value2] # value1 < value2
[">=", value1, value2] # value1 >= value2
["<=", value1, value2] # value1 <= value2
["has", property] # property exists
["!has", property] # property not exists
["in", property, value1, value2, .. ] # property value is present in listed values
["!in", property, value1, value2, .. ] # property value is not present in listed values
["all", filter1, filter2, ... ] # all filters are positive
["any", filter1, filter2, ... ] # any filter is positive
["none", filter1, filter2, ... ] # none of filters is positive
If layer is rendered by multi-pass mechanism then layer filter is ignored. There is special filter value ["skip"], which designates that layer will be only processed in mutipass render or in case that layer is referred by hover or click event.
Filters can access special system properties:
-
#id
contains name of the feature -
#group
contains name of group in which is rendered feature stored -
#type
identifies feature type. Possible values are "point", "line", "polygon" -
#tileSize
size of the tile (usually in meters) -
#lod
the LOD of the tile
Style property values can be assigned directly:
"property" : 123
or can use constant:
"property" : "@name-of-constant"
or can use property of PointArray or LineString object:
"property" : "$name-of-property"
or can use function.
You can include properties, constants or function values (see more about functions below) into the string.
Example:
"property" : "Value of kind property is: {$kind}"
Example of included function values:
"property" : "Absolute value of temperature property is: {{"abs" : "$temperature"}}"
Supported function are: 'sgn', 'sin', 'cos', 'tan', 'asin', 'acos', 'atan', 'sqrt', 'abs', 'deg2rad', 'rad2deg'
Example:
"property" : { "abs" : "$someProperty" }
Supported function are: 'add', 'sub', 'mul', 'div', 'pow', 'atan2'
Example:
"property" : { "add" : ["$someProperty", "@someConstant"] }
Sets minimum or maximum value from provided array.
"property" : { "min" : [value1, value2, ...] }
Example:
"property" : { "min" : [20, "$someProperty", "$someProperty2"] }
Sets property value based on result of condition. The condition expression has same syntax as filters.
"property" : { "if" : [condition, valueWhenTrue, valueWhenFalse] }
Example:
"property" : { "if" : [["has", "$someProperty"], true, false] }
Supported functions are: 'strlen' - length of the string, 'str2num' - converts string to the number, 'lowercase', 'uppercase', 'capitalize', 'has-fonts' - returns whether the font array contain all glyphs for the string, 'has-latin' - returns whether string contains some Latin characters, 'is-cjk' - returns whether string contain only CJK (Chinese, Japanese, Korean) characters
Example:
"property" : { "lowercase" : "$someProperty" }
Defines an array of LOD and value pairs. Resulting value is the second element of the pair which carries the highest lower value to current LOD as its first element. The value of the second element can be a number, boolean or color. If LOD is outside defined boundaries then value of nearest boundary is used. The LOD and value pairs have to be sorted by LOD values in ascending order.
"property" : { "discrete" : [[lod, value],...] }
Example:
"property" : { "discrete" : [[5, 20], [10, 4]] }
First function parameter refers to the property. Value of the referred property is then searched in the array of key and value pairs. This array is defined in the second function parameter. Resulting function value is the second element of the pair which carries the highest lower value to the value stored as its first element (key). The value of the first element (key) can be only number. The value second element can be a number, boolean or color. If LOD is outside defined boundaries then value of nearest boundary is used. The LOD and value pairs have to be sorted by LOD values in ascending order.
"property" : { "discrete2" : [property, [[key, value],...]] }
Examples:
"property" : { "discrete2" : ["$population", [[1000, 20], [2000, 30]]] }
"property" : { "discrete2" : ["@road-width", [[10, 25], [20, 45]]] }
"property" : { "discrete2" : ["#lod", [[5, [0,0,0,255]], [7, [255,0,0,255]]]] }
Defines an array of LOD and value pairs. Two pairs with first element values closest to the current LOD value are searched. Values of second elements of the matched pairs are linearly interpolated and returned as resulting function value. The value of the second element can be a number or color. If LOD is outside defined boundaries then value of nearest boundary is used. The LOD and value pairs have to be sorted by LOD values in ascending order.
"property" : { "linear" : [[lod, value],...] }
Example:
"property" : { "linear" : [[5, 20], [10, 4]] }
First function parameter refers to the property. Value of the referred property is then searched in the array of key and value pairs. This array is defined in the second function parameter. Two pairs with first element (key) values closest to searched value are selected. Values of second elements of the matched pairs are linearly interpolated and returned as resulting function value. Value of the first element (key) can be only number. The value of the second element can be a number or color. If LOD is outside defined boundaries then value of nearest boundary is used. The LOD and value pairs have to be sorted by LOD values in ascending order.
"property" : { "linear2" : [property, [[key, value],...]] }
Examples:
"property" : { "linear2" : ["$elevation", [[1000, 42], [8000, 85]]] }
"property" : { "linear2" : ["#lod", [[5, [0,255,0,255]], [17, [255,0,0,255]]]] }
This function takes as input LOD and corresponding value for that LOD and returns value scaled for the current LOD. The value of the second function parameter can be only number. Third parameter is optional. Default value for the third parameter is 1. Smaller values than 1 means that values became larger relatively to previous LOD level. Larger values than 1 means that values became smaller relatively to previous LOD level.
"property" : { "lod-scaled" : [lod, value, baseFactor] }
Example:
"property" : { "lod-scaled" : [5, 20, 1] }