This file is indexed.

/usr/share/doc/geographiclib/html/UTMUPS_8hpp_source.html is in geographiclib-tools 1.8-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>GeographicLib: UTMUPS.hpp Source File</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.1 -->
<div class="navigation" id="top">
  <div class="tabs">
    <ul class="tablist">
      <li><a href="index.html"><span>Main&nbsp;Page</span></a></li>
      <li><a href="pages.html"><span>Related&nbsp;Pages</span></a></li>
      <li><a href="namespaces.html"><span>Namespaces</span></a></li>
      <li><a href="annotated.html"><span>Classes</span></a></li>
      <li class="current"><a href="files.html"><span>Files</span></a></li>
      <li><a href="dirs.html"><span>Directories</span></a></li>
    </ul>
  </div>
  <div class="tabs2">
    <ul class="tablist">
      <li><a href="files.html"><span>File&nbsp;List</span></a></li>
      <li><a href="globals.html"><span>File&nbsp;Members</span></a></li>
    </ul>
  </div>
  <div class="navpath">
    <ul>
      <li><a class="el" href="dir_f624aa4962e92581e36e10adf24cfc84.html">include</a>      </li>
      <li><a class="el" href="dir_0f324d7550514966066ff24c6d4b8a42.html">GeographicLib</a>      </li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<h1>UTMUPS.hpp</h1>  </div>
</div>
<div class="contents">
<a href="UTMUPS_8hpp.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment"><a name="l00001"></a>00001 <span class="comment">/**</span>
<a name="l00002"></a>00002 <span class="comment"> * \file UTMUPS.hpp</span>
<a name="l00003"></a>00003 <span class="comment"> * \brief Header for GeographicLib::UTMUPS class</span>
<a name="l00004"></a>00004 <span class="comment"> *</span>
<a name="l00005"></a>00005 <span class="comment"> * Copyright (c) Charles Karney (2008, 2009, 2010, 2011) &lt;charles@karney.com&gt;</span>
<a name="l00006"></a>00006 <span class="comment"> * and licensed under the LGPL.  For more information, see</span>
<a name="l00007"></a>00007 <span class="comment"> * http://geographiclib.sourceforge.net/</span>
<a name="l00008"></a>00008 <span class="comment"> **********************************************************************/</span>
<a name="l00009"></a>00009 
<a name="l00010"></a>00010 <span class="preprocessor">#if !defined(GEOGRAPHICLIB_UTMUPS_HPP)</span>
<a name="l00011"></a><a class="code" href="UTMUPS_8hpp.html#aab4dce5d203c0d98ae740800332ed9d9">00011</a> <span class="preprocessor"></span><span class="preprocessor">#define GEOGRAPHICLIB_UTMUPS_HPP &quot;$Id: UTMUPS.hpp 6937 2011-02-01 20:17:13Z karney $&quot;</span>
<a name="l00012"></a>00012 <span class="preprocessor"></span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &quot;<a class="code" href="Constants_8hpp.html" title="Header for GeographicLib::Constants class.">GeographicLib/Constants.hpp</a>&quot;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;sstream&gt;</span>
<a name="l00015"></a>00015 
<a name="l00016"></a>00016 <span class="keyword">namespace </span>GeographicLib {
<a name="l00017"></a>00017 <span class="comment"></span>
<a name="l00018"></a>00018 <span class="comment">  /**</span>
<a name="l00019"></a>00019 <span class="comment">   * \brief Convert between Geographic coordinates and UTM/UPS</span>
<a name="l00020"></a>00020 <span class="comment">   *</span>
<a name="l00021"></a>00021 <span class="comment">   * UTM and UPS are defined</span>
<a name="l00022"></a>00022 <span class="comment">   * - J. W. Hager, J. F. Behensky, and B. W. Drew,</span>
<a name="l00023"></a>00023 <span class="comment">   *   &lt;a href=&quot;http://earth-info.nga.mil/GandG/publications/tm8358.2/TM8358_2.pdf&quot;&gt;</span>
<a name="l00024"></a>00024 <span class="comment">   *   The Universal Grids: Universal Transverse Mercator (UTM) and Universal</span>
<a name="l00025"></a>00025 <span class="comment">   *   Polar Stereographic (UPS)&lt;/a&gt;, Defense Mapping Agency, Technical Manual</span>
<a name="l00026"></a>00026 <span class="comment">   *   TM8358.2 (1989).</span>
<a name="l00027"></a>00027 <span class="comment">   * .</span>
<a name="l00028"></a>00028 <span class="comment">   * Section 2-3 defines UTM and section 3-2.4 defines UPS.  This document also</span>
<a name="l00029"></a>00029 <span class="comment">   * includes approximate algorithms for the computation of the underlying</span>
<a name="l00030"></a>00030 <span class="comment">   * transverse Mercator and polar stereographic projections.  Here we</span>
<a name="l00031"></a>00031 <span class="comment">   * substitute much more accurate algorithms given by</span>
<a name="l00032"></a>00032 <span class="comment">   * GeographicLib:TransverseMercator and GeographicLib:PolarStereographic.</span>
<a name="l00033"></a>00033 <span class="comment">   *</span>
<a name="l00034"></a>00034 <span class="comment">   * In this implementation, the conversions are closed, i.e., output from</span>
<a name="l00035"></a>00035 <span class="comment">   * Forward is legal input for Reverse and vice versa.  The error is about 5nm</span>
<a name="l00036"></a>00036 <span class="comment">   * in each direction.  However, the conversion from legal UTM/UPS coordinates</span>
<a name="l00037"></a>00037 <span class="comment">   * to geographic coordinates and back might throw an error if the initial</span>
<a name="l00038"></a>00038 <span class="comment">   * point is within 5nm of the edge of the allowed range for the UTM/UPS</span>
<a name="l00039"></a>00039 <span class="comment">   * coordinates.</span>
<a name="l00040"></a>00040 <span class="comment">   *</span>
<a name="l00041"></a>00041 <span class="comment">   * The simplest way to guarantee the closed property is to define allowed</span>
<a name="l00042"></a>00042 <span class="comment">   * ranges for the eastings and northings for UTM and UPS coordinates.  The</span>
<a name="l00043"></a>00043 <span class="comment">   * UTM boundaries are the same for all zones.  (The only place the</span>
<a name="l00044"></a>00044 <span class="comment">   * exceptional nature of the zone boundaries is evident is when converting to</span>
<a name="l00045"></a>00045 <span class="comment">   * UTM/UPS coordinates requesting the standard zone.)  The MGRS lettering</span>
<a name="l00046"></a>00046 <span class="comment">   * scheme imposes natural limits on UTM/UPS coordinates which may be</span>
<a name="l00047"></a>00047 <span class="comment">   * converted into MGRS coordinates.  For the conversion to/from geographic</span>
<a name="l00048"></a>00048 <span class="comment">   * coordinates these ranges have been extended by 100km in order to provide a</span>
<a name="l00049"></a>00049 <span class="comment">   * generous overlap between UTM and UPS and between UTM zones.</span>
<a name="l00050"></a>00050 <span class="comment">   *</span>
<a name="l00051"></a>00051 <span class="comment">   * The &lt;a href=&quot;http://www.nga.mil&quot;&gt;NGA&lt;/a&gt; software package</span>
<a name="l00052"></a>00052 <span class="comment">   * &lt;a href=&quot;http://earth-info.nga.mil/GandG/geotrans/index.html&quot;&gt;geotrans&lt;/a&gt;</span>
<a name="l00053"></a>00053 <span class="comment">   * also provides conversions to and from UTM and UPS.  Version 2.4.2 (and</span>
<a name="l00054"></a>00054 <span class="comment">   * earlier) suffers from some drawbacks:</span>
<a name="l00055"></a>00055 <span class="comment">   * - Inconsistent rules are used to determine the whether a particular UTM or</span>
<a name="l00056"></a>00056 <span class="comment">   *   UPS coordinate is legal.  A more systematic approach is taken here.</span>
<a name="l00057"></a>00057 <span class="comment">   * - The underlying projections are not very accurately implemented.</span>
<a name="l00058"></a>00058 <span class="comment">   **********************************************************************/</span>
<a name="l00059"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html">00059</a>   <span class="keyword">class </span><a class="code" href="classGeographicLib_1_1UTMUPS.html" title="Convert between Geographic coordinates and UTM/UPS.">UTMUPS</a> {
<a name="l00060"></a>00060   <span class="keyword">private</span>:
<a name="l00061"></a>00061     <span class="keyword">typedef</span> <a class="code" href="classGeographicLib_1_1Math.html#aeee4778d7cf2f9fb9648efe4911da59d">Math::real</a> real;
<a name="l00062"></a>00062     <span class="keyword">static</span> <span class="keyword">const</span> real falseeasting[4];
<a name="l00063"></a>00063     <span class="keyword">static</span> <span class="keyword">const</span> real falsenorthing[4];
<a name="l00064"></a>00064     <span class="keyword">static</span> <span class="keyword">const</span> real mineasting[4];
<a name="l00065"></a>00065     <span class="keyword">static</span> <span class="keyword">const</span> real maxeasting[4];
<a name="l00066"></a>00066     <span class="keyword">static</span> <span class="keyword">const</span> real minnorthing[4];
<a name="l00067"></a>00067     <span class="keyword">static</span> <span class="keyword">const</span> real maxnorthing[4];
<a name="l00068"></a>00068     <span class="keyword">static</span> real CentralMeridian(<span class="keywordtype">int</span> zone) <span class="keywordflow">throw</span>()
<a name="l00069"></a>00069     { <span class="keywordflow">return</span> real(6 * zone - 183); }
<a name="l00070"></a>00070     <span class="keyword">template</span>&lt;<span class="keyword">typename</span> T&gt; <span class="keyword">static</span> std::string str(T x) {
<a name="l00071"></a>00071       std::ostringstream s; s &lt;&lt; x; <span class="keywordflow">return</span> s.str();
<a name="l00072"></a>00072     }
<a name="l00073"></a>00073     <span class="keyword">static</span> <span class="keywordtype">void</span> CheckLatLon(real lat, real lon);
<a name="l00074"></a>00074     <span class="comment">// Throw an error if easting or northing are outside standard ranges.  If</span>
<a name="l00075"></a>00075     <span class="comment">// throwp = false, return bool instead.</span>
<a name="l00076"></a>00076     <span class="keyword">static</span> <span class="keywordtype">bool</span> CheckCoords(<span class="keywordtype">bool</span> utmp, <span class="keywordtype">bool</span> northp, real x, real y,
<a name="l00077"></a>00077                             <span class="keywordtype">bool</span> msgrlimits = <span class="keyword">false</span>, <span class="keywordtype">bool</span> throwp = <span class="keyword">true</span>);
<a name="l00078"></a>00078     <a class="code" href="classGeographicLib_1_1UTMUPS.html" title="Convert between Geographic coordinates and UTM/UPS.">UTMUPS</a>();                   <span class="comment">// Disable constructor</span>
<a name="l00079"></a>00079 
<a name="l00080"></a>00080   <span class="keyword">public</span>:
<a name="l00081"></a>00081 <span class="comment"></span>
<a name="l00082"></a>00082 <span class="comment">    /**</span>
<a name="l00083"></a>00083 <span class="comment">     * In this class we bring together the UTM and UPS coordinates systems.</span>
<a name="l00084"></a>00084 <span class="comment">     * The UTM divides the earth between latitudes -80 and 84 into 60 zones</span>
<a name="l00085"></a>00085 <span class="comment">     * numbered 1 thru 60.  Zone assign zone number 0 to the UPS regions,</span>
<a name="l00086"></a>00086 <span class="comment">     * covering the two poles.  Within UTMUPS, non-negative zone numbers refer</span>
<a name="l00087"></a>00087 <span class="comment">     * to one of the &quot;physical&quot; zones, 0 for UPS and [1, 60] for UTM.  Negative</span>
<a name="l00088"></a>00088 <span class="comment">     * &quot;pseudo-zone&quot; numbers are used to select one of the physical zones.</span>
<a name="l00089"></a>00089 <span class="comment">     **********************************************************************/</span>
<a name="l00090"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7">00090</a>     <span class="keyword">enum</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7">zonespec</a> {<span class="comment"></span>
<a name="l00091"></a>00091 <span class="comment">      /**</span>
<a name="l00092"></a>00092 <span class="comment">       * The smallest pseudo-zone number.</span>
<a name="l00093"></a>00093 <span class="comment">       **********************************************************************/</span>
<a name="l00094"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a058ac8a834bbc78ce73d9b37a1a5dfb9">00094</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a058ac8a834bbc78ce73d9b37a1a5dfb9">MINPSEUDOZONE</a> = -4,<span class="comment"></span>
<a name="l00095"></a>00095 <span class="comment">      /**</span>
<a name="l00096"></a>00096 <span class="comment">       * A marker for an undefined or invalid zone.  Equivalent to NaN.</span>
<a name="l00097"></a>00097 <span class="comment">       **********************************************************************/</span>
<a name="l00098"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aeb6750fb82edce6e5b58178a38ee8bd0">00098</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aeb6750fb82edce6e5b58178a38ee8bd0">INVALID</a> = -4,<span class="comment"></span>
<a name="l00099"></a>00099 <span class="comment">      /**</span>
<a name="l00100"></a>00100 <span class="comment">       * If a coordinate already include zone information (e.g., it is an MGRS</span>
<a name="l00101"></a>00101 <span class="comment">       * coordinate), use that, otherwise apply the UTMUPS::STANDARD rules.</span>
<a name="l00102"></a>00102 <span class="comment">       **********************************************************************/</span>
<a name="l00103"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a9059a8e3b4721e27869e99ed1ae3d320">00103</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a9059a8e3b4721e27869e99ed1ae3d320">MATCH</a> = -3,<span class="comment"></span>
<a name="l00104"></a>00104 <span class="comment">      /**</span>
<a name="l00105"></a>00105 <span class="comment">       * Apply the standard rules for UTM zone assigment extending the UTM zone</span>
<a name="l00106"></a>00106 <span class="comment">       * to each pole to give a zone number in [1, 60].  For example, use UTM</span>
<a name="l00107"></a>00107 <span class="comment">       * zone 38 for longitude in [42, 48).  The rules include the Norway and</span>
<a name="l00108"></a>00108 <span class="comment">       * Svalbard exceptions.</span>
<a name="l00109"></a>00109 <span class="comment">       **********************************************************************/</span>
<a name="l00110"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aacc8f89ac6144b1e445ca21cbe9a2533">00110</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aacc8f89ac6144b1e445ca21cbe9a2533">UTM</a> = -2,<span class="comment"></span>
<a name="l00111"></a>00111 <span class="comment">      /**</span>
<a name="l00112"></a>00112 <span class="comment">       * Apply the standard rules for zone assignment to give a zone number in</span>
<a name="l00113"></a>00113 <span class="comment">       * [0, 60].  If the latitude is not in [-80, 84), then use UTMUPS::UPS =</span>
<a name="l00114"></a>00114 <span class="comment">       * 0, otherwise apply the rules for UTMUPS::UTM.  The tests on latitudes</span>
<a name="l00115"></a>00115 <span class="comment">       * and longitudes are all closed on the lower end open on the upper.</span>
<a name="l00116"></a>00116 <span class="comment">       * Thus for UTM zone 38, latitude is in [-80, 84) and longitude is in</span>
<a name="l00117"></a>00117 <span class="comment">       * [42, 48).</span>
<a name="l00118"></a>00118 <span class="comment">       **********************************************************************/</span>
<a name="l00119"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7adf96495ab4bfbf495f1fe31aebb9e406">00119</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7adf96495ab4bfbf495f1fe31aebb9e406">STANDARD</a> = -1,<span class="comment"></span>
<a name="l00120"></a>00120 <span class="comment">      /**</span>
<a name="l00121"></a>00121 <span class="comment">       * The largest pseudo-zone number.</span>
<a name="l00122"></a>00122 <span class="comment">       **********************************************************************/</span>
<a name="l00123"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7ac22db7e136b6e06fba7c3c06b5888362">00123</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7ac22db7e136b6e06fba7c3c06b5888362">MAXPSEUDOZONE</a> = -1,<span class="comment"></span>
<a name="l00124"></a>00124 <span class="comment">      /**</span>
<a name="l00125"></a>00125 <span class="comment">       * The smallest physical zone number.</span>
<a name="l00126"></a>00126 <span class="comment">       **********************************************************************/</span>
<a name="l00127"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7af91adc987ae7295bfb6d3786b23c58e1">00127</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7af91adc987ae7295bfb6d3786b23c58e1">MINZONE</a> = 0,<span class="comment"></span>
<a name="l00128"></a>00128 <span class="comment">      /**</span>
<a name="l00129"></a>00129 <span class="comment">       * The zone number used for UPS</span>
<a name="l00130"></a>00130 <span class="comment">       **********************************************************************/</span>
<a name="l00131"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a40256f9ab9f277957f8ab697bcd2fd42">00131</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a40256f9ab9f277957f8ab697bcd2fd42">UPS</a> = 0,<span class="comment"></span>
<a name="l00132"></a>00132 <span class="comment">      /**</span>
<a name="l00133"></a>00133 <span class="comment">       * The smallest UTM zone number.</span>
<a name="l00134"></a>00134 <span class="comment">       **********************************************************************/</span>
<a name="l00135"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a1413e6cc83d4bf1eb4ad1c0f1d745eb6">00135</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a1413e6cc83d4bf1eb4ad1c0f1d745eb6">MINUTMZONE</a> = 1,<span class="comment"></span>
<a name="l00136"></a>00136 <span class="comment">      /**</span>
<a name="l00137"></a>00137 <span class="comment">       * The largest UTM zone number.</span>
<a name="l00138"></a>00138 <span class="comment">       **********************************************************************/</span>
<a name="l00139"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7ae8e04ab8df50a062c1fe277a6880bc19">00139</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7ae8e04ab8df50a062c1fe277a6880bc19">MAXUTMZONE</a> = 60,<span class="comment"></span>
<a name="l00140"></a>00140 <span class="comment">      /**</span>
<a name="l00141"></a>00141 <span class="comment">       * The largest physical zone number.</span>
<a name="l00142"></a>00142 <span class="comment">       **********************************************************************/</span>
<a name="l00143"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a12dabceb6da15aa0fc94b9406aca921a">00143</a>       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a12dabceb6da15aa0fc94b9406aca921a">MAXZONE</a> = 60,
<a name="l00144"></a>00144     };
<a name="l00145"></a>00145 <span class="comment"></span>
<a name="l00146"></a>00146 <span class="comment">    /**</span>
<a name="l00147"></a>00147 <span class="comment">     * The standard zone.</span>
<a name="l00148"></a>00148 <span class="comment">     *</span>
<a name="l00149"></a>00149 <span class="comment">     * @param[in] lat latitude (degrees).</span>
<a name="l00150"></a>00150 <span class="comment">     * @param[in] lon longitude (degrees).</span>
<a name="l00151"></a>00151 <span class="comment">     * @param[in] setzone zone override (optional)</span>
<a name="l00152"></a>00152 <span class="comment">     *</span>
<a name="l00153"></a>00153 <span class="comment">     * This is exact.  If the optional argument \e setzone is given then use</span>
<a name="l00154"></a>00154 <span class="comment">     * that zone if it is non-negative, otherwise apply the rules given in</span>
<a name="l00155"></a>00155 <span class="comment">     * UTMUPS::zonespec.  Throws an error if \e setzone is outsize the range</span>
<a name="l00156"></a>00156 <span class="comment">     * [UTMUPS::MINPSEUDOZONE, UTMUPS::MAXZONE] = [-4, 60].</span>
<a name="l00157"></a>00157 <span class="comment">     **********************************************************************/</span>
<a name="l00158"></a>00158     <span class="keyword">static</span> <span class="keywordtype">int</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#a62623c295d1b43318a9fa762c3da94ea">StandardZone</a>(<a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> lat, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> lon, <span class="keywordtype">int</span> setzone = <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7adf96495ab4bfbf495f1fe31aebb9e406">STANDARD</a>);
<a name="l00159"></a>00159 <span class="comment"></span>
<a name="l00160"></a>00160 <span class="comment">    /**</span>
<a name="l00161"></a>00161 <span class="comment">     * Forward projection, from geographic to UTM/UPS.</span>
<a name="l00162"></a>00162 <span class="comment">     *</span>
<a name="l00163"></a>00163 <span class="comment">     * @param[in] lat latitude of point (degrees).</span>
<a name="l00164"></a>00164 <span class="comment">     * @param[in] lon longitude of point (degrees).</span>
<a name="l00165"></a>00165 <span class="comment">     * @param[out] zone the UTM zone (zero means UPS).</span>
<a name="l00166"></a>00166 <span class="comment">     * @param[out] northp hemisphere of location (true means northern, false</span>
<a name="l00167"></a>00167 <span class="comment">     *   means southern).</span>
<a name="l00168"></a>00168 <span class="comment">     * @param[out] x easting of point (meters).</span>
<a name="l00169"></a>00169 <span class="comment">     * @param[out] y northing of point (meters).</span>
<a name="l00170"></a>00170 <span class="comment">     * @param[out] gamma meridian convergence at point (degrees).</span>
<a name="l00171"></a>00171 <span class="comment">     * @param[out] k scale of projection at point.</span>
<a name="l00172"></a>00172 <span class="comment">     * @param[in] setzone zone override.</span>
<a name="l00173"></a>00173 <span class="comment">     * @param[in] mgrslimits if true enforce the stricted MGRS limits on the</span>
<a name="l00174"></a>00174 <span class="comment">     *   coordinates (default = false).</span>
<a name="l00175"></a>00175 <span class="comment">     *</span>
<a name="l00176"></a>00176 <span class="comment">     * The prefered zone for the result can be specified with \e setzone, see</span>
<a name="l00177"></a>00177 <span class="comment">     * UTMUPS::StandardZone.  Throw error if the resulting easting or northing</span>
<a name="l00178"></a>00178 <span class="comment">     * is outside the allowed range (see Reverse), in which case the arguments</span>
<a name="l00179"></a>00179 <span class="comment">     * are unchanged.  This also returns meridian convergence \e gamma</span>
<a name="l00180"></a>00180 <span class="comment">     * (degrees) and scale \e k.  The accuracy of the conversion is about 5nm.</span>
<a name="l00181"></a>00181 <span class="comment">     **********************************************************************/</span>
<a name="l00182"></a>00182     <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#a921d6c23e728e0b17651902d43fb56e8">Forward</a>(<a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> lat, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> lon,
<a name="l00183"></a>00183                         <span class="keywordtype">int</span>&amp; zone, <span class="keywordtype">bool</span>&amp; northp, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; x, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; y,
<a name="l00184"></a>00184                         <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; gamma, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; k,
<a name="l00185"></a>00185                         <span class="keywordtype">int</span> setzone = <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7adf96495ab4bfbf495f1fe31aebb9e406">STANDARD</a>, <span class="keywordtype">bool</span> mgrslimits = <span class="keyword">false</span>);
<a name="l00186"></a>00186 <span class="comment"></span>
<a name="l00187"></a>00187 <span class="comment">    /**</span>
<a name="l00188"></a>00188 <span class="comment">     * Reverse projection, from  UTM/UPS to geographic.</span>
<a name="l00189"></a>00189 <span class="comment">     *</span>
<a name="l00190"></a>00190 <span class="comment">     * @param[in] zone the UTM zone (zero means UPS).</span>
<a name="l00191"></a>00191 <span class="comment">     * @param[in] northp hemisphere of location (true means northern, false</span>
<a name="l00192"></a>00192 <span class="comment">     *   means southern).</span>
<a name="l00193"></a>00193 <span class="comment">     * @param[in] x easting of point (meters).</span>
<a name="l00194"></a>00194 <span class="comment">     * @param[in] y northing of point (meters).</span>
<a name="l00195"></a>00195 <span class="comment">     * @param[out] lat latitude of point (degrees).</span>
<a name="l00196"></a>00196 <span class="comment">     * @param[out] lon longitude of point (degrees).</span>
<a name="l00197"></a>00197 <span class="comment">     * @param[out] gamma meridian convergence at point (degrees).</span>
<a name="l00198"></a>00198 <span class="comment">     * @param[out] k scale of projection at point.</span>
<a name="l00199"></a>00199 <span class="comment">     * @param[in] mgrslimits if true enforce the stricted MGRS limits on the</span>
<a name="l00200"></a>00200 <span class="comment">     *   coordinates (default = false).</span>
<a name="l00201"></a>00201 <span class="comment">     *</span>
<a name="l00202"></a>00202 <span class="comment">     * Throw error if easting or northing is outside the allowed range (see</span>
<a name="l00203"></a>00203 <span class="comment">     * below), in which case the arguments are unchanged.  The accuracy of the</span>
<a name="l00204"></a>00204 <span class="comment">     * conversion is about 5nm.</span>
<a name="l00205"></a>00205 <span class="comment">     *</span>
<a name="l00206"></a>00206 <span class="comment">     * UTM eastings are allowed to be in the range [0km, 1000km], northings are</span>
<a name="l00207"></a>00207 <span class="comment">     * allowed to be in in [0km, 9600km] for the northern hemisphere and in</span>
<a name="l00208"></a>00208 <span class="comment">     * [900km, 10000km] for the southern hemisphere.  (However UTM northings</span>
<a name="l00209"></a>00209 <span class="comment">     * can be continued across the equator.  So the actual limits on the</span>
<a name="l00210"></a>00210 <span class="comment">     * northings are [-9100km, 9600km] for the &quot;northern&quot; hemisphere and</span>
<a name="l00211"></a>00211 <span class="comment">     * [900km, 19600km] for the &quot;southern&quot; hemisphere.)</span>
<a name="l00212"></a>00212 <span class="comment">     *</span>
<a name="l00213"></a>00213 <span class="comment">     * UPS eastings and northings are allowed to be in the range [1200km,</span>
<a name="l00214"></a>00214 <span class="comment">     * 2800km] in the northern hemisphere and in [700km, 3100km] in the</span>
<a name="l00215"></a>00215 <span class="comment">     * southern hemisphere.</span>
<a name="l00216"></a>00216 <span class="comment">     *</span>
<a name="l00217"></a>00217 <span class="comment">     * These ranges are 100km larger than allowed for the conversions to MGRS.</span>
<a name="l00218"></a>00218 <span class="comment">     * (100km is the maximum extra padding consistent with eastings remaining</span>
<a name="l00219"></a>00219 <span class="comment">     * non-negative.)  This allows generous overlaps between zones and UTM and</span>
<a name="l00220"></a>00220 <span class="comment">     * UPS.  If \e mgrslimits = true, then all the ranges are shrunk by 100km</span>
<a name="l00221"></a>00221 <span class="comment">     * so that they agree with the stricter MGRS ranges.  No checks are</span>
<a name="l00222"></a>00222 <span class="comment">     * performed besides these (e.g., to limit the distance outside the</span>
<a name="l00223"></a>00223 <span class="comment">     * standard zone boundaries).</span>
<a name="l00224"></a>00224 <span class="comment">     **********************************************************************/</span>
<a name="l00225"></a>00225     <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#aaf417ae6bed6da324aa03fc96ee0dda4">Reverse</a>(<span class="keywordtype">int</span> zone, <span class="keywordtype">bool</span> northp, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> x, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> y,
<a name="l00226"></a>00226                         <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; lat, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; lon, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; gamma, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a>&amp; k,
<a name="l00227"></a>00227                         <span class="keywordtype">bool</span> mgrslimits = <span class="keyword">false</span>);
<a name="l00228"></a>00228 <span class="comment"></span>
<a name="l00229"></a>00229 <span class="comment">    /**</span>
<a name="l00230"></a>00230 <span class="comment">     * UTMUPS::Forward without returning convergence and scale.</span>
<a name="l00231"></a>00231 <span class="comment">     **********************************************************************/</span>
<a name="l00232"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#aa21ec1bc26f691e0a6f2ccc44debe6f0">00232</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#a921d6c23e728e0b17651902d43fb56e8">Forward</a>(real lat, real lon,
<a name="l00233"></a>00233                         <span class="keywordtype">int</span>&amp; zone, <span class="keywordtype">bool</span>&amp; northp, real&amp; x, real&amp; y,
<a name="l00234"></a>00234                         <span class="keywordtype">int</span> setzone = <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7adf96495ab4bfbf495f1fe31aebb9e406">STANDARD</a>, <span class="keywordtype">bool</span> mgrslimits = <span class="keyword">false</span>) {
<a name="l00235"></a>00235       real gamma, k;
<a name="l00236"></a>00236       <a class="code" href="classGeographicLib_1_1UTMUPS.html#a921d6c23e728e0b17651902d43fb56e8">Forward</a>(lat, lon, zone, northp, x, y, gamma, k, setzone, mgrslimits);
<a name="l00237"></a>00237     }
<a name="l00238"></a>00238 <span class="comment"></span>
<a name="l00239"></a>00239 <span class="comment">    /**</span>
<a name="l00240"></a>00240 <span class="comment">     * UTMUPS::Reverse without returning convergence and scale.</span>
<a name="l00241"></a>00241 <span class="comment">     **********************************************************************/</span>
<a name="l00242"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#ac8cbfd7b15c96b52b876b54ce68f7b4d">00242</a>     <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#aaf417ae6bed6da324aa03fc96ee0dda4">Reverse</a>(<span class="keywordtype">int</span> zone, <span class="keywordtype">bool</span> northp, real x, real y,
<a name="l00243"></a>00243                         real&amp; lat, real&amp; lon, <span class="keywordtype">bool</span> mgrslimits = <span class="keyword">false</span>) {
<a name="l00244"></a>00244       real gamma, k;
<a name="l00245"></a>00245       <a class="code" href="classGeographicLib_1_1UTMUPS.html#aaf417ae6bed6da324aa03fc96ee0dda4">Reverse</a>(zone, northp, x, y, lat, lon, gamma, k, mgrslimits);
<a name="l00246"></a>00246     }
<a name="l00247"></a>00247 <span class="comment"></span>
<a name="l00248"></a>00248 <span class="comment">    /**</span>
<a name="l00249"></a>00249 <span class="comment">     * Decode a UTM/UPS zone string.</span>
<a name="l00250"></a>00250 <span class="comment">     *</span>
<a name="l00251"></a>00251 <span class="comment">     * @param[in] zonestr string represention of zone and hemisphere.</span>
<a name="l00252"></a>00252 <span class="comment">     * @param[out] zone the UTM zone (zero means UPS).</span>
<a name="l00253"></a>00253 <span class="comment">     * @param[out] northp the hemisphere (true means northern, false</span>
<a name="l00254"></a>00254 <span class="comment">     *   means southern).</span>
<a name="l00255"></a>00255 <span class="comment">     *</span>
<a name="l00256"></a>00256 <span class="comment">     * For UTM, \e zonestr has the form of a zone number in the range</span>
<a name="l00257"></a>00257 <span class="comment">     * [UTMUPS::MINUTMZONE, UTMUPS::MAXUTMZONE] = [1, 60] followed by a</span>
<a name="l00258"></a>00258 <span class="comment">     * hemisphere letter, N or S.  For UPS, it consists just of the hemisphere</span>
<a name="l00259"></a>00259 <span class="comment">     * letter.  The returned value of \e zone is UTMUPS::UPS = 0 for UPS.  Note</span>
<a name="l00260"></a>00260 <span class="comment">     * well that &quot;38S&quot; indicates the southern hemisphere of zone 38 and not</span>
<a name="l00261"></a>00261 <span class="comment">     * latitude band S, [32, 40].  N, 01S, 2N, 38S are legal.  0N, 001S, 61N,</span>
<a name="l00262"></a>00262 <span class="comment">     * 38P are illegal.  INV is a special value for which the returned value of</span>
<a name="l00263"></a>00263 <span class="comment">     * \e is UTMUPS::INVALID.  Throws an error is the zone string is malformed.</span>
<a name="l00264"></a>00264 <span class="comment">     **********************************************************************/</span>
<a name="l00265"></a>00265     <span class="keyword">static</span> <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#ad74d52d7ebeff195019745f791f30562">DecodeZone</a>(<span class="keyword">const</span> std::string&amp; zonestr, <span class="keywordtype">int</span>&amp; zone, <span class="keywordtype">bool</span>&amp; northp);
<a name="l00266"></a>00266 <span class="comment"></span>
<a name="l00267"></a>00267 <span class="comment">    /**</span>
<a name="l00268"></a>00268 <span class="comment">     * Encode a UTM/UPS zone string.</span>
<a name="l00269"></a>00269 <span class="comment">     *</span>
<a name="l00270"></a>00270 <span class="comment">     * @param[out] zone the UTM zone (zero means UPS).</span>
<a name="l00271"></a>00271 <span class="comment">     * @param[out] northp the hemisphere (true means northern, false</span>
<a name="l00272"></a>00272 <span class="comment">     *   means southern).</span>
<a name="l00273"></a>00273 <span class="comment">     * @return string represention of zone and hemisphere.</span>
<a name="l00274"></a>00274 <span class="comment">     *</span>
<a name="l00275"></a>00275 <span class="comment">     * \e zone must be in the range [UTMUPS::MINZONE, UTMUPS::MAXZONE] = [0,</span>
<a name="l00276"></a>00276 <span class="comment">     * 60] with \e zone = UTMUPS::UPS, 0, indicating UPS (but the resulting</span>
<a name="l00277"></a>00277 <span class="comment">     * string does not contain &quot;0&quot;).  \e zone may also be UTMUPS::INVALID, in</span>
<a name="l00278"></a>00278 <span class="comment">     * which case the returned string is &quot;INV&quot;.  This reverses</span>
<a name="l00279"></a>00279 <span class="comment">     * UTMUPS::DecodeZone.</span>
<a name="l00280"></a>00280 <span class="comment">     **********************************************************************/</span>
<a name="l00281"></a>00281     <span class="keyword">static</span> std::string <a class="code" href="classGeographicLib_1_1UTMUPS.html#a3410e1e221158962f34147255653818f">EncodeZone</a>(<span class="keywordtype">int</span> zone, <span class="keywordtype">bool</span> northp);
<a name="l00282"></a>00282 <span class="comment"></span>
<a name="l00283"></a>00283 <span class="comment">    /**</span>
<a name="l00284"></a>00284 <span class="comment">     * @return shift (meters) necessary to align N and S halves of a UTM zone</span>
<a name="l00285"></a>00285 <span class="comment">     * (10&lt;sup&gt;7&lt;/sup&gt;).</span>
<a name="l00286"></a>00286 <span class="comment">     **********************************************************************/</span>
<a name="l00287"></a>00287     <span class="keyword">static</span> <a class="code" href="classGeographicLib_1_1Math.html#aeee4778d7cf2f9fb9648efe4911da59d">Math::real</a> <a class="code" href="classGeographicLib_1_1UTMUPS.html#abd70d3f90f5c79a09bdd217b67e6729b">UTMShift</a>() throw();
<a name="l00288"></a>00288 <span class="comment"></span>
<a name="l00289"></a>00289 <span class="comment">    /** \name Inspector functions</span>
<a name="l00290"></a>00290 <span class="comment">     **********************************************************************/</span><span class="comment"></span>
<a name="l00291"></a>00291 <span class="comment">    ///@{</span>
<a name="l00292"></a>00292 <span class="comment"></span><span class="comment">    /**</span>
<a name="l00293"></a>00293 <span class="comment">     * @return \e a the equatorial radius of the WGS84 ellipsoid (meters).</span>
<a name="l00294"></a>00294 <span class="comment">     *</span>
<a name="l00295"></a>00295 <span class="comment">     * (The WGS84 value is returned because the UTM and UPS projections are</span>
<a name="l00296"></a>00296 <span class="comment">     * based on this ellipsoid.)</span>
<a name="l00297"></a>00297 <span class="comment">     **********************************************************************/</span>
<a name="l00298"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a293aa30508096d49db77a23917ea1092">00298</a>     static <a class="code" href="classGeographicLib_1_1Math.html" title="Mathematical functions needed by GeographicLib.">Math</a>::real <a class="code" href="classGeographicLib_1_1UTMUPS.html#a293aa30508096d49db77a23917ea1092">MajorRadius</a>() throw()
<a name="l00299"></a>00299     { <span class="keywordflow">return</span> Constants::WGS84_a&lt;real&gt;(); }
<a name="l00300"></a>00300 <span class="comment"></span>
<a name="l00301"></a>00301 <span class="comment">    /**</span>
<a name="l00302"></a>00302 <span class="comment">     * @return \e r the inverse flattening of the WGS84 ellipsoid.</span>
<a name="l00303"></a>00303 <span class="comment">     *</span>
<a name="l00304"></a>00304 <span class="comment">     * (The WGS84 value is returned because the UTM and UPS projections are</span>
<a name="l00305"></a>00305 <span class="comment">     * based on this ellipsoid.)</span>
<a name="l00306"></a>00306 <span class="comment">     **********************************************************************/</span>
<a name="l00307"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a3de827995b6327282bfe95fcab99ebb2">00307</a>     <span class="keyword">static</span> <a class="code" href="classGeographicLib_1_1Math.html#aeee4778d7cf2f9fb9648efe4911da59d">Math::real</a> <a class="code" href="classGeographicLib_1_1UTMUPS.html#a3de827995b6327282bfe95fcab99ebb2">InverseFlattening</a>() throw()
<a name="l00308"></a>00308     { <span class="keywordflow">return</span> Constants::WGS84_r&lt;real&gt;(); }<span class="comment"></span>
<a name="l00309"></a>00309 <span class="comment">    ///@}</span>
<a name="l00310"></a>00310 <span class="comment"></span>  };
<a name="l00311"></a>00311 
<a name="l00312"></a>00312 } <span class="comment">// namespace GeographicLib</span>
<a name="l00313"></a>00313 <span class="preprocessor">#endif</span>
</pre></div></div>
</div>
<hr class="footer"/><address class="footer"><small>Generated on Tue Feb 22 2011 for GeographicLib by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.1 </small></address>
</body>
</html>