From 126384854bf8e1b7461aebcc28966a6559971de1 Mon Sep 17 00:00:00 2001 From: Even Rouault Date: Wed, 4 Dec 2019 18:56:15 +0100 Subject: vertical grid shift: rework to no longer load whole grid into memory --- src/4D_api.cpp | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'src/4D_api.cpp') diff --git a/src/4D_api.cpp b/src/4D_api.cpp index f37594b5..ed6a62d6 100644 --- a/src/4D_api.cpp +++ b/src/4D_api.cpp @@ -1558,6 +1558,45 @@ PJ_GRID_INFO proj_grid_info(const char *gridname) { /* in case the grid wasn't found */ if (gridinfo->filename == nullptr || gridinfo->ct == nullptr) { + + const auto gridSet = NS_PROJ::VerticalShiftGridSet::open(ctx, gridname); + if( gridSet ) + { + const auto& grids = gridSet->grids(); + if( !grids.empty() ) + { + const auto& grid = grids.front(); + const auto& extent = grid->extentAndRes(); + + /* name of grid */ + strncpy (grinfo.gridname, gridname, sizeof(grinfo.gridname) - 1); + + /* full path of grid */ + pj_find_file(ctx, gridname, grinfo.filename, sizeof(grinfo.filename) - 1); + + /* grid format */ + strncpy (grinfo.format, gridSet->format().c_str(), sizeof(grinfo.format) - 1); + + /* grid size */ + grinfo.n_lon = grid->width(); + grinfo.n_lat = grid->height(); + + /* cell size */ + grinfo.cs_lon = extent.resLon; + grinfo.cs_lat = extent.resLat; + + /* bounds of grid */ + grinfo.lowerleft.lam = extent.westLon; + grinfo.lowerleft.phi = extent.southLat; + grinfo.upperright.lam = extent.eastLon; + grinfo.upperright.phi = extent.northLat; + + pj_gridinfo_free(ctx, gridinfo); + + return grinfo; + } + } + pj_gridinfo_free(ctx, gridinfo); strcpy(grinfo.format, "missing"); return grinfo; @@ -1585,8 +1624,8 @@ PJ_GRID_INFO proj_grid_info(const char *gridname) { /* bounds of grid */ grinfo.lowerleft = gridinfo->ct->ll; - grinfo.upperright.lam = grinfo.lowerleft.lam + grinfo.n_lon*grinfo.cs_lon; - grinfo.upperright.phi = grinfo.lowerleft.phi + grinfo.n_lat*grinfo.cs_lat; + grinfo.upperright.lam = grinfo.lowerleft.lam + (grinfo.n_lon-1)*grinfo.cs_lon; + grinfo.upperright.phi = grinfo.lowerleft.phi + (grinfo.n_lat-1)*grinfo.cs_lat; pj_gridinfo_free(ctx, gridinfo); -- cgit v1.2.3