[geocode-glib/gnome-3-16] reverse: Fix nominatim attrs parsing for broken boundingbox



commit f7a24c1c90c6ac326403ad6e0a7ca28d304f7ee8
Author: Bastien Nocera <hadess hadess net>
Date:   Wed May 27 14:59:17 2015 +0200

    reverse: Fix nominatim attrs parsing for broken boundingbox
    
    This OpenStreeMap result has a bounding box that uses doubles to store
    its borders, instead of strings, like all the others:
    
        {
            "place_id": "353472",
            "licence": "Data © OpenStreetMap contributors, ODbL 1.0. http://www.openstreetmap.org/copyright";,
            "osm_type": "node",
            "osm_id": "151337566",
            "boundingbox": [
                38.4917175,
                38.5317175,
                -91.1940394,
                -91.1540394
            ],
            "lat": "38.5117175",
            "lon": "-91.1740394",
            "display_name": "Lyon, Franklin County, Missouri, United States of America",
            "place_rank": "19",
            "category": "place",
            "type": "hamlet",
    
    We fix this by checking the type of the node, and turning it into a
    string, as all the other items in the hash table.
    
    See https://bugzilla.redhat.com/show_bug.cgi?id=1224563
    and https://trac.openstreetmap.org/ticket/5132
    
    https://bugzilla.gnome.org/show_bug.cgi?id=749963

 geocode-glib/geocode-reverse.c |   43 ++++++++++++++++++++++++++++++++-------
 1 files changed, 35 insertions(+), 8 deletions(-)
---
diff --git a/geocode-glib/geocode-reverse.c b/geocode-glib/geocode-reverse.c
index d6fe765..746c96c 100644
--- a/geocode-glib/geocode-reverse.c
+++ b/geocode-glib/geocode-reverse.c
@@ -114,6 +114,32 @@ geocode_reverse_new_for_location (GeocodeLocation *location)
        return object;
 }
 
+static void
+insert_bounding_box_element (GHashTable *ht,
+                            GType       value_type,
+                            const char *name,
+                            JsonReader *reader)
+{
+       if (value_type == G_TYPE_STRING) {
+               const char *bbox_val;
+
+               bbox_val = json_reader_get_string_value (reader);
+               g_hash_table_insert (ht, g_strdup (name), g_strdup (bbox_val));
+       } else if (value_type == G_TYPE_DOUBLE) {
+               gdouble bbox_val;
+
+               bbox_val = json_reader_get_double_value (reader);
+               g_hash_table_insert(ht, g_strdup (name), g_strdup_printf ("%lf", bbox_val));
+       } else if (value_type == G_TYPE_INT64) {
+               gint64 bbox_val;
+
+               bbox_val = json_reader_get_double_value (reader);
+               g_hash_table_insert(ht, g_strdup (name), g_strdup_printf ("%"G_GINT64_FORMAT, bbox_val));
+       } else {
+               g_debug ("Unhandled node type %s for %s", g_type_name (value_type), name);
+       }
+}
+
 void
 _geocode_read_nominatim_attributes (JsonReader *reader,
                                     GHashTable *ht)
@@ -168,25 +194,26 @@ _geocode_read_nominatim_attributes (JsonReader *reader,
                         }
                 } else if (g_strcmp0 (members[i], "boundingbox") == 0) {
                         const char *bbox_val;
+                        JsonNode *node;
+                        GType value_type;
 
                         json_reader_read_element (reader, 0);
-                        bbox_val = json_reader_get_string_value (reader);
-                        g_hash_table_insert(ht, g_strdup ("boundingbox-bottom"), g_strdup (bbox_val));
+                        node = json_reader_get_value (reader);
+                        value_type = json_node_get_value_type (node);
+
+                        insert_bounding_box_element (ht, value_type, "boundingbox-bottom", reader);
                         json_reader_end_element (reader);
 
                         json_reader_read_element (reader, 1);
-                        bbox_val = json_reader_get_string_value (reader);
-                        g_hash_table_insert(ht, g_strdup ("boundingbox-top"), g_strdup (bbox_val));
+                        insert_bounding_box_element (ht, value_type, "boundingbox-top", reader);
                         json_reader_end_element (reader);
 
                         json_reader_read_element (reader, 2);
-                        bbox_val = json_reader_get_string_value (reader);
-                        g_hash_table_insert(ht, g_strdup ("boundingbox-left"), g_strdup (bbox_val));
+                        insert_bounding_box_element (ht, value_type, "boundingbox-left", reader);
                         json_reader_end_element (reader);
 
                         json_reader_read_element (reader, 3);
-                        bbox_val = json_reader_get_string_value (reader);
-                        g_hash_table_insert(ht, g_strdup ("boundingbox-right"), g_strdup (bbox_val));
+                        insert_bounding_box_element (ht, value_type, "boundingbox-right", reader);
                         json_reader_end_element (reader);
                 }
                 json_reader_end_member (reader);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]