aboutsummaryrefslogtreecommitdiff
path: root/development/quickstart.html
blob: 3bc120b1bfe0e9aea224ee50cdcc2892201600b8 (plain)
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
360
<!DOCTYPE html>
<html class="writer-html5" lang="en" >
<head>
  <meta charset="utf-8" /><meta name="generator" content="Docutils 0.17.1: http://docutils.sourceforge.net/" />

  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Quick start &mdash; PROJ 9.0.0 documentation</title>
      <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
      <link rel="stylesheet" href="../_static/css/theme.css" type="text/css" />
    <link rel="shortcut icon" href="../_static/favicon.png"/>
    <link rel="canonical" href="https://proj.orgdevelopment/quickstart.html"/>
  <!--[if lt IE 9]>
    <script src="../_static/js/html5shiv.min.js"></script>
  <![endif]-->
  
        <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
        <script src="../_static/jquery.js"></script>
        <script src="../_static/underscore.js"></script>
        <script src="../_static/doctools.js"></script>
    <script src="../_static/js/theme.js"></script>
    <link rel="author" title="About these documents" href="../about.html" />
    <link rel="index" title="Index" href="../genindex.html" />
    <link rel="search" title="Search" href="../search.html" />
    <link rel="next" title="Transformations" href="transformations.html" />
    <link rel="prev" title="Development" href="index.html" /> 
</head>

<body class="wy-body-for-nav"> 
  <div class="wy-grid-for-nav">
    <nav data-toggle="wy-nav-shift" class="wy-nav-side">
      <div class="wy-side-scroll">
        <div class="wy-side-nav-search"  style="background: #353130" >
            <a href="../index.html">
            <img src="../_static/logo.png" class="logo" alt="Logo"/>
          </a>
              <div class="version">
                9.0.0
              </div>
<div role="search">
  <form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
    <input type="text" name="q" placeholder="Search docs" />
    <input type="hidden" name="check_keywords" value="yes" />
    <input type="hidden" name="area" value="default" />
  </form>
</div>
        </div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
              <ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../about.html">About</a></li>
<li class="toctree-l1"><a class="reference internal" href="../news.html">News</a></li>
<li class="toctree-l1"><a class="reference internal" href="../download.html">Download</a></li>
<li class="toctree-l1"><a class="reference internal" href="../install.html">Installation</a></li>
<li class="toctree-l1"><a class="reference internal" href="../usage/index.html">Using PROJ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../apps/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../operations/index.html">Coordinate operations</a></li>
<li class="toctree-l1"><a class="reference internal" href="../resource_files.html">Resource files</a></li>
<li class="toctree-l1"><a class="reference internal" href="../geodesic.html">Geodesic calculations</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Development</a><ul class="current">
<li class="toctree-l2 current"><a class="current reference internal" href="#">Quick start</a></li>
<li class="toctree-l2"><a class="reference internal" href="transformations.html">Transformations</a></li>
<li class="toctree-l2"><a class="reference internal" href="errorhandling.html">Error handling</a></li>
<li class="toctree-l2"><a class="reference internal" href="reference/index.html">Reference</a></li>
<li class="toctree-l2"><a class="reference internal" href="cmake.html">Using PROJ in CMake projects</a></li>
<li class="toctree-l2"><a class="reference internal" href="bindings.html">Language bindings</a></li>
<li class="toctree-l2"><a class="reference internal" href="migration.html">Version 4 to 6 API Migration</a></li>
<li class="toctree-l2"><a class="reference internal" href="migration.html#version-4-to-5-api-migration">Version 4 to 5 API Migration</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../specifications/index.html">Specifications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../community/index.html">Community</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq.html">FAQ</a></li>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../zreferences.html">References</a></li>
</ul>

        </div>
      </div>
    </nav>

    <section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu"  style="background: #353130" >
          <i data-toggle="wy-nav-top" class="fa fa-bars"></i>
          <a href="../index.html">PROJ</a>
      </nav>

      <div class="wy-nav-content">
        <div class="rst-content">
          <div role="navigation" aria-label="Page navigation">
  <ul class="wy-breadcrumbs">
      <li><a href="../index.html" class="icon icon-home"></a> &raquo;</li>
          <li><a href="index.html">Development</a> &raquo;</li>
      <li>Quick start</li>
      <li class="wy-breadcrumbs-aside">
              <a href="https://github.com/OSGeo/PROJ/edit/8.2/docs/source/development/quickstart.rst" class="fa fa-github"> Edit on GitHub</a>
      </li>
  </ul><div class="rst-breadcrumbs-buttons" role="navigation" aria-label="Sequential page navigation">
        <a href="index.html" class="btn btn-neutral float-left" title="Development" accesskey="p"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="transformations.html" class="btn btn-neutral float-right" title="Transformations" accesskey="n">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
  </div>
  <hr/>
