forked from osm2pgsql-dev/osm2pgsql
-
Notifications
You must be signed in to change notification settings - Fork 0
/
osm2pgsql.cpp
130 lines (110 loc) · 4.68 KB
/
osm2pgsql.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
/*
#-----------------------------------------------------------------------------
# osm2pgsql - converts planet.osm file into PostgreSQL
# compatible output suitable to be rendered by mapnik
# Use: osm2pgsql planet.osm.bz2
#-----------------------------------------------------------------------------
# Original Python implementation by Artem Pavlenko
# Re-implementation by Jon Burgess, Copyright 2006
#
# 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 the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#-----------------------------------------------------------------------------
*/
#include "config.h"
#include "osmtypes.hpp"
#include "reprojection.hpp"
#include "options.hpp"
#include "parse.hpp"
#include "middle.hpp"
#include "output.hpp"
#include "osmdata.hpp"
#include "util.hpp"
#include <time.h>
#include <stdexcept>
#include <string>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <libpq-fe.h>
#include <boost/format.hpp>
void check_db(const char* conninfo, const int unlogged)
{
PGconn *sql_conn = PQconnectdb(conninfo);
//make sure you can connect
if (PQstatus(sql_conn) != CONNECTION_OK) {
throw std::runtime_error((boost::format("Error: Connection to database failed: %1%\n") % PQerrorMessage(sql_conn)).str());
}
//make sure unlogged it is supported by your database if you want it
if (unlogged && PQserverVersion(sql_conn) < 90100) {
throw std::runtime_error((
boost::format("Error: --unlogged works only with PostgreSQL 9.1 and above, but\n you are using PostgreSQL %1%.%2%.%3%.\n")
% (PQserverVersion(sql_conn) / 10000)
% ((PQserverVersion(sql_conn) / 100) % 100)
% (PQserverVersion(sql_conn) % 100)).str());
}
PQfinish(sql_conn);
}
int main(int argc, char *argv[])
{
fprintf(stderr, "osm2pgsql SVN version %s (%lubit id space)\n\n", VERSION, 8 * sizeof(osmid_t));
try
{
//parse the args into the different options members
options_t options = options_t(argc, argv);
if(options.long_usage_bool)
return 0;
//setup the front (input)
parse_delegate_t parser(options.extra_attributes, options.bbox,
options.projection, options.append);
//setup the middle
std::shared_ptr<middle_t> middle = middle_t::create_middle(options.slim);
//setup the backend (output)
std::vector<std::shared_ptr<output_t> > outputs = output_t::create_outputs(middle.get(), options);
//let osmdata orchestrate between the middle and the outs
osmdata_t osmdata(middle, outputs);
//check the database
check_db(options.database_options.conninfo().c_str(), options.unlogged);
fprintf(stderr, "Using projection SRS %d (%s)\n",
options.projection->project_getprojinfo()->srs,
options.projection->project_getprojinfo()->descr );
//start it up
time_t overall_start = time(nullptr);
osmdata.start();
/* Processing
* In this phase the input file(s) are read and parsed, populating some of the
* tables. Not all ways can be handled before relations are processed, so they're
* set as pending, to be handled in the next stage.
*/
//read in the input files one by one
for (auto const filename : options.input_files) {
//read the actual input
fprintf(stderr, "\nReading in file: %s\n", filename.c_str());
time_t start = time(nullptr);
parser.stream_file(options.input_reader, filename, &osmdata);
fprintf(stderr, " parse time: %ds\n", (int)(time(nullptr) - start));
}
//show stats
parser.print_summary();
//Process pending ways, relations, cluster, and create indexes
osmdata.stop();
fprintf(stderr, "\nOsm2pgsql took %ds overall\n", (int)(time(nullptr) - overall_start));
return 0;
}//something went wrong along the way
catch(const std::runtime_error& e)
{
fprintf(stderr, "Osm2pgsql failed due to ERROR: %s\n", e.what());
exit(EXIT_FAILURE);
}
}