Flash.#13 писал(а):для правильного счета координаты надо переводить в метры с учетом уменьшения количества метров градуса долготы от угла широты...
А в Ардуино все считают через радианы.
А вот сама программа расчёта из Ардуино:
1.
/* static */
double TinyGPSPlus::distanceBetween(double lat1, double long1, double lat2, double long2)
{
// возвращает расстояние в метрах между двумя указанными позициями
// как знак десятичной дроби-Градусы широты и долготы. Использует большой круг
// расчет расстояния для гипотетической сферы радиусом 6372795 метров.
// Поскольку Земля не является точной сферой, ошибки округления могут достигать 0,5%.
double delta = radians(long1-long2);
double sdlong = sin(delta);
double cdlong = cos(delta);
lat1 = radians(lat1);
lat2 = radians(lat2);
double slat1 = sin(lat1);
double clat1 = cos(lat1);
double slat2 = sin(lat2);
double clat2 = cos(lat2);
delta = (clat1 * slat2) - (slat1 * clat2 * cdlong);
delta = sq(delta);
delta += sq(clat2 * sdlong);
delta = sqrt(delta);
double denom = (slat1 * slat2) + (clat1 * clat2 * cdlong);
delta = atan2(delta, denom);
return delta * 6372795;
}
2.
double TinyGPSPlus::courseTo(double lat1, double long1, double lat2, double long2)
{
// возвращает курс в градусах (Север=0, Запад=270) из позиции 1 в позицию 2,
// оба задаются как знаковые десятичные Градусы широты и долготы.
// Поскольку Земля не является точной сферой, расчетный курс может быть отклонен на крошечную долю.
double dlon = radians(long2-long1);
lat1 = radians(lat1);
lat2 = radians(lat2);
double a1 = sin(dlon) * cos(lat2);
double a2 = sin(lat1) * cos(lat2) * cos(dlon);
a2 = cos(lat1) * sin(lat2) - a2;
a2 = atan2(a1, a2);
if (a2 < 0.0)
{
a2 += TWO_PI;
}
return degrees(a2);
}
Всё собирался проверить это на практике... да всё руки не доходят))