Skip to main content

Points of Interest Repositories

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

  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

Follow these steps to create a custom POI group:
Note: Make sure that you are logged into NavVis IVION with admin rights.
To generate an empty POI type group object, set its name (here: "Utilities"), and persist the object to the database, run:
let utilitiesGroup: PoiTypeGroupInterface = api.poi.poiTypeGroupRepository.create();
utilitiesGroup.name = {"en": "Utilities"};
api.poi.poiTypeGroupRepository.save(utilitiesGroup);

Creating Custom POI Types

Follow these steps to create custom POI types:
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 is used to store the icon in the NavVis IVION database:
    let electricityType: PoiTypeInterface = api.poi.poiTypeRepository.create();
    electricityType.name = {"en": "Electricity"};
    electricityType.icon = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH4wISCjIRVoP+rQAADNRJREFUeNrNm1uMXVUZx/9r7b3PZZ8pTgttKdXYDkXC3abRWAqdM9M9pbQQSwKJXB4aExNjRI23EJHEBIpGLgaiLyY+GKMv+GBTa+rMnpnTkZomCoJgKhdpCpQ6kF6mM+e2z157+cBax29W1z63uUATkjbs7G/997fWb33r/63DgqDoAPDCsFQLgmIWgAjDUhwExTyAGj78kwNQBeAB4GFYqgdBMQcgCsNSQp5lALJhWKoGQTEDQIZhqaGfBZAA8AFUAHQT1wXg6LhhWKoB2HT33V985/z5mciI6wFgYViKjLh59S4aN8PpPwA01CB89TAAFMKwpAfB1CCyAOoAkiAo6v/PAOTIIBIlPq+elQD6wrCkxWdI3LhNXC0+u2XLZ+sAvrFyZX/24MHDdRU3T+KCiK8r8X3qXTSuB0AwACCDSIKg2AdgTr24EIalOTVLOMmmFrQCwCwArsRXgqDoqswLQ1AfedYUnwRBsQCgbInrKEHZG2+8Lnr66V9c53neDxuNxpeCoKjF67gwZpE5Rio+ASCYymZDDWKFEg/yYkdlPibZTMiL9fSrkcwLJaiiM6/eywG4WpASL9RHL6u4fhiWysZHzydJUp+YmLrMdd3TQojVO3cOnxNC6BlHxafF9dQsyqjlJoKg2MfVP2jmYWSTk+lZD8NSAqBgEZ8hmaeD8MOwZIrPWcRLFdcU71ertWhiYuoS13VPxXH8vJTyrBAia0x7Lb6q3lUgcT2ydBMal4qj4vWLOVnHNfWh/DAslVPE63dR8XoWZSzifZL5PMmmq+PGsagfPXpMOI7z9ziOWTab3TMyMpQjcUHjqgTpWaSnfd0AbTMuU+KqBCYVIt6kvRZE1zylPV17pviqMe1tcefRXsd1XXc8juNhxtg/RkaGbhkdnagQ8ZHBpbS4dJdpxmUKJCDg0dNer9OITKmyId4jmafbF4VYhmyLgmS+YgBvHu01lzzP+02j0XiAMYY1ay67cnr6g7fItDeh3GeJS7l0UVz9ATqlvZmtJaE9gGhsbFLmcrlv1+v1pwDAdd2/xHG8vQfaCxK3YiZIZ3OO0F5P5cgiPmtkXpjgIYNwjSJHg1ZnwDc+eqTiNsKwJPv7P7FVi3ccB3Ecf8tC+xqh/SwBnv7oiRFXkrgcAOcAqh8X2uu4a9euvnJm5sJfAYBzDiHEFIAXyXbcNe3JGHVcNwxLDU7K24+U9lr8FVesu2J6+oN/6cwnSYJMJrN/aOjWDPlQ3dJeGktXJyjPgqCY/bjQfmjolsLk5PMvMMauVpkH5/w/SZJsUhVrz7Q3xOul2dCl8EdK+3Pnzie7d+/MPProT//IGBvR4hlj8DxvaxRFxxZKezLtdTUYA0jYEtI+7UzhmFtsNpspHDo0+ksA9zmO0xQPoCql9BeD9kbchj4k8SWkfZl8SCvtAUjG2IpDh0YftIiHlPILt98+4i8G7QmXGuQsU+bLQHt6ptAQi8KwlBQKvj82NnktgB+TNa/Fx1u3fu5EFEW1HmifN2lPtliqFzwIinlFe76EtHcM2otdu4L8gQN/WgXgmKY9EY9cLnf37t075xhjvdC+atJefXQ6RgYg5wwMbBADAxs4OQR1SvtaG9pX02g/PLzdHxub9Bhj/3Uch9HMJ0kCx3HONhqNL6u/07jZFAepSoorKl5/qObuRuCYD8NS1SVOToWQ1KR9Xwrt4y5oHwFIduwYLIyPHykzxt7gnHO65pVgCCEeGRzcBs/z0mgft6G9Y7hctATnZIm4TC2B6gJpX25BXerLrQjD0ixjbJRzPmIAT4ufBnC5MmcWjfZkR6LVINN1wGI4OdRB4oYf2BQP4HeO49ybIh4AHh4ZGXpWStnSySFrntYtjsWEXWHxOppnCr4EtHdM2qtBzgL4Aef8XoP2zZJX7fs/GRubXHTaW1zjOAiKPl8A7edSaB9R2uszBef8Vsdx9pu015mXUiKT8R5jjCVLQXuyhBhJUE0vgSWp7fWZwnXdDVLKExba62mv/54NgqIwQJuk0L5sq+0N2pvlPDMdJFoKL1ptr9Ze4ezZmfLx4/++JIqimRZrHq7rIo7j719//bU/A6T/6qvHq5s2bfTK5Upy+vS0uOGGa/3jx1+vZLMZdtVVVxZeeumVubVr13qbN18vDh8er6cYLvNoTzI/70zB1HSTC6A9t4EnSZLZiYkpOI7zrhBifRvxYIyBMdYsiKSULZ/lnP9eCHGP8dFpOT+P9mkOEtfZ6rC2h6W2pw5ScxBK/ORCxLuuO2+J0GeFEPeTMwWlPSOGi0uBRzOvPxTvgPaFbmgvpZwNwxJc1/mtEKKYQvuLBNnEx3FM+UCfvfqOO3ZxGrcN7Qva6FHPar0ZDqDX2v4i2tdq9fLNN3+eeZ73UByL+9JoTwVxzq3TvoX4p/bu3XOyVqs1WtA+Y/ibVcPlau4yrEPaU+peZF1r2gOA7/s7KpVK2Ib2TfF6Z7CteYv4t6WUG4KgyMbHj3RF+5TdLeMMDGygJ0BhlMKMVFqOecAAIAcGNhQAVPbtu5+9/PIr1124MHus1ZrvVDx9Vi+RdesuHzh8+FBdiS8Q8XQ7Zin9AupyNR2ktO5wx7QHMMs5Z6+99ubqkyffnu4EeDbxdM3b4Oi67iPbt9/8OOe8J9qT436Vdof5QmkvpWSjoxPy5Mm3X+yU9q3E2+DoOM5YHMePCSF6pr0qq2lxJbQlJnqhvX7x+PgRCWCcc76eMbbYtAfnHP39K+4CAM/zuqI92d0yljNFAUDZNWrsNDNjXr9AP+v7+SyA/ZzzbQBmVba4yjzTZgdjjKlpzzjnXImXjuNkWol3HAeMscEzZ86XLbSvGg3Si2hPzhQ1In7euYf1QntqmaPHPxs3fnrViRMnz7TKvJTy11LKfYtB+xSjx9odttJeTfuOa2ziyGZN3/6ee/bmnnvuD18B8GyLanBWSrlSvbeXuKbL1VN3OLLU2LY7OT6xzNs6OaoYOeu67soU8RKQ/UEwlChjhLW4stP2LpDhddBkc7M7nEp7o1/gplxLaevbJ0lSATDkOM5KC+01HPcr8WXDs3QN4KXRnsYVLfoFDu0Ot6S9YZnburR+G9++AKA8MTElXdd90Aa8JEkgpXzp/fff+JHKfCvaV7uhfavusFnb19rU2CCzpKIvPxrgsTk5lQ9LBMniOL4rRbxcv37dns2bt4tuanuLg5S0cLmog5TjBu3rRm3PjUuIklCXdmzMfkHG8O0rqkAqMMa+Y655JR65XHbfqVOn37vmmqt5i8uPNXVBk370nBGXJghkjGa/wNodpk7wgmhvpS5jrzPGrjILIs9zDzQa8V71rkWnvXEl+KLu8FLQ/qIzxerVK/NnzsxUbNUggPzg4C11xpaG9oatP6873GhBe68L2meNLi0Fz9ydd+7iZ87MPGfQXp/6BhqNqMbYktGeGj3aMm92h0UL2sOgbiva284UTd/+nXdOZZIkGSbA0+eEJ5MkOTEyMpxrQ3t/AbSnF7D0UXrWdlEyrca2Wea2q+50iTTPFPl8jh88ePhGx3H+RsULId4F8CnSnjPj1i0luFnbN4y4fopV37DwIacrQbNBaruESI2Rrn17zvlbUsqNRLz0PG/N4OC2qno2rbancbPkvtJC+gXNZ3nKdZhWjgrt0pqZNx0kJwxLtf7+/k9q8cTpeYiId1OuvdK4lEvt4rop3eGK+aHM7vCi0J6C5+GHv+s+/vhTX5NSPvP/gw/+nCRyt2qDLQvtO+kOyw7v22dTGqS+rTusfqkhqfGxadPAqjfffOtcypnCHHCmi+4wpX1k+Q2EtTvsLRLtK2TaN4KgmI+iRgRgG7W58/lcoMR7ho21pLRv1R1mZm1vlJkta/uULm0OQDQ1dVS4rvt14g3+qlqtjVtq+1oK7Tut7T0j8510h/O0O7xotKfU3bLlpkteeOHlGeUEzwghVg4Pb3c558tO+066wz3V9mk3MDlnhdHRya8CeFJte6tuu23HrBBiUc4UtriW6/h+p93hZKG0N7u06kbIPx3HuUEI8WQQFB9aBtr33B3uprbPWy4k0WspfQDmOOcblfgXAXxvGWr7vl67w/mF0p5sOQUAc5s33yQZYz8XQuDSS1ftHB7e7i0D7Vs5SL6lO8x0d7jaIe39NNqb1H3iiWcghNjhuu4DIyPFCxMTU61on10O2lu6wzlbd3jBd3IYY7mxsclBzvk3kyTZ1WaXWTbap/wMIMP0j5F7pT3pFzQHwRg7vW7dms+89970rEldUlmm0b7aok/RM+1J3Hm/gbBdlOyK9qaDtH79uvy5c+cvrVSq73Z4plgW2qf8uFswXWOr/7q5+UmfzYVhqbpnz23ukSNHV8/NzZ3W4GlX2xtx6Zo3b342LGPMpRzk2sXVy63wPwvJWvkV77o8AAAAAElFTkSuQmCC";
    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:
    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:
    api.poi.poiTypeRepository.save([electricityType, networkingType]);

Selecting POIs and Assigning POI Types

Follow these steps to select POIs and assign them to POI types:
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:
    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:
    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

Follow these steps to get POIs of a specific type:
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:
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.

  1. Define the coordinates for your bounding box and the site model in the site coordinate system:
    // 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:
    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:
    api.poi.repository.filter(poiFilter)
    .then((geofencedPois: PoiInterface[]) => {
    // Perform actions on geofenced POIs
    });