Как программирование помогает мне найти друзей

Одна из поездок нашего велоклуба

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

Далеко ходить не буду и остановлюсь на своем увлечении велосипедными поездками. Чтобы не катать в одиночестве, я решил создать группу в ВК и собрать единомышленников. Но чем привлечь людей, кроме всем надоевших красивых картинок с полуголыми девочками? Долго думать я не умею, поэтому увиденная в приложении ReLive визуализация пути подошла мне идеально. Единственной проблемой стало то, что она строится по уже пройденному gps треку, а мне надо было сделать видео до того, как мы поедем.

Итак, начнем. Первым делом нам понадобится создать маршрут и сохранить его в формате gpx (таких сервисов полно, например, livegpstracks.com). Затем наступает время магии. Для начала научимся высчитывать расстояние между двумя точками, зная их координаты. Делать это будем по формуле Хаверсина (кратчайшее расстояние над поверхностью Земли).

function distance(lat1, lon1, lat2, lon2) {
  var p = 0.017453292519943295;
  var c = Math.cos;
  var a = 0.5 - c((lat2 - lat1) * p)/2 + 
          c(lat1 * p) * c(lat2 * p) * 
          (1 - c((lon2 - lon1) * p))/2;

  return 12742 * Math.asin(Math.sqrt(a));
}

В принципе, на этом можно было бы закончить, но я продолжу. Разобрав структуру gpx файла, легко заметить, что внутри тега

<trkpt lat="0" lon="0"/>

просто не хватает времени прохождения и нам придется рассчитать его самим. Расстояние у нас есть, скорость в группе примерно известна (около 15 км/ч), осталось только немного поработать головой:

var regexp = /<trkpt lat="([\S\s]*?)" lon="([\S\s]*?)" \/>/gm;
var mAll = str.matchAll(regexp);
mAll = Array.from(mAll);
		
var newDate = new Date();
var speed = 15;
var timetogo = 0;
var out = "";
var trkpt = mAll[0][0].substring(0, mAll[0][0].length-3) + ">";

out = out + trkpt + "&#10";
out = out + "<time>" + newDate.toISOString() + "</time>" + "&#10";
out = out + "</trkpt>" + "&#10";

for (var i = 0; i < mAll.length-1; i++) {
	var d = distance(mAll[i][1], mAll[i][2], mAll[i+1][1], mAll[i+1][2]);
	timetogo = d/speed;
			
	newDate.setMilliseconds(timetogo * 60 * 60 * 1000);

    trkpt = mAll[i + 1][0].substring(0, mAll[i+1][0].length-3) + ">";
	out = out + trkpt + "&#10";
	out = out + "<time>" + newDate.toISOString() + "</time>" + "&#10";
	out = out + "</trkpt>" + "&#10";
}

Прописываем парочку регулярных выражений, рассчитываем время в формате ISO, вставляем его в нужном месте и у нас получаются вот такие красивые видяшки.

В итоге за месяц постинга маршрутов только за счет лайков и сарафанного радио удалось набрать в группу более 100 человек, часть из которых катается со мной постоянно.

Один простой скрипт позволил мне найти единомышленников и обрести друзей. Более того, он постоянно радует новыми знакомствами, например, недавно у меня брал интервью главный редактор нашей местной газеты.

В общем, я доволен.

Отличный вид с горы

Кстати, в нашем магазине появилось нечто новенькое. Попробуйте.

Поделиться с друзьями
BadTea
Добавить комментарий