In some venues there is an existing positioning infrastructure, but it does not support all the desirable use cases. An example is infrastructure based WiFi positioning, which often is too slow for supporting real-time Wayfinding.

In such a case, IndoorAtlas can be used to support the real-time Wayfinding on both iOS and Android. It's important to notice that beacon installation is not required, as the approximate location fixes to support geomagnetic positioning are received from the infrastructure based positioning system for both iOS and Android.

Since SDK 3.1 GA, IndoorAtlas supports fusing inputs from external positioning system with all the other sensor information IndoorAtlas SDK uses internally. Examples of such inputs are:


  • Infrastructure based Wifi positioning system
  • Scanning NFC tags
  • QR codes
  • Image recognition
  • User input from the application UI


The external location inputs can be treated in two different ways in the IndoorAtlas SDK:

  • Hard input: IndoorAtlas position estimate jumps to the given location immediately
  • Soft input: IndoorAtlas fuses the input location softly with other information


As most of the external sources are inaccurate, the generally recommended solution is to use soft input. In the best case, this leads to tracking continuing smoothly, while the approximate location inputs from the external source ensure track is not lost. Hard input may be useful when reading location from e.g. RFID tags. 

The figure below illustrates the use of soft vs. hard input:

  • In the left image soft input from an inexact source is used. This leads to smooth tracking.
  • In the right image hard input is used with location information from the same inexact location source. At each external input, position jumps to the exact location and a bit later moves back on the correct track.
  • Note that hard input can be used when the location source is accurate


Code Examples


iOS


let floor = 3
let radius = 10.0
let clLoc = CLLocation.init(latitude: 60.0, longitude: 24.0)
clLoc.setValue(radius, forKey: "horizontalAccuracy")
let iaLoc = IALocation.init(clLocation: clLoc, andFloor: IAFloor.init(level: floor))
iaLoc.soft = true
locationManager.location = iaLoc


Android


IALocation location =
        new IALocation.Builder("com.indooratlas.android.sdk.intent.extras.softUpdate")
                .withLatitude(lat)
                .withLongitude(lng)
                .withAccuracy(accuracy)
                .withTime(t)
                .withFloorLevel(floorLevel)
                .build();
mIALocationManager.setLocation(location);