class TileWalker {

    public void getGeometries(String typeKey, GeographicBoundingBox boundingBox, Consumer<TileInfo> tileConsumer)
    {
        List<AbstractTileGeometry<?>> bestTopLevels = getTopLevelGeometries(typeKey, boundingBox);

        AbstractTileGeometry<?>[][] grid = GridUtilities.getGrid(bestTopLevels);
        List<TileInfo> tileInfos = New.list();
        for (int r = 0; r < grid.length; r++)
        {
            AbstractTileGeometry<?>[] row = grid[r];
            for (int c = 0; c < row.length; c++)
            {
                TileInfo tileInfo = new TileInfo(row[c], row[c].getGeneration(), r, c);
                tileInfos.add(tileInfo);
            }
        }

        CancellableTaskActivity taskActivity = myModel.getProgressReporter().getTaskActivity();
        int zoomLevel = tileInfos.get(0).getZoomLevel();
        while (zoomLevel <= myMaxZoomLevel)
        {
            for (TileInfo tileInfo : tileInfos)
            {
                goDeep(tileInfo, tileConsumer, zoomLevel);

                if (taskActivity.isCancelled())
                {
                    return;
                }
            }
            zoomLevel++;
        }
    }

    public  TileWalker(GeometryRegistry geometryRegistry, ExportModel model);

}