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