# HERE Indoor Map MOM types

This section describes the available HERE Indoor Map MOM types.

## Site

Site is the root object of an indoor map. It defines the area that the map covers, and generic properties such as the name of the site, address, contact details, and opening hours. Most of the properties are optional and common to HERE Places, therefore they follow the property definitions of HERE and are under key placeProperties in the data.

Site contains a reference to an outdoor address. However, to ensure the completeness of an address within an indoor map, additional properties for city, county, and state are available. Site can also specify access restrictions, such as for non-public spaces, and even restrictions by fuel-type for parking garages.

### Note

The geometries in all of the following samples are for example purposes only and do not represent any real building.

{
"type": "Feature",
"momType": "indoor.Site",
"id": "site-1234567890",
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[3.07322, 50.636990],
[3.07582, 50.636990],
[3.07582, 50.636000],
[3.07322, 50.636000],
[3.07322, 50.636990]
]
]
]
},
{
"type": "MultiPoint",
"coordinates": [[3.07382, 50.636827, 0]]
}
"properties": {
"isoCountryCode": "FRA",
"indoorMapId": "1234567890_Sample",
"venueType": "PARKING_GARAGE",
"placeProperties": {
"featureType": "Place",
"isoCountryCode": "FRA",
"names": [
{
"name": "Sample garage",
"languageCode": "ENG",
"nameType": "OFFICIAL"
}
]
},
"defaultLanguageCode": "ENG",
},
"city": {
"names": [
{
"name": "Lille",
"languageCode": "ENG",
"nameType": "OFFICIAL"
}
]
},
"state": {
"names": [
{
"name": "Hauts-de-France",
"languageCode": "ENG",
"nameType": "OFFICIAL"
}
],
{
"name": "Region",
"languageCode": "ENG",
"nameType": "OFFICIAL"
}
]
}
},
"releaseVersion": "1",
"releaseTag": "Occupants updated",
"legacyVersion": {
"mapVersion": "11",
"entityVersion": "10"
},
"venueRulesVersion": "0.0.1",
"lastUpdatedBy": "user@company.com"
}
}
}


## Structure

Structure adds additional information, especially when there are multiple structures in a map. Even with a single structure, Structure plays an important role in data hierarchy, as levels refer to the structure. It can also contain baseElevationCm as a reference elevation for all levels, as the levels provide their elevation as a delta against the baseElevationCm. For the elevation, EGM96, the Earth Gravitational Model from 1996 is used as the standard reference system for sea level to provide compatibility with NDS.

{
"id": "structure-36460",
"type": "Feature",
"momType": "indoor.Structure",
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[3.07322, 50.636990],
[3.07582, 50.636990],
[3.07582, 50.636000],
[3.07322, 50.636000],
[3.07322, 50.636990]
]
]
]
},
"properties": {
"names": [{
"name": "INDIGO EURALILLE",
"nameType": "OFFICIAL",
"languageCode": "ENG"
}
],
"indoorMapId": "1234567890_Sample",
"drawOrder": 0,
"featureType": "indoor.Structure",
"structureType": "PARKING_GARAGE",
"isoCountryCode": "FRA",
"@ns:com:here:mom:meta": {
"modelVersion": "2.13"
}
}
}


## Level

Level adds the altitude dimension to a map and provides the outline for the actual floorplan. Typically, only one level is rendered at a time.

Level contains zLevel, where 0 indicates the ground level and negative values indicate underground levels. If necessary, the unsigned level index can be obtained by ordering the levels by their zLevel. The property isMain indicates the level where the main entrance is located.

A level can potentially have many names. The main name type is always OFFICIAL. For level switcher control, it may additionally define a short name (ABBREVIATION), such as just indicating the floor number. In some cases, there may be some "nicknames" for the levels (SYNONYM), such as a color, that helps someone remember the level. For example, a color may be used in a parking garage level to help someone remember where their car is parked.

In some maps, the yard outside the building is modeled as a Level and uses the isOutdoor property. There are two ways outdoor areas may be included in an indoor map: either associating an outdoor level to an indoor level via the parentIndoorLevel reference, or as a dedicated outdoor level within a dedicated indoor.Structure. The parentIndoorLevel method is used in some single-structure maps, whereas the indoor.Structure method is used for maps with multiple separately modeled structures wich provides an overview of the site.

Level can also include physical properties like relativeElevationCm, relative to the baseElevationCm of the structure, and clearanceHeightCm. Elevation and clearance can also be given at multiple points across the level if the level is not exactly horizontal. The points are defined as ElevationPoint, and they provide samples of elevations around the level so that elevations between the points can be interpolated based on the sample points. The elevation points are especially designed to be used with ramps and levels at slope. The coordinate of the elevation point is not a GeoJSON coordinate with type and coordinates properties, but a coordinate-array that has both longitude and latitude.

{
"id": "level-66922",
"type": "Feature",
"momType": "indoor.Level",
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[
[
[3.07322, 50.636990],
[3.07582, 50.636990],
[3.07582, 50.636000],
[3.07322, 50.636000],
[3.07322, 50.636990]
]
]
]
},
"properties": {
"names": [{
"name": "G",
"nameType": "OFFICIAL"
}
],
"isMain": true,
"zLevel": 0,
"indoorMapId": "1234567890_Sample",
"isOutdoor": false,
"structure": {
"id": "structure-36460"
},
"featureType": "indoor.Level",
"isoCountryCode": "FRA",
"@ns:com:here:mom:meta": {
"modelVersion": "2.13"
},
"elevationPoints": [{
"point": [3.07322, 50.636990],
"relativeElevationCm": 2679
}, {
"point": [3.07582, 50.636000],
"relativeElevationCm": 2685
}
]
}
}


## Space

Space represents the geometries that compose a floorplan, such as walls, rooms, and open areas, but also smaller details, such as equipment and furniture.

Space can have various configurable properties (spaceTypeProperties member) depending on the spaceType, as in some spaceTypes can have different configurable properties as compared to another spaceType.

Spaces can have a name, but rarely do. Instead, they can have an address via the spaceAddress, which enables a hierarchical address and label. For example, a parking spot may have an address that includes the spot and the level where it is located, and that can result in a label such as "EG.432", where "EG" comes from the level, and 432 is the parking spot. However, this is not the case with all parking garage maps.

The spaceTypeProperties is a wide set of properties, and only a subset of those properties are relevant per spaceType. Special parking related properties are represented in parking parts and enums in the HERE Indoor Map MOM data specification. A parking spot can also have such properties as gender and isDisabledAccess from the common spaceTypeProperties.

The following is an example of a space with the type "BARRIER":

{
"id": "space-31420104",
"type": "Feature",
"momType": "indoor.Space",
"properties": {
"level": {
"id": "level-66922"
},
"indoorMapId": "1234567890_Sample",
"drawOrder": 57,
"spaceType": "DIVIDERS",
"stackIndex": 2,
"featureType": "indoor.Space",
"spaceCategory": "BARRIER",
}
"isoCountryCode": "FRA",
"@ns:com:here:mom:meta": {
"modelVersion": "2.13"
}
},
"geometry": {
"type": "Polygon",
"coordinates": [[[3.0753334, 50.6361016, 0], [3.0753429, 50.6360991, 0], [3.0753676, 50.636092, 0], [3.0754015, 50.6360806, 0], [3.075439, 50.6360651, 0], [3.0754741, 50.6360459, 0], [3.0755011, 50.6360232, 0], [3.0755011, 50.6360232, 0], [3.0755011, 50.6360232, 0], [3.0754967, 50.636021, 0], [3.0754698, 50.6360432, 0], [3.0754362, 50.6360619, 0], [3.0754011, 50.6360768, 0], [3.0753696, 50.6360876, 0], [3.0753469, 50.6360943, 0], [3.0753382, 50.6360966, 0], [3.0753382, 50.6360966, 0], [3.0753382, 50.6360966, 0], [3.0752516, 50.6361195, 0], [3.0752338, 50.6360924, 0], [3.0753204, 50.6360695, 0], [3.0753207, 50.6360695, 0], [3.0753214, 50.6360693, 0], [3.0753225, 50.636069, 0], [3.0753241, 50.6360686, 0], [3.0753261, 50.6360681, 0], [3.0753285, 50.6360675, 0], [3.0753285, 50.6360675, 0], [3.0753285, 50.6360675, 0], [3.075343, 50.6360634, 0], [3.0753628, 50.6360568, 0], [3.0753862, 50.6360477, 0], [3.0754116, 50.6360358, 0], [3.0754372, 50.6360211, 0], [3.0754614, 50.6360034, 0], [3.0754614, 50.6360034, 0], [3.0754614, 50.6360034, 0], [3.0754562, 50.6360008, 0], [3.0754523, 50.6360042, 0], [3.0754404, 50.6360132, 0], [3.0754204, 50.636026, 0], [3.0753924, 50.6360406, 0], [3.0753561, 50.6360553, 0], [3.0753114, 50.6360681, 0], [3.0753114, 50.6360681, 0], [3.0753114, 50.6360681, 0], [3.0752317, 50.6360892, 0], [3.0752537, 50.6361227, 0], [3.0753334, 50.6361016, 0]]]
}
}


The following is an example of a Space with the type "PARKING_SPOT":

    "id": "23489503",
"type": "Feature",
"momType": "indoor.Space",
"geometry": {
"type": "Polygon",
"coordinates": [
[
[-87.6386999, 41.8839748],
[-87.6387524, 41.8839739],
[-87.6387526, 41.8839818],
[-87.6388122, 41.8839808],
[-87.6386999, 41.8839748]
]
]
},
"referencePoint": {
"type": "Point",
"coordinates": [-87.6387801, 41.883933]
},
"properties": {
"isoCountryCode": "USA",
"indoorMapId": "25492",
"featureType": "indoor.Space",
"spaceCategory": "TRAFFIC",
"spaceType": "PARKING_SPOT",
"spaceTypeProperties": {
"parkingTypeProperties": {
"sizeCategory": "STANDARD_LARGE",
"reservation": "PUBLIC",
"category": "SHORT_STAY",
"evCharging": {
"hasEvChargingAccess": true
}
},
"clearanceHeightCm": 160,
"gender": "FAMILY"
},
"id": "id13523423"
},
"level": { id: "61077" },
"stackIndex": 10,
"drawOrder": 10
}


### Space categories and types

The following is a preliminary list of Space Categories and Space Types in HERE Indoor Maps:

• "AREA":
• "SECTION","COPY_PRINT","SMOKE","BAGGAGE_CLAIM","SECURITY_SECTION","IMMIGRATION_AND_CUSTOMS","PET_RELIEF_AREA","REST_AREA","MEETING_POINT","GENERIC","STROLLER_PARKING"
• "BARRIER":
• "GATE","DIVIDERS","PAY_GATE","GENERIC"
• "EQUIPMENT":
• "TV","REFRIGERATOR","PAY_STATION","RACK","CAR","AUTOMATIC_PAY_STATION","INTERPHONE","GENERIC"
• "FACILITY":
• "FIXTURE":
• "CHECKOUT","CUBICLE","COUNTERTOP","KIOSK","PARTITION","RAMP","BOOTH","STALL","RACK","STAGE","WASTE_BIN","GENERIC","WORKSTATION","TOILET","SINK","URINAL"
• "FURNISHING":
• "SHELF","TABLE","CHAIR","BIN","DESK","SEAT","GENERIC"
• "MARKER":
• "TRAFFIC_MARKER","DISABLED_ACCESS","PARKING","GENERIC"
• "OBJECT":
• "UNKNOWN","GENERIC"
• "SAFETY":
• "DEFIBRILLATOR","FIRST_AID","FIRE_EXTINGUISHER","EMERGENCY_EXIT","FIRE_ALARM","FIRE_HYDRANTS","FIRE_HOSE","SIREN","GENERIC"
• "SERVICE":
• "ATM","TELEPHONE","CHANGING_STATION","VENDING_MACHINE","TICKET_MACHINE","WIFI","LOCKER","MAIL","STROLLER","SHOWERS","POWER","BIKE_RACK","LUGGAGE_CART","FLIGHT_MONITOR","MASSAGE_CHAIR","AUTOMATIC_PAYMENT_MACHINE","ELECTRONIC_DOOR_CONTROL","KEYBOARD_FOR_OPENING_DOOR","GENERIC","CAR_RENTAL"
• "STRUCTURE":
• "PARKING_STRUCTURE","SUBBUILDING","GENERIC","DOOR","INACCESSIBLE_SPACE","WALL","HALLWAY","FLOOR_OPENING","OPENING","HALL_AREA","STEP","MOVING_WALKWAY","COLUMN","CAR_TURNTABLE","WALKWAY","AISLE","PLAYGROUND","WATER","DRIVABLE_HALLWAY"
• "TRAFFIC":
• "TRANSIT":
• "TAXI","BUS","TRAIN","GENERIC"
• "VEGETATION":
• "GRASS","GREENERY","EARTH","GARDEN","TREE","GENERIC"
• "LEVEL_CONNECTOR":
• "STAIRS","ELEVATOR","ESCALATOR","ELEVATOR_BANK","CAR_LIFT","DRIVE_RAMP","PEDESTRIAN_RAMP","RAMP"

Each of category and type can have characteristics and configurations by SpaceTypeProperties. For example, a parking spot may have a gender restriction, such as Gender.FAMILY, or it may be reserved for drivers with disabilities using isDisabledAccess. Spaces from categories AREA, FACILITY, and SERVICE are navigable, meaning that they can be destinations for navigation.

## Entrance

Entrance represents entrances and exits of the building. The entrance has attributes for clearance, height, and width, and whether it is a door or wall opening. Entrance has the ID of the Level, and through that the Structure is available. Entrance can also have a name. Entrance does not directly carry information about modality, temporality, or even directionality, as in whether it is an entrance or an exit, as that information is available in the topology that passes through it. The topology is linked via a MicroPA, such as Space.


"type": "Feature",
"momType": "indoor.Entrance",
"id": "234885765",
"geometry": {
"type": "LineString",
"coordinates": [
[-87.6390241, 41.8843429],
[-87.6390241, 41.8843479]
]
},
"properties": {
"isoCountryCode": "USA",
"indoorMapId": "25492",
"names": [
{
"name": "West street entrance",
"languageCode": "ENG",
"nameType": "OFFICIAL"
}
],
"clearanceHeightCm": 200,
"clearanceWidthCm": 350,
"type": "DOOR_WAY",
"level": { "id": "61077" },
}


## Level Connector

LevelConnector is used to group together spaces that create connections between levels, including ramps, stairs, elevators, and escalators. Each floor has a corresponding space that indicates the physical location reserved for the connection. The level connecting space is not aware of its counterpart on another level, but the LevelConnector provides that information.

### Level Connecting Topologies

All topology objects are referenced by a "home" Level . Some of them are level connecting topologies, meaning they connect two levels and have either of the nodes in another Level. While it is possible to calculate a route between two points by traversing through the topology graph based on node connections only, without paying attention to the Level connections, it is also useful to be able to identify the level connecting topology objects. As of MOM version 2.83.0, the LevelConnector can include a set of LevelConnectingTopology objects, which consists of the topology and the connected two Levels.

For example, A simple ramp has just one such object, but an elevator can have a list of them, one for each level connection. Therefore, for an elevator connecting levels 1, 2, 3, 4, and 5, there are 4 connections: [1-2], [2-3], [3-4], [4-5].

### Ramp Attributes

In addition, LevelConnector provides generic attributes for ramps, including pitch angle, ramp angle, curvature, and length. For multi-level ramps, or ramps with non-uniform attributes, LevelConnector represents the worst-case attributes. The car or the driver can then decide if the car is able to drive on the ramp without incurring damages.

Pitch angle represents the angle of the ramp as seen from the base of the ramp and depicted as the red angle in the following diagram. This parameter checks against the car's approach and departure angles, where the approach angle refers to the angle between the car's front wheels and ground clearance of the front bumper, and the departure angle is the corresponding angle for the rear of the car.

Ramp angle represents the angle at the top of the ramp, which is depicted as the yellow angle in the following diagram. It is related to the car's break-over angle, as in the max angle between the front and rear wheels when considering ground clearance. If the levels before and after the ramp are aligned, then the ramp angle equals 180 degrees minus the pitch angle.

If the ramp length, indicated by the grey line in the following diagram, is shorter than the car's wheelbase, the ramp angles are not directly comparable to the angles of the car. Larger pitch and ramp angles can be accepted, however in most cases where a ramp connects levels, the length is significantly longer than a wheelbase, and it may not be present for most of the ramps.

Curvature represents the extreme, as in maximum or sharpest, curvature of the ramp in 1/(radius of curvature in meters) x 10^6 (such as the curvature value 0.01234 stored as 12340). The radius represents a circle fitted to the curve, as illustrated in the following figure.

Curvature can be optionally provided in situations where the intersecting topologies are not defining curvature, and a minimum possible curvature needs to be provided. Curvature direction is not specified, as it depends on the traversal direction, and is therefore specified as an absolute value only.

   "type": "Feature",
"momType": "indoor.LevelConnector",
"id": "level-connector-1",
"geometry": {
"type": "Point",
"coordinates": [9.1854982, 48.7786313]
},
"properties": {
"indoorMapId": "indoor-map-1",
"spaces": [{ "id": "ramp-1" }, { "id": "ramp-2" }],
"rampAttributes": {
"pitchAngle": 5000,
"rampAngle": 175000,
"lengthCm": 1500,
"curvature": 192619
}
}


A ramp may be also described with ElevationPoints that can help provide a full 3d view of the ramp slope geometry.

