I did a course 'engineering aspects of GPS' at work some 15 years ago. No mention of using doppler shift at all. (Not to say methods haven't changed!) It did mention the math, which I have used in my own GPS software. Included are the two functions using the horrid math needed to calculate range and bearing. Yes, with one antenna you need to move before a direction can be determined. The speed is determined by the time taken between the two points.
private double CalcBrg(double lat1, double lon1, double lat2, double lon2)
{
lat1 = lat1 * Math.PI / 180;
lat2 = lat2 * Math.PI / 180;
double dlon = (lon2 - lon1) * Math.PI / 180;
double y = Math.Sin(dlon) * Math.Cos(lat2);
double x = Math.Cos(lat1) * Math.Sin(lat2) - Math.Sin(lat1) * Math.Cos(lat2) * Math.Cos(dlon);
double hdg = Math.Atan2(y, x) * 180 / Math.PI;
return (hdg + 360) % 360;
}
private double CalculateRange(double lat1, double lon1, double lat2, double lon2)
{
return 6371 * (Math.Acos(Math.Cos(ToRad(90 - lat1)) *
Math.Cos(ToRad(90 - lat2)) + Math.Sin(ToRad(90 - lat1)) *
Math.Sin(ToRad(90 - lat2)) * Math.Cos(ToRad(lon1 - lon2)))) * 0.54; // nm
}
Those familiar with math and programming in C, C++, C# or Java will benefit from looking at the code.