mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-05-17 06:06:00 -06:00
239 lines
7.6 KiB
C++
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
|