* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
#include <math.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdlib.h>
+#include <glib/gi18n.h>
#include "config.h"
#include "globals.h"
#include "vikaggregatelayer.h"
#include "viklayerspanel.h"
#include "vikdemlayer.h"
-#include "vikdemlayer_pixmap.h"
-#include "vikmapslayer.h"
#include "dialog.h"
#include "dem.h"
#include "dems.h"
+#include "icons/icons.h"
+
#define MAPS_CACHE_DIR maps_layer_default_dir()
-#define SRTM_CACHE_TEMPLATE "%ssrtm3-%s%c%02d%c%03d.hgt.zip"
+#define SRTM_CACHE_TEMPLATE "%ssrtm3-%s%s%c%02d%c%03d.hgt.zip"
#define SRTM_FTP_SITE "e0srp01u.ecs.nasa.gov"
#define SRTM_FTP_URI "/srtm/version2/SRTM3/"
#endif
static VikLayerParamScale param_scales[] = {
+ { 1, 10000, 10, 1 },
{ 1, 10000, 10, 1 },
{ 1, 10, 1, 0 },
};
"USA 10m (USGS 24k)",
#endif
"None",
+ NULL
};
enum { DEM_SOURCE_SRTM,
};
static VikLayerParam dem_layer_params[] = {
- { "files", VIK_LAYER_PARAM_STRING_LIST, VIK_LAYER_GROUP_NONE, "DEM Files:", VIK_LAYER_WIDGET_FILELIST },
- { "source", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, "Download Source:", VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_source, NULL },
- { "color", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, "Color:", VIK_LAYER_WIDGET_ENTRY },
- { "max_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, "Max Elev:", VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0 },
- { "line_thickness", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, "Line Thickness:", VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 1 },
+ { "files", VIK_LAYER_PARAM_STRING_LIST, VIK_LAYER_GROUP_NONE, N_("DEM Files:"), VIK_LAYER_WIDGET_FILELIST },
+ { "source", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Download Source:"), VIK_LAYER_WIDGET_RADIOGROUP_STATIC, params_source, NULL },
+ { "color", VIK_LAYER_PARAM_STRING, VIK_LAYER_GROUP_NONE, N_("Color:"), VIK_LAYER_WIDGET_ENTRY },
+ { "min_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Min Elev:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0 },
+ { "max_elev", VIK_LAYER_PARAM_DOUBLE, VIK_LAYER_GROUP_NONE, N_("Max Elev:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 0 },
+ { "line_thickness", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Line Thickness:"), VIK_LAYER_WIDGET_SPINBUTTON, param_scales + 1 },
};
-enum { PARAM_FILES=0, PARAM_SOURCE, PARAM_COLOR, PARAM_MAX_ELEV, PARAM_LINE_THICKNESS, NUM_PARAMS };
+enum { PARAM_FILES=0, PARAM_SOURCE, PARAM_COLOR, PARAM_MIN_ELEV, PARAM_MAX_ELEV, PARAM_LINE_THICKNESS, NUM_PARAMS };
static gpointer dem_layer_download_create ( VikWindow *vw, VikViewport *vvp);
static gboolean dem_layer_download_release ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp );
static gboolean dem_layer_download_click ( VikDEMLayer *vdl, GdkEventButton *event, VikViewport *vvp );
static VikToolInterface dem_tools[] = {
- { "DEM Download/Import", (VikToolConstructorFunc) dem_layer_download_create, NULL, NULL, NULL,
- (VikToolMouseFunc) dem_layer_download_click, NULL, (VikToolMouseFunc) dem_layer_download_release },
+ { N_("DEM Download/Import"), (VikToolConstructorFunc) dem_layer_download_create, NULL, NULL, NULL,
+ (VikToolMouseFunc) dem_layer_download_click, NULL, (VikToolMouseFunc) dem_layer_download_release,
+ (VikToolKeyFunc) NULL, GDK_CURSOR_IS_PIXMAP, &cursor_demdl_pixbuf },
};
VikLayerInterface vik_dem_layer_interface = {
"DEM",
- &demlayer_pixbuf,
+ &vikdemlayer_pixbuf,
dem_tools,
sizeof(dem_tools) / sizeof(dem_tools[0]),
GdkGC *gc;
GdkGC **gcs;
GList *files;
+ gdouble min_elev;
gdouble max_elev;
guint8 line_thickness;
gchar *color;
{
case PARAM_COLOR: if ( vdl->color ) g_free ( vdl->color ); vdl->color = g_strdup ( data.s ); break;
case PARAM_SOURCE: vdl->source = data.u; break;
+ case PARAM_MIN_ELEV: vdl->min_elev = data.d; break;
case PARAM_MAX_ELEV: vdl->max_elev = data.d; break;
case PARAM_LINE_THICKNESS: if ( data.u >= 1 && data.u <= 15 ) vdl->line_thickness = data.u; break;
case PARAM_FILES: a_dems_load_list ( &(data.sl) ); a_dems_list_free ( vdl->files ); vdl->files = data.sl; break;
case PARAM_FILES: rv.sl = vdl->files; break;
case PARAM_SOURCE: rv.u = vdl->source; break;
case PARAM_COLOR: rv.s = vdl->color ? vdl->color : ""; break;
+ case PARAM_MIN_ELEV: rv.d = vdl->min_elev; break;
case PARAM_MAX_ELEV: rv.d = vdl->max_elev; break;
case PARAM_LINE_THICKNESS: rv.i = vdl->line_thickness; break;
}
vdl->gcs = g_malloc(sizeof(GdkGC *)*DEM_N_COLORS);
/* make new gcs only if we need it (copy layer -> use old) */
+ vdl->min_elev = 0.0;
vdl->max_elev = 1000.0;
vdl->source = DEM_SOURCE_SRTM;
vdl->line_thickness = 3;
vik_dem_east_north_to_xy ( dem, start_lon_as, start_lat_as, &start_x, &start_y );
+ /* verify sane elev interval */
+ if ( vdl->max_elev <= vdl->min_elev )
+ vdl->max_elev = vdl->min_elev + 1;
+
for ( x=start_x, counter.lon = start_lon; counter.lon <= end_lon; counter.lon += escale_deg * skip_factor, x += skip_factor ) {
if ( x > 0 && x < dem->n_columns ) {
column = g_ptr_array_index ( dem->columns, x );
if ( y > column->n_points )
break;
elev = column->points[y];
- if ( elev > vdl->max_elev ) elev=vdl->max_elev;
+
+ if ( elev != VIK_DEM_INVALID_ELEVATION && elev < vdl->min_elev )
+ elev=vdl->min_elev;
+ if ( elev != VIK_DEM_INVALID_ELEVATION && elev > vdl->max_elev )
+ elev=vdl->max_elev;
+
+
{
gint a, b;
else if ( elev <= 0 )
vik_viewport_draw_rectangle(vp, vdl->gcs[0], TRUE, a-2, b-2, 4, 4 );
else
- vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor(elev/vdl->max_elev*(DEM_N_COLORS-2))+1], TRUE, a-2, b-2, 4, 4 );
+ vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor((elev - vdl->min_elev)/(vdl->max_elev - vdl->min_elev)*(DEM_N_COLORS-2))+1], TRUE, a-2, b-2, 4, 4 );
}
} /* for y= */
}
if ( y > column->n_points )
continue;
elev = column->points[y];
- if ( elev > vdl->max_elev ) elev=vdl->max_elev;
+ if ( elev != VIK_DEM_INVALID_ELEVATION && elev < vdl->min_elev )
+ elev=vdl->min_elev;
+ if ( elev != VIK_DEM_INVALID_ELEVATION && elev > vdl->max_elev )
+ elev=vdl->max_elev;
+
{
gint a, b;
vik_coord_load_from_utm(&tmp, vik_viewport_get_coord_mode(vp), &counter);
else if ( elev <= 0 )
vik_viewport_draw_rectangle(vp, vdl->gcs[0], TRUE, a-2, b-2, 4, 4 );
else
- vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor(elev/vdl->max_elev*(DEM_N_COLORS-2))+1], TRUE, a-2, b-2, 4, 4 );
+ vik_viewport_draw_rectangle(vp, vdl->gcs[(gint)floor((elev - vdl->min_elev)/(vdl->max_elev - vdl->min_elev)*(DEM_N_COLORS-2))+1], TRUE, a-2, b-2, 4, 4 );
}
} /* for y= */
}
/* return the continent for the specified lat, lon */
/* TODO */
-const gchar *srtm_continent_dir ( gint lat, gint lon )
+static const gchar *srtm_continent_dir ( gint lat, gint lon )
{
- return "North_America/";
+ extern const char *_srtm_continent_data[];
+ static GHashTable *srtm_continent = NULL;
+ const gchar *continent;
+ gchar name[16];
+
+ if (!srtm_continent) {
+ const gchar **s;
+
+ srtm_continent = g_hash_table_new(g_str_hash, g_str_equal);
+ s = _srtm_continent_data;
+ while (*s != (gchar *)-1) {
+ continent = *s++;
+ while (*s) {
+ g_hash_table_insert(srtm_continent, (gpointer) *s, (gpointer) continent);
+ s++;
+ }
+ s++;
+ }
+ }
+ g_snprintf(name, sizeof(name), "%c%02d%c%03d",
+ (lat >= 0) ? 'N' : 'S', ABS(lat),
+ (lon >= 0) ? 'E' : 'W', ABS(lon));
+
+ return(g_hash_table_lookup(srtm_continent, name));
}
void vik_dem_layer_draw ( VikDEMLayer *vdl, gpointer data )
static void srtm_dem_download_thread ( DEMDownloadParams *p, gpointer threaddata )
{
gint intlat, intlon;
+ const gchar *continent_dir;
intlat = (int)floor(p->lat);
intlon = (int)floor(p->lon);
- gchar *src_fn = g_strdup_printf("%s%s%c%02d%c%03d.hgt.zip",
+ continent_dir = srtm_continent_dir(intlat, intlon);
+
+ if (!continent_dir) {
+ g_warning(N_("No SRTM data available for %f, %f"), p->lat, p->lon);
+ return;
+ }
+
+ gchar *src_fn = g_strdup_printf("%s%s%s%c%02d%c%03d.hgt.zip",
SRTM_FTP_URI,
- srtm_continent_dir(intlat, intlon),
+ continent_dir,
+ G_DIR_SEPARATOR_S,
(intlat >= 0) ? 'N' : 'S',
ABS(intlat),
(intlon >= 0) ? 'E' : 'W',
ABS(intlon) );
- DownloadOptions options = { NULL, 0 };
+ static DownloadOptions options = { NULL, 0, a_check_map_file };
a_ftp_download_get_url ( SRTM_FTP_SITE, src_fn, p->dest, &options );
g_free ( src_fn );
}
static gchar *srtm_lat_lon_to_dest_fn ( gdouble lat, gdouble lon )
{
gint intlat, intlon;
+ const gchar *continent_dir;
+
intlat = (int)floor(lat);
intlon = (int)floor(lon);
- return g_strdup_printf("srtm3-%s%c%02d%c%03d.hgt.zip",
- srtm_continent_dir(intlat, intlon),
+ continent_dir = srtm_continent_dir(intlat, intlon);
+
+ if (!continent_dir)
+ continent_dir = "nowhere";
+
+ return g_strdup_printf("srtm3-%s%s%c%02d%c%03d.hgt.zip",
+ continent_dir,
+ G_DIR_SEPARATOR_S,
(intlat >= 0) ? 'N' : 'S',
ABS(intlat),
(intlon >= 0) ? 'E' : 'W',
for (i = floor(min_lat); i <= floor(max_lat); i++) {
for (j = floor(min_lon); j <= floor(max_lon); j++) {
+ const gchar *continent_dir;
+ if ((continent_dir = srtm_continent_dir(i, j)) == NULL)
+ continue;
g_snprintf(buf, sizeof(buf), SRTM_CACHE_TEMPLATE,
MAPS_CACHE_DIR,
- srtm_continent_dir(i, j),
+ continent_dir,
+ G_DIR_SEPARATOR_S,
(i >= 0) ? 'N' : 'S',
ABS(i),
(j >= 0) ? 'E' : 'W',
ABS(j) );
- if ( access(buf, F_OK ) == 0 ) {
+ if ( g_file_test(buf, G_FILE_TEST_EXISTS ) == TRUE ) {
VikCoord ne, sw;
gint x1, y1, x2, y2;
sw.north_south = i;
g_snprintf(buf, sizeof(buf), "%sdem24k/%d/",
MAPS_CACHE_DIR,
(gint) i );
- if ( access(buf, F_OK) != 0 )
+ if ( g_file_test(buf, G_FILE_TEST_EXISTS) == FALSE )
continue;
for (j = floor(min_lon*8)/8; j <= floor(max_lon*8)/8; j+=0.125) {
/* check lon dir first -- faster */
MAPS_CACHE_DIR,
(gint) i,
(gint) j );
- if ( access(buf, F_OK) != 0 )
+ if ( g_file_test(buf, G_FILE_TEST_EXISTS) == FALSE )
continue;
g_snprintf(buf, sizeof(buf), "%sdem24k/%d/%d/%.03f,%.03f.dem",
MAPS_CACHE_DIR,
(gint) j,
floor(i*8)/8,
floor(j*8)/8 );
- if ( access(buf, F_OK ) == 0 ) {
+ if ( g_file_test(buf, G_FILE_TEST_EXISTS ) == TRUE ) {
VikCoord ne, sw;
gint x1, y1, x2, y2;
sw.north_south = i;
*/
static gboolean dem_layer_add_file ( VikDEMLayer *vdl, const gchar *full_path )
{
- if ( access(full_path, F_OK ) == 0 ) {
- /* only load if file size is not 0 (not in progress */
+ if ( g_file_test(full_path, G_FILE_TEST_EXISTS ) == TRUE ) {
+ /* only load if file size is not 0 (not in progress) */
struct stat sb;
stat (full_path, &sb);
if ( sb.st_size ) {
gchar *duped_path = g_strdup(full_path);
vdl->files = g_list_prepend ( vdl->files, duped_path );
a_dems_load ( duped_path );
- g_warning(duped_path);
+ g_debug("%s: %s", __FUNCTION__, duped_path);
vik_layer_emit_update ( VIK_LAYER(vdl) );
}
return TRUE;
gchar *dem_file = NULL;
if ( vdl->source == DEM_SOURCE_NONE )
- a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vdl), "No download source selected. Edit layer properties." );
+ a_dialog_error_msg ( VIK_GTK_WINDOW_FROM_LAYER(vdl), _("No download source selected. Edit layer properties.") );
vik_viewport_screen_to_coord ( vvp, event->x, event->y, &coord );
vik_coord_to_latlon ( &coord, &ll );
full_path = g_strdup_printf("%s%s", MAPS_CACHE_DIR, dem_file );
- g_warning(full_path);
+ g_debug("%s: %s", __FUNCTION__, full_path);
// TODO: check if already in filelist
if ( ! dem_layer_add_file(vdl, full_path) ) {
- gchar *tmp = g_strdup_printf ( "Downloading DEM %s ", dem_file );
+ gchar *tmp = g_strdup_printf ( _("Downloading DEM %s"), dem_file );
DEMDownloadParams *p = g_malloc(sizeof(DEMDownloadParams));
p->dest = g_strdup(full_path);
p->lat = ll.lat;