Перейти к основному содержимому

Определение расстояния между выбранной и текущей точками опроса

· 3 мин. чтения

Приложение для планшета может определять своё текущее местоположение по GPS-координатам. А их, в свою очередь, можно использовать для определения, как далеко находится интервьюер от своей точки опроса.

Для начала нужно добавить в анкету вопрос с точками опроса, например:

Q1. Где Вы сейчас находитесь?

  1. г. Воронеж, ул. Ленинградская, 1
  2. г. Лиски, ул. Чернышевского, д. 19
  3. с. Лосево, пл. Первомайская, дом 10А

Затем добавляем числовой вопрос, в который будем записывать расстояние от выбранной в Q1 точки, например:

Q2. Расстояние от точки опроса до интервьюера (в метрах).

Теперь добавьте в него скрипт перед показом:

// Координаты точек опроса (широта, долгота)
let locations = {
1: [51.673651, 39.257734],
2: [50.985279, 39.526385],
3: [50.674147, 40.051638],
};

// Получим выбранную точку опроса и её координаты
let locationCode = Q1.getCheckedCode();
let location = locations[locationCode];

if (!location) {
// В объекте locations нет координат для выбранной точки опроса
Q.comment = 'ВНИМАНИЕ! В анкете отстутсвуют координаты для \
выбранной точки опроса. Обратитесь к менеджеру проекта.';

return ok;
}

if (interview.latitude == null || interview.longitude == null) {
// Не определилены координаты устройства
Q.openValueInt = -1;
Q.comment = 'ВНИМАНИЕ! Не удалось определить расстояние. \
Проверьте, что на устройстве включён модуль GPS, и Вы \
находитесь в зоне прямой видимости спутников.';

return ok;
}

// Посчитаем и запишем расстояние в метрах от точки опроса
// до полученных по GPS координат
Q.openValueInt = haversineDistance(
interview.latitude,
interview.longitude,
location[0],
location[1]
);

return answered;

В объект locations добавьте координаты для всех ваших точек опроса, указанных в Q1.

Осталось добавить функции для расчёта расстояния. Находясь в редакторе анкеты, нажмите вверху справа Скрипты — Функции и вставьте в окно:

function toRad(x) {
return x * Math.PI / 180;
}

function haversineDistance(lat1, lon1, lat2, lon2) {
let earthRadius = 6371302; // Средний радиус Земли в метрах

let halfLattitudeDiffSin = Math.sin(toRad(lat2 - lat1) / 2);
let halfLongitudeDiffSin = Math.sin(toRad(lon2 - lon1) / 2);
let lattitude1Cos = Math.cos(toRad(lat1));
let lattitude2Cos = Math.cos(toRad(lat2));

let a = Math.pow(halfLattitudeDiffSin, 2)
+ lattitude1Cos
* lattitude2Cos
* Math.pow(halfLongitudeDiffSin, 2);

let c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));

return earthRadius * c;
}

На этом всё. Теперь во время заполнения анкеты в приложении скрипт в Q2 будет вычислять расстояние от выбранной в Q1 точки опроса и записывать его без вывода вопроса на экран, если планшет сможет получить текущие координаты.

При необходимости по ответу в Q2 вы можете как-то менять сценарий опроса. Например, не позволять заполнить анкету или автоматически помечать интервью как бракованное, если интервьюер находится слишком далеко от точки.

подсказка

Вы можете добавить в проект счётчик для учёта подозрительных интервью. Например, чтобы посчитать интервью с расстоянием более 500 метров от выбранной точки опроса, используйте условие Q2(valueNum > 500).

Этот же счётчик можно использовать в фильтре просмотра интервью на карте.