Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
GeoPosition.cpp
00001 #include "GeoPosition.h" 00002 #include <math.h> 00003 00004 // Earth's mean radius in meters 00005 #define EARTHRADIUS 6371000.0 00006 00007 GeoPosition::GeoPosition(): _R(EARTHRADIUS), _latitude(0.0), _longitude(0.0) 00008 { 00009 } 00010 00011 GeoPosition::GeoPosition(double latitude, double longitude): _R(EARTHRADIUS), _latitude(latitude), _longitude(longitude) 00012 { 00013 } 00014 00015 /* 00016 double GeoPosition::easting() 00017 { 00018 } 00019 00020 double GeoPosition::northing() 00021 { 00022 } 00023 */ 00024 00025 double GeoPosition::latitude() 00026 { 00027 return _latitude; 00028 } 00029 00030 double GeoPosition::longitude() 00031 { 00032 return _longitude; 00033 } 00034 00035 void GeoPosition::set(double latitude, double longitude) 00036 { 00037 _latitude = latitude; 00038 _longitude = longitude; 00039 } 00040 00041 void GeoPosition::set(GeoPosition pos) 00042 { 00043 _latitude = pos.latitude(); 00044 _longitude = pos.longitude(); 00045 } 00046 00047 /* 00048 void GeoPosition::set(UTM coord) 00049 { 00050 } 00051 */ 00052 00053 void GeoPosition::move(float course, float distance) 00054 { 00055 double d = distance / _R; 00056 double c = radians(course); 00057 double rlat1 = radians(_latitude); 00058 double rlon1 = radians(_longitude); 00059 00060 double rlat2 = asin(sin(rlat1)*cos(d) + cos(rlat1)*sin(d)*cos(c)); 00061 double rlon2 = rlon1 + atan2(sin(c)*sin(d)*cos(rlat1), cos(d)-sin(rlat1)*sin(rlat2)); 00062 00063 _latitude = degrees(rlat2); 00064 _longitude = degrees(rlon2); 00065 00066 // bring back within the range -180 to +180 00067 while (_longitude < -180.0) _longitude += 360.0; 00068 while (_longitude > 180.0) _longitude -= 360.0; 00069 } 00070 00071 /* 00072 void GeoPosition::move(Direction toWhere) 00073 { 00074 } 00075 00076 Direction GeoPosition::direction(GeoPosition startingPoint) 00077 { 00078 } 00079 */ 00080 00081 float GeoPosition::bearing(GeoPosition from) 00082 { 00083 double lat1 = radians(from.latitude()); 00084 double lon1 = radians(from.longitude()); 00085 double lat2 = radians(_latitude); 00086 double lon2 = radians(_longitude); 00087 double dLon = lon2 - lon1; 00088 00089 double y = sin(dLon) * cos(lat2); 00090 double x = cos(lat1) * sin(lat2) - sin(lat1) * cos(lat2) * cos(dLon); 00091 00092 return degrees(atan2(y, x)); 00093 } 00094 00095 /* 00096 float GeoPosition::bearing(LatLong startingPoint) 00097 { 00098 } 00099 00100 float GeoPosition::bearing(UTM startingPoint) 00101 { 00102 } 00103 */ 00104 00105 float GeoPosition::distance(GeoPosition from) 00106 { 00107 double lat1 = radians(from.latitude()); 00108 double lon1 = radians(from.longitude()); 00109 double lat2 = radians(_latitude); 00110 double lon2 = radians(_longitude); 00111 double dLat = lat2 - lat1; 00112 double dLon = lon2 - lon1; 00113 00114 double a = sin(dLat/2.0) * sin(dLat/2.0) + 00115 cos(lat1) * cos(lat2) * 00116 sin(dLon/2.0) * sin(dLon/2.0); 00117 double c = 2.0 * atan2(sqrt(a), sqrt(1-a)); 00118 00119 return _R * c; 00120 } 00121 00122 /* 00123 float GeoPosition::distance(LatLong startingPoint) 00124 { 00125 } 00126 00127 float GeoPosition::distance(UTM startingPoint) 00128 { 00129 } 00130 */ 00131 00132 void GeoPosition::setTimestamp(int time) { 00133 _time = time; 00134 } 00135 00136 int GeoPosition::getTimestamp(void) { 00137 return _time; 00138 } 00139 00140 00141
Generated on Wed Jul 13 2022 20:50:53 by
1.7.2