Code:convert-nasa-countries.c

From the change wiki

Input: gpw_v4_national_identifier_grid_rev11_2pt5_min.asc, extracted from File:gpw-v4-population-count-rev11_2020_2pt5_min_asc.zip

Output: File:countries.data-int16-8640x4320

Dependencies: Code:stb_image_write.h

Code

// Converts NASA GPWv4 data (country indicator) from ASCII format to binary data (64-bit double-precision floating point 2D array)
// To compile:  gcc convert-nasa-countries.c -O -o convert-nasa-countries

#define IN_FILE  "data/gpw_v4_national_identifier_grid_rev11_2pt5_min.asc"
#define OUT_FILE "data/countries.data-int16-8640x4320"
#define INPUT_ASCII_DATA_START 131
#define INPUT_WIDTH 8640
#define INPUT_HEIGHT 4320

#include <stdio.h>

int main() {
 FILE* in = fopen(IN_FILE, "r");
 if (in == NULL) {
  perror(IN_FILE);
  return 1;
 }
 if (fseek(in, INPUT_ASCII_DATA_START, SEEK_SET)) {
  perror(IN_FILE);
  return 2;
 }
 FILE* out = fopen(OUT_FILE, "w");
 if (out == NULL) {
  perror(OUT_FILE);
  return 3;
 }
 printf("Input:  %s\nOutput: %s\n",IN_FILE,OUT_FILE);
 int n=0;
 int value=0;
 while (!feof(in)) {
  if (fscanf(in, "%d", &value) == 0) break;
  if (!n) printf("%d\n",value);
  if (fwrite(&value, sizeof(short), 1, out) == 0) break;
  ++n; if (!(n & 524288)) printf("wrote %d MiB\n", (n>>19));
 }
 fclose(in);
 fclose(out);
 printf("wrote %d numbers to %s\n", n, OUT_FILE);
 return 0;
}