bool WayLocationProcessorFilter::AfterProcessingEnd(const ImportParameter& /*parameter*/, Progress& progress, const TypeConfig& /*typeConfig*/) { delete nameReader; nameReader=NULL; delete locationReader; locationReader=NULL; writer.SetPos(0); writer.Write(overallDataCount); try { writer.Close(); } catch (IOException& e) { progress.Error(e.GetDescription()); writer.CloseFailsafe(); return false; } return true; }
bool OptimizeAreasLowZoomGenerator::Import(const TypeConfigRef& typeConfig, const ImportParameter& parameter, Progress& progress) { FileOffset indexOffset=0; FileWriter writer; Magnification magnification; // Magnification, we optimize for TypeInfoSet areaTypes; // Types we optimize std::list<TypeData> areaTypesData; GetAreaTypesToOptimize(*typeConfig, areaTypes); try { writer.Open(AppendFileToDir(parameter.GetDestinationDirectory(), OptimizeAreasLowZoom::FILE_AREASOPT_DAT)); // // Write header // writer.WriteFileOffset(indexOffset); if (!HandleAreas(parameter, progress, *typeConfig, writer, areaTypes, areaTypesData)) { progress.Error("Error while optimizing areas"); return false; } // Position of the index indexOffset=writer.GetPos(); if (!WriteHeader(writer, areaTypesData, (uint32_t)parameter.GetOptimizationMaxMag())) { progress.Error("Cannot write file header"); return false; } writer.GotoBegin(); writer.WriteFileOffset(indexOffset); writer.Close(); } catch (IOException& e) { progress.Error(e.GetDescription()); writer.CloseFailsafe(); return false; } return true; }
bool MergeAreasGenerator::Import(const TypeConfigRef& typeConfig, const ImportParameter& parameter, Progress& progress) { TypeInfoSet mergeTypes; FileScanner scanner; FileWriter writer; uint32_t areasWritten=0; for (const auto& type : typeConfig->GetTypes()) { if (type->CanBeArea() && type->GetMergeAreas()) { mergeTypes.Set(type); } } std::unordered_set<Id> nodeUseMap; try { scanner.Open(AppendFileToDir(parameter.GetDestinationDirectory(), MergeAreaDataGenerator::AREAS_TMP), FileScanner::Sequential, parameter.GetRawWayDataMemoryMaped()); if (!ScanAreaNodeIds(progress, *typeConfig, scanner, mergeTypes, nodeUseMap)) { return false; } uint32_t nodeCount=nodeUseMap.size(); progress.Info("Found "+NumberToString(nodeCount)+" nodes as possible connection points for areas"); /* ------ */ writer.Open(AppendFileToDir(parameter.GetDestinationDirectory(), AREAS2_TMP)); writer.Write(areasWritten); while (true) { TypeInfoSet loadedTypes; std::vector<AreaMergeData> mergeJob(typeConfig->GetTypeCount()); // // Load type data // progress.SetAction("Collecting area data by type"); if (!GetAreas(parameter, progress, *typeConfig, mergeTypes, loadedTypes, nodeUseMap, scanner, writer, mergeJob, areasWritten)) { return false; } // Merge progress.SetAction("Merging areas"); for (const auto& type : loadedTypes) { if (!mergeJob[type->GetIndex()].areas.empty()) { progress.Info("Merging areas of type "+type->GetName()); MergeAreas(progress, nodeUseMap, mergeJob[type->GetIndex()]); progress.Info("Reduced areas of '"+type->GetName()+"' from "+NumberToString(mergeJob[type->GetIndex()].areaCount)+" to "+NumberToString(mergeJob[type->GetIndex()].areaCount-mergeJob[type->GetIndex()].mergedAway.size())); mergeJob[type->GetIndex()].areas.clear(); } } // Store back merge result if (!loadedTypes.Empty()) { if (!WriteMergeResult(progress, *typeConfig, scanner, writer, loadedTypes, mergeJob, areasWritten)) { return false; } mergeTypes.Remove(loadedTypes); } if (mergeTypes.Empty()) { break; } } scanner.Close(); writer.GotoBegin(); writer.Write(areasWritten); writer.Close(); } catch (IOException& e) { progress.Error(e.GetDescription()); scanner.CloseFailsafe(); writer.CloseFailsafe(); return false; } return true; }