1 #ifndef _Gis3_Coords_method_h_
2 #define _Gis3_Coords_method_h_
3 
4 namespace Upp {
5 
6 class GisCoordsLonLat : public GisCoords::Data
7 {
8 public:
9 	GisCoordsLonLat(double prime_meridian = 0.0);
10 
DeepCopy()11 	virtual GisCoords     DeepCopy() const { return new GisCoordsLonLat(*this); }
12 
13 	virtual Pointf        LonLat(Pointf xy) const;
14 	virtual Rectf         LonLatExtent(const Rectf& xy_extent) const;
15 	virtual Pointf        Project(Pointf lonlat, int branch) const;
16 	virtual Rectf         ProjectExtent(const Rectf& lonlat_extent) const;
17 	virtual double        ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const;
18 	virtual double        ProjectRatio(Pointf lonlat, int branch) const;
19 
20 //	virtual String        ToString() const;
21 	virtual Array<GisCoords::Arg> EnumArgs();
22 	virtual Array<GisCoords::ConstArg> EnumConstArgs() const;
23 	virtual void          SyncArgs();
24 	virtual bool          IsProjected() const;
25 
26 public:
27 	double                prime_meridian;
28 };
29 
30 class GisCoordsSphericalData
31 {
32 public:
33 	double                base_parallel;
34 };
35 
36 class GisCoordsSpherical : public GisCoords::Data
37 	, public GisCoordsSphericalData
38 {
39 public:
40 	typedef GisCoordsSpherical CLASSNAME;
41 	GisCoordsSpherical(double base_parallel = 50.0);
GisCoordsSpherical(const GisCoordsSpherical & cgs)42 	GisCoordsSpherical(const GisCoordsSpherical& cgs)
43 		: GisCoords::Data(cgs), GisCoordsSphericalData(cgs) { SyncArgs(); }
44 
DeepCopy()45 	virtual GisCoords DeepCopy() const { return new GisCoordsSpherical(*this); }
46 
47 	virtual Pointf        LonLat(Pointf xy) const;
48 	virtual Rectf         LonLatExtent(const Rectf& xy_extent) const;
49 	virtual Pointf        Project(Pointf lonlat, int branch) const;
50 	virtual Rectf         ProjectExtent(const Rectf& lonlat_extent) const;
51 	virtual double        ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const;
52 	virtual double        ProjectRatio(Pointf lonlat, int branch) const;
53 
54 //	virtual String        ToString() const;
55 	virtual Array<GisCoords::Arg> EnumArgs();
56 	virtual Array<GisCoords::ConstArg> EnumConstArgs() const;
57 	virtual void          SyncArgs();
58 
59 private:
CheckInterpolator()60 	void                  CheckInterpolator() const { if(gauss_projected.IsEmpty()) SyncInterpolator(); }
61 	void                  SyncInterpolator() const;
62 
63 private:
64 	mutable GisInterpolator gauss_projected;
65 	mutable GisInterpolator gauss_latitude;
66 	double                alpha, k, R, e, U0;
67 };
68 
69 class ConicalRadiusFunction : public GisFunction
70 {
71 public:
72 	ConicalRadiusFunction(double n, double rho_coef);
73 
74 	virtual double Get(double x) const;
75 
76 private:
77 	double n;
78 	double k0, k1;
79 	double rho_coef;
80 };
81 
82 class GisCoordsConicalData
83 {
84 public:
85 //	bool                  gauss_sphere;
86 	double                gauss_base_parallel;
87 	double                pole_meridian;
88 	double                pole_parallel;
89 	double                central_parallel;
90 //	double                prime_meridian;
91 	double                north_parallel;
92 	double                south_parallel;
93 	double                multiplier;
94 	double                xmeteroffset;
95 	double                ymeteroffset;
96 };
97 
98 class GisCoordsConical : public GisCoords::Data
99 	, public GisCoordsConicalData
100 {
101 public:
102 	typedef GisCoordsConical CLASSNAME;
103 	GisCoordsConical(
104 		double gauss_base_parallel = 49.5,
105 		double pole_meridian = ANGDEG(42, 31, 31.41725),
106 		double pole_parallel = ANGDEG(59, 42, 42.6969),
107 		double central_parallel = 78.5,
108 		double north_parallel = 78.5,
109 		double south_parallel = 78.5,
110 		double multiplier = 0.9999,
111 		double xmeteroffset = 0, double ymeteroffset = 0);
GisCoordsConical(const GisCoordsConical & cgs)112 	GisCoordsConical(const GisCoordsConical& cgs)
113 		: GisCoords::Data(cgs), GisCoordsConicalData(cgs) { SyncArgs(); }
114 
DeepCopy()115 	virtual GisCoords DeepCopy() const { return new GisCoordsConical(*this); }
116 
117 	virtual int           GetBranchCount() const;
118 	virtual Array<Pointf> LonLatBoundary(const Rectf& lonlat_extent, int branch) const;
119 	virtual GisBSPTree    GetBranchTree(const Rectf& lonlat_extent) const;
120 
121 	virtual Pointf        LonLat(Pointf xy) const;
122 	virtual Rectf         LonLatExtent(const Rectf& xy_extent) const;
123 	virtual Pointf        Project(Pointf lonlat, int branch) const;
124 	virtual Rectf         ProjectExtent(const Rectf& lonlat_extent) const;
125 	virtual double        ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const;
126 	virtual double        ExtentDeviation(const Rectf& lonlat_extent) const;
127 	virtual double        ProjectRatio(Pointf lonlat, int branch) const;
128 	virtual Sizef         MinMaxRatio(const Rectf& lonlat_extent) const;
129 
130 //	virtual String        ToString() const;
131 	virtual Array<GisCoords::Arg> EnumArgs();
132 	virtual Array<GisCoords::ConstArg> EnumConstArgs() const;
133 	virtual void          SyncArgs();
134 
135 	String                DumpProjectedDelta() const;
136 
137 private:
CheckInterpolator()138 	void                  CheckInterpolator() const { if(tgsin_projected.IsEmpty()) SyncInterpolator(); }
139 	void                  SyncInterpolator() const;
140 
141 private:
142 	mutable GisInterpolator gauss_projected;
143 	mutable GisInterpolator gauss_latitude;
144 	mutable GisInterpolator tgsin_projected;
145 	mutable GisInterpolator tgsin_latitude;
146 	GisOrientation        orientation;
147 	double                gauss_alpha, gauss_k, gauss_R, gauss_e, gauss_U0;
148 	double                rho0;
149 	double                n;
150 //	double                e;
151 	double                rho_coef;
152 };
153 
154 class GisCoordsUTMData
155 {
156 public:
157 	double                central_meridian;
158 	double                multiplier;
159 	double                xmeteroffset;
160 	double                ymeteroffset;
161 };
162 
163 class GisCoordsUTM : public GisCoords::Data, public GisCoordsUTMData
164 {
165 public:
166 	typedef GisCoordsUTM CLASSNAME;
167 	GisCoordsUTM(
168 		double central_meridian = 0.0,
169 		double multiplier = 1.0,
170 		double xmeteroffset = 0.0,
171 		double ymeteroffset = 0.0);
GisCoordsUTM(const GisCoordsUTM & cgs)172 	GisCoordsUTM(const GisCoordsUTM& cgs)
173 		: GisCoords::Data(cgs), GisCoordsUTMData(cgs) { SyncArgs(); }
174 
DeepCopy()175 	virtual GisCoords     DeepCopy() const { return new GisCoordsUTM(*this); }
176 
177 	virtual Pointf        LonLat(Pointf xy) const;
178 	virtual Pointf        Project(Pointf lonlat, int branch) const;
179 
180 	virtual Array<GisCoords::Arg> EnumArgs();
181 	virtual Array<GisCoords::ConstArg> EnumConstArgs() const;
182 	virtual void          SyncArgs();
183 
184 	String                DumpProjectedDelta() const;
185 
186 private:
187 	double                E21, E12;
188 };
189 
190 class GisCoordsAzimuthal : public GisCoords::Data
191 {
192 public:
193 	typedef GisCoordsAzimuthal CLASSNAME;
194 	GisCoordsAzimuthal(const Pointf& pole = Pointf(0, 90),
195 		const Sizef& scale = Sizef(1, 1), const Sizef& offset = Sizef(0, 0));
196 //	GisCoordsAzimuthal(const GisCoordsAzimuthal& a)
197 
198 	virtual GisCoords     DeepCopy() const;
199 
200 	virtual int           GetBranchCount() const;
201 	virtual Array<Pointf> LonLatBoundary(const Rectf& lonlat_extent, int branch) const;
202 	virtual GisBSPTree    GetBranchTree(const Rectf& lonlat_extent) const;
203 
204 	virtual Pointf        LonLat(Pointf xy) const;
205 	//virtual Rectf         LonLatExtent(const Rectf& xy_extent) const;
206 	virtual Pointf        Project(Pointf lonlat, int branch) const;
207 	//virtual Rectf         ProjectExtent(const Rectf& lonlat_extent) const;
208 	//virtual double        ProjectDeviation(Pointf lonlat1, Pointf lonlat2, int branch) const;
209 	//virtual double        ProjectRatio(Pointf lonlat, int branch) const;
210 
211 //	virtual String        ToString() const;
212 	virtual Array<GisCoords::Arg> EnumArgs();
213 	virtual Array<GisCoords::ConstArg> EnumConstArgs() const;
214 	virtual void          SyncArgs();
215 
216 private:
CheckInterpolator()217 	void                  CheckInterpolator() const {} // if(false) SyncInterpolator(); }
218 	void                  SyncInterpolator() const;
219 
220 public:
221 	Pointf                pole;
222 	Pointf                gauss_pole;
223 	Sizef                 scale;
224 	Sizef                 offset;
225 	GisOrientation        orientation;
226 	GisCoordsGaussLatitude gauss;
227 };
228 
229 }
230 
231 #endif
232