1) зачем вам символы - вырезайте между запятыми. Я в своём парсере так и делал.
2) Когда для диплома "навигатор" делал , сделал так:
Поиск расстояния между 2 координатами.
// Константы, используемые для вычисления смещения и расстояния
const double D2R=0.017453; // Константа для преобразования градусов в радианы
const double R2D=57.295781; // Константа для преобразования радиан в градусы
const double a=6378137.0; // Основные полуоси
const double b=6356752.314245; // Неосновные полуоси
const double e2=0.006739496742337; // Квадрат эксцентричности эллипсоида
const double f=0.003352810664747; // Выравнивание эллипсоида
Код
double DIST(double StartLat, double StartLong, double EndLat, double EndLong)
{
double fPhimean, // Средняя широта
fdLambda, // Разница между двумя значениями долготы
fdPhi, // Разница между двумя значениями широты
fAlpha, // Смещение
fRho, // Меридианский радиус кривизны
fNu, // Поперечный радиус кривизны
fR, // Радиус сферы Земли
fz, // Угловое расстояние от центра сфероида
fTemp, // Временная переменная, использующаяся в вычислениях
Distance; // Вычисленное расстояния в метрах
unsigned char S[20];
// Вычисляем разницу между двумя долготами и широтами и получаем среднюю широту
fdLambda=(StartLong - EndLong)*D2R;
fdPhi=(StartLat - EndLat)*D2R;
fPhimean=((StartLat + EndLat)/2.0)*D2R;
// Вычисляем меридианные и поперечные радиусы кривизны средней широты
fTemp=1-e2*(pow(sin(fPhimean),2));
fRho=(a*(1-e2))/pow(fTemp, 1.5);
fNu=a/(sqrt(1-e2*(sin(fPhimean)*sin(fPhimean))));
// Вычисляем угловое расстояние
fz=sqrt(pow(sin(fdPhi/2.0),2)+cos(EndLat*D2R)*cos(StartLat*D2R)*pow(sin(fdLambda/2.0),2));
fz=2*asin(fz);
// Вычисляем смещение
fAlpha=cos(EndLat*D2R)*sin(fdLambda)*1/sin(fz);
fAlpha=asin(fAlpha);
// Вычисляем радиус Земли
fR=(fRho*fNu)/((fRho*pow(sin(fAlpha),2))+(fNu*pow(cos(fAlpha),2)));
// Получаем расстояние
Distance=(fz*fR);
return Distance;
};
Вот так вычислял азимут (незнаю насколько правильно), весь смысл в формировании местной системы координат . осями которой являются хорды паралельные параллелям и меридианам:
Код
double Azimut(double StartLat, double StartLong, double EndLat, double EndLong)
{
double AZ;
double OX,OY;
unsigned char S[20];
OX=DIST(StartLat, StartLong, StartLat, EndLong);
OY=DIST(StartLat, StartLong, EndLat, StartLong);
if (StartLat<=EndLat)
{
if (StartLong<=EndLong)
{
AZ=atan(OX/OY)*R2D;
}
else
{
AZ=360-atan(OX/OY)*R2D;
};
}
else
{
if (StartLong<=EndLong)
{
AZ=180-atan(OX/OY)*R2D;
}
else
{
AZ=180+atan(OX/OY)*R2D;
};
};
return AZ;
};
ЗЫ С гуглоземлёй сходилось, точность не замерял - не было смысла - диплом , не коммерческий прожект. Кое где код можно оптимизировать ( И я молодой был и компилятор тупил)