#ifndef _Gis3_Coords_method_h_ #define _Gis3_Coords_method_h_ NAMESPACE_UPP class GisCoordsLonLat : public GisCoords::Data { public: GisCoordsLonLat(double prime_meridian = 0.0); virtual GisCoords DeepCopy() const { return new GisCoordsLonLat(*this); } virtual Pointf LonLat(Pointf xy) const; virtual Rectf LonLatExtent(const Rectf& xy_extent) const; virtual Pointf Project(Pointf lonlat, int branch) const; virtual Rectf ProjectExtent(const Rectf& lonlat_extent) const; virtual double ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const; virtual double ProjectRatio(Pointf lonlat, int branch) const; // virtual String ToString() const; virtual Array EnumArgs(); virtual Array EnumConstArgs() const; virtual void SyncArgs(); virtual bool IsProjected() const; public: double prime_meridian; }; class GisCoordsSphericalData { public: double base_parallel; }; class SphericalLatitudeFunction : public GisFunction { public: SphericalLatitudeFunction(double alpha, double k, double R, double e, double U0) : alpha(alpha), k(k), R(R), e(e), U0(U0) {} virtual double Get(double x) const; private: double alpha, k, R, e, U0; }; class GisCoordsSpherical : public GisCoords::Data , public GisCoordsSphericalData { public: typedef GisCoordsSpherical CLASSNAME; GisCoordsSpherical(double base_parallel = 50.0); GisCoordsSpherical(const GisCoordsSpherical& cgs) : GisCoords::Data(cgs), GisCoordsSphericalData(cgs) { SyncArgs(); } virtual GisCoords DeepCopy() const { return new GisCoordsSpherical(*this); } virtual Pointf LonLat(Pointf xy) const; virtual Rectf LonLatExtent(const Rectf& xy_extent) const; virtual Pointf Project(Pointf lonlat, int branch) const; virtual Rectf ProjectExtent(const Rectf& lonlat_extent) const; virtual double ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const; virtual double ProjectRatio(Pointf lonlat, int branch) const; // virtual String ToString() const; virtual Array EnumArgs(); virtual Array EnumConstArgs() const; virtual void SyncArgs(); private: void CheckInterpolator() const { if(gauss_projected.IsEmpty()) SyncInterpolator(); } void SyncInterpolator() const; private: mutable GisInterpolator gauss_projected; mutable GisInterpolator gauss_latitude; double alpha, k, R, e, U0; }; class ConicalRadiusFunction : public GisFunction { public: ConicalRadiusFunction(double n, double rho_coef); virtual double Get(double x) const; private: double n; double k0, k1; double rho_coef; }; class GisCoordsConicalData { public: // bool gauss_sphere; double gauss_base_parallel; double pole_meridian; double pole_parallel; double central_parallel; // double prime_meridian; double north_parallel; double south_parallel; double multiplier; double xmeteroffset; double ymeteroffset; }; class GisCoordsConical : public GisCoords::Data , public GisCoordsConicalData { public: typedef GisCoordsConical CLASSNAME; GisCoordsConical( double gauss_base_parallel = 49.5, double pole_meridian = ANGDEG(42, 31, 31.41725), double pole_parallel = ANGDEG(59, 42, 42.6969), double central_parallel = 78.5, double north_parallel = 78.5, double south_parallel = 78.5, double multiplier = 0.9999, double xmeteroffset = 0, double ymeteroffset = 0); GisCoordsConical(const GisCoordsConical& cgs) : GisCoords::Data(cgs), GisCoordsConicalData(cgs) { SyncArgs(); } virtual GisCoords DeepCopy() const { return new GisCoordsConical(*this); } virtual int GetBranchCount() const; virtual Array LonLatBoundary(const Rectf& lonlat_extent, int branch) const; virtual GisBSPTree GetBranchTree(const Rectf& lonlat_extent) const; virtual Pointf LonLat(Pointf xy) const; virtual Rectf LonLatExtent(const Rectf& xy_extent) const; virtual Pointf Project(Pointf lonlat, int branch) const; virtual Rectf ProjectExtent(const Rectf& lonlat_extent) const; virtual double ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const; virtual double ExtentDeviation(const Rectf& lonlat_extent) const; virtual double ProjectRatio(Pointf lonlat, int branch) const; virtual Sizef MinMaxRatio(const Rectf& lonlat_extent) const; // virtual String ToString() const; virtual Array EnumArgs(); virtual Array EnumConstArgs() const; virtual void SyncArgs(); String DumpProjectedDelta() const; private: void CheckInterpolator() const { if(tgsin_projected.IsEmpty()) SyncInterpolator(); } void SyncInterpolator() const; private: mutable GisInterpolator gauss_projected; mutable GisInterpolator gauss_latitude; mutable GisInterpolator tgsin_projected; mutable GisInterpolator tgsin_latitude; GisOrientation orientation; double gauss_alpha, gauss_k, gauss_R, gauss_e, gauss_U0; double rho0; double n; // double e; double rho_coef; }; class GisCoordsUTMData { public: double central_meridian; double multiplier; double xmeteroffset; double ymeteroffset; }; class GisCoordsUTM : public GisCoords::Data, public GisCoordsUTMData { public: typedef GisCoordsUTM CLASSNAME; GisCoordsUTM( double central_meridian = 0.0, double multiplier = 1.0, double xmeteroffset = 0.0, double ymeteroffset = 0.0); GisCoordsUTM(const GisCoordsUTM& cgs) : GisCoords::Data(cgs), GisCoordsUTMData(cgs) { SyncArgs(); } virtual GisCoords DeepCopy() const { return new GisCoordsUTM(*this); } virtual Pointf LonLat(Pointf xy) const; virtual Pointf Project(Pointf lonlat, int branch) const; virtual Array EnumArgs(); virtual Array EnumConstArgs() const; virtual void SyncArgs(); String DumpProjectedDelta() const; private: double E21, E12; }; class GisCoordsAzimuthal : public GisCoords::Data { public: typedef GisCoordsAzimuthal CLASSNAME; GisCoordsAzimuthal(Pointf pole = Pointf(0, 90)); // GisCoordsAzimuthal(const GisCoordsAzimuthal& a) virtual GisCoords DeepCopy() const { return new GisCoordsAzimuthal(*this); } virtual int GetBranchCount() const; virtual Array LonLatBoundary(const Rectf& lonlat_extent, int branch) const; virtual GisBSPTree GetBranchTree(const Rectf& lonlat_extent) const; virtual Pointf LonLat(Pointf xy) const; virtual Rectf LonLatExtent(const Rectf& xy_extent) const; virtual Pointf Project(Pointf lonlat, int branch) const; virtual Rectf ProjectExtent(const Rectf& lonlat_extent) const; virtual double ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const; virtual double ProjectRatio(Pointf lonlat, int branch) const; // virtual String ToString() const; virtual Array EnumArgs(); virtual Array EnumConstArgs() const; virtual void SyncArgs(); private: void CheckInterpolator() const {} // if(false) SyncInterpolator(); } void SyncInterpolator() const; public: Pointf pole; GisOrientation orientation; double R, Rdeg, E, c; }; END_UPP_NAMESPACE #endif