In Situm Platform, a building can have a number of Points of Interest that represent significative locations inside or outside of the building. For detailed information on points of interest, you may read their introductory description and how to create them in Situm Dashboard. You may also find interesting their data models as provided by Situm REST API Floor methods and Situm SDK Floor model.
Fetching all the Indoor POIs of a building
Situm allows both indoor POIs (within the floorplan limits) & outdoor POIs (outside the floorplan). The following code snippet shows how to retrieve the indoor POIs of a certain building and output their information on the application Log. For this example, we will use building 8377, which we know from a previous example.
//Fetches all the indoor POIs from the building 8377
SitumSdk.communicationManager().fetchIndoorPOIsFromBuilding("8377", new Handler<Collection<Poi>>() {
@Override
public void onSuccess(Collection<Poi> pois) {
//Receives all the buildings and loops over them
for (Poi poi: pois){
Log.i(TAG, "BuildingID: " + poi.getBuildingIdentifier());
Log.i(TAG, "FloorID: " + poi.getFloorIdentifier());
Log.i(TAG, "PoiID: " + poi.getIdentifier());
Log.i(TAG, "Name: " + poi.getName());
Log.i(TAG, "InfoHTML: " + poi.getInfoHtml());
Log.i(TAG, "CustomFields: " + poi.getCustomFields());
Log.i(TAG, "Category:");
Log.i(TAG, " CategoryID: " + poi.getCategory().getIdentifier());
Log.i(TAG, " Code: " + poi.getCategory().getCode());
Log.i(TAG, " NameInLocale: " + poi.getCategory().getName());
Log.i(TAG, " NameInAllLanguages: " + poi.getCategory().getNameAsI18n());
Log.i(TAG, " IconURL (when selected): " + poi.getCategory().getSelectedIconUrl());
Log.i(TAG, " IconURL (when unselected): " + poi.getCategory().getUnselectedIconUrl());
Log.i(TAG, "Position:");
Log.i(TAG, " BuildingID: " + poi.getPosition().getBuildingIdentifier());
Log.i(TAG, " FloorID: " + poi.getPosition().getFloorIdentifier());
Log.i(TAG, " WSG84 Coordinate. Lat=" + poi.getPosition().getCoordinate().getLatitude() + " Lng="+poi.getPosition().getCoordinate().getLongitude());
Log.i(TAG, " Cartesian Coordinate (meters). X= " + poi.getPosition().getCartesianCoordinate().getX() + " Y="+ poi.getPosition().getCartesianCoordinate().getY());
Log.i(TAG, " IsIndoor? " + poi.getPosition().isIndoor());
}
}
@Override
public void onFailure(Error error) {
Log.e(TAG, "Error: " + error );
}
});
In the previous code snippet, we are receiving a Collection of POI objects (the POIs in Building 8377), and we loop over them to print their properties. Your application logs should be something like this:
...
BuildingID: 8377
FloorID: 20541
PoiID: 64478
Name: Shop
InfoHTML: <p><b>Welcome to the shop!</b></p>
CustomFields: {show_in_app=true}
Category:
CategoryID: 1206
Code: MC
NameInLocale: My Category
NameInAllLanguages: I18nString{values={spa=Mi categoría, eng=My Category}}
IconURL (when selected): URL{value='/uploads/poicategoryselected/1206/b7bac260-f68d-4554-9054-d8a9be992618.png', isAbsolute=false}
IconURL (when unselected): URL{value='/uploads/poicategory/1206/a04cf2b3-5c09-40d1-8dca-3f3d9ae3adde.png', isAbsolute=false}
Position:
BuildingID: 8377
FloorID: 20541
WSG84 Coordinate. Lat=42.8722187941717 Lng=-8.56361387801399
Cartesian Coordinate (meters). X=68.521411474978 Y=31.7456405070183
IsIndoor? true
...
BuildingID: 8377
FloorID: 20541
PoiID: 64479
Name: Entrance
InfoHTML: <p>Entrance</p>
CustomFields: {}
Category:
CategoryID: 148
Code: situm-default
NameInLocale: No category
NameInAllLanguages: I18nString{values={spa=Sin categoría, eng=No category}}
IconURL (when selected): URL{value='/uploads/poicategoryselected/148/4c85ebd0-6ff2-4c1d-bad5-1f9f9eedc847.png', isAbsolute=false}
IconURL (when unselected): URL{value='/uploads/poicategory/148/8ac8e04f-a6a0-4da5-a08d-02ec33ffdcfb.png', isAbsolute=false}
Position:
BuildingID: 8377
FloorID: 20541
WSG84 Coordinate. Lat=42.8724016056969 Lng=-8.56283871960868
Cartesian Coordinate (meters). X= 2.72343394626029 Lng=22.0525554105088
IsIndoor? true
...Let's examine them in detail.
Building and floor Identifier
First, you will notice that the POI data object allows you to retrieve the identifier of the building & floor to which the POI belongs. This is handy if you need this information later in your code.
BuildingID: 8377 FloorID: 20541
POI Identifier
Then, we output the POI identifier.
PoiID: 64478
The POI identifier is automatically generated by Situm Platform when the POI is created. Another way to know the identifier of a floor is by retrieving the POIs from Situm REST API.
POI Name, free HTML information and custom fields
After that, we see the POI name, it free HTML info (filled using our Rich Text Editor) and the POI's custom fields.
Name: Shop
InfoHTML: <p><b>Welcome to the shop!</b></p>
CustomFields: {show_in_app=true}All this information can be configured when creating/editing the POI:

