diff options
| author | Even Rouault <even.rouault@spatialys.com> | 2021-09-15 11:20:28 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-15 11:20:28 +0200 |
| commit | e6e4d5aa20cfc64b1b41eb6dd6d4516e0ea4807e (patch) | |
| tree | 70ee380c12a202a82b4883783cb40f120ebb533a /src | |
| parent | 47fb85bdf0e45bf5660e0b1dbde7b76f8824a87a (diff) | |
| parent | d209e4ab62e9ab6f1c3825acd518bec421aebf12 (diff) | |
| download | PROJ-e6e4d5aa20cfc64b1b41eb6dd6d4516e0ea4807e.tar.gz PROJ-e6e4d5aa20cfc64b1b41eb6dd6d4516e0ea4807e.zip | |
Merge pull request #2853 from rouault/fix_inverse_ortho_e
Fix error in implementation of Inverse ellipsoidal orthographic projection that cause convergence to sometimes fail (fixes #2844)
Diffstat (limited to 'src')
| -rw-r--r-- | src/projections/ortho.cpp | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/src/projections/ortho.cpp b/src/projections/ortho.cpp index 908f283d..c334f398 100644 --- a/src/projections/ortho.cpp +++ b/src/projections/ortho.cpp @@ -254,15 +254,23 @@ static PJ_LP ortho_e_inverse (PJ_XY xy, PJ *P) { /* Ellipsoidal, inver const double J11 = -rho * sinphi * sinlam; const double J12 = nu * cosphi * coslam; const double J21 = rho * (cosphi * Q->cosph0 + sinphi * Q->sinph0 * coslam); - const double J22 = nu * Q->sinph0 * Q->cosph0 * sinlam; + const double J22 = nu * Q->sinph0 * cosphi * sinlam; const double D = J11 * J22 - J12 * J21; const double dx = xy.x - xy_new.x; const double dy = xy.y - xy_new.y; const double dphi = (J22 * dx - J12 * dy) / D; const double dlam = (-J21 * dx + J11 * dy) / D; lp.phi += dphi; - if( lp.phi > M_PI_2) lp.phi = M_PI_2; - else if( lp.phi < -M_PI_2) lp.phi = -M_PI_2; + if( lp.phi > M_PI_2) + { + lp.phi = M_PI_2 - (M_PI_2 - lp.phi); + lp.lam = adjlon(lp.lam + 180); + } + else if( lp.phi < -M_PI_2) + { + lp.phi = -M_PI_2 + (-M_PI_2 - lp.phi); + lp.lam = adjlon(lp.lam + 180); + } lp.lam += dlam; if( fabs(dphi) < 1e-12 && fabs(dlam) < 1e-12 ) { |
