Программирование

Как программирование помогает мне в реальной жизни

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

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

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

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=" " lon=" ">
<ele>0</ele>
</trkpt>

просто не хватает времени прохождения конкретной точки. Значит нам придется его рассчитать по древней формуле. Расстояние у нас есть, скорость в группе примерно известна (около 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 = "";
		 

out = out + mAll[0][0] + "&#10";
out = out + "<time>" + newDate.toISOString() + "</time>" + "&#10";
out = out + "<ele>0</ele>" + "&#10";
out = out + "</trkpt>" + "&#10";

for (var i = 0; i < mAll.length - 1; i++) {
	var dist = distance(mAll[i][1], mAll[i][2], mAll[i + 1][1], mAll[i + 1][2]);
	timetogo = dist/speed;
			
	newDate.setMilliseconds(timetogo * 60 * 60 * 1000);
			
	out = out + mAll[i + 1][0] + "&#10";
	out = out + "<time>" + newDate.toISOString() + "</time>" + "&#10";
	out = out + "<ele>0</ele>" + "&#10";
	out = out + "</trkpt>" + "&#10";
}

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

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

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

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

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *