public RasterFileInfoView(RasterInfo info, string dataType) { RasterNum = info.RasterNum ?? 0; if (dataType == "2G" && !string.IsNullOrEmpty(info.CsvFilesName2G)) { CsvFilesNames = info.CsvFilesName2G.Split(';'); } if (dataType == "3G" && !string.IsNullOrEmpty(info.CsvFilesName3G)) { CsvFilesNames = info.CsvFilesName3G.Split(';'); } if (dataType == "4G" && !string.IsNullOrEmpty(info.CsvFilesName4G)) { CsvFilesNames = info.CsvFilesName4G.Split(';'); } }
public void GetJobSize(IRasterDataset dataset, int maxDesiredLevel, out int maxActualLevel, out int numTiles) { double xMin, yMin, xMax, yMax; maxActualLevel = 0; RasterInfo r = dataset.Info; xMin = r.FieldInfo[0].Envelope.XMin; xMax = r.FieldInfo[0].Envelope.XMax; yMin = r.FieldInfo[0].Envelope.YMin; yMax = r.FieldInfo[0].Envelope.YMax; var sourceSample = dataset.Info.FieldInfo[0].CellSizeX.Decimal; int total = 0; bool atMax = false; int zoom = 0; while (!atMax) { var southWestTile = PointToTile.LatLonToTile(zoom, yMin, xMin); var northEastTile = PointToTile.LatLonToTile(zoom, yMax, xMax); var dx = northEastTile.X - southWestTile.X; var dy = northEastTile.Y - southWestTile.Y; //copy paste quick+ dirty code to determine whether we are creating this zoom level var boundingBox = PointToTile.TileBounds(zoom, northEastTile.X, northEastTile.Y); var tileSample = (boundingBox.Max.Lon - boundingBox.Min.Lon) / 64; if (tileSample < (sourceSample / 2.0) || zoom > maxDesiredLevel) { atMax = true; } else { maxActualLevel = zoom; zoom++; total += ((dx + 1) * (dy + 1)); } } numTiles = total; }
public void CreateAllTiles(IRasterDataset dataset, int maxZoom, IOutput output, System.IProgress <int> progress = null) { double xMin, yMin, xMax, yMax; var bytes = 65 * 65 * 2; byte zero = 0; int count = 0; RasterInfo r = dataset.Info; xMin = r.FieldInfo[0].Envelope.XMin; xMax = r.FieldInfo[0].Envelope.XMax; yMin = r.FieldInfo[0].Envelope.YMin; yMax = r.FieldInfo[0].Envelope.YMax; Dictionary <string, string> existingTiles = new Dictionary <string, string>(); for (int zoom = maxZoom; zoom >= 0; zoom--) { //only generate tiles within the extents of the data var southWestTile = PointToTile.LatLonToTile(zoom, yMin, xMin); var northEastTile = PointToTile.LatLonToTile(zoom, yMax, xMax); var dx = northEastTile.X - southWestTile.X; var dy = northEastTile.Y - southWestTile.Y; var boundingBox = PointToTile.TileBounds(zoom, northEastTile.X, northEastTile.Y); var tileSample = (boundingBox.Max.Lon - boundingBox.Min.Lon) / 64; var sourceSample = dataset.Info.FieldInfo[0].CellSizeX.Decimal; ThreadLocal <byte[]> terrainTileLocal = new ThreadLocal <byte[]>(() => new byte[(bytes + 2)]); Console.WriteLine($"{(dx+1)*dy}"); Parallel.For(0, dx + 1, (easterlyOffset) => { Parallel.For(0, dy + 1, (northerlyOffset) => { int tX = southWestTile.X + easterlyOffset; int tY = southWestTile.Y + northerlyOffset; var terrainTile = terrainTileLocal.Value; byte childQuadSwitch = zero; if (zoom != maxZoom) { childQuadSwitch = GetChildQuads(zoom, tX, tY, existingTiles); } //always create tiles with child tiles bool create = childQuadSwitch > 0 || (zoom == maxZoom); if (create) { bool created = false; created = CreateTile(tX, tY, zoom, dataset, terrainTile); if (zoom == maxZoom) { create = created; } } if (create) { terrainTile[bytes] = childQuadSwitch; terrainTile[bytes + 1] = 0; //We'll say it's all land for now output.WriteTile(zoom, tX, tY, terrainTile); existingTiles.Add($"{zoom}/{tX}/{tY}", ""); } progress?.Report(++count); }); }); } }