/** * vu_get_tz_at_location: * * @vc: Position for which the time zone is desired * * Returns: TimeZone string of the nearest known location. String may be NULL. * * Use the k-d tree method (http://en.wikipedia.org/wiki/Kd-tree) to quickly retreive * the nearest location to the given position. */ gchar* vu_get_tz_at_location ( const VikCoord* vc ) { gchar *tz = NULL; if ( !vc || !kd ) return tz; struct LatLon ll; vik_coord_to_latlon ( vc, &ll ); double pt[2] = { ll.lat, ll.lon }; gdouble nearest; if ( !a_settings_get_double(VIK_SETTINGS_NEAREST_TZ_FACTOR, &nearest) ) nearest = 1.0; struct kdres *presults = kd_nearest_range ( kd, pt, nearest ); while( !kd_res_end( presults ) ) { double pos[2]; gchar *ans = (gchar*)kd_res_item ( presults, pos ); // compute the distance of the current result from the pt double dist = sqrt( dist_sq( pt, pos, 2 ) ); if ( dist < nearest ) { //printf( "NEARER node at (%.3f, %.3f, %.3f) is %.3f away is %s\n", pos[0], pos[1], pos[2], dist, ans ); nearest = dist; tz = ans; } kd_res_next ( presults ); } g_debug ( "TZ lookup found %d results - picked %s", kd_res_size(presults), tz ); kd_res_free ( presults ); return tz; }
static void vik_viewport_init ( VikViewport *vvp ) { viewport_init_ra(); struct UTM utm; struct LatLon ll; ll.lat = a_vik_get_default_lat(); ll.lon = a_vik_get_default_long(); gdouble zoom_x = 4.0; gdouble zoom_y = 4.0; if ( a_vik_get_startup_method ( ) == VIK_STARTUP_METHOD_LAST_LOCATION ) { gdouble lat, lon, dzoom; if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_LATITUDE, &lat ) ) ll.lat = lat; if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_LONGITUDE, &lon ) ) ll.lon = lon; if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_ZOOM_X, &dzoom ) ) zoom_x = dzoom; if ( a_settings_get_double ( VIK_SETTINGS_VIEW_LAST_ZOOM_Y, &dzoom ) ) zoom_y = dzoom; } a_coords_latlon_to_utm ( &ll, &utm ); vvp->xmpp = zoom_x; vvp->ympp = zoom_y; vvp->xmfactor = MERCATOR_FACTOR (vvp->xmpp); vvp->ymfactor = MERCATOR_FACTOR (vvp->ympp); vvp->coord_mode = VIK_COORD_LATLON; vvp->drawmode = VIK_VIEWPORT_DRAWMODE_MERCATOR; vvp->center.mode = VIK_COORD_LATLON; vvp->center.north_south = ll.lat; vvp->center.east_west = ll.lon; vvp->center.utm_zone = (int)utm.zone; vvp->center.utm_letter = utm.letter; vvp->scr_buffer = NULL; vvp->alpha_pixbuf = NULL; vvp->alpha_pixbuf_width = vvp->alpha_pixbuf_height = 0; vvp->utm_zone_width = 0.0; vvp->background_gc = NULL; vvp->highlight_gc = NULL; vvp->scale_bg_gc = NULL; vvp->copyrights = NULL; vvp->draw_scale = TRUE; vvp->draw_centermark = TRUE; vvp->draw_highlight = TRUE; vvp->trigger = NULL; vvp->snapshot_buffer = NULL; vvp->half_drawn = FALSE; g_signal_connect (G_OBJECT(vvp), "configure_event", G_CALLBACK(vik_viewport_configure), NULL); #if GTK_CHECK_VERSION (2,18,0) gtk_widget_set_can_focus ( GTK_WIDGET(vvp), TRUE ); #else GTK_WIDGET_SET_FLAGS(vvp, GTK_CAN_FOCUS); /* allow VVP to have focus -- enabling key events, etc */ #endif }