Code:convert-nasa-population.c

From the change wiki

Converts NASA GPWv4 population data from its original form (File:gpw-v4-population-count-rev11_2020_2pt5_min_asc.zip) to a headerless form (File:population.data-float64-8640x4320)

Instructions:

Code

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

#define IN_FILE  "data/gpw_v4_population_count_rev11_2020_2pt5_min.asc"
#define OUT_FILE "data/population.data-float64-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;
 double value=0;
 while (!feof(in)) {
  if (fscanf(in, "%lf", &value) == 0) break;
  // if (!n) printf("first pixel value: %lf\n", value);
  if (value < 0) value = 0;
  if (fwrite(&value, sizeof(double), 1, out) == 0) break;
  ++n; if (!(n & 131071)) printf("wrote %d MiB\n", (n>>17));
 }
 fclose(in);
 fclose(out);
 printf("wrote %d numbers to %s\n", n, OUT_FILE);
 return 0;
}