4
/ a tool loading OSM-XML maps into a SpatiaLite DB
6
/ version 1.0, 2010 April 8
8
/ Author: Sandro Furieri a.furieri@lqt.it
10
/ Copyright (C) 2010 Alessandro Furieri
12
/ This program is free software: you can redistribute it and/or modify
13
/ it under the terms of the GNU General Public License as published by
14
/ the Free Software Foundation, either version 3 of the License, or
15
/ (at your option) any later version.
17
/ This program is distributed in the hope that it will be useful,
18
/ but WITHOUT ANY WARRANTY; without even the implied warranty of
19
/ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20
/ GNU General Public License for more details.
22
/ You should have received a copy of the GNU General Public License
23
/ along with this program. If not, see <http://www.gnu.org/licenses/>.
27
#if defined(_WIN32) && !defined(__MINGW32__)
28
/* MSVC strictly requires this include [off_t] */
29
#include <sys/types.h>
39
#ifdef SPATIALITE_AMALGAMATION
40
#include <spatialite/sqlite3.h>
45
#include <spatialite/gaiageo.h>
46
#include <spatialite.h>
49
#define ARG_OSM_PATH 1
51
#define ARG_CACHE_SIZE 3
55
#if defined(_WIN32) && !defined(__MINGW32__)
56
#define strcasecmp _stricmp
57
#endif /* not WIN32 */
60
#define atol_64 _atoi64
67
#define CURRENT_TAG_UNKNOWN 0
68
#define CURRENT_TAG_IS_NODE 1
69
#define CURRENT_TAG_IS_WAY 2
70
#define CURRENT_TAG_IS_RELATION 3
74
/* an auxiliary struct used for XML parsing */
76
sqlite3_stmt *ins_tmp_nodes_stmt;
77
sqlite3_stmt *ins_tmp_ways_stmt;
78
sqlite3_stmt *ins_generic_point_stmt;
79
sqlite3_stmt *ins_addresses_stmt;
80
sqlite3_stmt *ins_generic_linestring_stmt;
81
sqlite3_stmt *ins_generic_polygon_stmt;
91
sqlite3_stmt *ins_point_stmt;
92
sqlite3_stmt *ins_linestring_stmt;
93
sqlite3_stmt *ins_polygon_stmt;
97
"highway", 0, 0, 0, NULL, NULL, NULL},
99
"junction", 0, 0, 0, NULL, NULL, NULL},
101
"traffic_calming", 0, 0, 0, NULL, NULL, NULL},
103
"traffic_sign", 0, 0, 0, NULL, NULL, NULL},
105
"service", 0, 0, 0, NULL, NULL, NULL},
107
"barrier", 0, 0, 0, NULL, NULL, NULL},
109
"cycleway", 0, 0, 0, NULL, NULL, NULL},
111
"tracktype", 0, 0, 0, NULL, NULL, NULL},
113
"waterway", 0, 0, 0, NULL, NULL, NULL},
115
"railway", 0, 0, 0, NULL, NULL, NULL},
117
"aeroway", 0, 0, 0, NULL, NULL, NULL},
119
"aerialway", 0, 0, 0, NULL, NULL, NULL},
121
"power", 0, 0, 0, NULL, NULL, NULL},
123
"man_made", 0, 0, 0, NULL, NULL, NULL},
125
"leisure", 0, 0, 0, NULL, NULL, NULL},
127
"amenity", 0, 0, 0, NULL, NULL, NULL},
129
"shop", 0, 0, 0, NULL, NULL, NULL},
131
"tourism", 0, 0, 0, NULL, NULL, NULL},
133
"historic", 0, 0, 0, NULL, NULL, NULL},
135
"landuse", 0, 0, 0, NULL, NULL, NULL},
137
"military", 0, 0, 0, NULL, NULL, NULL},
139
"natural", 0, 0, 0, NULL, NULL, NULL},
141
"geological", 0, 0, 0, NULL, NULL, NULL},
143
"route", 0, 0, 0, NULL, NULL, NULL},
145
"boundary", 0, 0, 0, NULL, NULL, NULL},
147
"sport", 0, 0, 0, NULL, NULL, NULL},
149
"abutters", 0, 0, 0, NULL, NULL, NULL},
151
"accessories", 0, 0, 0, NULL, NULL, NULL},
153
"properties", 0, 0, 0, NULL, NULL, NULL},
155
"restrictions", 0, 0, 0, NULL, NULL, NULL},
157
"place", 0, 0, 0, NULL, NULL, NULL},
159
"building", 0, 0, 0, NULL, NULL, NULL},
161
"parking", 0, 0, 0, NULL, NULL, NULL},
163
NULL, 0, 0, 0, NULL, NULL, NULL},};
204
gaiaGeomCollPtr geom;
211
struct member *first_member;
212
struct member *last_member;
218
create_point_table (struct aux_params *params, struct layers *layer)
221
char *err_msg = NULL;
225
/* creating a POINT table */
226
sprintf (sql, "CREATE TABLE pt_%s (\n", layer->name);
227
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
228
strcat (sql, "sub_type TEXT,\n");
229
strcat (sql, "name TEXT)\n");
230
ret = sqlite3_exec (params->db_handle, sql, NULL, NULL, &err_msg);
231
if (ret != SQLITE_OK)
233
fprintf (stderr, "CREATE TABLE 'pt_%s' error: %s\n", layer->name,
235
sqlite3_free (err_msg);
239
"SELECT AddGeometryColumn('pt_%s', 'Geometry', 4326, 'POINT', 'XY')",
241
ret = sqlite3_exec (params->db_handle, sql, NULL, NULL, &err_msg);
242
if (ret != SQLITE_OK)
244
fprintf (stderr, "CREATE TABLE 'pt_%s' error: %s\n", layer->name,
246
sqlite3_free (err_msg);
250
/* creating the insert SQL statement */
251
sprintf (sql, "INSERT INTO pt_%s (id, sub_type, name, Geometry) ",
253
strcat (sql, "VALUES (?, ?, ?, ?)");
255
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql), &stmt, NULL);
256
if (ret != SQLITE_OK)
258
fprintf (stderr, "SQL error: %s\n%s\n", sql,
259
sqlite3_errmsg (params->db_handle));
262
layer->ins_point_stmt = stmt;
266
create_linestring_table (struct aux_params *params, struct layers *layer)
269
char *err_msg = NULL;
273
/* creating a LINESTRING table */
274
sprintf (sql, "CREATE TABLE ln_%s (\n", layer->name);
275
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
276
strcat (sql, "sub_type TEXT,\n");
277
strcat (sql, "name TEXT)\n");
278
ret = sqlite3_exec (params->db_handle, sql, NULL, NULL, &err_msg);
279
if (ret != SQLITE_OK)
281
fprintf (stderr, "CREATE TABLE 'ln_%s' error: %s\n", layer->name,
283
sqlite3_free (err_msg);
287
"SELECT AddGeometryColumn('ln_%s', 'Geometry', 4326, 'MULTILINESTRING', 'XY')",
289
ret = sqlite3_exec (params->db_handle, sql, NULL, NULL, &err_msg);
290
if (ret != SQLITE_OK)
292
fprintf (stderr, "CREATE TABLE 'ln_%s' error: %s\n", layer->name,
294
sqlite3_free (err_msg);
298
/* creating the insert SQL statement */
299
sprintf (sql, "INSERT INTO ln_%s (id, sub_type, name, Geometry) ",
301
strcat (sql, "VALUES (?, ?, ?, ?)");
303
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql), &stmt, NULL);
304
if (ret != SQLITE_OK)
306
fprintf (stderr, "SQL error: %s\n%s\n", sql,
307
sqlite3_errmsg (params->db_handle));
310
layer->ins_linestring_stmt = stmt;
314
create_polygon_table (struct aux_params *params, struct layers *layer)
317
char *err_msg = NULL;
321
/* creating a POLYGON table */
322
sprintf (sql, "CREATE TABLE pg_%s (\n", layer->name);
323
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
324
strcat (sql, "sub_type TEXT,\n");
325
strcat (sql, "name TEXT)\n");
326
ret = sqlite3_exec (params->db_handle, sql, NULL, NULL, &err_msg);
327
if (ret != SQLITE_OK)
329
fprintf (stderr, "CREATE TABLE 'pg_%s' error: %s\n", layer->name,
331
sqlite3_free (err_msg);
335
"SELECT AddGeometryColumn('pg_%s', 'Geometry', 4326, 'MULTIPOLYGON', 'XY')",
337
ret = sqlite3_exec (params->db_handle, sql, NULL, NULL, &err_msg);
338
if (ret != SQLITE_OK)
340
fprintf (stderr, "CREATE TABLE 'pg_%s' error: %s\n", layer->name,
342
sqlite3_free (err_msg);
346
/* creating the insert SQL statement */
347
sprintf (sql, "INSERT INTO pg_%s (id, sub_type, name, Geometry) ",
349
strcat (sql, "VALUES (?, ?, ?, ?)");
351
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql), &stmt, NULL);
352
if (ret != SQLITE_OK)
354
fprintf (stderr, "SQL error: %s\n%s\n", sql,
355
sqlite3_errmsg (params->db_handle));
358
layer->ins_polygon_stmt = stmt;
362
free_tag (struct tag *p)
372
free_member (struct member *p)
380
start_node (struct aux_params *params, const char **attr)
384
glob_node.lat = DBL_MAX;
385
glob_node.lon = DBL_MAX;
386
glob_node.first = NULL;
387
glob_node.last = NULL;
388
for (i = 0; attr[i]; i += 2)
390
if (strcmp (attr[i], "id") == 0)
391
glob_node.id = atol_64 (attr[i + 1]);
392
if (strcmp (attr[i], "lat") == 0)
393
glob_node.lat = atof (attr[i + 1]);
394
if (strcmp (attr[i], "lon") == 0)
395
glob_node.lon = atof (attr[i + 1]);
397
params->current_tag = CURRENT_TAG_IS_NODE;
401
point_layer_insert (struct aux_params *params, const char *layer_name,
402
sqlite3_int64 id, double lat, double lon,
403
const char *sub_type, const char *name)
405
struct layers *layer;
409
layer = &(base_layers[i++]);
410
if (layer->name == NULL)
412
if (strcmp (layer->name, layer_name) == 0)
414
if (layer->ok_point == 0)
417
create_point_table (params, layer);
419
if (layer->ins_point_stmt)
424
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
426
gaiaAddPointToGeomColl (geom, lon, lat);
427
sqlite3_reset (layer->ins_point_stmt);
428
sqlite3_clear_bindings (layer->ins_point_stmt);
429
sqlite3_bind_int64 (layer->ins_point_stmt, 1, id);
430
if (sub_type == NULL)
431
sqlite3_bind_null (layer->ins_point_stmt, 2);
433
sqlite3_bind_text (layer->ins_point_stmt, 2,
434
sub_type, strlen (sub_type),
437
sqlite3_bind_null (layer->ins_point_stmt, 3);
439
sqlite3_bind_text (layer->ins_point_stmt, 3, name,
440
strlen (name), SQLITE_STATIC);
441
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
442
gaiaFreeGeomColl (geom);
443
sqlite3_bind_blob (layer->ins_point_stmt, 4, blob,
445
ret = sqlite3_step (layer->ins_point_stmt);
446
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
448
fprintf (stderr, "sqlite3_step() error: INS_POINT %s\n",
450
sqlite3_finalize (layer->ins_point_stmt);
451
layer->ins_point_stmt = NULL;
459
point_generic_insert (struct aux_params *params, sqlite3_int64 id, double lat,
460
double lon, const char *name)
462
if (params->ins_generic_point_stmt)
467
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
469
gaiaAddPointToGeomColl (geom, lon, lat);
470
sqlite3_reset (params->ins_generic_point_stmt);
471
sqlite3_clear_bindings (params->ins_generic_point_stmt);
472
sqlite3_bind_int64 (params->ins_generic_point_stmt, 1, id);
474
sqlite3_bind_null (params->ins_generic_point_stmt, 2);
476
sqlite3_bind_text (params->ins_generic_point_stmt, 2, name,
477
strlen (name), SQLITE_STATIC);
478
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
479
gaiaFreeGeomColl (geom);
480
sqlite3_bind_blob (params->ins_generic_point_stmt, 3, blob,
482
ret = sqlite3_step (params->ins_generic_point_stmt);
483
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
485
fprintf (stderr, "sqlite3_step() error: INS_GENERIC_POINT\n");
486
sqlite3_finalize (params->ins_generic_point_stmt);
487
params->ins_generic_point_stmt = NULL;
492
address_insert (struct aux_params *params, sqlite3_int64 id, double lat,
493
double lon, const char *country, const char *city,
494
const char *postcode,
496
const char *housename, const char *housenumber)
498
if (params->ins_addresses_stmt)
503
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
505
gaiaAddPointToGeomColl (geom, lon, lat);
506
sqlite3_reset (params->ins_addresses_stmt);
507
sqlite3_clear_bindings (params->ins_addresses_stmt);
508
sqlite3_bind_int64 (params->ins_addresses_stmt, 1, id);
510
sqlite3_bind_null (params->ins_addresses_stmt, 2);
512
sqlite3_bind_text (params->ins_addresses_stmt, 2, country,
513
strlen (country), SQLITE_STATIC);
515
sqlite3_bind_null (params->ins_addresses_stmt, 3);
517
sqlite3_bind_text (params->ins_addresses_stmt, 3, city,
518
strlen (city), SQLITE_STATIC);
519
if (postcode == NULL)
520
sqlite3_bind_null (params->ins_addresses_stmt, 4);
522
sqlite3_bind_text (params->ins_addresses_stmt, 4, postcode,
523
strlen (postcode), SQLITE_STATIC);
525
sqlite3_bind_null (params->ins_addresses_stmt, 5);
527
sqlite3_bind_text (params->ins_addresses_stmt, 5, street,
528
strlen (street), SQLITE_STATIC);
529
if (housename == NULL)
530
sqlite3_bind_null (params->ins_addresses_stmt, 6);
532
sqlite3_bind_text (params->ins_addresses_stmt, 6, housename,
533
strlen (housename), SQLITE_STATIC);
534
if (housenumber == NULL)
535
sqlite3_bind_null (params->ins_addresses_stmt, 7);
537
sqlite3_bind_text (params->ins_addresses_stmt, 7, housenumber,
538
strlen (housenumber), SQLITE_STATIC);
539
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
540
gaiaFreeGeomColl (geom);
541
sqlite3_bind_blob (params->ins_addresses_stmt, 8, blob, blob_size,
543
ret = sqlite3_step (params->ins_addresses_stmt);
544
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
546
fprintf (stderr, "sqlite3_step() error: INS_ADDRESSES\n");
547
sqlite3_finalize (params->ins_addresses_stmt);
548
params->ins_addresses_stmt = NULL;
553
eval_node (struct aux_params *params)
558
const char *layer_name = NULL;
559
char *sub_type = NULL;
561
char *country = NULL;
563
char *postcode = NULL;
565
char *housename = NULL;
566
char *housenumber = NULL;
567
if (glob_node.first == NULL)
571
p = base_layers[i++].name;
574
p_tag = glob_node.first;
577
if (strcmp (p_tag->k, p) == 0)
582
if (strcmp (p_tag->k, "name") == 0)
591
point_layer_insert (params, layer_name, glob_node.id, glob_node.lat,
592
glob_node.lon, sub_type, name);
595
else if (name != NULL)
597
point_generic_insert (params, glob_node.id, glob_node.lat,
598
glob_node.lon, name);
602
/* may be an house address */
603
p_tag = glob_node.first;
606
if (strcmp (p_tag->k, "addr:country") == 0)
608
if (strcmp (p_tag->k, "addr:city") == 0)
610
if (strcmp (p_tag->k, "addr:postcode") == 0)
612
if (strcmp (p_tag->k, "addr:street") == 0)
614
if (strcmp (p_tag->k, "addr:housename") == 0)
615
housename = p_tag->v;
616
if (strcmp (p_tag->k, "addr:housenumber") == 0)
617
housenumber = p_tag->v;
620
if (country || city || postcode || street || housename || housenumber)
621
address_insert (params, glob_node.id, glob_node.lat, glob_node.lon,
622
country, city, postcode, street, housename,
627
tmp_nodes_insert (struct aux_params *params, sqlite3_int64 id, double lat,
631
if (params->ins_tmp_nodes_stmt == NULL)
633
sqlite3_reset (params->ins_tmp_nodes_stmt);
634
sqlite3_clear_bindings (params->ins_tmp_nodes_stmt);
635
sqlite3_bind_int64 (params->ins_tmp_nodes_stmt, 1, id);
636
sqlite3_bind_double (params->ins_tmp_nodes_stmt, 2, lat);
637
sqlite3_bind_double (params->ins_tmp_nodes_stmt, 3, lon);
638
ret = sqlite3_step (params->ins_tmp_nodes_stmt);
639
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
641
fprintf (stderr, "sqlite3_step() error: INS_TMP_NODES\n");
642
sqlite3_finalize (params->ins_tmp_nodes_stmt);
643
params->ins_tmp_nodes_stmt = NULL;
647
end_node (struct aux_params *params)
652
tmp_nodes_insert (params, glob_node.id, glob_node.lat, glob_node.lon);
654
p_tag = glob_node.first;
657
p_tag2 = p_tag->next;
662
glob_node.lat = DBL_MAX;
663
glob_node.lon = DBL_MAX;
664
glob_node.first = NULL;
665
glob_node.last = NULL;
666
params->current_tag = CURRENT_TAG_UNKNOWN;
670
start_way (struct aux_params *params, const char **attr)
674
glob_way.first_nd = NULL;
675
glob_way.last_nd = NULL;
676
glob_way.first = NULL;
677
glob_way.last = NULL;
678
for (i = 0; attr[i]; i += 2)
680
if (strcmp (attr[i], "id") == 0)
681
glob_way.id = atol_64 (attr[i + 1]);
683
params->current_tag = CURRENT_TAG_IS_WAY;
686
static gaiaGeomCollPtr
687
build_linestring (sqlite3 * db_handle)
689
gaiaGeomCollPtr geom;
690
gaiaLinestringPtr ln;
704
struct nd *p_nd = glob_way.first_nd;
712
geom = gaiaAllocGeomColl ();
714
ln = gaiaAddLinestringToGeomColl (geom, points);
719
/ fetching node coords
720
/ requesting max 128 points at each time
726
strcpy (sql, "SELECT id, lat, lon FROM osm_tmp_nodes ");
727
strcat (sql, "WHERE id IN (");
728
for (ind = 0; ind < how_many; ind++)
736
ret = sqlite3_prepare_v2 (db_handle, sql, strlen (sql), &stmt, NULL);
737
if (ret != SQLITE_OK)
739
fprintf (stderr, "SQL error: %s\n%s\n", sql,
740
sqlite3_errmsg (db_handle));
741
gaiaFreeGeomColl (geom);
744
sqlite3_reset (stmt);
745
sqlite3_clear_bindings (stmt);
748
p_nd = glob_way.first_nd;
757
if (count >= (base + how_many))
759
sqlite3_bind_int64 (stmt, ind, p_nd->ref);
766
/* scrolling the result set */
767
ret = sqlite3_step (stmt);
768
if (ret == SQLITE_DONE)
770
/* there are no more rows to fetch - we can stop looping */
773
if (ret == SQLITE_ROW)
775
/* ok, we've just fetched a valid row */
776
id = sqlite3_column_int64 (stmt, 0);
777
lat = sqlite3_column_double (stmt, 1);
778
lon = sqlite3_column_double (stmt, 2);
779
p_nd = glob_way.first_nd;
786
gaiaSetPoint (ln->Coords, count, lon, lat);
794
/* some unexpected error occurred */
795
fprintf (stderr, "sqlite3_step() error: %s\n",
796
sqlite3_errmsg (db_handle));
797
sqlite3_finalize (stmt);
798
gaiaFreeGeomColl (geom);
801
sqlite3_finalize (stmt);
807
p_nd = glob_way.first_nd;
810
if (p_nd->found == 0)
812
#if defined(_WIN32) || defined(__MINGW32__)
813
/* CAVEAT - M$ runtime doesn't supports %lld for 64 bits */
814
fprintf (stderr, "UNRESOLVED-NODE %I64d\n", p_nd->ref);
816
fprintf (stderr, "UNRESOLVED-NODE %lld\n", p_nd->ref);
818
gaiaFreeGeomColl (geom);
827
line_layer_insert (struct aux_params *params, const char *layer_name,
828
sqlite3_int64 id, unsigned char *blob, int blob_size,
829
const char *sub_type, const char *name)
831
struct layers *layer;
835
layer = &(base_layers[i++]);
836
if (layer->name == NULL)
838
if (strcmp (layer->name, layer_name) == 0)
840
if (layer->ok_linestring == 0)
842
layer->ok_linestring = 1;
843
create_linestring_table (params, layer);
845
if (layer->ins_linestring_stmt)
848
sqlite3_reset (layer->ins_linestring_stmt);
849
sqlite3_clear_bindings (layer->ins_linestring_stmt);
850
sqlite3_bind_int64 (layer->ins_linestring_stmt, 1, id);
851
if (sub_type == NULL)
852
sqlite3_bind_null (layer->ins_linestring_stmt, 2);
854
sqlite3_bind_text (layer->ins_linestring_stmt, 2,
855
sub_type, strlen (sub_type),
858
sqlite3_bind_null (layer->ins_linestring_stmt, 3);
860
sqlite3_bind_text (layer->ins_linestring_stmt, 3,
863
sqlite3_bind_blob (layer->ins_linestring_stmt, 4, blob,
864
blob_size, SQLITE_STATIC);
865
ret = sqlite3_step (layer->ins_linestring_stmt);
866
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
869
"sqlite3_step() error: INS_LINESTRING %s\n",
871
sqlite3_finalize (layer->ins_linestring_stmt);
872
layer->ins_linestring_stmt = NULL;
880
polygon_layer_insert (struct aux_params *params, const char *layer_name,
881
sqlite3_int64 id, unsigned char *blob, int blob_size,
882
const char *sub_type, const char *name)
884
struct layers *layer;
888
layer = &(base_layers[i++]);
889
if (layer->name == NULL)
891
if (strcmp (layer->name, layer_name) == 0)
893
if (layer->ok_polygon == 0)
895
layer->ok_polygon = 1;
896
create_polygon_table (params, layer);
898
if (layer->ins_polygon_stmt)
901
sqlite3_reset (layer->ins_polygon_stmt);
902
sqlite3_clear_bindings (layer->ins_polygon_stmt);
903
sqlite3_bind_int64 (layer->ins_polygon_stmt, 1, id);
904
if (sub_type == NULL)
905
sqlite3_bind_null (layer->ins_polygon_stmt, 2);
907
sqlite3_bind_text (layer->ins_polygon_stmt, 2,
908
sub_type, strlen (sub_type),
911
sqlite3_bind_null (layer->ins_polygon_stmt, 3);
913
sqlite3_bind_text (layer->ins_polygon_stmt, 3, name,
914
strlen (name), SQLITE_STATIC);
915
sqlite3_bind_blob (layer->ins_polygon_stmt, 4, blob,
916
blob_size, SQLITE_STATIC);
917
ret = sqlite3_step (layer->ins_polygon_stmt);
918
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
921
"sqlite3_step() error: INS_POLYGON %s\n",
923
sqlite3_finalize (layer->ins_polygon_stmt);
924
layer->ins_polygon_stmt = NULL;
932
line_generic_insert (struct aux_params *params, sqlite3_int64 id,
933
unsigned char *blob, int blob_size, const char *name)
935
if (params->ins_generic_linestring_stmt)
938
sqlite3_reset (params->ins_generic_linestring_stmt);
939
sqlite3_clear_bindings (params->ins_generic_linestring_stmt);
940
sqlite3_bind_int64 (params->ins_generic_linestring_stmt, 1, id);
942
sqlite3_bind_null (params->ins_generic_linestring_stmt, 2);
944
sqlite3_bind_text (params->ins_generic_linestring_stmt, 2, name,
945
strlen (name), SQLITE_STATIC);
946
sqlite3_bind_blob (params->ins_generic_linestring_stmt, 3, blob,
947
blob_size, SQLITE_STATIC);
948
ret = sqlite3_step (params->ins_generic_linestring_stmt);
949
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
951
fprintf (stderr, "sqlite3_step() error: INS_GENERIC_LINESTRING\n");
952
sqlite3_finalize (params->ins_generic_linestring_stmt);
953
params->ins_generic_linestring_stmt = NULL;
958
polygon_generic_insert (struct aux_params *params, sqlite3_int64 id,
959
unsigned char *blob, int blob_size, const char *name)
961
if (params->ins_generic_polygon_stmt)
964
sqlite3_reset (params->ins_generic_polygon_stmt);
965
sqlite3_clear_bindings (params->ins_generic_polygon_stmt);
966
sqlite3_bind_int64 (params->ins_generic_polygon_stmt, 1, id);
968
sqlite3_bind_null (params->ins_generic_polygon_stmt, 2);
970
sqlite3_bind_text (params->ins_generic_polygon_stmt, 2, name,
971
strlen (name), SQLITE_STATIC);
972
sqlite3_bind_blob (params->ins_generic_polygon_stmt, 3, blob,
973
blob_size, SQLITE_STATIC);
974
ret = sqlite3_step (params->ins_generic_polygon_stmt);
975
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
977
fprintf (stderr, "sqlite3_step() error: INS_GENERIC_POLYGON\n");
978
sqlite3_finalize (params->ins_generic_polygon_stmt);
979
params->ins_generic_polygon_stmt = NULL;
984
tmp_ways_insert (struct aux_params *params, sqlite3_int64 id, int area,
985
unsigned char *blob, int blob_size)
988
if (params->ins_tmp_ways_stmt == NULL)
990
sqlite3_reset (params->ins_tmp_ways_stmt);
991
sqlite3_clear_bindings (params->ins_tmp_ways_stmt);
992
sqlite3_bind_int64 (params->ins_tmp_ways_stmt, 1, id);
993
sqlite3_bind_int (params->ins_tmp_ways_stmt, 2, area);
994
sqlite3_bind_blob (params->ins_tmp_ways_stmt, 3, blob, blob_size,
996
ret = sqlite3_step (params->ins_tmp_ways_stmt);
998
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
1000
fprintf (stderr, "sqlite3_step() error: INS_TMP_WAYS\n");
1001
sqlite3_finalize (params->ins_tmp_ways_stmt);
1002
params->ins_tmp_ways_stmt = NULL;
1006
eval_way (struct aux_params *params, int area, unsigned char *blob,
1012
const char *layer_name = NULL;
1013
char *sub_type = NULL;
1015
if (glob_way.first == NULL)
1019
p = base_layers[i++].name;
1022
p_tag = glob_way.first;
1025
if (strcmp (p_tag->k, p) == 0)
1028
sub_type = p_tag->v;
1030
if (strcmp (p_tag->k, "name") == 0)
1032
p_tag = p_tag->next;
1040
polygon_layer_insert (params, layer_name, glob_way.id, blob,
1041
blob_size, sub_type, name);
1043
line_layer_insert (params, layer_name, glob_way.id, blob,
1044
blob_size, sub_type, name);
1047
else if (name != NULL)
1050
polygon_generic_insert (params, glob_way.id, blob, blob_size,
1053
line_generic_insert (params, glob_way.id, blob, blob_size, name);
1058
static gaiaGeomCollPtr
1059
convert_to_polygon (gaiaGeomCollPtr old)
1061
/* converting a LINESTRING as MULTIPOLYGON */
1062
gaiaLinestringPtr ln = old->FirstLinestring;
1068
gaiaGeomCollPtr geom = gaiaAllocGeomColl ();
1069
geom->Srid = old->Srid;
1070
geom->DeclaredType = GAIA_MULTIPOLYGON;
1071
pg = gaiaAddPolygonToGeomColl (geom, ln->Points, 0);
1073
for (iv = 0; iv < rng->Points; iv++)
1075
gaiaGetPoint (ln->Coords, iv, &x, &y);
1076
gaiaSetPoint (rng->Coords, iv, x, y);
1078
gaiaFreeGeomColl (old);
1083
end_way (struct aux_params *params)
1089
unsigned char *blob;
1093
gaiaGeomCollPtr geom = build_linestring (params->db_handle);
1096
geom->DeclaredType = GAIA_MULTILINESTRING;
1097
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
1098
tmp_ways_insert (params, glob_way.id, area, blob, blob_size);
1100
p_tag = glob_way.first;
1103
if (strcmp (p_tag->k, "area") == 0
1104
&& strcmp (p_tag->v, "yes") == 0)
1106
p_tag = p_tag->next;
1111
geom = convert_to_polygon (geom);
1112
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
1114
gaiaFreeGeomColl (geom);
1115
eval_way (params, area, blob, blob_size);
1118
p_tag = glob_way.first;
1121
p_tag2 = p_tag->next;
1125
p_nd = glob_way.first_nd;
1133
glob_way.first_nd = NULL;
1134
glob_way.last_nd = NULL;
1135
glob_way.first = NULL;
1136
glob_way.last = NULL;
1137
params->current_tag = CURRENT_TAG_UNKNOWN;
1141
start_nd (const char **attr)
1143
struct nd *p_nd = malloc (sizeof (struct nd));
1148
for (i = 0; attr[i]; i += 2)
1150
if (strcmp (attr[i], "ref") == 0)
1151
p_nd->ref = atol_64 (attr[i + 1]);
1153
if (glob_way.first_nd == NULL)
1154
glob_way.first_nd = p_nd;
1155
if (glob_way.last_nd != NULL)
1156
glob_way.last_nd->next = p_nd;
1157
glob_way.last_nd = p_nd;
1161
start_xtag (struct aux_params *params, const char **attr)
1163
struct tag *p_tag = malloc (sizeof (struct tag));
1169
for (i = 0; attr[i]; i += 2)
1171
if (strcmp (attr[i], "k") == 0)
1173
len = strlen (attr[i + 1]);
1174
p_tag->k = malloc (len + 1);
1175
strcpy (p_tag->k, attr[i + 1]);
1177
if (strcmp (attr[i], "v") == 0)
1179
len = strlen (attr[i + 1]);
1180
p_tag->v = malloc (len + 1);
1181
strcpy (p_tag->v, attr[i + 1]);
1184
if (params->current_tag == CURRENT_TAG_IS_NODE)
1186
if (glob_node.first == NULL)
1187
glob_node.first = p_tag;
1188
if (glob_node.last != NULL)
1189
glob_node.last->next = p_tag;
1190
glob_node.last = p_tag;
1192
if (params->current_tag == CURRENT_TAG_IS_WAY)
1194
if (glob_way.first == NULL)
1195
glob_way.first = p_tag;
1196
if (glob_way.last != NULL)
1197
glob_way.last->next = p_tag;
1198
glob_way.last = p_tag;
1200
if (params->current_tag == CURRENT_TAG_IS_RELATION)
1202
if (glob_relation.first == NULL)
1203
glob_relation.first = p_tag;
1204
if (glob_relation.last != NULL)
1205
glob_relation.last->next = p_tag;
1206
glob_relation.last = p_tag;
1211
start_member (const char **attr)
1213
struct member *p_member = malloc (sizeof (struct member));
1217
p_member->is_node = 0;
1218
p_member->is_way = 0;
1219
p_member->found = 0;
1220
p_member->role = NULL;
1221
p_member->next = NULL;
1222
for (i = 0; attr[i]; i += 2)
1224
if (strcmp (attr[i], "type") == 0)
1226
if (strcmp (attr[i + 1], "node") == 0)
1228
p_member->is_node = 1;
1229
p_member->is_way = 0;
1231
else if (strcmp (attr[i + 1], "way") == 0)
1233
p_member->is_node = 0;
1234
p_member->is_way = 1;
1238
p_member->is_node = 0;
1239
p_member->is_way = 0;
1242
if (strcmp (attr[i], "ref") == 0)
1243
p_member->ref = atol_64 (attr[i + 1]);
1244
if (strcmp (attr[i], "role") == 0)
1246
len = strlen (attr[i + 1]);
1247
p_member->role = malloc (len + 1);
1248
strcpy (p_member->role, attr[i + 1]);
1251
if (glob_relation.first_member == NULL)
1252
glob_relation.first_member = p_member;
1253
if (glob_relation.last_member != NULL)
1254
glob_relation.last_member->next = p_member;
1255
glob_relation.last_member = p_member;
1259
start_relation (struct aux_params *params, const char **attr)
1262
glob_relation.id = -1;
1263
glob_relation.first_member = NULL;
1264
glob_relation.last_member = NULL;
1265
glob_relation.first = NULL;
1266
glob_relation.last = NULL;
1267
for (i = 0; attr[i]; i += 2)
1269
if (strcmp (attr[i], "id") == 0)
1270
glob_relation.id = atol_64 (attr[i + 1]);
1272
params->current_tag = CURRENT_TAG_IS_RELATION;
1275
static gaiaGeomCollPtr
1276
build_multilinestring (sqlite3 * db_handle)
1278
gaiaGeomCollPtr geom;
1290
const unsigned char *blob = NULL;
1292
gaiaGeomCollPtr org_geom;
1293
struct member *p_member = glob_relation.first_member;
1297
p_member = p_member->next;
1301
geom = gaiaAllocGeomColl ();
1303
geom->DeclaredType = GAIA_MULTILINESTRING;
1309
/ requesting max 128 points at each time
1315
strcpy (sql, "SELECT id, Geometry FROM osm_tmp_ways ");
1316
strcat (sql, "WHERE id IN (");
1317
for (ind = 0; ind < how_many; ind++)
1325
ret = sqlite3_prepare_v2 (db_handle, sql, strlen (sql), &stmt, NULL);
1326
if (ret != SQLITE_OK)
1328
fprintf (stderr, "SQL error: %s\n%s\n", sql,
1329
sqlite3_errmsg (db_handle));
1330
gaiaFreeGeomColl (geom);
1333
sqlite3_reset (stmt);
1334
sqlite3_clear_bindings (stmt);
1337
p_member = glob_relation.first_member;
1343
p_member = p_member->next;
1346
if (count >= (base + how_many))
1348
sqlite3_bind_int64 (stmt, ind, p_member->ref);
1351
p_member = p_member->next;
1355
/* scrolling the result set */
1356
ret = sqlite3_step (stmt);
1357
if (ret == SQLITE_DONE)
1359
/* there are no more rows to fetch - we can stop looping */
1362
if (ret == SQLITE_ROW)
1364
/* ok, we've just fetched a valid row */
1365
id = sqlite3_column_int64 (stmt, 0);
1366
blob = sqlite3_column_blob (stmt, 1);
1367
blob_size = sqlite3_column_bytes (stmt, 1);
1368
org_geom = gaiaFromSpatiaLiteBlobWkb (blob, blob_size);
1372
p_member = glob_relation.first_member;
1376
if (p_member->ref == id)
1378
gaiaLinestringPtr ln1;
1379
p_member->found = 1;
1380
ln1 = org_geom->FirstLinestring;
1384
gaiaLinestringPtr ln2 =
1385
gaiaAddLinestringToGeomColl
1386
(geom, ln1->Points);
1387
for (iv = 0; iv < ln2->Points;
1392
gaiaGetPoint (ln1->Coords,
1394
gaiaSetPoint (ln2->Coords,
1401
p_member = p_member->next;
1403
gaiaFreeGeomColl (org_geom);
1408
/* some unexpected error occurred */
1409
fprintf (stderr, "sqlite3_step() error: %s\n",
1410
sqlite3_errmsg (db_handle));
1411
sqlite3_finalize (stmt);
1412
gaiaFreeGeomColl (geom);
1415
sqlite3_finalize (stmt);
1420
/* final checkout */
1421
p_member = glob_relation.first_member;
1424
if (p_member->found == 0)
1426
#if defined(_WIN32) || defined(__MINGW32__)
1427
/* CAVEAT - M$ runtime doesn't supports %lld for 64 bits */
1428
fprintf (stderr, "UNRESOLVED-WAY %I64d\n", p_member->ref);
1430
fprintf (stderr, "UNRESOLVED-WAY %lld\n", p_member->ref);
1432
gaiaFreeGeomColl (geom);
1435
p_member = p_member->next;
1441
multiline_layer_insert (struct aux_params *params, const char *layer_name,
1442
const char *sub_type, const char *name)
1444
gaiaGeomCollPtr geom;
1445
unsigned char *blob = NULL;
1447
struct layers *layer;
1451
layer = &(base_layers[i++]);
1452
if (layer->name == NULL)
1454
if (strcmp (layer->name, layer_name) == 0)
1456
if (layer->ok_linestring == 0)
1458
layer->ok_linestring = 1;
1459
create_linestring_table (params, layer);
1461
geom = build_multilinestring (params->db_handle);
1464
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
1465
gaiaFreeGeomColl (geom);
1467
if (layer->ins_linestring_stmt && blob)
1470
sqlite3_reset (layer->ins_linestring_stmt);
1471
sqlite3_clear_bindings (layer->ins_linestring_stmt);
1472
sqlite3_bind_int64 (layer->ins_linestring_stmt, 1,
1474
if (sub_type == NULL)
1475
sqlite3_bind_null (layer->ins_linestring_stmt, 2);
1477
sqlite3_bind_text (layer->ins_linestring_stmt, 2,
1478
sub_type, strlen (sub_type),
1481
sqlite3_bind_null (layer->ins_linestring_stmt, 3);
1483
sqlite3_bind_text (layer->ins_linestring_stmt, 3,
1484
name, strlen (name),
1486
sqlite3_bind_blob (layer->ins_linestring_stmt, 4, blob,
1488
ret = sqlite3_step (layer->ins_linestring_stmt);
1489
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
1492
"sqlite3_step() error: INS_MULTILINESTRING %s\n",
1494
sqlite3_finalize (layer->ins_linestring_stmt);
1495
layer->ins_linestring_stmt = NULL;
1502
static gaiaGeomCollPtr
1503
build_multipolygon (sqlite3 * db_handle)
1505
gaiaGeomCollPtr geom;
1506
gaiaPolygonPtr pg2 = NULL;
1524
const unsigned char *blob = NULL;
1526
gaiaGeomCollPtr org_geom;
1527
struct member *p_member = glob_relation.first_member;
1533
if (strcmp (p_member->role, "inner") == 0)
1535
if (strcmp (p_member->role, "outer") == 0)
1538
p_member = p_member->next;
1544
if (interiors + 1 != rings)
1546
geom = gaiaAllocGeomColl ();
1548
geom->DeclaredType = GAIA_MULTIPOLYGON;
1554
/ requesting max 128 points at each time
1560
strcpy (sql, "SELECT id, area, Geometry FROM osm_tmp_ways ");
1561
strcat (sql, "WHERE id IN (");
1562
for (ind = 0; ind < how_many; ind++)
1570
ret = sqlite3_prepare_v2 (db_handle, sql, strlen (sql), &stmt, NULL);
1571
if (ret != SQLITE_OK)
1573
fprintf (stderr, "SQL error: %s\n%s\n", sql,
1574
sqlite3_errmsg (db_handle));
1575
gaiaFreeGeomColl (geom);
1578
sqlite3_reset (stmt);
1579
sqlite3_clear_bindings (stmt);
1582
p_member = glob_relation.first_member;
1588
p_member = p_member->next;
1591
if (count >= (base + how_many))
1593
sqlite3_bind_int64 (stmt, ind, p_member->ref);
1596
p_member = p_member->next;
1600
/* scrolling the result set */
1601
ret = sqlite3_step (stmt);
1602
if (ret == SQLITE_DONE)
1604
/* there are no more rows to fetch - we can stop looping */
1607
if (ret == SQLITE_ROW)
1609
/* ok, we've just fetched a valid row */
1610
id = sqlite3_column_int64 (stmt, 0);
1611
area = sqlite3_column_int (stmt, 1);
1612
blob = sqlite3_column_blob (stmt, 2);
1613
blob_size = sqlite3_column_bytes (stmt, 2);
1614
org_geom = gaiaFromSpatiaLiteBlobWkb (blob, blob_size);
1619
if (p_member->ref == id)
1621
p_member->geom = org_geom;
1622
p_member->found = 1;
1624
p_member = p_member->next;
1630
/* some unexpected error occurred */
1631
fprintf (stderr, "sqlite3_step() error: %s\n",
1632
sqlite3_errmsg (db_handle));
1633
sqlite3_finalize (stmt);
1634
gaiaFreeGeomColl (geom);
1637
sqlite3_finalize (stmt);
1642
/* final checkout */
1644
p_member = glob_relation.first_member;
1647
if (p_member->found == 0)
1649
#if defined(_WIN32) || defined(__MINGW32__)
1650
/* CAVEAT - M$ runtime doesn't supports %lld for 64 bits */
1651
fprintf (stderr, "UNRESOLVED-WAY %I64d\n", p_member->ref);
1653
fprintf (stderr, "UNRESOLVED-WAY %lld\n", p_member->ref);
1655
gaiaFreeGeomColl (geom);
1658
if (strcmp (p_member->role, "outer") == 0)
1662
if (p_member->geom->FirstPolygon)
1664
p_member->geom->FirstPolygon->Exterior->Points;
1667
p_member = p_member->next;
1671
#if defined(_WIN32) || defined(__MINGW32__)
1672
/* CAVEAT - M$ runtime doesn't supports %lld for 64 bits */
1673
fprintf (stderr, "ILLEGAL MULTIPOLYGON %I64d\n", p_member->ref);
1675
fprintf (stderr, "ILLEGAL MULTIPOLYGON %lld\n", p_member->ref);
1677
gaiaFreeGeomColl (geom);
1681
pg2 = gaiaAddPolygonToGeomColl (geom, ext_pts, interiors);
1682
p_member = glob_relation.first_member;
1686
pg1 = org_geom->FirstPolygon;
1690
gaiaRingPtr rng1 = pg1->Exterior;
1692
if (strcmp (p_member->role, "outer") == 0)
1693
rng2 = pg2->Exterior;
1695
rng2 = pg2->Interiors + ib++;
1696
for (iv = 0; iv < rng2->Points; iv++)
1700
gaiaGetPoint (rng1->Coords, iv, &x, &y);
1701
gaiaSetPoint (rng2->Coords, iv, x, y);
1705
p_member = p_member->next;
1711
multipolygon_layer_insert (struct aux_params *params, const char *layer_name,
1712
const char *sub_type, const char *name)
1714
gaiaGeomCollPtr geom;
1715
unsigned char *blob = NULL;
1717
struct layers *layer;
1721
layer = &(base_layers[i++]);
1722
if (layer->name == NULL)
1724
if (strcmp (layer->name, layer_name) == 0)
1726
if (layer->ok_polygon == 0)
1728
layer->ok_polygon = 1;
1729
create_polygon_table (params, layer);
1731
geom = build_multipolygon (params->db_handle);
1734
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
1735
gaiaFreeGeomColl (geom);
1737
if (layer->ins_polygon_stmt)
1740
sqlite3_reset (layer->ins_polygon_stmt);
1741
sqlite3_clear_bindings (layer->ins_polygon_stmt);
1742
sqlite3_bind_int64 (layer->ins_polygon_stmt, 1,
1744
if (sub_type == NULL)
1745
sqlite3_bind_null (layer->ins_polygon_stmt, 2);
1747
sqlite3_bind_text (layer->ins_polygon_stmt, 2,
1748
sub_type, strlen (sub_type),
1751
sqlite3_bind_null (layer->ins_polygon_stmt, 3);
1753
sqlite3_bind_text (layer->ins_polygon_stmt, 3, name,
1754
strlen (name), SQLITE_STATIC);
1755
sqlite3_bind_blob (layer->ins_polygon_stmt, 4, blob,
1756
blob_size, SQLITE_STATIC);
1757
ret = sqlite3_step (layer->ins_polygon_stmt);
1758
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
1761
"sqlite3_step() error: INS_MULTIPOLYGON %s\n",
1763
sqlite3_finalize (layer->ins_polygon_stmt);
1764
layer->ins_polygon_stmt = NULL;
1772
multiline_generic_insert (struct aux_params *params, const char *name)
1774
gaiaGeomCollPtr geom;
1775
unsigned char *blob = NULL;
1777
geom = build_multilinestring (params->db_handle);
1780
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
1781
gaiaFreeGeomColl (geom);
1783
if (params->ins_generic_linestring_stmt && blob)
1786
sqlite3_reset (params->ins_generic_linestring_stmt);
1787
sqlite3_clear_bindings (params->ins_generic_linestring_stmt);
1788
sqlite3_bind_int64 (params->ins_generic_linestring_stmt, 1,
1791
sqlite3_bind_null (params->ins_generic_linestring_stmt, 2);
1793
sqlite3_bind_text (params->ins_generic_linestring_stmt, 2, name,
1794
strlen (name), SQLITE_STATIC);
1795
sqlite3_bind_blob (params->ins_generic_linestring_stmt, 3, blob,
1796
blob_size, SQLITE_STATIC);
1797
ret = sqlite3_step (params->ins_generic_linestring_stmt);
1798
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
1801
"sqlite3_step() error: INS_GENERIC_MULTILINESTRING\n");
1802
sqlite3_finalize (params->ins_generic_linestring_stmt);
1803
params->ins_generic_linestring_stmt = NULL;
1808
multipolygon_generic_insert (struct aux_params *params, const char *name)
1810
gaiaGeomCollPtr geom;
1811
unsigned char *blob = NULL;
1813
geom = build_multipolygon (params->db_handle);
1816
gaiaToSpatiaLiteBlobWkb (geom, &blob, &blob_size);
1817
gaiaFreeGeomColl (geom);
1819
if (params->ins_generic_polygon_stmt && blob)
1822
sqlite3_reset (params->ins_generic_polygon_stmt);
1823
sqlite3_clear_bindings (params->ins_generic_polygon_stmt);
1824
sqlite3_bind_int64 (params->ins_generic_polygon_stmt, 1,
1827
sqlite3_bind_null (params->ins_generic_polygon_stmt, 2);
1829
sqlite3_bind_text (params->ins_generic_polygon_stmt, 2, name,
1830
strlen (name), SQLITE_STATIC);
1831
sqlite3_bind_blob (params->ins_generic_polygon_stmt, 3, blob,
1832
blob_size, SQLITE_STATIC);
1833
ret = sqlite3_step (params->ins_generic_polygon_stmt);
1834
if (ret == SQLITE_DONE || ret == SQLITE_ROW)
1836
fprintf (stderr, "sqlite3_step() error: INS_GENERIC_MULTIPOLYGON\n");
1837
sqlite3_finalize (params->ins_generic_polygon_stmt);
1838
params->ins_generic_polygon_stmt = NULL;
1843
eval_relation (struct aux_params *params)
1848
const char *layer_name = NULL;
1849
char *sub_type = NULL;
1851
int multipolygon = 0;
1852
if (glob_relation.first == NULL)
1856
p = base_layers[i++].name;
1859
p_tag = glob_relation.first;
1862
if (strcmp (p_tag->k, p) == 0)
1865
sub_type = p_tag->v;
1867
if (strcmp (p_tag->k, "name") == 0)
1869
if (strcmp (p_tag->k, "type") == 0
1870
&& strcmp (p_tag->v, "multipolygon") == 0)
1872
p_tag = p_tag->next;
1880
multipolygon_layer_insert (params, layer_name, sub_type, name);
1882
multiline_layer_insert (params, layer_name, sub_type, name);
1885
else if (name != NULL)
1888
multipolygon_generic_insert (params, name);
1890
multiline_generic_insert (params, name);
1896
end_relation (struct aux_params *params)
1900
struct member *p_member;
1901
struct member *p_member2;
1902
eval_relation (params);
1903
p_tag = glob_relation.first;
1906
p_tag2 = p_tag->next;
1910
p_member = glob_relation.first_member;
1913
p_member2 = p_member->next;
1914
free_member (p_member);
1915
p_member = p_member2;
1917
glob_relation.id = -1;
1918
glob_relation.first_member = NULL;
1919
glob_relation.last_member = NULL;
1920
glob_relation.first = NULL;
1921
glob_relation.last = NULL;
1922
params->current_tag = CURRENT_TAG_UNKNOWN;
1926
start_tag (void *data, const char *el, const char **attr)
1928
struct aux_params *params = (struct aux_params *) data;
1929
if (strcmp (el, "node") == 0)
1930
start_node (params, attr);
1931
if (strcmp (el, "tag") == 0)
1932
start_xtag (params, attr);
1933
if (strcmp (el, "way") == 0)
1934
start_way (params, attr);
1935
if (strcmp (el, "nd") == 0)
1937
if (strcmp (el, "relation") == 0)
1938
start_relation (params, attr);
1939
if (strcmp (el, "member") == 0)
1940
start_member (attr);
1944
end_tag (void *data, const char *el)
1946
struct aux_params *params = (struct aux_params *) data;
1947
if (strcmp (el, "node") == 0)
1949
if (strcmp (el, "way") == 0)
1951
if (strcmp (el, "relation") == 0)
1952
end_relation (params);
1956
db_vacuum (sqlite3 * db_handle)
1959
char *sql_err = NULL;
1960
/* VACUUMing the DB */
1961
printf ("\nVACUUMing the DB ... wait please ...\n");
1962
ret = sqlite3_exec (db_handle, "VACUUM", NULL, NULL, &sql_err);
1963
if (ret != SQLITE_OK)
1965
fprintf (stderr, "VACUUM error: %s\n", sql_err);
1966
sqlite3_free (sql_err);
1969
printf ("\tAll done: OSM map was successfully loaded\n");
1973
spatialite_autocreate (sqlite3 * db)
1975
/* attempting to perform self-initialization for a newly created DB */
1978
char *err_msg = NULL;
1985
/* checking if this DB is really empty */
1986
strcpy (sql, "SELECT Count(*) from sqlite_master");
1987
ret = sqlite3_get_table (db, sql, &results, &rows, &columns, NULL);
1988
if (ret != SQLITE_OK)
1994
for (i = 1; i <= rows; i++)
1995
count = atoi (results[(i * columns) + 0]);
1997
sqlite3_free_table (results);
2002
/* all right, it's empty: proceding to initialize */
2003
strcpy (sql, "SELECT InitSpatialMetadata()");
2004
ret = sqlite3_exec (db, sql, NULL, NULL, &err_msg);
2005
if (ret != SQLITE_OK)
2007
fprintf (stderr, "InitSpatialMetadata() error: %s\n", err_msg);
2008
sqlite3_free (err_msg);
2014
open_db (const char *path, sqlite3 ** handle, int cache_size)
2016
/* opening the DB */
2020
char *err_msg = NULL;
2021
int spatialite_rs = 0;
2022
int spatialite_gc = 0;
2026
int ref_sys_name = 0;
2028
int f_table_name = 0;
2029
int f_geometry_column = 0;
2030
int coord_dimension = 0;
2033
int spatial_index_enabled = 0;
2041
spatialite_init (0);
2042
printf ("SQLite version: %s\n", sqlite3_libversion ());
2043
printf ("SpatiaLite version: %s\n\n", spatialite_version ());
2046
sqlite3_open_v2 (path, &db_handle,
2047
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL);
2048
if (ret != SQLITE_OK)
2050
fprintf (stderr, "cannot open '%s': %s\n", path,
2051
sqlite3_errmsg (db_handle));
2052
sqlite3_close (db_handle);
2055
spatialite_autocreate (db_handle);
2058
/* setting the CACHE-SIZE */
2059
sprintf (sql, "PRAGMA cache_size=%d", cache_size);
2060
sqlite3_exec (db_handle, sql, NULL, NULL, NULL);
2063
/* checking the GEOMETRY_COLUMNS table */
2064
strcpy (sql, "PRAGMA table_info(geometry_columns)");
2065
ret = sqlite3_get_table (db_handle, sql, &results, &rows, &columns, NULL);
2066
if (ret != SQLITE_OK)
2072
for (i = 1; i <= rows; i++)
2074
name = results[(i * columns) + 1];
2075
if (strcasecmp (name, "f_table_name") == 0)
2077
if (strcasecmp (name, "f_geometry_column") == 0)
2078
f_geometry_column = 1;
2079
if (strcasecmp (name, "coord_dimension") == 0)
2080
coord_dimension = 1;
2081
if (strcasecmp (name, "srid") == 0)
2083
if (strcasecmp (name, "type") == 0)
2085
if (strcasecmp (name, "spatial_index_enabled") == 0)
2086
spatial_index_enabled = 1;
2089
sqlite3_free_table (results);
2090
if (f_table_name && f_geometry_column && type && coord_dimension
2091
&& gc_srid && spatial_index_enabled)
2094
/* checking the SPATIAL_REF_SYS table */
2095
strcpy (sql, "PRAGMA table_info(spatial_ref_sys)");
2096
ret = sqlite3_get_table (db_handle, sql, &results, &rows, &columns, NULL);
2097
if (ret != SQLITE_OK)
2103
for (i = 1; i <= rows; i++)
2105
name = results[(i * columns) + 1];
2106
if (strcasecmp (name, "srid") == 0)
2108
if (strcasecmp (name, "auth_name") == 0)
2110
if (strcasecmp (name, "auth_srid") == 0)
2112
if (strcasecmp (name, "ref_sys_name") == 0)
2114
if (strcasecmp (name, "proj4text") == 0)
2118
sqlite3_free_table (results);
2119
if (rs_srid && auth_name && auth_srid && ref_sys_name && proj4text)
2121
/* verifying the MetaData format */
2122
if (spatialite_gc && spatialite_rs)
2127
/* creating the OSM temporary nodes */
2128
strcpy (sql, "CREATE TABLE osm_tmp_nodes (\n");
2129
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
2130
strcat (sql, "lat DOUBLE NOT NULL,\n");
2131
strcat (sql, "lon DOUBLE NOT NULL)\n");
2132
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2133
if (ret != SQLITE_OK)
2135
fprintf (stderr, "CREATE TABLE 'osm_tmp_nodes' error: %s\n", err_msg);
2136
sqlite3_free (err_msg);
2137
sqlite3_close (db_handle);
2140
/* creating the OSM temporary ways */
2141
strcpy (sql, "CREATE TABLE osm_tmp_ways (\n");
2142
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
2143
strcat (sql, "area INTEGER NOT NULL)\n");
2144
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2145
if (ret != SQLITE_OK)
2147
fprintf (stderr, "CREATE TABLE 'osm_tmp_ways' error: %s\n", err_msg);
2148
sqlite3_free (err_msg);
2149
sqlite3_close (db_handle);
2153
"SELECT AddGeometryColumn('osm_tmp_ways', 'Geometry', 4326, 'MULTILINESTRING', 'XY')");
2154
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2155
if (ret != SQLITE_OK)
2157
fprintf (stderr, "CREATE TABLE 'tmp_osm_ways' error: %s\n", err_msg);
2158
sqlite3_free (err_msg);
2159
sqlite3_close (db_handle);
2162
/* creating the PT_GENERIC table */
2163
strcpy (sql, "CREATE TABLE pt_generic (\n");
2164
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
2165
strcat (sql, "name TEXT)\n");
2166
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2167
if (ret != SQLITE_OK)
2169
fprintf (stderr, "CREATE TABLE 'pt_generic' error: %s\n", err_msg);
2170
sqlite3_free (err_msg);
2174
"SELECT AddGeometryColumn('pt_generic', 'Geometry', 4326, 'POINT', 'XY')");
2175
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2176
if (ret != SQLITE_OK)
2178
fprintf (stderr, "CREATE TABLE 'pt_generic' error: %s\n", err_msg);
2179
sqlite3_free (err_msg);
2180
sqlite3_close (db_handle);
2183
/* creating the PT_ADDRESSES table */
2184
strcpy (sql, "CREATE TABLE pt_addresses (\n");
2185
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
2186
strcat (sql, "country TEXT,\n");
2187
strcat (sql, "city TEXT,\n");
2188
strcat (sql, "postcode TEXT,\n");
2189
strcat (sql, "street TEXT,\n");
2190
strcat (sql, "housename TEXT,\n");
2191
strcat (sql, "housenumber TEXT)\n");
2192
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2193
if (ret != SQLITE_OK)
2195
fprintf (stderr, "CREATE TABLE 'pt_addresses' error: %s\n", err_msg);
2196
sqlite3_free (err_msg);
2197
sqlite3_close (db_handle);
2201
"SELECT AddGeometryColumn('pt_addresses', 'Geometry', 4326, 'POINT', 'XY')");
2202
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2203
if (ret != SQLITE_OK)
2205
fprintf (stderr, "CREATE TABLE 'pt_addresses' error: %s\n", err_msg);
2206
sqlite3_free (err_msg);
2207
sqlite3_close (db_handle);
2210
/* creating the LN_GENERIC table */
2211
strcpy (sql, "CREATE TABLE ln_generic (\n");
2212
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
2213
strcat (sql, "name TEXT)\n");
2214
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2215
if (ret != SQLITE_OK)
2217
fprintf (stderr, "CREATE TABLE 'ln_generic' error: %s\n", err_msg);
2218
sqlite3_free (err_msg);
2222
"SELECT AddGeometryColumn('ln_generic', 'Geometry', 4326, 'MULTILINESTRING', 'XY')");
2223
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2224
if (ret != SQLITE_OK)
2226
fprintf (stderr, "CREATE TABLE 'ln_generic' error: %s\n", err_msg);
2227
sqlite3_free (err_msg);
2228
sqlite3_close (db_handle);
2231
/* creating the PG_GENERIC table */
2232
strcpy (sql, "CREATE TABLE pg_generic (\n");
2233
strcat (sql, "id INTEGER NOT NULL PRIMARY KEY,\n");
2234
strcat (sql, "name TEXT)\n");
2235
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2236
if (ret != SQLITE_OK)
2238
fprintf (stderr, "CREATE TABLE 'pg_generic' error: %s\n", err_msg);
2239
sqlite3_free (err_msg);
2243
"SELECT AddGeometryColumn('pg_generic', 'Geometry', 4326, 'MULTIPOLYGON', 'XY')");
2244
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &err_msg);
2245
if (ret != SQLITE_OK)
2247
fprintf (stderr, "CREATE TABLE 'pg_generic' error: %s\n", err_msg);
2248
sqlite3_free (err_msg);
2249
sqlite3_close (db_handle);
2253
*handle = db_handle;
2258
sqlite3_close (db_handle);
2259
fprintf (stderr, "DB '%s'\n", path);
2260
fprintf (stderr, "doesn't seems to contain valid Spatial Metadata ...\n\n");
2261
fprintf (stderr, "Please, initialize Spatial Metadata\n\n");
2266
finalize_sql_stmts (struct aux_params *params)
2269
char *sql_err = NULL;
2270
struct layers layer;
2275
layer = base_layers[i++];
2276
if (layer.name == NULL)
2278
if (layer.ins_point_stmt)
2279
sqlite3_finalize (layer.ins_point_stmt);
2280
if (layer.ins_linestring_stmt)
2281
sqlite3_finalize (layer.ins_linestring_stmt);
2282
if (layer.ins_polygon_stmt)
2283
sqlite3_finalize (layer.ins_polygon_stmt);
2284
layer.ins_point_stmt = NULL;
2285
layer.ins_linestring_stmt = NULL;
2286
layer.ins_polygon_stmt = NULL;
2289
if (params->ins_tmp_nodes_stmt != NULL)
2290
sqlite3_finalize (params->ins_tmp_nodes_stmt);
2291
if (params->ins_tmp_ways_stmt != NULL)
2292
sqlite3_finalize (params->ins_tmp_ways_stmt);
2293
if (params->ins_generic_point_stmt != NULL)
2294
sqlite3_finalize (params->ins_generic_point_stmt);
2295
if (params->ins_addresses_stmt != NULL)
2296
sqlite3_finalize (params->ins_addresses_stmt);
2297
if (params->ins_generic_linestring_stmt != NULL)
2298
sqlite3_finalize (params->ins_generic_linestring_stmt);
2299
if (params->ins_generic_polygon_stmt != NULL)
2300
sqlite3_finalize (params->ins_generic_polygon_stmt);
2302
/* committing the still pending SQL Transaction */
2303
ret = sqlite3_exec (params->db_handle, "COMMIT", NULL, NULL, &sql_err);
2304
if (ret != SQLITE_OK)
2306
fprintf (stderr, "COMMIT TRANSACTION error: %s\n", sql_err);
2307
sqlite3_free (sql_err);
2313
create_sql_stmts (struct aux_params *params)
2315
sqlite3_stmt *ins_tmp_nodes_stmt;
2316
sqlite3_stmt *ins_tmp_ways_stmt;
2317
sqlite3_stmt *ins_generic_point_stmt;
2318
sqlite3_stmt *ins_addresses_stmt;
2319
sqlite3_stmt *ins_generic_linestring_stmt;
2320
sqlite3_stmt *ins_generic_polygon_stmt;
2323
char *sql_err = NULL;
2325
/* the complete operation is handled as an unique SQL Transaction */
2326
ret = sqlite3_exec (params->db_handle, "BEGIN", NULL, NULL, &sql_err);
2327
if (ret != SQLITE_OK)
2329
fprintf (stderr, "BEGIN TRANSACTION error: %s\n", sql_err);
2330
sqlite3_free (sql_err);
2333
strcpy (sql, "INSERT INTO osm_tmp_nodes (id, lat, lon) ");
2334
strcat (sql, "VALUES (?, ?, ?)");
2336
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql),
2337
&ins_tmp_nodes_stmt, NULL);
2338
if (ret != SQLITE_OK)
2340
fprintf (stderr, "SQL error: %s\n%s\n", sql,
2341
sqlite3_errmsg (params->db_handle));
2342
finalize_sql_stmts (params);
2345
strcpy (sql, "INSERT INTO osm_tmp_ways (id, area, geometry) ");
2346
strcat (sql, "VALUES (?, ?, ?)");
2348
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql),
2349
&ins_tmp_ways_stmt, NULL);
2350
if (ret != SQLITE_OK)
2352
fprintf (stderr, "SQL error: %s\n%s\n", sql,
2353
sqlite3_errmsg (params->db_handle));
2354
finalize_sql_stmts (params);
2357
strcpy (sql, "INSERT INTO pt_generic (id, name, Geometry) ");
2358
strcat (sql, "VALUES (?, ?, ?)");
2360
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql),
2361
&ins_generic_point_stmt, NULL);
2362
if (ret != SQLITE_OK)
2364
fprintf (stderr, "SQL error: %s\n%s\n", sql,
2365
sqlite3_errmsg (params->db_handle));
2366
finalize_sql_stmts (params);
2370
"INSERT INTO pt_addresses (id, country, city, postcode, street, housename, housenumber, Geometry) ");
2371
strcat (sql, "VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
2373
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql),
2374
&ins_addresses_stmt, NULL);
2375
if (ret != SQLITE_OK)
2377
fprintf (stderr, "SQL error: %s\n%s\n", sql,
2378
sqlite3_errmsg (params->db_handle));
2379
finalize_sql_stmts (params);
2382
strcpy (sql, "INSERT INTO ln_generic (id, name, Geometry) ");
2383
strcat (sql, "VALUES (?, ?, ?)");
2385
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql),
2386
&ins_generic_linestring_stmt, NULL);
2387
if (ret != SQLITE_OK)
2389
fprintf (stderr, "SQL error: %s\n%s\n", sql,
2390
sqlite3_errmsg (params->db_handle));
2391
finalize_sql_stmts (params);
2394
strcpy (sql, "INSERT INTO pg_generic (id, name, Geometry) ");
2395
strcat (sql, "VALUES (?, ?, ?)");
2397
sqlite3_prepare_v2 (params->db_handle, sql, strlen (sql),
2398
&ins_generic_polygon_stmt, NULL);
2399
if (ret != SQLITE_OK)
2401
fprintf (stderr, "SQL error: %s\n%s\n", sql,
2402
sqlite3_errmsg (params->db_handle));
2403
finalize_sql_stmts (params);
2407
params->ins_tmp_nodes_stmt = ins_tmp_nodes_stmt;
2408
params->ins_tmp_ways_stmt = ins_tmp_ways_stmt;
2409
params->ins_generic_point_stmt = ins_generic_point_stmt;
2410
params->ins_addresses_stmt = ins_addresses_stmt;
2411
params->ins_generic_linestring_stmt = ins_generic_linestring_stmt;
2412
params->ins_generic_polygon_stmt = ins_generic_polygon_stmt;
2416
db_cleanup (sqlite3 * db_handle)
2418
/* dropping temporary tables OSM_TMP_xxx */
2420
char *sql_err = NULL;
2422
/* dropping OSM_TMP_NODES */
2424
sqlite3_exec (db_handle, "DROP TABLE osm_tmp_nodes", NULL, NULL,
2426
if (ret != SQLITE_OK)
2428
fprintf (stderr, "DROP TABLE 'osm_tmp_nodes' error: %s\n", sql_err);
2429
sqlite3_free (sql_err);
2432
/* dropping OSM_TMP_WAYS */
2434
sqlite3_exec (db_handle,
2435
"DELETE FROM geometry_columns WHERE f_table_name = 'osm_tmp_ways'",
2436
NULL, NULL, &sql_err);
2437
if (ret != SQLITE_OK)
2439
fprintf (stderr, "Dropping Geometry from 'osm_tmp_ways' error: %s\n",
2441
sqlite3_free (sql_err);
2444
sqlite3_exec (db_handle, "DROP TABLE osm_tmp_ways", NULL, NULL,
2446
if (ret != SQLITE_OK)
2448
fprintf (stderr, "DROP TABLE 'osm_tmp_ways' error: %s\n", sql_err);
2449
sqlite3_free (sql_err);
2454
do_spatial_index (sqlite3 * db_handle, const char *table, const char *geom)
2456
/* creating some Spatial Index */
2459
char *sql_err = NULL;
2461
sprintf (sql, "SELECT CreateSpatialIndex('%s', '%s')", table, geom);
2462
ret = sqlite3_exec (db_handle, sql, NULL, NULL, &sql_err);
2463
if (ret != SQLITE_OK)
2465
fprintf (stderr, "SpatialIndex %s'.'%s' error: %s\n", table, geom,
2467
sqlite3_free (sql_err);
2472
create_spatial_index (sqlite3 * db_handle)
2474
/* attempting to create any Spatial Index */
2485
"SELECT f_table_name, f_geometry_column FROM geometry_columns");
2486
ret = sqlite3_get_table (db_handle, sql, &results, &rows, &columns, NULL);
2487
if (ret != SQLITE_OK)
2493
for (i = 1; i <= rows; i++)
2495
table = results[(i * columns) + 0];
2496
geom = results[(i * columns) + 1];
2497
do_spatial_index (db_handle, table, geom);
2500
sqlite3_free_table (results);
2506
/* printing the argument list */
2507
fprintf (stderr, "\n\nusage: spatialite_osm_map ARGLIST\n");
2509
"==============================================================\n");
2511
"-h or --help print this help message\n");
2512
fprintf (stderr, "-o or --osm-path pathname the OSM-XML file path\n");
2514
"-d or --db-path pathname the SpatiaLite DB path\n\n");
2515
fprintf (stderr, "you can specify the following options as well\n");
2517
"-cs or --cache-size num DB cache size (how many pages)\n");
2519
"-m or --in-memory using IN-MEMORY database\n");
2521
"-n or --no-spatial-index suppress R*Trees generation\n");
2525
main (int argc, char *argv[])
2527
/* the MAIN function simply perform arguments checking */
2530
int next_arg = ARG_NONE;
2531
const char *osm_path = NULL;
2532
const char *db_path = NULL;
2535
int spatial_index = 1;
2537
char Buff[BUFFSIZE];
2541
struct aux_params params;
2544
/* initializing the aux-struct */
2545
params.db_handle = NULL;
2546
params.ins_tmp_nodes_stmt = NULL;
2547
params.ins_tmp_ways_stmt = NULL;
2548
params.ins_generic_point_stmt = NULL;
2549
params.ins_addresses_stmt = NULL;
2550
params.ins_generic_linestring_stmt = NULL;
2551
params.ins_generic_polygon_stmt = NULL;
2552
params.current_tag = CURRENT_TAG_UNKNOWN;
2554
for (i = 1; i < argc; i++)
2556
/* parsing the invocation arguments */
2557
if (next_arg != ARG_NONE)
2567
case ARG_CACHE_SIZE:
2568
cache_size = atoi (argv[i]);
2571
next_arg = ARG_NONE;
2574
if (strcasecmp (argv[i], "--help") == 0
2575
|| strcmp (argv[i], "-h") == 0)
2580
if (strcmp (argv[i], "-o") == 0)
2582
next_arg = ARG_OSM_PATH;
2585
if (strcasecmp (argv[i], "--osm-path") == 0)
2587
next_arg = ARG_OSM_PATH;
2590
if (strcmp (argv[i], "-d") == 0)
2592
next_arg = ARG_DB_PATH;
2595
if (strcasecmp (argv[i], "--db-path") == 0)
2597
next_arg = ARG_DB_PATH;
2600
if (strcasecmp (argv[i], "--cache-size") == 0
2601
|| strcmp (argv[i], "-cs") == 0)
2603
next_arg = ARG_CACHE_SIZE;
2606
if (strcasecmp (argv[i], "-m") == 0)
2609
next_arg = ARG_NONE;
2612
if (strcasecmp (argv[i], "-in-memory") == 0)
2615
next_arg = ARG_NONE;
2618
if (strcasecmp (argv[i], "-n") == 0)
2621
next_arg = ARG_NONE;
2624
if (strcasecmp (argv[i], "-no-spatial-index") == 0)
2627
next_arg = ARG_NONE;
2630
fprintf (stderr, "unknown argument: %s\n", argv[i]);
2639
/* checking the arguments */
2643
"did you forget setting the --osm-path argument ?\n");
2648
fprintf (stderr, "did you forget setting the --db-path argument ?\n");
2658
/* opening the DB */
2661
open_db (db_path, &handle, cache_size);
2664
params.db_handle = handle;
2667
/* loading the DB in-memory */
2668
sqlite3 *mem_db_handle;
2669
sqlite3_backup *backup;
2672
sqlite3_open_v2 (":memory:", &mem_db_handle,
2673
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
2675
if (ret != SQLITE_OK)
2677
fprintf (stderr, "cannot open 'MEMORY-DB': %s\n",
2678
sqlite3_errmsg (mem_db_handle));
2679
sqlite3_close (mem_db_handle);
2682
backup = sqlite3_backup_init (mem_db_handle, "main", handle, "main");
2685
fprintf (stderr, "cannot load 'MEMORY-DB'\n");
2686
sqlite3_close (handle);
2687
sqlite3_close (mem_db_handle);
2692
ret = sqlite3_backup_step (backup, 1024);
2693
if (ret == SQLITE_DONE)
2696
ret = sqlite3_backup_finish (backup);
2697
sqlite3_close (handle);
2698
handle = mem_db_handle;
2699
printf ("\nusing IN-MEMORY database\n");
2702
/* creating SQL prepared statements */
2703
create_sql_stmts (¶ms);
2706
xml_file = fopen (osm_path, "rb");
2709
fprintf (stderr, "cannot open %s\n", osm_path);
2710
sqlite3_close (handle);
2713
parser = XML_ParserCreate (NULL);
2716
fprintf (stderr, "Couldn't allocate memory for parser\n");
2717
sqlite3_close (handle);
2720
XML_SetUserData (parser, ¶ms);
2721
XML_SetElementHandler (parser, start_tag, end_tag);
2724
len = fread (Buff, 1, BUFFSIZE, xml_file);
2725
if (ferror (xml_file))
2727
fprintf (stderr, "XML Read error\n");
2728
sqlite3_close (handle);
2731
done = feof (xml_file);
2732
if (!XML_Parse (parser, Buff, len, done))
2734
fprintf (stderr, "Parse error at line %d:\n%s\n",
2735
(int) XML_GetCurrentLineNumber (parser),
2736
XML_ErrorString (XML_GetErrorCode (parser)));
2737
sqlite3_close (handle);
2741
XML_ParserFree (parser);
2744
/* finalizing SQL prepared statements */
2745
finalize_sql_stmts (¶ms);
2747
/* dropping the OSM_TMP_xx tables */
2748
db_cleanup (handle);
2752
/* creating any Spatial Index */
2753
create_spatial_index (handle);
2758
/* exporting the in-memory DB to filesystem */
2759
sqlite3 *disk_db_handle;
2760
sqlite3_backup *backup;
2762
printf ("\nexporting IN_MEMORY database ... wait please ...\n");
2764
sqlite3_open_v2 (db_path, &disk_db_handle,
2765
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE,
2767
if (ret != SQLITE_OK)
2769
fprintf (stderr, "cannot open '%s': %s\n", db_path,
2770
sqlite3_errmsg (disk_db_handle));
2771
sqlite3_close (disk_db_handle);
2774
backup = sqlite3_backup_init (disk_db_handle, "main", handle, "main");
2777
fprintf (stderr, "Backup failure: 'MEMORY-DB' wasn't saved\n");
2778
sqlite3_close (handle);
2779
sqlite3_close (disk_db_handle);
2784
ret = sqlite3_backup_step (backup, 1024);
2785
if (ret == SQLITE_DONE)
2788
ret = sqlite3_backup_finish (backup);
2789
sqlite3_close (handle);
2790
handle = disk_db_handle;
2791
printf ("\tIN_MEMORY database successfully exported\n");
2796
sqlite3_close (handle);