# Module level

Package com.here.mom.feature.indoor.level

Features

Parts

## ElevationPoint

part ElevationPoint

Module level

Property Type Modifier Description
point Point The geolocation where the elevation was measured
relativeElevationCm integer Elevation of the point relative to the structure-properties.base-elevation, in centimeters. Can be negative.
clearanceHeightCm integer optional Clearance height of the elevation point in centimeters, when relevant.

## Level

feature Level extends MomFeature, VenueFeature

Module level

Level is a floor of a building, or a deck in a parking garage

Property Type Modifier Description
momType "indoor.Level"
id string
bbox BoundingBox optional
geometry MultiPolygon Level geometry represents outline of the level.

It can be a multipolygon or a polygon represented as a multipolygon.
properties LevelProperties Level-specific properties
referencePoint Point optional This is the location of this feature, collapsed to a single point.

This is for any application where an approximate, but deterministic and consistent, location is useful. One

example is deciding where to "anchor" a feature within a tiled map database.

Any Reference to this feature should include this point.
nonSpatialPartitionKey string optional The partition id for a generically partitioned feature.

Generically partitioned features fall into two categories:

1. Features that have a spatial component but may not make sense to partition based on that geometry.

2. Features that don't have a strong spatial component.

How keys will be assigned and what value ranges will be used are not specified.

Examples of generically partitioned features are admin, zone, postal, phonetics, metadata, etc.
Constraint Expression Description
atMostOneDefinedProperty (is-empty(.referencePoint) is-empty(.nonSpatialPartitionKey)) At most one of non-spatial-partition-key and reference-point can be defined.

## LevelProperties

part LevelProperties extends Common, VenueFeatureProperties

Module level

Property Type Modifier Description
@ns:com:here:mom:rmob string optional Currently not specified - may be specified by each Feature individually in future
featureType FeatureType optional Deprecated. This property is redundant to MomFeature.momType and should not be used.

MOM clients before 2.6 release had this deprecated property set to required, so

if data needs to be JSON schema validated by clients before 2.6 this property must be

set by the writer.
isoCountryCode Country optional Deprecated. This indicates which country a Feature is in, with a couple caveats.

- It may be unknown ("NONE" is a valid value, in addition to "UNDEFINED" like all MOM enums) simply because the

writer has not tried to figure it out or has otherwise not had the means to do so.

- It may be outright incorrect or a simplification of reality, specifically when a Feature is close to a country

border or in a disputed area (e.g., two or more countries claim the same area).

In all cases, writers and readers of this data should understand that the semantics of this property must be

agreed upon (if it is used at all). The preferred method of relating a Feature to a Country is through a

(direct or transitive) Reference from the Feature to an Admin.
@ns:com:here:mom:delta Branch optional
@ns:com:here:mom:mapcreator MapCreator optional
@ns:com:here:xyz Xyz optional Generic Data Hub namespace
extensionOSM MomOsm optional Optional extension for OSM (Open Street Map) metadata,

in case the object came from OSM
@ns:com:here:groundTruth GroundTruth optional Ground truth namespace
confidence ConfidenceData optional Confidence of a feature, optional only for the features

that are not participating in Quality Index.
venueId string optional Deprecated. Id of the venue. Venue Id is generated outside of MOM, and is used by the different components/services of venues.

There is no venue object, hence this is not a reference to any object,

but conceptually venue is a collection of objects of momType "indoor.{Site, Structure, Level, Space, Occupant}".

This id is linking every object to the venue.

It may have the same value as the Site object, but it doesn't have to have.

Each feature could be considered to be identifiable by a 2-level id: the venueId + feature id.

The feature id is also unique by itself.
indoorMapId string Id of the indoor map. The id is generated outside of MOM, and is used by the different components/services

of the indoor map.

Indoor map is a collection of objects of momType "indoor.{Site, Structure, Level, Space, Occupant, ...}".

This id is linking every object to the specific indoor map.

It may have the same value as the Site object, but it doesn't have to have.

Each feature could be considered to be identifiable by a 2-level id: the indoor map id + feature id.

The feature id is also unique by itself.
renderProperties RenderProperties optional optional object, will appear only for following objects Site, Structure, Level, Space (Vectors)
names Name list Level name can include different name types (e.g. official and abbreviation: floor number), and the names

