]> err.no Git - mapper/blobdiff - src/osm-db.c
Remove useless includes
[mapper] / src / osm-db.c
index 5b4ae8f4d481c17705cc2c2f62061ed077a3c4f9..3702ef1d37bb6c0863e4536d7dd64875741d457a 100644 (file)
@@ -1,17 +1,13 @@
 #define _GNU_SOURCE
 
-#include <stdio.h>
 #include <unistd.h>
 #include <string.h>
 #include <strings.h>
 #include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
 #include <math.h>
 #include <glib.h>
 #include <glib/gstdio.h>
 #include <sqlite3.h>
-#include <expat.h>
 
 #include "osm.h"
 #include "latlon.h"
@@ -33,14 +29,27 @@ gboolean osm_way_get_nodes(osm_way *w);
 gboolean osm_way_get_name(osm_way *w);
 gboolean osm_way_get_ref(osm_way *w);
 
+static GTimer *dbt;
+
 /* Cache hash tables */
 static GHashTable *_place_cache;
 
 /*****************************************************************************/
 
+int
+osm_progress(void *ud)
+{
+g_print(".");
+return 0;
+}
+
 gboolean
 osm_db_prepare(sqlite3 *db)
 {
+#ifdef DEBUG
+sqlite3_progress_handler(db, 1000, osm_progress, NULL);
+#endif
+
 /* Place */
 /* Select nearest place inside lat,lon+-range */
 if (sqlite3_prepare_v2(db, "select name,(($LAT-lat)*($LAT-lat))+(($LON-lon)*($LON-lon)) as dist,"
@@ -69,6 +78,7 @@ if (sqlite3_prepare_v2(db, "select wid,type,nodes,flags,"
                                        " where wid=wsid and way_seg.node=nodes.nid "
                                        " and lat between $LAT-$RANGE and $LAT+$RANGE "
                                        " and lon between $LON-$RANGE and $LON+$RANGE "
+                                       " and type between $WTS and $WTY " 
                                        " order by dist",
                    -1, &sql.select_way, NULL)!=SQLITE_OK)
        return FALSE;
@@ -94,6 +104,7 @@ gboolean
 osm_init(void)
 {
 _place_cache=g_hash_table_new(g_direct_hash, g_direct_equal);
+dbt=g_timer_new();
 return TRUE;
 }
 
@@ -101,6 +112,7 @@ void
 osm_deinit(void)
 {
 g_hash_table_destroy(_place_cache);
+g_timer_destroy(dbt);
 }
 
 /*****************************************************************************/
@@ -310,20 +322,27 @@ osm_find_nearest_way_nodes(gint lat, gint lon, guint range)
 {
 GList *ways=NULL;
 osm_way *w;
+gulong tms;
+gint wc=0;
 
 sqlite3_reset(sql.select_way);
 sqlite3_clear_bindings(sql.select_way);
 
 if (SQLITE_OK != sqlite3_bind_int(sql.select_way, 1, lat) ||
     SQLITE_OK != sqlite3_bind_int(sql.select_way, 2, lon) ||
-    SQLITE_OK != sqlite3_bind_int(sql.select_way, 3, range)) {
+    SQLITE_OK != sqlite3_bind_int(sql.select_way, 3, range) ||
+    SQLITE_OK != sqlite3_bind_int(sql.select_way, 4, WAY_ROAD_START) ||
+    SQLITE_OK != sqlite3_bind_int(sql.select_way, 5, WAY_ROAD_END)) {
        g_printerr("Failed to bind values for way\n");
        return NULL;
 }
 
+g_timer_start(dbt);
+
 while (SQLITE_ROW == sqlite3_step(sql.select_way)) {
        guint32 dist;
 
+       wc++;
        w=g_slice_new0(osm_way);
        w->id=sqlite3_column_int(sql.select_way, 0);
        w->type=sqlite3_column_int(sql.select_way, 1);
@@ -335,10 +354,13 @@ while (SQLITE_ROW == sqlite3_step(sql.select_way)) {
        ways=g_list_prepend(ways, w);
 }
 
+g_timer_stop(dbt);
+g_printf("Query took: %f sec, found: %d ways\n", g_timer_elapsed(dbt, &tms), wc);
+
 return ways;
 }
 
-static gdouble magnitude(gdouble x1, gdouble y1, gdouble x2, gdouble y2)
+inline gdouble magnitude(gdouble x1, gdouble y1, gdouble x2, gdouble y2)
 {
 gdouble x,y;
 x=x2-x1;
@@ -394,6 +416,7 @@ GList *iter;
 GList *w=NULL;
 guint range=8192;
 osm_way *cw=NULL;
+gdouble pdist=900000.0, pndist=9000000.0;
 
 while ((w=osm_find_nearest_way_nodes(lat, lon, range))==NULL && range<=65536) {
        range=range<<1;
@@ -402,70 +425,61 @@ while ((w=osm_find_nearest_way_nodes(lat, lon, range))==NULL && range<=65536) {
 
 g_printf("Found ways: %d\n", g_list_length(w));
 
-switch (g_list_length(w)) {
-       case 0:
-               return NULL;
-       break;
-       default:
-       {
-               gdouble pdist=900000.0, pndist=9000000.0;
-
-               for (iter=w; iter!=NULL; iter=iter->next) {
-                       osm_way_node *wnf;
-                       osm_way_node *wnt;
+if (g_list_length(w)==0)
+       return NULL;
 
-                       osm_way *way=(osm_way*)iter->data;
+for (iter=w; iter!=NULL; iter=iter->next) {
+       osm_way_node *wnf;
+       osm_way_node *wnt;
+       osm_way *way=(osm_way*)iter->data;
 
 #ifdef DEBUG_OSM
-                       g_printf("WAY %d (%d) HAS %d NODES, nearest is %d\n", 
-                               way->id, way->type, way->nodecnt, way->node_num);
+       g_printf("WAY %d (%d) HAS %d NODES, nearest is %d\n", 
+               way->id, way->type, way->nodecnt, way->node_num);
 #endif
 
-                       if (osm_way_get_nodes(way)==FALSE)
-                               continue;
+       if (osm_way_get_nodes(way)==FALSE)
+               continue;
 
-                       if (way->nodes==0) {
-                               g_printerr("Way with 0 nodes ? Skipping\n");
-                               continue;
-                       }
-
-                       wnf=g_list_nth_data(way->nodes, way->node_num);
-                       if (!wnf) {
-                               osm_way_free(way);
-                               continue;
-                       }
+       if (way->nodes==0) {
+               g_printerr("Way with 0 nodes ? Skipping\n");
+               continue;
+       }
 
-                       if ( (way->node_num==way->nodecnt) || (way->node_num==0)) {
-                               wnt=g_list_nth_data(way->nodes, way->node_num==way->nodecnt ? way->nodecnt-1 : 1);
-                               if (osm_way_distance(lat, lon, wnf, wnt, &pndist)==FALSE) {
-                                       osm_way_free(way);
-                                       continue;
-                               }
-                       } else {
-                               wnt=g_list_nth_data(way->nodes, way->node_num-1);
-                               if (osm_way_distance(lat, lon, wnf, wnt, &pndist)==FALSE) {
-                                       wnt=g_list_nth_data(way->nodes, way->node_num+1);
-                                       if (osm_way_distance(lat, lon, wnf, wnt, &pndist)==FALSE) {
-                                               osm_way_free(way);
-                                               continue;
-                                       }
-                               }
-                       }
+       wnf=g_list_nth_data(way->nodes, way->node_num);
+       if (!wnf) {
+               osm_way_free(way);
+               continue;
+       }
 
-                       if (pndist<pdist) {
-                               g_printf("Found close way, distance: %f (Previous distance: %f)\n", pndist, pdist);
-                               pdist=pndist;
-                               way->node_f=wnf;
-                               way->node_t=wnt;
-                               way->distance=pndist;
-                               cw=way;
-                       } else {
+       if ((way->node_num==way->nodecnt) || (way->node_num==0)) {
+               wnt=g_list_nth_data(way->nodes, way->node_num==way->nodecnt ? way->nodecnt-1 : 1);
+               if (osm_way_distance(lat, lon, wnf, wnt, &pndist)==FALSE) {
+                       osm_way_free(way);
+                       continue;
+               }
+       } else {
+               wnt=g_list_nth_data(way->nodes, way->node_num-1);
+               if (osm_way_distance(lat, lon, wnf, wnt, &pndist)==FALSE) {
+                       wnt=g_list_nth_data(way->nodes, way->node_num+1);
+                       if (osm_way_distance(lat, lon, wnf, wnt, &pndist)==FALSE) {
                                osm_way_free(way);
-                               way=NULL;
+                               continue;
                        }
                }
        }
-       break;
+
+       if (pndist<pdist) {
+               g_printf("Found close way, distance: %f (Previous distance: %f)\n", pndist, pdist);
+               pdist=pndist;
+               way->node_f=wnf;
+               way->node_t=wnt;
+               way->distance=pndist;
+               cw=way;
+       } else {
+               osm_way_free(way);
+               way=NULL;
+       }
 }
 
 g_list_free(w);