139 const ImportParameter& parameter,
148 const std::string& mapFilename)
149 : dataFilename(dataFilename),
150 mapFilename(mapFilename)
158 std::list<std::string> providedFiles={dataFilename, mapFilename};
160 return providedFiles;
168 source.filename=filename;
170 sources.push_back(source);
176 filters.push_back(filter);
180 bool SortDataGenerator<N>::ExecuteFilter(
Progress& progress,
187 for (
const auto& filter : filters) {
188 if (!filter->Process(progress,
192 progress.
Error(std::string(
"Error while processing data entry"));
206 bool SortDataGenerator<N>::Renumber(
const TypeConfig& typeConfig,
207 const ImportParameter& parameter,
210 FileWriter dataWriter;
211 FileWriter mapWriter;
212 size_t zoomLevel=
Pow(2,parameter.GetSortTileMag());
213 size_t cellCount=zoomLevel*zoomLevel;
214 size_t maxIndex=cellCount-1;
216 progress.SetAction(
"Sorting data");
219 uint32_t overallDataCount=0;
220 uint32_t dataCopiedCount=0;
223 for (
auto& source : sources) {
224 std::string sourceFilename=
AppendFileToDir(parameter.GetDestinationDirectory(),
227 progress.Info(
"Scanning file '"+sourceFilename+
"'");
229 source.scanner.Open(sourceFilename,
230 FileScanner::Sequential,
231 parameter.GetWayDataMemoryMaped());
233 uint32_t dataCount=source.scanner.ReadUInt32();
235 progress.Info(std::to_string(dataCount)+
" entries in file '"+source.scanner.GetFilename()+
"'");
237 overallDataCount+=dataCount;
243 dataWriter.Write(overallDataCount);
248 mapWriter.Write(overallDataCount);
251 progress.Info(
"Reading objects in cell range "+std::to_string(minIndex)+
"-"+std::to_string(maxIndex));
253 size_t currentEntries=0;
254 std::map<size_t,std::list<CellEntry> > dataByCellMap;
256 for (
auto& source :sources) {
257 progress.Info(
"Reading objects from file '"+source.scanner.GetFilename()+
"'");
259 source.scanner.GotoBegin();
261 uint32_t dataCount=source.scanner.ReadUInt32();
264 while (current<=dataCount) {
267 progress.SetProgress(current,dataCount);
269 uint8_t type=source.scanner.ReadUInt8();
270 Id id=source.scanner.ReadUInt64();
272 data.Read(typeConfig,
277 GetTopLeftCoordinate(data,
280 size_t cellY=(size_t)((coord.GetLat()+90.0)/180.0*zoomLevel);
281 size_t cellX=(size_t)((coord.GetLon()+180.0)/360.0*zoomLevel);
282 size_t cellIndex=cellY*zoomLevel+cellX;
284 if (cellIndex>=minIndex &&
285 cellIndex<=maxIndex) {
286 dataByCellMap[cellIndex].push_back(CellEntry(type,
289 data.GetFileOffset(),
296 if (currentEntries>parameter.GetSortBlockSize() &&
297 dataByCellMap.size()>1) {
299 size_t cutLimit=parameter.GetSortBlockSize()*9/10;
300 typename std::map<size_t,std::list<CellEntry> >::iterator cutOff=dataByCellMap.end();
302 for (
typename std::map<
size_t,std::list<CellEntry> >::iterator iter=dataByCellMap.begin();
303 iter!=dataByCellMap.end();
305 if (count<=cutLimit &&
306 count+iter->second.size()>cutLimit) {
311 maxIndex=iter->first;
312 count+=iter->second.size();
315 assert(cutOff!=dataByCellMap.end());
317 currentEntries=count;
318 dataByCellMap.erase(cutOff,dataByCellMap.end());
325 if (maxIndex<cellCount-1) {
326 progress.Info(
"Cell range was reduced to "+std::to_string(minIndex)+
"-"+std::to_string(maxIndex));
329 progress.Info(std::string(
"Copy renumbered data to '")+dataWriter.GetFilename()+
"'");
332 for (
auto& cell : dataByCellMap) {
335 for (
auto& entry : cell.second) {
336 progress.SetProgress(copyCount,currentEntries);
342 entry.source.scanner.SetPos(entry.fileOffset);
344 data.Read(typeConfig,
345 entry.source.scanner);
350 if (!ExecuteFilter(progress,
361 data.Write(typeConfig,
364 mapWriter.Write(entry.id);
365 mapWriter.Write(entry.type);
366 mapWriter.WriteFileOffset(fileOffset);
372 if (currentEntries==0) {
373 progress.Info(
"No more entries found");
377 if (maxIndex==cellCount-1) {
383 maxIndex=cellCount-1;
386 assert(overallDataCount>=dataCopiedCount);
388 for (
auto& source : sources) {
389 source.scanner.Close();
392 progress.Info(std::to_string(dataCopiedCount)+
" of " +std::to_string(overallDataCount) +
" object(s) written to file '"+dataWriter.GetFilename()+
"'");
394 dataWriter.SetPos(0);
395 dataWriter.Write(dataCopiedCount);
398 mapWriter.Write(dataCopiedCount);
404 progress.Error(e.GetDescription());
406 for (
auto& source : sources) {
407 source.scanner.CloseFailsafe();
410 dataWriter.CloseFailsafe();
411 mapWriter.CloseFailsafe();
420 bool SortDataGenerator<N>::Copy(
const TypeConfig& typeConfig,
421 const ImportParameter& parameter,
424 FileWriter dataWriter;
425 FileWriter mapWriter;
427 progress.SetAction(
"Copy data");
430 uint32_t overallDataCount=0;
431 uint32_t dataCopiedCount=0;
436 dataWriter.Write(overallDataCount);
441 mapWriter.Write(overallDataCount);
443 for (
auto& source : sources) {
444 std::string sourceFilename=
AppendFileToDir(parameter.GetDestinationDirectory(),
447 progress.Info(
"Scanning file '"+sourceFilename+
"'");
449 source.scanner.Open(sourceFilename,
450 FileScanner::Sequential,
451 parameter.GetWayDataMemoryMaped());
453 uint32_t dataCount=source.scanner.ReadUInt32();
455 progress.Info(std::to_string(dataCount)+
" entries in file '"+source.scanner.GetFilename()+
"'");
457 overallDataCount+=dataCount;
459 for (uint32_t current=1; current<=dataCount; current++) {
462 progress.SetProgress(current,dataCount);
464 uint8_t type=source.scanner.ReadUInt8();
465 Id id=source.scanner.ReadUInt64();
467 data.Read(typeConfig,
473 if (!ExecuteFilter(progress,
484 data.Write(typeConfig,
488 mapWriter.Write(type);
489 mapWriter.WriteFileOffset(fileOffset);
494 source.scanner.Close();
497 assert(overallDataCount>=dataCopiedCount);
499 dataWriter.SetPos(0);
500 dataWriter.Write(dataCopiedCount);
503 mapWriter.Write(dataCopiedCount);
505 progress.Info(std::to_string(dataCopiedCount)+
" of " +std::to_string(overallDataCount) +
" object(s) written to file '"+dataWriter.GetFilename()+
"'");
511 progress.Error(e.GetDescription());
513 for (
auto& source : sources) {
514 source.scanner.CloseFailsafe();
517 dataWriter.CloseFailsafe();
518 mapWriter.CloseFailsafe();
528 const ImportParameter& parameter,
533 for (
auto& filter : filters) {
534 if (!filter->BeforeProcessingStart(parameter,
537 progress.
Error(
"Cannot initialize processor filter");
544 if (parameter.GetSortObjects()) {
545 if (!Renumber(*typeConfig,
552 if (!Copy(*typeConfig,
560 for (
auto& filter : filters) {
561 if (!filter->AfterProcessingEnd(parameter,
564 progress.
Error(
"Cannot deinitialize processor filter");