---
title: "NavVis IVION Point of Interest Repository"
slug: "creating-custom-poi-types"
description: "Learn to create and manage POI types and groups in NavVis IVION, including user permissions, icons, and geofencing for efficient data organization."
updated: 2024-03-18T12:18:58Z
published: 2024-03-18T12:18:58Z
canonical: "knowledge.navvis.com/creating-custom-poi-types"
---

> ## Documentation Index
> Fetch the complete documentation index at: https://knowledge.navvis.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Points of Interest Repositories

The Point of Interest (POI) data domain contains three sub-domains that are relationally associated:

![POI_repo](https://cdn.document360.io/bf174766-fa1a-4fe1-a4d7-b1db1e7cb996/Images/Documentation/POI_repo.png)

1. **PoiTypeGroupRepository**: A POI type group is used to create a set of POI types. User permissions can be configured for the POI types within the group.
2. **PoiTypeRepository**: A POI type is used to categorize POIs. POI icons and their zoom-level visibility can also be configured here.
3. **PoiRepository**: POIs are points defined in the 3D coordinate system of a NavVis IVION Site that have additional information attached to them. In addition to basic information (e.g. title and body text) you can add a unique icon and custom data and customize user permissions.

## Creating a Custom POI Type Group

### Procedure

> [!NOTE]
> **Note**: Make sure that you are logged into NavVis IVION with admin rights.

1. To generate an empty POI type group object, set its name (here: "Utilities"), and persist the object to the database, run:

```plaintext
let utilitiesGroup: PoiTypeGroupInterface = api.poi.poiTypeGroupRepository.create();
utilitiesGroup.name = {"en": "Utilities"};
api.poi.poiTypeGroupRepository.save(utilitiesGroup);
```

## Creating Custom POI Types

### Procedure

> [!NOTE]
> **Note**: We are using "Electricity" and "Networking" as examples here.

1. Run the following to create the "Electricity" POI type. For this type a [data URI](https://en.wikipedia.org/wiki/Data_URI_scheme) is used to store the icon in the NavVis IVION database:

```plaintext
let electricityType: PoiTypeInterface = api.poi.poiTypeRepository.create();
electricityType.name = {"en": "Electricity"};
electricityType.icon = "data:image/png;base64,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";
electricityType.poiTypeGroup = utilitiesGroup;
```
2. Run the following to create the "Networking" POI type. For this type a URL is used to reference the icon from an external source:

```plaintext
let networkingType: PoiTypeInterface = api.poi.poiTypeRepository.create();
networkingType.name = {"en": "Networking"};
networkingType.icon = "/poi/image/icon-51c5e498-f155-437b-b68c-52ae5012ba82.png";
networkingType.poiTypeGroup = utilitiesGroup;
```
3. Add the POI types to the database:

```plaintext
api.poi.poiTypeRepository.save([electricityType, networkingType]);
```

## Selecting POIs and Assigning POI Types

### Procedure

> [!NOTE]
> **Note**:****As an example, we are:
> 
> - Selecting10 POIs starting from the 8th row of the database.
> - Assigning the first 5 POIs to the "Electricity" type and the last 5 to the "Networking" type

1. Build a POI filter query using the POI filter builder:

```plaintext
const poiFilterBuilder: PoiFilterInterface = api.poi.repository.createFilterBuilder();
const poiFilter: RestFilterInterface = poiFilterBuilder.offset(8).limit(10).build();
```
2. Use your POI filter to define a set of POIs for each POI type ("Electricity" and "Networking"), and to assign POIs to the respective POI type:

```plaintext
api.poi.repository.filter(poiFilter)
  .then((pois: PoiInterface[]) => {
    if (pois.length === 10) {
      const electricSet = pois.slice(0,5);
      const networkSet = pois.slice(5,10);

      electricSet.forEach((poi: PoiInterface) => {
        poi.poiType = electricityType;
      });

      networkSet.forEach((poi: PoiInterface) => {
        poi.poiType = networkingType;
      });

      api.poi.repository.save(electricSet.concat(networkSet));
    }
    else {
      console.log("At least 18 POIs for the example to work.");
    }
  });
```

## Getting POIs of a Specific Type

### Procedure

1. You can retrieve POIs of a specific type by using a POI filter to build a query. Pass an array of POI types to the filter:

```plaintext
const electricityType: PoiTypeInterface = getElectricityType();

const poiFilterBuilder: PoiFilterInterface = api.poi.repository.createFilterBuilder();
const poiFilter: RestFilterInterface = poiFilterBuilder.poiType([electricityType]).build();

api.poi.repository.filter(poiFilter)
  .then((electricityPois: PoiInterface[]) => {
    // Perform some action
  });
```

## Getting POIs Using Geofencing

This example shows how to retrieve POIs by geofencing. There are two steps:

1. Filter your POIs using a bounding box.
2. Narrow the results, e.g. to a specific floor within the Site Model.

A bounding box is a 2-dimensional outline with a 3rd dimension that is infinite. It is defined by a **min**and **max**set of coordinates. On the 2D map in NavVis IVION:

- The **min**coordinate is the upper-left point.
- The **max**coordinate is the lower-right point.

Once a bounding box has been used to pre-filter POIs, the results can be narrowed by vertical space (the third dimension) by using the site model to set vertical boundaries. For this purpose, the site model must already be correctly generated in NavVis IVION.

![repo-poi-geofence](https://cdn.document360.io/bf174766-fa1a-4fe1-a4d7-b1db1e7cb996/Images/Documentation/repo-poi-geofence.png)

### Procedure

1. Define the coordinates for your bounding box and the Site Model in the site coordinate system:

```plaintext
// Site coordinates for geofencing
const min = {10, 10, 10};
const max = {20, 20, 20};
const siteModelEntity = await api.siteModel.repository.findOne(2); // arbitrary site model entityee
```
2. Once these limits have been defined, you can build the filter query:

```plaintext
const poiFilterBuilder: PoiFilterInterface = api.poi.repository.createFilterBuilder();
      poiFilterBuilder.boundingBox(min.x, min.y, max.x, max.y);
      poiFilterBuilder.siteModel(siteModelEntity);

const poiFilter: RestFilterInterface = poiFilterBuilder.build();
```
3. Run your query:

```plaintext
api.poi.repository.filter(poiFilter)
  .then((geofencedPois: PoiInterface[]) => {
    // Perform actions on geofenced POIs
  });
```

A point of interest is a marker placed in NavVis IVION that refers to objects or areas (e.g., cafeteria, coffee machine). POIs can store detailed information about the building features or locations they stand for. POIs appear in NavVis IVION as interactive icons that provide more information when users click on them.

Site refers to a complex of one or more buildings displayed in a NavVis IVION instance. For example, the Munich Airport would be one site. An instance can contain multiple sites. Each site consists of one or more datasets.

Point Of Interest

A site model is a three-dimensional model which clusters information by assigning meaningful names to clearly defined areas in the space of a site. With a site model, you can define and name the buildings, floors, rooms, or even more fine-grained spaces, of a site in NavVis IVION. Among other things, this information is used to create the floor changer and enrich POI search.