## Space group

The spaceGroups feature was originally defined to be a single container of zero or more space groups. However, it has been extended to be optionally level specific. The common space group still remains valid for maps created before this update, and for non-parking section related grouping.

Space groups exist for the following two purposes:

• To share common occupant(s) and the main entrance for navigation, such as in a multi-floor shop in a shopping mall. They can also represent resources, such as a parking section formed from parking spots by location, without common properties, for example "Section A" of a garage.
• To share common properties, such as parking spots forming a parking section with common space properties.

The mainSpace is generally suggested by the venue owner when shared among common occupants. In raw material, it plays a role in labeling, assigning an occupant, a search by an occupant, and navigation. When adding an occupant to a space that belongs to a group, the occupant saves the reference of the mainSpace only, and it is considered associated with all the spaces of that group for the purposes of the display label, navigation landmark, and more. An occupant can only be associated with one of the included spaces. A space group can have multiple occupants, and all of them will be visible on all spaces. Additionally, an occupant can be associated with multiple space groups.

The group can also represent a set of spaces that share common space type properties, so that the mainSpace can be used to represent the group. This provides a way to create different kinds of hierarchies that can be created with MicroPAs, such as with an aisle - shelf - bin hierarchy. A typical example is a parking garage with groups of parking spots reserved for drivers with disabilities close to each other, but covering only a subset of the spaces in the parking space rows. In this example, navigating to a parking section reserved for drivers with disabilities makes more sense than navigating to an individual parking spot.

Common spaceTypeProperties are stored in the main-space and not in the individual spaces. If there are further details, those can be included as individual space properties, such as in a group of EV-charging-equipped parking spots or some parking spots that could be additionally reserved for drivers with disabilities. The mainSpace in this example is expected to have a geometry that covers all the individual spaces.

Additionally, there can be super-groups having a list of mainSpaces from other groups, and a new higher-level mainSpace. As the group includes a parent space, the parent is indicated in the properties of each space, as spaceProperties.parentSpace. The parent cannot have cyclic references back to the children, but it can access the children through the space group list.

One space cannot be part of the spaces-list of multiple space groups. spaceGroupId is used for maintaining a consistent unique ID for space group management in the editor application.

The sample below shows a case involving both space group types. The spaceGroups list includes one group of three spaces from different levels that need to be handled as one. The commonalityGroup lists two parking-related groups: the first one represents an EV-charging section of three parking spots, and a parking section for drivers with disabilities consisting of four parking spots.

{
"id": "spaceGroups-26848",
"type": "Feature",
"momType": "indoor.SpaceGroups",
"properties": {
"indoorMapId": "1234567890_Sample",
"featureType": "indoor.SpaceGroups",
"@ns:com:here:mom:meta": {
"modelVersion": "2.13"
}
"spaceGroups": [{
spaceGroupId: "group1",
mainSpace: "space-31420102",
spaces: ["space-31420306", "space-31420202"]
}],
"commonalityGroups": [{
spaceGroupId: "EV-charging-pool-1",
mainSpace: "section-123",
spaces: ["space-31420506", "space-31420502", "space-31420504"]
}, {
spaceGroupId: "Disabilities-1",
mainSpace: "section-124",
spaces: ["space-31420511", "space-31420512", "space-31420513", "space-31420514"]
}
]
},
"geometry": {
"type": "Point",
"coordinates": [3.07382, 50.636827, 0]
}
}


## Occupant

Occupant represents logical entities that occupy a Space. Occupant is not meant to represent dynamic occupance of parking spots, but is instead for longer-term occupancy of spaces such as rooms. Occupant can follow HERE Places categorization, but does not always do so, as occupants are not just shops, restaurants, and other businesses, but can be also professionals occupying an office room.

{
"id": "occupant-1788625",
"type": "Feature",
"momType": "indoor.Occupant",
"properties": {
"spaces": [{
"id": "space-31302019"
}
],
"indoorMapId": "1234567890_Sample",
"attributes": {},
"featureType": "indoor.Occupant",
"isoCountryCode": "FRA",
"placeProperties": {
"names": [{
"name": "France Télécom",
"nameType": "OFFICIAL",
"languageCode": "ENG"
}
],
"featureType": "Place",
"isoCountryCode": "FRA"
},
"@ns:com:here:mom:meta": {
"modelVersion": "2.13"
}
},
"geometry": {
"type": "MultiPoint",
"coordinates": [[3.07382, 50.636827, 0]]
}
}