int main(int argc, char* argv[]) { std::string map; std::list<Job> jobs; std::set<osmscout::OSMId> coordIds; if (!ParseArguments(argc, argv, map, coordIds, jobs)) { return 1; } osmscout::DatabaseParameter databaseParameter; osmscout::Database database(databaseParameter); osmscout::DebugDatabaseParameter debugDatabaseParameter; osmscout::DebugDatabase debugDatabase(debugDatabaseParameter); if (!database.Open(map.c_str())) { std::cerr << "Cannot open database" << std::endl; } if (!debugDatabase.Open(map.c_str())) { std::cerr << "Cannot open debug database" << std::endl; } // OSM ids std::set<osmscout::ObjectOSMRef> osmRefs; std::set<osmscout::ObjectFileRef> fileRefs; for (std::list<Job>::const_iterator job=jobs.begin(); job!=jobs.end(); ++job) { switch (job->osmRef.GetType()) { case osmscout::osmRefNone: break; case osmscout::osmRefNode: case osmscout::osmRefWay: case osmscout::osmRefRelation: osmRefs.insert(job->osmRef); break; } switch (job->fileRef.GetType()) { case osmscout::refNone: break; case osmscout::refNode: case osmscout::refArea: case osmscout::refWay: fileRefs.insert(job->fileRef); break; } } std::map<osmscout::ObjectOSMRef,osmscout::ObjectFileRef> idFileOffsetMap; std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef> fileOffsetIdMap; if (!osmRefs.empty() || !fileRefs.empty()) { if (!debugDatabase.ResolveReferences(osmRefs, fileRefs, idFileOffsetMap, fileOffsetIdMap)) { std::cerr << "Error while resolving node ids and file offsets" << std::endl; } } osmscout::CoordDataFile::CoordResultMap coordsMap; std::vector<osmscout::NodeRef> nodes; std::vector<osmscout::AreaRef> areas; std::vector<osmscout::WayRef> ways; if (!coordIds.empty()) { if (!debugDatabase.GetCoords(coordIds, coordsMap)) { std::cerr << "Error whole loading coords by id" << std::endl; } } if (!fileOffsetIdMap.empty()) { std::list<osmscout::FileOffset> offsets; for (std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator entry=fileOffsetIdMap.begin(); entry!=fileOffsetIdMap.end(); ++entry) { if (entry->first.GetType()==osmscout::refNode) { offsets.push_back(entry->first.GetFileOffset()); } } if (!database.GetNodesByOffset(offsets, nodes)) { std::cerr << "Error whole loading nodes by offset" << std::endl; } } if (!fileOffsetIdMap.empty()) { std::list<osmscout::FileOffset> offsets; for (std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator entry=fileOffsetIdMap.begin(); entry!=fileOffsetIdMap.end(); ++entry) { if (entry->first.GetType()==osmscout::refArea) { offsets.push_back(entry->first.GetFileOffset()); } } if (!database.GetAreasByOffset(offsets, areas)) { std::cerr << "Error whole loading areas by offset" << std::endl; } } if (!fileOffsetIdMap.empty()) { std::list<osmscout::FileOffset> offsets; for (std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator entry=fileOffsetIdMap.begin(); entry!=fileOffsetIdMap.end(); ++entry) { if (entry->first.GetType()==osmscout::refWay) { offsets.push_back(entry->first.GetFileOffset()); } } if (!database.GetWaysByOffset(offsets, ways)) { std::cerr << "Error whole loading ways by offset" << std::endl; } } for (std::set<osmscout::OSMId>::const_iterator id=coordIds.begin(); id!=coordIds.end(); ++id) { osmscout::CoordDataFile::CoordResultMap::const_iterator coordsEntry; coordsEntry=coordsMap.find(*id); if (coordsEntry!=coordsMap.end()) { if (id!=coordIds.begin()) { std::cout << std::endl; } DumpCoord(coordsEntry->second.point); } else { std::cerr << "Cannot find coord with id " << *id << std::endl; } } for (std::list<Job>::const_iterator job=jobs.begin(); job!=jobs.end(); ++job) { if (job!=jobs.begin() || !coordIds.empty()) { std::cout << std::endl; } if (job->osmRef.GetType()!=osmscout::osmRefNone) { std::map<osmscout::ObjectOSMRef,osmscout::ObjectFileRef>::const_iterator reference=idFileOffsetMap.find(job->osmRef); if (reference==idFileOffsetMap.end()) { std::cerr << "Cannot find '" << job->osmRef.GetTypeName() << "' with id " << job->osmRef.GetId() << std::endl; continue; } switch (reference->second.GetType()) { case osmscout::refNone: break; case osmscout::refNode: for (size_t i=0; i<nodes.size(); i++) { if (reference->second.GetFileOffset()==nodes[i]->GetFileOffset()) { DumpNode(debugDatabase.GetTypeConfig(),nodes[i],reference->first.GetId()); break; } } break; case osmscout::refArea: for (size_t i=0; i<areas.size(); i++) { if (reference->second.GetFileOffset()==areas[i]->GetFileOffset()) { DumpArea(debugDatabase.GetTypeConfig(),areas[i],reference->first.GetId()); break; } } break; case osmscout::refWay: for (size_t i=0; i<ways.size(); i++) { if (reference->second.GetFileOffset()==ways[i]->GetFileOffset()) { DumpWay(debugDatabase.GetTypeConfig(),ways[i],reference->first.GetId()); break; } } break; } } else if (job->fileRef.GetType()!=osmscout::refNone) { std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator reference=fileOffsetIdMap.find(job->fileRef); if (reference==fileOffsetIdMap.end()) { std::cerr << "Cannot find '" << job->fileRef.GetTypeName() << "' with offset " << job->fileRef.GetFileOffset() << std::endl; continue; } switch (reference->first.GetType()) { case osmscout::refNone: break; case osmscout::refNode: for (size_t i=0; i<nodes.size(); i++) { if (reference->first.GetFileOffset()==nodes[i]->GetFileOffset()) { DumpNode(debugDatabase.GetTypeConfig(),nodes[i],reference->second.GetId()); break; } } break; case osmscout::refArea: for (size_t i=0; i<areas.size(); i++) { if (reference->first.GetFileOffset()==areas[i]->GetFileOffset()) { DumpArea(debugDatabase.GetTypeConfig(),areas[i],reference->second.GetId()); break; } } break; case osmscout::refWay: for (size_t i=0; i<ways.size(); i++) { if (reference->first.GetFileOffset()==ways[i]->GetFileOffset()) { DumpWay(debugDatabase.GetTypeConfig(),ways[i],reference->second.GetId()); break; } } break; } } } database.Close(); debugDatabase.Close(); return 0; }
int main(int argc, char* argv[]) { std::string map; std::list<Job> jobs; std::set<osmscout::OSMId> coordIds; std::set<osmscout::OSMId> routeNodeCoordIds; std::set<osmscout::Id> routeNodeIds; try { std::locale globalLocale(""); } catch (std::runtime_error) { std::cerr << "ERROR: Cannot set locale" << std::endl; } if (!ParseArguments(argc, argv, map, coordIds, routeNodeCoordIds, jobs)) { return 1; } osmscout::DatabaseParameter databaseParameter; osmscout::Database database(databaseParameter); osmscout::DebugDatabaseParameter debugDatabaseParameter; osmscout::DebugDatabase debugDatabase(debugDatabaseParameter); osmscout::IndexedDataFile<osmscout::Id,osmscout::RouteNode> routeNodeDataFile("router.dat", "router.idx", 6000); if (!database.Open(map.c_str())) { std::cerr << "Cannot open database" << std::endl; } if (!debugDatabase.Open(map.c_str())) { std::cerr << "Cannot open debug database" << std::endl; } if (!routeNodeDataFile.Open(database.GetTypeConfig(), map, true, true)) { std::cerr << "Cannot open routing database" << std::endl; } // OSM ids std::set<osmscout::ObjectOSMRef> osmRefs; std::set<osmscout::ObjectFileRef> fileRefs; for (const auto& job : jobs) { switch (job.osmRef.GetType()) { case osmscout::osmRefNone: break; case osmscout::osmRefNode: case osmscout::osmRefWay: case osmscout::osmRefRelation: osmRefs.insert(job.osmRef); break; } switch (job.fileRef.GetType()) { case osmscout::refNone: break; case osmscout::refNode: case osmscout::refArea: case osmscout::refWay: fileRefs.insert(job.fileRef); break; } } std::map<osmscout::ObjectOSMRef,osmscout::ObjectFileRef> idFileOffsetMap; std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef> fileOffsetIdMap; if (!osmRefs.empty() || !fileRefs.empty()) { if (!debugDatabase.ResolveReferences(osmRefs, fileRefs, idFileOffsetMap, fileOffsetIdMap)) { std::cerr << "Error while resolving node ids and file offsets" << std::endl; } } osmscout::CoordDataFile::ResultMap coordsMap; std::vector<osmscout::NodeRef> nodes; std::vector<osmscout::AreaRef> areas; std::vector<osmscout::WayRef> ways; osmscout::CoordDataFile::ResultMap routeCoordsMap; std::unordered_map<osmscout::Id,osmscout::RouteNodeRef> routeNodeMap; if (!coordIds.empty()) { if (!debugDatabase.GetCoords(coordIds, coordsMap)) { std::cerr << "Error whole loading coords by id" << std::endl; } } if (!routeNodeCoordIds.empty()) { if (!debugDatabase.GetCoords(routeNodeCoordIds, routeCoordsMap)) { std::cerr << "Error whole loading route node coords by id" << std::endl; } } if (!fileOffsetIdMap.empty()) { std::list<osmscout::FileOffset> offsets; for (std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator entry=fileOffsetIdMap.begin(); entry!=fileOffsetIdMap.end(); ++entry) { if (entry->first.GetType()==osmscout::refNode) { offsets.push_back(entry->first.GetFileOffset()); } } if (!database.GetNodesByOffset(offsets, nodes)) { std::cerr << "Error whole loading nodes by offset" << std::endl; } } if (!fileOffsetIdMap.empty()) { std::list<osmscout::FileOffset> offsets; for (std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator entry=fileOffsetIdMap.begin(); entry!=fileOffsetIdMap.end(); ++entry) { if (entry->first.GetType()==osmscout::refArea) { offsets.push_back(entry->first.GetFileOffset()); } } if (!database.GetAreasByOffset(offsets, areas)) { std::cerr << "Error whole loading areas by offset" << std::endl; } } if (!fileOffsetIdMap.empty()) { std::list<osmscout::FileOffset> offsets; for (auto entry=fileOffsetIdMap.begin(); entry!=fileOffsetIdMap.end(); ++entry) { if (entry->first.GetType()==osmscout::refWay) { offsets.push_back(entry->first.GetFileOffset()); } } if (!database.GetWaysByOffset(offsets, ways)) { std::cerr << "Error whole loading ways by offset" << std::endl; } } for (const auto id : routeNodeCoordIds) { auto coordsEntry=routeCoordsMap.find(id); if (coordsEntry!=routeCoordsMap.end()) { routeNodeIds.insert(coordsEntry->second.GetOSMScoutId()); } else { std::cerr << "Cannot find route node coord with id " << id << std::endl; } } if (!routeNodeIds.empty() && routeNodeDataFile.IsOpen()) { if (!routeNodeDataFile.Get(routeNodeIds, routeNodeMap)) { std::cerr << "Error loading route nodes by id" << std::endl; } } bool firstCoord=true; for (const auto id : coordIds) { auto coordsEntry=coordsMap.find(id); if (coordsEntry!=coordsMap.end()) { if (!firstCoord) { std::cout << std::endl; } DumpCoord(coordsEntry->first, coordsEntry->second); } else { std::cerr << "Cannot find coord with id " << id << std::endl; } firstCoord=false; } bool firstRouteNode=true; for (const auto id : routeNodeIds) { auto routeNodeEntry=routeNodeMap.find(id); if (routeNodeEntry!=routeNodeMap.end()) { if (!firstRouteNode) { std::cout << std::endl; } DumpRouteNode(*routeNodeEntry->second); } else { std::cerr << "Cannot find route node with id " << id << std::endl; } firstRouteNode=false; } std::streamsize oldPrecision=std::cout.precision(5); std::ios_base::fmtflags oldFlags=std::cout.setf(std::ios::fixed,std::ios::floatfield); for (std::list<Job>::const_iterator job=jobs.begin(); job!=jobs.end(); ++job) { if (job!=jobs.begin() || !coordIds.empty()) { std::cout << std::endl; } if (job->osmRef.GetType()!=osmscout::osmRefNone) { std::map<osmscout::ObjectOSMRef,osmscout::ObjectFileRef>::const_iterator reference=idFileOffsetMap.find(job->osmRef); if (reference==idFileOffsetMap.end()) { std::cerr << "Cannot find '" << job->osmRef.GetTypeName() << "' with id " << job->osmRef.GetId() << std::endl; continue; } switch (reference->second.GetType()) { case osmscout::refNone: break; case osmscout::refNode: for (size_t i=0; i<nodes.size(); i++) { if (reference->second.GetFileOffset()==nodes[i]->GetFileOffset()) { DumpNode(nodes[i],reference->first.GetId()); break; } } break; case osmscout::refArea: for (size_t i=0; i<areas.size(); i++) { if (reference->second.GetFileOffset()==areas[i]->GetFileOffset()) { DumpArea(areas[i],reference->first.GetId()); break; } } break; case osmscout::refWay: for (size_t i=0; i<ways.size(); i++) { if (reference->second.GetFileOffset()==ways[i]->GetFileOffset()) { DumpWay(ways[i],reference->first.GetId()); break; } } break; } } else if (job->fileRef.GetType()!=osmscout::refNone) { std::map<osmscout::ObjectFileRef,osmscout::ObjectOSMRef>::const_iterator reference=fileOffsetIdMap.find(job->fileRef); if (reference==fileOffsetIdMap.end()) { std::cerr << "Cannot find '" << job->fileRef.GetTypeName() << "' with offset " << job->fileRef.GetFileOffset() << std::endl; continue; } switch (reference->first.GetType()) { case osmscout::refNone: break; case osmscout::refNode: for (size_t i=0; i<nodes.size(); i++) { if (reference->first.GetFileOffset()==nodes[i]->GetFileOffset()) { DumpNode(nodes[i],reference->second.GetId()); break; } } break; case osmscout::refArea: for (size_t i=0; i<areas.size(); i++) { if (reference->first.GetFileOffset()==areas[i]->GetFileOffset()) { DumpArea(areas[i],reference->second.GetId()); break; } } break; case osmscout::refWay: for (size_t i=0; i<ways.size(); i++) { if (reference->first.GetFileOffset()==ways[i]->GetFileOffset()) { DumpWay(ways[i],reference->second.GetId()); break; } } break; } } } std::cout.setf(oldFlags,std::ios::floatfield); std::cout.precision(oldPrecision); database.Close(); debugDatabase.Close(); return 0; }