Available with the ArcGIS Indoors Maps extension.
ArcGIS Indoors supports device location sharing through a custom feature layer hosted on a spatiotemporal data store associated with your portal. You can use this service instead of the Location Sharing service.
Caution:
This service only supports collecting device tracks (historic locations). The feature that searches for colleagues and their last known location is not available through this setup.
The Indoors mobile app always reports locations to the Location Sharing feature layer if it is enabled on your portal, even when you configure a custom feature layer.
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 | 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 the indoor positioning system | 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 the indoor positioning system signal reported by ELSS | BLE, Wi-Fi, 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 | Username 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 layer must be set up on your portal and 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
To set up a spatiotemporal data store for your portal, complete the following steps:
- Install ArcGIS Data Store.
- Create a spatiotemporal data store.
Note:
Go to https://<my big data store>/arcgis/datastore/ to confirm the configuration status and ensure that the ArcGIS Enterprise server specified in the installation process is listed.
Create a feature layer
To create a feature layer for device tracking, complete the following steps:
- Go to https://<my indoors portal>/portal/sharing/rest/login and sign in with the primary administrator's account.
- Go to https://<my indoors portal>/sharing/rest/content/users/<admin>/createService.
- Provide the JSON template in the Create Parameters text 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:
Note the service URL when the service is created and ensure that it exists.
Create a feature layer
To create a feature layer for device tracking, complete the following steps:
- Go to https://<my indoors portal>/server/rest/admin/services/Hosted/<name>/FeatureServer/addToDefinition.
- Provide the JSON template in the Input text 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 }] }
- Once the process completes successfully, go to https://<my indoors portal>/portal/home/content and ensure that the item exists.
Configure security settings
Configure the security settings on the device tracking feature layer based on your organization’s security needs.
To configure security settings, complete the following steps:
- In your portal, click the Settings tab.
- In the Feature Layer section, in the Editing subsection, check the Enable editing check box.
- Optionally, check the Keep track of created and updated features check box.
- Depending on your organization's storage policies and security needs, choose one of the options 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.
- If you checked the Keep track of created and updated features check box, choose an 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
It is recommended that you leave the default selection of Editors can only see their own features and Editors can only edit their own features for these sections.
Learn more about managing editor settings and editor tracking.
- Click Save.
Configure share settings
To add location information by sharing the feature layer, complete the following steps:
- Click the Overview tab and click Share.
The Share dialog box appears.
- Share with organization portal members or groups.
Tip:
Set the URL of the Overview page as the Config Value field for DEVICE_MONITOR_ENDPOINT_FEATURESERVICE in the Indoors Configuration table. You can review device tracking points in a web map.
Prepare a map for device tracking
The mobile map package used by your organization must be updated to activate the device tracking feature of the mobile apps.
Learn more about creating tracking zones for device tracking and configuring device location sharing settings.
View device tracking data
To create a web map to view tracking data and share it with members of your organization, complete the following steps:
- In your portal, click Content and click the My Content tab.
- Click Create > Map.
- Choose the newly created map and click Open in Map Viewer.
- Click Add and add the device tracking feature layer.
- Zoom to your site and click Save.
- Click Share and choose the members with whom you want to share the map.
- Click Done.
Create a dashboard
A dashboard is a view of device location sharing data that you can use to monitor events or activities. Dashboards display multiple visualizations that work together on a single screen. They offer a comprehensive view of the data to provide insight for data management. You can create a dashboard to help you monitor device location sharing data.