diff options
| author | PROJ deploybot <proj.bot@proj.bot> | 2022-03-22 20:00:06 +0000 |
|---|---|---|
| committer | PROJ deploybot <proj.bot@proj.bot> | 2022-03-22 20:00:06 +0000 |
| commit | a3f43744feec86272fe532124679d3a013ef9a8c (patch) | |
| tree | 27e4198db6011e3097eb7bcfe7197684aba7583a /development/quickstart.html | |
| download | PROJ-gh-pages.tar.gz PROJ-gh-pages.zip | |
update with results of commit https://github.com/OSGeo/PROJ/commit/53c07a8bd211b7aee4bc07a9c6726005504b7181gh-pages
Diffstat (limited to 'development/quickstart.html')
| -rw-r--r-- | development/quickstart.html | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/development/quickstart.html b/development/quickstart.html new file mode 100644 index 00000000..3bc120b1 --- /dev/null +++ b/development/quickstart.html @@ -0,0 +1,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 — 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> »</li> + <li><a href="index.html">Development</a> »</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"><stdio.h></span><span class="cp"></span> +<span class="cp">#include</span><span class="w"> </span><span class="cpf"><proj.h></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">"EPSG:4326"</span><span class="p">,</span><span class="w"></span> +<span class="w"> </span><span class="s">"+proj=utm +zone=32 +datum=WGS84"</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">"Failed to create transformation object.</span><span class="se">\n</span><span class="s">"</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["WGS 84", + DATUM["World Geodetic System 1984", + ELLIPSOID["WGS 84",6378137,298.257223563, + LENGTHUNIT["metre",1]]], + PRIMEM["Greenwich",0, + ANGLEUNIT["degree",0.0174532925199433]], + CS[ellipsoidal,2], + AXIS["geodetic latitude (Lat)",north, + ORDER[1], + ANGLEUNIT["degree",0.0174532925199433]], + AXIS["geodetic longitude (Lon)",east, + ORDER[2], + ANGLEUNIT["degree",0.0174532925199433]], + USAGE[ + SCOPE["unknown"], + AREA["World"], + BBOX[-90,-180,90,180]], + ID["EPSG",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">"Failed to normalize transformation object.</span><span class="se">\n</span><span class="s">"</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">"easting: %.3f, northing: %.3f</span><span class="se">\n</span><span class="s">"</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">"longitude: %g, latitude: %g</span><span class="se">\n</span><span class="s">"</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"><stdio.h></span><span class="cp"></span> +<span class="linenos"> 2</span><span class="cp">#include</span><span class="w"> </span><span class="cpf"><proj.h></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">"EPSG:4326"</span><span class="p">,</span><span class="w"></span> +<span class="linenos">16</span><span class="w"> </span><span class="s">"+proj=utm +zone=32 +datum=WGS84"</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">"Failed to create transformation object.</span><span class="se">\n</span><span class="s">"</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">"Failed to normalize transformation object.</span><span class="se">\n</span><span class="s">"</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">"easting: %.3f, northing: %.3f</span><span class="se">\n</span><span class="s">"</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">"longitude: %g, latitude: %g</span><span class="se">\n</span><span class="s">"</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>© 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>
\ No newline at end of file |
