sis-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From desruisse...@apache.org
Subject svn commit: r1828645 - in /sis/ip-review: ObliqueMercator.xhtml rev/10858/ rev/10858/HEADER.html rev/10858/ObliqueMercator.xhtml rev/11373/AlbersEqualArea.xhtml rev/20874/ObliqueMercator.xhtml
Date Sun, 08 Apr 2018 15:49:37 GMT
Author: desruisseaux
Date: Sun Apr  8 15:49:37 2018
New Revision: 1828645

URL: http://svn.apache.org/viewvc?rev=1828645&view=rev
Log:
Add IP review for ObliqueMercator. This class can not be ported to Apache SIS since it has been created undel LGPL license by a developer who didn't signed ICLA. This class has been fully rewritten in Apache SIS, using the formulas published by EPSG in publication 373-7-2 – Geomatics Guidance Note number 7, part 2.

Added:
    sis/ip-review/ObliqueMercator.xhtml
    sis/ip-review/rev/10858/
    sis/ip-review/rev/10858/HEADER.html
    sis/ip-review/rev/10858/ObliqueMercator.xhtml
    sis/ip-review/rev/20874/ObliqueMercator.xhtml
Modified:
    sis/ip-review/rev/11373/AlbersEqualArea.xhtml

Added: sis/ip-review/ObliqueMercator.xhtml
URL: http://svn.apache.org/viewvc/sis/ip-review/ObliqueMercator.xhtml?rev=1828645&view=auto
==============================================================================
--- sis/ip-review/ObliqueMercator.xhtml (added)
+++ sis/ip-review/ObliqueMercator.xhtml Sun Apr  8 15:49:37 2018
@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta charset="UTF-8"/>
+    <title>ObliqueMercator history</title>
+    <style type="text/css" media="all">
+      @import url("./reports.css");
+    </style>
+  </head>
+  <body>
+    <div>
+      <h1>ObliqueMercator history</h1>
+  <p>Click on the commit message for inspecting the <code>diff</code> and how the code has been rewritten.</p>
+<p><b>Command line:</b></p>
+<blockquote><code>svn log -r31996:1 http://svn.osgeo.org/geotools/trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/projection/ObliqueMercator.java</code></blockquote>
+<table>
+  <tr>
+    <th>Rev.</th>
+    <th>Date</th>
+    <th>Author</th>
+    <th class="last">Message</th>
+  </tr>
+<tr><td class="rev">30760</td><td>2008-06-18</td><td>desruisseaux</td><td>Upgrated from JSR-108 to JSR-275 (GEOT-1266). Some opportunist javadoc fixes and @Override annotations in the process.</td></tr>
+<tr><td class="rev">30641</td><td>2008-06-12</td><td>acuster</td><td>Copyright headers: lib/referencing, this time with feeling (and the el in Toolkit)</td></tr>
+<tr><td class="rev">30639</td><td>2008-06-12</td><td>acuster</td><td>Copyright headers: cleanup library/referencing</td></tr>
+<tr><td class="rev">30521</td><td>2008-06-05</td><td>acuster</td><td>Copyright: Update referencing headers</td></tr>
+<tr><td class="rev">30514</td><td>2008-06-04</td><td>acuster</td><td>Header cleanup 3 -- prep for Cedric's script --- modules/library: fix referencing and coverage</td></tr>
+<tr><td class="rev">30258</td><td>2008-05-08</td><td>acuster</td><td>Reshuffle the top level repo: drop uDig, move up trunk, tags, and branches.</td></tr>
+<tr><td class="rev">30257</td><td>2008-05-08</td><td>acuster</td><td>Move trunk/gt/ directory contents up to trunk/ and drop gt</td></tr>
+<tr><td class="rev">29723</td><td>2008-03-27</td><td>desruisseaux</td><td>Added serialVersionIUD in MapProjection with values computed from the 2.4.1 release for cross-version compatibility. NewZealandMapGrid now creates Complex object in method body on the assumption that modern compilers can allocate on stack. Provides a way to reinitialize the warnings for every MapProjections in a JVM. Formatting.</td></tr>
+<tr><td class="rev">29711</td><td>2008-03-25</td><td>desruisseaux</td><td>In MapProjection, provide more information in the logged warning (especially the projection name) in order to compensate for the loss of stack trace. In subclasses, replaced "Math." occurences by a static import for readability (there is a lot of sin(x), cos(x), sqrt(x) etc. calls in those classes). Also replaced sqrt(x*x + y*y) by hypot(x,y) and (exp(x)-exp(-x))/2 by sinh(x) which are new functions in Java 5 (hopefully more accurate and/or faster). Applied some Java 5 language syntax (generic types and @Override annotation).</td></tr>
+<tr><td class="rev">28922</td><td>2008-01-24</td><td>acuster</td><td>Bump the (at)since version to 2.5 since WKTParser was cut from 2.4</td></tr>
+<tr><td class="rev">28540</td><td>2007-12-29</td><td>acuster</td><td>Hide buttons which are not yet used</td></tr>
+<tr><td class="rev">27575</td><td>2007-10-22</td><td>desruisseaux</td><td>Converted Java source files from ISO-LATIN-1 encoding to UTF-8 (GEOT-1516).</td></tr>
+<tr><td class="rev">24581</td><td>2007-02-26</td><td>desruisseaux</td><td>Rewrote 'createLinearConversion' from scratch, since testing of 'South Oriented' cases of map projections show some issues with the old implementation.</td></tr>
+<tr><td class="rev">24563</td><td>2007-02-23</td><td>desruisseaux</td><td>Refactored ObliqueMercator constructors (GEOT-786). Also added a 'Scale factor on initial line' alias, which is required for ObliqueMercator created from the EPSG database.</td></tr>
+<tr><td class="rev">24384</td><td>2007-02-14</td><td>desruisseaux</td><td>GEOT-1160: First working implementation of AbstractAuthorityFactory.find(IdentifiedObject). This includes a package-privated AuthorityFactoryProxy class, together with many fix in the code base in order to get CRS.equalsIgnoreCase to work in the ProjectedCRS case.</td></tr>
+<tr><td class="rev">24333</td><td>2007-02-10</td><td>desruisseaux</td><td>GEOT-786: Rearrange projection constructors and providers, especially in orthographic and stereographic projection.</td></tr>
+<tr><td class="rev">24097</td><td>2007-01-29</td><td>desruisseaux</td><td>Implemented authority factory for codes of the form http://www.opengis.net/ (GEOT-1136)</td></tr>
+<tr><td class="rev">22474</td><td>2006-10-31</td><td>desruisseaux</td><td>Added a test script for Lambert Azimuthal Equal Area (actually Rueben's work). Bug fixes and minor cleaning in the projection package.</td></tr>
+<tr><td class="rev">22327</td><td>2006-10-23</td><td>desruisseaux</td><td>GEOT-982: regroup 'module', 'plugin', 'ext' and 'unsupported' in a common directory.</td></tr>
+<tr><td class="rev">22315</td><td>2006-10-22</td><td>desruisseaux</td><td>Reorganisation of directory tree structure (GEOT-982) phase 1: moved 'src' to 'src/main/java'.</td></tr>
+<tr><td class="rev">22295</td><td>2006-10-20</td><td>desruisseaux</td><td>Added Lambert Azimuthal Equal Area projection. Various minor cleaning in other projection related code.</td></tr>
+<tr><td class="rev">20874</td><td>2006-08-07</td><td class="unav">jgarnett</td><td><a href="rev/20874/ObliqueMercator.xhtml">ip review</a></td></tr>
+<tr><td class="rev">20539</td><td>2006-07-14</td><td>desruisseaux</td><td>Relicensed the Proj.4 derived work under LGPL as permitted by Frank Warmerdam on geotools-devel mailing list on June 21, 2006.</td></tr>
+<tr><td class="rev">19769</td><td>2006-06-02</td><td>desruisseaux</td><td>Javadoc fix: replaced 'degrees' by 'decimal degrees' when relevant (GEOT-855)</td></tr>
+<tr><td class="rev">17672</td><td>2006-01-19</td><td>desruisseaux</td><td>Added @source tag.</td></tr>
+<tr><td class="rev">17660</td><td>2006-01-18</td><td>desruisseaux</td><td>Fixed SVN attributes, including the addition of URL attribute.</td></tr>
+<tr><td class="rev">16983</td><td>2005-11-25</td><td>desruisseaux</td><td>Replaced references to static fields and methods of CitationImpl.* by Citations.*</td></tr>
+<tr><td class="rev">16942</td><td>2005-11-23</td><td>desruisseaux</td><td>First draft of OrderedAxisAuthorityFactory (GEOT-694)</td></tr>
+<tr><td class="rev">16514</td><td>2005-10-25</td><td>desruisseaux</td><td>Added a check if order to use an 'Equirectangular' parameter group without 'latitude of origin' parameter if the latitude of origin is 0.</td></tr>
+<tr><td class="rev">16205</td><td>2005-10-11</td><td>desruisseaux</td><td>Cleaned javadoc warning. More work done on Maven 2 configuration (GEOT-691)</td></tr>
+<tr><td class="rev">15350</td><td>2005-08-16</td><td>desruisseaux</td><td>Merged the 'split-main' branch to trunk (GEOT-662)</td></tr>
+<tr><td class="rev">15256</td><td>2005-08-09</td><td>desruisseaux</td><td>Extraction of referencing module from main</td></tr>
+<tr><td class="rev">15255</td><td>2005-08-09</td><td>desruisseaux</td><td>Prepare branch for splitting main</td></tr>
+<tr><td class="rev">14834</td><td>2005-07-20</td><td>desruisseaux</td><td>Reorganized I18N resources</td></tr>
+<tr><td class="rev">14657</td><td>2005-07-01</td><td>desruisseaux</td><td>Ongoing work for the port of grid coverage operations from 'legacy' to 'main' (GEOT-413): ported SampleDimensionSelect</td></tr>
+<tr><td class="rev">14581</td><td>2005-06-22</td><td>desruisseaux</td><td>Implemented South-Orientated transverse mercator / more GEOT-589 work</td></tr>
+<tr><td class="rev">13925</td><td>2005-05-30</td><td>desruisseaux</td><td>Added @since javadoc tag</td></tr>
+<tr><td class="rev">13922</td><td>2005-05-29</td><td>desruisseaux</td><td>Renaming of remainding GeoAPI implementations. Renaming is now finished.</td></tr>
+<tr><td class="rev">13853</td><td>2005-05-26</td><td>desruisseaux</td><td>Bug fix: arrays must be NamedIndentifier[], because it implements two interfaces</td></tr>
+<tr><td class="rev">13836</td><td>2005-05-26</td><td>desruisseaux</td><td>Added 'Default' suffix to some CRS implementations: partial work</td></tr>
+<tr><td class="rev">13773</td><td>2005-05-24</td><td>desruisseaux</td><td>Removed old metadata implementations (they are now renamed with 'Impl' suffix) / Use OGC citation instead of OPEN_GIS</td></tr>
+<tr><td class="rev">13752</td><td>2005-05-23</td><td>desruisseaux</td><td>Added the 'Impl' suffix to direct implementations of all metadata interfaces; deprecated the old implementations (not yet deleted).</td></tr>
+<tr><td class="rev">12020</td><td>2005-03-11</td><td>desruisseaux</td><td>First working version of Resampler2D port (side effect: GEOT-390 fix)</td></tr>
+<tr><td class="rev">11144</td><td>2005-02-07</td><td>desruisseaux</td><td>Fixed GEOT-400 (create appropriate instance of Operation subclasses)</td></tr>
+<tr><td class="rev">11137</td><td>2005-02-05</td><td>desruisseaux</td><td>Tune CRS tests (e.g. allow different tolerance level for assertions in different projections)</td></tr>
+<tr><td class="rev">11101</td><td>2005-02-04</td><td>desruisseaux</td><td>Renamed MapProjection.Provider as AbstractProvider</td></tr>
+<tr><td class="rev">11074</td><td>2005-02-03</td><td>desruisseaux</td><td>Revisited CRSFactory.createProjectedCRS(...) API</td></tr>
+<tr><td class="rev">11001</td><td>2005-02-02</td><td>desruisseaux</td><td>Fixed wrong encoding in main/src</td></tr>
+<tr><td class="rev">10858</td><td>2005-01-29</td><td class="unav">rschulz</td><td><a href="rev/10858/ObliqueMercator.xhtml">allow azimuth parameter to be within the range of -360 to -270, -90 to 90, and 270 to 360</a></td></tr>
+<tr><td class="rev">10796</td><td>2005-01-28</td><td class="unav">dzwiers</td><td><a href="rev/10858/ObliqueMercator.xhtml">imports cleaned</a></td></tr>
+<tr><td class="rev">10262</td><td>2005-01-05</td><td class="unav">rschulz</td><td><a href="rev/10858/ObliqueMercator.xhtml">first commit</a></td></tr>
+</table>
+    </div>
+  </body>
+</html>

Added: sis/ip-review/rev/10858/HEADER.html
URL: http://svn.apache.org/viewvc/sis/ip-review/rev/10858/HEADER.html?rev=1828645&view=auto
==============================================================================
--- sis/ip-review/rev/10858/HEADER.html (added)
+++ sis/ip-review/rev/10858/HEADER.html Sun Apr  8 15:49:37 2018
@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta charset="UTF-8"/>
+    <title>Revision 10858</title>
+  </head>
+  <body>
+    <div>
+      <h1>Revision 10858</h1>
+<table>
+  <tr><td><b>Author:</b></td><td>rschulz</td></tr>
+  <tr><td><b>Date:</b></td><td>2005-01-29</td></tr>
+  <tr><td><b>Message:</b></td><td>allow azimuth parameter to be within the range of -360 to -270, -90 to 90, and 270 to 360</td></tr>
+</table>
+    </div>
+  </body>
+</html>

Added: sis/ip-review/rev/10858/ObliqueMercator.xhtml
URL: http://svn.apache.org/viewvc/sis/ip-review/rev/10858/ObliqueMercator.xhtml?rev=1828645&view=auto
==============================================================================
--- sis/ip-review/rev/10858/ObliqueMercator.xhtml (added)
+++ sis/ip-review/rev/10858/ObliqueMercator.xhtml Sun Apr  8 15:49:37 2018
@@ -0,0 +1,912 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta charset="UTF-8"/>
+    <title>ObliqueMercator changes for revisions 10261:10858</title>
+    <style type="text/css" media="all">
+      @import url("../../reports.css");
+    </style>
+  </head>
+  <body>
+    <div>
+      <h1>ObliqueMercator changes for revisions 10261:10858</h1>
+
+<p>
+  This file can not be ported to Apache SIS since it has been contributed under LGPL license by a developer who have not signed Apache ICLA.
+  This projection have be rewritten from scratch using IOGP Publication 373-7-2 – <cite>Geomatics Guidance Note number 7, part 2</cite> – September 2016
+  section 1.3.6.1 (pages 57 to 60). Note that this is a different source than the Snyder book used below, but the formulas are similar
+  because IOGP guidance notes are themselves derived from Snyder's book.
+</p><p>
+  The code written for Apache SIS can be viewed <a href="http://svn.apache.org/repos/asf/sis/branches/JDK8/core/sis-referencing/src/main/java/org/apache/sis/referencing/operation/projection/ObliqueStereographic.java?r=1828642">from
+  the SubVersion repository at revision 1828642</a>. It differs from the code below with much less fields, field names matching EPSG notes
+  instead than Snyder book (<i>e.g.</i> <code>H</code> instead of <code>E</code>), absence of <code>if</code> branches which were not in EPSG notes
+  (those branches were not needed in Java anyway), completely different way to handle parameters, and addition of Jacobian matrices.
+</p>
+
+<p><b>Command line:</b></p>
+<blockquote><code>svn diff --extensions "--unified --ignore-space-change --ignore-all-space --ignore-eol-style" -r10261:10858 http://svn.osgeo.org/geotools/trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/projection/ObliqueMercator.java</code></blockquote>
+<table class="changes">
+<tr><th>Revision 10858</th></tr>
+<tr>
+<td><pre><span class="add">/*</span>
+<span class="add"> * Geotools - OpenSource mapping toolkit</span>
+<span class="add"> * (C) 2005, Geotools Project Managment Committee (PMC)</span>
+<span class="add"> *</span>
+<span class="add"> *    This library is free software; you can redistribute it and/or</span>
+<span class="add"> *    modify it under the terms of the GNU Lesser General Public</span>
+<span class="add"> *    License as published by the Free Software Foundation; either</span>
+<span class="add"> *    version 2.1 of the License, or (at your option) any later version.</span>
+<span class="add"> *</span>
+<span class="add"> *    This library is distributed in the hope that it will be useful,</span>
+<span class="add"> *    but WITHOUT ANY WARRANTY; without even the implied warranty of</span>
+<span class="add"> *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU</span>
+<span class="add"> *    Lesser General Public License for more details.</span>
+<span class="add"> *</span>
+<span class="add"> *    You should have received a copy of the GNU Lesser General Public</span>
+<span class="add"> *    License along with this library; if not, write to the Free Software</span>
+<span class="add"> *    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA</span>
+<span class="add"> *</span>
+<span class="add"> *</span>
+<span class="add"> *    This package contains formulas from the PROJ package of USGS.</span>
+<span class="add"> *    USGS's work is fully acknowledged here.</span>
+<span class="add"> */</span>
+<span class="add">/*</span>
+<span class="add">** libproj -- library of cartographic projections</span>
+<span class="add">** Some parts Copyright (c) 2003   Gerald I. Evenden</span>
+<span class="add">**</span>
+<span class="add">** Permission is hereby granted, free of charge, to any person obtaining</span>
+<span class="add">** a copy of this software and associated documentation files (the</span>
+<span class="add">** "Software"), to deal in the Software without restriction, including</span>
+<span class="add">** without limitation the rights to use, copy, modify, merge, publish,</span>
+<span class="add">** distribute, sublicense, and/or sell copies of the Software, and to</span>
+<span class="add">** permit persons to whom the Software is furnished to do so, subject to</span>
+<span class="add">** the following conditions:</span>
+<span class="add">**</span>
+<span class="add">** The above copyright notice and this permission notice shall be</span>
+<span class="add">** included in all copies or substantial portions of the Software.</span>
+<span class="add">**</span>
+<span class="add">** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,</span>
+<span class="add">** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</span>
+<span class="add">** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.</span>
+<span class="add">** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY</span>
+<span class="add">** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,</span>
+<span class="add">** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE</span>
+<span class="add">** SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</span>
+<span class="add">*/</span>
+<span class="add">package org.geotools.referencing.operation.projection;</span>
+<span class="add"></span>
+<span class="add">// J2SE dependencies and extensions</span>
+<span class="add">import java.awt.geom.Point2D;</span>
+<span class="add">import java.util.Collection;</span>
+<span class="add"></span>
+<span class="add">import javax.units.NonSI;</span>
+<span class="add"></span>
+<span class="add">import org.geotools.metadata.citation.Citation;</span>
+<span class="add">import org.geotools.referencing.Identifier;</span>
+<span class="add">import org.geotools.resources.cts.ResourceKeys;</span>
+<span class="add">import org.geotools.resources.cts.Resources;</span>
+<span class="add">import org.opengis.parameter.ParameterDescriptor;</span>
+<span class="add">import org.opengis.parameter.ParameterDescriptorGroup;</span>
+<span class="add">import org.opengis.parameter.ParameterNotFoundException;</span>
+<span class="add">import org.opengis.parameter.ParameterValueGroup;</span>
+<span class="add">import org.opengis.referencing.operation.MathTransform;</span>
+<span class="add"></span>
+<span class="add">/**</span>
+<span class="add"> * Oblique Mercator Projection. A conformal, oblique, cylindrical projection</span>
+<span class="add"> * with the cylinder touching the ellipsoid (or sphere) along a great circle</span>
+<span class="add"> * path (the central line). The Mercator and Transverse Mercator projections</span>
+<span class="add"> * can be thought of as special cases of the oblique mercator, where the central</span>
+<span class="add"> * line is along the equator or a meridian, respectively. The Oblique Mercator</span>
+<span class="add"> * projection has been used in Switzerland, Hungary, Madagascar,</span>
+<span class="add"> * Malaysia, Borneo and the panhandle of Alaska.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * The Oblique Mercator projection uses a (U,V) coordinate system, with the</span>
+<span class="add"> * U axis along the central line. During the forward projection, coordinates</span>
+<span class="add"> * from the ellipsoid are projected conformally to a sphere of constant total</span>
+<span class="add"> * curvature, called the 'aposphere', before being projected onto the plane.</span>
+<span class="add"> * The projection coordinates are further convented to a (X,Y) coordinate system</span>
+<span class="add"> * by rotating the calculated (u,v) coordinates to give output (x,y) coordinates.</span>
+<span class="add"> * The rotation value is usually the same as the projection azimuth (the angle,</span>
+<span class="add"> * east of north, of the central line), but some cases allow a separate</span>
+<span class="add"> * rotation parameter.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * There are two forms of the oblique mercator, differing in the origin of</span>
+<span class="add"> * their grid coordinates. The Hotine_Oblique_Mercator (EPSG code 9812) has grid</span>
+<span class="add"> * coordinates start at the intersection of the central line and the equator of the</span>
+<span class="add"> * aposphere. The Oblique_Mercator (EPSG code 9815) is the same, except the grid</span>
+<span class="add"> * coordinates begin at the central point (where the latitude of center and</span>
+<span class="add"> * central line intersect). ESRI separates these two case by appending</span>
+<span class="add"> * "Natural_Origin" (for the Hotine_Oblique_Mercator) and "Center"</span>
+<span class="add"> * (for the Obique_Mercator) to the projection names.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * Two different methods are used to specify the central line for the</span>
+<span class="add"> * oblique mercator: 1) a central point and an azimuth,</span>
+<span class="add"> * east of north, describing the central line and</span>
+<span class="add"> * 2) two points on the central line. The EPSG does not use the two point method,</span>
+<span class="add"> * while ESRI separates the two cases by putting "Azimuth" and "Two_Point" in</span>
+<span class="add"> * their projection names. Both cases use the point where the "latitude_of_center"</span>
+<span class="add"> * parameter crosses the central line as the projection's central point.</span>
+<span class="add"> * The central meridian is not a projection parameter, and is instead calculated</span>
+<span class="add"> * as the intersection between the central line and the equator of the aposphere.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * For the azimuth method, the central latitude cannot be +- 90.0 degrees</span>
+<span class="add"> * and the central line cannot be at a maximum or minimum latitude at the central point.</span>
+<span class="add"> * In the two point method, the latitude of the first and second points cannot be</span>
+<span class="add"> * equal. Also, the latitude of the first point and central point cannot be</span>
+<span class="add"> * +- 90.0 degrees. Furthermore, the latitude of the first point cannot be 0.0 and</span>
+<span class="add"> * the latitude of the second point cannot be - 90.0 degrees. A change of</span>
+<span class="add"> * 10^-7 radians can allow calculation at these special cases. Snyder's restriction</span>
+<span class="add"> * of the central latitude being 0.0 has been removed, since the equaitons appear</span>
+<span class="add"> * to work correctly in this case.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * Azimuth values of 0.0 and +- 90.0 degrees are allowed (and used in Hungary</span>
+<span class="add"> * and Switzerland), though these cases would usually use a Mercator or</span>
+<span class="add"> * Transverse Mercator projection instead. Azimuth values &gt; 90 degrees cause</span>
+<span class="add"> * errors in the equations.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * The oblique mercator is also called the "Rectified Skew Orthomorphic" (RSO).</span>
+<span class="add"> * It appears is that the only difference from the oblique mercator is that</span>
+<span class="add"> * the RSO allows the rotation from the (U,V) to (X,Y) coordinate system to be different</span>
+<span class="add"> * from the azimuth. This separate parameter is called "rectified_grid_angle" (or</span>
+<span class="add"> * "XY_Plane_Rotation" by ESRI) and is also included in the EPSG's parameters</span>
+<span class="add"> * for the Oblique Mercator and Hotine Oblique Mercator.</span>
+<span class="add"> * The rotation parameter is optional in all the non-two point projections and will be</span>
+<span class="add"> * set to the azimuth if not specified.</span>
+<span class="add"> * &lt;br&gt;&lt;br&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * Projection cases and aliases implemented by the {@link ObliqueMercator} are:</span>
+<span class="add"> * &lt;ul&gt;</span>
+<span class="add"> * &lt;li&gt;Oblique_Mercator (EPSG code 9815) - grid coordinates begin at the central point, has "rectified_grid_angle" parameter.&lt;/li&gt;</span>
+<span class="add"> * &lt;li&gt;Hotine_Oblique_Mercator_Azimuth_Center (ESRI) - grid coordinates begin at the central point.&lt;/li&gt;</span>
+<span class="add"> * &lt;li&gt;Rectified_Skew_Orthomorphic_Center (ESRI) - grid coordinates begin at the central point, has "rectified_grid_angle" parameter.&lt;/li&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * &lt;li&gt;Hotine_Oblique_Mercator (EPSG code 9812) - grid coordinates begin at the interseciton of the central line and aposphere equator, has "rectified_grid_angle" parameter.&lt;/li&gt;</span>
+<span class="add"> * &lt;li&gt;Hotine_Oblique_Mercator_Azimuth_Natural_Origin (ESRI) - grid coordinates begin at the interseciton of the central line and aposphere equator.&lt;/li&gt;</span>
+<span class="add"> * &lt;li&gt;Rectified_Skew_Orthomorphic_Natural_Origin (ESRI) - grid coordinates begin at the interseciton of the central line and aposphere equator, has "rectified_grid_angle" parameter.&lt;/li&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * &lt;li&gt;Hotine_Oblique_Mercator_Two_Point_Center (ESRI) - grid coordinates begin at the central point.&lt;/li&gt;</span>
+<span class="add"> * &lt;li&gt;Hotine_Oblique_Mercator_Two_Point_Natural_Origin (ESRI) - grid coordinates begin at the interseciton of the central line and aposphere equator.&lt;/li&gt;</span>
+<span class="add"> * &lt;/ul&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * &lt;strong&gt;References:&lt;/strong&gt;</span>
+<span class="add"> * &lt;ul&gt;</span>
+<span class="add"> *   &lt;li&gt;&lt;code&gt;libproj4&lt;/code&gt; is available at</span>
+<span class="add"> *       &lt;A HREF="http://members.bellatlantic.net/~vze2hc4d/proj4/"&gt;libproj4 Miscellanea&lt;/A&gt;&lt;br&gt;</span>
+<span class="add"> *        Relevent files are: &lt;code&gt;PJ_omerc.c&lt;/code&gt;, &lt;code&gt;pj_tsfn.c&lt;/code&gt;,</span>
+<span class="add"> *        &lt;code&gt;pj_fwd.c&lt;/code&gt;, &lt;code&gt;pj_inv.c&lt;/code&gt; and &lt;code&gt;lib_proj.h&lt;/code&gt;&lt;/li&gt;</span>
+<span class="add"> *   &lt;li&gt; John P. Snyder (Map Projections - A Working Manual,</span>
+<span class="add"> *        U.S. Geological Survey Professional Paper 1395, 1987)&lt;/li&gt;</span>
+<span class="add"> *   &lt;li&gt; "Coordinate Conversions and Transformations including Formulas",</span>
+<span class="add"> *        EPSG Guidence Note Number 7 part 2, Version 24.&lt;/li&gt;</span>
+<span class="add"> *   &lt;li&gt;Gerald Evenden, 2004, &lt;a href="http://members.verizon.net/~vze2hc4d/proj4/omerc.pdf"&gt;</span>
+<span class="add"> *         Documentation of revised Oblique Mercator&lt;/a&gt;&lt;/li&gt;</span>
+<span class="add"> * &lt;/ul&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * @see &lt;A HREF="http://mathworld.wolfram.com/MercatorProjection.html"&gt;Oblique Mercator projection on MathWorld&lt;/A&gt;</span>
+<span class="add"> * @see &lt;A HREF="http://www.remotesensing.org/geotiff/proj_list/hotine_oblique_mercator.html"&gt;hotine_oblique_mercator on Remote Sensing&lt;/A&gt;</span>
+<span class="add"> * @see &lt;A HREF="http://www.remotesensing.org/geotiff/proj_list/oblique_mercator.html"&gt;oblique_mercator on Remote Sensing&lt;/A&gt;</span>
+<span class="add"> *</span>
+<span class="add"> * @version $Id$</span>
+<span class="add"> * @author  Rueben Schulz</span>
+<span class="add"> */</span>
+<span class="add">public class ObliqueMercator extends MapProjection {</span>
+<span class="add">    /**</span>
+<span class="add">     * Latitude of the projection centre. This is similar to the</span>
+<span class="add">     * {@link #latitudeOfOrigin}, but the latitude of origin is the</span>
+<span class="add">     * Earth equator on aposphere for the oblique mercator. Needed</span>
+<span class="add">     * for WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private final double latitudeOfCentre;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Longitude of the projection centre. This is &lt;strong&gt;NOT&lt;/strong&gt; equal</span>
+<span class="add">     * to the {@link #centralMeridian}, which is the meridian where the</span>
+<span class="add">     * central line intersects the Earth equator on aposphere. Needed for</span>
+<span class="add">     * for non-two point WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private final double longitudeOfCentre;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The azimuth of the central line passing throught the centre of the</span>
+<span class="add">     * projection, needed for for non-two point WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private double alpha_c;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The rectified bearing of the central line, needed for non-two point WKT. Equals</span>
+<span class="add">     * {@link #alpha_c} if the "rectified_grid_angle" parameter value is not set.</span>
+<span class="add">     */</span>
+<span class="add">    private double rectGridAngle;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The latitude of the 1st point used to specify the central line, needed for two point</span>
+<span class="add">     * WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private final double latitudeOf1stPoint;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The longitude of the 1st point used to specify the central line, needed for two point</span>
+<span class="add">     * WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private final double longitudeOf1stPoint;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The latitude of the 2nd point used to specify the central line, needed for two point</span>
+<span class="add">     * WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private final double latitudeOf2ndPoint;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The longitude of the 2nd point used to specify the central line, needed for two point</span>
+<span class="add">     * WKT.</span>
+<span class="add">     */</span>
+<span class="add">    private double longitudeOf2ndPoint;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Constants used in the transformation.</span>
+<span class="add">     */</span>
+<span class="add">    private double B, A, E;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Convenience values equal to {@link #A} / {@link #B},</span>
+<span class="add">     * {@link #A}&amp;times;{@link #B}, and {@link #B} / {@link #A}.</span>
+<span class="add">     */</span>
+<span class="add">    private final double ArB, AB, BrA;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * v values when the input latitude is a pole.</span>
+<span class="add">     */</span>
+<span class="add">    private final double v_pole_n, v_pole_s;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Sine and Cosine values for gamma0 (the angle between the meridian</span>
+<span class="add">     * and central line at the intersection between the central line and</span>
+<span class="add">     * the Earth equator on aposphere).</span>
+<span class="add">     */</span>
+<span class="add">    private final double singamma0, cosgamma0;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Sine and Cosine values for the rotation between (U,V) and</span>
+<span class="add">     * (X,Y) coordinate systems</span>
+<span class="add">     */</span>
+<span class="add">    private final double sinrot, cosrot;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * u value (in (U,V) coordinate system) of the central point. Used in the</span>
+<span class="add">     * oblique mercater case. The v value of the central point is 0.0.</span>
+<span class="add">     */</span>
+<span class="add">    private double u_c;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * &lt;code&gt;true&lt;/code&gt; if using two points on the central line to specify</span>
+<span class="add">     * the azimuth.</span>
+<span class="add">     */</span>
+<span class="add">    private final boolean twoPoint;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * &lt;code&gt;true&lt;/code&gt; for hotine oblique mercator, or &lt;code&gt;false&lt;/code&gt;</span>
+<span class="add">     * for the oblique mercator case.</span>
+<span class="add">     */</span>
+<span class="add">    private final boolean hotine;</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The {@link org.geotools.referencing.operation.MathTransformProvider}</span>
+<span class="add">     * for an {@link ObliqueMercator} projection.</span>
+<span class="add">     *</span>
+<span class="add">     * @see org.geotools.referencing.operation.MathTransformFactory</span>
+<span class="add">     *</span>
+<span class="add">     * @version $Id$</span>
+<span class="add">     * @author Rueben Schulz</span>
+<span class="add">     */</span>
+<span class="add">    public static class Provider</span>
+<span class="add">            extends org.geotools.referencing.operation.projection.MapProjection.Provider {</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #latitudeOfCentre}</span>
+<span class="add">         * parameter value. Valid values range is from -90 to 90�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LAT_OF_CENTRE = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.OPEN_GIS, "latitude_of_center"),</span>
+<span class="add">                    new Identifier(Citation.EPSG,     "Latitude of projection centre"),</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Latitude_Of_Center"),</span>
+<span class="add">                    new Identifier(Citation.GEOTIFF,  "CenterLat")</span>
+<span class="add">                },</span>
+<span class="add">                0, -90, 90, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #longitudeOfCentre}</span>
+<span class="add">         * parameter value. Valid values range is from -180 to 180�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LONG_OF_CENTRE = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.OPEN_GIS, "longitude_of_center"),</span>
+<span class="add">                    new Identifier(Citation.EPSG,     "Longitude of projection centre"),</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Longitude_Of_Center"),</span>
+<span class="add">                    new Identifier(Citation.GEOTIFF,  "CenterLong")</span>
+<span class="add">                },</span>
+<span class="add">                0, -180, 180, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #alpha_c}</span>
+<span class="add">         * parameter value. Valid values range is from -360 to -270, -90 to 90,</span>
+<span class="add">         * and 270 to 360 degrees. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor AZIMUTH = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.OPEN_GIS, "azimuth"),</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Azimuth"),</span>
+<span class="add">                    new Identifier(Citation.EPSG,     "Azimuth of initial line"),</span>
+<span class="add">                    new Identifier(Citation.GEOTIFF,  "AzimuthAngle")</span>
+<span class="add">                },</span>
+<span class="add">                0, -360, 360, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #rectGridAngle}</span>
+<span class="add">         * parameter value. It is an optional parameter with valid values ranging</span>
+<span class="add">         * from -360 to 360�. Default value is {@link #alpha_c}.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor RECTIFIED_GRID_ANGLE = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.OPEN_GIS, "rectified_grid_angle"),</span>
+<span class="add">                    new Identifier(Citation.EPSG,     "Angle from Rectified to Skew Grid"),</span>
+<span class="add">           new Identifier(Citation.ESRI,     "XY_Plane_Rotation"),</span>
+<span class="add">                    new Identifier(Citation.GEOTIFF,  "RectifiedGridAngle")</span>
+<span class="add">                },</span>
+<span class="add">                Double.NaN, -360, 360, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The parameters group.</span>
+<span class="add">         */</span>
+<span class="add">        static final ParameterDescriptorGroup PARAMETERS = createDescriptorGroup(new Identifier[] {</span>
+<span class="add">                new Identifier(Citation.OPEN_GIS, "Oblique_Mercator"),</span>
+<span class="add">                new Identifier(Citation.EPSG,     "Oblique Mercator"),</span>
+<span class="add">                new Identifier(Citation.EPSG,     "9815"),</span>
+<span class="add">                new Identifier(Citation.GEOTIFF,  "CT_ObliqueMercator"),</span>
+<span class="add">                new Identifier(Citation.ESRI,     "Hotine_Oblique_Mercator_Azimuth_Center"),</span>
+<span class="add">                new Identifier(Citation.ESRI,     "Rectified_Skew_Orthomorphic_Center"),</span>
+<span class="add">                new Identifier(Citation.GEOTOOLS, Resources.formatInternational(</span>
+<span class="add">                                                  ResourceKeys.OBLIQUE_MERCATOR_PROJECTION))</span>
+<span class="add">            }, new ParameterDescriptor[] {</span>
+<span class="add">                SEMI_MAJOR,          SEMI_MINOR,</span>
+<span class="add">                LONG_OF_CENTRE,      LAT_OF_CENTRE,</span>
+<span class="add">                AZIMUTH,             RECTIFIED_GRID_ANGLE,</span>
+<span class="add">                SCALE_FACTOR,</span>
+<span class="add">                FALSE_EASTING,       FALSE_NORTHING</span>
+<span class="add">            });</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Construct a new provider.</span>
+<span class="add">         */</span>
+<span class="add">        public Provider() {</span>
+<span class="add">            super(PARAMETERS);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Construct a new provider.</span>
+<span class="add">         */</span>
+<span class="add">        protected Provider(final ParameterDescriptorGroup params) {</span>
+<span class="add">            super(params);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Creates a transform from the specified group of parameter values.</span>
+<span class="add">         *</span>
+<span class="add">         * @param  parameters The group of parameter values.</span>
+<span class="add">         * @return The created math transform.</span>
+<span class="add">         * @throws ParameterNotFoundException if a required parameter was not found.</span>
+<span class="add">         */</span>
+<span class="add">        public MathTransform createMathTransform(final ParameterValueGroup parameters)</span>
+<span class="add">                throws ParameterNotFoundException</span>
+<span class="add">        {</span>
+<span class="add">            final Collection descriptors = PARAMETERS.descriptors();</span>
+<span class="add">            return new ObliqueMercator(parameters, descriptors, false, false);</span>
+<span class="add">        }</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The {@link org.geotools.referencing.operation.MathTransformProvider}</span>
+<span class="add">     * for a Hotine {@link ObliqueMercator} projection.</span>
+<span class="add">     *</span>
+<span class="add">     * @see org.geotools.referencing.operation.MathTransformFactory</span>
+<span class="add">     *</span>
+<span class="add">     * @version $Id$</span>
+<span class="add">     * @author Rueben Schulz</span>
+<span class="add">     */</span>
+<span class="add">    public static final class Provider_Hotine extends Provider {</span>
+<span class="add">        /**</span>
+<span class="add">         * The parameters group.</span>
+<span class="add">         */</span>
+<span class="add">        static final ParameterDescriptorGroup PARAMETERS = createDescriptorGroup(new Identifier[] {</span>
+<span class="add">                new Identifier(Citation.OPEN_GIS, "Hotine_Oblique_Mercator"),</span>
+<span class="add">                new Identifier(Citation.EPSG,     "Hotine Oblique Mercator"),</span>
+<span class="add">                new Identifier(Citation.EPSG,     "9812"),</span>
+<span class="add">                new Identifier(Citation.GEOTIFF,  "CT_ObliqueMercator_Hotine"),</span>
+<span class="add">                new Identifier(Citation.ESRI,     "Hotine_Oblique_Mercator_Azimuth_Natural_Origin"),</span>
+<span class="add">       new Identifier(Citation.ESRI,     "Rectified_Skew_Orthomorphic_Natural_Origin"),</span>
+<span class="add">                new Identifier(Citation.GEOTOOLS, Resources.formatInternational(</span>
+<span class="add">                                                  ResourceKeys.OBLIQUE_MERCATOR_PROJECTION))</span>
+<span class="add">            }, new ParameterDescriptor[] {</span>
+<span class="add">                SEMI_MAJOR,          SEMI_MINOR,</span>
+<span class="add">                LONG_OF_CENTRE,      LAT_OF_CENTRE,</span>
+<span class="add">                AZIMUTH,             RECTIFIED_GRID_ANGLE,</span>
+<span class="add">                SCALE_FACTOR,</span>
+<span class="add">                FALSE_EASTING,       FALSE_NORTHING</span>
+<span class="add">            });</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Construct a new provider.</span>
+<span class="add">         */</span>
+<span class="add">        public Provider_Hotine() {</span>
+<span class="add">            super(PARAMETERS);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Creates a transform from the specified group of parameter values.</span>
+<span class="add">         *</span>
+<span class="add">         * @param  parameters The group of parameter values.</span>
+<span class="add">         * @return The created math transform.</span>
+<span class="add">         * @throws ParameterNotFoundException if a required parameter was not found.</span>
+<span class="add">         */</span>
+<span class="add">        public MathTransform createMathTransform(final ParameterValueGroup parameters)</span>
+<span class="add">                throws ParameterNotFoundException</span>
+<span class="add">        {</span>
+<span class="add">            final Collection descriptors = PARAMETERS.descriptors();</span>
+<span class="add">            return new ObliqueMercator(parameters, descriptors, true, false);</span>
+<span class="add">        }</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The {@link org.geotools.referencing.operation.MathTransformProvider}</span>
+<span class="add">     * for a {@link ObliqueMercator} projection, specified with</span>
+<span class="add">     * two points on the central line (instead of a central point and azimuth).</span>
+<span class="add">     *</span>
+<span class="add">     * @see org.geotools.referencing.operation.MathTransformFactory</span>
+<span class="add">     *</span>
+<span class="add">     * @version $Id$</span>
+<span class="add">     * @author Rueben Schulz</span>
+<span class="add">     */</span>
+<span class="add">    public static class Provider_TwoPoint extends Provider {</span>
+<span class="add">           /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #latitudeOfCentre}</span>
+<span class="add">         * parameter value. Valid values range is from -90 to 90�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LAT_OF_CENTRE = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.OPEN_GIS, "latitude_of_center"),</span>
+<span class="add">                    new Identifier(Citation.EPSG,     "Latitude of projection centre"),</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Latitude_Of_Center"),</span>
+<span class="add">                    new Identifier(Citation.GEOTIFF,  "CenterLat")</span>
+<span class="add">                },</span>
+<span class="add">                0, -90, 90, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">            /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #latitudeOf1stPoint}</span>
+<span class="add">         * parameter value. Valid values range is from -90 to 90�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LAT_OF_1ST_POINT = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Latitude_Of_1st_Point")</span>
+<span class="add">                },</span>
+<span class="add">                0, -90, 90, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #longitudeOf1stPoint}</span>
+<span class="add">         * parameter value. Valid values range is from -180 to 180�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LONG_OF_1ST_POINT = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Longitude_Of_1st_Point")</span>
+<span class="add">                },</span>
+<span class="add">                0, -180, 180, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #latitudeOf2ndPoint}</span>
+<span class="add">         * parameter value. Valid values range is from -90 to 90�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LAT_OF_2ND_POINT = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Latitude_Of_2nd_Point")</span>
+<span class="add">                },</span>
+<span class="add">                0, -90, 90, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The operation parameter descriptor for the {@link #longitudeOf2ndPoint}</span>
+<span class="add">         * parameter value. Valid values range is from -180 to 180�. Default value is 0.</span>
+<span class="add">         */</span>
+<span class="add">        public static final ParameterDescriptor LONG_OF_2ND_POINT = createDescriptor(</span>
+<span class="add">                new Identifier[] {</span>
+<span class="add">                    new Identifier(Citation.ESRI,     "Longitude_Of_2nd_Point")</span>
+<span class="add">                },</span>
+<span class="add">                0, -180, 180, NonSI.DEGREE_ANGLE);</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * The parameters group.</span>
+<span class="add">         */</span>
+<span class="add">        static final ParameterDescriptorGroup PARAMETERS = createDescriptorGroup(new Identifier[] {</span>
+<span class="add">                new Identifier(Citation.ESRI,     "Hotine_Oblique_Mercator_Two_Point_Center"),</span>
+<span class="add">                new Identifier(Citation.GEOTOOLS, Resources.formatInternational(</span>
+<span class="add">                                                  ResourceKeys.OBLIQUE_MERCATOR_PROJECTION))</span>
+<span class="add">            }, new ParameterDescriptor[] {</span>
+<span class="add">                SEMI_MAJOR,          SEMI_MINOR,</span>
+<span class="add">                LAT_OF_1ST_POINT,    LONG_OF_1ST_POINT,</span>
+<span class="add">                LAT_OF_2ND_POINT,    LONG_OF_2ND_POINT,</span>
+<span class="add">            LAT_OF_CENTRE,       SCALE_FACTOR,</span>
+<span class="add">                FALSE_EASTING,       FALSE_NORTHING</span>
+<span class="add">            });</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Construct a new provider.</span>
+<span class="add">         */</span>
+<span class="add">        public Provider_TwoPoint() {</span>
+<span class="add">            super(PARAMETERS);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Construct a new provider.</span>
+<span class="add">         */</span>
+<span class="add">        protected Provider_TwoPoint(final ParameterDescriptorGroup params) {</span>
+<span class="add">            super(params);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Creates a transform from the specified group of parameter values.</span>
+<span class="add">         *</span>
+<span class="add">         * @param  parameters The group of parameter values.</span>
+<span class="add">         * @return The created math transform.</span>
+<span class="add">         * @throws ParameterNotFoundException if a required parameter was not found.</span>
+<span class="add">         */</span>
+<span class="add">        public MathTransform createMathTransform(final ParameterValueGroup parameters)</span>
+<span class="add">                throws ParameterNotFoundException</span>
+<span class="add">        {</span>
+<span class="add">            final Collection descriptors = PARAMETERS.descriptors();</span>
+<span class="add">            return new ObliqueMercator(parameters, descriptors, false, true);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * The {@link org.geotools.referencing.operation.MathTransformProvider}</span>
+<span class="add">     * for a Hotine {@link ObliqueMercator} projection, specified with</span>
+<span class="add">     * two points on the central line (instead of a central point and azimuth).</span>
+<span class="add">     *</span>
+<span class="add">     * @see org.geotools.referencing.operation.MathTransformFactory</span>
+<span class="add">     *</span>
+<span class="add">     * @version $Id$</span>
+<span class="add">     * @author Rueben Schulz</span>
+<span class="add">     */</span>
+<span class="add">    public static final class Provider_Hotine_TwoPoint extends Provider_TwoPoint {</span>
+<span class="add">        /**</span>
+<span class="add">         * The parameters group.</span>
+<span class="add">         */</span>
+<span class="add">        static final ParameterDescriptorGroup PARAMETERS = createDescriptorGroup(new Identifier[] {</span>
+<span class="add">                new Identifier(Citation.ESRI,     "Hotine_Oblique_Mercator_Two_Point_Natural_Origin"),</span>
+<span class="add">                new Identifier(Citation.GEOTOOLS, Resources.formatInternational(</span>
+<span class="add">                                                  ResourceKeys.OBLIQUE_MERCATOR_PROJECTION))</span>
+<span class="add">            }, new ParameterDescriptor[] {</span>
+<span class="add">                SEMI_MAJOR,          SEMI_MINOR,</span>
+<span class="add">                LAT_OF_1ST_POINT,    LONG_OF_1ST_POINT,</span>
+<span class="add">                LAT_OF_2ND_POINT,    LONG_OF_2ND_POINT,</span>
+<span class="add">       LAT_OF_CENTRE,       SCALE_FACTOR,</span>
+<span class="add">                FALSE_EASTING,       FALSE_NORTHING</span>
+<span class="add">            });</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Construct a new provider.</span>
+<span class="add">         */</span>
+<span class="add">        public Provider_Hotine_TwoPoint() {</span>
+<span class="add">            super(PARAMETERS);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        /**</span>
+<span class="add">         * Creates a transform from the specified group of parameter values.</span>
+<span class="add">         *</span>
+<span class="add">         * @param  parameters The group of parameter values.</span>
+<span class="add">         * @return The created math transform.</span>
+<span class="add">         * @throws ParameterNotFoundException if a required parameter was not found.</span>
+<span class="add">         */</span>
+<span class="add">        public MathTransform createMathTransform(final ParameterValueGroup parameters)</span>
+<span class="add">                throws ParameterNotFoundException</span>
+<span class="add">        {</span>
+<span class="add">            final Collection descriptors = PARAMETERS.descriptors();</span>
+<span class="add">            return new ObliqueMercator(parameters, descriptors, true, true);</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Construct a new map projection from the supplied parameters.</span>
+<span class="add">     *</span>
+<span class="add">     * @param  parameters The parameter values in standard units.</span>
+<span class="add">     * @param  expected The expected parameter descriptors.</span>
+<span class="add">     * @throws ParameterNotFoundException if a mandatory parameter is missing.</span>
+<span class="add">     */</span>
+<span class="add">    ObliqueMercator(final ParameterValueGroup parameters, final Collection expected,</span>
+<span class="add">                    final boolean hotine, final boolean twoPoint)</span>
+<span class="add">            throws ParameterNotFoundException</span>
+<span class="add">    {</span>
+<span class="add">        //Fetch parameters</span>
+<span class="add">        super(parameters, expected);</span>
+<span class="add"></span>
+<span class="add">        this.hotine = hotine;</span>
+<span class="add">        this.twoPoint = twoPoint;</span>
+<span class="add"></span>
+<span class="add">        //NaN for safety (centralMeridian calculated below)</span>
+<span class="add">        latitudeOfOrigin = Double.NaN;</span>
+<span class="add">        centralMeridian  = Double.NaN;</span>
+<span class="add"></span>
+<span class="add">        latitudeOfCentre = doubleValue(expected, Provider.LAT_OF_CENTRE, parameters);</span>
+<span class="add">        //checks that latitudeOfCentre is not +- 90 degrees</span>
+<span class="add">        //not checking if latitudeOfCentere is 0, since equations behave correctly</span>
+<span class="add">        ensureLatitudeInRange(Provider.LAT_OF_CENTRE, latitudeOfCentre, false);</span>
+<span class="add"></span>
+<span class="add">        if(twoPoint) {</span>
+<span class="add">            longitudeOfCentre = Double.NaN;</span>
+<span class="add"></span>
+<span class="add">            latitudeOf1stPoint = doubleValue(expected, Provider_TwoPoint.LAT_OF_1ST_POINT, parameters);</span>
+<span class="add">            //checks that latOf1stPoint is not +-90 degrees</span>
+<span class="add">            ensureLatitudeInRange(Provider_TwoPoint.LAT_OF_1ST_POINT, latitudeOf1stPoint, false);</span>
+<span class="add">            longitudeOf1stPoint = doubleValue(expected, Provider_TwoPoint.LONG_OF_1ST_POINT, parameters);</span>
+<span class="add">            ensureLongitudeInRange(Provider_TwoPoint.LONG_OF_1ST_POINT, longitudeOf1stPoint, true);</span>
+<span class="add">            latitudeOf2ndPoint = doubleValue(expected, Provider_TwoPoint.LAT_OF_2ND_POINT, parameters);</span>
+<span class="add">            ensureLatitudeInRange(Provider_TwoPoint.LAT_OF_2ND_POINT, latitudeOf2ndPoint, true);</span>
+<span class="add">            longitudeOf2ndPoint = doubleValue(expected, Provider_TwoPoint.LONG_OF_2ND_POINT, parameters);</span>
+<span class="add">            ensureLongitudeInRange(Provider_TwoPoint.LONG_OF_2ND_POINT, longitudeOf2ndPoint, true);</span>
+<span class="add"></span>
+<span class="add">            double con = Math.abs(latitudeOf1stPoint);</span>
+<span class="add">            if (Math.abs(latitudeOf1stPoint - latitudeOf2ndPoint) &lt; TOL) {</span>
+<span class="add">                throw new IllegalArgumentException(Resources.format(ResourceKeys.ERROR_LAT1_EQ_LAT2));</span>
+<span class="add">            }</span>
+<span class="add">            if (Math.abs(latitudeOf1stPoint) &lt; TOL) {</span>
+<span class="add">                throw new IllegalArgumentException(Resources.format(ResourceKeys.ERROR_LAT1_EQ_ZERO));</span>
+<span class="add">            }</span>
+<span class="add">            if (Math.abs(latitudeOf2ndPoint + Math.PI/2.0) &lt; TOL) {</span>
+<span class="add">                throw new IllegalArgumentException(Resources.format(ResourceKeys.ERROR_LAT2_EQ_NEG_90));</span>
+<span class="add">            }</span>
+<span class="add">        } else {</span>
+<span class="add">        latitudeOf1stPoint = Double.NaN;</span>
+<span class="add">            longitudeOf1stPoint = Double.NaN;</span>
+<span class="add">            latitudeOf2ndPoint = Double.NaN;</span>
+<span class="add">            longitudeOf2ndPoint = Double.NaN;</span>
+<span class="add"></span>
+<span class="add">            longitudeOfCentre = doubleValue(expected, Provider.LONG_OF_CENTRE, parameters);</span>
+<span class="add">            ensureLongitudeInRange(Provider.LONG_OF_CENTRE, longitudeOfCentre, true);</span>
+<span class="add"></span>
+<span class="add">            alpha_c = doubleValue(expected, Provider.AZIMUTH, parameters);</span>
+<span class="add">            //already checked for +-360 deg. above.</span>
+<span class="add">            if ((alpha_c &gt; -1.5*Math.PI &amp;&amp; alpha_c &lt; -0.5*Math.PI) ||</span>
+<span class="add">                (alpha_c &gt; 0.5*Math.PI &amp;&amp; alpha_c &lt; 1.5*Math.PI)) {</span>
+<span class="add">                    throw new IllegalArgumentException(</span>
+<span class="add">                        Resources.format(ResourceKeys.ERROR_VALUE_OUT_OF_BOUNDS_$3,</span>
+<span class="add">                        new Double(Math.toDegrees(alpha_c)), new Double(-90), new Double(90)));</span>
+<span class="add">            }</span>
+<span class="add"></span>
+<span class="add">            rectGridAngle = doubleValue(expected, Provider.RECTIFIED_GRID_ANGLE, parameters);</span>
+<span class="add">            if (Double.isNaN(rectGridAngle)) {</span>
+<span class="add">                rectGridAngle = alpha_c;</span>
+<span class="add">            }</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        double com = Math.sqrt(1.0-excentricitySquared);</span>
+<span class="add">        double sinphi0 = Math.sin(latitudeOfCentre);</span>
+<span class="add">        double cosphi0 = Math.cos(latitudeOfCentre);</span>
+<span class="add">        B = cosphi0 * cosphi0;</span>
+<span class="add">        B = Math.sqrt(1.0 + excentricitySquared * B * B / (1.0-excentricitySquared));</span>
+<span class="add">        double con = 1.0 - excentricitySquared * sinphi0 * sinphi0;</span>
+<span class="add">        A = B * com / con;</span>
+<span class="add">        double D = B * com / (cosphi0 * Math.sqrt(con));</span>
+<span class="add">        double F = D * D - 1.0;</span>
+<span class="add">        if (F &lt; 0.0) {</span>
+<span class="add">            F = 0.0;</span>
+<span class="add">        } else {</span>
+<span class="add">            F = Math.sqrt(F);</span>
+<span class="add">            if (latitudeOfCentre &lt; 0.0) {  //taking sign of latOfCentre</span>
+<span class="add">                F = -F;</span>
+<span class="add">            }</span>
+<span class="add">        }</span>
+<span class="add">        F = F += D;</span>
+<span class="add">        E = F* Math.pow(tsfn(latitudeOfCentre, sinphi0), B);</span>
+<span class="add"></span>
+<span class="add">        double gamma0;</span>
+<span class="add">        if (twoPoint) {</span>
+<span class="add">            double H = Math.pow(tsfn(latitudeOf1stPoint, Math.sin(latitudeOf1stPoint)), B);</span>
+<span class="add">            double L = Math.pow(tsfn(latitudeOf2ndPoint, Math.sin(latitudeOf2ndPoint)), B);</span>
+<span class="add">            double Fp = E / H;</span>
+<span class="add">            double P = (L - H) / (L + H);</span>
+<span class="add">            double J = E * E;</span>
+<span class="add">            J = (J - L * H) / (J + L * H);</span>
+<span class="add">            double diff = longitudeOf1stPoint - longitudeOf2ndPoint;</span>
+<span class="add">            if (diff &lt; -Math.PI) {</span>
+<span class="add">                longitudeOf2ndPoint -= 2.0* Math.PI;</span>
+<span class="add">            } else if (diff &gt; Math.PI) {</span>
+<span class="add">                longitudeOf2ndPoint += 2.0* Math.PI;</span>
+<span class="add">            }</span>
+<span class="add"></span>
+<span class="add">            centralMeridian = rollLongitude(0.5 * (longitudeOf1stPoint + longitudeOf2ndPoint) -</span>
+<span class="add">                              Math.atan(J * Math.tan(0.5 * B * (longitudeOf1stPoint - longitudeOf2ndPoint)) / P) / B);</span>
+<span class="add">            gamma0 = Math.atan(2.0 * Math.sin(B * rollLongitude(longitudeOf1stPoint - centralMeridian)) /</span>
+<span class="add">                     (Fp - 1.0 / Fp));</span>
+<span class="add">            alpha_c = Math.asin(D * Math.sin(gamma0));</span>
+<span class="add">            rectGridAngle = alpha_c;</span>
+<span class="add">        } else {</span>
+<span class="add">            gamma0 = Math.asin(Math.sin(alpha_c) / D);</span>
+<span class="add">            //check for asin(+-1.00000001)</span>
+<span class="add">            double temp = 0.5 * (F - 1.0 / F) * Math.tan(gamma0);</span>
+<span class="add">            if (Math.abs(temp) &gt; 1.0) {</span>
+<span class="add">                if (Math.abs(Math.abs(temp) - 1.0) &gt; EPS) {</span>
+<span class="add">                    throw new IllegalArgumentException("Tolerance condition error");</span>
+<span class="add">                }</span>
+<span class="add">                temp = (temp &gt; 0) ? 1.0 : -1.0;</span>
+<span class="add">            }</span>
+<span class="add">            centralMeridian = longitudeOfCentre - Math.asin(temp) / B;</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        singamma0 = Math.sin(gamma0);</span>
+<span class="add">        cosgamma0 = Math.cos(gamma0);</span>
+<span class="add">    sinrot = Math.sin(rectGridAngle);</span>
+<span class="add">    cosrot = Math.cos(rectGridAngle);</span>
+<span class="add">        ArB = A/B;</span>
+<span class="add">        AB = A*B;</span>
+<span class="add">        BrA = B/A;</span>
+<span class="add">        v_pole_n = ArB * Math.log(Math.tan(0.5 * (Math.PI/2.0 - gamma0)));</span>
+<span class="add">        v_pole_s = ArB * Math.log(Math.tan(0.5 * (Math.PI/2.0 + gamma0)));</span>
+<span class="add"></span>
+<span class="add">        if (hotine) {</span>
+<span class="add">            u_c = 0.0;</span>
+<span class="add">        } else {</span>
+<span class="add">            if (Math.abs(Math.abs(alpha_c) - Math.PI/2.0) &lt; TOL) {</span>
+<span class="add">                //longitudeOfCentre = NaN in twopoint, but alpha_c cannot be 90 here (lat1 != lat2)</span>
+<span class="add">                u_c = A * (longitudeOfCentre - centralMeridian);</span>
+<span class="add">            } else {</span>
+<span class="add">                u_c = Math.abs(ArB * Math.atan2(Math.sqrt(D * D - 1.0), Math.cos(alpha_c)));</span>
+<span class="add">                if (latitudeOfCentre &lt; 0.0) {</span>
+<span class="add">                    u_c = -u_c;</span>
+<span class="add">                }</span>
+<span class="add">            }</span>
+<span class="add">        }</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * {@inheritDoc}</span>
+<span class="add">     */</span>
+<span class="add">    public ParameterDescriptorGroup getParameterDescriptors() {</span>
+<span class="add">        if (hotine) {</span>
+<span class="add">            return (twoPoint) ? Provider_Hotine_TwoPoint.PARAMETERS : Provider_Hotine.PARAMETERS;</span>
+<span class="add">        } else {</span>
+<span class="add">            return (twoPoint) ? Provider_TwoPoint.PARAMETERS : Provider.PARAMETERS;</span>
+<span class="add">        }</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * {@inheritDoc}</span>
+<span class="add">     */</span>
+<span class="add">    public ParameterValueGroup getParameterValues() {</span>
+<span class="add">        final ParameterValueGroup values = super.getParameterValues();</span>
+<span class="add">        final Collection expected = getParameterDescriptors().descriptors();</span>
+<span class="add">        if (twoPoint) {</span>
+<span class="add">            set(expected, Provider_TwoPoint.LAT_OF_CENTRE, values, latitudeOfCentre);</span>
+<span class="add">            set(expected, Provider_TwoPoint.LAT_OF_1ST_POINT, values, latitudeOf1stPoint);</span>
+<span class="add">            set(expected, Provider_TwoPoint.LONG_OF_1ST_POINT, values, longitudeOf1stPoint);</span>
+<span class="add">            set(expected, Provider_TwoPoint.LAT_OF_2ND_POINT, values, latitudeOf2ndPoint);</span>
+<span class="add">            set(expected, Provider_TwoPoint.LONG_OF_2ND_POINT, values, longitudeOf2ndPoint);</span>
+<span class="add">        } else {</span>
+<span class="add">            set(expected, Provider.LAT_OF_CENTRE, values, latitudeOfCentre);</span>
+<span class="add">            set(expected, Provider.LONG_OF_CENTRE, values, longitudeOfCentre);</span>
+<span class="add">            set(expected, Provider.AZIMUTH, values, alpha_c );</span>
+<span class="add">            set(expected, Provider.RECTIFIED_GRID_ANGLE, values, rectGridAngle);</span>
+<span class="add">        }</span>
+<span class="add">        return values;</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    protected Point2D transformNormalized(double x, double y, Point2D ptDst)</span>
+<span class="add">            throws ProjectionException</span>
+<span class="add">    {</span>
+<span class="add">        double u, v;</span>
+<span class="add">        if (Math.abs(Math.abs(y) - Math.PI/2.0) &gt; EPS) {</span>
+<span class="add">            double Q = E / Math.pow(tsfn(y, Math.sin(y)), B);</span>
+<span class="add">            double temp = 1.0 / Q;</span>
+<span class="add">            double S = 0.5 * (Q - temp);</span>
+<span class="add">            double V = Math.sin(B * x);</span>
+<span class="add">            double U = (S * singamma0 - V * cosgamma0) / (0.5 * (Q + temp));</span>
+<span class="add">            if (Math.abs(Math.abs(U) - 1.0) &lt; EPS) {</span>
+<span class="add">                throw new ProjectionException(Resources.format(ResourceKeys.ERROR_V_INFINITE));</span>
+<span class="add">            }</span>
+<span class="add">            v = 0.5 * ArB * Math.log((1.0 - U) / (1.0 + U));</span>
+<span class="add">            temp = Math.cos(B * x);</span>
+<span class="add">            if (Math.abs(temp) &lt; TOL) {</span>
+<span class="add">                u = AB * x;</span>
+<span class="add">            } else {</span>
+<span class="add">                u = ArB * Math.atan2((S * cosgamma0 + V * singamma0), temp);</span>
+<span class="add">            }</span>
+<span class="add">        } else {</span>
+<span class="add">            v = y &gt; 0 ? v_pole_n : v_pole_s;</span>
+<span class="add">        u = ArB * y;</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        u -= u_c;</span>
+<span class="add">    x = v * cosrot + u * sinrot;</span>
+<span class="add">    y = u * cosrot - v * sinrot;</span>
+<span class="add"></span>
+<span class="add">        if (ptDst != null) {</span>
+<span class="add">            ptDst.setLocation(x,y);</span>
+<span class="add">            return ptDst;</span>
+<span class="add">        }</span>
+<span class="add">        return new Point2D.Double(x,y);</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    protected Point2D inverseTransformNormalized(double x, double y, Point2D ptDst)</span>
+<span class="add">            throws ProjectionException</span>
+<span class="add">    {</span>
+<span class="add">    double v = x * cosrot - y * sinrot;</span>
+<span class="add">        double u = y * cosrot + x * sinrot + u_c;</span>
+<span class="add"></span>
+<span class="add">        double Qp = Math.exp(-BrA * v);</span>
+<span class="add">        double temp = 1.0 / Qp;</span>
+<span class="add">        double Sp = 0.5 * (Qp - temp);</span>
+<span class="add">        double Vp = Math.sin(BrA * u);</span>
+<span class="add">        double Up = (Vp * cosgamma0 + Sp * singamma0) / (0.5 * (Qp + temp));</span>
+<span class="add">        if (Math.abs(Math.abs(Up) - 1.0) &lt; EPS) {</span>
+<span class="add">            x = 0.0;</span>
+<span class="add">            y = Up &lt; 0.0 ? -Math.PI / 2.0 : Math.PI / 2.0;</span>
+<span class="add">        } else {</span>
+<span class="add">            y = Math.pow(E / Math.sqrt((1. + Up) / (1. - Up)), 1.0 / B);  //calculate t</span>
+<span class="add">            y = cphi2(y);</span>
+<span class="add">            x = -Math.atan2((Sp * cosgamma0 - Vp * singamma0), Math.cos(BrA * u)) / B;</span>
+<span class="add">        }</span>
+<span class="add"></span>
+<span class="add">        if (ptDst != null) {</span>
+<span class="add">            ptDst.setLocation(x,y);</span>
+<span class="add">            return ptDst;</span>
+<span class="add">        }</span>
+<span class="add">        return new Point2D.Double(x,y);</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Returns a hash value for this projection.</span>
+<span class="add">     */</span>
+<span class="add">    public int hashCode() {</span>
+<span class="add">        long code =      Double.doubleToLongBits(latitudeOfCentre);</span>
+<span class="add">        code = code*37 + Double.doubleToLongBits(longitudeOfCentre);</span>
+<span class="add">        code = code*37 + Double.doubleToLongBits(alpha_c);</span>
+<span class="add">        code = code*37 + Double.doubleToLongBits(rectGridAngle);</span>
+<span class="add">        code = code*37 + Double.doubleToLongBits(latitudeOf1stPoint);</span>
+<span class="add">        code = code*37 + Double.doubleToLongBits(latitudeOf2ndPoint);</span>
+<span class="add">        return ((int)code ^ (int)(code &gt;&gt;&gt; 32)) + 37*super.hashCode();</span>
+<span class="add">    }</span>
+<span class="add"></span>
+<span class="add">    /**</span>
+<span class="add">     * Compares the specified object with this map projection for equality.</span>
+<span class="add">     */</span>
+<span class="add">    public boolean equals(final Object object) {</span>
+<span class="add">        if (object == this) {</span>
+<span class="add">            // Slight optimization</span>
+<span class="add">            return true;</span>
+<span class="add">        }</span>
+<span class="add">        if (super.equals(object)) {</span>
+<span class="add">            final ObliqueMercator that = (ObliqueMercator) object;</span>
+<span class="add">            return equals(this.latitudeOfCentre   , that.latitudeOfCentre   ) &amp;&amp;</span>
+<span class="add">                   equals(this.longitudeOfCentre  , that.longitudeOfCentre  ) &amp;&amp;</span>
+<span class="add">                   equals(this.alpha_c            , that.alpha_c            ) &amp;&amp;</span>
+<span class="add">                   equals(this.rectGridAngle      , that.rectGridAngle      ) &amp;&amp;</span>
+<span class="add">                   equals(this.u_c                , that.u_c                ) &amp;&amp;</span>
+<span class="add">          equals(this.latitudeOf1stPoint , that.latitudeOf1stPoint ) &amp;&amp;</span>
+<span class="add">               equals(this.longitudeOf1stPoint, that.longitudeOf1stPoint) &amp;&amp;</span>
+<span class="add">          equals(this.latitudeOf2ndPoint , that.latitudeOf2ndPoint ) &amp;&amp;</span>
+<span class="add">          equals(this.longitudeOf2ndPoint, that.longitudeOf2ndPoint) &amp;&amp;</span>
+<span class="add">                   this.twoPoint == that.twoPoint &amp;&amp;</span>
+<span class="add">                   this.hotine   == that.hotine;</span>
+<span class="add">        }</span>
+<span class="add">        return false;</span>
+<span class="add">    }</span>
+<span class="add">}</span></pre></td></tr>
+</table>
+    </div>
+  </body>
+</html>

Modified: sis/ip-review/rev/11373/AlbersEqualArea.xhtml
URL: http://svn.apache.org/viewvc/sis/ip-review/rev/11373/AlbersEqualArea.xhtml?rev=1828645&r1=1828644&r2=1828645&view=diff
==============================================================================
--- sis/ip-review/rev/11373/AlbersEqualArea.xhtml (original)
+++ sis/ip-review/rev/11373/AlbersEqualArea.xhtml Sun Apr  8 15:49:37 2018
@@ -10,7 +10,7 @@
   <body>
     <div>
       <h1>AlbersEqualArea changes for revisions 11372:11373</h1>
-      <p>This can of check is not applied anymore in Apache SIS.
+      <p>This kind of check is not applied anymore in Apache SIS.
       Instead we let the mathematical functions do their "natural" work, which may be to return NaN of infinity.</p>
 
 <p><b>Command line:</b></p>

Added: sis/ip-review/rev/20874/ObliqueMercator.xhtml
URL: http://svn.apache.org/viewvc/sis/ip-review/rev/20874/ObliqueMercator.xhtml?rev=1828645&view=auto
==============================================================================
--- sis/ip-review/rev/20874/ObliqueMercator.xhtml (added)
+++ sis/ip-review/rev/20874/ObliqueMercator.xhtml Sun Apr  8 15:49:37 2018
@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html xmlns="http://www.w3.org/1999/xhtml">
+  <head>
+    <meta charset="UTF-8"/>
+    <title>ObliqueMercator changes for revisions 20873:20874</title>
+    <style type="text/css" media="all">
+      @import url("../../reports.css");
+    </style>
+  </head>
+  <body>
+    <div>
+      <h1>ObliqueMercator changes for revisions 20873:20874</h1>
+<p>Does not apply to Apache SIS since this class has been rewritten from scratch.</p>
+<p><b>Command line:</b></p>
+<blockquote><code>svn diff --extensions "--unified --ignore-space-change --ignore-all-space --ignore-eol-style" -r20873:20874 http://svn.osgeo.org/geotools/trunk/modules/library/referencing/src/main/java/org/geotools/referencing/operation/projection/ObliqueMercator.java</code></blockquote>
+<table class="changes">
+<tr><th>Revision 20873</th><th>Revision 20874</th></tr>
+<tr><td><pre>/*
+<span class="del"> * Geotools - OpenSource mapping toolkit</span>
+<span class="del"> * (C) 2005, Geotools Project Managment Committee (PMC)</span>
+ * (C) 2003, Gerald I. Evenden
+ * (C) 2000, Frank Warmerdam
+ *</pre></td>
+<td><pre>/*
+<span class="add"> *    GeoTools - OpenSource mapping toolkit</span>
+<span class="add"> *    http://geotools.org</span>
+<span class="add"> *</span>
+<span class="add"> *   (C) 2005-2006, Geotools Project Managment Committee (PMC)</span>
+ * (C) 2003, Gerald I. Evenden
+ * (C) 2000, Frank Warmerdam
+ *</pre></td></tr>
+<tr><td><pre>*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+*    Lesser General Public License for more details.
+*
+<span class="del">*</span>
+*    This package contains formulas from the PROJ package of USGS.
+*    USGS's work is fully acknowledged here. This derived work has
+*    been relicensed under LGPL with Frank Warmerdam's permission.</pre></td>
+<td><pre>*    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+*    Lesser General Public License for more details.
+*
+*    This package contains formulas from the PROJ package of USGS.
+*    USGS's work is fully acknowledged here. This derived work has
+*    been relicensed under LGPL with Frank Warmerdam's permission.</pre></td></tr>
+</table>
+    </div>
+  </body>
+</html>



Mime
View raw message