diff --git a/Runtime/GeoTiffHeight.cs b/Runtime/GeoTiffHeight.cs index d26cfd816100453a2ca53b2c0067ed4825895e38..d2ba49fe90bc1fcb1a5d3f2a192888c4c0bc5357 100644 --- a/Runtime/GeoTiffHeight.cs +++ b/Runtime/GeoTiffHeight.cs @@ -5,6 +5,7 @@ using System.IO; using System.Threading.Tasks; using UnityEngine; using UnityEngine.Networking; +using UnityEngine.Windows; namespace Wander { @@ -67,7 +68,7 @@ namespace Wander public bool IsFinished() { - if (finished) + if (finished || asyncOp == null) return true; // Still in progress @@ -137,7 +138,9 @@ namespace Wander public static string BuildPDOKWCSUrl( float rdMinX, float rdMaxX, float rdMinY, float rdMaxY, int resWidth = 1024, int resHeight = 1024 ) { - string url = $"https://service.pdok.nl/rws/ahn3/wcs/v1_0?SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCoverage&coverage=ahn3_05m_dtm&CRS=EPSG:28992&BBOX={rdMinX},{rdMinX},{rdMaxX},{rdMaxY}&WIDTH={resWidth}&HEIGHT={resHeight}&FORMAT=image/tiff&interpolation=average"; + //&interpolation=average + string url = $"https://service.pdok.nl/rws/ahn3/wcs/v1_0?SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCoverage&coverage=ahn3_05m_dtm&CRS=EPSG:28992&BBOX={rdMinX},{rdMinY},{rdMaxX},{rdMaxY}&WIDTH={resWidth}&HEIGHT={resHeight}&FORMAT=image/tiff&interpolation=average"; + //string url = $"https://service.pdok.nl/rws/ahn3/wcs/v1_0?SERVICE=WCS&VERSION=1.0.0&REQUEST=GetCoverage&coverage=ahn3_05m_dtm&CRS=EPSG:28992&BBOX={rdMinX},{rdMinY},{rdMaxX},{rdMaxY}&WIDTH={resWidth}&HEIGHT={resHeight}&FORMAT=GeoTIFF_FLOAT32"; return url; } @@ -205,16 +208,6 @@ namespace Wander throw new InvalidDataException( "Tiff data not valid" ); } - width = tiff.GetField( TiffTag.IMAGEWIDTH )[0].ToInt(); - height = tiff.GetField( TiffTag.IMAGELENGTH )[0].ToInt(); - int tileSize = tiff.TileSize(); - var tile_width_field = tiff.GetField( TiffTag.TILEWIDTH ); - var tile_length_field = tiff.GetField( TiffTag.TILELENGTH ); - int tile_width = tileSize;// tile_width_field[0].ToInt(); - int tile_height = tileSize;// tile_length_field[0].ToInt(); - - byte [] tileData = new byte[tileSize]; - // Obtain coords { FieldValue[] modelPixelScaleTag = tiff.GetField((TiffTag)33550); @@ -229,11 +222,19 @@ namespace Wander originY = BitConverter.ToDouble( modelTransformation, 32 ); } - // output - output = new float[width*height]; - for (int row = 0;row < height;row += tile_height) + + width = tiff.GetField( TiffTag.IMAGEWIDTH )[0].ToInt(); + height = tiff.GetField( TiffTag.IMAGELENGTH )[0].ToInt(); + output = new float[width*height]; + int tileSize = tiff.TileSize(); + + if (tiff.IsTiled()) { - for (int col = 0;col < width;col += tile_width) + byte [] tileData = new byte[tileSize]; + int tile_width = tiff.GetField( TiffTag.TILEWIDTH )[0].ToInt(); + int tile_height = tiff.GetField( TiffTag.TILELENGTH )[0].ToInt(); + + for (int row = 0;row < height;row += tile_height) for (int col = 0;col < width;col += tile_width) { // Read the tile into an RGBA array int res = tiff.ReadTile( tileData, 0, col, row, 0, 0 ); @@ -257,6 +258,19 @@ namespace Wander } } } + else + { + int samplesPerPixel = tiff.GetField(TiffTag.SAMPLESPERPIXEL)[0].ToInt(); + int bitsPerSample = tiff.GetField(TiffTag.BITSPERSAMPLE)[0].ToInt(); + Debug.Assert( samplesPerPixel == 1 && bitsPerSample == 32, "Expecting 32-bit floating point texture. Others are not handled." ); + int scanlineSize = tiff.ScanlineSize(); + byte [] scanline = new byte[scanlineSize]; + for (int i = 0;i < height;++i) + { + tiff.ReadScanline( scanline, i ); + Buffer.BlockCopy( scanline, 0, output, i*width*4, scanlineSize ); + } + } } return output;