aboutsummaryrefslogtreecommitdiff
path: root/src/4D_api.cpp
diff options
context:
space:
mode:
authorEven Rouault <even.rouault@spatialys.com>2020-01-13 00:22:56 +0100
committerGitHub <noreply@github.com>2020-01-13 00:22:56 +0100
commit9d8647371d27bdbd717644f7df5514a6f2b07a00 (patch)
tree1ff8fa7fd812fea2ae53792b5488a90f6418095c /src/4D_api.cpp
parentb6f0153e5aa27dc11d2c879dc4a62a0f35a122cb (diff)
parent22792cd55ba41ffadb248c246cc871612a5139c1 (diff)
downloadPROJ-9d8647371d27bdbd717644f7df5514a6f2b07a00.tar.gz
PROJ-9d8647371d27bdbd717644f7df5514a6f2b07a00.zip
Merge pull request #1777 from rouault/rfc4_impl
[RFC4_dev] Grid loading refactoring
Diffstat (limited to 'src/4D_api.cpp')
-rw-r--r--src/4D_api.cpp77
1 files changed, 50 insertions, 27 deletions
diff --git a/src/4D_api.cpp b/src/4D_api.cpp
index f37594b5..efb4a86a 100644
--- a/src/4D_api.cpp
+++ b/src/4D_api.cpp
@@ -47,6 +47,7 @@
#include "proj_internal.h"
#include <math.h>
#include "geodesic.h"
+#include "grids.hpp"
#include "proj/common.hpp"
#include "proj/coordinateoperation.hpp"
@@ -1553,43 +1554,65 @@ PJ_GRID_INFO proj_grid_info(const char *gridname) {
/*PJ_CONTEXT *ctx = proj_context_create(); */
PJ_CONTEXT *ctx = pj_get_default_ctx();
- PJ_GRIDINFO *gridinfo = pj_gridinfo_init(ctx, gridname);
memset(&grinfo, 0, sizeof(PJ_GRID_INFO));
- /* in case the grid wasn't found */
- if (gridinfo->filename == nullptr || gridinfo->ct == nullptr) {
- pj_gridinfo_free(ctx, gridinfo);
- strcpy(grinfo.format, "missing");
- return grinfo;
- }
-
- /* The string copies below are automatically null-terminated due to */
- /* the memset above, so strncpy is safe */
+ const auto fillGridInfo = [&grinfo, ctx, gridname]
+ (const NS_PROJ::Grid& grid, const std::string& format)
+ {
+ const auto& extent = grid.extentAndRes();
- /* name of grid */
- strncpy (grinfo.gridname, gridname, sizeof(grinfo.gridname) - 1);
+ /* 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);
+ /* full path of grid */
+ pj_find_file(ctx, gridname, grinfo.filename, sizeof(grinfo.filename) - 1);
- /* grid format */
- strncpy (grinfo.format, gridinfo->format, sizeof(grinfo.format) - 1);
+ /* grid format */
+ strncpy (grinfo.format, format.c_str(), sizeof(grinfo.format) - 1);
- /* grid size */
- grinfo.n_lon = gridinfo->ct->lim.lam;
- grinfo.n_lat = gridinfo->ct->lim.phi;
+ /* grid size */
+ grinfo.n_lon = grid.width();
+ grinfo.n_lat = grid.height();
- /* cell size */
- grinfo.cs_lon = gridinfo->ct->del.lam;
- grinfo.cs_lat = gridinfo->ct->del.phi;
+ /* cell size */
+ grinfo.cs_lon = extent.resLon;
+ grinfo.cs_lat = extent.resLat;
- /* 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;
+ /* 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);
+ {
+ const auto gridSet = NS_PROJ::VerticalShiftGridSet::open(ctx, gridname);
+ if( gridSet )
+ {
+ const auto& grids = gridSet->grids();
+ if( !grids.empty() )
+ {
+ const auto& grid = grids.front();
+ fillGridInfo(*grid, gridSet->format());
+ return grinfo;
+ }
+ }
+ }
+ {
+ const auto gridSet = NS_PROJ::HorizontalShiftGridSet::open(ctx, gridname);
+ if( gridSet )
+ {
+ const auto& grids = gridSet->grids();
+ if( !grids.empty() )
+ {
+ const auto& grid = grids.front();
+ fillGridInfo(*grid, gridSet->format());
+ return grinfo;
+ }
+ }
+ }
+ strcpy(grinfo.format, "missing");
return grinfo;
}