Points of Interest Repositories

Prev Next

The data domain contains three sub-domains that are relationally associated:

POI_repo
  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 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.

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:

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

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,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";
    electricityType.poiTypeGroup = utilitiesGroup;
    Plain text
  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;
    Plain text
  3. Add the POI types to the database:

    api.poi.poiTypeRepository.save([electricityType, networkingType]);
    Plain text

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();
    Plain text
  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.");
        }
      });
    Plain text
  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:

    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
      });
    Plain text

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 .

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
  1. Define the coordinates for your bounding box and the 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
    Plain text
  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();
    Plain text
  3. Run your query:

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