Introduces a usable error estimate for the location derived from each transmitter, based on transmitter-receiver distance, age of scan result and distance from other transmitters
Individual locations are fused using a simplified Kálmán filter, giving more weight to more accurate locations
Both cells and wifis are used for distance comparisons and to determine final location
All visible cells with full ID are considered for location updates
Notes:
Using multiple cells for geolocation works only where the full cell ID is available. On 3G/4G, the full ID is only available for the serving cell (for neighboring cells only the PSC/PCI is available until the device connects to that cell). On multi-SIM devices, where there is one serving cell per SIM slot, all cells can be used if they are exposed through the Android API. Note that some devices never report any neighboring cells.
When the reported accuracy is low (several hundred meters or more), this is typically the result of a moved wifi: Suppose the device is picking up n wifis, of which one has moved. This will dramatically increase the error estimate for each location – the outlier will get an error close to the actual distance from the others, while all the others will get 1/n times that distance as an error. The synthesized location will have an error which is slightly lower than 1/n times the distance the one wifi has moved. All of this can be observed in the logs. The location reported will generally be only slightly off (much closer to the actual location than it was previously). The more stationary wifis there are in view, the better the result will be. A possible future improvement could be to identify obvious outliers and ignore them.
Blacklisting is not yet implemented – I had a look at the mechanisms in Radiobeacon today and they're somewhat complex. That will be a future extension – though the current code already provides for some generic filtering (basically a series of if statements) which can easily be extended to filter for other criteria.
Improvements:
Notes:
Using multiple cells for geolocation works only where the full cell ID is available. On 3G/4G, the full ID is only available for the serving cell (for neighboring cells only the PSC/PCI is available until the device connects to that cell). On multi-SIM devices, where there is one serving cell per SIM slot, all cells can be used if they are exposed through the Android API. Note that some devices never report any neighboring cells.
When the reported accuracy is low (several hundred meters or more), this is typically the result of a moved wifi: Suppose the device is picking up n wifis, of which one has moved. This will dramatically increase the error estimate for each location – the outlier will get an error close to the actual distance from the others, while all the others will get 1/n times that distance as an error. The synthesized location will have an error which is slightly lower than 1/n times the distance the one wifi has moved. All of this can be observed in the logs. The location reported will generally be only slightly off (much closer to the actual location than it was previously). The more stationary wifis there are in view, the better the result will be. A possible future improvement could be to identify obvious outliers and ignore them.
Blacklisting is not yet implemented – I had a look at the mechanisms in Radiobeacon today and they're somewhat complex. That will be a future extension – though the current code already provides for some generic filtering (basically a series of
if
statements) which can easily be extended to filter for other criteria.