POI Category
The previous image shows that each POI can be assigned to a different category. For instance, a POI may be a shop, while other may be a restroom or an information point. Situm Dashboard comes with a predefined set of categories but also allows you to define your own. Categories are specially useful if you want to assign different icons to your POIs when showing them in your app, or if you want to build advanced search/filter utilities.
The POI data object contains a full PoiCategory data object instance, therefore we have access to all the details of the POI's category. This can be seen in the log output:
Category:
CategoryID: 1206
Code: MC
NameInLocale: My Category
NameInAllLanguages: I18nString{values={spa=Mi categoría, eng=My Category}}
IconURL (when selected): URL{value='/uploads/poicategoryselected/1206/b7bac260-f68d-4554-9054-d8a9be992618.png', isAbsolute=false}
IconURL (when unselected): URL{value='/uploads/poicategory/1206/a04cf2b3-5c09-40d1-8dca-3f3d9ae3adde.png', isAbsolute=false}The category data includes the identifier of the category, its code, the name of the category (shown in the locale of the smartphone), the name of the category in all the supported languages, and the 2 URLs that will allow you to download the icons of the category (usually, one of them will be shown when the POI icon is selected, and the other when it is unselected).
POI Position
Last but not least, each POI will have a certain location. This location will be provided as an standard Situm Point data object whose info is shown on the log:
Position: BuildingID: 8377 FloorID: 20541 WSG84 Coordinate. Lat=42.8724016056969 Lng=-8.56283871960868 Cartesian Coordinate (meters). X=2.72343394626029 Y=22.0525554105088 IsIndoor? true
Fetching all the Outdoor POIs of a building
Fetching the outdoor POIs of a building is similar to fetching the indoor ones: instead of using the CommunicationManager.fetchIndoorPOIsFromBuilding method, you may use the CommunicationManager.fetchOutdoorPOIsFromBuilding one. The snippet would be like this:
//Fetches all the outdoor POIs from the building 8377
SitumSdk.communicationManager().fetchOutdoorPOIsFromBuilding("8377", new Handler<Collection<Poi>>() {
@Override
public void onSuccess(Collection<Poi> pois) {
//Receives all the buildings and loops over them
for (Poi poi: pois){
Log.i(TAG, "BuildingID: " + poi.getBuildingIdentifier());
...
}
}
@Override
public void onFailure(Error error) {
Log.e(TAG, "Error: " + error );
}
});You may print all the POI information as in the Indoor POIs example to see a log output like the following one.
BuildingID: 8377
FloorID: -1
PoiID: 64480
Name: OutdoorPOI
InfoHTML:
CustomFields: {}
Category:
CategoryID: 148
Code: situm-default
NameInLocale: No category
NameInAllLanguages: I18nString{values={spa=Sin categoría, eng=No category}}
IconURL (when selected): URL{value='/uploads/poicategoryselected/148/4c85ebd0-6ff2-4c1d-bad5-1f9f9eedc847.png', isAbsolute=false}
IconURL (when unselected): URL{value='/uploads/poicategory/148/8ac8e04f-a6a0-4da5-a08d-02ec33ffdcfb.png', isAbsolute=false}
Position:
BuildingID: 8377
FloorID: -1
WSG84 Coordinate. Lat=42.872388178306 Lng=-8.56437136391785
Cartesian Coordinate (meters). X= 0.0 Y=0.0
IsIndoor? falseNotice that since this is an Outdoor POI, the floor identifier is "-1" (since the POI does not belong to any floor) and the POI.getPosition.isIndoor method returns false.
Fetching all the POIs of the user account
Finally, you may be interested on fetching all the POIs of the user account, irregardless of the building where they have been created. You may do it by using the method CommunicationManager.fetchAllPOIsFromUser. This can be useful, for example, if you want to build an utility that is able to search across all the POIs of all the buildings.
//Fetches all the POIs from the user account
SitumSdk.communicationManager().fetchAllPOIsFromUser( new Handler<Collection<Poi>>() {
@Override
public void onSuccess(Collection<Poi> pois) {
//Receives all the buildings and loops over them
for (Poi poi: pois){
Log.i(TAG, "BuildingID: " + poi.getBuildingIdentifier());
...
}
}
@Override
public void onFailure(Error error) {
Log.e(TAG, "Error: " + error );
}
});