Skip To Content

Set up device tracking

ArcGIS Indoors provides a feature to track the mobile devices on which it is installed. Cases where information related to the location of a device can help facility management make their operations more efficient include, but are not limited to, the following:

  • Analyzing real-time occupancy of office space
  • Keeping track of deliveries within a facility
  • Examining patterns of movement of occupants to identify bottlenecks during peak hours

Note:

The Allow Device Tracking setting should be turned on. The permission to access location must be granted to Indoors for Android when it’s installed so it can determine real-time location and post tracking points when it's not being actively used. After allowing location access, a notification appears in the status bar indicating that the app is using location information while running in the background. Sometimes, posting of tracking data may not resume when the device has been powered on after being shut down and it may be necessary to unlock the device and open Indoors for Android once for uninterrupted posting of tracking data.

Device tracking feature schema

The following table describes the fields and data types of the tracking feature class.

Field name Field alias Data type Description Sample values

activity

Activity

esriFieldTypeInteger

Activity reported by the device (stationary, walking, driving, and so on)

0, 1, 2, ...

altitude

Altitude

esriFieldTypeDouble

Altitude value reported by the GPS receiver on the device

0.5, 1.0, 5.0

app_id

App ID

esriFieldTypeString

Name of the app

ArcGIS Indoors (constant)

background_mode

Background Mode

esriFieldTypeSmallInteger 1

State of the app when running on the device (background or foreground)

0,1

battery_percentage

Battery Percentage

esriFieldTypeDouble

Battery power reported by the device

1–100

battery_state

Battery State

esriFieldTypeInteger

State of battery reported by the device (charging, discharging)

1,2

course

Course

esriFieldTypeDouble

Heading direction relative to true north

0–359

device_id

Device ID

esriFieldTypeString

Unique identifier of a device running the app

GUID

device_type

Device Type

esriFieldTypeString

Make and model of the device

iPhone 7, Pixel 2

floor

Floor

esriFieldTypeInteger

Vertical order reported by IPS

0, 1, 2

horizontal_accuracy

Horizontal Accuracy

esriFieldTypeDouble

Radius of uncertainty of the latitude and longitude values in meters

0.5, 1.0, 2.5

latitude

Latitude

esriFieldTypeDouble

Latitude value reported by the GPS receiver on the device

-90 to 90

location_source

Location Source

esriFieldTypeString

Source of IPS signal reported by ELSS

BLE, WiFi, GPS

location_timestamp

Location Timestamp

esriFieldTypeDate

Date and time value when location information was posted

2/21/2019, 10:46 PM

longitude

Longitude

esriFieldTypeDouble

Longitude value reported by the GPS receiver on the device

-180 to 180

session_id

Session ID

esriFieldTypeString

Value representing the tracking session

Tracking Note

signal_strength

Signal Strength

esriFieldTypeDouble

Power present in a received radio signal (RSSI)

-1, -90

speed

Speed

esriFieldTypeDouble

Speed of movement reported by the sensors of the device

1.0 (meter per second)

user_id

User ID

esriFieldTypeString

User name used to sign in to the app

user_Indoors

vertical_accuracy

Vertical Accuracy

esriFieldTypeDouble

Vertical accuracy of the altitude value

0.0, 0.5, 1.0

Create the device tracking feature layer

A feature service must be set up on your portal, and a feature layer must be created with the device tracking schema to store location data. A spatiotemporal big data store is recommended, as it can scale to manage large amounts of tracking data.

Set up a spatiotemporal data store

Follow these steps to set up a spatiotemporal data store for your portal.

  1. Install ArcGIS Data Store.
  2. Create a spatiotemporal data store.
    Note:

    Go to https://<my big data store>/arcgis/datastore/ to confirm the configuration status and make sure that the ArcGIS Enterprise server specified in the installation process is listed.

Create a feature service

