Thank you for your willingness to contribute to CAMALIOT. This document aims to provide you with adequate information on the data we receive from you, how we process it, and what we make available to the public in order to comply with the requirements of the EU General Data Protection Regulation (GDPR).
The app you are using, and the CAMALIOT website (www.camaliot.org), have been developed by the International Institute for Applied Systems Analysis (IIASA), Schlossplatz 1, 2361 Laxenburg, Austria as a part of the CAMALIOT project funded by the European Space Agency (ESA). The data collected from the app in the form of GNSS data log files, see Sec. 6, shall be stored on the resources of Exoscale , Switzerland. The data processing is carried out by ETH Zurich (ETHZ), Rämistrasse 101, 8092 Zürich, Switzerland.
“Personal data” means any information relating to an identified or identifiable natural person, such as their name, contact information, their location at a certain time or IP address.
We are scientific institutes and process personal data only for scientific purposes related to environmental monitoring. We process personal data:
We process the following data for registration, login and profile updates for a given user, all of which are stored in the CAMALIOT database (see Sec. 7):
None of this information will be part of any publication (e.g., data products, scientific publications, etc.).
Whenever you use our service, we collect Log Data, or data and information (also through third party products) on your phone to identify errors in the app. Log Data may include information such as your device Internet Protocol (“IP”) address, device name, operating system version, the configuration of the app when utilizing our Service, the time and date of your use of the service, and other statistics. These data are used for identifying problems with our software and will not be published as a part of the resulting data product.
When you upload a GNSS (Global Navigation Satellite System) log file via the mobile app, no personal information is stored on the server together with the log file, so it is impossible to identify a person. However, we employ a universally unique identifier (UUID) in order to associate the collected GNSS data to the specific instance of the app. This identifier is not related to the device as the re-installation of our app generates a new UUID. This section describes what is sent to the server and stored in a single log file.
The following data is sent for the Header of the log-files:
Values from Android Build class (https://developer.android.com/reference/android/os/Build):
Name of Data | Used Method | Meaning |
---|---|---|
String Build.MANUFACTURER | The manufacturer of the product/hardware | |
String Build.MODEL | The end-user-visible name for the end product |
The following data is sent for the GNSS-Raw-Measurements:
Values from Java SystemClock class (https://developer.android.com/reference/android/os/SystemClock):
Name of Data | Used Method | Meaning |
---|---|---|
ElapsedRealtimeMillis | long SystemClock.elapsedRealtime() | Elapsed milliseconds since boot. |
Values from Android GnssClock class (https://developer.android.com/reference/android/location/GnssClock):
Name of Data | Used Method | Meaning |
---|---|---|
TimeNanos | long GnssClock.getTimeNanos() | GNSS receiver internal hardware clock value in nanoseconds |
LeapSecond | int GnssClock.getLeapSecond() | The leap second associated with the clock's time |
TimeUncertaintyNanos | double GnssClock.getTimeUncertaintyNanos() | The clock's time Uncertainty (1-Sigma) in nanoseconds |
FullBiasNanos | long GnssClock.getFullBiasNanos() | The difference between TimeNanos and the true GPS time in nanoseconds |
BiasNanos | double GnssClock.getBiasNanos() | The clock's sub-nanosecond bias |
BiasUncertaintyNanos | double GnssClock.getBiasUncertaintyNanos() | The clock's Bias Uncertainty (1-Sigma) in nanoseconds |
DriftNanosPerSecond | double GnssClock.getDriftNanosPerSecond() | The clock's Drift in nanoseconds per second |
DriftUncertaintyNanosPerSecond | double GnssClock.getDriftUncertaintyNanosPerSecond() | The clock's Drift Uncertainty (1-Sigma) in nanoseconds per second |
HardwareClockDiscontinuityCount | int GnssClock.getHardwareClockDiscontinuityCount() | Count of hardware clock discontinuities |
Values from Android GnssMeasurement class (https://developer.android.com/reference/android/location/GnssMeasurement):
Name of Data | Used Method | Meaning |
---|---|---|
Svid | Svid int GnssMeasurement.getSvid() | The satellite ID |
TimeOffsetNanos | TimeOffsetNanos double GnssMeasurement.getTimeOffsetNanos() | The time offset at which the measurement was taken in nanoseconds |
State | ReceivedSvTimeNanos long GnssMeasurement.getReceivedSvTimeNanos() | The received GNSS satellite time, at the measurement time, in nanoseconds |
ReceivedSvTimeNanos | ReceivedSvTimeUncertaintyNanos long GnssMeasurement.getReceivedSvTimeUncertaintyNanos() | The error estimate (1-sigma) for the received GNSS time, in nanoseconds |
ReceivedSvTimeUncertaintyNanos | Cn0DbHz double GnssMeasurement.getCn0DbHz() | The Carrier-to-noise density in dB-Hz |
Cn0DbHz | PseudorangeRateMetersPerSecond double GnssMeasurement.getPseudorangeRateMetersPerSecond() | The Pseudorange rate at the timestamp in m/s |
PseudorangeRateMetersPerSecond | PseudorangeRateUncertaintyMetersPerSecond double GnssMeasurement.getPseudorangeRateUncertaintyMetersPerSecond() | The pseudorange's rate uncertainty (1-Sigma) in m/s |
PseudorangeRateUncertaintyMetersPerSecond | AccumulatedDeltaRangeState int GnssMeasurement.getAccumulatedDeltaRangeState() | This indicates the state of the AccumulatedDeltaRangeMeters measurement |
AccumulatedDeltaRangeState | AccumulatedDeltaRangeMeters double GnssMeasurement.getAccumulatedDeltaRangeMeters() | The accumulated delta range since the last channel reset, in meters |
AccumulatedDeltaRangeMeters | AccumulatedDeltaRangeUncertaintyMeters double GnssMeasurement.getAccumulatedDeltaRangeUncertaintyMeters() | The accumulated delta range's uncertainty (1-Sigma) in meters |
AccumulatedDeltaRangeUncertaintyMeters | CarrierFrequencyHz float GnssMeasurement.getCarrierFrequencyHz() | The carrier frequency of the tracked signal |
CarrierFrequencyHz | CarrierCycles long GnssMeasurement.getCarrierCycles() | The number of full carrier cycles between the satellite and the receiver |
CarrierCycles | CarrierPhase double GnssMeasurement.getCarrierPhase() | The RF phase detected by the receiver |
CarrierPhase | CarrierPhaseUncertainty double GnssMeasurement.getCarrierPhaseUncertainty() | The carrier-phase's uncertainty (1-Sigma) |
CarrierPhaseUncertainty | CarrierPhaseUncertainty double GnssMeasurement.getCarrierPhaseUncertainty() | The carrier-phase's uncertainty (1-Sigma) |
MultipathIndicator | MultipathIndicator int GnssMeasurement.getMultipathIndicator() | A value indicating the 'multipath' state of the event |
SnrInDb | double GnssMeasurement.getSnrInDb() | The (post-correlation & integration) Signal-to-Noise ratio (SNR) in dB |
ConstellationType | ConstellationType int GnssMeasurement.getConstellationType() | The constellation type |
AgcDb | double GnssMeasurement.getAutomaticGainControlLevelDb() | The Automatic Gain Control level in dB |
The following data is sent for the GPS-Fixes:
Values from Android Location class (https://developer.android.com/reference/android/location/Location):
Name of Data | Used Method | Meaning |
---|---|---|
Provider | Provider String Location.getProvider() | The name of the provider that generated this fix |
Latitude | Latitude double Location.getLatitude() | The latitude, in degrees |
Longitude | Longitude double Location.getLongitude() | The longitude, in degrees |
Altitude | Altitude double Location.getAltitude() | The altitude if available, in meters above the WGS 84 reference ellipsoid |
Speed | Speed float Location.getSpeed() | The speed if it is available, in meters/second over ground |
Accuracy | Accuracy float Location.getAccuracy() | The estimated horizontal accuracy of this location, radial, in meters |
(UTC)TimeInMs | (UTC)TimeInMs long Location.getTime() | The UTC time of this location fix, in milliseconds since epoch (January 1, 1970) |
In addition, these sensor data get collected and sent if the user checks the “Log Sensor Data” checkbox on the Logging page (https://developer.android.com/reference/android/hardware/Sensor):
Sensor Data | Meaning |
---|---|
TYPE_ROTATION_VECTOR | Rotation vector using the geomagnetic field |
TYPE_LINEAR_ACCELERATION | Acceleration vector using the acceleration sensor |
TYPE_GYROSCOPE_UNCALIBRATED | The uncalibrated gyroscope sensor data |
TYPE_ACCELEROMETER_UNCALIBRATED | Measures the acceleration force in m/s2 |
TYPE_AMBIENT_TEMPERATURE | Measures the ambient room temperature in degrees Celsius (°C) |
TYPE_LIGHT | Measures the ambient light level (illumination) in lx. |
TYPE_PRESSURE | Measures the ambient air pressure in hPa or mbar. |
TYPE_RELATIVE_HUMIDITY | Measures the relative ambient humidity in percent (%). |
The user data, see Sec. 4, from the CAMALIOT application are stored and maintained on state-of-the-art web service environments hosted on rented servers at Hetzner Online GmbH, Industriestrasse 25, 91710 Gunzenhausen, Germany. Concerning the acquired GNSS observations, see Sec. 6, information retrieved from the app (and data processing with the use of dedicated software present on the Kubernetes cluster) will be stored using the Exoscale European cloud service, with company headquarters in Switzerland. This solution is necessary in order to assure proper means for data storage as well as the possibility to restore critical data. This implies that parts of the collected information from the app shall be also stored there on a temporary basis. We do not provide any means to access data for the hosting company other than the ways intended for every user. The environment is set up such that we restrict the access to the database and data strictly to our trusted network and through APIs that let us choose exactly which data are accessible to which users.
By contributing data, you provide us with the information requested in the app/website, but we usually also collect additional data that allows us to trace technical problems and verify the quality of the contribution. Please see the details above.
By contributing data, you grant IIASA, ETHZ and ESA a license to use the data. Please see also our Terms and Conditions, which are available from the mobile app and the website.
Please note that we may employ the following third-party companies to facilitate our service:
These companies will have access to your data in order to perform the tasks we assign to them, as described above. However, they are obliged to not disclose or use the information for any other purpose.
We also use the Umami software (https://umami.is/) for the purpose of gathering analytics from the CAMALIOT website. The software is installed at IIASA and the data are stored locally so no data are provided to Umami.
At any time, you have the right
You can instruct us to stop processing your data at any time using the contact data below. Even if you have agreed to the processing of data in the past, you can revoke such consent at any time (Art. 21 GDPR).
Should you have questions concerning your personal data, please contact us using the contact information below.
Our app and/or website may contain links to other websites. If you click on a third-party link, you will be directed to that site. Please note that these external sites are not operated by us and we do not have any control, nor assume any responsibility for their content, privacy policies or practices.
We therefore strongly advise you to review the Privacy Policy of those websites.
If you have any questions about our Privacy Policy, do not hesitate to contact us at: [email protected]