1 #ifndef OSMSCOUT_IMPORT_SORTDAT_H 2 #define OSMSCOUT_IMPORT_SORTDAT_H 51 typename std::list<Source>::iterator source;
55 inline CellEntry(uint8_t type,
57 const typename std::list<Source>::iterator source,
63 fileOffset(fileOffset),
69 inline bool operator<(
const CellEntry& other)
const 71 return sortId<other.sortId;
104 std::list<Source> sources;
105 std::string dataFilename;
106 std::string mapFilename;
107 std::list<ProcessingFilterRef> filters;
110 bool Renumber(
const TypeConfig& typeConfig,
111 const ImportParameter& parameter,
114 bool Copy(
const TypeConfig& typeConfig,
115 const ImportParameter& parameter,
120 GeoCoord& coord) = 0;
123 const std::string& mapFilename);
125 void AddSource(
const std::string& filename);
130 std::list<std::string>
ProvidesFiles(
const ImportParameter& parameter)
const;
133 const ImportParameter& parameter,
145 const std::string& mapFilename)
146 : dataFilename(dataFilename),
147 mapFilename(mapFilename)
155 std::list<std::string> providedFiles={dataFilename, mapFilename};
157 return providedFiles;
165 source.filename=filename;
167 sources.push_back(source);
173 filters.push_back(filter);
178 const ImportParameter& parameter,
181 FileWriter dataWriter;
182 FileWriter mapWriter;
183 size_t zoomLevel=
Pow(2,parameter.GetSortTileMag());
184 size_t cellCount=zoomLevel*zoomLevel;
185 size_t maxIndex=cellCount-1;
190 uint32_t overallDataCount=0;
191 uint32_t dataCopiedCount=0;
194 for (
auto& source : sources) {
195 source.scanner.Open(
AppendFileToDir(parameter.GetDestinationDirectory(),
197 FileScanner::Sequential,
198 parameter.GetWayDataMemoryMaped());
200 uint32_t dataCount=source.scanner.ReadUInt32();
202 progress.
Info(std::to_string(dataCount)+
" entries in file '"+source.scanner.GetFilename()+
"'");
204 overallDataCount+=dataCount;
211 dataWriter.Write(overallDataCount);
216 mapWriter.Write(overallDataCount);
219 progress.
Info(
"Reading objects in cell range "+std::to_string(minIndex)+
"-"+std::to_string(maxIndex));
221 size_t currentEntries=0;
222 std::map<size_t,std::list<CellEntry> > dataByCellMap;
224 for (
typename std::list<Source>::iterator source=sources.begin();
225 source!=sources.end();
227 progress.
Info(
"Reading objects from file '"+source->scanner.GetFilename()+
"'");
229 source->scanner.GotoBegin();
231 uint32_t dataCount=source->scanner.ReadUInt32();
234 while (current<=dataCount) {
239 uint8_t type=source->scanner.ReadUInt8();
240 Id id=source->scanner.ReadUInt64();
242 data.Read(typeConfig,
247 GetTopLeftCoordinate(data,
250 size_t cellY=(size_t)((coord.GetLat()+90.0)/180.0*zoomLevel);
251 size_t cellX=(size_t)((coord.GetLon()+180.0)/360.0*zoomLevel);
252 size_t cellIndex=cellY*zoomLevel+cellX;
254 if (cellIndex>=minIndex &&
255 cellIndex<=maxIndex) {
256 dataByCellMap[cellIndex].push_back(CellEntry(type,
259 data.GetFileOffset(),
266 if (currentEntries>parameter.GetSortBlockSize() &&
267 dataByCellMap.size()>1) {
269 size_t cutLimit=parameter.GetSortBlockSize()*9/10;
270 typename std::map<size_t,std::list<CellEntry> >::iterator cutOff=dataByCellMap.end();
272 for (
typename std::map<
size_t,std::list<CellEntry> >::iterator iter=dataByCellMap.begin();
273 iter!=dataByCellMap.end();
275 if (count<=cutLimit &&
276 count+iter->second.size()>cutLimit) {
281 maxIndex=iter->first;
282 count+=iter->second.size();
285 assert(cutOff!=dataByCellMap.end());
287 currentEntries=count;
288 dataByCellMap.erase(cutOff,dataByCellMap.end());
295 if (maxIndex<cellCount-1) {
296 progress.
Info(
"Cell range was reduced to "+std::to_string(minIndex)+
"-"+std::to_string(maxIndex));
299 progress.
Info(std::string(
"Copy renumbered data to '")+dataWriter.GetFilename()+
"'");
302 for (
typename std::map<
size_t,std::list<CellEntry> >::iterator iter=dataByCellMap.begin();
303 iter!=dataByCellMap.end();
308 for (
auto& entry : iter->second) {
315 entry.source->scanner.SetPos(entry.fileOffset);
317 data.Read(typeConfig,
318 entry.source->scanner);
323 fileOffset=dataWriter.GetPos();
325 for (
const auto& filter : filters) {
326 if (!filter->Process(progress,
330 progress.
Error(std::string(
"Error while processing data entry to file '")+
331 dataWriter.GetFilename()+
"'");
345 data.Write(typeConfig,
348 mapWriter.Write(entry.id);
349 mapWriter.Write(entry.type);
350 mapWriter.WriteFileOffset(fileOffset);
356 if (currentEntries==0) {
357 progress.
Info(
"No more entries found");
361 if (maxIndex==cellCount-1) {
367 maxIndex=cellCount-1;
370 assert(overallDataCount>=dataCopiedCount);
372 for (
auto& source : sources) {
373 source.scanner.Close();
376 progress.
Info(std::to_string(dataCopiedCount)+
" of " +std::to_string(overallDataCount) +
" object(s) written to file '"+dataWriter.GetFilename()+
"'");
378 dataWriter.SetPos(0);
379 dataWriter.Write(dataCopiedCount);
382 mapWriter.Write(dataCopiedCount);
387 catch (IOException& e) {
388 progress.
Error(e.GetDescription());
390 for (
auto& source : sources) {
391 source.scanner.CloseFailsafe();
394 dataWriter.CloseFailsafe();
395 mapWriter.CloseFailsafe();
404 bool SortDataGenerator<N>::Copy(
const TypeConfig& typeConfig,
405 const ImportParameter& parameter,
408 FileWriter dataWriter;
409 FileWriter mapWriter;
411 progress.SetAction(
"Copy data");
414 uint32_t overallDataCount=0;
419 dataWriter.Write(overallDataCount);
424 mapWriter.Write(overallDataCount);
426 for (
auto& source : sources) {
427 progress.Info(
"Copying from file '"+source.scanner.GetFilename()+
"'");
429 source.scanner.Open(
AppendFileToDir(parameter.GetDestinationDirectory(),
431 FileScanner::Sequential,
432 parameter.GetWayDataMemoryMaped());
434 uint32_t dataCount=source.scanner.ReadUInt32();
436 progress.Info(std::to_string(dataCount)+
" entries in file '"+source.scanner.GetFilename()+
"'");
438 overallDataCount+=dataCount;
440 for (uint32_t current=1; current<=dataCount; current++) {
443 progress.SetProgress(current,dataCount);
445 uint8_t type=source.scanner.ReadUInt8();
446 Id id=source.scanner.ReadUInt64();
448 data.Read(typeConfig,
454 fileOffset=dataWriter.GetPos();
456 for (
auto& filter : filters) {
457 if (!filter->Process(progress,
461 progress.Error(std::string(
"Error while processing data entry to file '")+
462 dataWriter.GetFilename()+
"'");
476 data.Write(typeConfig,
480 mapWriter.Write(type);
481 mapWriter.WriteFileOffset(fileOffset);
484 source.scanner.Close();
487 dataWriter.SetPos(0);
488 dataWriter.Write(overallDataCount);
491 mapWriter.Write(overallDataCount);
493 progress.Info(std::to_string(overallDataCount) +
" object(s) written to file '"+dataWriter.GetFilename()+
"'");
498 catch (IOException& e) {
499 progress.Error(e.GetDescription());
501 for (
auto& source : sources) {
502 source.scanner.CloseFailsafe();
505 dataWriter.CloseFailsafe();
506 mapWriter.CloseFailsafe();
516 const ImportParameter& parameter,
521 for (
auto& filter : filters) {
522 if (!filter->BeforeProcessingStart(parameter,
525 progress.
Error(
"Cannot initialize processor filter");
532 if (parameter.GetSortObjects()) {
533 if (!Renumber(*typeConfig,
540 if (!Copy(*typeConfig,
548 for (
auto& filter : filters) {
549 if (!filter->AfterProcessingEnd(parameter,
552 progress.
Error(
"Cannot deinitialize processor filter");
uint64_t Id
Definition: OSMScoutTypes.h:41
std::shared_ptr< ProcessingFilter > ProcessingFilterRef
Definition: SortDat.h:101
OSMSCOUT_API std::string AppendFileToDir(const std::string &dir, const std::string &file)
std::list< std::string > ProvidesFiles(const ImportParameter ¶meter) const
Definition: SortDat.h:153
virtual bool Process(Progress &progress, const FileOffset &offset, N &data, bool &save)=0
virtual void Error(const std::string &text)
virtual void SetAction(const std::string &action)
bool operator<(const TileCacheKey &a, const TileCacheKey &b)
virtual ~ProcessingFilter()
Definition: SortDat.h:138
Definition: ImportModule.h:100
virtual void Info(const std::string &text)
virtual bool BeforeProcessingStart(const ImportParameter &, Progress &, const TypeConfig &)
Definition: SortDat.h:81
bool Import(const TypeConfigRef &typeConfig, const ImportParameter ¶meter, Progress &progress) override
Definition: SortDat.h:515
virtual void SetProgress(double current, double total, const std::string &label="")
OSMSCOUT_API size_t Pow(size_t a, size_t b)
uint64_t FileOffset
Definition: OSMScoutTypes.h:47
virtual void GetTopLeftCoordinate(const N &data, GeoCoord &coord)=0
void AddFilter(const ProcessingFilterRef &filter)
Definition: SortDat.h:171
Definition: Progress.h:34
std::shared_ptr< TypeConfig > TypeConfigRef
Definition: TypeConfig.h:1227
SortDataGenerator(const std::string &dataFilename, const std::string &mapFilename)
Definition: SortDat.h:144
void AddSource(const std::string &filename)
Definition: SortDat.h:161
virtual bool AfterProcessingEnd(const ImportParameter &, Progress &, const TypeConfig &)
Definition: SortDat.h:93