30 #include <netinet/in.h>
37 #include <osmpbf/fileformat.pb.h>
39 #include <osmpbf/osmformat.pb.h>
51 typedef std::map<std::string, std::string>
Tags;
68 template<
typename Visitor>
69 void read_osm_pbf(
const std::string & filename, Visitor & visitor,
bool wayOnly);
72 warn() {std::cout <<
"\033[33m[WARN] ";}
73 template<
typename T>
warn &
operator<<(
const T & t){ std::cout << t;
return *
this;}
74 ~warn() {std::cout <<
"\033[0m" << std::endl;}
80 std::cout <<
"\033[32m[INFO] ";
83 template<
typename T>
info &
operator<<(
const T & t){ std::cout << t;
return *
this;}
86 std::cout <<
"\033[0m";
88 std::cout << std::endl;
93 fatal() {std::cout <<
"\033[31m[FATAL] ";}
94 template<
typename T>
fatal &
operator<<(
const T & t){ std::cout << t;
return *
this;}
95 ~fatal() {std::cout <<
"\033[0m" << std::endl; exit(1);}
98 std::streampos
fileSize(
const char* filePath) {
99 std::streampos begin, end;
100 std::ifstream mfile(filePath, std::ios::binary);
101 begin = mfile.tellg();
102 mfile.seekg (0, std::ios::end);
109 Tags get_tags(
const T&
object,
const OSMPBF::PrimitiveBlock &primblock){
111 for(
int i = 0; i <
object.keys_size(); ++i){
112 uint64_t key =
object.keys(i);
113 uint64_t val =
object.vals(i);
114 std::string key_string = primblock.stringtable().s(key);
115 std::string val_string = primblock.stringtable().s(val);
116 result[key_string] = val_string;
121 template<
typename Visitor>
135 if(header.type() ==
"OSMData") {
138 else if(header.type() ==
"OSMHeader"){
141 warn() <<
" unknown blob type: " << header.type();
145 if ((todo+10000000) < last_todo) {
159 file = std::ifstream(filename.c_str(), std::ios::binary );
163 fatal() <<
"Unable to open the file " << filename;
166 info() <<
"#Reading the file " << filename;
186 OSMPBF::BlobHeader result;
189 if( !
file.read((
char*)&sz, 4) ){
190 info() <<
"# We finished reading the file";
191 this->finished =
true;
200 this->file.read(this->buffer, sz);
201 if(!this->file.good())
202 fatal() <<
"unable to read blob-header from file";
205 if(!result.ParseFromArray(this->buffer, sz))
206 fatal() <<
"unable to parse blob header";
213 int32_t sz = header.datasize();
216 fatal() <<
"blob-size is bigger then allowed";
218 if(!this->file.read(
buffer, sz))
219 fatal() <<
"unable to read blob from file";
220 if(!blob.ParseFromArray(this->buffer, sz))
221 fatal() <<
"unable to parse blob";
226 sz = blob.raw().size();
229 if(sz != blob.raw_size())
230 warn() <<
" reports wrong raw_size: " << blob.raw_size() <<
" bytes";
236 if(blob.has_zlib_data()) {
238 sz = blob.zlib_data().size();
241 z.next_in = (
unsigned char*) blob.zlib_data().c_str();
244 z.avail_out = blob.raw_size();
249 if(inflateInit(&z) != Z_OK) {
250 fatal() <<
"failed to init zlib stream";
252 if(inflate(&z, Z_FINISH) != Z_STREAM_END) {
253 fatal() <<
"failed to inflate zlib stream";
255 if(inflateEnd(&z) != Z_OK) {
256 fatal() <<
"failed to deinit zlib stream";
261 if(blob.has_lzma_data()) {
262 fatal() <<
"lzma-decompression is not supported";
268 OSMPBF::PrimitiveBlock primblock;
269 if(!primblock.ParseFromArray(this->unpack_buffer, sz))
270 fatal() <<
"unable to parse primitive block";
272 for(
int i = 0, l = primblock.primitivegroup_size(); i < l; i++) {
273 const OSMPBF::PrimitiveGroup& pg = primblock.primitivegroup(i);
277 for(
int i = 0; i < pg.ways_size(); ++i) {
278 const OSMPBF::Way& w = pg.ways(i);
281 std::vector<uint64_t> refs;
282 for(
int j = 0; j < w.refs_size(); ++j){
286 uint64_t
id = w.id();
294 for(
int i = 0; i < pg.nodes_size(); ++i) {
295 const OSMPBF::Node& n = pg.nodes(i);
297 double lon = 0.000000001 * (primblock.lon_offset() + (primblock.granularity() * n.lon())) ;
298 double lat = 0.000000001 * (primblock.lat_offset() + (primblock.granularity() * n.lat())) ;
304 const OSMPBF::DenseNodes& dn = pg.dense();
313 for(
int i = 0; i < dn.id_size(); ++i) {
315 lon += 0.000000001 * (primblock.lon_offset() + (primblock.granularity() * dn.lon(i)));
316 lat += 0.000000001 * (primblock.lat_offset() + (primblock.granularity() * dn.lat(i)));
319 while (current_kv < dn.keys_vals_size() && dn.keys_vals(current_kv) != 0){
320 uint64_t key = dn.keys_vals(current_kv);
321 uint64_t val = dn.keys_vals(current_kv + 1);
322 std::string key_string = primblock.stringtable().s(key);
323 std::string val_string = primblock.stringtable().s(val);
325 tags[key_string] = val_string;
328 visitor.node_callback(
id, lon, lat, tags);
358 template<
typename Visitor>
359 void read_osm_pbf(
const std::string & filename, Visitor & visitor,
bool wayOnly){
Definition: osmpbfreader.hpp:48
std::vector< Reference > References
Definition: osmpbfreader.hpp:65
void read_osm_pbf(const std::string &filename, Visitor &visitor, bool wayOnly)
Definition: osmpbfreader.hpp:359
std::streampos fileSize(const char *filePath)
Definition: osmpbfreader.hpp:98
std::map< std::string, std::string > Tags
Definition: osmpbfreader.hpp:51
Tags get_tags(const T &object, const OSMPBF::PrimitiveBlock &primblock)
Definition: osmpbfreader.hpp:109
const int lonlat_resolution
Definition: osmpbfreader.hpp:46
const int max_blob_header_size
Definition: osmpbfreader.hpp:41
const int max_uncompressed_blob_size
Definition: osmpbfreader.hpp:43
Definition: osmpbfreader.hpp:122
char * unpack_buffer
Definition: osmpbfreader.hpp:181
void parse_primitiveblock(int32_t sz)
Definition: osmpbfreader.hpp:267
bool wayOnly
Definition: osmpbfreader.hpp:178
std::streampos file_size
Definition: osmpbfreader.hpp:182
~Parser()
Definition: osmpbfreader.hpp:170
int32_t read_blob(const OSMPBF::BlobHeader &header)
Definition: osmpbfreader.hpp:210
char * buffer
Definition: osmpbfreader.hpp:180
Visitor & visitor
Definition: osmpbfreader.hpp:177
Parser(const std::string &filename, Visitor &visitor, bool _wayOnly)
Definition: osmpbfreader.hpp:155
OSMPBF::BlobHeader read_header()
Definition: osmpbfreader.hpp:184
void parse()
Definition: osmpbfreader.hpp:124
bool finished
Definition: osmpbfreader.hpp:179
std::ifstream file
Definition: osmpbfreader.hpp:176
Definition: osmpbfreader.hpp:54
Reference(OSMPBF::Relation::MemberType member_type, uint64_t member_id, std::string role)
Definition: osmpbfreader.hpp:60
uint64_t member_id
Definition: osmpbfreader.hpp:56
Reference()
Definition: osmpbfreader.hpp:59
std::string role
Definition: osmpbfreader.hpp:57
OSMPBF::Relation::MemberType member_type
Definition: osmpbfreader.hpp:55
Definition: osmpbfreader.hpp:92
~fatal()
Definition: osmpbfreader.hpp:95
fatal()
Definition: osmpbfreader.hpp:93
fatal & operator<<(const T &t)
Definition: osmpbfreader.hpp:94
Definition: osmpbfreader.hpp:77
info()
Definition: osmpbfreader.hpp:78
~info()
Definition: osmpbfreader.hpp:84
info & operator<<(const T &t)
Definition: osmpbfreader.hpp:83
Definition: osmpbfreader.hpp:71
warn()
Definition: osmpbfreader.hpp:72
warn & operator<<(const T &t)
Definition: osmpbfreader.hpp:73
~warn()
Definition: osmpbfreader.hpp:74