void InfoTreeCtrl::SetInfo(TileWay *ways) { if (m_canvas) { m_canvas->SelectWay(NULL); } DeleteAllItems(); wxTreeItemId root = AddRoot(wxT("this node is a member of:")); for (TileWay *w = ways; w ; w = static_cast<TileWay *>(w->m_next)) { wxTreeItemId wayId = AddWay(root, w->m_way); for (OsmRelationList *rl = w->m_way->m_relations; rl; rl = (OsmRelationList *)(rl->m_next)) { AddRelation(wayId, rl->m_relation); } } ExpandAll(); }
void CThreadLoader::Start(CThreadUnit** pTasks, int countTasks) { m_pprimblock=new OSMPBF::PrimitiveBlock; if(m_nCount >0) { assert(false); } boost::timer::nanosecond_type const secunda(1000000000LL); boost::timer::cpu_timer uTimer; //unsigned uTime=0; if(m_nThredNumber==0) { uTimer.start(); } std::vector<char> buffer_blob_header; std::vector<char> buffer(OSMPBF::max_uncompressed_blob_size); std::vector<unsigned char> unpack_buffer(OSMPBF::max_uncompressed_blob_size); const char* pbWork; //for(int l=0;l<20;++l) for(;;) { // storage of size, used multiple times __int32 sz; OSMPBF::BlobHeader blobheader; { //Начало паралельной работы boost::lock_guard<boost::mutex> l(*m_pcsFile); if(feof(m_fp)) break; // read the first 4 bytes of the file, this is the size of the blob-header if(fread(&sz, sizeof(sz), 1, m_fp) != 1) break; // end of file reached // convert the size from network byte-order to host byte-order sz = ntohl(sz); // ensure the blob-header is smaller then MAX_BLOB_HEADER_SIZE if(sz > OSMPBF::max_blob_header_size) err("blob-header-size is bigger then allowed (%u > %u)", sz, OSMPBF::max_blob_header_size); buffer_blob_header.resize(sz); // read the blob-header from the file if(fread(&buffer_blob_header[0], sz, 1, m_fp) != 1) err("unable to read blob-header from file"); // parse the blob-header from the read-buffer if(!blobheader.ParseFromArray(&buffer_blob_header[0], sz)) err("unable to parse blob header"); // size of the following blob sz = blobheader.m_datasize.m_val; // ensure the blob is smaller then MAX_BLOB_SIZE if(sz > OSMPBF::max_uncompressed_blob_size) err("blob-size is bigger then allowed (%u > %u)", sz, OSMPBF::max_uncompressed_blob_size); // read the blob from the file if(fread(&buffer[0], sz, 1, m_fp) != 1) err("unable to read blob from file"); //Отсюда можно работать паралельно } // ++m_nCount; continue; // parse the blob from the read-buffer OSMPBF::Blob blob; if(!blob.ParseFromArray(&buffer[0], sz)) err("unable to parse blob"); // set when we find at least one data stream bool found_data = false; // if the blob has uncompressed data if(!blob.m_raw.empty()) { // we have at least one datastream found_data = true; // size of the blob-data sz = blob.m_raw.size(); // check that raw_size is set correctly if(sz != blob.m_raw_size.m_val) warn(" reports wrong raw_size: %u bytes", blob.m_raw_size.m_val); // copy the uncompressed data over to the unpack_buffer //memcpy(&unpack_buffer[0], &buffer[0], sz); pbWork=&buffer[0]; } // if the blob has zlib-compressed data if(!blob.m_zlib_data.empty()) { // issue a warning if there is more than one data steam, a blob may only contain one data stream if(found_data) warn(" contains several data streams"); // we have at least one datastream found_data = true; // the size of the compressesd data sz = blob.m_zlib_data.size(); // zlib information z_stream z; // next byte to decompress z.next_in = (z_const Bytef *) blob.m_zlib_data.m_pBegin; // number of bytes to decompress z.avail_in = sz; // place of next decompressed byte z.next_out = &unpack_buffer[0]; pbWork= (const char*) &unpack_buffer[0]; // space for decompressed data z.avail_out = blob.m_raw_size.m_val; // misc z.zalloc = Z_NULL; z.zfree = Z_NULL; z.opaque = Z_NULL; if(inflateInit(&z) != Z_OK) { err(" failed to init zlib stream"); } if(inflate(&z, Z_FINISH) != Z_STREAM_END) { err(" failed to inflate zlib stream"); } if(inflateEnd(&z) != Z_OK) { err(" failed to deinit zlib stream"); } // unpacked size sz = z.total_out; } // if the blob has lzma-compressed data if(!blob.m_lzma_data.empty()) { // issue a warning if there is more than one data steam, a blob may only contain one data stream if(found_data) warn(" contains several data streams"); // we have at least one datastream found_data = true; // issue a warning, lzma compression is not yet supported err(" lzma-decompression is not supported"); } // check we have at least one data-stream if(!found_data) err(" does not contain any known data stream"); // switch between different blob-types if(blobheader.m_type.compareString("OSMHeader")==0) { OSMPBF::Headerblock headerblock ; // parse the HeaderBlock from the blob if(!headerblock.ParseFromArray(pbWork, sz)) err("unable to parse header block"); } else if(blobheader.m_type.compareString("OSMData")==0) { m_pprimblock->Clear(); // parse the PrimitiveBlock from the blob if(!m_pprimblock->ParseFromArray(pbWork, sz)) err("unable to parse primitive block"); // iterate over all PrimitiveGroups for(int i = 0, l = m_pprimblock->m_primitivegroup.size(); i < l; i++) { // one PrimitiveGroup from the the Block OSMPBF::PrimitiveGroup& pg = m_pprimblock->m_primitivegroup[i]; bool found_items=false; // tell about nodes if(pg.m_nodes.size() > 0) { found_items = true; for(size_t i=0;i<pg.m_nodes.size();++i) AddNode(pg.m_nodes[i]); } // tell about dense nodes if(!pg.m_dense.empty()) { found_items = true; AddDense(pg.m_dense); } // tell about ways if(pg.m_ways.size() > 0) { found_items = true; for(size_t i=0;i<pg.m_ways.size();++i) AddWay(pg.m_ways[i]); } // tell about relations if(pg.m_relations.size() > 0) { found_items = true; for(size_t i=0;i<pg.m_relations.size();++i) AddRelations(pg.m_relations[i]); } if(!found_items) warn(" contains no items"); } } else { // unknown blob type warn(" unknown blob type: %s", blobheader.m_type.toString().c_str()); } ////////////////////////////////////////////////////////////////////////// LONG l =INTERLOCKED_INCREMENT(m_nCount); if(m_nThredNumber==0) { boost::timer::cpu_times const elapsed_times(uTimer.elapsed()); boost::timer::nanosecond_type elapsed(elapsed_times.wall); if(elapsed >= secunda) { info("Bloks=%d",l); uTimer.start(); } } } m_tabNode_Cash.Save(); m_tabNode_NotVisible_Cash.Save(); m_tabNI_Cash.Save(); m_tabNI_NotVisible_Cash.Save(); m_tabWI_Cash.Save(); m_tabWI_NotVisible_Cash.Save(); m_tabRI_Cash.Save(); m_tabRI_NotVisible_Cash.Save(); m_tabkvNode_cash.Save(); m_tabkvWay_cash.Save(); m_tabkvRelation_cash.Save(); delete m_pprimblock; m_pprimblock=NULL; }