204 lines
8.6 KiB
C#
204 lines
8.6 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using Aspose.Gis;
|
|
using Aspose.Gis.Raster;
|
|
|
|
namespace Aspose.GIS.Examples.CSharp.Layers
|
|
{
|
|
public static class InteractWithRasterFormats
|
|
{
|
|
public static void Run()
|
|
{
|
|
Console.WriteLine($"Example: {nameof(ReadGeneralDataInGeoTiff)}");
|
|
ReadGeneralDataInGeoTiff();
|
|
|
|
Console.WriteLine("");
|
|
Console.WriteLine($"Example: {nameof(ReadValuesByLine)}");
|
|
ReadValuesByLine();
|
|
|
|
Console.WriteLine("");
|
|
Console.WriteLine($"Example: {nameof(ReadValuesWithSpecifiedType)}");
|
|
ReadValuesWithSpecifiedType();
|
|
|
|
Console.WriteLine("");
|
|
Console.WriteLine($"Example: {nameof(AnalyzeValuesInGeoTiff)}");
|
|
AnalyzeValuesInGeoTiff();
|
|
|
|
Console.WriteLine("");
|
|
Console.WriteLine($"Example: {nameof(ReadRawBytesInGeoTiff)}");
|
|
ReadRawBytesInGeoTiff();
|
|
|
|
Console.WriteLine("");
|
|
Console.WriteLine($"Example: {nameof(ReadSingleBandEsriAscii)}");
|
|
ReadSingleBandEsriAscii();
|
|
}
|
|
|
|
public static void ReadGeneralDataInGeoTiff()
|
|
{
|
|
// ExStart: ReadGeneralDataInGeoTiff
|
|
string filesPath = RunExamples.GetDataDir();
|
|
using (var layer = Drivers.GeoTiff.OpenLayer(Path.Combine(filesPath, "raster50x50.tif")))
|
|
{
|
|
// read and print raster
|
|
var cellSize = layer.CellSize;
|
|
var extent = layer.GetExtent();
|
|
var spatialRefSys = layer.SpatialReferenceSystem;
|
|
var code = spatialRefSys == null ? "'no srs'" : spatialRefSys.EpsgCode.ToString();
|
|
var bounds = layer.Bounds;
|
|
var bandCount = layer.BandCount;
|
|
|
|
Console.WriteLine($"cellSize: {cellSize}");
|
|
Console.WriteLine($"extent: {extent}");
|
|
Console.WriteLine($"spatialRefSys: {code}");
|
|
Console.WriteLine($"bounds: {bounds}");
|
|
Console.WriteLine($"bandCount: {bandCount}");
|
|
|
|
// read and print bands
|
|
for (int i = 0; i < layer.BandCount; i++)
|
|
{
|
|
var dataType = layer.GetBand(i).DataType;
|
|
var hasNoData = !layer.NoDataValues.IsNull();
|
|
var statistics = layer.GetStatistics(i);
|
|
|
|
Console.WriteLine();
|
|
Console.WriteLine($"Band: {i}");
|
|
Console.WriteLine($"dataType: {dataType}");
|
|
Console.WriteLine($"statistics: {statistics}");
|
|
Console.WriteLine($"hasNoData: {hasNoData}");
|
|
if (hasNoData)
|
|
Console.WriteLine($"noData: {layer.NoDataValues[i]}");
|
|
|
|
}
|
|
}
|
|
// ExEnd: ReadGeneralDataInGeoTiff
|
|
}
|
|
|
|
public static void ReadValuesWithSpecifiedType()
|
|
{
|
|
// ExStart: ReadValuesWithSpecifiedType
|
|
string filesPath = RunExamples.GetDataDir();
|
|
using (var layer = Drivers.GeoTiff.OpenLayer(Path.Combine(filesPath, "raster_float32.tif")))
|
|
{
|
|
// get band values in corner cell.
|
|
var bandValues = layer.GetValues(0, 0);
|
|
|
|
// we read data from the same strip with type float32, but all values are integers less than 255
|
|
// so the next auto-cast is correct.
|
|
Console.WriteLine($"byte: {bandValues.AsByte()}");
|
|
Console.WriteLine($"integer: {bandValues.AsInteger()}");
|
|
Console.WriteLine($"float: {bandValues.AsFloat()}");
|
|
// the next two lines are equivalent
|
|
Console.WriteLine($"double: {bandValues.AsDouble()}");
|
|
Console.WriteLine($"double with []: {bandValues[0]}");
|
|
}
|
|
// ExStart: ReadValuesWithSpecifiedType
|
|
}
|
|
|
|
public static void ReadValuesByLine()
|
|
{
|
|
// ExStart: ReadValuesByLine
|
|
string filesPath = RunExamples.GetDataDir();
|
|
using (var layer = Drivers.GeoTiff.OpenLayer(Path.Combine(filesPath, "raster_float32.tif")))
|
|
{
|
|
var count = 0;
|
|
for (int i = 0; i < layer.Height; i++)
|
|
{
|
|
var lineRect = new RasterRect(0, i, layer.Width, 1);
|
|
var lineDump = layer.GetValuesDump(lineRect);
|
|
count += lineDump.Length;
|
|
}
|
|
Console.WriteLine($"total read values: {count}");
|
|
}
|
|
// ExStart: ReadValuesByLine
|
|
}
|
|
|
|
public static void AnalyzeValuesInGeoTiff()
|
|
{
|
|
// ExStart: AnalyzeValuesInGeoTiff
|
|
string filesPath = RunExamples.GetDataDir();
|
|
using (var layer = Drivers.GeoTiff.OpenLayer(Path.Combine(filesPath, "raster50x50.tif")))
|
|
{
|
|
// get all values
|
|
var dump = layer.GetValuesDump(layer.Bounds);
|
|
|
|
// use LINQ
|
|
// we compute cells count where values in all bands are 'no data'
|
|
var nodataCount = dump.Count(t => t.EqualsNoData(0) && t.EqualsNoData(1) && t.EqualsNoData(2));
|
|
// we compute cells count where values like a blue color (<35, <35, >235)
|
|
var likeBlueCount = dump.Count(t => t[0] < 35 && t[1] < 35 && t[2] > 235);
|
|
Console.WriteLine("");
|
|
Console.WriteLine("we use LINQ ");
|
|
Console.WriteLine($"no data count: {nodataCount}");
|
|
Console.WriteLine($"like blue color count: {likeBlueCount}");
|
|
|
|
// we use the 'GetValuesOnExpression' method to avoid additional memory allocation.
|
|
var nodata = 0;
|
|
var likeBlue = 0;
|
|
layer.GetValuesOnExpression(layer.Bounds, (context, values) =>
|
|
{
|
|
if (values.EqualsNoData(0) && values.EqualsNoData(1) && values.EqualsNoData(2))
|
|
nodata++;
|
|
|
|
if (values[0] < 35 && values[1] < 35 && values[2] > 235)
|
|
likeBlue++;
|
|
});
|
|
Console.WriteLine("");
|
|
Console.WriteLine("we use the 'GetValuesOnExpression' ");
|
|
Console.WriteLine($"no data counter: {nodata}");
|
|
Console.WriteLine($"like blue color counter: {likeBlue}");
|
|
}
|
|
// ExStart: AnalyzeValuesInGeoTiff
|
|
}
|
|
|
|
public static void ReadRawBytesInGeoTiff()
|
|
{
|
|
// ExStart: ReadRawBytesInGeoTiff
|
|
string filesPath = RunExamples.GetDataDir();
|
|
using (var layer = Drivers.GeoTiff.OpenLayer(Path.Combine(filesPath, "raster_int10.tif")))
|
|
{
|
|
var dump = layer.GetValuesDump(layer.Bounds);
|
|
foreach (var values in dump)
|
|
{
|
|
var bits = values.AsRawBits();
|
|
}
|
|
Console.WriteLine("raw bits is read");
|
|
}
|
|
// ExStart: ReadRawBytesInGeoTiff
|
|
}
|
|
|
|
public static void ReadSingleBandEsriAscii()
|
|
{
|
|
// ExStart: ReadSingleBandEsriAscii
|
|
string filesPath = RunExamples.GetDataDir();
|
|
using (var layer = Drivers.EsriAscii.OpenLayer(Path.Combine(filesPath, "raster_single.asc")))
|
|
{
|
|
// The EsriAscii format always has only one band.
|
|
var cellSize = layer.CellSize;
|
|
var extent = layer.GetExtent();
|
|
var spatialRefSys = layer.SpatialReferenceSystem;
|
|
var code = spatialRefSys == null ? "'no srs'" : spatialRefSys.EpsgCode.ToString();
|
|
var bounds = layer.Bounds;
|
|
var bandCount = layer.BandCount;
|
|
var nodata = layer.NoDataValues[0];
|
|
var dataType = layer.GetBand().DataType;
|
|
var statistics = layer.GetStatistics();
|
|
|
|
Console.WriteLine($"cellSize: {cellSize}");
|
|
Console.WriteLine($"extent: {extent}");
|
|
Console.WriteLine($"spatialRefSys: {code}");
|
|
Console.WriteLine($"bounds: {bounds}");
|
|
Console.WriteLine($"bandCount: {bandCount}");
|
|
Console.WriteLine($"nodata: {nodata}");
|
|
Console.WriteLine($"dataType: {dataType}");
|
|
Console.WriteLine($"statistics: {statistics}");
|
|
|
|
layer.GetValuesOnExpression(layer.Bounds, (context, values) =>
|
|
{
|
|
Console.WriteLine($"x: {context.CellX}; y: {context.CellY}; v: {values[0]}; e: {values.EqualsNoData()}");
|
|
});
|
|
}
|
|
// ExStart: ReadSingleBandEsriAscii
|
|
}
|
|
}
|
|
} |