ThinkGeo.com    |     Documentation    |     Premium Support

TranslateByDegree over poles

Hi, 

I’m using a point shapes TranslateByDegree method to calculate the position of an object based upon the range and bearing from the observer.  This all seems to be fairly sensible at most latitudes but as the observers position gets closer to the poles the results aren’t quite as expected.



For example, from a starting location of 70N 0W, I would expect the object on a bearing of 0deg and 5000km away to be positioned at 65.2N 180W



Here is code I am using:
public Location GetLocationFromBearingAndRange(Location startLocation, double bearing, double rangeKm)
{
    if (startLocation == null) return null;
    // bearing must be in the range of 0 - 360
    bearing = (bearing%360 + 360)%360;
    var externallyProjectedPoint = new PointShape(startLocation.Longitude, startLocation.Latitude);
    var internallyProjectedPoint = ConvertPointToInternalProjection(externallyProjectedPoint);
    internallyProjectedPoint.TranslateByDegree(rangeKm, bearing, MapUnit, DistanceUnit.Kilometer);
    if (double.IsNaN(internallyProjectedPoint.X) || double.IsNaN(internallyProjectedPoint.Y)) return null;
    var externallyProjectedWorldPoint = ConvertPointToExternalProjection(internallyProjectedPoint);
    return new Location(externallyProjectedWorldPoint.Y, externallyProjectedWorldPoint.X);
}

Hi Stephen, 
  
 I think “double longitude = DecimalDegreesHelper.GetLongitudeDifferenceFromDistance(5000, DistanceUnit.Kilometer, 70)” is prefer to this scenario, please have a try. 
  
 Thanks,

Hi Don,

I get a longitude value out of 360 which brings it back to where it was originally.  Also, I’m not clear how I could take into account an angular offset with this method as it may not necessarily be at 0 deg bearing.

Hi Stephen, 
  
 I think you can resolve this issue with combination latitude and longitude like this: 
  
  double distance = 5000;
            double longitudeDistance = distance * Math.Cos(5000 * Math.PI / 180);
            double latitudeDistance = distance * Math.Sin(5000 * Math.PI / 180);
            PointShape point = new PointShape(20, 70);
            double latitude = DecimalDegreesHelper.GetLatitudeDifferenceFromDistance(latitudeDistance, DistanceUnit.Kilometer) + 70;
            double longitude = DecimalDegreesHelper.GetLongitudeDifferenceFromDistance(longitudeDistance, DistanceUnit.Kilometer, 70) + 20;
 
  
 Thanks,