#include #include #include #include #include "grb2.h" #include "wgrib2.h" #include "fnlist.h" /* * AAIGlong.c - converts lat-lon file to ArcInfo ASCII grid file * each grid is written into its own file * * copied from AAIG.c 10/2015 Public Domain Wesley Ebisuzaki * filename convention for *.asc files is too simple for modern grib2 files * use new filename conventions * */ extern int decode, latlon; extern double *lat, *lon; extern int nx, ny; extern enum output_order_type output_order, output_order_wanted; /* * HEADER:100:AAIGlong:output:0:writes Ascii ArcInfo Grid file, lat-lon grid only long-name *.asc (alpha) */ int f_AAIGlong(ARG0) { int grid_template, i, j; double cellsize; char file[STRING_SIZE], name[STRING_SIZE]; FILE *out; if (mode == -1) { decode = latlon = 1; return 0; } if (mode < 0) return 0; if (lat == NULL || lon == NULL) { fprintf(stderr,"AAIG does nothing, no lat-lon information\n"); return 0; } if (output_order != wesn) { fprintf(stderr,"AAIG does nothing, not in we:sn order\n"); return 0; } grid_template = code_table_3_1(sec); if (grid_template != 0) { fprintf(stderr,"AAIG does nothing, not lat-lon grid\n"); return 0; } if (nx == -1 || ny == -1) { fprintf(stderr,"AAIG does nothing, found thinned lat-lon grid\n"); return 0; } cellsize = -1.0; if (nx > 1) { cellsize = lon[1] - lon[0]; if ( fabs(lat[nx]-lat[0] - cellsize) > 0.0001*cellsize) { fprintf(stderr,"AAIG does nothing, dlon != dlat\n"); return 0; } } else { cellsize = lat[nx] - lat[0]; } f_S(call_ARG0(name,NULL)); name[STRING_SIZE-1] = 0; /* get rid of trailing semicolon */ i = strlen(name); if (name[i-1] == ':') name[i-1] = 0; /* get rid of bad characters for a filename */ j = i = 0; while (name[i]) { if (name[i] == '/') { file[j++] = ' '; file[j++] = 'D'; file[j++] = 'I'; file[j++] = 'V'; file[j++] = ' '; } else if (name[i] == '\\') { file[j++] = ' '; file[j++] = 'B'; file[j++] = 'S'; file[j++] = ' '; } else if (name[i] == ':') { file[j++] = '_'; } else if (name[i] == '"' || name[i] == '\'') { file[j++] = ' '; file[j++] = 'Q'; file[j++] = ' '; } else file[j++] = name[i]; i++; } file[j++] = '.'; file[j++] = 'a'; file[j++] = 's'; file[j++] = 'c'; file[j] = 0; if ((out = ffopen(file,"w")) == NULL) { fprintf(stderr,"AAIG could not open raster file %s\n",file); return 0; } fprintf(stderr, "raster file: %s\n", file); fprintf(out,"ncols %d\n", nx); fprintf(out,"nrows %d\n", ny); fprintf(out,"xllcenter %lf\n", lon[0] > 180.0 ? lon[0]-360.0 : lon[0]); fprintf(out,"yllcenter %lf\n", lat[0]); fprintf(out,"cellsize %lf\n", cellsize); fprintf(out,"NODATA_VALUE 9.999e20\n"); for (j = ny-1; j >= 0; j--) { for (i = 0; i < nx; i++) { fprintf(out,"%f\n", data[i+j*nx]); } } ffclose(out); return 0; }