This file is indexed.

/usr/share/doc/geographiclib/html/UTMUPS_8cpp_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
<!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.cpp 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_b6dff8fdfd5d70bd61ba562840823df9.html">src</a>      </li>
    </ul>
  </div>
</div>
<div class="header">
  <div class="headertitle">
<h1>UTMUPS.cpp</h1>  </div>
</div>
<div class="contents">
<a href="UTMUPS_8cpp.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.cpp</span>
<a name="l00003"></a>00003 <span class="comment"> * \brief Implementation 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) &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">#include &quot;<a class="code" href="UTMUPS_8hpp.html" title="Header for GeographicLib::UTMUPS class.">GeographicLib/UTMUPS.hpp</a>&quot;</span>
<a name="l00011"></a>00011 <span class="preprocessor">#include &quot;<a class="code" href="MGRS_8hpp.html" title="Header for GeographicLib::MGRS class.">GeographicLib/MGRS.hpp</a>&quot;</span>
<a name="l00012"></a>00012 <span class="preprocessor">#include &quot;<a class="code" href="PolarStereographic_8hpp.html" title="Header for GeographicLib::PolarStereographic class.">GeographicLib/PolarStereographic.hpp</a>&quot;</span>
<a name="l00013"></a>00013 <span class="preprocessor">#include &quot;<a class="code" href="TransverseMercator_8hpp.html" title="Header for GeographicLib::TransverseMercator class.">GeographicLib/TransverseMercator.hpp</a>&quot;</span>
<a name="l00014"></a>00014 <span class="preprocessor">#include &lt;iomanip&gt;</span>
<a name="l00015"></a>00015 
<a name="l00016"></a><a class="code" href="UTMUPS_8cpp.html#af7026e1ac5bb37428765d957f2f14a6b">00016</a> <span class="preprocessor">#define GEOGRAPHICLIB_UTMUPS_CPP &quot;$Id: UTMUPS.cpp 6918 2010-12-21 12:56:07Z karney $&quot;</span>
<a name="l00017"></a>00017 <span class="preprocessor"></span>
<a name="l00018"></a>00018 <a class="code" href="Constants_8hpp.html#af90fa899707a2ac513d5e4c76853bbf5">RCSID_DECL</a>(<a class="code" href="UTMUPS_8cpp.html#af7026e1ac5bb37428765d957f2f14a6b">GEOGRAPHICLIB_UTMUPS_CPP</a>)
<a name="l00019"></a>00019 <a class="code" href="Constants_8hpp.html#af90fa899707a2ac513d5e4c76853bbf5">RCSID_DECL</a>(<a class="code" href="UTMUPS_8hpp.html#aab4dce5d203c0d98ae740800332ed9d9">GEOGRAPHICLIB_UTMUPS_HPP</a>)
<a name="l00020"></a>00020 
<a name="l00021"></a>00021 namespace GeographicLib {
<a name="l00022"></a>00022 
<a name="l00023"></a>00023   <span class="keyword">using namespace </span>std;
<a name="l00024"></a>00024 
<a name="l00025"></a>00025   <span class="keyword">const</span> <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">Math::real</a> UTMUPS::falseeasting[4] =
<a name="l00026"></a>00026     { MGRS::upseasting * MGRS::tile, MGRS::upseasting * MGRS::tile,
<a name="l00027"></a>00027       MGRS::utmeasting * MGRS::tile, MGRS::utmeasting* MGRS::tile };
<a name="l00028"></a>00028   <span class="keyword">const</span> <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">Math::real</a> UTMUPS::falsenorthing[4] =
<a name="l00029"></a>00029     { MGRS::upseasting * MGRS::tile, MGRS::upseasting * MGRS::tile,
<a name="l00030"></a>00030       MGRS::maxutmSrow * MGRS::tile, MGRS::minutmNrow * MGRS::tile };
<a name="l00031"></a>00031   <span class="keyword">const</span> <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">Math::real</a> UTMUPS::mineasting[4] =
<a name="l00032"></a>00032     { MGRS::minupsSind * MGRS::tile,  MGRS::minupsNind * MGRS::tile,
<a name="l00033"></a>00033       MGRS::minutmcol * MGRS::tile,  MGRS::minutmcol * MGRS::tile };
<a name="l00034"></a>00034   <span class="keyword">const</span> <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">Math::real</a> UTMUPS::maxeasting[4] =
<a name="l00035"></a>00035     { MGRS::maxupsSind * MGRS::tile,  MGRS::maxupsNind * MGRS::tile,
<a name="l00036"></a>00036       MGRS::maxutmcol * MGRS::tile,  MGRS::maxutmcol * MGRS::tile };
<a name="l00037"></a>00037   <span class="keyword">const</span> <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">Math::real</a> UTMUPS::minnorthing[4] =
<a name="l00038"></a>00038     { MGRS::minupsSind * MGRS::tile,  MGRS::minupsNind * MGRS::tile,
<a name="l00039"></a>00039       MGRS::minutmSrow * MGRS::tile,
<a name="l00040"></a>00040       (MGRS::minutmNrow + MGRS::minutmSrow - MGRS::maxutmSrow) * MGRS::tile };
<a name="l00041"></a>00041   <span class="keyword">const</span> <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">Math::real</a> UTMUPS::maxnorthing[4] =
<a name="l00042"></a>00042     { MGRS::maxupsSind * MGRS::tile,  MGRS::maxupsNind * MGRS::tile,
<a name="l00043"></a>00043       (MGRS::maxutmSrow + MGRS::maxutmNrow - MGRS::minutmNrow) * MGRS::tile,
<a name="l00044"></a>00044       MGRS::maxutmNrow * MGRS::tile };
<a name="l00045"></a>00045 
<a name="l00046"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a62623c295d1b43318a9fa762c3da94ea">00046</a>   <span class="keywordtype">int</span> UTMUPS::StandardZone(real lat, real lon, <span class="keywordtype">int</span> setzone) {
<a name="l00047"></a>00047     <span class="keywordflow">if</span> (setzone &lt; MINPSEUDOZONE || setzone &gt; <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a12dabceb6da15aa0fc94b9406aca921a">MAXZONE</a>)
<a name="l00048"></a>00048       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Illegal zone requested &quot;</span> + str(setzone));
<a name="l00049"></a>00049     <span class="keywordflow">if</span> (setzone &gt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7af91adc987ae7295bfb6d3786b23c58e1">MINZONE</a> || setzone == <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aeb6750fb82edce6e5b58178a38ee8bd0">INVALID</a>)
<a name="l00050"></a>00050       <span class="keywordflow">return</span> setzone;
<a name="l00051"></a>00051     <span class="keywordflow">if</span> (<a class="code" href="classGeographicLib_1_1Math.html#aa63d7a640d1126e47af65f782dd40bca">Math::isnan</a>(lat) || <a class="code" href="classGeographicLib_1_1Math.html#aa63d7a640d1126e47af65f782dd40bca">Math::isnan</a>(lon)) <span class="comment">// Check if lat or lon is a NaN</span>
<a name="l00052"></a>00052       <span class="keywordflow">return</span> INVALID;
<a name="l00053"></a>00053     <span class="comment">// Assume lon is in [-180, 360].</span>
<a name="l00054"></a>00054     <span class="keywordflow">if</span> (setzone == <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aacc8f89ac6144b1e445ca21cbe9a2533">UTM</a> || (lat &gt;= -80 &amp;&amp; lat &lt; 84)) {
<a name="l00055"></a>00055       <span class="comment">// Assume lon is in [-180, 360].</span>
<a name="l00056"></a>00056       <span class="keywordtype">int</span> ilon = int(floor(lon));
<a name="l00057"></a>00057       <span class="keywordflow">if</span> (ilon &gt;= 180)
<a name="l00058"></a>00058         ilon -= 360;
<a name="l00059"></a>00059       <span class="keywordtype">int</span> zone = (ilon + 186)/6;
<a name="l00060"></a>00060       <span class="keywordtype">int</span> band = MGRS::LatitudeBand(lat);
<a name="l00061"></a>00061       <span class="keywordflow">if</span> (band == 7 &amp;&amp; zone == 31 &amp;&amp; ilon &gt;= 3)
<a name="l00062"></a>00062         zone = 32;
<a name="l00063"></a>00063       <span class="keywordflow">else</span> <span class="keywordflow">if</span> (band == 9 &amp;&amp; ilon &gt;= 0 &amp;&amp; ilon &lt; 42)
<a name="l00064"></a>00064         zone = 2 * ((ilon + 183)/12) + 1;
<a name="l00065"></a>00065       <span class="keywordflow">return</span> zone;
<a name="l00066"></a>00066     } <span class="keywordflow">else</span>
<a name="l00067"></a>00067       <span class="keywordflow">return</span> UPS;
<a name="l00068"></a>00068   }
<a name="l00069"></a>00069 
<a name="l00070"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a921d6c23e728e0b17651902d43fb56e8">00070</a>   <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#a921d6c23e728e0b17651902d43fb56e8">UTMUPS::Forward</a>(real lat, real lon,
<a name="l00071"></a>00071                        <span class="keywordtype">int</span>&amp; zone, <span class="keywordtype">bool</span>&amp; northp, real&amp; x, real&amp; y,
<a name="l00072"></a>00072                        real&amp; gamma, real&amp; k,
<a name="l00073"></a>00073                        <span class="keywordtype">int</span> setzone, <span class="keywordtype">bool</span> mgrslimits) {
<a name="l00074"></a>00074     CheckLatLon(lat, lon);
<a name="l00075"></a>00075     <span class="keywordtype">bool</span> northp1 = lat &gt;= 0;
<a name="l00076"></a>00076     <span class="keywordtype">int</span> zone1 = <a class="code" href="classGeographicLib_1_1UTMUPS.html#a62623c295d1b43318a9fa762c3da94ea">StandardZone</a>(lat, lon, setzone);
<a name="l00077"></a>00077     <span class="keywordflow">if</span> (zone1 == <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aeb6750fb82edce6e5b58178a38ee8bd0">INVALID</a>) {
<a name="l00078"></a>00078       zone = zone1;
<a name="l00079"></a>00079       northp = northp1;
<a name="l00080"></a>00080       x = y = gamma = k = <a class="code" href="classGeographicLib_1_1Math.html#a77c57c61f93d7ac3f6a5095489c36715">Math::NaN</a>();
<a name="l00081"></a>00081       <span class="keywordflow">return</span>;
<a name="l00082"></a>00082     }
<a name="l00083"></a>00083     real x1, y1, gamma1, k1;
<a name="l00084"></a>00084     <span class="keywordtype">bool</span> utmp = zone1 != UPS;
<a name="l00085"></a>00085     <span class="keywordflow">if</span> (utmp) {
<a name="l00086"></a>00086       real
<a name="l00087"></a>00087         lon0 = CentralMeridian(zone1),
<a name="l00088"></a>00088         dlon = lon - lon0;
<a name="l00089"></a>00089       dlon = abs(dlon - 360 * floor((dlon + 180)/360));
<a name="l00090"></a>00090       <span class="keywordflow">if</span> (dlon &gt; 60)
<a name="l00091"></a>00091         <span class="comment">// Check isn&#39;t really necessary because CheckCoords catches this case.</span>
<a name="l00092"></a>00092         <span class="comment">// But this allows a more meaningful error message to be given.</span>
<a name="l00093"></a>00093         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Longitude &quot;</span> + str(lon)
<a name="l00094"></a>00094                             + <span class="stringliteral">&quot;d more than 60d from center of UTM zone &quot;</span>
<a name="l00095"></a>00095                             + str(zone1));
<a name="l00096"></a>00096       <a class="code" href="classGeographicLib_1_1TransverseMercator.html#aa25b52e35bc54c368e6c8b17e02b0542">TransverseMercator::UTM</a>.<a class="code" href="classGeographicLib_1_1TransverseMercator.html#a07d73a6d94e2434cbb937978d61a5ae7">Forward</a>(lon0, lat, lon, x1, y1, gamma1, k1);
<a name="l00097"></a>00097     } <span class="keywordflow">else</span> {
<a name="l00098"></a>00098       <span class="keywordflow">if</span> (abs(lat) &lt; 70)
<a name="l00099"></a>00099         <span class="comment">// Check isn&#39;t really necessary ... (see above).</span>
<a name="l00100"></a>00100         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Latitude &quot;</span> + str(lat) + <span class="stringliteral">&quot;d more than 20d from &quot;</span>
<a name="l00101"></a>00101                             + (northp1 ? <span class="stringliteral">&quot;N&quot;</span> : <span class="stringliteral">&quot;S&quot;</span>) + <span class="stringliteral">&quot; pole&quot;</span>);
<a name="l00102"></a>00102       <a class="code" href="classGeographicLib_1_1PolarStereographic.html#a2db6bcb1b59a6ddc6087ee04c64c9825">PolarStereographic::UPS</a>.<a class="code" href="classGeographicLib_1_1PolarStereographic.html#a30ef1a1f906ee389e2a5f7e5fd7d8fa4">Forward</a>(northp1, lat, lon, x1, y1, gamma1, k1);
<a name="l00103"></a>00103     }
<a name="l00104"></a>00104     <span class="keywordtype">int</span> ind = (utmp ? 2 : 0) + (northp1 ? 1 : 0);
<a name="l00105"></a>00105     x1 += falseeasting[ind];
<a name="l00106"></a>00106     y1 += falsenorthing[ind];
<a name="l00107"></a>00107     <span class="keywordflow">if</span> (! CheckCoords(zone1 != <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a40256f9ab9f277957f8ab697bcd2fd42">UPS</a>, northp1, x1, y1, mgrslimits, <span class="keyword">false</span>) )
<a name="l00108"></a>00108       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Latitude &quot;</span> + str(lat) + <span class="stringliteral">&quot;, longitude &quot;</span> + str(lon)
<a name="l00109"></a>00109                           + <span class="stringliteral">&quot; out of legal range for &quot;</span>
<a name="l00110"></a>00110                           + (utmp ? <span class="stringliteral">&quot;UTM zone &quot;</span> + str(zone1) : <span class="stringliteral">&quot;UPS&quot;</span>));
<a name="l00111"></a>00111     zone = zone1;
<a name="l00112"></a>00112     northp = northp1;
<a name="l00113"></a>00113     x = x1;
<a name="l00114"></a>00114     y = y1;
<a name="l00115"></a>00115     gamma = gamma1;
<a name="l00116"></a>00116     k = k1;
<a name="l00117"></a>00117   }
<a name="l00118"></a>00118 
<a name="l00119"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#aaf417ae6bed6da324aa03fc96ee0dda4">00119</a>   <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#aaf417ae6bed6da324aa03fc96ee0dda4">UTMUPS::Reverse</a>(<span class="keywordtype">int</span> zone, <span class="keywordtype">bool</span> northp, real x, real y,
<a name="l00120"></a>00120                        real&amp; lat, real&amp; lon, real&amp; gamma, real&amp; k,
<a name="l00121"></a>00121                        <span class="keywordtype">bool</span> mgrslimits) {
<a name="l00122"></a>00122     <span class="keywordflow">if</span> (zone == <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aeb6750fb82edce6e5b58178a38ee8bd0">INVALID</a> || <a class="code" href="classGeographicLib_1_1Math.html#aa63d7a640d1126e47af65f782dd40bca">Math::isnan</a>(x) || <a class="code" href="classGeographicLib_1_1Math.html#aa63d7a640d1126e47af65f782dd40bca">Math::isnan</a>(y)) {
<a name="l00123"></a>00123       lat = lon = gamma = k = <a class="code" href="classGeographicLib_1_1Math.html#a77c57c61f93d7ac3f6a5095489c36715">Math::NaN</a>();
<a name="l00124"></a>00124       <span class="keywordflow">return</span>;
<a name="l00125"></a>00125     }
<a name="l00126"></a>00126     <span class="keywordflow">if</span> (! (zone &gt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7af91adc987ae7295bfb6d3786b23c58e1">MINZONE</a> &amp;&amp; zone &lt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a12dabceb6da15aa0fc94b9406aca921a">MAXZONE</a>))
<a name="l00127"></a>00127       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Zone &quot;</span> + str(zone) + <span class="stringliteral">&quot; not in range [0, 60]&quot;</span>);
<a name="l00128"></a>00128     <span class="keywordtype">bool</span> utmp = zone != UPS;
<a name="l00129"></a>00129     CheckCoords(utmp, northp, x, y, mgrslimits);
<a name="l00130"></a>00130     <span class="keywordtype">int</span> ind = (utmp ? 2 : 0) + (northp ? 1 : 0);
<a name="l00131"></a>00131     x -= falseeasting[ind];
<a name="l00132"></a>00132     y -= falsenorthing[ind];
<a name="l00133"></a>00133     <span class="keywordflow">if</span> (utmp)
<a name="l00134"></a>00134       <a class="code" href="classGeographicLib_1_1TransverseMercator.html#aa25b52e35bc54c368e6c8b17e02b0542">TransverseMercator::UTM</a>.<a class="code" href="classGeographicLib_1_1TransverseMercator.html#a15611aee4e3707e155278bab02403a07">Reverse</a>(CentralMeridian(zone),
<a name="l00135"></a>00135                                       x, y, lat, lon, gamma, k);
<a name="l00136"></a>00136     <span class="keywordflow">else</span>
<a name="l00137"></a>00137       <a class="code" href="classGeographicLib_1_1PolarStereographic.html#a2db6bcb1b59a6ddc6087ee04c64c9825">PolarStereographic::UPS</a>.<a class="code" href="classGeographicLib_1_1PolarStereographic.html#a01302b8dba43c57e3c3849f94123a157">Reverse</a>(northp, x, y, lat, lon, gamma, k);
<a name="l00138"></a>00138   }
<a name="l00139"></a>00139 
<a name="l00140"></a>00140   <span class="keywordtype">void</span> UTMUPS::CheckLatLon(<a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> lat, <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> lon) {
<a name="l00141"></a>00141     <span class="keywordflow">if</span> (lat &lt; -90 || lat &gt; 90)
<a name="l00142"></a>00142       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Latitude &quot;</span> + str(lat) + <span class="stringliteral">&quot;d not in [-90d, 90d]&quot;</span>);
<a name="l00143"></a>00143     <span class="keywordflow">if</span> (lon &lt; -180 || lon &gt; 360)
<a name="l00144"></a>00144       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Latitude &quot;</span> + str(lon) + <span class="stringliteral">&quot;d not in [-180d, 360d]&quot;</span>);
<a name="l00145"></a>00145     }
<a name="l00146"></a>00146 
<a name="l00147"></a>00147   <span class="keywordtype">bool</span> UTMUPS::CheckCoords(<span class="keywordtype">bool</span> utmp, <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="l00148"></a>00148                            <span class="keywordtype">bool</span> mgrslimits, <span class="keywordtype">bool</span> throwp) {
<a name="l00149"></a>00149     <span class="comment">// Limits are all multiples of 100km and are all closed on the both ends.</span>
<a name="l00150"></a>00150     <span class="comment">// Failure tests are such that NaNs succeed.</span>
<a name="l00151"></a>00151     <a class="code" href="Geod_8cpp.html#a5caf95d46b184d9ca1d3764b3781b3c9">real</a> slop = mgrslimits ? 0 : MGRS::tile;
<a name="l00152"></a>00152     <span class="keywordtype">int</span> ind = (utmp ? 2 : 0) + (northp ? 1 : 0);
<a name="l00153"></a>00153     <span class="keywordflow">if</span> (x &lt; mineasting[ind] - slop || x &gt; maxeasting[ind] + slop) {
<a name="l00154"></a>00154       <span class="keywordflow">if</span> (!throwp) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00155"></a>00155       <span class="keywordflow">throw</span> GeographicErr(<span class="stringliteral">&quot;Easting &quot;</span> + str(x/1000) + <span class="stringliteral">&quot;km not in &quot;</span>
<a name="l00156"></a>00156                           + (mgrslimits ? <span class="stringliteral">&quot;MGRS/&quot;</span> : <span class="stringliteral">&quot;&quot;</span>)
<a name="l00157"></a>00157                           + (utmp ? <span class="stringliteral">&quot;UTM&quot;</span> : <span class="stringliteral">&quot;UPS&quot;</span>) + <span class="stringliteral">&quot; range for &quot;</span>
<a name="l00158"></a>00158                           + (northp ? <span class="stringliteral">&quot;N&quot;</span> : <span class="stringliteral">&quot;S&quot;</span> ) + <span class="stringliteral">&quot; hemisphere [&quot;</span>
<a name="l00159"></a>00159                           + str((mineasting[ind] - slop)/1000) + <span class="stringliteral">&quot;km, &quot;</span>
<a name="l00160"></a>00160                           + str((maxeasting[ind] + slop)/1000) + <span class="stringliteral">&quot;km]&quot;</span>);
<a name="l00161"></a>00161     }
<a name="l00162"></a>00162     <span class="keywordflow">if</span> (y &lt; minnorthing[ind] - slop || y &gt; maxnorthing[ind] + slop) {
<a name="l00163"></a>00163       <span class="keywordflow">if</span> (!throwp) <span class="keywordflow">return</span> <span class="keyword">false</span>;
<a name="l00164"></a>00164       <span class="keywordflow">throw</span> GeographicErr(<span class="stringliteral">&quot;Northing &quot;</span> + str(y/1000) + <span class="stringliteral">&quot;km not in &quot;</span>
<a name="l00165"></a>00165                           + (mgrslimits ? <span class="stringliteral">&quot;MGRS/&quot;</span> : <span class="stringliteral">&quot;&quot;</span>)
<a name="l00166"></a>00166                           + (utmp ? <span class="stringliteral">&quot;UTM&quot;</span> : <span class="stringliteral">&quot;UPS&quot;</span>) + <span class="stringliteral">&quot; range for &quot;</span>
<a name="l00167"></a>00167                           + (northp ? <span class="stringliteral">&quot;N&quot;</span> : <span class="stringliteral">&quot;S&quot;</span> ) + <span class="stringliteral">&quot; hemisphere [&quot;</span>
<a name="l00168"></a>00168                           + str((minnorthing[ind] - slop)/1000) + <span class="stringliteral">&quot;km, &quot;</span>
<a name="l00169"></a>00169                           + str((maxnorthing[ind] + slop)/1000) + <span class="stringliteral">&quot;km]&quot;</span>);
<a name="l00170"></a>00170     }
<a name="l00171"></a>00171     <span class="keywordflow">return</span> <span class="keyword">true</span>;
<a name="l00172"></a>00172   }
<a name="l00173"></a>00173 
<a name="l00174"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#ad74d52d7ebeff195019745f791f30562">00174</a>   <span class="keywordtype">void</span> <a class="code" href="classGeographicLib_1_1UTMUPS.html#ad74d52d7ebeff195019745f791f30562">UTMUPS::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="l00175"></a>00175     <span class="keywordtype">unsigned</span> zlen = unsigned(zonestr.size());
<a name="l00176"></a>00176     <span class="keywordflow">if</span> (zlen == 0)
<a name="l00177"></a>00177       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Empty zone specification&quot;</span>);
<a name="l00178"></a>00178     <span class="keywordflow">if</span> (zlen &gt; 3)
<a name="l00179"></a>00179       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;More than 3 characters in zone specification &quot;</span>
<a name="l00180"></a>00180                           + zonestr);
<a name="l00181"></a>00181     <span class="keywordflow">if</span> (zlen == 3 &amp;&amp;
<a name="l00182"></a>00182         toupper(zonestr[0]) == <span class="charliteral">&#39;I&#39;</span> &amp;&amp;
<a name="l00183"></a>00183         toupper(zonestr[1]) == <span class="charliteral">&#39;N&#39;</span> &amp;&amp;
<a name="l00184"></a>00184         toupper(zonestr[2]) == <span class="charliteral">&#39;V&#39;</span>) {
<a name="l00185"></a>00185       zone = INVALID;
<a name="l00186"></a>00186       northp = <span class="keyword">false</span>;
<a name="l00187"></a>00187       <span class="keywordflow">return</span>;
<a name="l00188"></a>00188     }
<a name="l00189"></a>00189     <span class="keywordtype">char</span> hemi = toupper(zonestr[zlen - 1]);
<a name="l00190"></a>00190     <span class="keywordtype">bool</span> northp1 = hemi == <span class="charliteral">&#39;N&#39;</span>;
<a name="l00191"></a>00191     <span class="keywordflow">if</span> (! (northp1 || hemi == <span class="charliteral">&#39;S&#39;</span>))
<a name="l00192"></a>00192       <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="keywordtype">string</span>(<span class="stringliteral">&quot;Illegal hemisphere letter &quot;</span>) + hemi + <span class="stringliteral">&quot; in &quot;</span>
<a name="l00193"></a>00193                           + zonestr + <span class="stringliteral">&quot;, specify N or S&quot;</span>);
<a name="l00194"></a>00194     <span class="keywordflow">if</span> (zlen == 1)
<a name="l00195"></a>00195       zone = UPS;
<a name="l00196"></a>00196     <span class="keywordflow">else</span> {
<a name="l00197"></a>00197       <span class="keyword">const</span> <span class="keywordtype">char</span>* c = zonestr.c_str();
<a name="l00198"></a>00198       <span class="keywordtype">char</span>* q;
<a name="l00199"></a>00199       <span class="keywordtype">int</span> zone1 = strtol(c, &amp;q, 10);
<a name="l00200"></a>00200       <span class="keywordflow">if</span> (q == c)
<a name="l00201"></a>00201         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;No zone number found in &quot;</span> + zonestr);
<a name="l00202"></a>00202       <span class="keywordflow">if</span> (q - c != <span class="keywordtype">int</span>(zlen) - 1)
<a name="l00203"></a>00203         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Extra text &quot;</span> +
<a name="l00204"></a>00204                             zonestr.substr(q - c, <span class="keywordtype">int</span>(zlen) - 1 - (q - c)) +
<a name="l00205"></a>00205                             <span class="stringliteral">&quot; in UTM/UPS zone &quot;</span> + zonestr);
<a name="l00206"></a>00206       <span class="keywordflow">if</span> (zone1 == <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a40256f9ab9f277957f8ab697bcd2fd42">UPS</a>)
<a name="l00207"></a>00207         <span class="comment">// Don&#39;t allow 0N as an alternative to N for UPS coordinates</span>
<a name="l00208"></a>00208         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Illegal zone 0 in &quot;</span> + zonestr +
<a name="l00209"></a>00209                             <span class="stringliteral">&quot;, use just &quot;</span> + hemi + <span class="stringliteral">&quot; for UPS&quot;</span>);
<a name="l00210"></a>00210       <span class="keywordflow">if</span> (!(zone1 &gt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a1413e6cc83d4bf1eb4ad1c0f1d745eb6">MINUTMZONE</a> &amp;&amp; zone1 &lt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7ae8e04ab8df50a062c1fe277a6880bc19">MAXUTMZONE</a>))
<a name="l00211"></a>00211         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Zone &quot;</span> + str(zone1) + <span class="stringliteral">&quot; not in range [1, 60]&quot;</span>);
<a name="l00212"></a>00212       zone = zone1;
<a name="l00213"></a>00213     }
<a name="l00214"></a>00214     northp = northp1;
<a name="l00215"></a>00215   }
<a name="l00216"></a>00216 
<a name="l00217"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#a3410e1e221158962f34147255653818f">00217</a>   std::string <a class="code" href="classGeographicLib_1_1UTMUPS.html#a3410e1e221158962f34147255653818f">UTMUPS::EncodeZone</a>(<span class="keywordtype">int</span> zone, <span class="keywordtype">bool</span> northp) {
<a name="l00218"></a>00218     <span class="keywordflow">if</span> (zone == <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7aeb6750fb82edce6e5b58178a38ee8bd0">INVALID</a>)
<a name="l00219"></a>00219       <span class="keywordflow">return</span> string(<span class="stringliteral">&quot;INV&quot;</span>);
<a name="l00220"></a>00220     <span class="keywordflow">if</span> (! (zone &gt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7af91adc987ae7295bfb6d3786b23c58e1">MINZONE</a> &amp;&amp; zone &lt;= <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a12dabceb6da15aa0fc94b9406aca921a">MAXZONE</a>))
<a name="l00221"></a>00221         <span class="keywordflow">throw</span> <a class="code" href="classGeographicLib_1_1GeographicErr.html" title="Exception handling for GeographicLib">GeographicErr</a>(<span class="stringliteral">&quot;Zone &quot;</span> + str(zone) + <span class="stringliteral">&quot; not in range [0, 60]&quot;</span>);
<a name="l00222"></a>00222     ostringstream os;
<a name="l00223"></a>00223     <span class="keywordflow">if</span> (zone != <a class="code" href="classGeographicLib_1_1UTMUPS.html#a0c459615da18cc899a960bdc8c5b11b7a40256f9ab9f277957f8ab697bcd2fd42">UPS</a>)
<a name="l00224"></a>00224       os &lt;&lt; setfill(<span class="charliteral">&#39;0&#39;</span>) &lt;&lt; setw(2) &lt;&lt; zone;
<a name="l00225"></a>00225     os &lt;&lt; (northp ? <span class="charliteral">&#39;N&#39;</span> : <span class="charliteral">&#39;S&#39;</span>);
<a name="l00226"></a>00226     <span class="keywordflow">return</span> os.str();
<a name="l00227"></a>00227   }
<a name="l00228"></a>00228 
<a name="l00229"></a><a class="code" href="classGeographicLib_1_1UTMUPS.html#abd70d3f90f5c79a09bdd217b67e6729b">00229</a>   <a class="code" href="classGeographicLib_1_1Math.html#aeee4778d7cf2f9fb9648efe4911da59d">Math::real</a> <a class="code" href="classGeographicLib_1_1UTMUPS.html#abd70d3f90f5c79a09bdd217b67e6729b">UTMUPS::UTMShift</a>() throw() { <span class="keywordflow">return</span> real(MGRS::utmNshift); }
<a name="l00230"></a>00230 
<a name="l00231"></a>00231 } <span class="comment">// namespace GeographicLib</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>