</div>
          <div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
           <div itemprop="articleBody">
             
  <section id="quick-start">
<span id="dev-quickstart"></span><h1>Quick start<a class="headerlink" href="#quick-start" title="Permalink to this headline">¶</a></h1>
<p>This is a short introduction to the PROJ API. In the following section we
create a simple program that transforms a geodetic coordinate to UTM and back
again. The program is explained a few lines at a time. The complete program can
be seen at the end of the section.</p>
<p>See the following sections for more in-depth descriptions of different parts of
the PROJ API or consult the <a class="reference internal" href="reference/index.html"><span class="doc">API reference</span></a> for specifics.</p>
<p>Before the PROJ API can be used it is necessary to include the <code class="file docutils literal notranslate"><span class="pre">proj.h</span></code> header
file. Here <code class="file docutils literal notranslate"><span class="pre">stdio.h</span></code> is also included so we can print some text to the screen:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;proj.h&gt;</span><span class="cp"></span>
</pre></div>
</div>
<p>Let’s declare a few variables that’ll be used later in the program. Each variable
will be discussed below.
See the <a class="reference internal" href="reference/datatypes.html"><span class="doc">reference for more info on data types</span></a>.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">PJ_CONTEXT</span><span class="w"> </span><span class="o">*</span><span class="n">C</span><span class="p">;</span><span class="w"></span>
<span class="n">PJ</span><span class="w"> </span><span class="o">*</span><span class="n">P</span><span class="p">;</span><span class="w"></span>
<span class="n">PJ</span><span class="w"> </span><span class="o">*</span><span class="n">norm</span><span class="p">;</span><span class="w"></span>
<span class="n">PJ_COORD</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span><span class="w"></span>
</pre></div>
</div>
<p>For use in multi-threaded programs the <a class="reference internal" href="reference/datatypes.html#c.PJ_CONTEXT" title="PJ_CONTEXT"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ_CONTEXT</span></code></a> threading-context
is used.  In this particular example it is not needed, but for the sake of
completeness we demonstrate its use here.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">C</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_context_create</span><span class="p">();</span><span class="w"></span>
</pre></div>
</div>
<p>Next we create the <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a> transformation object <code class="docutils literal notranslate"><span class="pre">P</span></code> with the function
<a class="reference internal" href="reference/functions.html#c.proj_create_crs_to_crs" title="proj_create_crs_to_crs"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_create_crs_to_crs()</span></code></a>.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">P</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_create_crs_to_crs</span><span class="w"> </span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="w"></span>
<span class="w">                            </span><span class="s">&quot;EPSG:4326&quot;</span><span class="p">,</span><span class="w"></span>
<span class="w">                            </span><span class="s">&quot;+proj=utm +zone=32 +datum=WGS84&quot;</span><span class="p">,</span><span class="w"> </span><span class="cm">/* or EPSG:32632 */</span><span class="w"></span>
<span class="w">                            </span><span class="nb">NULL</span><span class="p">);</span><span class="w"></span>