may be also represented in different languages
isMain boolean Specifies if this is the main level within this Structure, i.e. the level the viewer is expected to start with.
zLevel double Level index from ground (0), negative for underground levels.

The values are integers but it is not modeled as an int because of Typescript legacy.
levelType VenueType optional In some cases, different levels are used for different purposes.

I.e. ground level can be used for stores/businesses and other top levels for residence.
isOutdoor boolean The main use case for levels in Indoor Maps is to represent indoor levels, but in case

there are some features immediately outside the building that are not modeled in base maps,

for example swimming pools or patio in hotels, or the site consists of multiple structures, possibly with parking lots,

the outdoor features are expected to be grouped as a dedicated outdoor level.

In the former case, the outdoor level is associated with an indoor level, whereas in the latter case it can be

an independent level in a dedicated outdoor structure.
relativeElevationCm integer optional Relative elevation to the structure-properties.base-elevation-cm, in centimeters. Can be negative.

In case the level is not exactly horizontal but is at slope, this represents the average / dominant elevation,

and list of elevation points is given separately.
elevationPoints ElevationPoint set Set of elevation points, present in case the level is not exactly horizontal.

The elevations are given relative to the structure-properties.base-elevation-cm.
baseElevation double optional Deprecated. Elevation from ground in meters.

Deprecated as the elevation should be rather based on structure-properties.base-elevation-cm and

relative-elevation-cm of the level.
clearanceHeightCm integer optional Clearance height of the level in centimeters.

It indicates the max guaranteed height for most parts of the level; exceptions to this are provided in space

data when relevant, e.g. for individual parking spaces.

This is typically the height of the main entrance of the level.
structure Structure Every Level object has 'belongs to' relation with Structure
topologies Topology set Topologies on this level. Topologies are forming the routing graph and can be used for navigating between

different spaces within a structure, or to outdoor points. Topologies are referenced by route-points

of spaces in a structure, such as those present in a space's micro-pa. Important attributes for topologies

are conditional-attributes to impose e.g. time based restrictions, access-characteristics to define

modality, and pedestrian-preferred to refine pedestrian accessibility.

Indoor navigation requires accuracy of at least 0.5m, coordinates used for topology nodes need to therefore

be specified with six digits.

A topology shall only be referenced from one feature within a structure. Other restrictions of topology

properties need to be considered when creating map data, taking indoor specifics into account. Enforcing

these restrictions is however out of scope in this definition:

- is-parking-lot-road: set for roads which are part of a parking structure

- is-ramp: out of scope, not used to indicate ramps within parking strucures

- is-overhead-obstruction: used for indoor topologies with height restrictions

laneGroups LaneGroup set Lane groups on this level.

To increase navigation accuracy such as in autonomous driving use cases, the topology on a level can be further

augmented with the MOM lane-group feature. In the indoor context, lane-group will provide detailed geometries for

the underlying topologies. Due to the linking of lane groups to topologies in indoor maps, the directionality of

the topologies and the direction-of-travel property of the lanes in a group need to match.

Note: lane-group has reference to topology, but as it is an enhancement to topologies and may not be used in all

indoor maps, the topologies-set above is the primary one to follow.

road-sign can have a reference to a road, but in indoor we don't have roads. Reference to topology would be

Further, we need additionally information in which level they apply to, so referencing them from level solves that.
floorMarkings RoadSurfaceMarking set Floor markings (e.g. arrays) present in this level.

A lane group may also reference to road-surface markings, but filtering the markings per level would get really

complicated without referencing them from level.
parentIndoorLevel Level optional Associating indoor & outdoor levels of the same z-level enables to render the indoor and outdoor levels at the same

time if preferred, however still keeping the data separate.

The indoor level is the parent, expected to be used e.g. when indexing the levels.

The z-level of the two must be the same, and hence no level-connector is needed to traverse between the levels.

This association can be set only for levels whose is-outdoor flag is true, and the parent level must have the is-outdoor as false.
Constraint Expression Description
indoorLevelImpliesOutdoor (non-empty(.parentIndoorLevel) -> .isOutdoor) parent-indoor-level set implies that is-outdoor is true.
indoorLevelIsActuallyIndoors (non-empty(.parentIndoorLevel) -> not(head(.parentIndoorLevel.properties.isOutdoor))) If parent-indoor-level is set, then that level must actually be an indoor level