/*
* This file is part of mapper
*
- * Copyright (C) 2007 Kaj-Michael Lang
+ * Copyright (C) 2008 Kaj-Michael Lang
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
{ "amenity", "bank", NODE_AMENITY_BANK },
{ "amenity", "police", NODE_AMENITY_POLICE },
+
{ "amenity", "speed_trap", NODE_AMENITY_SPEEDCAM },
{ "amenity", "speed_camera", NODE_AMENITY_SPEEDCAM },
{ "amenity", "speed camera", NODE_AMENITY_SPEEDCAM },
{ "amenity", "college", NODE_AMENITY_COLLEGE },
{ "amenity", "university", NODE_AMENITY_COLLEGE },
- { "amenity", "library", NODE_AMENITY_LIBRARY },
+ { "amenity", "library", NODE_AMENITY_LIBRARY },
{ "amenity", "townhall", NODE_AMENITY_TOWNHALL },
- { "amenity", "supermarket", NODE_AMENITY_SHOP },
- { "amenity", "shopping_centre", NODE_AMENITY_SHOP },
+ { "amenity", "supermarket", NODE_AMENITY_SHOP_SUPERMARKET },
+ { "amenity", "shopping_centre", NODE_AMENITY_SHOPPING_CENTER },
{ "amenity", "shop", NODE_AMENITY_SHOP },
{ "amenity", "shops", NODE_AMENITY_SHOP },
- { "amenity", "shopping", NODE_AMENITY_SHOP },
- { "amenity", "shopping_mall",NODE_AMENITY_SHOP },
+ { "amenity", "shopping", NODE_AMENITY_SHOPPING_CENTER },
+ { "amenity", "shopping_mall",NODE_AMENITY_SHOPPING_CENTER },
{ "amenity", "cycle_shop", NODE_AMENITY_SHOP },
{ "amenity", "bike_shop", NODE_AMENITY_SHOP },
{ "amenity", "coffee_shop", NODE_AMENITY_SHOP },
{ "amenity", "tea_shop", NODE_AMENITY_SHOP },
/* Shops */
- { "shop", "supermarket", NODE_AMENITY_SHOP },
+ { "shop", "supermarket", NODE_AMENITY_SHOP_SUPERMARKET },
+ { "shop", "alcohol", NODE_AMENITY_SHOP_ALCOHOL },
+ { "shop", "flowers", NODE_AMENITY_SHOP_FLOWERS },
{ "shop", "bakery", NODE_AMENITY_SHOP },
- { "shop", "alcohol", NODE_AMENITY_SHOP },
{ "shop", "butcher", NODE_AMENITY_SHOP },
- { "shop", "flowers", NODE_AMENITY_SHOP },
{ "shop", "clothing", NODE_AMENITY_SHOP },
{ "shop", "souvenir", NODE_AMENITY_SHOP },
{ "shop", "bicycles", NODE_AMENITY_SHOP },
{ "shop", "food", NODE_AMENITY_SHOP },
{ "shop", "drinks", NODE_AMENITY_SHOP },
{ "shop", "sex", NODE_AMENITY_SHOP_ADULT },
+
{ "shop", "pharmacy", NODE_AMENITY_PHARMACY },
/* Sport */
{ "railway", "halt", NODE_RAILWAY_HALT },
{ "aeroway", "terminal", NODE_AIRPORT_TERMINAL },
+ { "aeroway", "aerodrome", NODE_AIRPORT_TERMINAL },
/* Places */
{ "place", "city", NODE_PLACE_CITY },
static way *cway=NULL;
struct sql_stmt {
+ /* POIs */
sqlite3_stmt *insert_poi;
sqlite3_stmt *delete_osm_poi;
+ /* Places */
+ sqlite3_stmt *insert_place;
+ sqlite3_stmt *delete_places;
+
+ /* Nodes */
sqlite3_stmt *insert_node;
sqlite3_stmt *delete_nodes;
sqlite3_stmt *select_node;
sqlite3_stmt *update_node;
+ /* Ways */
sqlite3_stmt *insert_way_data;
sqlite3_stmt *insert_way_ref;
sqlite3_stmt *insert_way_pc;
sqlite3_stmt *delete_way_names_nls;
sqlite3_stmt *delete_way_ref;
sqlite3_stmt *delete_way_pc;
-
- sqlite3_stmt *insert_place;
- sqlite3_stmt *delete_place;
};
static struct sql_stmt sql;
sqlite3_finalize(sql.update_node);
sqlite3_finalize(sql.insert_place);
-sqlite3_finalize(sql.delete_place);
+sqlite3_finalize(sql.delete_places);
sqlite3_finalize(sql.delete_way);
sqlite3_finalize(sql.insert_way_data);
/* Places */
sqlite3_prepare_v2(db, "insert or replace into places (nid,type,name,isin_c,isin_p) values (?, ?, ?, ?, ?)", -1, &sql.insert_place, NULL);
-sqlite3_prepare_v2(db, "delete from places", -1, &sql.delete_place, NULL);
+sqlite3_prepare_v2(db, "delete from places", -1, &sql.delete_places, NULL);
/* POI nodes */
if (sqlite3_prepare_v2(db, "insert or replace into poi (osm_id, lat, lon, label, cat_id, public, source, priority, isin_c, isin_p, desc, url, postal_code) "
static gboolean
db_insert_way_n2n(way *w, node *nf, node *nt)
{
-if (!w) {
- g_printf("NULL WAY\n");
- return FALSE;
-}
-
-if (!nf) {
- g_printf("NULL NODE 1\n");
- return FALSE;
-}
-
-if (!nt) {
- g_printf("NULL NODE 2\n");
- return FALSE;
-}
+g_return_val_if_fail(w, FALSE);
+g_return_val_if_fail(nf, FALSE);
+g_return_val_if_fail(nt, FALSE);
sqlite3_bind_int(sql.insert_way_n2n, 1, w->id);
sqlite3_bind_int(sql.insert_way_n2n, 2, nf->id);
return;
if (n->data!=NULL)
return;
-n->data=g_slice_new(node_data);
-n->data->name=NULL;
-n->data->url=NULL;
-n->data->desc=NULL;
-n->data->postal_code=NULL;
+n->data=g_slice_new0(node_data);
n->type=NODE_PLAIN;
noded_cnt++;
}
{
node *n=NULL;
-n=g_slice_new(node);
+n=g_slice_new0(node);
g_assert(n);
n->id=id;
n->lat=lat;
n->lon=lon;
-n->data=(node_data *)NULL;
return n;
}
if (w->data!=NULL)
return;
-w->data=g_slice_new(way_data);
-w->data->name=NULL;
-w->data->names=NULL;
-w->data->ref=NULL;
-w->data->int_ref=NULL;
-w->data->postal_code=NULL;
-w->data->layer=0;
-w->data->speed=0;
+w->data=g_slice_new0(way_data);
}
static void
{
way *w;
-w=g_slice_new(way);
+w=g_slice_new0(way);
g_assert(w);
w->id=id;
-w->nodes=NULL;
w->type=WAY_UNWAYED;
-w->data=NULL;
-w->ncnt=0;
-w->flags=0;
/* Add to list of ways */
return w;
g_print("Removing old OSM POIs...\n");
db_transaction_begin(db);
sqlite3_step(sql.delete_osm_poi);
-sqlite3_step(sql.delete_place);
+sqlite3_step(sql.delete_places);
return db_transaction_commit(db);
}
/*********************************************************************/
-static void
+static gboolean
osm_planet_clear_nodes(void)
{
-g_print("Clearing old nodes\n");
+g_print("Clearing old nodes...\n");
+db_transaction_begin(db);
sqlite3_step(sql.delete_nodes);
+return db_transaction_commit(db);
}
static gboolean
osm_planet_save_nodes(void)
{
-g_print("Storing nodes...\n");
+g_print("Storing new nodes...\n");
db_transaction_begin(db);
g_hash_table_foreach(osm_nodes, osm_node_save_node, NULL);
return db_transaction_commit(db);
osm_way_save(way *value, gpointer user_data)
{
dbway_cnt++;
+db_transaction_begin(db);
db_insert_way(value);
+db_transaction_commit(db);
if (dbway_cnt % 15000==0 && dbway_cnt>0) {
g_printf("\rWays: %f%% (%u/%u)\n",
(((float)dbway_cnt/(float)way_cnt)*100),
static void
osm_planet_clear_ways(void)
{
-g_print("Clearing old data\n");
+g_print("Clearing old way data...\n");
+db_transaction_begin(db);
sqlite3_step(sql.delete_way);
sqlite3_step(sql.delete_way_name);
sqlite3_step(sql.delete_way_ref);
sqlite3_step(sql.delete_way_n2n);
+db_transaction_commit(db);
}
static gboolean
osm_planet_save_ways(void)
{
g_print("Inserting new ways\n");
-db_transaction_begin(db);
g_slist_foreach(osm_ways, osm_way_save, NULL);
-return db_transaction_commit(db);
}
/*********************************************************************/
}
}
+#define GET_NODE_KEY(key, nfield) { \
+ gchar *_kv; \
+ _kv=g_hash_table_lookup(osm_node_tags, key); \
+ if (_kv) { \
+ if (!nfield) { \
+ nfield=g_strstrip(g_utf8_normalize(_kv, -1, G_NORMALIZE_ALL_COMPOSE)); \
+ } else { \
+ gchar *_tmp=nfield; \
+ gchar *_norm=g_utf8_normalize(_kv, -1, G_NORMALIZE_ALL_COMPOSE); \
+ nfield=g_strdup_printf("%s %s", _tmp, g_strstrip(_norm)); \
+ g_free(_tmp); \
+ g_free(_norm); \
+ } \
+ } \
+}
+
+
static void
_osm_tag_end(void *userData, const char *name)
{
* - Places (for is_in)
* - ...
*/
- if ((osm_node_check_box(cnode->lat, cnode->lon)==FALSE) &&
- (cnode->type<NODE_PLACE_START)) {
+ if ((osm_node_check_box(cnode->lat, cnode->lon)==FALSE) && (cnode->type<NODE_PLACE_START)) {
osm_free_node_data(cnode);
osm_free_node(cnode);
g_hash_table_destroy(osm_node_tags);
v=g_hash_table_lookup(osm_node_tags, "name");
if (v)
cnode->data->name=g_strstrip(g_utf8_normalize(v, -1, G_NORMALIZE_ALL_COMPOSE));
- v=g_hash_table_lookup(osm_node_tags, "note");
- if (v)
- cnode->data->desc=g_strstrip(g_strdup(v));
- v=g_hash_table_lookup(osm_node_tags, "postal_code");
- if (v)
- cnode->data->postal_code=g_strstrip(g_strdup(v));
+
+ GET_NODE_KEY("description", cnode->data->desc);
+ GET_NODE_KEY("note", cnode->data->desc);
+ GET_NODE_KEY("postal_code", cnode->data->postal_code);
+ GET_NODE_KEY("address", cnode->data->desc);
/* Links */
v=g_hash_table_lookup(osm_node_tags, "url");
return FALSE;
}
+/* Set some sqlite PRAGMAs to speed up import */
+sqlite3_exec(db, "PRAGMA cache_size=16000;", NULL, NULL, NULL);
+sqlite3_exec(db, "PRAGMA locking_mode=EXCLUSIVE;", NULL, NULL, NULL);
+sqlite3_exec(db, "PRAGMA journal_mode=PERSIST;", NULL, NULL, NULL);
+sqlite3_exec(db, "PRAGMA synchronous=OFF;", NULL, NULL, NULL);
+
if (!osm_db_create(db)) {
g_printerr("Failed to create osm tables or indexes\n");
return FALSE;