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);
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