]> err.no Git - mapper/commitdiff
Start to use a static location structure, with street/primary/secondary location.
authorKaj-Michael Lang <milang@angel.tal.org>
Tue, 24 Jul 2007 20:43:15 +0000 (23:43 +0300)
committerKaj-Michael Lang <milang@angel.tal.org>
Tue, 24 Jul 2007 20:43:15 +0000 (23:43 +0300)
Check if we are on the same way as last time and skip database query if so.
Use idle function to update location. (For now, a thread would be nicer so the UI won't block even if the query would take time).

src/map.c

index c926cd1bbababbeaebcbc1942a0ca134c22a6b74..c9e914ee3efb0888c910757f4f6caadbb0072ce8 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -57,6 +57,7 @@ static gint _map_mode=0;
 guint _num_downloads=0;
 guint _curr_download=0;
 
+static osm_location map_loc = {NULL, NULL, NULL};
 static GHashTable *map_tile_hash = NULL;
 
 void map_render_paths();
@@ -947,6 +948,20 @@ void map_move_mark()
        vprintf("%s(): return\n", __PRETTY_FUNCTION__);
 }
 
+gboolean
+map_update_location_from_gps()
+{
+map_update_location(_pos.unitx, _pos.unity);
+return FALSE;
+}
+
+gboolean
+map_update_location_from_center()
+{
+map_update_location(_center.unitx, _center.unity);
+return FALSE;
+}
+
 /**
  * Make sure the mark is up-to-date.  This function triggers a panning of
  * the view if the mark is appropriately close to the edge of the view.
@@ -972,7 +987,7 @@ void refresh_mark()
                speed_limit();
 
        if (_center_mode>0)
-               map_update_location(_pos.unitx, _pos.unity);
+               g_idle_add((GSourceFunc)map_update_location_from_gps, NULL);
 
        vprintf("%s(): return\n", __PRETTY_FUNCTION__);
 }
@@ -1383,8 +1398,7 @@ static void
 map_update_location(gint x, gint y)
 {
 gint ilat, ilon;
-gdouble lat,lon;
-osm_way *street;
+gdouble lat,lon, dist;
 osm_place mplace;
 osm_place splace;
 PoiInfo *p;
@@ -1394,11 +1408,21 @@ unit2latlon(x, y, lat, lon);
 ilat=lat2mp_int(lat);
 ilon=lon2mp_int(lon);
 
+/* Check if we are still near the same way as last time */
+if (map_loc.street && osm_way_distance(ilat, ilon, map_loc.street->node_f, map_loc.street->node_t, &dist)==TRUE) {
+       if (dist>15000.0) {
+               osm_way_free(map_loc.street);
+               map_loc.street=osm_find_nearest_way(ilat, ilon);
+       }
+} else {
+       osm_way_free(map_loc.street);
+       map_loc.street=osm_find_nearest_way(ilat, ilon);
+}
+
 mplace.name=NULL;
 splace.name=NULL;
 
 p=poi_find_nearest(lat, lon);
-street=osm_find_nearest_way(ilat, ilon);
 osm_find_nearest_place(NODE_PLACE_SUBURB, ilat, ilon, &splace);
 
 if (splace.isin!=0) {
@@ -1412,8 +1436,8 @@ if (splace.isin!=0) {
        } else {
                g_printf("In %s\n", mplace.name);
        }
-} else if (street && street->isin!=0) {
-       if (osm_place_get(street->isin, ilat, ilon, &mplace)==FALSE) {
+} else if (map_loc.street && map_loc.street->isin!=0) {
+       if (osm_place_get(map_loc.street->isin, ilat, ilon, &mplace)==FALSE) {
 
        } else {
                g_printf("In %s\n", mplace.name);
@@ -1428,8 +1452,7 @@ if (splace.isin!=0) {
 
 }
 
-map_set_place_information(street, &mplace, &splace, p);
-osm_way_free(street);
+map_set_place_information(map_loc.street, &mplace, &splace, p);
 }
 
 gboolean map_cb_scroll_event(GtkWidget * widget, GdkEventScroll * event)
@@ -1511,10 +1534,14 @@ gint ux,uy;
                break;
                }
 
+#if 0
                ux = x2unit((gint) (event->x + 0.5));
                uy = y2unit((gint) (event->y + 0.5));
-
                map_update_location(ux, uy);
+#endif
+
+               g_idle_add((GSourceFunc)map_update_location_from_center, NULL);
+
 
                map_center_unit(x2unit((gint) (event->x + 0.5)),
                                y2unit((gint) (event->y + 0.5)));