]> git.street.me.uk Git - andy/viking.git/blobdiff - src/geonamessearch.c
Fix incorrect GPSBabel/Garmin symbol names.
[andy/viking.git] / src / geonamessearch.c
index 3f4cbfe43a56df536591977b3d7f56f24e9edb89..3af6426a9d2c5128b1ebd8edb55aaa7ce6310c76 100644 (file)
@@ -54,6 +54,7 @@
 #define GEONAMES_LONGITUDE_PATTERN "\"lng\": "
 #define GEONAMES_NAME_PATTERN "\"name\": \""
 #define GEONAMES_LATITUDE_PATTERN "\"lat\": "
 #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\": \""
 #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;
   gchar *name;
   gchar *feature;
   struct LatLon ll;
+  gdouble elevation;
   gchar *cmt;
   gchar *desc;
 } found_geoname;
   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;
   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)
 }
 
 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->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);
   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;
   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;
   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;
 
   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"));
 
   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);
   }
   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);
     }
       }
       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;
     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 = 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);
     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);
   }
     vik_trw_layer_filein_add_waypoint ( vtl, wiki_geoname->name, wiki_wp );
     wp_runner = g_list_next(wp_runner);
   }