prepareTiles method

Future<void> prepareTiles(
  1. bool debugFile,
  2. int instanceCount
)

Prepares all tiles for this sub-file by processing the POIs and ways in parallel isolates.

Implementation

Future<void> prepareTiles(bool debugFile, int instanceCount) async {
  var session = PerformanceProfiler().startSession(category: "SubfileCreator.prepareTiles");

  List<String> languagesPreferences = [];
  if (mapHeaderInfo.languagesPreference != null) languagesPreferences.addAll(mapHeaderInfo.languagesPreference!.split(","));

  // each instance must process this number of consecutive tiles
  // makes no sense to create multiple isolates for so few tiles
  if (tileCount <= 100) instanceCount = 1;
  // too many tiles (hence too many ways). Danger of OutOfMemory Exception
  //if (tileCount > 50000 && instanceCount > 2) instanceCount = 2;

  List<ITileWriter> tileWriters = await createTileWriters(_minY, instanceCount, debugFile, languagesPreferences);
  // the isolates now hove the infos, we can remove them from memory here
  List<Future> futures = [];
  int current = 0;
  await _processAsync(
    "preparing tiles",
    (tile) async {
      Future future = _future(tileWriters[current], tile);
      futures.add(future);
      ++current;
      if (current >= instanceCount) {
        current = 0;
      }
      if (futures.length > 20) {
        await Future.wait(futures);
        futures.clear();
      }
    },
    (int currentTileY, int processedTiles, int sumTiles) async {
      // wait until all futures are completed and write the results to the tileBuffer
      await Future.wait(futures);
      futures.clear();
      if (tileCount > 100) {
        if (currentTileY > _minY && (currentTileY % 5 == 0)) {
          // remove data from previous lines (y)
          Tile tile1 = Tile(_minX, _minY, baseZoomLevel, 0);
          Tile tile2 = Tile(_maxX, currentTileY - 1, baseZoomLevel, 0);
          BoundingBox tileBoundingBox = tile1.getBoundingBox().extendBoundingBox(tile2.getBoundingBox());
          await filter.remove(_poiWayCollections, tileBoundingBox);
        }
        // destroy old writers and build writers with prefiltered data for the next line
        for (var tileWriter in tileWriters) {
          tileWriter.dispose();
        }
        tileWriters.clear();
        if (currentTileY < _maxY) {
          tileWriters = await createTileWriters(currentTileY + 1, instanceCount, debugFile, languagesPreferences);
        }
      }
    },
  );
  await _poiWayCollections.clear();
  await _tileBuffer.writeComplete();
  session.complete();
}