Create a feature service for device tracking.

  1. Go to https://<my indoors portal>/portal/sharing/rest/login and sign in with the primary administrator's account.
  2. Go to https:// <my indoors portal>/sharing/rest/content/users/<admin>/createService.
  3. Enter the .json template in the Create Parameters box and click Create Service.
    {
      "name" : "DeviceTracking_BDS",
      "editorTrackingInfo": {
        "enableEditorTracking": true,
        "enableOwnershipAccessControl": true,
        "allowOthersToUpdate": false,
        "allowOthersToDelete": false,
        "allowOthersToQuery": false
       },
      "capabilities" : "Create,Delete,Query,Update,Editing",
    options: {"dataSourceType":"spatiotemporal"}
    
    Note:

    Take note of the service URL when the service is created and make sure it exists.

Create a feature layer

Create a feature layer for device tracking.

  1. Go to https://<my indoors portal>/server/rest/admin/services/Hosted/<name>/FeatureServer/addToDefinition.
  2. Enter the .json template in the Input box and click addToDefinition.
    {
                    "layers": [{
                                    "currentVersion": 10.7,
                                    "cimVersion": "2.3.0",
                                    "id": 0,
                                    "name": "DeviceTracking_BDS",
                                    "type": "Feature Layer",
                                    "parentLayer": null,
                                    "defaultVisibility": true,
                                    "minScale": 0,
                                    "maxScale": 0,
                                    "geometryType": "esriGeometryPoint",
                                    "description": "",
                                    "copyrightText": "",
                                    "editFieldsInfo": {
                                                    "creationDateField": "created_date",
                                                    "creatorField": "created_user",
                                                    "editDateField": "last_edited_date",
                                                    "editorField": "last_edited_user"
                                    },
                                    "syncCanReturnChanges": true,
                                    "relationships": [],
                                    "isDataVersioned": false,
                                    "isDataArchived": false,
                                    "isDataBranchVersioned": false,
                                    "isCoGoEnabled": false,
                                    "supportsRollbackOnFailureParameter": true,
                                    "supportsStatistics": true,
                                    "supportsAdvancedQueries": true,
                                    "supportsValidateSQL": true,
                                    "supportsCoordinatesQuantization": true,
                                    "supportsCalculate": true,
                                    "advancedQueryCapabilities": {
                                                    "supportsReturningQueryExtent": true,
                                                    "supportsStatistics": true,
                                                    "supportsDistinct": true,
                                                    "supportsPagination": true,
                                                    "supportsOrderBy": true,
                                                    "supportsQueryWithDistance": true,
                                                    "supportsLod": false,
                                                    "supportsPaginationOnAggregatedQueries": true,
                                                    "supportsQueryWithResultType": true,
                                                    "supportsCountDistinct": true,
                                                    "supportsReturningGeometryCentroid": false,
                                                    "supportsHavingClause": true,
                                                    "supportsTopFeaturesQuery": false,
                                                    "supportsOrderByOnlyOnLayerFields": true
                                    },
                                    "extent": {
                                                    "xmin": "NaN",
                                                    "ymin": "NaN",
                                                    "xmax": "NaN",
                                                    "ymax": "NaN",
                                                    "spatialReference": {
                                                                    "wkid": 102100,
                                                                    "latestWkid": 3857,
                                                                    "xyTolerance": 0.001,
                                                                    "zTolerance": 0.001,
                                                                    "mTolerance": 0.001,
                                                                    "falseX": -2.204125862706707E7,
                                                                    "falseY": -3.3265068604224768E7,
                                                                    "xyUnits": 1.3538524994349548E8,
                                                                    "falseZ": -100000,
                                                                    "zUnits": 10000,
                                                                    "falseM": -100000,
                                                                    "mUnits": 10000
                                                    }
                                    },
                                    "sourceSpatialReference": {
                                                    "wkid": 102100,
                                                    "latestWkid": 3857,
                                                    "xyTolerance": 0.001,
                                                    "zTolerance": 0.001,
                                                    "mTolerance": 0.001,
                                                    "falseX": -2.20412586270671E7,
                                                    "falseY": -3.32650686042248E7,
                                                    "xyUnits": 1.35385249943495E8,
                                                    "falseZ": -100000,
                                                    "zUnits": 10000,
                                                    "falseM": 0,
                                                    "mUnits": 1
                                    },
                                    "drawingInfo": {
                                                    "renderer": {
                                                                    "type": "simple",
                                                                    "symbol": {
                                                                                    "type": "esriSMS",
                                                                                    "style": "esriSMSCircle",
                                                                                    "color": [
                                                                                                    28,
                                                                                                    130,
                                                                                                    0,
                                                                                                    255
                                                                                    ],
                                                                                    "size": 4,
                                                                                    "angle": 0,
                                                                                    "xoffset": 0,
                                                                                    "yoffset": 0,
                                                                                    "outline": {
                                                                                                    "color": [
                                                                                                                    0,
                                                                                                                    0,
                                                                                                                    0,
                                                                                                                    255
                                                                                                    ],
                                                                                                    "width": 1
                                                                                    }
                                                                    }
                                                    },
                                                    "scaleSymbols": true,
                                                    "transparency": 0,
                                                    "labelingInfo": null
                                    },
                                    "hasM": false,
                                    "hasZ": true,
                                    "supportsVCSProjection": true,
                                    "allowTrueCurvesUpdates": false,
                                    "onlyAllowTrueCurveUpdatesByTrueCurveClients": true,
                                    "hasAttachments": false,
                                    "supportsApplyEditsWithGlobalIds": true,
                                    "htmlPopupType": "esriServerHTMLPopupTypeAsHTMLText",
                                    "objectIdField": "objectid",
                                    "globalIdField": "globalid",
                                    "displayField": "app_id",
                                    "typeIdField": "",
                                    "fields": [{
                                                                    "name": "objectid",
                                                                    "type": "esriFieldTypeOID",
                                                                    "alias": "OBJECTID",
                                                                    "domain": null,
                                                                    "nullable": false,
                                                                    "editable": false,
                                                                    "sqlType": "sqlTypeInteger"
                                                    },
                                                    {
                                                                    "name": "activity",
                                                                    "type": "esriFieldTypeInteger",
                                                                    "alias": "Activity",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 10,
                                                                    "sqlType": "sqlTypeInteger"
                                                    },
                                                    {
                                                                    "name": "altitude",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Altitude",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "app_id",
                                                                    "type": "esriFieldTypeString",
                                                                    "alias": "App ID",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 255,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "name": "background_mode",
                                                                    "type": "esriFieldTypeSmallInteger",
                                                                    "alias": "Background Mode",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 5,
                                                                    "sqlType": "sqlTypeSmallInt"
                                                    },
                                                    {
                                                                    "name": "battery_percentage",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Battery Percentage",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "battery_state",
                                                                    "type": "esriFieldTypeInteger",
                                                                    "alias": "Battery State",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 10,
                                                                    "sqlType": "sqlTypeInteger"
                                                    },
                                                    {
                                                                    "name": "course",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Course",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "device_id",
                                                                    "type": "esriFieldTypeString",
                                                                    "alias": "Device ID",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 256,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "name": "device_type",
                                                                    "type": "esriFieldTypeString",
                                                                    "alias": "Device Type",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 255,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "name": "floor",
                                                                    "type": "esriFieldTypeInteger",
                                                                    "alias": "Floor",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 10,
                                                                    "sqlType": "sqlTypeInteger"
                                                    },
                                                    {
                                                                    "name": "horizontal_accuracy",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Horizontal Accuracy",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "latitude",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Latitude",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "location_source",
                                                                    "type": "esriFieldTypeString",
                                                                    "alias": "Location Source",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 256,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "name": "location_timestamp",
                                                                    "type": "esriFieldTypeDate",
                                                                    "alias": "Location Timestamp",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 29,
                                                                    "sqlType": "sqlTypeTimestamp"
                                                    },
                                                    {
                                                                    "name": "longitude",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Longitude",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "signal_strength",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Signal Strength",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "session_id",
                                                                    "type": "esriFieldTypeString",
                                                                    "alias": "Session ID",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 256,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "name": "speed",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Speed",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "user_id",
                                                                    "type": "esriFieldTypeString",
                                                                    "alias": "User ID",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 256,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "name": "vertical_accuracy",
                                                                    "type": "esriFieldTypeDouble",
                                                                    "alias": "Vertical Accuracy",
                                                                    "domain": null,
                                                                    "editable": true,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeNumeric"
                                                    },
                                                    {
                                                                    "name": "globalid",
                                                                    "type": "esriFieldTypeGlobalID",
                                                                    "alias": "GlobalID",
                                                                    "domain": null,
                                                                    "editable": false,
                                                                    "nullable": false,
                                                                    "length": 38,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "alias": "created_user",
                                                                    "name": "created_user",
                                                                    "length": 255,
                                                                    "domain": null,
                                                                    "nullable": true,
                                                                    "type": "esriFieldTypeString",
                                                                    "editable": false,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "alias": "created_date",
                                                                    "name": "created_date",
                                                                    "length": 29,
                                                                    "domain": null,
                                                                    "nullable": true,
                                                                    "type": "esriFieldTypeDate",
                                                                    "editable": false,
                                                                    "sqlType": "sqlTypeTimestamp"
                                                    },
                                                    {
                                                                    "alias": "last_edited_user",
                                                                    "name": "last_edited_user",
                                                                    "length": 255,
                                                                    "domain": null,
                                                                    "nullable": true,
                                                                    "type": "esriFieldTypeString",
                                                                    "editable": false,
                                                                    "sqlType": "sqlTypeVarchar"
                                                    },
                                                    {
                                                                    "alias": "last_edited_date",
                                                                    "name": "last_edited_date",
                                                                    "length": 29,
                                                                    "domain": null,
                                                                    "nullable": true,
                                                                    "type": "esriFieldTypeDate",
                                                                    "editable": false,
                                                                    "sqlType": "sqlTypeTimestamp"
                                                    }
                                    ],
                                    "geometryField": {
                                                    "name": "shape",
                                                    "type": "esriFieldTypeGeometry",
                                                    "alias": "Shape",
                                                    "domain": null,
                                                    "editable": true,
                                                    "nullable": true,
                                                    "defaultValue": null,
                                                    "modelName": "Shape"
                                    },
                                    "indexes": [{
                                                                    "name": "r59_sde_rowid_uk",
                                                                    "fields": "OBJECTID",
                                                                    "isAscending": true,
                                                                    "isUnique": true,
                                                                    "description": ""
                                                    },
                                                    {
                                                                    "name": "uuid_59",
                                                                    "fields": "GlobalID",
                                                                    "isAscending": true,
                                                                    "isUnique": true,
                                                                    "description": ""
                                                    },
                                                    {
                                                                    "name": "a32_ix1",
                                                                    "fields": "Shape",
                                                                    "isAscending": true,
                                                                    "isUnique": true,
                                                                    "description": ""
                                                    }
                                    ],
                                    "dateFieldsTimeReference": {
                                                    "timeZone": "UTC",
                                                    "respectsDaylightSaving": false
                                    },
                                    "types": [],
                                    "templates": [{
                                                    "name": "DeviceTracking",
                                                    "description": "",
                                                    "prototype": {
                                                                    "attributes": {
                                                                                    "vertical_accuracy": 0,
                                                                                    "user_id": " ",
                                                                                    "activity": 0,
                                                                                    "altitude": 0,
                                                                                    "app_id": " ",
                                                                                    "background_mode": 0,
                                                                                    "battery_percentage": 0,
                                                                                    "battery_state": 0,
                                                                                    "course": 0,
                                                                                    "device_id": " ",
                                                                                    "device_type": " ",
                                                                                    "floor": 0,
                                                                                    "horizontal_accuracy": 0,
                                                                                    "latitude": 0,
                                                                                    "location_source": " ",
                                                                                    "location_timestamp": -2209161600000,
                                                                                    "longitude": 0,
                                                                                    "signal_strength": 0,
                                                                                    "session_id": " ",
                                                                                    "speed": 0
                                                                    }
                                                    },
                                                    "drawingTool": "esriFeatureEditToolPoint"
                                    }],
                                    "useStandardizedQueries": true,
                                    "standardMaxRecordCount": 32000,
                                    "tileMaxRecordCount": 8000,
                                    "maxRecordCountFactor": 1,
                                    "supportedQueryFormats": "JSON, geoJSON",
                                    "maxRecordCount": 2000,
                                    "allowGeometryUpdates": true,
                                    "hasMetadata": true,
                                    "supportsAttachmentsByUploadId": true,
                                    "hasStaticData": false,
                                    "supportsAsyncDelete": true
                    }]
    }
    
  3. Go to https://<my indoors portal>/portal/home/content and make sure the item exists once the process completes successfully.

Configure security settings

Security settings on the device tracking feature layer must be configured based on your organization’s security needs.

  1. In your portal, click the Settings tab.
  2. In the Feature Layer section, in the Editing subsection, check the Enable editing check box.
  3. Depending on your organization’s security needs, check the Keep track of created and updated features check box.
  4. Depending on your organization's storage policies and security needs, choose one of the following in the What kind of editing is allowed section:
    • Add and update features
    • Add, update, and delete features
    Note:

    The Add features option is not supported in this release.

  5. Depending on your organization’s security needs, if you checked the Keep track of created and updated features check box, choose the required option for the What features can editors see and What features can editors edit sections:
    • Editors can see all features
    • Editors can only see their own features
    • Editors can't see any features, even those they add
    Note:

    It is recommended to leave the default selection of Editors can only see their own features and Editors can only edit their own features for these sections.

    For more information, see Manage editor settings and Editor tracking.

  6. Click Save.

Configure share settings

The feature service should be shared using the app to be able to add location information.

  1. Click the Overview tab and click Share.

    The Share dialog box appears.

  2. Share with your portal members or groups.
    Tip:

    The URL at the lower right of the Overview page should be set as the Config Value field for DEVICE_MONITOR_ENDPOINT_FEATURESERVICE in the Indoors Configuration table. You can now view device tracking points in a web map.

View device tracking data in a web map

You can create a web map to view tracking data and share it with members of your organization.

  1. In your portal, click Content and click the My Content tab.
  2. Click Create > Map.
  3. Choose the newly created map and click Open in Map Viewer.
  4. Click Add and add the device tracking feature layer.
  5. Zoom to your site and click Save.
  6. Click Share and choose the members with whom you want to share the map.
  7. Click DONE.

Create a dashboard

A dashboard is a view of device tracking data that helps you monitor events or activities. Dashboards are designed to display multiple visualizations that work together on a single screen. They offer a comprehensive and engaging view of your data to provide insight for at-a-glance decision making. You can create a dashboard to help you monitor device tracking data.

Configure GeoEvent (Optional)

If your organization already uses ArcGIS GeoEvent Server for real-time data and analytics, complete the following steps to configure device tracking:

  1. Register your ArcGIS Server with GeoEvent Server if it is not already set up.
  2. Create an input of type Poll an ArcGIS Server for Features and link to the feature service created in the section.
  3. Create an output of type Send Features to a Stream Service.
  4. Create a new GeoEvent Server service and link the input to the output in the designer.