<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">P</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">    </span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Failed to create transformation object.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span><span class="w"></span>
<span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
</pre></div>
</div>
<p>Here we have set up a transformation from geographic coordinates to UTM zone
32N.</p>
<p><a class="reference internal" href="reference/functions.html#c.proj_create_crs_to_crs" title="proj_create_crs_to_crs"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_create_crs_to_crs()</span></code></a> takes as its arguments:</p>
<ul class="simple">
<li><p>the threading context <code class="docutils literal notranslate"><span class="pre">C</span></code> created above,</p></li>
<li><p>a string that describes the source coordinate reference system (CRS),</p></li>
<li><p>a string that describes the target CRS and</p></li>
<li><p>an optional description of the area of use.</p></li>
</ul>
<p>It is recommended to create one threading context per thread used by the
program.  This ensures that all <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a> objects created in the same
context will be sharing resources such as error-numbers and loaded grids.</p>
<p>If you are sure that <code class="docutils literal notranslate"><span class="pre">P</span></code> will only be used by a single program thread, you
may pass <code class="docutils literal notranslate"><span class="pre">NULL</span></code> for the threading context.  This will assign the default
thread context to <code class="docutils literal notranslate"><span class="pre">P</span></code>.</p>
<p>The strings for the source and target CRS may be any of:</p>
<ul class="simple">
<li><p>PROJ strings, e.g. <code class="docutils literal notranslate"><span class="pre">+proj=longlat</span> <span class="pre">+datum=WGS84</span> <span class="pre">+type=crs</span></code>,</p></li>
<li><p>CRS identified by their code, e.g. <code class="docutils literal notranslate"><span class="pre">EPSG:4326</span></code> or
<code class="docutils literal notranslate"><span class="pre">urn:ogc:def:crs:EPSG::4326</span></code>, or</p></li>
<li><p>a well-known text (WKT) string, e.g.:</p></li>
</ul>
<div class="highlight-none notranslate"><div class="highlight"><pre><span></span>GEOGCRS[&quot;WGS 84&quot;,
    DATUM[&quot;World Geodetic System 1984&quot;,
        ELLIPSOID[&quot;WGS 84&quot;,6378137,298.257223563,
            LENGTHUNIT[&quot;metre&quot;,1]]],
    PRIMEM[&quot;Greenwich&quot;,0,
        ANGLEUNIT[&quot;degree&quot;,0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS[&quot;geodetic latitude (Lat)&quot;,north,
            ORDER[1],
            ANGLEUNIT[&quot;degree&quot;,0.0174532925199433]],
        AXIS[&quot;geodetic longitude (Lon)&quot;,east,
            ORDER[2],
            ANGLEUNIT[&quot;degree&quot;,0.0174532925199433]],
    USAGE[
        SCOPE[&quot;unknown&quot;],
        AREA[&quot;World&quot;],
        BBOX[-90,-180,90,180]],
    ID[&quot;EPSG&quot;,4326]]
</pre></div>
</div>
<div class="admonition warning">
<p class="admonition-title">Warning</p>
<p>The use of PROJ strings to describe a CRS is not recommended.  One of the
main weaknesses of PROJ strings is their inability to describe a geodetic
datum, other than the few ones hardcoded in the <code class="docutils literal notranslate"><span class="pre">+datum</span></code> parameter.</p>
</div>
<p><a class="reference internal" href="reference/functions.html#c.proj_create_crs_to_crs" title="proj_create_crs_to_crs"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_create_crs_to_crs()</span></code></a> will return a pointer to a <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a>
object, or a null pointer in the case of an error.  The details of the error
can be retrieved using <a class="reference internal" href="reference/functions.html#c.proj_context_errno" title="proj_context_errno"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_context_errno()</span></code></a>. See <a class="reference internal" href="errorhandling.html"><span class="doc">Error handling</span></a>
for further details.</p>
<p>Now that we have a normalized transformation object in <code class="docutils literal notranslate"><span class="pre">P</span></code>, we can use it
with <a class="reference internal" href="reference/functions.html#c.proj_trans" title="proj_trans"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_trans()</span></code></a> to transform coordinates from the source CRS to the
target CRS, but first we will discuss the interpretation of coordinates.</p>
<p>By default, a <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a> transformation object accepts coordinates expressed
in the units and axis order of the source CRS, and returns transformed
coordinates in the units and axis order of the target CRS.</p>
<p>For most geographic CRS, the units will be in degrees.  In rare cases, such as
EPSG:4807 / NTF (Paris), this can be grads. For geographic CRS defined by the
EPSG authority, the order of coordinates is latitude first, longitude second.
When using a PROJ string, the order is the reverse; longitude first, latitude
second.</p>
<p>For projected CRS, the units may vary (metre, us-foot, etc.). For projected CRS
defined by the EPSG authority, and with EAST / NORTH directions, the order
might be easting first, northing second, or the reverse.  When using a PROJ
string, the order will be easting first, northing second, except if the
<code class="docutils literal notranslate"><span class="pre">+axis</span></code> parameter modifies it.</p>
<p>If you prefer to work with a uniform axis order, regardless of the axis orders
mandated by the source and target CRS, you can use the
<a class="reference internal" href="reference/functions.html#c.proj_normalize_for_visualization" title="proj_normalize_for_visualization"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_normalize_for_visualization()</span></code></a> function.</p>
<p><a class="reference internal" href="reference/functions.html#c.proj_normalize_for_visualization" title="proj_normalize_for_visualization"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_normalize_for_visualization()</span></code></a> takes a threading context and an
existing <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a> object, and generates from it a new <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a> that
accepts as input and returns as output coordinates using the traditional GIS
order.  That is, longitude followed by latitude, optionally followed by
elevation and time for geographic CRS, and easting followed by northing for
most projected CRS.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">norm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_normalize_for_visualization</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="w"> </span><span class="n">P</span><span class="p">);</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">norm</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="w">    </span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Failed to normalize transformation object.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span><span class="w"></span>
<span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"></span>
<span class="p">}</span><span class="w"></span>
<span class="n">proj_destroy</span><span class="p">(</span><span class="n">P</span><span class="p">);</span><span class="w"></span>
<span class="n">P</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">norm</span><span class="p">;</span><span class="w"></span>
</pre></div>
</div>
<p>Next we create a <a class="reference internal" href="reference/datatypes.html#c.PJ_COORD" title="PJ_COORD"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ_COORD</span></code></a> coordinate object, using the function
<a class="reference internal" href="reference/functions.html#c.proj_coord" title="proj_coord"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_coord()</span></code></a>.</p>
<p>The following example creates a coordinate for 55°N 12°E (Copenhagen).</p>
<p>Because we have normalized the transformation object with
<a class="reference internal" href="reference/functions.html#c.proj_normalize_for_visualization" title="proj_normalize_for_visualization"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_normalize_for_visualization()</span></code></a>, the order of coordinates is
longitude followed by latitude, and the units are degrees.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_coord</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="w"> </span><span class="mi">55</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span><span class="w"></span>
</pre></div>
</div>
<p>Now we are ready to transform the coordinate into UTM zone 32, using the
function <a class="reference internal" href="reference/functions.html#c.proj_trans" title="proj_trans"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_trans()</span></code></a>.</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_trans</span><span class="p">(</span><span class="n">P</span><span class="p">,</span><span class="w"> </span><span class="n">PJ_FWD</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">);</span><span class="w"></span>
<span class="n">printf</span><span class="p">(</span><span class="s">&quot;easting: %.3f, northing: %.3f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">enu</span><span class="p">.</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">enu</span><span class="p">.</span><span class="n">n</span><span class="p">);</span><span class="w"></span>
</pre></div>
</div>
<p><a class="reference internal" href="reference/functions.html#c.proj_trans" title="proj_trans"><code class="xref c c-func docutils literal notranslate"><span class="pre">proj_trans()</span></code></a> takes as its arguments:</p>
<ul class="simple">
<li><p>a <a class="reference internal" href="reference/datatypes.html#c.PJ" title="PJ"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ</span></code></a> transformation object,</p></li>
<li><p>a <a class="reference internal" href="reference/datatypes.html#c.PJ_DIRECTION" title="PJ_DIRECTION"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ_DIRECTION</span></code></a> direction, and</p></li>
<li><p>the <a class="reference internal" href="reference/datatypes.html#c.PJ_COORD" title="PJ_COORD"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ_COORD</span></code></a> coordinate to transform.</p></li>
</ul>
<p>The direction argument can be one of:</p>
<ul class="simple">
<li><p><code class="docutils literal notranslate"><span class="pre">PJ_FWD</span></code> – “forward” transformation from source CRS to target CRS.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PJ_IDENT</span></code> – “identity”, return the source coordinate unchanged.</p></li>
<li><p><code class="docutils literal notranslate"><span class="pre">PJ_INV</span></code> – “inverse” transformation from target CRS to source CRS.</p></li>
</ul>
<p>It returns the new transformed <a class="reference internal" href="reference/datatypes.html#c.PJ_COORD" title="PJ_COORD"><code class="xref c c-type docutils literal notranslate"><span class="pre">PJ_COORD</span></code></a> coordinate.</p>
<p>We can perform the transformation in reverse (from UTM zone 32 back to
geographic) as follows:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_trans</span><span class="p">(</span><span class="n">P</span><span class="p">,</span><span class="w"> </span><span class="n">PJ_INV</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w"></span>
<span class="n">printf</span><span class="p">(</span><span class="s">&quot;longitude: %g, latitude: %g</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">lp</span><span class="p">.</span><span class="n">lam</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">lp</span><span class="p">.</span><span class="n">phi</span><span class="p">);</span><span class="w"></span>
</pre></div>
</div>
<p>Before ending the program, we need to release the memory allocated to our
objects:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="n">proj_destroy</span><span class="p">(</span><span class="n">P</span><span class="p">);</span><span class="w"></span>
<span class="n">proj_context_destroy</span><span class="p">(</span><span class="n">C</span><span class="p">);</span><span class="w"> </span><span class="cm">/* may be omitted in the single threaded case */</span><span class="w"></span>
</pre></div>
</div>
<p>A complete compilable version of the example code can be seen below:</p>
<div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="linenos"> 1</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdio.h&gt;</span><span class="cp"></span>
<span class="linenos"> 2</span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;proj.h&gt;</span><span class="cp"></span>
<span class="linenos"> 3</span>
<span class="linenos"> 4</span><span class="kt">int</span><span class="w"> </span><span class="nf">main</span><span class="w"> </span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="linenos"> 5</span><span class="w">    </span><span class="n">PJ_CONTEXT</span><span class="w"> </span><span class="o">*</span><span class="n">C</span><span class="p">;</span><span class="w"></span>
<span class="linenos"> 6</span><span class="w">    </span><span class="n">PJ</span><span class="w"> </span><span class="o">*</span><span class="n">P</span><span class="p">;</span><span class="w"></span>
<span class="linenos"> 7</span><span class="w">    </span><span class="n">PJ</span><span class="w"> </span><span class="o">*</span><span class="n">norm</span><span class="p">;</span><span class="w"></span>
<span class="linenos"> 8</span><span class="w">    </span><span class="n">PJ_COORD</span><span class="w"> </span><span class="n">a</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">;</span><span class="w"></span>
<span class="linenos"> 9</span>
<span class="linenos">10</span><span class="w">    </span><span class="cm">/* or you may set C=PJ_DEFAULT_CTX if you are sure you will     */</span><span class="w"></span>
<span class="linenos">11</span><span class="w">    </span><span class="cm">/* use PJ objects from only one thread                          */</span><span class="w"></span>
<span class="linenos">12</span><span class="w">    </span><span class="n">C</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_context_create</span><span class="p">();</span><span class="w"></span>
<span class="linenos">13</span>
<span class="linenos">14</span><span class="w">    </span><span class="n">P</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_create_crs_to_crs</span><span class="w"> </span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="w"></span>
<span class="linenos">15</span><span class="w">                                </span><span class="s">&quot;EPSG:4326&quot;</span><span class="p">,</span><span class="w"></span>
<span class="linenos">16</span><span class="w">                                </span><span class="s">&quot;+proj=utm +zone=32 +datum=WGS84&quot;</span><span class="p">,</span><span class="w"> </span><span class="cm">/* or EPSG:32632 */</span><span class="w"></span>
<span class="linenos">17</span><span class="w">                                </span><span class="nb">NULL</span><span class="p">);</span><span class="w"></span>
<span class="linenos">18</span>
<span class="linenos">19</span><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">P</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="linenos">20</span><span class="w">        </span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Failed to create transformation object.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span><span class="w"></span>
<span class="linenos">21</span><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"></span>
<span class="linenos">22</span><span class="w">    </span><span class="p">}</span><span class="w"></span>
<span class="linenos">23</span>
<span class="linenos">24</span><span class="w">    </span><span class="cm">/* This will ensure that the order of coordinates for the input CRS */</span><span class="w"></span>
<span class="linenos">25</span><span class="w">    </span><span class="cm">/* will be longitude, latitude, whereas EPSG:4326 mandates latitude, */</span><span class="w"></span>
<span class="linenos">26</span><span class="w">    </span><span class="cm">/* longitude */</span><span class="w"></span>
<span class="linenos">27</span><span class="w">    </span><span class="n">norm</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_normalize_for_visualization</span><span class="p">(</span><span class="n">C</span><span class="p">,</span><span class="w"> </span><span class="n">P</span><span class="p">);</span><span class="w"></span>
<span class="linenos">28</span><span class="w">    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="mi">0</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="n">norm</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
<span class="linenos">29</span><span class="w">        </span><span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span><span class="w"> </span><span class="s">&quot;Failed to normalize transformation object.</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span><span class="w"></span>
<span class="linenos">30</span><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="mi">1</span><span class="p">;</span><span class="w"></span>
<span class="linenos">31</span><span class="w">    </span><span class="p">}</span><span class="w"></span>
<span class="linenos">32</span><span class="w">    </span><span class="n">proj_destroy</span><span class="p">(</span><span class="n">P</span><span class="p">);</span><span class="w"></span>
<span class="linenos">33</span><span class="w">    </span><span class="n">P</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">norm</span><span class="p">;</span><span class="w"></span>
<span class="linenos">34</span>
<span class="linenos">35</span><span class="w">    </span><span class="cm">/* a coordinate union representing Copenhagen: 55d N, 12d E    */</span><span class="w"></span>
<span class="linenos">36</span><span class="w">    </span><span class="cm">/* Given that we have used proj_normalize_for_visualization(), the order of</span>
<span class="linenos">37</span><span class="cm">    /* coordinates is longitude, latitude, and values are expressed in degrees. */</span><span class="w"></span>
<span class="linenos">38</span><span class="w">    </span><span class="n">a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_coord</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="w"> </span><span class="mi">55</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">);</span><span class="w"></span>
<span class="linenos">39</span>
<span class="linenos">40</span><span class="w">    </span><span class="cm">/* transform to UTM zone 32, then back to geographical */</span><span class="w"></span>
<span class="linenos">41</span><span class="w">    </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_trans</span><span class="p">(</span><span class="n">P</span><span class="p">,</span><span class="w"> </span><span class="n">PJ_FWD</span><span class="p">,</span><span class="w"> </span><span class="n">a</span><span class="p">);</span><span class="w"></span>
<span class="linenos">42</span><span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;easting: %.3f, northing: %.3f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">enu</span><span class="p">.</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">enu</span><span class="p">.</span><span class="n">n</span><span class="p">);</span><span class="w"></span>
<span class="linenos">43</span>
<span class="linenos">44</span><span class="w">    </span><span class="n">b</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">proj_trans</span><span class="p">(</span><span class="n">P</span><span class="p">,</span><span class="w"> </span><span class="n">PJ_INV</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">);</span><span class="w"></span>
<span class="linenos">45</span><span class="w">    </span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;longitude: %g, latitude: %g</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">lp</span><span class="p">.</span><span class="n">lam</span><span class="p">,</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">lp</span><span class="p">.</span><span class="n">phi</span><span class="p">);</span><span class="w"></span>
<span class="linenos">46</span>
<span class="linenos">47</span><span class="w">    </span><span class="cm">/* Clean up */</span><span class="w"></span>
<span class="linenos">48</span><span class="w">    </span><span class="n">proj_destroy</span><span class="p">(</span><span class="n">P</span><span class="p">);</span><span class="w"></span>
<span class="linenos">49</span><span class="w">    </span><span class="n">proj_context_destroy</span><span class="p">(</span><span class="n">C</span><span class="p">);</span><span class="w"> </span><span class="cm">/* may be omitted in the single threaded case */</span><span class="w"></span>
<span class="linenos">50</span><span class="w">    </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"></span>
<span class="linenos">51</span><span class="p">}</span><span class="w"></span>
</pre></div>
</div>
</section>


           </div>
          </div>
          <footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
        <a href="index.html" class="btn btn-neutral float-left" title="Development" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
        <a href="transformations.html" class="btn btn-neutral float-right" title="Transformations" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
    </div>

  <hr/>

  <div role="contentinfo">
    <p>&#169; Copyright 1983-2022.
      <span class="lastupdated">Last updated on 22 Mar 2022.
      </span></p>
  </div>

  Built with <a href="https://www.sphinx-doc.org/">Sphinx</a> using a
    <a href="https://github.com/readthedocs/sphinx_rtd_theme">theme</a>
    provided by <a href="https://readthedocs.org">Read the Docs</a>.
   

</footer>
        </div>
      </div>
    </section>
  </div>
  <script>
      jQuery(function () {
          SphinxRtdTheme.Navigation.enable(true);
      });
  </script> 

</body>
</html>