Re: [magnetometer] Shouldn't need Web Service to compute declination

I investigated this a bit.

Platform support: Android provides a [GeoMagneticField][2] class to 
get the magnetic declination. I haven't yet looked at other platform 
whether they expose something similar (contributions welcome!).

Platform support aside, I identified one potential issue: the 
declination angle could be used to validate whether the geolocation 
information (think IP geolocation and VPN use case) is accurate. Using
 a simple reverse lookup one could calculate whether the reported 
coordinates match the declination reported, see the [main field 
declination map][1]. That'd mean a user who might have a good reason 
to hide her geolocation, might inadvertently disclose that geolocation
 information reported is not accurate.

Couple of possible solutions in no particular order, with some pros 
and cons of mine:

* Define a standalone Compass API that requires UA to inform the user 
that when when access is allowed to the device's compass, also 
approximate location is disclosed in the process. Pros: Optimized for 
the arguably common use case. Cons: Possibly hard to communicate to 
the user the level of information disclosed (heading + approximate 
geolocation).

```
let sensor = new Compass();
sensor.start();

sensor.onchange = () => {
    console.log("Heading " + sensor.heading);
};
```

* Add a `getDeclination()` convenience method on `Magnetometer` that 
takes latitude, longitude, and altitude as arguments, and returns the 
magnetic declination (in degrees) at the given location (here sync API
 for brevity). The web developer is responsible for acquiring the 
geolocation of the user, e.g. using IP geolocation, Geolocation API 
that relies on the device's GPS, or other means. Pros: This is 
basically the web service provided by NOAA but implemented natively, 
supports offline use. Cons: ?
```
var magneticNorthDegrees = Math.atan2(sensor.y, sensor.x) * (180 / 
Math.PI);
var declinationDegrees = sensor.getDeclination(lan, long);
var trueNorthDegrees = magneticNorthDegrees + declinationDegrees;
```

* Leave all of this to the web developer, as currently specified, see 
[example][3]. Pros: less API surface, cons: no support for offline.

cc @alexshalamov @riju @lknik for further comments, and ideas.

(@mfoltzgoogle The web service used in the [example][3] should 
obviously use https for sensitive information such as geolocation 
coordinates. Fixed the example, since NOAA seem to have updated their 
service similarly recently, and finally enabled https.)

[1]: 
https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/World_Magnetic_Declination_2015.pdf/page1-1599px-World_Magnetic_Declination_2015.pdf.jpg

[2]: 
https://developer.android.com/reference/android/hardware/GeomagneticField.html

[3]: https://w3c.github.io/magnetometer/#example-721a04cc

-- 
GitHub Notification of comment by anssiko
Please view or discuss this issue at 
https://github.com/w3c/magnetometer/issues/18#issuecomment-277675225 
using your GitHub account

Received on Monday, 6 February 2017 13:07:25 UTC