#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"
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,"
" 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;
osm_init(void)
{
_place_cache=g_hash_table_new(g_direct_hash, g_direct_equal);
+dbt=g_timer_new();
return TRUE;
}
osm_deinit(void)
{
g_hash_table_destroy(_place_cache);
+g_timer_destroy(dbt);
}
/*****************************************************************************/
{
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);
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;
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;
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);