lifo-dijkstraserv/src/geojson.c

119 lines
2.7 KiB
C

#include "geojson.h"
#include "dijkstragraph.h"
#include "logging.h"
#include <stdlib.h>
#include <glib-object.h>
#include <json-glib/json-glib.h>
int add_geojson_to_dijkstra(struct dijkstra_solver *solver,
char *filename)
{
JsonParser *parser;
JsonNode *root;
JsonArray *arr;
JsonNode *node;
JsonReader *reader;
GError *error;
int i, j;
int i_max, j_max;
char *name = NULL;
int x, y;
int x_last, y_last;
struct _stats {
int nodes;
int paths;
} stats = {.nodes = 0, .paths = 0};
report(LL_INFO, "Loading GeoJson data from %s...", filename);
parser = json_parser_new ();
error = NULL;
json_parser_load_from_file(parser, filename, &error);
if (error)
{
report(LL_ERROR, "Unable to parse `%s': %s\n", filename, error->message);
g_error_free(error);
g_object_unref(parser);
return EXIT_FAILURE;
}
root = json_parser_get_root(parser);
arr = json_node_get_array(root);
if (arr) {
i_max = json_array_get_length(arr);
for (i = 0; i < i_max; i++)
{
node = json_array_get_element(arr, i);
if (node) {
reader = json_reader_new(node);
json_reader_read_member(reader, "properties");
if (json_reader_get_error(reader)) {
g_object_unref(reader);
continue;
}
json_reader_read_member(reader, "name");
name = strdup(json_reader_get_string_value(reader));
json_reader_end_member(reader); // name
json_reader_end_member(reader); // properties
json_reader_read_member(reader, "geometry");
json_reader_read_member(reader, "coordinates");
if (json_reader_is_array(reader)) {
j_max = json_reader_count_elements(reader);
for (j = 0; j < j_max; j++) {
json_reader_read_element(reader, j);
if (json_reader_is_array(reader)) {
stats.nodes++;
json_reader_read_element(reader, 0);
x = json_reader_get_int_value(reader);
json_reader_end_element(reader);
json_reader_read_element(reader, 1);
y = json_reader_get_int_value(reader);
json_reader_end_element(reader);
if (j > 0) {
stats.paths++;
dijkstra_path_new_to_list(solver,
x_last, y_last,
x, y,
name, 1);
}
x_last = x;
y_last = y;
} else {
report(LL_WARNING, "err 1\n");
}
json_reader_end_element(reader);
}
} else {
report(LL_WARNING, "err 0\n");
}
json_reader_end_member(reader); // coordinates
json_reader_end_member(reader); // geometry
g_object_unref(reader);
} else {
report(LL_ERROR, "Invalid geojson file.\n");
}
}
} else {
report(LL_ERROR, "Invalid geojson file.\n");
}
report(LL_INFO, "Imported %d nodes and %d paths from GeoJson.",
stats.nodes,
stats.paths);
g_object_unref (parser);
return EXIT_SUCCESS;
}