⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xyz2neu.hpp

📁 一个gps小工具包
💻 HPP
字号:
#pragma ident "$Id: $"/** * @file XYZ2NEU.hpp * This is a class to change the reference base from ECEF XYZ to topocentric * North-East-Up (NEU). */#ifndef XYZ2NEU_HPP#define XYZ2NEU_HPP//============================================================================////  This file is part of GPSTk, the GPS Toolkit.////  The GPSTk is free software; you can redistribute it and/or modify//  it under the terms of the GNU Lesser General Public License as published//  by the Free Software Foundation; either version 2.1 of the License, or//  any later version.////  The GPSTk is distributed in the hope that it will be useful,//  but WITHOUT ANY WARRANTY; without even the implied warranty of//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the//  GNU Lesser General Public License for more details.////  You should have received a copy of the GNU Lesser General Public//  License along with GPSTk; if not, write to the Free Software Foundation,//  Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA//  //  Dagoberto Salazar - gAGE ( http://www.gage.es ). 2007////============================================================================#include "geometry.hpp"                   // DEG_TO_RAD#include "Matrix.hpp"#include "Position.hpp"#include "TypeID.hpp"#include "ProcessingClass.hpp"namespace gpstk{      /** @addtogroup GPSsolutions */      //@{      /**       * This class changes the reference base from an Earth-Centered,       * Earth-Fixed (ECEF) system to a North-East-Up (NEU) topocentric       * system, centered at the provided reference location.       *       * The NEU system is commonly used when comparing the relative accuracy       * of a given GNSS data processing strategy. Be mindful, however, that        * NEU is a "left-handed" reference system, whereas geocentric ECEF and       * topocentric North-East-Down (NED) are "right-handed" systems.       *        * A typical way to use this class follows:       *       * @code       *   RinexObsStream rin("ebre0300.02o");       *   // Reference position of receiver station       *   Position nominalPos(4833520.2269, 41537.00768, 4147461.489);       *       *   // Some more code and definitions here...       *       *   gnssRinex gRin;       *       *   // Set defaults of model. A typical C1-based modeling is used       *   ModeledPR modelRef(nominalPos, ionoStore, mopsTM, bceStore,       *   TypeID::C1, true);       *       *   // Let's define a new equation definition to adapt solver object        *   // to base change       *   TypeIDSet typeSet;       *   typeSet.insert(TypeID::dLat);       *   typeSet.insert(TypeID::dLon);       *   typeSet.insert(TypeID::dH);       *   typeSet.insert(TypeID::cdt);       *   gnssEquationDefinition newEq(TypeID::prefitC, typeSet);       *       *   // Declare (and tune) a SolverLMS object       *   SolverLMS solver;       *   solver.setDefaultEqDefinition(newEq);       *       *   // Declare the base-changing object setting the reference position       *   XYZ2NEU baseChange(nominalPos);       *       *   while(rin >> gRin) {       *      gRin >> modelRef >> baseChange >> solver;       *   }       *       * @endcode       *       * The "XYZ2NEU" object will visit every satellite in the GNSS data       * structure that is "gRin" and will apply a rotation matrix to       * coefficients dx, dy and dz of the design matrix, yielding       * corresponding dLat, dLon and dH for each satellite.       *        * Take notice that the design matrix coefficients dx, dy and dz were       * computed by the "ModeledPR" object, so that step is mandatory.       *       * Also, the "XYZ2NEU" class is effective when properly coupled with       * the "solver" object (be it based on LMS or WMS). In order to get       * this, you must instruct the "solver" object to get the solution using       * a geometry/design matrix based on dLat, dLon and dH, instead of the       * defaults (dx, dy and dz).       *       * The later is achieved defining an appropriate "gnssEquationDefinition"       * object and instructing "solver" to use it as the default equation       * definition.       *       * @sa XYZ2NED.hpp       */   class XYZ2NEU : public ProcessingClass   {   public:         /// Default constructor.      XYZ2NEU() : refLat(0.0), refLon(0.0)      { init(); setIndex(); };         /** Common constructor taking reference point latitude and longitude          *          * @param lat       Latitude of the reference point.          * @param lon       Longitude of the reference point.          */      XYZ2NEU(const double& lat,              const double& lon)      { setLatLon(lat, lon); setIndex(); }         /** Common constructor taking reference point Position object          *          * @param refPos    Reference point Position object.          */      XYZ2NEU(const Position& refPos);         /** Method to set the latitude of the reference point, in degrees.          * @param lat      Latitude of the reference point, in degrees.          *          * @warning If parameter lat is outside +90/-90 degrees range,          *    then latitude will be set to 0 degrees.          */      virtual XYZ2NEU& setLat(const double& lat);         /// Method to get the latitude of the reference point, in degrees.      virtual double getLat() const      { return (refLat*RAD_TO_DEG); };         /** Method to set the longitude of the reference point, in degrees.          * @param lon       Longitude of the reference point, in degrees.          */      virtual XYZ2NEU& setLon(const double& lon);         /// Method to get the longitude of the reference point, in degrees.      virtual double getLon() const      { return (refLon*RAD_TO_DEG); };         /** Method to set simultaneously the latitude and longitude of the          *  reference point, in degrees.          * @param lat      Latitude of the reference point, in degrees.          * @param lon       Longitude of the reference point, in degrees.          *          * @warning If parameter lat is outside +90/-90 degrees range,          *    then latitude will be set to 0 degrees.          */      virtual XYZ2NEU& setLatLon(const double& lat,                                 const double& lon);         /** Returns a reference to a satTypeValueMap object after           *  converting from a geocentric reference system to a topocentric          *  reference system.          *          * @param gData     Data object holding the data.          */      virtual satTypeValueMap& Process(satTypeValueMap& gData);         /** Returns a reference to a gnssSatTypeValue object after           *  converting from a geocentric reference system to a topocentric          *  reference system.          *          * @param gData    Data object holding the data.          */      virtual gnssSatTypeValue& Process(gnssSatTypeValue& gData)       { Process(gData.body); return gData; };         /** Returns a reference to a gnnsRinex object after converting           *  from a geocentric reference system to a topocentric reference          *  system.          *          * @param gData    Data object holding the data.          */      virtual gnssRinex& Process(gnssRinex& gData)      { Process(gData.body); return gData; };         /// Returns an index identifying this object.      virtual int getIndex(void) const;         /// Returns a string identifying this object.      virtual std::string getClassName(void) const;         /** Sets the index to a given arbitrary value. Use with caution.          *          * @param newindex      New integer index to be assigned to           *                      current object.          */      XYZ2NEU& setIndex(const int newindex)      { index = newindex; return (*this); };         /// Destructor.      virtual ~XYZ2NEU() {};   private:         /// Latitude of the reference point (topocentric reference),          /// in radians.      double refLat;         /// Longitude of the reference point (topocentric reference),          /// in radians.      double refLon;         /// Rotation matrix.      Matrix<double> rotationMatrix;         /// Set (TypeIDSet) containing the types of data to be converted          /// (dx, dy, dz).      TypeIDSet inputSet;         /// Set (TypeIDSet) containing the resulting types of data          /// (dLat, dLon, dH).      TypeIDSet outputSet;         /// This method builds the rotation matrix according to refLat          /// and refLon values.      virtual void init();         /// Initial index assigned to this class.      static int classIndex;         /// Index belonging to this object.      int index;         /// Sets the index and increment classIndex.      void setIndex(void)      { index = classIndex++; };   }; // class XYZ2NEU      //@}} // namespace#endif // XYZ2NEU_HPP

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -