void QcOsmPbfReader::read_osm_data() { // tell about the OSMData blob qDebug() << " OSMData"; // parse the PrimitiveBlock from the blob if (!m_primitive_block.ParseFromArray(m_unpack_buffer, m_buffer_size)) qCritical() << "unable to parse primitive block"; // tell about the block's meta info m_granularity = m_primitive_block.granularity(); // default: 100 m_latitude_offset = m_primitive_block.lat_offset(); // default: 0 m_longitude_offset = m_primitive_block.lon_offset(); // default: 0 m_date_granularity = m_primitive_block.date_granularity(); // default: 1000 // qDebug().nospace() << " granularity: " << m_granularity; // qDebug().nospace() << " lat_offset: " << m_latitude_offset; // qDebug().nospace() << " lon_offset: " << m_longitude_offset; // qDebug().nospace() << " date_granularity: " << m_date_granularity; // tell about the stringtable m_string_table.clear(); OSMPBF::StringTable string_table = m_primitive_block.stringtable(); qDebug().nospace() << " stringtable: " << string_table.s_size() << " items"; for (int i = 0; i < string_table.s_size(); i++) { QString string = string_table.s(i).c_str(); // qDebug().nospace() << " string[" << i << "] " << string ; m_string_table << string; } // number of PrimitiveGroups int number_of_primitive_groups = m_primitive_block.primitivegroup_size(); m_number_of_primitive_groups += number_of_primitive_groups; qDebug().nospace() << " primitivegroups: " << number_of_primitive_groups << " groups"; // iterate over all PrimitiveGroups for (int i = 0, l = number_of_primitive_groups; i < l; i++) { /* A PrimitiveGroup MUST NEVER contain different types of * objects. So either it contains many Node messages, or a * DenseNode message, or many Way messages, or many Relation * messages, or many ChangeSet messages. */ // one PrimitiveGroup from the the Block OSMPBF::PrimitiveGroup primitive_group = m_primitive_block.primitivegroup(i); bool found_items = false; // tell about nodes int number_of_nodes = primitive_group.nodes_size(); if (number_of_nodes > 0) { found_items = true; m_number_of_node_primitive_groups++; m_number_of_nodes += number_of_nodes; qDebug().nospace() << " primitive nodes: " << number_of_nodes; if (m_read_nodes) read_nodes(primitive_group); } // tell about dense nodes if (primitive_group.has_dense()) { found_items = true; m_number_of_dense_node_primitive_groups++; int number_of_nodes = primitive_group.dense().id_size(); m_number_of_nodes += number_of_nodes; qDebug().nospace() << " primitive dense nodes: " << number_of_nodes; if (m_read_nodes) read_dense_nodes(primitive_group); } // tell about ways if (primitive_group.ways_size() > 0) { found_items = true; m_number_of_way_primitive_groups++; int number_of_ways = primitive_group.ways_size(); m_number_of_ways += number_of_ways; qDebug().nospace() << " primitive ways: " << number_of_ways; if (m_read_ways) read_ways(primitive_group); } // tell about relations if (primitive_group.relations_size() > 0) { found_items = true; m_number_of_relation_primitive_groups++; int number_of_relations = primitive_group.relations_size(); m_number_of_relations += number_of_relations; qDebug().nospace() << " primitive relations: " << primitive_group.relations_size(); if (m_read_relations) read_relations(primitive_group); } if (!found_items) qWarning() << " contains no items"; } }
void read_relations(TSource& source) { read_relations(std::begin(source), std::end(source)); source.close(); }