]> err.no Git - mapper/blobdiff - src/osm-db-import.c
Remove old map sources
[mapper] / src / osm-db-import.c
index 1ad250e2c1770bba36aff1347036e829da5b2a19..45aa325839d31ec15dd90e0ce2fc6ac6526643aa 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
@@ -137,6 +137,7 @@ struct _nodeinfo {
        { "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 },
@@ -147,15 +148,15 @@ struct _nodeinfo {
        { "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 },
@@ -164,11 +165,11 @@ struct _nodeinfo {
        { "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 },
@@ -182,6 +183,7 @@ struct _nodeinfo {
        { "shop",        "food",                NODE_AMENITY_SHOP },
        { "shop",        "drinks",              NODE_AMENITY_SHOP },
        { "shop",        "sex",                 NODE_AMENITY_SHOP_ADULT },
+
        { "shop",        "pharmacy",    NODE_AMENITY_PHARMACY },
 
        /* Sport */
@@ -239,6 +241,7 @@ struct _nodeinfo {
        { "railway", "halt",            NODE_RAILWAY_HALT },
 
        { "aeroway", "terminal",        NODE_AIRPORT_TERMINAL },
+       { "aeroway", "aerodrome",       NODE_AIRPORT_TERMINAL },
 
        /* Places */    
        { "place", "city",                      NODE_PLACE_CITY },
@@ -318,14 +321,21 @@ static node *cnode=NULL;
 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;
@@ -338,9 +348,6 @@ struct sql_stmt {
        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;
 
@@ -370,7 +377,7 @@ sqlite3_finalize(sql.delete_nodes);
 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);
@@ -399,7 +406,7 @@ sqlite3_prepare_v2(db, "update nodes set l=l+1 where nid=?", -1, &sql.update_nod
 
 /* 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) "
@@ -558,20 +565,9 @@ return db_exec(db,sql.update_node);
 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);
@@ -880,11 +876,7 @@ if (n==NULL)
        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++;
 }
@@ -912,12 +904,11 @@ osm_new_node(gint id, gdouble lat, gdouble lon)
 {
 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;
 }
 
@@ -945,14 +936,7 @@ if (w==NULL)
 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
@@ -976,14 +960,10 @@ osm_new_way(gint id)
 {
 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;
@@ -1175,7 +1155,7 @@ osm_planet_poi_clear_nodes(void)
 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);
 }
 
@@ -1191,17 +1171,19 @@ 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);
@@ -1213,7 +1195,9 @@ static void
 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),
@@ -1225,20 +1209,20 @@ if (dbway_cnt % 15000==0 && dbway_cnt>0) {
 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);
 }
 
 /*********************************************************************/
@@ -1371,6 +1355,23 @@ switch (t) {
 }
 }
 
+#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)
 {
@@ -1406,8 +1407,7 @@ switch (t) {
                 * - 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);
@@ -1422,12 +1422,11 @@ switch (t) {
                        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");
@@ -1755,6 +1754,12 @@ if (db_connect(&db, database)!=TRUE) {
        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;