+
+typedef struct {
+ const VikCoord *coord;
+ gint elev;
+} CoordElev;
+
+static gboolean get_elev_by_coord(gpointer key, LoadedDEM *ldem, CoordElev *ce)
+{
+ VikDEM *dem = ldem->dem;
+
+ if ( dem->horiz_units == VIK_DEM_HORIZ_LL_ARCSECONDS ) {
+ struct LatLon ll_tmp;
+ vik_coord_to_latlon (ce->coord, &ll_tmp );
+ ll_tmp.lat *= 3600;
+ ll_tmp.lon *= 3600;
+ ce->elev = vik_dem_get_east_north(dem, ll_tmp.lon, ll_tmp.lat);
+ return (ce->elev != VIK_DEM_INVALID_ELEVATION);
+ } else if (dem->horiz_units == VIK_DEM_HORIZ_UTM_METERS) {
+ static struct UTM utm_tmp;
+ vik_coord_to_utm (ce->coord, &utm_tmp);
+ if ( utm_tmp.zone == dem->utm_zone &&
+ (ce->elev = vik_dem_get_east_north(dem, utm_tmp.easting, utm_tmp.northing)) != VIK_DEM_INVALID_ELEVATION )
+ return TRUE;
+ }
+ return FALSE;
+}
+
+/* TODO: keep a (sorted) linked list of DEMs and select the best resolution one */
+gint16 a_dems_get_elev_by_coord ( const VikCoord *coord )
+{
+ CoordElev ce;
+
+ if (!loaded_dems)
+ return VIK_DEM_INVALID_ELEVATION;
+
+ ce.coord = coord;
+ ce.elev = VIK_DEM_INVALID_ELEVATION;
+
+ if(!g_hash_table_find(loaded_dems, get_elev_by_coord, &ce))
+ return VIK_DEM_INVALID_ELEVATION;
+ return ce.elev;
+}