From c6043054f87050f01e96b55d891847d5f1558249 Mon Sep 17 00:00:00 2001 From: Kaj-Michael Lang Date: Wed, 31 Oct 2007 15:12:06 +0200 Subject: [PATCH] More work on way name search. --- src/osm-db.c | 118 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 104 insertions(+), 14 deletions(-) diff --git a/src/osm-db.c b/src/osm-db.c index 7a1643e..0d111d2 100644 --- a/src/osm-db.c +++ b/src/osm-db.c @@ -33,6 +33,7 @@ #include "latlon.h" #include "gps.h" #include "osm-db.h" +#include "settings.h" /* #define DEBUG_OSM */ /* #define DEBUG_OSM_TIME */ @@ -169,10 +170,20 @@ if (sqlite3_prepare_v2(db, "select wid,type,nodes,flags," -1, &sql.select_way2, NULL)!=SQLITE_OK) return FALSE; -if (sqlite3_prepare_v2(db, "select w.wid,w.name as name from way_names as w,way as ww where ww.type between $WTS and $WTY and w.wid=ww.wid and w.name like ? " +if (sqlite3_prepare_v2(db, "select w.wid,w.name as name," + "(($LAT-lat)*($LAT-lat))+(($LON-lon)*($LON-lon)) as d,wn.f,w.lat,wlon " + " from way_names as w,way as ww where " + " ww.type between $WTS and $WTY and w.wid=ww.wid and w.name like $NAME " + " and w.lat between $LAT-$RANGE and $LAT+$RANGE " + " and w.lon between $LON-$RANGE and $LON+$RANGE " " union " - " select w.wid,n.name as name from way_names as w, way as ww,way_names_nls as n on w.wid=n.wid where " - " ww.type between $WTS and $WTY and w.wid=ww.wid and n.name like ? order by name", + " select w.wid,n.name as name," + "(($LAT-w.lat)*($LAT-w.lat))+(($LON-w.lon)*($LON-w.lon)) as d,wn.f,w.lat,wlon " + " from way_names as w, way as ww,way_names_nls as n on w.wid=n.wid where " + " ww.type between $WTS and $WTY and w.wid=ww.wid and n.name like $NAME " + " and w.lat between $LAT-$RANGE and $LAT+$RANGE " + " and w.lon between $LON-$RANGE and $LON+$RANGE " + " order by d", -1, &sql.select_way_name_search, NULL)!=SQLITE_OK) return FALSE; @@ -200,14 +211,16 @@ return TRUE; void osm_deinit(void) { -sqlite3_finalize(sql.select_way_ref); -sqlite3_finalize(sql.select_way_name); -sqlite3_finalize(sql.select_way_next_seg); -sqlite3_finalize(sql.select_way_prev_seg); -sqlite3_finalize(sql.select_way_name_search); -sqlite3_finalize(sql.select_way2); -sqlite3_finalize(sql.select_place); -sqlite3_finalize(sql.select_near_place); +if (osmdb!=NULL) { + sqlite3_finalize(sql.select_way_ref); + sqlite3_finalize(sql.select_way_name); + sqlite3_finalize(sql.select_way_next_seg); + sqlite3_finalize(sql.select_way_prev_seg); + sqlite3_finalize(sql.select_way_name_search); + sqlite3_finalize(sql.select_way2); + sqlite3_finalize(sql.select_place); + sqlite3_finalize(sql.select_near_place); +} osmdb=NULL; g_hash_table_destroy(place_cache); g_timer_destroy(dbt); @@ -216,8 +229,13 @@ g_timer_destroy(dbt); gboolean osm_init(sqlite3 **db) { -if (!db || !*db) +place_cache=g_hash_table_new(g_direct_hash, g_direct_equal); +dbt=g_timer_new(); + +if (!db || !*db) { + osmdb=NULL; return FALSE; +} osmdb=*db; if (osm_db_prepare(osmdb)==FALSE) { @@ -225,8 +243,6 @@ if (osm_db_prepare(osmdb)==FALSE) { g_printf("SQLITE: %s\n", sqlite3_errmsg(osmdb)); return FALSE; } -place_cache=g_hash_table_new(g_direct_hash, g_direct_equal); -dbt=g_timer_new(); return TRUE; } @@ -903,3 +919,77 @@ if (check_place==TRUE && d>way_dist_range*4) { return map_loc->street ? TRUE : FALSE; } + +gboolean +osm_way_search(gdouble lat, gdouble lon, gchar *text, GtkListStore **store) +{ +GtkTreeIter iter; +gchar *ltext=NULL; +guint rows=0; +gchar tmp1[16], tmp2[16]; +gdouble range=1; + +g_printf("Way Search: [%s] around %.6f %.6f\n", text, lat, lon); + +ltext=g_strdup_printf("%s%%", text); + + +if (SQLITE_OK != sqlite3_bind_double(sql.select_way_name_search, 1, lat) || + SQLITE_OK != sqlite3_bind_double(sql.select_way_name_search, 2, lon) || + SQLITE_OK != sqlite3_bind_int(sql.select_way_name_search, 3, WAY_ROAD_START) || + SQLITE_OK != sqlite3_bind_int(sql.select_way_name_search, 4, WAY_ROAD_END) || + SQLITE_OK != sqlite3_bind_double(sql.select_way_name_search, 6, range) || + SQLITE_OK != sqlite3_bind_text(sql.select_way_name_search, 5, ltext, -1, SQLITE_TRANSIENT)) { + g_printerr("Failed to bind values for sql.select_way_name_search\n"); + sqlite3_clear_bindings(sql.select_way_name_search); + g_free(ltext); + return FALSE; +} + +*store = gtk_list_store_new(ITEM_NUM_COLUMNS, + G_TYPE_INT, /* ID */ + G_TYPE_INT, /* Category ID */ + G_TYPE_DOUBLE, /* Latitude */ + G_TYPE_DOUBLE, /* Longitude */ + G_TYPE_DOUBLE, /* Distance */ + G_TYPE_STRING, /* Lat/Lon */ + G_TYPE_STRING, /* Label */ + G_TYPE_STRING, /* Desc. */ + G_TYPE_STRING); /* Category Label */ + +while (SQLITE_ROW == sqlite3_step(sql.select_way_name_search)) { + gdouble rlat, rlon, dist; + + rlat=sqlite3_column_double(sql.select_way_name_search, 0); + rlon=sqlite3_column_double(sql.select_way_name_search, 1); + lat_format(rlat, tmp1); + lon_format(rlon, tmp2); + dist=0.0; + + gtk_list_store_append(*store, &iter); + gtk_list_store_set(*store, &iter, + ITEM_ID, sqlite3_column_int(sql.select_way_name_search, 2), + ITEM_CATID, sqlite3_column_int(sql.select_way_name_search, 5), + ITEM_LAT, rlat, + ITEM_LON, rlon, + ITEM_DIST, dist, + ITEM_LATLON, g_strdup_printf("%s, %s", tmp1, tmp2), + ITEM_LABEL, sqlite3_column_text(sql.select_way_name_search, 3), + ITEM_DESC, sqlite3_column_text(sql.select_way_name_search, 4), + ITEM_CATLAB, sqlite3_column_text(sql.select_way_name_search, 6), + -1); + rows++; +} + +g_printf("Found: %d items\n", rows); + +sqlite3_reset(sql.select_way_name_search); +sqlite3_clear_bindings(sql.select_way_name_search); + +if (ltext) + g_free(ltext); + +return TRUE; +} + + -- 2.39.5