X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/9e4edda098ce71a0e242f525e34e6d15542950d9..dade5f874b05c2263bbbe668a77021d487b0761b:/src/geonamessearch.c?ds=inline diff --git a/src/geonamessearch.c b/src/geonamessearch.c index 3f4cbfe4..3af6426a 100644 --- a/src/geonamessearch.c +++ b/src/geonamessearch.c @@ -54,6 +54,7 @@ #define GEONAMES_LONGITUDE_PATTERN "\"lng\": " #define GEONAMES_NAME_PATTERN "\"name\": \"" #define GEONAMES_LATITUDE_PATTERN "\"lat\": " +#define GEONAMES_ELEVATION_PATTERN "\"elevation\": " #define GEONAMES_TITLE_PATTERN "\"title\": \"" #define GEONAMES_WIKIPEDIAURL_PATTERN "\"wikipediaUrl\": \"" #define GEONAMES_THUMBNAILIMG_PATTERN "\"thumbnailImg\": \"" @@ -65,6 +66,7 @@ typedef struct { gchar *name; gchar *feature; struct LatLon ll; + gdouble elevation; gchar *cmt; gchar *desc; } found_geoname; @@ -80,7 +82,8 @@ static found_geoname *new_found_geoname() ret->desc = NULL; ret->ll.lat = 0.0; ret->ll.lon = 0.0; - return(ret); + ret->elevation = VIK_DEFAULT_ALTITUDE; + return ret; } static found_geoname *copy_found_geoname(found_geoname *src) @@ -90,6 +93,7 @@ static found_geoname *copy_found_geoname(found_geoname *src) dest->feature = g_strdup(src->feature); dest->ll.lat = src->ll.lat; dest->ll.lon = src->ll.lon; + dest->elevation = src->elevation; dest->cmt = g_strdup(src->cmt); dest->desc = g_strdup(src->desc); return(dest); @@ -248,7 +252,7 @@ static GList *get_entries_from_file(gchar *file_name) GMappedFile *mf; gsize len; gboolean more = TRUE; - gchar lat_buf[32], lon_buf[32]; + gchar lat_buf[32], lon_buf[32], elev_buf[32]; gchar *s; gint fragment_len; GList *found_places = NULL; @@ -259,10 +263,11 @@ static GList *get_entries_from_file(gchar *file_name) gchar *wikipedia_url = NULL; gchar *thumbnail_url = NULL; - lat_buf[0] = lon_buf[0] = '\0'; + lat_buf[0] = lon_buf[0] = elev_buf[0] = '\0'; if ((mf = g_mapped_file_new(file_name, FALSE, NULL)) == NULL) { g_critical(_("couldn't map temp file")); + return NULL; } len = g_mapped_file_get_length(mf); text = g_mapped_file_get_contents(mf); @@ -304,6 +309,17 @@ static GList *get_entries_from_file(gchar *file_name) } geoname->ll.lon = g_ascii_strtod(lon_buf, NULL); } + if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_ELEVATION_PATTERN))) { + pat += strlen(GEONAMES_ELEVATION_PATTERN); + s = elev_buf; + if (*pat == '-') + *s++ = *pat++; + while ((s < (elev_buf + sizeof(elev_buf))) && (pat < (text + len)) && + (g_ascii_isdigit(*pat) || (*pat == '.'))) + *s++ = *pat++; + *s = '\0'; + geoname->elevation = g_ascii_strtod(elev_buf, NULL); + } if ((pat = g_strstr_len(entry, strlen(entry), GEONAMES_NAME_PATTERN))) { pat += strlen(GEONAMES_NAME_PATTERN); fragment_len = 0; @@ -434,8 +450,24 @@ void a_geonames_wikipedia_box ( VikWindow *vw, VikTrwLayer *vtl, struct LatLon m wiki_wp = vik_waypoint_new(); wiki_wp->visible = TRUE; vik_coord_load_from_latlon(&(wiki_wp->coord), vik_trw_layer_get_coord_mode ( vtl ), &(wiki_geoname->ll)); + wiki_wp->altitude = wiki_geoname->elevation; vik_waypoint_set_comment(wiki_wp, wiki_geoname->cmt); vik_waypoint_set_description(wiki_wp, wiki_geoname->desc); + // Use the featue type to generate a suitable waypoint icon + // http://www.geonames.org/wikipedia/wikipedia_features.html + // Only a few values supported as only a few symbols make sense + if ( wiki_geoname->feature ) { + if ( !strcmp (wiki_geoname->feature, "city") ) + vik_waypoint_set_symbol(wiki_wp, "city (medium)"); + if ( !strcmp (wiki_geoname->feature, "edu") ) + vik_waypoint_set_symbol(wiki_wp, "school"); + if ( !strcmp (wiki_geoname->feature, "airport") ) + vik_waypoint_set_symbol(wiki_wp, "airport"); + if ( !strcmp (wiki_geoname->feature, "mountain") ) + vik_waypoint_set_symbol(wiki_wp, "summit"); + if ( !strcmp (wiki_geoname->feature, "forest") ) + vik_waypoint_set_symbol(wiki_wp, "forest"); + } vik_trw_layer_filein_add_waypoint ( vtl, wiki_geoname->name, wiki_wp ); wp_runner = g_list_next(wp_runner); }