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 Import(const ImportParameter& parameter, Progress& progress) { // TODO: verify parameter TypeConfigRef typeConfig(new TypeConfig()); std::list<ImportModule*> modules; if (parameter.GetAreaWayMinMag()<=parameter.GetOptimizationMaxMag()) { progress.Error("Area way index minimum magnification is <= than optimization max magnification"); } progress.SetStep("Loading type config"); if (!typeConfig->LoadFromOSTFile(parameter.GetTypefile())) { progress.Error("Cannot load type configuration!"); return false; } progress.Info("Number of types: "+NumberToString(typeConfig->GetTypes().size())); progress.Info("Number of node types: "+NumberToString(typeConfig->GetNodeTypes().size())+" "+NumberToString(typeConfig->GetNodeTypeIdBytes())+" byte(s)"); progress.Info("Number of way types: "+NumberToString(typeConfig->GetWayTypes().size())+" "+NumberToString(typeConfig->GetWayTypeIdBytes())+" byte(s)"); progress.Info("Number of area types: "+NumberToString(typeConfig->GetAreaTypes().size())+" "+NumberToString(typeConfig->GetAreaTypeIdBytes())+" byte(s)"); typeConfig->RegisterNameTag("name",0); typeConfig->RegisterNameTag("place_name",1); /* typeConfig->RegisterNameAltTag("name:ru",0); typeConfig->RegisterNameAltTag("place_name:ru",1); */ /* 1 */ modules.push_back(new TypeDataGenerator()); /* 2 */ modules.push_back(new Preprocess()); /* 3 */ modules.push_back(new RawNodeIndexGenerator(AppendFileToDir(parameter.GetDestinationDirectory(), "rawnodes.dat"), AppendFileToDir(parameter.GetDestinationDirectory(), "rawnode.idx"))); /* 4 */ modules.push_back(new RawWayIndexGenerator(AppendFileToDir(parameter.GetDestinationDirectory(), "rawways.dat"), AppendFileToDir(parameter.GetDestinationDirectory(), "rawway.idx"))); /* 5 */ modules.push_back(new RawRelationIndexGenerator(AppendFileToDir(parameter.GetDestinationDirectory(), "rawrels.dat"), AppendFileToDir(parameter.GetDestinationDirectory(), "rawrel.idx"))); /* 6 */ modules.push_back(new RelAreaDataGenerator()); /* 7 */ modules.push_back(new WayAreaDataGenerator()); /* 8 */ modules.push_back(new MergeAreaDataGenerator()); /* 9 */ modules.push_back(new MergeAreasGenerator()); /* 10 */ modules.push_back(new WayWayDataGenerator()); /* 11 */ modules.push_back(new OptimizeAreaWayIdsGenerator()); /* 12 */ modules.push_back(new NodeDataGenerator()); /* 13 */ modules.push_back(new SortNodeDataGenerator()); /* 14 */ modules.push_back(new SortWayDataGenerator()); /* 15 */ modules.push_back(new AreaNodeIndexGenerator()); /* 16 */ modules.push_back(new AreaWayIndexGenerator()); /* 17 */ modules.push_back(new AreaAreaIndexGenerator()); /* 18 */ modules.push_back(new WaterIndexGenerator()); /* 19 */ modules.push_back(new OptimizeAreasLowZoomGenerator()); /* 20 */ modules.push_back(new OptimizeWaysLowZoomGenerator()); /* 21 */ modules.push_back(new LocationIndexGenerator()); /* 22 */ modules.push_back(new RouteDataGenerator()); /* 23 */ modules.push_back(new NumericIndexGenerator<Id,Intersection>(std::string("Generating '")+RoutingService::FILENAME_INTERSECTIONS_IDX+"'", AppendFileToDir(parameter.GetDestinationDirectory(), RoutingService::FILENAME_INTERSECTIONS_DAT), AppendFileToDir(parameter.GetDestinationDirectory(), RoutingService::FILENAME_INTERSECTIONS_IDX))); #if defined(OSMSCOUT_IMPORT_HAVE_LIB_MARISA) /* 24 */ modules.push_back(new TextIndexGenerator()); #endif bool result=ExecuteModules(modules, parameter, progress, typeConfig); for (const auto& module : modules) { delete module; } return result; }
bool OptimizeAreasLowZoomGenerator::HandleAreas(const ImportParameter& parameter, Progress& progress, const TypeConfig& typeConfig, FileWriter& writer, const TypeInfoSet& types, std::list<TypeData>& typesData) { FileScanner scanner; // Everything smaller than 2mm should get dropped. Width, height and DPI come from the Nexus 4 double dpi=320.0; double pixel=2.0/* mm */ * dpi / 25.4 /* inch */; progress.Info("Minimum visible size in pixel: "+NumberToString((unsigned long)pixel)); try { scanner.Open(AppendFileToDir(parameter.GetDestinationDirectory(), AreaDataFile::AREAS_DAT), FileScanner::Sequential, parameter.GetWayDataMemoryMaped()); TypeInfoSet typesToProcess(types); std::vector<std::list<AreaRef> > allAreas(typeConfig.GetTypeCount()); while (true) { // // Load type data // TypeInfoSet loadedTypes; if (!GetAreas(typeConfig, parameter, progress, scanner, typesToProcess, allAreas, loadedTypes)) { return false; } typesToProcess.Remove(loadedTypes); for (const auto& type : loadedTypes) { progress.SetAction("Optimizing type "+ type->GetName()); for (uint32_t level=parameter.GetOptimizationMinMag(); level<=parameter.GetOptimizationMaxMag(); level++) { Magnification magnification; // Magnification, we optimize for std::list<AreaRef> optimizedAreas; magnification.SetLevel(level); OptimizeAreas(allAreas[type->GetIndex()], optimizedAreas, 1280,768, dpi, pixel, magnification, parameter.GetOptimizationWayMethod()); if (optimizedAreas.empty()) { progress.Debug("Empty optimization result for level "+NumberToString(level)+", no index generated"); TypeData typeData; typeData.type=type; typeData.optLevel=level; typesData.push_back(typeData); continue; } progress.Info("Optimized from "+NumberToString(allAreas[type->GetIndex()].size())+" to "+NumberToString(optimizedAreas.size())+" areas"); /* size_t optAreas=optimizedAreas.size(); size_t optRoles=0; size_t optNodes=0; for (std::list<AreaRef>::const_iterator a=optimizedAreas.begin(); a!=optimizedAreas.end(); ++a) { AreaRef area=*a; optRoles+=area->rings.size(); for (size_t r=0; r<area->rings.size(); r++) { optNodes+=area->rings[r].nodes.size(); } }*/ /* std::cout << "Areas: " << origAreas << " => " << optAreas << std::endl; std::cout << "Roles: " << origRoles << " => " << optRoles << std::endl; std::cout << "Nodes: " << origNodes << " => " << optNodes << std::endl;*/ TypeData typeData; typeData.type=type; typeData.optLevel=level; GetAreaIndexLevel(parameter, optimizedAreas, typeData); //std::cout << "Resulting index level: " << typeData.indexLevel << ", " << typeData.indexCells << ", " << typeData.indexEntries << std::endl; FileOffsetFileOffsetMap offsets; WriteAreas(typeConfig, writer, optimizedAreas, offsets); if (!WriteAreaBitmap(progress, writer, optimizedAreas, offsets, typeData)) { return false; } typesData.push_back(typeData); } allAreas[type->GetIndex()].clear(); } if (typesToProcess.Empty()) { break; } } scanner.Close(); } catch (IOException& e) { progress.Error(e.GetDescription()); return false; } return true; }