mirror of https://github.com/ecmwf/eccodes.git
GRIB-523: grib_get_data does not query the bitmap for missing values
This commit is contained in:
parent
2cc31e6ea6
commit
b3a74c97dc
|
@ -44,33 +44,36 @@ extern FILE* dump_file;
|
||||||
|
|
||||||
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
|
int grib_options_count=sizeof(grib_options)/sizeof(grib_option);
|
||||||
|
|
||||||
int main(int argc, char *argv[]) { return grib_tool(argc,argv);}
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
return grib_tool(argc,argv);
|
||||||
|
}
|
||||||
|
|
||||||
int grib_tool_before_getopt(grib_runtime_options* options) {
|
int grib_tool_before_getopt(grib_runtime_options* options)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int grib_tool_init(grib_runtime_options* options) {
|
int grib_tool_init(grib_runtime_options* options)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file) {
|
int grib_tool_new_filename_action(grib_runtime_options* options,const char* file)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file)
|
||||||
int grib_tool_new_file_action(grib_runtime_options* options,grib_tools_file* file) {
|
{
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h)
|
||||||
|
{
|
||||||
int err=0;
|
int err=0;
|
||||||
double *lat=0,*lon=0,*val=0;
|
|
||||||
double missing_value=9999.;
|
|
||||||
int skip_missing=1;
|
int skip_missing=1;
|
||||||
char *kmiss=NULL, *p=NULL;
|
|
||||||
char *missing_string=NULL;
|
char *missing_string=NULL;
|
||||||
int i=0;
|
int i=0;
|
||||||
grib_values* values=NULL;
|
grib_values* values=NULL;
|
||||||
|
@ -79,6 +82,9 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
||||||
char* default_format="%.10e";
|
char* default_format="%.10e";
|
||||||
int print_keys=grib_options_on("p:");
|
int print_keys=grib_options_on("p:");
|
||||||
long numberOfPoints=0;
|
long numberOfPoints=0;
|
||||||
|
long bitmapPresent = 0;
|
||||||
|
long *bitmap = NULL; /* bitmap array */
|
||||||
|
size_t bmp_len = 0;
|
||||||
double *data_values=0,*lats=0,*lons=0;
|
double *data_values=0,*lats=0,*lons=0;
|
||||||
int n = 0;
|
int n = 0;
|
||||||
size_t size=0;
|
size_t size=0;
|
||||||
|
@ -103,6 +109,7 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iter) {
|
if (iter) {
|
||||||
|
double *lat=0,*lon=0,*val=0;
|
||||||
lats=(double*)calloc(numberOfPoints+1,sizeof(double));
|
lats=(double*)calloc(numberOfPoints+1,sizeof(double));
|
||||||
lons=(double*)calloc(numberOfPoints+1,sizeof(double));
|
lons=(double*)calloc(numberOfPoints+1,sizeof(double));
|
||||||
lat=lats; lon=lons; val=data_values;
|
lat=lats; lon=lons; val=data_values;
|
||||||
|
@ -121,23 +128,19 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
||||||
exit(err);
|
exit(err);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GRIB_CHECK(grib_get_long(h,"bitmapPresent",&bitmapPresent),0);
|
||||||
|
if (bitmapPresent)
|
||||||
|
{
|
||||||
|
GRIB_CHECK(grib_get_size(h,"bitmap",&bmp_len),0);
|
||||||
|
bitmap = malloc(bmp_len*sizeof(long));
|
||||||
|
GRIB_CHECK(grib_get_long_array(h,"bitmap",bitmap,&bmp_len),0);
|
||||||
|
}
|
||||||
|
|
||||||
skip_missing=1;
|
skip_missing=1;
|
||||||
if (grib_options_on("m:")) {
|
if (grib_options_on("m:")) {
|
||||||
char* theEnd=0;
|
/* User wants to see missing values */
|
||||||
double mval=0;
|
|
||||||
skip_missing=0;
|
skip_missing=0;
|
||||||
kmiss=grib_options_get_option("m:");
|
missing_string=grib_options_get_option("m:");
|
||||||
p=kmiss;
|
|
||||||
while (*p != ':' && *p != '\0') p++;
|
|
||||||
if (*p == ':' && *(p+1) != '\0') {
|
|
||||||
*p='\0';
|
|
||||||
missing_string=strdup(p+1);
|
|
||||||
} else {
|
|
||||||
missing_string=strdup(kmiss);
|
|
||||||
}
|
|
||||||
mval=strtod(kmiss,&theEnd);
|
|
||||||
if (theEnd==NULL) missing_value=mval;
|
|
||||||
grib_set_double(h,"missingValue",missing_value);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iter)
|
if (iter)
|
||||||
|
@ -155,10 +158,12 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
||||||
values=get_key_values(options,h);
|
values=get_key_values(options,h);
|
||||||
|
|
||||||
if (skip_missing==0){
|
if (skip_missing==0){
|
||||||
|
/* Show missing values in data */
|
||||||
for (i=0;i<numberOfPoints;i++) {
|
for (i=0;i<numberOfPoints;i++) {
|
||||||
|
const int is_missing_val = (bitmapPresent && bitmap[i] == 0);
|
||||||
if (iter) fprintf(dump_file,"%9.3f%9.3f ",lats[i],lons[i]);
|
if (iter) fprintf(dump_file,"%9.3f%9.3f ",lats[i],lons[i]);
|
||||||
|
|
||||||
if (data_values[i] == missing_value)
|
if (is_missing_val)
|
||||||
fprintf(dump_file,"%s",missing_string);
|
fprintf(dump_file,"%s",missing_string);
|
||||||
else
|
else
|
||||||
fprintf(dump_file,format,data_values[i]);
|
fprintf(dump_file,format,data_values[i]);
|
||||||
|
@ -170,8 +175,10 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if ( skip_missing==1 ){
|
} else if ( skip_missing==1 ){
|
||||||
|
/* Skip the missing values in data */
|
||||||
for (i=0;i<numberOfPoints;i++) {
|
for (i=0;i<numberOfPoints;i++) {
|
||||||
if (data_values[i] != missing_value){
|
const int is_missing_val = (bitmapPresent && bitmap[i] == 0);
|
||||||
|
if (!is_missing_val){
|
||||||
if (iter) fprintf(dump_file,"%9.3f%9.3f ",lats[i],lons[i]);
|
if (iter) fprintf(dump_file,"%9.3f%9.3f ",lats[i],lons[i]);
|
||||||
fprintf(dump_file,format,data_values[i]);
|
fprintf(dump_file,format,data_values[i]);
|
||||||
if (print_keys)
|
if (print_keys)
|
||||||
|
@ -193,30 +200,32 @@ int grib_tool_new_handle_action(grib_runtime_options* options, grib_handle* h) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h) {
|
int grib_tool_skip_handle(grib_runtime_options* options, grib_handle* h)
|
||||||
|
{
|
||||||
grib_handle_delete(h);
|
grib_handle_delete(h);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h) {
|
void grib_tool_print_key_values(grib_runtime_options* options,grib_handle* h)
|
||||||
|
{
|
||||||
grib_print_key_values(options,h);
|
grib_print_key_values(options,h);
|
||||||
}
|
}
|
||||||
|
|
||||||
int grib_tool_finalise_action(grib_runtime_options* options) {
|
int grib_tool_finalise_action(grib_runtime_options* options)
|
||||||
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void print_key_values(grib_values* values,int values_count)
|
||||||
static void print_key_values(grib_values* values,int values_count) {
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
for (i=0; i<values_count; i++) {
|
for (i=0; i<values_count; i++) {
|
||||||
fprintf(dump_file," %s",values[i].string_value);
|
fprintf(dump_file," %s",values[i].string_value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static grib_values* get_key_values(grib_runtime_options* options,grib_handle* h) {
|
static grib_values* get_key_values(grib_runtime_options* options,grib_handle* h)
|
||||||
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
int ret=0;
|
int ret=0;
|
||||||
char value[MAX_STRING_LEN]={0,};
|
char value[MAX_STRING_LEN]={0,};
|
||||||
|
@ -269,4 +278,3 @@ static grib_values* get_key_values(grib_runtime_options* options,grib_handle* h)
|
||||||
return options->print_keys;
|
return options->print_keys;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue