Code:convert-nasa-population.c
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:
- Extract "gpw_v4_population_count_rev11_2020_2pt5_min.asc" from File:gpw-v4-population-count-rev11_2020_2pt5_min_asc.zip, into your "data/" subfolder.
- Run the program (code is below)
- The File:population.data-float64-8640x4320 will appear in your "data/" subfolder.
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;
}