ultimatepp/uppsrc/Geom/Coords/method.h
mdelfede d2b54f7989 changed svn layout
git-svn-id: svn://ultimatepp.org/upp/trunk@281 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2008-06-07 22:31:27 +00:00

239 lines
7.6 KiB
C++

#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<GisCoords::Arg> EnumArgs();
virtual Array<GisCoords::ConstArg> 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<GisCoords::Arg> EnumArgs();
virtual Array<GisCoords::ConstArg> 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<Pointf> 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<GisCoords::Arg> EnumArgs();
virtual Array<GisCoords::ConstArg> 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<GisCoords::Arg> EnumArgs();
virtual Array<GisCoords::ConstArg> 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<Pointf> 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<GisCoords::Arg> EnumArgs();
virtual Array<GisCoords::ConstArg> 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