mirror of https://github.com/ecmwf/eccodes.git
Added new C example for iterator using bitmap
This commit is contained in:
parent
dbe1791e21
commit
10342cdbe4
|
@ -4,32 +4,33 @@ AM_CFLAGS = @WARN_PEDANTIC@ @WERROR@
|
|||
TESTS = iterator.sh get.sh print_data.sh set.sh keys_iterator.sh multi.sh multi_write.sh \
|
||||
precision.sh list.sh large_grib1.sh get_data.sh sections_copy.sh set_missing.sh
|
||||
|
||||
noinst_PROGRAMS = nearest set_bitmap iterator get print_data set set_missing keys_iterator \
|
||||
set_data mars_param values_check box multi multi2 multi_write precision \
|
||||
set_pv list sections_copy large_grib1 get_data
|
||||
bin_PROGRAMS = points
|
||||
noinst_PROGRAMS = nearest set_bitmap iterator get print_data set set_missing keys_iterator \
|
||||
set_data mars_param values_check box multi multi2 multi_write precision \
|
||||
set_pv list sections_copy large_grib1 get_data iterator_bitmap
|
||||
bin_PROGRAMS = points
|
||||
|
||||
box_SOURCES = box.c
|
||||
set_data_SOURCES = set_data.c
|
||||
mars_param_SOURCES = mars_param.c
|
||||
values_check_SOURCES = values_check.c
|
||||
nearest_SOURCES = nearest.c
|
||||
multi_write_SOURCES = multi_write.c
|
||||
get_SOURCES = get.c
|
||||
print_data_SOURCES = print_data.c
|
||||
set_SOURCES = set.c
|
||||
set_missing_SOURCES = set_missing.c
|
||||
set_bitmap_SOURCES = set_bitmap.c
|
||||
multi_SOURCES = multi.c
|
||||
multi2_SOURCES = multi2.c
|
||||
keys_iterator_SOURCES = keys_iterator.c
|
||||
iterator_SOURCES = iterator.c
|
||||
set_pv_SOURCES = set_pv.c
|
||||
points_SOURCES = points.c
|
||||
list_SOURCES = list.c
|
||||
sections_copy_SOURCES = sections_copy.c
|
||||
large_grib1_SOURCES = large_grib1.c
|
||||
get_data_SOURCES = get_data.c
|
||||
box_SOURCES = box.c
|
||||
set_data_SOURCES = set_data.c
|
||||
mars_param_SOURCES = mars_param.c
|
||||
values_check_SOURCES = values_check.c
|
||||
nearest_SOURCES = nearest.c
|
||||
multi_write_SOURCES = multi_write.c
|
||||
get_SOURCES = get.c
|
||||
print_data_SOURCES = print_data.c
|
||||
set_SOURCES = set.c
|
||||
set_missing_SOURCES = set_missing.c
|
||||
set_bitmap_SOURCES = set_bitmap.c
|
||||
multi_SOURCES = multi.c
|
||||
multi2_SOURCES = multi2.c
|
||||
keys_iterator_SOURCES = keys_iterator.c
|
||||
iterator_SOURCES = iterator.c
|
||||
iterator_bitmap_SOURCES = iterator_bitmap.c
|
||||
set_pv_SOURCES = set_pv.c
|
||||
points_SOURCES = points.c
|
||||
list_SOURCES = list.c
|
||||
sections_copy_SOURCES = sections_copy.c
|
||||
large_grib1_SOURCES = large_grib1.c
|
||||
get_data_SOURCES = get_data.c
|
||||
|
||||
INCLUDES = -I$(top_builddir)/src
|
||||
|
||||
|
|
|
@ -0,0 +1,94 @@
|
|||
/*
|
||||
* Copyright 2005-2014 ECMWF.
|
||||
*
|
||||
* This software is licensed under the terms of the Apache Licence Version 2.0
|
||||
* which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
|
||||
*
|
||||
* In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
|
||||
* virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Description: How to use an iterator on lat/lon/values and query the bitmap
|
||||
* for missing values
|
||||
* (rather than compare each value with the missingValue key)
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
#include "grib_api.h"
|
||||
|
||||
void usage(char* prog)
|
||||
{
|
||||
printf("Usage: %s grib_file\n",prog);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
FILE* in = NULL;
|
||||
int err = 0;
|
||||
double lat,lon,value;
|
||||
int n=0;
|
||||
size_t bmp_len = 0, values_len = 0;
|
||||
char* filename = NULL;
|
||||
long bitmapPresent = 0;
|
||||
long *bitmap = NULL;
|
||||
double *values = NULL;
|
||||
grib_handle *h = NULL;
|
||||
grib_iterator* iter=NULL;
|
||||
|
||||
if (argc != 2) usage(argv[0]);
|
||||
filename=strdup(argv[1]);
|
||||
in = fopen(filename,"r");
|
||||
if(!in) {
|
||||
fprintf(stderr, "ERROR: unable to open file %s\n",filename);
|
||||
return 1;
|
||||
}
|
||||
|
||||
while ((h = grib_handle_new_from_file(0,in,&err)) != NULL )
|
||||
{
|
||||
if (err != GRIB_SUCCESS) GRIB_CHECK(err,0);
|
||||
|
||||
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);
|
||||
printf("Bitmap is present. Num = %ld\n", bmp_len);
|
||||
}
|
||||
/* Sanity check. Number of values must match number in bitmap */
|
||||
GRIB_CHECK(grib_get_size(h,"values",&values_len),0);
|
||||
values = malloc(values_len*sizeof(double));
|
||||
GRIB_CHECK(grib_get_double_array(h,"values",values,&values_len),0);
|
||||
if (bitmapPresent) {
|
||||
assert(values_len==bmp_len);
|
||||
}
|
||||
|
||||
/* A new iterator on lat/lon/values is created from the message handle h */
|
||||
iter=grib_iterator_new(h,0,&err);
|
||||
if (err != GRIB_SUCCESS) GRIB_CHECK(err,0);
|
||||
|
||||
n = 0;
|
||||
/* Loop on all the lat/lon/values. Only print non-missing values */
|
||||
while(grib_iterator_next(iter,&lat,&lon,&value))
|
||||
{
|
||||
int is_missing_val = (bitmapPresent && bitmap[n] == 0);
|
||||
if (!is_missing_val) {
|
||||
printf("- %d - lat=%f lon=%f value=%f\n",n,lat,lon,value);
|
||||
}
|
||||
n++;
|
||||
}
|
||||
/* Check number of elements in iterator matches value count */
|
||||
assert(n == values_len);
|
||||
|
||||
grib_iterator_delete(iter);
|
||||
grib_handle_delete(h);
|
||||
}
|
||||
|
||||
fclose(in);
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue