[geocode-glib] reverse: Fix nominatim attrs parsing for broken boundingbox
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [geocode-glib] reverse: Fix nominatim attrs parsing for broken boundingbox
- Date: Tue, 9 Jun 2015 12:31:32 +0000 (UTC)
commit e11087fcc85a0ce9bfe49cfd460ef97caceb00c1
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]