From eafeb61ce59aeb34dabf38f55f70ba9a3b779c4b Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Mon, 6 Jan 2020 23:03:29 +0100 Subject: Grid refactoring: address review comments of https://github.com/OSGeo/PROJ/pull/1777 - Move content of legacy apply_gridshift.cpp and apply_vgridshift.cpp in grids.cpp - Rename nad_ functions to pj_hgrid_ - Rename internal proj_hgrid_/proj_vgrid_ functions to pj_ --- src/transformations/xyzgridshift.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/transformations/xyzgridshift.cpp') diff --git a/src/transformations/xyzgridshift.cpp b/src/transformations/xyzgridshift.cpp index a76f3255..3ec3863c 100644 --- a/src/transformations/xyzgridshift.cpp +++ b/src/transformations/xyzgridshift.cpp @@ -77,7 +77,7 @@ static bool get_grid_values(PJ* P, { if ( Q->defer_grid_opening ) { Q->defer_grid_opening = false; - Q->grids = proj_generic_grid_init(P, "grids"); + Q->grids = pj_generic_grid_init(P, "grids"); if ( proj_errno(P) ) { return false; } @@ -341,7 +341,7 @@ PJ *TRANSFORMATION(xyzgridshift,0) { Q->defer_grid_opening = true; } else { - Q->grids = proj_generic_grid_init(P, "grids"); + Q->grids = pj_generic_grid_init(P, "grids"); /* Was gridlist compiled properly? */ if ( proj_errno(P) ) { proj_log_error(P, "xyzgridshift: could not find required grid(s)."); -- cgit v1.2.3 From 237296b7e84a8bb270e3be06a690737a601d73e7 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 7 Jan 2020 03:37:23 +0100 Subject: Remote grid: add mechanism to re-open a grid if it has changed while being opened --- src/transformations/xyzgridshift.cpp | 48 +++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 23 deletions(-) (limited to 'src/transformations/xyzgridshift.cpp') diff --git a/src/transformations/xyzgridshift.cpp b/src/transformations/xyzgridshift.cpp index 3ec3863c..4a85fb4c 100644 --- a/src/transformations/xyzgridshift.cpp +++ b/src/transformations/xyzgridshift.cpp @@ -55,13 +55,16 @@ struct xyzgridshiftData { // --------------------------------------------------------------------------- static const GenericShiftGrid* findGrid(const ListOfGenericGrids& grids, - const PJ_LP& input) + const PJ_LP& input, + GenericShiftGridSet *&gridSetOut) { for( const auto& gridset: grids ) { auto grid = gridset->gridAt(input.lam, input.phi); - if( grid ) + if( grid ) { + gridSetOut = gridset.get(); return grid; + } } return nullptr; } @@ -83,7 +86,8 @@ static bool get_grid_values(PJ* P, } } - auto grid = findGrid(Q->grids, lp); + GenericShiftGridSet* gridset = nullptr; + auto grid = findGrid(Q->grids, lp, gridset); if( !grid ) { return false; } @@ -127,30 +131,28 @@ static bool get_grid_values(PJ* P, int iy2 = std::min(iy + 1, grid->height() - 1); float dx1, dy1, dz1; - if( !grid->valueAt(ix, iy, sampleX, dx1) || - !grid->valueAt(ix, iy, sampleY, dy1) || - !grid->valueAt(ix, iy, sampleZ, dz1) ) { - return false; - } - float dx2, dy2, dz2; - if( !grid->valueAt(ix2, iy, sampleX, dx2) || - !grid->valueAt(ix2, iy, sampleY, dy2) || - !grid->valueAt(ix2, iy, sampleZ, dz2) ) { - return false; - } - float dx3, dy3, dz3; - if( !grid->valueAt(ix, iy2, sampleX, dx3) || - !grid->valueAt(ix, iy2, sampleY, dy3) || - !grid->valueAt(ix, iy2, sampleZ, dz3) ) { - return false; - } - float dx4, dy4, dz4; - if( !grid->valueAt(ix2, iy2, sampleX, dx4) || + bool error =( !grid->valueAt(ix, iy, sampleX, dx1) || + !grid->valueAt(ix, iy, sampleY, dy1) || + !grid->valueAt(ix, iy, sampleZ, dz1) || + !grid->valueAt(ix2, iy, sampleX, dx2) || + !grid->valueAt(ix2, iy, sampleY, dy2) || + !grid->valueAt(ix2, iy, sampleZ, dz2) || + !grid->valueAt(ix, iy2, sampleX, dx3) || + !grid->valueAt(ix, iy2, sampleY, dy3) || + !grid->valueAt(ix, iy2, sampleZ, dz3) || + !grid->valueAt(ix2, iy2, sampleX, dx4) || !grid->valueAt(ix2, iy2, sampleY, dy4) || - !grid->valueAt(ix2, iy2, sampleZ, dz4) ) { + !grid->valueAt(ix2, iy2, sampleZ, dz4) ); + if( grid->hasChanged() ) { + if( gridset->reopen(P->ctx) ) { + return get_grid_values( P, Q, lp, dx, dy, dz); + } + error = true; + } + if( error ) { return false; } -- cgit v1.2.3 From 408cb1e4279786e3729e942c2f8b2ee2ad435c94 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Tue, 7 Jan 2020 15:01:36 +0100 Subject: deformation.cpp and xyzgridshift.cpp: factor out common code (addresses https://github.com/OSGeo/PROJ/pull/1790#discussion_r363748615) --- src/transformations/xyzgridshift.cpp | 74 ++++++------------------------------ 1 file changed, 11 insertions(+), 63 deletions(-) (limited to 'src/transformations/xyzgridshift.cpp') diff --git a/src/transformations/xyzgridshift.cpp b/src/transformations/xyzgridshift.cpp index 4a85fb4c..e1c76518 100644 --- a/src/transformations/xyzgridshift.cpp +++ b/src/transformations/xyzgridshift.cpp @@ -51,24 +51,6 @@ struct xyzgridshiftData { }; } // anonymous namespace - -// --------------------------------------------------------------------------- - -static const GenericShiftGrid* findGrid(const ListOfGenericGrids& grids, - const PJ_LP& input, - GenericShiftGridSet *&gridSetOut) -{ - for( const auto& gridset: grids ) - { - auto grid = gridset->gridAt(input.lam, input.phi); - if( grid ) { - gridSetOut = gridset.get(); - return grid; - } - } - return nullptr; -} - // --------------------------------------------------------------------------- static bool get_grid_values(PJ* P, @@ -87,7 +69,7 @@ static bool get_grid_values(PJ* P, } GenericShiftGridSet* gridset = nullptr; - auto grid = findGrid(Q->grids, lp, gridset); + auto grid = pj_find_generic_grid(Q->grids, lp, gridset); if( !grid ) { return false; } @@ -122,54 +104,20 @@ static bool get_grid_values(PJ* P, return false; } - const auto& extent = grid->extentAndRes(); - double grid_x = (lp.lam - extent.westLon) / extent.resLon; - double grid_y = (lp.phi - extent.southLat) / extent.resLat; - int ix = static_cast(grid_x); - int iy = static_cast(grid_y); - int ix2 = std::min(ix + 1, grid->width() - 1); - int iy2 = std::min(iy + 1, grid->height() - 1); - - float dx1, dy1, dz1; - float dx2, dy2, dz2; - float dx3, dy3, dz3; - float dx4, dy4, dz4; - bool error =( !grid->valueAt(ix, iy, sampleX, dx1) || - !grid->valueAt(ix, iy, sampleY, dy1) || - !grid->valueAt(ix, iy, sampleZ, dz1) || - !grid->valueAt(ix2, iy, sampleX, dx2) || - !grid->valueAt(ix2, iy, sampleY, dy2) || - !grid->valueAt(ix2, iy, sampleZ, dz2) || - !grid->valueAt(ix, iy2, sampleX, dx3) || - !grid->valueAt(ix, iy2, sampleY, dy3) || - !grid->valueAt(ix, iy2, sampleZ, dz3) || - !grid->valueAt(ix2, iy2, sampleX, dx4) || - !grid->valueAt(ix2, iy2, sampleY, dy4) || - !grid->valueAt(ix2, iy2, sampleZ, dz4) ); - if( grid->hasChanged() ) { - if( gridset->reopen(P->ctx) ) { + bool must_retry = false; + if( !pj_bilinear_interpolation_three_samples(grid, lp, + sampleX, sampleY, sampleZ, + dx, dy, dz, + must_retry) ) + { + if( must_retry ) return get_grid_values( P, Q, lp, dx, dy, dz); - } - error = true; - } - if( error ) { return false; } - double frct_lam = grid_x - ix; - double frct_phi = grid_y - iy; - double m10 = frct_lam; - double m11 = m10; - double m01 = 1. - frct_lam; - double m00 = m01; - m11 *= frct_phi; - m01 *= frct_phi; - frct_phi = 1. - frct_phi; - m00 *= frct_phi; - m10 *= frct_phi; - dx = (m00 * dx1 + m10 * dx2 + m01 * dx3 + m11 * dx4) * Q->multiplier; - dy = (m00 * dy1 + m10 * dy2 + m01 * dy3 + m11 * dy4) * Q->multiplier; - dz = (m00 * dz1 + m10 * dz2 + m01 * dz3 + m11 * dz4) * Q->multiplier; + dx *= Q->multiplier; + dy *= Q->multiplier; + dz *= Q->multiplier; return true; } -- cgit v1.2.3