#include "geojson.h" #include "dijkstrasearch.h" #include "logging.h" #include #include #include 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; }