void gpsFixCallback (const gps_common::GPSFix::ConstPtr & msg)
{
    // **** get GTK thread lock
    gdk_threads_enter ();

    gint pixel_x, pixel_y;

    OsmGpsMapPoint *point = osm_gps_map_point_new_degrees (msg->latitude, msg->longitude);
    osm_gps_map_convert_geographic_to_screen (data->map, point, &pixel_x, &pixel_y);

    if (OSM_IS_GPS_MAP (data->map))
    {

        // **** Center map on gps data received
        if (data->lock_view)
        {
            update_uav_pose_osd (data->osd, TRUE, pixel_x, pixel_y);
            osm_gps_map_set_center (data->map, msg->latitude, msg->longitude);
        }
        else
        {
            update_uav_pose_osd (data->osd, FALSE, pixel_x, pixel_y);
            osm_gps_map_gps_clear (data->map);
        }

        // **** Add point to the track
        osm_gps_map_track_add_point (data->uav_track, point);
    }

    // **** release GTK thread lock
    gdk_threads_leave ();
}
Ejemplo n.º 2
0
/**
 * osm_gps_map_geographic_to_screen:
 *
 * Deprecated: 0.7.0: Use osm_gps_map_convert_geographic_to_screen() instead.
 **/
void
osm_gps_map_geographic_to_screen (OsmGpsMap *map,
                                  gfloat latitude, gfloat longitude,
                                  gint *pixel_x, gint *pixel_y)
{
    OsmGpsMapPoint p;
    g_warning("%s is deprecated", G_STRFUNC);
    osm_gps_map_point_set_degrees(&p, latitude, longitude);
    osm_gps_map_convert_geographic_to_screen(map, &p, pixel_x, pixel_y);
}
Ejemplo n.º 3
0
static int _view_map_get_img_at_pos(dt_view_t *self, double x, double y)
{
  dt_map_t *lib = (dt_map_t*)self->data;
  GSList *iter;

  for(iter = lib->images; iter != NULL; iter = iter->next)
  {
    dt_map_image_t *entry = (dt_map_image_t*)iter->data;
    OsmGpsMapImage *image = entry->image;
    OsmGpsMapPoint *pt = (OsmGpsMapPoint*)osm_gps_map_image_get_point(image);
    gint img_x=0, img_y=0;
    osm_gps_map_convert_geographic_to_screen(lib->map, pt, &img_x, &img_y);
    if(x >= img_x && x <= img_x + entry->width && y <= img_y && y >= img_y - entry->height)
      return entry->imgid;
  }

  return 0;
}
Ejemplo n.º 4
0
static void
coordinates_render(OsmGpsMapAis *self, OsmGpsMap *map)
{
    OsdCoordinates_t *coordinates = self->priv->coordinates;
	OsmGpsMapPoint point;

    if(!coordinates->surface)
        return;
	gfloat lat, lon;
	g_object_get(G_OBJECT(map), "latitude", &lat, "longitude", &lon, NULL);
	coordinates->lat = lat;
	coordinates->lon = lon;

	gint pixel_x, pixel_y;

    g_assert(coordinates->surface);
    cairo_t *cr = cairo_create(coordinates->surface);
    cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 0.0);
    cairo_paint(cr);
    cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);
	cairo_set_line_width(cr, 1);

	int i;
	float theta;
	printf("Number of vessels: %d\n",numberofships);
	G_LOCK(updatemap);
	for(i=0;i<numberofships;i++) {
		osm_gps_map_point_set_degrees(&point, ships[i]->latitude, ships[i]->longitude);
		osm_gps_map_convert_geographic_to_screen(map, &point, &pixel_x,&pixel_y);
		if (ships[i]->heading != 511)
			theta = ships[i]->heading * M_PI / 180;
		else
			theta = ships[i]->course * M_PI / 180;
		draw_one_boat(cr,(int)pixel_x,(int)pixel_y,theta);
		printf("%f %f\n",ships[i]->latitude, ships[i]->longitude);
	}
	G_UNLOCK(updatemap);


    cairo_destroy(cr);
}
Ejemplo n.º 5
0
void fcuGpsCallback(const sensor_msgs::NavSatFixConstPtr& gps) {
	// **** get GTK thread lock
	gdk_threads_enter();
	//fcuGpsData_ = (*gps);

	if (gps->status.status == sensor_msgs::NavSatStatus::STATUS_NO_FIX) {
		gtk_container_remove(GTK_CONTAINER(data->box_Gps), GTK_WIDGET (data->status_ok_icon_gps));
		gtk_box_pack_end(GTK_BOX (data->box_Gps), data->status_fail_icon_gps, TRUE, TRUE, 0);
	}
	else {
		gtk_container_remove(GTK_CONTAINER(data->box_Gps), GTK_WIDGET (data->status_fail_icon_gps));
		gtk_box_pack_end(GTK_BOX (data->box_Gps), data->status_ok_icon_gps, TRUE, TRUE, 0);

		gint pixel_x, pixel_y;

		ROS_DEBUG_STREAM("GPS coordinates: " << gps->latitude << ", " << gps->longitude);
		ROS_DEBUG_STREAM("GPS altitude information: " << gps->altitude);

		OsmGpsMapPoint *point = osm_gps_map_point_new_degrees(gps->latitude, gps->longitude);
		osm_gps_map_convert_geographic_to_screen(data->map, point, &pixel_x, &pixel_y);

		if (OSM_IS_GPS_MAP (data->map)) {
			// **** Centre map on GPS data received
			if (data->lock_view) {
				update_uav_pose_osd(data->osd, TRUE, pixel_x, pixel_y);
				osm_gps_map_set_center(data->map, gps->latitude, gps->longitude);
			}
			else {
				update_uav_pose_osd(data->osd, FALSE, pixel_x, pixel_y);
				osm_gps_map_gps_clear(data->map);
			}
			// **** Add point to the track
			osm_gps_map_track_add_point(data->uav_track, point);
		}
	}

	// **** release GTK thread lock
	gdk_threads_leave();
}
Ejemplo n.º 6
0
static void _view_map_post_expose(cairo_t *cri, int32_t width_i, int32_t height_i,
                                  int32_t pointerx, int32_t pointery, gpointer user_data)
{
  const int ts = 64;
  OsmGpsMapPoint bb[2], *l=NULL, *center=NULL;
  int px,py;
  dt_map_t *lib = (dt_map_t *)user_data;

  /* get bounding box coords */
  osm_gps_map_get_bbox(lib->map, &bb[0], &bb[1]);
  float bb_0_lat = 0.0, bb_0_lon = 0.0, bb_1_lat = 0.0, bb_1_lon = 0.0;
  osm_gps_map_point_get_degrees(&bb[0], &bb_0_lat, &bb_0_lon);
  osm_gps_map_point_get_degrees(&bb[1], &bb_1_lat, &bb_1_lon);

  /* make the bounding box a little bigger to the west and south */
  float lat0 = 0.0, lon0 = 0.0, lat1 = 0.0, lon1 = 0.0;
  OsmGpsMapPoint *pt0 = osm_gps_map_point_new_degrees(0.0, 0.0), *pt1 = osm_gps_map_point_new_degrees(0.0, 0.0);
  osm_gps_map_convert_screen_to_geographic(lib->map, 0, 0, pt0);
  osm_gps_map_convert_screen_to_geographic(lib->map, 1.5*ts, 1.5*ts, pt1);
  osm_gps_map_point_get_degrees(pt0, &lat0, &lon0);
  osm_gps_map_point_get_degrees(pt1, &lat1, &lon1);
  osm_gps_map_point_free(pt0);
  osm_gps_map_point_free(pt1);
  double south_border = lat0 - lat1, west_border = lon1 - lon0;

  /* get map view state and store  */
  int zoom = osm_gps_map_get_zoom(lib->map);
  center = osm_gps_map_get_center(lib->map);
  dt_conf_set_float("plugins/map/longitude", center->rlon);
  dt_conf_set_float("plugins/map/latitude", center->rlat);
  dt_conf_set_int("plugins/map/zoom", zoom);
  osm_gps_map_point_free(center);

  /* let's reset and reuse the main_query statement */
  DT_DEBUG_SQLITE3_CLEAR_BINDINGS(lib->statements.main_query);
  DT_DEBUG_SQLITE3_RESET(lib->statements.main_query);

  /* bind bounding box coords for the main query */
  DT_DEBUG_SQLITE3_BIND_DOUBLE(lib->statements.main_query, 1, bb_0_lon - west_border);
  DT_DEBUG_SQLITE3_BIND_DOUBLE(lib->statements.main_query, 2, bb_1_lon);
  DT_DEBUG_SQLITE3_BIND_DOUBLE(lib->statements.main_query, 3, bb_0_lat);
  DT_DEBUG_SQLITE3_BIND_DOUBLE(lib->statements.main_query, 4, bb_1_lat - south_border);

  /* query collection ids */
  while(sqlite3_step(lib->statements.main_query) == SQLITE_ROW)
  {
    int32_t imgid = sqlite3_column_int(lib->statements.main_query, 0);

    cairo_set_source_rgba(cri, 0, 0, 0, 0.4);

    /* free l if allocated */
    if (l)
      osm_gps_map_point_free(l);

    /* for each image check if within bbox */
    const dt_image_t *cimg = dt_image_cache_read_get(darktable.image_cache, imgid);
    double longitude = cimg->longitude;
    double latitude  = cimg->latitude;
    dt_image_cache_read_release(darktable.image_cache, cimg);
    if(isnan(latitude) || isnan(longitude))
      continue;
    l = osm_gps_map_point_new_degrees(latitude, longitude);

    /* translate l into screen coords */
    osm_gps_map_convert_geographic_to_screen(lib->map, l, &px, &py);

    /* dependent on scale draw different overlays */
    if (zoom >= 14)
    {
      dt_mipmap_buffer_t buf;
      dt_mipmap_size_t mip = dt_mipmap_cache_get_matching_size(darktable.mipmap_cache, ts, ts);
      dt_mipmap_cache_read_get(darktable.mipmap_cache, &buf, imgid, mip, 0);

      cairo_surface_t *surface = NULL;
      if(buf.buf)
      {
        float ms = fminf(
                     ts/(float)buf.width,
                     ts/(float)buf.height);

#if 0
        // this doesn't work since osm-gps-map always gives 0/0 as mouse coords :(
        /* find out if the cursor is over the image */
        if(pointerx >= px && pointerx <= (px + buf.width*ms + 4) && pointery <= (py - 8) && pointery >= (py - buf.height*ms - 8 - 4))
        {
          printf("over\n");
          cairo_set_source_rgba(cri, 1, 0, 0, 0.7);
        }
//         else
//           printf("%d/%d, %d/%d\n", px, py, pointerx, pointery);
#endif
        const int32_t stride = cairo_format_stride_for_width (CAIRO_FORMAT_RGB24, buf.width);
        surface = cairo_image_surface_create_for_data (buf.buf, CAIRO_FORMAT_RGB24,
                  buf.width, buf.height, stride);

        cairo_pattern_set_filter(cairo_get_source(cri), CAIRO_FILTER_NEAREST);
        cairo_save(cri);

        /* first of lets draw a pin */
        cairo_move_to(cri, px, py);
        cairo_line_to(cri, px+8, py-8);
        cairo_line_to(cri, px+4, py-8);
        cairo_fill(cri);

        /* and the frame around image */
        cairo_move_to(cri, px+2, py-8);
        cairo_line_to(cri, px+2 + (buf.width*ms) + 4, py-8);
        cairo_line_to(cri, px+2 + (buf.width*ms) + 4 , py-8-(buf.height*ms) - 4);
        cairo_line_to(cri, px+2 , py-8-(buf.height*ms) - 4);
        cairo_fill(cri);


        /* draw image*/
        cairo_translate(cri, px+4, py - 8 - (buf.height*ms) - 2);
        cairo_scale(cri, ms, ms);
        cairo_set_source_surface (cri, surface, 0, 0);
        cairo_paint(cri);

        cairo_restore(cri);

        cairo_surface_destroy(surface);

      }
    }
    else
    {
      /* just draw a patch indicating that there is images at the location */
      cairo_rectangle(cri, px-8, py-8, 16, 16);
      cairo_fill(cri);
    }
  }

}