Esempio n. 1
0
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";
  }
}
Esempio n. 2
0
 void read_relations(TSource& source) {
     read_relations(std::begin(source), std::end(source));
     source.close();
 }