diff --git a/autotest/gdrivers/data/MRR/10X10X200_Bit4.mrr b/autotest/gdrivers/data/MRR/10X10X200_Bit4.mrr
new file mode 100644
index 000000000000..8229d5c03e8f
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_Bit4.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_RealDouble.mrr b/autotest/gdrivers/data/MRR/10X10X200_RealDouble.mrr
new file mode 100644
index 000000000000..9908adb6d790
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_RealDouble.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_RealSingle.mrr b/autotest/gdrivers/data/MRR/10X10X200_RealSingle.mrr
new file mode 100644
index 000000000000..837d21ff595e
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_RealSingle.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_SignedInt16.mrr b/autotest/gdrivers/data/MRR/10X10X200_SignedInt16.mrr
new file mode 100644
index 000000000000..ed29bcac4ae6
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_SignedInt16.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_SignedInt32.mrr b/autotest/gdrivers/data/MRR/10X10X200_SignedInt32.mrr
new file mode 100644
index 000000000000..a876a0e1cccd
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_SignedInt32.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_SignedInt64.mrr b/autotest/gdrivers/data/MRR/10X10X200_SignedInt64.mrr
new file mode 100644
index 000000000000..d3f5a3e68d8e
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_SignedInt64.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_SignedInt8.mrr b/autotest/gdrivers/data/MRR/10X10X200_SignedInt8.mrr
new file mode 100644
index 000000000000..d35c81d2e49a
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_SignedInt8.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt16.mrr b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt16.mrr
new file mode 100644
index 000000000000..7009ccb5dedd
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt16.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt32.mrr b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt32.mrr
new file mode 100644
index 000000000000..5769c64c2a0f
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt32.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt64.mrr b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt64.mrr
new file mode 100644
index 000000000000..6df0dffec92a
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt64.mrr differ
diff --git a/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt8.mrr b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt8.mrr
new file mode 100644
index 000000000000..5b222bbd445f
Binary files /dev/null and b/autotest/gdrivers/data/MRR/10X10X200_UnsignedInt8.mrr differ
diff --git a/autotest/gdrivers/data/MRR/Having65540Classes_English.mrr b/autotest/gdrivers/data/MRR/Having65540Classes_English.mrr
new file mode 100644
index 000000000000..8de87a569cae
Binary files /dev/null and b/autotest/gdrivers/data/MRR/Having65540Classes_English.mrr differ
diff --git a/autotest/gdrivers/data/MRR/LanSat8Bands.mrr b/autotest/gdrivers/data/MRR/LanSat8Bands.mrr
new file mode 100644
index 000000000000..06d43ce8a825
Binary files /dev/null and b/autotest/gdrivers/data/MRR/LanSat8Bands.mrr differ
diff --git a/autotest/gdrivers/data/MRR/RGBA_Imagery.mrr b/autotest/gdrivers/data/MRR/RGBA_Imagery.mrr
new file mode 100644
index 000000000000..3825efe9171c
Binary files /dev/null and b/autotest/gdrivers/data/MRR/RGBA_Imagery.mrr differ
diff --git a/autotest/gdrivers/data/MRR/RGBA_PaletteRaster.mrr b/autotest/gdrivers/data/MRR/RGBA_PaletteRaster.mrr
new file mode 100644
index 000000000000..c9c41be4ef1c
Binary files /dev/null and b/autotest/gdrivers/data/MRR/RGBA_PaletteRaster.mrr differ
diff --git a/autotest/gdrivers/data/MRR/RGB_Imagery.mrr b/autotest/gdrivers/data/MRR/RGB_Imagery.mrr
new file mode 100644
index 000000000000..cf89ee335df6
Binary files /dev/null and b/autotest/gdrivers/data/MRR/RGB_Imagery.mrr differ
diff --git a/autotest/gdrivers/data/MRR/SeattleElevation.mrr b/autotest/gdrivers/data/MRR/SeattleElevation.mrr
new file mode 100644
index 000000000000..98eb226d2b50
Binary files /dev/null and b/autotest/gdrivers/data/MRR/SeattleElevation.mrr differ
diff --git a/autotest/gdrivers/mrr.py b/autotest/gdrivers/mrr.py
new file mode 100644
index 000000000000..1af719ff1b9c
--- /dev/null
+++ b/autotest/gdrivers/mrr.py
@@ -0,0 +1,471 @@
+#!/usr/bin/env pytest
+# -*- coding: utf-8 -*-
+###############################################################################
+# $Id$
+#
+# Project: GDAL/OGR Test Suite
+# Purpose: Test MRR format driver.
+# Author: Pitney Bowes Software
+#
+###############################################################################
+# Copyright (c) 2007, Pitney Bowes Software
+# Copyright (c) 2011-2013,
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+###############################################################################
+
+from osgeo import gdal
+from array import array
+
+import gdaltest
+import pytest
+
+
+
+###############################################################################
+# Perform simple read test.
+
+def test_mrr_1():
+
+ gdaltest.mrr_drv = gdal.GetDriverByName('MRR')
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ tst = gdaltest.GDALTest('MRR', 'MRR/10X10X200_RealDouble.mrr', 1, 37769)
+ tst.testOpen()
+
+
+###############################################################################
+# Confirm we can recognised the following band data types.
+# RealSingle = Float
+# RealDouble = double
+# SignedInt32 = Int32
+# UnsignedInt32 = UInt32
+# SignedInt16 = Int16
+# UnsignedInt16 = UInt16
+
+def test_mrr_2_DataType():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ ds = gdal.Open('data/MRR/10X10X200_RealSingle.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Float32, 'Failed to detect RealSingle data type.'
+ ds = gdal.Open('data/MRR/10X10X200_RealDouble.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Float64, 'Failed to detect RealDouble data type.'
+ ds = gdal.Open('data/MRR/10X10X200_SignedInt32.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Int32, 'Failed to detect SignedInt32 data type.'
+ ds = gdal.Open('data/MRR/10X10X200_UnsignedInt32.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_UInt32, 'Failed to detect UnsignedInt32 data type.'
+ ds = gdal.Open('data/MRR/10X10X200_SignedInt16.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Int16, 'Failed to detect SignedInt16 data type.'
+ ds = gdal.Open('data/MRR/10X10X200_UnsignedInt16.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_UInt16, 'Failed to detect UnsignedInt16 data type.'
+ ds = None
+
+
+###############################################################################
+# Confirm we can recognised following band data types with nearest compatible data types.
+# Bit4 = Byte
+# signedInt8 = Int16
+# UnsignedInt8 = Byte
+
+def test_mrr_3_CompatibleDataType():
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+ ds = gdal.Open('data/MRR/10X10X200_Bit4.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Byte, 'Failed to detect Bit4 data type'
+ ds = gdal.Open('data/MRR/10X10X200_SignedInt8.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Int16, 'Failed to map to SignedInt16 data type'
+ ds = gdal.Open('data/MRR/10X10X200_UnsignedInt8.mrr')
+ dataType = ds.GetRasterBand(1).DataType
+ assert dataType == gdal.GDT_Byte, 'Failed to map to UnsignedInt16 data type'
+ ds = None
+
+
+###############################################################################
+# Verify MRR driver info
+
+def test_mrr_4_DriverInfo():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ tst = gdaltest.GDALTest('MRR', 'MRR/SeattleElevation.mrr', 1, None)
+ tst.testDriver()
+
+ dataset = gdal.Open('data/MRR/SeattleElevation.mrr', gdal.GA_ReadOnly)
+ assert 'MRR' == dataset.GetDriver().ShortName, 'Driver short name mismatched.'
+ assert 'MapInfo Multi Resolution Raster' == dataset.GetDriver().LongName, 'Driver full name mismatched.'
+ dataset = None
+
+
+###############################################################################
+# Verify MRR width and Height
+
+def test_mrr_5_RasterSize():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ dataset = gdal.Open('data/MRR/SeattleElevation.mrr', gdal.GA_ReadOnly)
+ assert 1024 == dataset.RasterXSize, 'Raster width mismatched.'
+ assert 1024 == dataset.RasterYSize, 'Raster height mismatched.'
+ dataset = None
+
+
+###############################################################################
+# Verify Imagery MRR's band count and Block size
+
+def test_mrr_6_ImageBandCount():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ dataset = gdal.Open('data/MRR/RGB_Imagery.mrr', gdal.GA_ReadOnly)
+ assert 3 == dataset.RasterCount, 'Raster band count mismatched.'
+
+ # Ensure that block size is not 0.
+ blockSize = dataset.GetRasterBand(1).GetBlockSize()
+ assert 0< blockSize[0]
+ assert 0< blockSize[1]
+
+ dataset = None
+
+
+###############################################################################
+# Verify Classified MRR's band count
+
+def test_mrr_7_ClassifedBandCount():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ dataset = gdal.Open('data/MRR/Having65540Classes_English.mrr', gdal.GA_ReadOnly)
+ assert 1 == dataset.RasterCount, 'Raster band count mismatched.'
+ dataset = None
+
+
+###############################################################################
+# Verify MRR Origin
+
+def test_mrr_8_Origin():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ dataset = gdal.Open('data/MRR/SeattleElevation.mrr', gdal.GA_ReadOnly)
+ geotransform = dataset.GetGeoTransform()
+ assert 444500.0 == geotransform[0], 'Raster OriginX mismatched.'
+ assert 5350500.0 == geotransform[3], 'Raster OriginY mismatched.'
+ dataset = None
+
+###############################################################################
+# Verify MRR cellsize
+
+def test_mrr_9_CellSize():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ dataset = gdal.Open('data/MRR/SeattleElevation.mrr', gdal.GA_ReadOnly)
+ geotransform = dataset.GetGeoTransform()
+ assert 200 == geotransform[1], 'Raster pixelSizeX mismatched.'
+ assert -200 == geotransform[5], 'Raster pixelSizeY mismatched.'
+
+ # Ensure that block size is not 0.
+ blockSize = dataset.GetRasterBand(1).GetBlockSize()
+ assert 0< blockSize[0]
+ assert 0< blockSize[1]
+
+ dataset = None
+
+
+###############################################################################
+# Verify MRR projection info
+
+def test_mrr_10_Projection():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ tst = gdaltest.GDALTest('MRR', 'MRR/SeattleElevation.mrr', 1, None)
+
+ gt = (444500.0, 200.0, 0.0, 5350500.0, 0.0, -200.0)
+
+ prj = """PROJCS["unnamed",
+ GEOGCS["unnamed",
+ DATUM["North_American_Datum_1983",
+ SPHEROID["GRS 80",6378137,298.257222101],
+ TOWGS84[0,0,0,0,0,0,0],
+ AUTHORITY["EPSG","6269"]],
+ PRIMEM["Greenwich",0],
+ UNIT["degree",0.0174532925199433],
+ AUTHORITY["EPSG","9122"]],
+ PROJECTION["Transverse_Mercator"],
+ PARAMETER["latitude_of_origin",0],
+ PARAMETER["central_meridian",-123],
+ PARAMETER["scale_factor",0.9996],
+ PARAMETER["false_easting",500000],
+ PARAMETER["false_northing",0],
+ UNIT["metre",1,
+ AUTHORITY["EPSG","9001"]],
+ AXIS["Easting",EAST],
+ AXIS["Northing",NORTH]]]"""
+
+ tst.testOpen(check_gt=gt,
+ check_stat=(0.005, 4370.262, 483.008, 517.523),
+ check_approx_stat=(0.00549332052469254, 4370.26220703125, 483.008622016405, 517.523079384345))
+
+ ds = gdal.Open('data/MRR/SeattleElevation.mrr',gdal.GA_ReadOnly)
+ got_prj = ds.GetProjectionRef()
+ ds = None
+
+ if prj.find('North_American_Datum_1983') == -1 or \
+ prj.find('Transverse_Mercator') == -1:
+ print(got_prj)
+ pytest.fail('did not get expected projection')
+
+ if got_prj != prj:
+ print('Warning: did not get exactly expected projection. Got %s' % got_prj)
+
+
+###############################################################################
+# Verify MRR Statistics
+
+def test_mrr_11_Statistics():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ tst = gdaltest.GDALTest('MRR', 'MRR/SeattleElevation.mrr', 1, None)
+
+ gt = (444500.0, 200.0, 0.0, 5350500.0, 0.0, -200.0)
+
+ tst.testOpen(check_gt=gt,
+ check_stat=(0.005, 4370.262, 483.008, 517.523),
+ check_approx_stat=(0.00549332052469254, 4370.26220703125, 483.008622016405, 517.523079384345))
+
+
+###############################################################################
+# Read subwindow. Tests the tail recursion problem.
+
+def test_mrr_12_BlockRead():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ tst = gdaltest.GDALTest('MRR', 'MRR/SeattleElevation.mrr', 1, 214,
+ 5, 5, 5, 5)
+ return tst.testOpen()
+
+
+###############################################################################
+# Verify the followings for imagery MRR
+# Band Count
+# Each band's checksum
+# Each band's statistics
+# Each band' overview count
+
+def test_mrr_13_ChecksumImagery():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ arrChecksum = array('i', [4955, 9496, 60874, 8232])
+ arrStats = [[24.00, 234.00, 129.58, 58.00],
+ [1.00, 253.00, 119.44, 78.74],
+ [0.00, 254.00, 130.78, 73.45],
+ [3.00, 253.00, 150.14, 65.81]]
+
+ overviewCount = 9
+
+ dataset = gdal.Open('data/MRR/RGBA_Imagery.mrr',gdal.GA_ReadOnly)
+ bands = dataset.RasterCount
+ assert len(arrChecksum) == bands, "Band count mismatched."
+
+ for i in range(bands):
+ band = dataset.GetRasterBand(i+1)
+
+ checksum = band.Checksum(xoff=0, yoff=0, xsize=band.XSize, ysize=band.YSize)
+ print('Band['+str(i+1)+'] CHECKSUM :',checksum)
+ assert arrChecksum[i] == checksum, 'Band['+str(i+1)+'] checksum mismatched.'
+
+ stats = band.GetStatistics( True, True )
+ assert None != band.GetStatistics( True, True) , 'Getstatistics returns None'
+ print("[ STATS ]: = Minimum=%.3f, Maximum=%.3f, Mean=%.3f, StdDev=%.3f" % (stats[0], stats[1], stats[2], stats[3] ))
+ assert arrStats[i][0] == round(stats[0],2), 'Statistics:[Minumum] mismatched.'
+ assert arrStats[i][1] == round(stats[1],2), 'Statistics:[Maximum] mismatched.'
+ assert arrStats[i][2] == round(stats[2],2), 'Statistics:[Mean] mismatched.'
+ assert arrStats[i][3] == round(stats[3],2), 'Statistics:[StdDev] mismatched.'
+
+ overviews = band.GetOverviewCount()
+ print("Band has {} overviews".format(overviews))
+ assert overviewCount == overviews, "Overview count mismatched."
+
+
+###############################################################################
+# Verify the followings for Continuous MRR
+# Band Count
+# Each band's checksum
+# Each band's statistics
+# Each band' overview count
+
+
+def test_mrr_14_ChecksumContinious():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ arrChecksum = array('i', [28606, 40719, 38697, 32088, 24241, 19614, 30134, 35043, 36269, 30763, 27037, 27765])
+ arrStats = [[9000.00, 26922.00, 12720.07, 2357.53],
+ [8254.00, 28338.00, 12254.44, 2579.38],
+ [7007.00, 28387.00, 11114.22, 2671.23],
+ [6475.00, 30879.00, 11043.36, 3018.66],
+ [6070.00, 34429.00, 11602.18, 3573.27],
+ [5592.00, 28048.00, 10389.53, 3113.41],
+ [5507.00, 25004.00, 9747.69, 2752.26],
+ [6813.00, 29738.00, 11081.63, 2799.42],
+ [5194.00, 14671.00, 5896.82, 462.21],
+ [7597.00, 20317.00, 16433.41, 1454.45],
+ [7918.00, 18255.00, 15091.32, 1171.29],
+ [20480.00, 61440.00, 54963.20, 12495.90]]
+ overviewCount = 10
+
+
+ dataset = gdal.Open('data/MRR/LanSat8Bands.mrr',gdal.GA_ReadOnly)
+ bands = dataset.RasterCount
+ assert len(arrChecksum) == bands, "Band count mismatched."
+
+ for i in range(bands):
+ band = dataset.GetRasterBand(i+1)
+
+ checksum = band.Checksum(xoff=0, yoff=0, xsize=band.XSize, ysize=band.YSize)
+ print('Band['+str(i+1)+'] CHECKSUM :',checksum)
+ assert arrChecksum[i] == checksum, 'Band['+str(i+1)+'] checksum mismatched.'
+
+ stats = band.GetStatistics( True, True )
+ assert None != band.GetStatistics( True, True) , 'Getstatistics returns None'
+ print("[ STATS ]: = Minimum=%.3f, Maximum=%.3f, Mean=%.3f, StdDev=%.3f" % (stats[0], stats[1], stats[2], stats[3] ))
+ assert arrStats[i][0] == round(stats[0],2), 'Statistics:[Minumum] mismatched.'
+ assert arrStats[i][1] == round(stats[1],2), 'Statistics:[Maximum] mismatched.'
+ assert arrStats[i][2] == round(stats[2],2), 'Statistics:[Mean] mismatched.'
+ assert arrStats[i][3] == round(stats[3],2), 'Statistics:[StdDev] mismatched.'
+
+ overviews = band.GetOverviewCount()
+ print("Band has {} overviews".format(overviews))
+ assert overviewCount == overviews, "Overview count mismatched."
+
+
+###############################################################################
+# Verify the followings for Classified MRR
+# Band Count
+# Band checksum
+# Band statistics
+# Band overview count
+# ClassTable Record count
+
+def test_mrr_15_ChecksumClassified():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ expchecksum = 31466
+ arrStats = [0.00, 65539.00, 29071.89, 20005.27]
+ colorTableRecordCount = 65540
+ overviewCount = 9
+
+ dataset = gdal.Open('data/MRR/Having65540Classes_English.mrr',gdal.GA_ReadOnly)
+ bands = dataset.RasterCount
+ assert 1 == bands, "Band count mismatched."
+
+ band = dataset.GetRasterBand(1)
+ checksum = band.Checksum(xoff=0, yoff=0, xsize=band.XSize, ysize=band.YSize)
+ print('Band[1] CHECKSUM :',checksum)
+ assert expchecksum == checksum, 'Band[1] checksum mismatched.'
+
+ stats = band.GetStatistics( True, True )
+ assert None != stats , 'Getstatistics returns None'
+ print("[ STATS ]: = Minimum=%.3f, Maximum=%.3f, Mean=%.3f, StdDev=%.3f" % (stats[0], stats[1], stats[2], stats[3] ))
+ assert arrStats[0] == round(stats[0],2), 'Statistics:[Minumum] mismatched.'
+ assert arrStats[1] == round(stats[1],2), 'Statistics:[Maximum] mismatched.'
+ assert arrStats[2] == round(stats[2],2), 'Statistics:[Mean] mismatched.'
+ assert arrStats[3] == round(stats[3],2), 'Statistics:[StdDev] mismatched.'
+
+ overviews = band.GetOverviewCount()
+ print("Band has {} overviews".format(overviews))
+ assert overviewCount == overviews, "Overview count mismatched."
+
+ colorTable = band.GetRasterColorTable()
+ assert None != colorTable , 'Band do not have color table. GetRasterColorTable returns None'
+ print("Band has a color table with {} entries".format(colorTable.GetCount()))
+ assert colorTableRecordCount == colorTable.GetCount(), "Band color table record count mismatched."
+
+
+###############################################################################
+# Verify the followings for ImagePalette MRR
+# Band Count
+# Band checksum
+# Band statistics
+# Band overview count
+# ClassTable Record count
+
+def test_mrr_16_ChecksumImagePalette():
+
+ if gdaltest.mrr_drv is None:
+ pytest.skip()
+
+ expchecksum = 997
+ arrStats = [1.00, 10.00, 5.40, 3.11]
+ overviewCount = 8
+ colorTableRecordCount = 11
+
+ dataset = gdal.Open('data/MRR/RGBA_PaletteRaster.mrr',gdal.GA_ReadOnly)
+ bands = dataset.RasterCount
+ assert 1 == bands, "Band count mismatched."
+
+ band = dataset.GetRasterBand(1)
+ checksum = band.Checksum(xoff=0, yoff=0, xsize=band.XSize, ysize=band.YSize)
+ print('Band[1] CHECKSUM :',checksum)
+ assert expchecksum == checksum, 'Band[1] checksum mismatched.'
+
+ stats = band.GetStatistics( True, True )
+ assert None != stats , 'Getstatistics returns None'
+ print("[ STATS ]: = Minimum=%.3f, Maximum=%.3f, Mean=%.3f, StdDev=%.3f" % (stats[0], stats[1], stats[2], stats[3] ))
+ assert arrStats[0] == round(stats[0],2), 'Statistics:[Minumum] mismatched.'
+ assert arrStats[1] == round(stats[1],2), 'Statistics:[Maximum] mismatched.'
+ assert arrStats[2] == round(stats[2],2), 'Statistics:[Mean] mismatched.'
+ assert arrStats[3] == round(stats[3],2), 'Statistics:[StdDev] mismatched.'
+
+ overviews = band.GetOverviewCount()
+ print("Band has {} overviews".format(overviews))
+ assert overviewCount == overviews, "Overview count mismatched."
+
+ colorTable = band.GetRasterColorTable()
+ assert None != colorTable , 'Band do not have color table. GetRasterColorTable returns None'
+ print("Band has a color table with {} entries".format(colorTable.GetCount()))
+ assert colorTableRecordCount == colorTable.GetCount(), "Band color table record count mismatched."
\ No newline at end of file
diff --git a/gdal/bin/MIRasterPreferences.xml b/gdal/bin/MIRasterPreferences.xml
new file mode 100644
index 000000000000..dba8b2d99795
--- /dev/null
+++ b/gdal/bin/MIRasterPreferences.xml
@@ -0,0 +1,104 @@
+
+
+
+ 2
+ Pseudocolor.lut
+ ./ColorPalettes/
+ 0
+ 1
+
+ 45
+ 45
+ 50
+ 50
+ 50
+
+ 45
+ 45
+ 50
+
+
+ 2
+ 268435456
+ 512
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ./MIRaster.log
+ 10000000
+ 3
+ 4096
+ 3
+
+
+
+ 1024
+
+
+
+
+
+ 50
+ 3
+
+
+ 53
+ 3
+
+ -1
+
+
+
+ false
+
+
+ 1
+
+
diff --git a/gdal/data/LICENSE.TXT b/gdal/data/LICENSE.TXT
new file mode 100644
index 000000000000..11fa09921e34
--- /dev/null
+++ b/gdal/data/LICENSE.TXT
@@ -0,0 +1,379 @@
+
+GDAL/OGR Licensing
+==================
+
+This file attempts to include all licenses that apply within the GDAL/OGR
+source tree, in particular any that are supposed to be exposed to the end user
+for credit requirements for instance. The contents of this file can be
+displayed from GDAL commandline utilities using the --license commandline
+switch.
+
+
+GDAL/OGR General
+----------------
+
+In general GDAL/OGR is licensed under an MIT/X style license with the
+following terms:
+
+Permission is hereby granted, free of charge, to any person obtaining a
+copy of this software and associated documentation files (the "Software"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
+
+
+gdal/frmts/gtiff/tif_float.c
+----------------------------
+
+Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
+Digital Ltd. LLC
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+* Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+* Neither the name of Industrial Light & Magic nor the names of
+its contributors may be used to endorse or promote products derived
+from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+
+gdal/frmts/hdf4/hdf-eos/*
+------------------------
+
+ Copyright (C) 1996 Hughes and Applied Research Corporation
+
+ Permission to use, modify, and distribute this software and its documentation
+ for any purpose without fee is hereby granted, provided that the above
+ copyright notice appear in all copies and that both that copyright notice and
+ this permission notice appear in supporting documentation.
+
+
+gdal/frmts/pcraster/libcsf
+--------------------------
+
+Copyright (c) 1997-2003, Utrecht University
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above
+ copyright notice, this list of conditions and the following
+ disclaimer in the documentation and/or other materials provided
+ with the distribution.
+
+* Neither the name of Utrecht University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+gdal/frmts/grib/degrib/*
+------------------------
+
+The degrib and g2clib source code are modified versions of code produced
+by NOAA NWS and are in the public domain subject to the following
+restrictions:
+
+http://www.weather.gov/im/softa.htm
+
+DISCLAIMER The United States Government makes no warranty, expressed or
+implied, as to the usefulness of the software and documentation for any
+purpose. The U.S. Government, its instrumentalities, officers, employees,
+and agents assumes no responsibility (1) for the use of the software and
+documentation listed below, or (2) to provide technical support to users.
+
+http://www.weather.gov/disclaimer.php
+
+ The information on government servers are in the public domain, unless
+specifically annotated otherwise, and may be used freely by the public so
+long as you do not 1) claim it is your own (e.g. by claiming copyright for
+NWS information -- see below), 2) use it in a manner that implies an
+endorsement or affiliation with NOAA/NWS, or 3) modify it in content and
+then present it as official government material. You also cannot present
+information of your own in a way that makes it appear to be official
+government information..
+
+ The user assumes the entire risk related to its use of this data. NWS is
+providing this data "as is," and NWS disclaims any and all warranties,
+whether express or implied, including (without limitation) any implied
+warranties of merchantability or fitness for a particular purpose. In no
+event will NWS be liable to you or to any third party for any direct,
+indirect, incidental, consequential, special or exemplary damages or lost
+profit resulting from any use or misuse of this data.
+
+ As required by 17 U.S.C. 403, third parties producing copyrighted works
+consisting predominantly of the material appearing in NWS Web pages must
+provide notice with such work(s) identifying the NWS material incorporated
+and stating that such material is not subject to copyright protection.
+
+port/cpl_minizip*
+-----------------
+
+This is version 2005-Feb-10 of the Info-ZIP copyright and license.
+The definitive version of this document should be available at
+ftp://ftp.info-zip.org/pub/infozip/license.html indefinitely.
+
+
+Copyright (c) 1990-2005 Info-ZIP. All rights reserved.
+
+For the purposes of this copyright and license, "Info-ZIP" is defined as
+the following set of individuals:
+
+ Mark Adler, John Bush, Karl Davis, Harald Denker, Jean-Michel Dubois,
+ Jean-loup Gailly, Hunter Goatley, Ed Gordon, Ian Gorman, Chris Herborth,
+ Dirk Haase, Greg Hartwig, Robert Heath, Jonathan Hudson, Paul Kienitz,
+ David Kirschbaum, Johnny Lee, Onno van der Linden, Igor Mandrichenko,
+ Steve P. Miller, Sergio Monesi, Keith Owens, George Petrov, Greg Roelofs,
+ Kai Uwe Rommel, Steve Salisbury, Dave Smith, Steven M. Schweda,
+ Christian Spieler, Cosmin Truta, Antoine Verheijen, Paul von Behren,
+ Rich Wales, Mike White
+
+This software is provided "as is," without warranty of any kind, express
+or implied. In no event shall Info-ZIP or its contributors be held liable
+for any direct, indirect, incidental, special or consequential damages
+arising out of the use of or inability to use this software.
+
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+
+ 1. Redistributions of source code must retain the above copyright notice,
+ definition, disclaimer, and this list of conditions.
+
+ 2. Redistributions in binary form (compiled executables) must reproduce
+ the above copyright notice, definition, disclaimer, and this list of
+ conditions in documentation and/or other materials provided with the
+ distribution. The sole exception to this condition is redistribution
+ of a standard UnZipSFX binary (including SFXWiz) as part of a
+ self-extracting archive; that is permitted without inclusion of this
+ license, as long as the normal SFX banner has not been removed from
+ the binary or disabled.
+
+ 3. Altered versions--including, but not limited to, ports to new operating
+ systems, existing ports with new graphical interfaces, and dynamic,
+ shared, or static library versions--must be plainly marked as such
+ and must not be misrepresented as being the original source. Such
+ altered versions also must not be misrepresented as being Info-ZIP
+ releases--including, but not limited to, labeling of the altered
+ versions with the names "Info-ZIP" (or any variation thereof, including,
+ but not limited to, different capitalizations), "Pocket UnZip," "WiZ"
+ or "MacZip" without the explicit permission of Info-ZIP. Such altered
+ versions are further prohibited from misrepresentative use of the
+ Zip-Bugs or Info-ZIP e-mail addresses or of the Info-ZIP URL(s).
+
+ 4. Info-ZIP retains the right to use the names "Info-ZIP," "Zip," "UnZip,"
+ "UnZipSFX," "WiZ," "Pocket UnZip," "Pocket Zip," and "MacZip" for its
+ own source and binary releases.
+
+
+gdal/ogr/ogrsf_frmts/dxf/intronurbs.cpp
+---------------------------------------
+
+This code is derived from the code associated with the book "An Introduction
+to NURBS" by David F. Rogers. More information on the book and the code is
+available at:
+
+ http://www.nar-associates.com/nurbs/
+
+
+Copyright (c) 2009, David F. Rogers
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name of the David F. Rogers nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+gdal/alg/thinplatespline.cpp
+----------------------------
+
+IEEE754 log() code derived from:
+@(#)e_log.c 1.3 95/01/18
+
+Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
+
+Developed at SunSoft, a Sun Microsystems, Inc. business.
+Permission to use, copy, modify, and distribute this
+software is freely granted, provided that this notice
+is preserved.
+
+
+gdal/alg/libqhull
+-----------------
+
+Only applies when GDAL is compiled with internal qhull support
+
+
+ Qhull, Copyright (c) 1993-2012
+
+ C.B. Barber
+ Arlington, MA
+
+ and
+
+ The National Science and Technology Research Center for
+ Computation and Visualization of Geometric Structures
+ (The Geometry Center)
+ University of Minnesota
+
+ email: qhull@qhull.org
+
+This software includes Qhull from C.B. Barber and The Geometry Center.
+Qhull is copyrighted as noted above. Qhull is free software and may
+be obtained via http from www.qhull.org. It may be freely copied, modified,
+and redistributed under the following conditions:
+
+1. All copyright notices must remain intact in all files.
+
+2. A copy of this text file must be distributed along with any copies
+ of Qhull that you redistribute; this includes copies that you have
+ modified, or copies of programs or other software products that
+ include Qhull.
+
+3. If you modify Qhull, you must include a notice giving the
+ name of the person performing the modification, the date of
+ modification, and the reason for such modification.
+
+4. When distributing modified versions of Qhull, or other software
+ products that include Qhull, you must provide notice that the original
+ source code may be obtained as noted above.
+
+5. There is no warranty or other guarantee of fitness for Qhull, it is
+ provided solely "as is". Bug reports or fixes may be sent to
+ qhull_bug@qhull.org; the authors may or may not act on them as
+ they desire.
+
+gdal/frmts/pdf/pdfdataset.cpp (method PDFiumRenderPageBitmap())
+---------------------------------------------------------------
+
+Copyright 2014 PDFium Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+ * Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above
+copyright notice, this list of conditions and the following disclaimer
+in the documentation and/or other materials provided with the
+distribution.
+ * Neither the name of Google Inc. nor the names of its
+contributors may be used to endorse or promote products derived from
+this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+gdal/frmts/mrf/* (apply when MRF driver included in build)
+---------------------------------------------------------------
+
+Copyright (c) 2002-2012, California Institute of Technology.
+All rights reserved. Based on Government Sponsored Research under contracts NAS7-1407 and/or NAS7-03001.
+
+Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
+ 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the California Institute of Technology (Caltech), its operating division the Jet Propulsion Laboratory (JPL),
+ the National Aeronautics and Space Administration (NASA), nor the names of its contributors may be used to
+ endorse or promote products derived from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
+INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+IN NO EVENT SHALL THE CALIFORNIA INSTITUTE OF TECHNOLOGY BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+~~~~~~~~
+
+Copyright 2014-2015 Esri
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+http://www.apache.org/licenses/LICENSE-2.0
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+
+
+
diff --git a/gdal/doc/source/drivers/raster/index.rst b/gdal/doc/source/drivers/raster/index.rst
index b600783bbf88..cd271a11350b 100644
--- a/gdal/doc/source/drivers/raster/index.rst
+++ b/gdal/doc/source/drivers/raster/index.rst
@@ -123,6 +123,7 @@ Raster drivers
mff
mff2
mg4lidar
+ mrr
mrsid
msg
msgn
diff --git a/gdal/doc/source/drivers/raster/mrr.rst b/gdal/doc/source/drivers/raster/mrr.rst
new file mode 100644
index 000000000000..da96eef8d8db
--- /dev/null
+++ b/gdal/doc/source/drivers/raster/mrr.rst
@@ -0,0 +1,109 @@
+.. _Raster.MRR:
+
+MRR --- Multi Resolution Raster
+===============================
+
+.. shortname:: MRR
+
+This driver supports reading of MRR (Multiple Resolution Raster) file format developed by Precisely(MapInfo). This driver does not provide support for creating, writing or editing MRR files.
+
+Driver capabilities
+-------------------
+
+.. supports_georeferencing::
+
+.. ReadMRR=YES Read mrr.
+
+Contents
+--------
+
+#. `Overview of MRR Driver <#driver_overview>`__
+#. `Issues and Limitations <#issues>`__
+#. `Building GDAL <#building_gdal>`__
+
+
+--------------------------------
+
+.. _driver_overview:
+
+Overview of MRR (Multiple Resolution Raster) Driver:
+----------------------------------------------------
+
+MRR unifies the storage of all types of raster data such as imagery, spectral imagery, continuous gridded data and thematic data. MRR extends the concept of a multi-banded raster to a “four dimensional” raster which may contain –
+
+- One or more fields, each of which contain a particular type of raster data. A field may contain multi-banded continuous grid data, multi-banded classified data, color imagery or color imagery utilizing a fixed size color palette.
+
+- One or more events, each of which contain an addition or modification to the field data at a specified time. Events provide a time dimension in MRR.
+- One or more bands which contain data in one of many supported data types such as 1/2/4/8/16/32/64 bit integers and 32/64 bit floating point. Some data types, like color or complex numbers, may contain multiple components. These are exposed as virtual bands.
+- A stack of overviews, referred to as resolutions levels. Level 0 contains the ‘base resolution’ raster data. Levels 1 upward contain overviews within which the cell size doubles at each level. Levels -1 downward contain underviews which are generated on demand by interpolation from the base level.
+- MRR is designed to enable the creation of very large and high resolution rasters and the SDK ensures that access to data at any resolution level is constant. Raster data is stored in a sparse collection of tiles of equal size. Lossless compression codecs are employed to store data within each tile, and lossy image compression codec can be used for imagery fields. Each resolution level has a fixed cell size, but MRR supports a multi-resolution tile concept which allows the cell size to set in each tile separately.
+
+NOTE: Some MRR features may not be accessible through GDAL driver.
+
+The MRR driver for GDAL is supported on 64-bit Windows, Ubuntu, AmazonLinux, OracleLinux and CentOS.
+
+--------------
+
+.. _issues:
+
+Issues and Limitations
+----------------------
+
+- The driver does not provide support for creating, writing or editing MRR files.
+- Although an MRR may contain multiple fields, this driver can only access the first field.
+- Although an MRR may contain multiple events, this driver can only access data that represents the roll-up of all events. This represents the “final state” of the raster.
+
+--------------
+
+.. _building_gdal:
+
+Building as Plugin driver:
+--------------------------
+
+
+To build MRR driver as plugin(autoload) driver.
+
+First build gdal a you woud build it normally.
+
+switch to ../gdal/frmts/mrr directory and issue following build commands based up on your platform.
+
+Windows:
+
+nmake /f makefile.vc plugin
+
+Linux:
+
+make plugin
+
+
+MapInfo Pro Advanced SDK Runtime
+--------------------------------
+
+MRR driver needs MapInfo Pro Advanced SDK to be installed on the machine to work with GDAL.
+
+Download MapInfo Pro Advanced SDK by navigating to "https://www.pitneybowes.com/us/campaign/sdkrequest.html"
+and fill up the SDK request form to receive the download link on your e-mail.
+Once the SDK package is downloaded, unzip the package on your machine at the desired location.
+
+SDK Zip folder Structure:
+-------------------------
+
+MapInfo Pro Advanced SDK zip file contains following folders:
+
+- AmazonLinux --> 64 bit Binaries for AmazonLinux.
+
+- CentOS7 --> 64 bit Binaries for CentOS7.
+
+- OracleLinux --> 64 bit Binaries for OracleLinux.
+
+- Ubuntu --> 64 bit Binaries for Ubuntu.
+
+- Windows --> 64 bit Binaries for Windows.
+
+
+Choose the binaries for the desired platform from the "Raster GDAL" folder and copy all files into the folder containing GDAL binaries.
+
+
+
+
+
diff --git a/gdal/frmts/gdalallregister.cpp b/gdal/frmts/gdalallregister.cpp
index b4aec3a8f229..d0184db40258 100644
--- a/gdal/frmts/gdalallregister.cpp
+++ b/gdal/frmts/gdalallregister.cpp
@@ -583,6 +583,10 @@ void CPL_STDCALL GDALAllRegister()
GDALRegister_SIGDEM();
#endif
+#ifdef FRMT_mrr
+ GDALRegister_MRR();
+#endif
+
#ifdef FRMT_exr
GDALRegister_EXR();
#endif
diff --git a/gdal/frmts/makefile.vc b/gdal/frmts/makefile.vc
index c66491f03639..b60502079420 100644
--- a/gdal/frmts/makefile.vc
+++ b/gdal/frmts/makefile.vc
@@ -157,6 +157,14 @@ PLUGINFLAGS = $(PLUGINFLAGS) -DFRMT_sde
!ENDIF
!ENDIF
+!IFDEF MRR_ENABLED
+!IF "$(MRR_PLUGIN)" != "YES"
+EXTRAFLAGS = $(EXTRAFLAGS) -DFRMT_mrr
+!ELSE
+PLUGINFLAGS = $(PLUGINFLAGS) -DFRMT_mrr
+!ENDIF
+!ENDIF
+
!IFDEF RASDAMAN_ENABLED
EXTRAFLAGS = $(EXTRAFLAGS) -DFRMT_rasdaman
!ENDIF
diff --git a/gdal/frmts/mrr/APICodes.h b/gdal/frmts/mrr/APICodes.h
new file mode 100644
index 000000000000..6e532af5e35e
--- /dev/null
+++ b/gdal/frmts/mrr/APICodes.h
@@ -0,0 +1,1042 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+#pragma once
+
+//
+// Dictionary CUSRDSystem
+//
+// Do not manually edit this file. It should be re-generated, when required, by running MakeAPICodes.exe.
+// This program will also re-generate RasterDictionary.xml.
+//
+// New error codes should be added to m_vvDictionary in MINTSystem.cpp
+//
+
+#define MINT_SUCCESS 0 // The operation succeeded.
+#define MINT_NO_ERROR 1 // The operation reported no error.
+#define MINT_NO_RESULT 2 // The operation did not report a result.
+#define MINT_UNKNOWN_RESULT 3 // The operation reported an unknown result.
+#define MINT_UNKNOWN_FAILURE 4 // An unknown error has occurred.
+#define MINT_FAILURE 5 // The operation failed.
+#define MINT_NO_STATUS 6 //
+#define MINT_INVALID_ARG 7 // An invalid argument was supplied.
+#define MINT_NULL_ARG 8 // An invalid (null) argument was supplied.
+#define MINT_EXCEPTION 9 // An unexpected failure occurred.
+#define MINT_EXCEPTION_MSG 10 // An unexpected failure occurred: "%1!%r!".
+#define MINT_ALLOCATE_FAIL 11 // Failed to allocate memory.
+#define MINT_UNSUPPORTED_VERSION 12 // Version not supported.
+#define MINT_DLL_NOTLOADED 971 // The required DLL could not be loaded.
+#define MINT_FILEERROR_GENERAL 13 // An error occurred accessing the file: %1!%r!.
+#define MINT_FILEERROR_OPEN 14 // Failed to open file.
+#define MINT_FILEERROR_OPEN_NAME 15 // Failed to open file: %1!%r!.
+#define MINT_FILEERROR_OPEN_CAUSE 16 // Failed to open file: %1!%r!, cause %2!%r!.
+#define MINT_FILEERROR_CLOSE 17 // Failed to close file: %1!%r!, cause %2!%r!.
+#define MINT_FILEERROR_READ 18 // An error was encountered while reading the file: %1!%r!.
+#define MINT_FILEERROR_WRITE 19 // An error was encountered while writing the file: %1!%r!.
+#define MINT_FILEERROR_DELETE 20 // Failed to delete file: %1!%r!, cause %2!%r!.
+#define MINT_FILEERROR_SETLENGTH 21 // Failed to resize file: %1!%r!, cause %2!%r!.
+#define MINT_FILEERROR_NOTFOUND 22 // The file does not exist: %1!%r!.
+#define MINT_FILEERROR_BADPATH 23 // File path not found: %1!%r!.
+#define MINT_FILEERROR_EMPTYNAME 24 // The file name is empty.
+#define MINT_FILEERROR_TOOMANYOPEN 25 // There are too many open files in this system. Try closing some programs or rebooting the system.
+#define MINT_FILEERROR_ACCESSROOTDIR 26 // This is the root directory. You cannot use it as a file: %1!%r!.
+#define MINT_FILEERROR_ACCESSDIR 27 // This is a directory. You cannot use it as a file: %1!%r!.
+#define MINT_FILEERROR_ACCESSSYSTEM 28 // This is a special system file. You cannot access it: %1!%r!.
+#define MINT_FILEERROR_ACCESSRO 29 // You cannot write to a read-only file: %1!%r!.
+#define MINT_FILEERROR_INVALIDFILE 30 // An invalid file handle was used.
+#define MINT_FILEERROR_REMOVECURDIR 31 // An attempt was made to remove the current directory.
+#define MINT_FILEERROR_DIRFULL 32 // The file could not be created because the directory is full: %1!%r!.
+#define MINT_FILEERROR_BADSEEK 33 // A software error occurred: seek to bad file position.
+#define MINT_FILEERROR_HARDIO 34 // There was a hardware error. There may be a problem with your computer or disk drive.
+#define MINT_FILEERROR_HARDIO_REMOVE 35 // There was a problem accessing the drive. Please ensure that the medium is present.
+#define MINT_FILEERROR_HARDIO_REMOTE 36 // There was a problem accessing the file. There may be a problem with your network.
+#define MINT_FILEERROR_SHARING 37 // A file sharing violation occurred: %1!%r!.
+#define MINT_FILEERROR_LOCK 38 // A file lock violation occurred: %1!%r!.
+#define MINT_FILEERROR_DISKFULL 39 // The file could not be written as the disk is full.
+#define MINT_FILEERROR_EOF 40 // An attempt was made to access past the end of the file: %1!%r!.
+#define MINT_FILEERROR_RENAME 41 // Failed to rename file %1!%r!, cause %2!%r!.
+#define MINT_FILEERROR_BADEXT 42 // The file has an invalid extension.
+#define MINT_FILEERROR_NOSTREAM 43 // No file stream was supplied.
+#define MINT_FILEERROR_STREAM_NOTOPEN 44 // The file stream is not open.
+#define MINT_FAIL_CREATE_FILE 45 // Failed to create the file.
+#define MINT_CREATE_FILE 46 // Creating output file: %1!%r!.
+#define MINT_FILE_EXISTS 47 // The output file already exists.
+#define MINT_FILE_OPEN 48 // Opening file: %1!%r!.
+#define MINT_FILE_NO_DIR 49 // The folder does not exist : %1!%r.
+#define MIR_INTERP_NO_OUTPUT_FOLDER 50 // Output folder verification failure.
+#define MINT_FILE_NOFINDDIR 51 // A suitable folder could not be found.
+#define MINT_FILE_OVERWRITE 52 // Warning: Overwriting file %1!%r!.
+#define MIR_INTERP_OUTPUT_ALREADY_OPEN 53 // The output file is already open in another process.
+#define MIR_INTERP_VERIFY_ALREADY_OPEN 54 // The file is currently open for read or write by another process: %1!%r!.
+#define MIR_INTERP_VERIFY_CLOSE 55 // Close the file before proceeding: %1!%r!.
+#define MIR_INTERP_VERIFY_CLOSE2 56 // The output file %1!%r! exists and is currently open in another process. Please close the file (or modify the output raster file name) and restart interpolation.
+#define MIR_ERROR_CREATETEMPFILE 57 // Error: Failed to create temporary file.
+#define MIR_INTERP_VERIFY_INPUT_FAILURE 58 // Input file verification failure.
+#define MIR_INTERP_VERIFY_OUTPUT_FILENAME 59 // The output raster file name %1!%r! is invalid. The filename is blank.
+#define MIR_DELETED 60 // Deleted %1!%r!.
+#define MINT_XML_NODOC 61 // XML parsing error. No valid XML document found.
+#define MINT_XML_NOROOT 62 // XML parsing error. No root element found.
+#define MINT_XML_NOROOT_NAMED 63 // XML parsing error. No root element found. (expecting: %1!%r!).
+#define MINT_XML_BADELEMENT 64 // XML parse warning. Unrecognized element found.
+#define MINT_XML_BADELEMENT_NAMED 65 // XML parse warning. Unrecognized element "%1!%r!" found containing "%2!%r!".
+#define MINT_PARSE_UNKNOWNTOKEN 66 // Unknown token encountered whilst parsing: %1!%r!
+#define MINT_PROCESS_BEGIN 67 // Processing operation started.
+#define MINT_PROCESS_COMPLETE 68 // Processing operation complete.
+#define MINT_PROCESS_TERMINATED 69 // Processing operation terminated.
+#define MINT_PROCESS_FAILED 70 // Processing operation failed.
+#define MINT_PROCESS_PAUSED 71 // Process execution paused.
+#define MINT_PROCESS_RESUMED 72 // Process execution resumed.
+#define MINT_PROCESS_STOPPED 73 // Process execution stopped.
+#define MINT_PROCESS_STARTED 74 // Process execution restarted.
+#define MINT_PROCESS_WAITING 75 // Process waiting to resume.
+#define MINT_PROCESS_CANCELED 76 // Process execution canceled.
+#define MINT_OPERATION_PROGRESS 77 // Operation %1!%r!% complete.
+#define MINT_PROCESS_PROGRESS 78 // Process %1!%r!% complete.
+#define MINT_TRACKER_CREATE_FAIL 79 // Memory allocation failure. Could not create a process tracker object.
+#define MINT_ZIP_FAILINIT 80 // ZIP compression failed to initialize. %1!%r!
+#define MINT_ZIP_FAIL 81 // ZIP compression failed. %1!%r!
+#define MINT_ZIP_FAILEND 82 // ZIP Compression failed to end. %1!%r!
+#define MINT_LZMA_FAILMEMRETRY 83 // LZMA compression at level %1!%r! failed due to a failed memory allocation. Retrying.
+#define MINT_LZMA_FAILMEM 84 // LZMA compression failed due to a failed memory allocation.
+#define MINT_LZMA_FAILPARAM 85 // LZMA compression failed due to a parameter error.
+#define MINT_LZMA_FAILOVRRUNRETRY 86 // LZMA compression at level %1!%r! failed due to a buffer overrun. Retrying.
+#define MINT_LZMA_FAILOVRUN 87 // LZMA compression failed due to a buffer overrun.
+#define MINT_LZMA_FAILTHREADRETRY 88 // LZMA compression at level %1!%r! failed due to thread issue.
+#define MINT_LZMA_FAILTHREAD 89 // LZMA compression failed due to a thread issue.
+#define MINT_LZMA_FAIL 90 // LZMA compression failed. %1!%r!
+#define MINT_UNZIP_FAILINIT 91 // ZIP decompression failed to initialize. %1!%r!
+#define MINT_UNZIP_FAIL 92 // ZIP decompression failed. %1!%r!
+#define MINT_UNLZMA_FAIL 93 // LZMA decompression failed. %1!%r!
+#define MINT_INVALID_EXPRESSION 94 // Invalid expression.
+#define MINT_INVALID_EXPRESSION_SQUARE_BRACKETS 95 // Invalid expression: Invalid use of square brackets.
+#define MINT_INVALID_EXPRESSION_STATS_SINGLE_BAND_ONLY 96 // Invalid expression: The statistics functions cannot be applied to multiple bands.
+#define MINT_INTERP_READING 97 // Reading file: %1!%r!.
+#define MINT_INTERP_FILE_FAIL 98 // Failed to read file: %1!%r!.
+#define MINT_INTERP_ZIP_FIND_FAIL 99 // Failed to find file %1!%r! in ZIP file: %2!%r!.
+#define MIR_INTERP_ZIP_READ_FAIL 100 // Failed to read ZIP file: %1!%r!.
+#define MINT_COMPUTE_STATS1 101 // Compute histogram.
+#define MINT_COMPUTE_STATS2 102 // Compute basic univariate statistics.
+#define MINT_COMPUTE_STATS3 103 // Compute skewness statistics.
+#define MINT_COMPUTE_STATS4 104 // Compute basic bivariate statistics.
+#define MINT_COMPUTE_STATS5 105 // Compute correlation statistics.
+#define MINT_COMPUTE_STATS6 106 // Compute rank statistics.
+#define MINT_COMPUTE_STATS7 107 // Compute expectation statistics.
+#define MINT_COMPUTE_STATS8 108 // Compute basic multivariate statistics.
+#define MINT_COMPUTE_STATS9 109 // Compute first order surface fit.
+#define XCFS_NOTOPEN_MOD 110 // XCFS error: XCFS is not modifiable.
+#define XCFS_FLGS_INCOMPATIBLE 111 // XCFS error: Unable to re-open stream (supplied flags are incompatible).
+#define XCFS_MOD_NOTALLOWED 112 // XCFS error: Stream is not modifiable.
+#define XCFS_EX_ACCESS 113 // XCFS error: Stream is open for exclusive access.
+#define XCFS_ZERO_FILESIZE 114 // XCFS error: Unable to truncate stream.
+#define XCFS_ZERO_LEN 115 // XCFS error: File has zero length.
+#define XCFS_EST_FILELEN 116 // XCFS error: Unable to determine XCFS file length.
+#define XCFS_FAIL_OPEN 117 // XCFS error: Unable to open XCFS file.
+#define XCFS_FAIL_OPEN_STREAM 118 // XCFS error: Unable to open stream.
+#define XCFS_FAIL_CREATE_STREAM 119 // XCFS error: Unable to create stream.
+#define XCFS_FAIL_OPEN_MFT 120 // XCFS error: Unable to open file table system stream.
+#define XCFS_FAIL_OPEN_EMPTY_CLUSTER 121 // XCFS error: Unable to open empty cluster stream.
+#define XCFS_FAIL_OPEN_FILE_INDEX 122 // XCFS error: Unable to open file index server stream.
+#define XCFS_FAIL_READ_ROOT 123 // XCFS error: Unable to read root cluster.
+#define XCFS_FAIL_CLUSTERCHAIN 124 // XCFS error: Unable to read file cluster chain.
+#define XCFS_FAIL_CLOSE 125 // XCFS error: Unable to close XCFS file.
+#define XCFS_FAIL_COMMIT 126 // XCFS error: Unable to commit XCFS file.
+#define XCFS_FAIL_COMMIT_ROOT 127 // XCFS error: Unable to commit root.
+#define XCFS_FAIL_COMMIT_TABLE 128 // XCFS error: Unable to commit file table stream.
+#define XCFS_FAIL_COMMIT_FILE 129 // XCFS error: Unable to commit a file.
+#define XCFS_FAIL_COMMIT_FILE_INDEX 130 // XCFS error: Unable to commit file index server stream.
+#define XCFS_FAIL_COMMIT_EMPTY_CLUSTER 131 // XCFS error: Unable to commit empty cluster stream.
+#define XCFS_FAIL_CLOSUREFLAG 132 // XCFS error: Closure flag indicates the file failed to close properly. The file may be corrupt.
+#define XCFS_FAIL_VERSION 133 // XCFS error: File version is not supported.
+#define XCFS_FAIL_NOTXCFS 134 // XCFS error: File is not an XCFS file.
+#define XCFS_FAIL_STREAM_NOTOPEN 135 // XCFS error: The stream is not open.
+#define XCFS_FAIL_ARCHIVE_CORRUPT 136 // XCFS error: Archive sub-file is corrupt.
+#define XCFS_FAIL_COMPRESS 137 // XCFS error: Compression operation failed. File data is corrupt.
+#define XCFS_FAIL_DECOMPRESS 138 // XCFS error: Decompression operation failed. File data is corrupt.
+#define XCFS_INVALID_FILECOUNT 139 // XCFS error: Root file count does not match file server.
+#define XCFS_INVALID_CLUSTERCOUNT 140 // XCFS error: Root cluster count does not match file size.
+#define MIR_NOT_LICENSED 141 // MapInfo Advanced (Raster) is not licensed.
+#define MIR_INVALID_FIELD 142 // An invalid field index was referenced.
+#define MIR_INVALID_BAND 143 // An invalid band index was referenced.
+#define MIR_INVALID_EVENT 144 // An invalid event index was referenced.
+#define MIR_INVALID_LEVEL 145 // An invalid level index was referenced.
+#define MIR_FAIL_LOADSTRUCTURE 146 // Failed to load the raster structural data.
+#define MIR_INVALID_STRUCTURE 147 // Failed to validate the raster structural data.
+#define MIR_FAIL_CREATE 148 // Failed to create the raster.
+#define MIR_FAIL_COMMIT 149 // Failed to commit the raster to file.
+#define MIR_FAIL_NOZIPSUPPORT 150 // Unable to support ZIP file format.
+#define MIR_ZIPEDIT_NOT_ALLOWED 151 // The edit cell operation is not supported for rasters stored in a ZIP archive.
+#define MIR_RASTER_CLOSED 152 // Raster has been closed.
+#define MIR_INVALIDHANDLE 153 // An invalid handle has been provided.
+#define MIR_FAIL_INVALIDDRIVER 154 // An invalid driver was requested.
+#define MIR_INVALID_CONVERSION 155 // The requested raster conversion is not supported.
+#define MIR_BEGIN_ITER_FAILED 156 // Unable to start raster cell iterator.
+#define MIR_RGB_FIELD_NOT_FOUND 157 // RGB field not found.
+#define MIR_CLASSVAL_FIELD_NOT_FOUND 158 // Class value field not found in classification table.
+#define MIR_NO_TILE 159 // The raster contains no tiles.
+#define MIR_EDITCELL_NOT_ALLOWED 160 // The edit cell operation is not supported.
+#define MIR_CREATE_NOT_ALLOWED 161 // The create operation is not supported by this raster driver.
+#define MIR_ZIPCREATE_NOT_ALLOWED 162 // The create operation is not supported for rasters stored in a ZIP archive.
+#define MIR_NOT_IMPLEMENTED 163 // The requested feature is not yet implemented.
+#define MIR_READ_NOT_ALLOWED 164 // Raster is not readable.
+#define MIR_WRITE_NOT_ALLOWED 165 // Raster is not writable.
+#define MIR_EDIT_INVALID 166 // An edit operation has been attempted on a raster that is not editable.
+#define MIR_EDIT_FAILED 167 // An edit operation failed.
+#define MIR_FORWARD_VERSION 168 // The version of input raster is higher. Some features may not be loaded.
+#define MIR_ONLY_CONTINOUS_SUPPORTED 169 // The raster field type is invalid: only continuous field is supported.
+#define MIR_RASTER_SOURCE_FILE_CHANGE 964 // A driver has changed the raster source file name and restarted mounting.
+#define MIR_VD_EXTRA_FIELDS 170 // Too many fields - additional fields will be ignored.
+#define MIR_VD_NO_FIELDS 171 // No fields - raster is invalid.
+#define MIR_VD_EXTRA_BANDS 172 // Too many bands - additional bands will be ignored.
+#define MIR_VD_NO_BANDS 173 // No bands - raster is invalid.
+#define MIR_BAND_TYPE_NOTSUPPORTED 174 // Band type is not supported by the raster driver.
+#define MIR_VD_MADE_BASETILESIZE 175 // Base level tile size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_UNDERVIEWTILESIZE 176 // Underview tile size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_OVERVIEWTILESIZE 177 // Overview tile size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_BASEMAPSIZE 178 // Base level map size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_UNDERVIEWMAPSIZE 179 // Underview map size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_OVERVIEWMAPSIZE 180 // Overview map size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_CAPSTONEMAPSIZE 181 // Capstone map size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_MADE_GRIDSIZE 182 // Grid size was changed to (%1!%r!,%2!%r!).
+#define MIR_VD_EXCEEDSGRIDSIZE 183 // Grid size exceeds limit supported by the driver.
+#define MIR_VD_MADE_CELLSIZE 184 // Cell size was changed to (%1!%.10g!,%2!%.10g!).
+#define MIR_VD_BAD_COORDSYS 185 // Supplied coordinate system is invalid.
+#define MIR_VD_NO_TRANSFORM 186 // A default world-cell transformation has been adopted.
+#define MIR_VD_NO_ENDIAN 187 // Supplied endian mode is not supported by this driver
+#define MIR_VD_NO_CONTINUOUS 188 // Field type (continuous) is not supported by this driver.
+#define MIR_VD_NO_IMAGE 189 // Field type (image) is not supported by this driver.
+#define MIR_VD_NO_IMAGEPALETTE 190 // Field type (image palette) is not supported by this driver.
+#define MIR_VD_NO_CLASSIFIED 191 // Field type (classified) is not supported by this driver.
+#define MIR_VD_MADE_CONTINUOUS 192 // Field type was changed (to continuous).
+#define MIR_VD_MADE_IMAGE 193 // Field type was changed (to image).
+#define MIR_VD_MADE_IMAGEPALETTE 194 // Field type was changed (to image palette).
+#define MIR_VD_MADE_CLASSIFIED 195 // Field type was changed (to classified).
+#define MIR_VD_MADENO_COMRPESSION 196 // Compression was disabled.
+#define MIR_VD_MADE_COMRPESSION 197 // Compression was changed to %1!%r!.
+#define MIR_VD_MADE_COMRPESSION_LOSSLESS 198 // Invalid compression method. Reset to default lossless compression.
+#define MIR_VD_MADE_DATATYPE 199 // Band data type was changed to %1!%r!.
+#define MIR_VD_MADE_STORETYPE 200 // Band store data type was changed to %1!%r!.
+#define MIR_VD_MADE_STORETYPEEQUAL 201 // Band data type and storage data type were made to match.
+#define MIR_VD_BANDDATASTORENOTEQUAL 202 // Band data type and stored type differ, but no transform is in use. Is this the intention?
+#define MIR_VD_MADE_NULLTYPE 203 // Band null type was changed to %1!%r!.
+#define MIR_VD_MADE_NULLDATATYPE 204 // Band null data type was changed to %1!%r!.
+#define MIR_VD_MADE_NULLDATATYPEEQUAL 205 // Band null data type was changed to match the data type.
+#define MIR_VD_MADE_NULLVALUE 206 // Band null type was changed to %1!%.10g!.
+#define MIR_VD_NO_RESTRICTDECIMALS 207 // Band decimal restriction is not supported by this driver.
+#define MIR_VD_SET_TRANSFORM 208 // A band transform was defined.
+#define MIR_VD_BAD_TRANSFORM 209 // The supplied band transform was not honored.
+#define MIR_VD_NO_TRANSFORMSCALE 210 // The supplied band transform scale was not honored.
+#define MIR_VD_NO_TRANSFORMOFFSET 211 // The supplied band transform offset was not honored.
+#define MIR_VD_SET_CLIP 212 // A band clip range was defined.
+#define MIR_VD_NO_CLIPMIN 213 // The supplied band clip band clip minimum value was not honored.
+#define MIR_VD_NO_CLIPMAX 214 // The supplied band clip band clip maximum value was not honored.
+#define MIR_VD_NO_CLASSTABLE 215 // No classification table was supplied.
+#define MIR_VD_SET_PRIMARYCOLOR 216 // The color palette was assigned a primary color field.
+#define MIR_VD_NO_PRIMARYCOLOR 217 // The color palette does not contain a color field.
+#define MIR_VD_EXTRA_TABLE 218 // The supplied classification table was deleted as it is not supported by the field type.
+#define MIR_VD_NO_PREDENCODE 219 // The supplied predictive encoding settings were not honored.
+#define MIR_VD_NO_DISCRETE 220 // The discrete value setting is not supported by this driver.
+#define MIR_VD_NO_EVENT 221 // The raster driver does not support multiple events. Only the last event will be retained.
+#define MIR_ERROR_ITERATORBEGINFAIL 222 // Error: Failed to begin iterator.
+#define MIR_ERROR_ITERATORFAIL 223 // Error: Iterator failed.
+#define MIR_ERROR_ITERATORFAILWRITE 224 // Error: Iterator failed to write data.
+#define MIR_ERROR_NORASTERACCESS 225 // Error: Failed to acquire raster access.
+#define MIR_RASTER_INFO_UNAVAILABLE 226 // Raster information is not available.
+#define MIR_RASTERINFO_NOT_MATCHED 227 // Unable to match raster information.
+#define MIR_CONNECT_TO_EXISTING 228 // Connected to open raster.
+#define MIR_NO_CONCURRENT_ACCESS 229 // The raster is currently open. No concurrent access is allowed.
+#define MIR_FAIL_STATS 230 // Failed to compute the raster statistics.
+#define MIR_RASTER_CACHE_UNAVAILABLE 231 // Raster cache is unavailable.
+#define MIR_FAIL_CREATE_RASTER_CACHE 232 // Failed to create a raster cache.
+#define MIR_TOO_LARGE 233 // The raster exceeds the maximum number of rows or columns allowed by this driver.
+#define MIR_INTERP_DRIVER_CAPS 234 // Error: Raster driver capabilities were not retrieved.
+#define MIR_RASTER_CLASS_SIZE_TOO_LARGE 235 // Raster class table size is too large.
+#define MIR_FLUSHING_TILES_S 236 // Writing cached tiles to disk.
+#define MIR_FLUSHING_TILES_FINISHED_S 237 // Writing cached tiles to disk completed successfully.
+#define MIR_CONVERT_COMPLETED 238 // Convert operation completed successfully.
+#define MIR_COMPUTE_STATS_FOR_BAND_S 239 // Computing statistics for band %1!%r!.
+#define MIR_COMPUTE_STATS_FOR_BAND_COMPLETE_S 240 // Computing statistics for band %1!%r! completed.
+#define MIR_COMPUTE_STATS_FOR_ALL_BAND_S 241 // Computing statistics for field %1!%r! - all bands.
+#define MIR_COMPUTE_STATS_FOR_ALL_BAND_COMPLETE_S 242 // Computing statistics for all bands completed.
+#define MIR_START_COPYTO_MRRCACHE_S 243 // Started copying to MRR cache.
+#define MIR_FINISH_COPYTO_MRRCACHE_S 244 // Finished copying to MRR cache.
+#define MIR_START_COPYFROM_MRRCACHE_S 245 // Started copying from MRR cache.
+#define MIR_FINISH_COPYFROM_MRRCACHE_S 246 // Finished copying from MRR cache.
+#define MIR_UPDATING_OVERVIEWS_S 247 // Updating overviews.
+#define MIR_UPDATING_OVERVIEWS_FINISHED_S 248 // Updating overviews completed.
+#define MIR_START_CREATE_PERC_S 249 // Started creating PERC file %1!%r!.
+#define MIR_FINISH_CREATE_PERC_S 250 // Finished creating PERC file %1!%r!.
+#define MIR_START_CREATE_PPRC_S 251 // Started creating PPRC file %1!%r!.
+#define MIR_FINISH_CREATE_PPRC_S 252 // Finished creating PPRC file %1!%r!.
+#define MIR_START_CREATE_TERC_S 253 // Started creating TERC file.
+#define MIR_FINISH_CREATE_TERC_S 254 // Finished creating TERC file.
+#define MIR_CONVERTING_INPUT_FILE 255 // Convert operation started.
+#define MIR_CONVERT_1 256 // Source raster: %1!%r!.
+#define MIR_CONVERT_2 257 // Source raster format: %1!%r!.
+#define MIR_CONVERT_3 258 // Source raster size %1!%r! x %2!%r! (total of %3!%r! cells).
+#define MIR_SUGGESTINFO_FAIL 259 // Unable to Suggest Raster Info for provided inputs.
+#define MIR_WRITING_OUTPUT_FILE 260 // Writing output file.
+#define MIR_JOIN1 261 // Identified %1!%r! raster source files for joining.
+#define MIR_JOIN2 262 // Validated %1!%r! raster source files for joining.
+#define MIR_COLOR_BADFILE 263 // Invalid color file format.
+#define MIR_READ_COLOUR_FAIL 264 // Failed to read color file.
+#define MIR_COLOR_FAILWRITE 265 // Failed to write color file.
+#define MIR_SEAMLESSTAB_FAILURE 266 // Seamless TAB output failure.
+#define MIR_INTERP_LOW_MEM 267 // Warning: Available physical memory is low: %1!%r! MB reserved.
+#define MIR_INTERP_BAND_COUNT_UNEXPECTED 268 // Warning: File %1!%r! has an unexpected band count (Parse string: %2!%r!).
+#define MIR_INTERP_INPUT_CONNECTED 269 // Input stream statistics: %1!%r! sources connected, total of %2!%r! bytes (indicative).
+#define MIR_INTERP_BAND_COUNT 270 // Output raster band count: %1!%r!.
+#define MIR_INTERP_BAND_TYPE 271 // Band %1!%r!: %2!%r! Type = %3!%r!.
+#define MIR_INTERP_SPATIAL_STATS_READ 272 // Reading a small portion of the input data...
+#define MIR_INTERP_SPATIAL_STATS_WARN1 273 // Warning: Data may be reordered. Cell size recommendation may be poor.
+#define MIR_INTERP_SPATIAL_STATS_WARN2 274 // Warning: Data distribution may be clustered or skewed. Cell size recommendation may be poor.
+#define MIR_INTERP_SPATIAL_STATS_TYPE1 275 // Coordinates are UTM.
+#define MIR_INTERP_SPATIAL_STATS_TYPE2 276 // Coordinates are geodetic.
+#define MIR_INTERP_SPATIAL_STATS_SEPERATION 277 // Estimated station separation: %1!%.10g! units.
+#define MIR_INTERP_SPATIAL_STATS_DIRECTION 278 // Estimated station trend direction: %1!%.10g! degrees.
+#define MIR_INTERP_SPATIAL_STATS_CELL1 279 // Raster cell size recommendation: %1!%.10g! units.
+#define MIR_INTERP_SPATIAL_STATS_CELL2 280 // Raster cell size recommendation: %1!%.10g! units (%2!%.10g! arc sec).
+#define MIR_COINCIDENTPOINT_REPORT 281 // Found %1!%r! points coincident and %2!%r! eliminated.
+#define MIR_INTERP_TYPE6 282 // Gridding: Stamped data distance.
+#define MIR_INTERP_TYPE9 283 // Gridding: Grid stamp.
+#define MIR_INTERP_TYPE_NN 284 // Gridding: Nearest Neighbour.
+#define MIR_INTERP_TYPE_NNI 285 // Gridding: Natural Neighbour by Integration.
+#define MIR_INTERP_BAND_COUNT_FAILURE 286 // Error: Band count is zero.
+#define MIR_INTERP_VALID_STATION_COUNT_ZERO 287 // Error: No valid stations found.
+#define MIR_ERROR_CREATERASTERFILE 288 // Error: Failed to create raster file.
+#define MIR_ERROR_NOPOINTCACHE 289 // Error: No point cache.
+#define MIR_INTERP_BUILD_INPUT 290 // Build and verify the input data stream.
+#define MIR_INTERP_SPATIAL_STATS 291 // Determine representative spatial statistics.
+#define MIR_INTERP_PARSE_SORT 292 // Parsing and spatial sorting input data points and vectors.
+#define MIR_TASK_COINCIDENTPOINT 293 // Coincident point analysis.
+#define MIR_TASK_DEFINEOUTPUTTILES 294 // Declare output raster tiles.
+#define MIR_TASK_NEARESTNEIGHBOUR 295 // Grid by nearest neighbor.
+#define MIR_TASK_STAMP 296 // Grid by stamping.
+#define MIR_TASK_DISTANCE 297 // Grid by distance.
+#define MIR_TASK_DENSITY 298 // Grid by density.
+#define MIR_TASK_IDW 299 // Grid by inverse distance weighted.
+#define MIR_INTERP_EXPORT 300 // Finalize raster export.
+#define MIR_TASK_VORONOITESSELATE 301 // Populate Voronoi tesselation.
+#define MIR_TASK_VORONOIINTEGRATE 302 // Grid by natural neighbor (integration).
+#define MIR_TASK_SMOOTH 303 // Smooth.
+#define MIR_INTERP_SPATIAL_OUTOFMEM 304 // Out of memory in spatial analysis: Set the grid cell size manually to a larger value.
+#define MIR_INTERP_DATA_PYRAMID_ALLOCATION_FAIL 305 // Data pyramid memory allocation failure.
+#define MIR_INTERP_CHECK_STORAGE 306 // Checking storage volumes and system memory. This can cause a short delay.
+#define MIR_INTERP_VOLUME_INFO1 307 // Volume %1!%r! [%2!%r!]: Size %3!%r! (%4!%r! MB), Free %5!%r! (%6!%r! MB) %7!%r! %8!%r!
+#define MIR_INTERP_VOLUME_INFO2 308 // READ_ONLY
+#define MIR_INTERP_VOLUME_INFO3 309 // COMPRESSED
+#define MIR_INTERP_PHYSICAL_MEM_TOTAL 310 // Physical memory (total) : %1!%6llu! MB
+#define MIR_INTERP_PHYSICAL_MEM_AVAILABLE 311 // Physical memory (available) : %1!%6llu! MB
+#define MIR_INTERP_VIRTUAL_MEM_TOTAL 312 // Virtual memory (total) : %1!%6llu! MB
+#define MIR_INTERP_VIRTUAL_MEM_AVAILABLE 313 // Virtual memory (available) : %1!%6llu! MB
+#define MIR_INTERP_PAGING_MEM_TOTAL 314 // Paging memory (total) : %1!%6llu! MB
+#define MIR_INTERP_PAGING_MEM_AVAILABLE 315 // Paging memory (available) : %1!%6llu! MB
+#define MIR_INTERP_CHECKING_STATUS 316 // Checking status of input files.
+#define MIR_INTERP_ZIP_FAILURE 317 // Could not open the ZIP file.
+#define MIR_INTERP_ZIPITEM_FAILURE 318 // Could not find item within the ZIP file.
+#define MIR_INTERP_NO_TEMP_FOLDER 319 // Temp folder verification failure.
+#define MIR_INTERP_NO_OUTPUT_FILENAME 320 // Output filename verification failure.
+#define MIR_INTERP_SPATIAL_STATS_WARN3 321 // Estimated point separation and cell size are widely divergent.
+#define MIR_INTERP_EXTENTS 322 // Parse input, determine data extents and distribution.
+#define MIR_INTERP_EXTENTS_PARSE1 323 // Parsing for extents...
+#define MIR_INTERP_EXTENTS_PARSE2 324 // Parsing input extents (skipping %1!%r!)...
+#define MIR_INTERP_EXTENTS_PARSE3 325 // Parsing input extents...
+#define MIR_INTERP_EXTENTS_READING 326 // Reading all input files to obtain data extents and distribution statistics...
+#define MIR_INTERP_EXTENTS_SUFFIX 327 // (estimated)
+#define MIR_INTERP_EXTENTS_WARN1 328 // Warning: Statistics are based on sub-sampled data.
+#define MIR_INTERP_EXTENTS_TOTAL_POINTS 329 // Total input points: %1!%r! %2!%r!.
+#define MIR_INTERP_EXTENTS_TOTAL_VALID_POINTS 330 // Total valid input points: %1!%r! %2!%r!.
+#define MIR_INTERP_EXTENTS_SPATIALX 331 // Spatial range X: (%1!%.10g! to %2!%.10g!) %3!%.10g! %4!%r!.
+#define MIR_INTERP_EXTENTS_SPATIALY 332 // Spatial range Y: (%1!%.10g! to %2!%.10g!) %3!%.10g! %4!%r!.
+#define MIR_INTERP_EXTENTS_WARN2 333 // Warning: Point separation statistics may be invalid.
+#define MIR_INTERP_EXTENTS_POINTSEP1 334 // Point separation: less than or equal to %1!%.10g! (Avg : %2!%.10g!) : %3!%r! stations.
+#define MIR_INTERP_EXTENTS_POINTSEP2 335 // Point separation: greater than %1!%.10g! (Avg : %2!%.10g!) : %3!%r! stations.
+#define MIR_INTERP_EXTENTS_BAND_RANGE 336 // Band %1!%r! range: %2!%.10g! to %3!%.10g! %4!%r!.
+#define MIR_INTERP_EXTENTS_COVERAGE1 337 // Data coverage: Number of tiles %1!%r! occupying area %2!%.10g!.
+#define MIR_INTERP_EXTENTS_COVERAGE2 338 // Data coverage: Number of cells %1!%r! occupying area %2!%.10g!.
+#define MIR_INTERP_EXTENTS_COVERAGE3 339 // Data coverage: Minimum density %1!%.10g! points/unit area (Square of length %2!%.10g! units).
+#define MIR_INTERP_EXTENTS_COVERAGE4 340 // Data coverage: Maximum density %1!%.10g! points/unit area (Square of length %2!%.10g! units).
+#define MIR_INTERP_EXTENTS_COVERAGE5 341 // Data coverage: Mean density %1!%.10g! points/unit area (Square of length %2!%.10g! units).
+#define MIR_INTERP_EXTENTS_COVERAGE6 342 // Data coverage: Median density %1!%.10g! points/unit area (Square of length %2!%.10g! units).
+#define MIR_INTERP_EXTENTS_COVERAGE7 343 // Data coverage: Mode density %1!%.10g! points/unit area (Square of length %2!%.10g! units).
+#define MIR_INTERP_PREPARE_GRID 344 // Prepare raster parameters.
+#define MIR_INTERP_PREPARE_GRID_SIZE 345 // Raster size: (%1!%r! x %2!%r!) cells of size (%3!%.10g!, %4!%.10g!).
+#define MIR_INTERP_PREPARE_GRID_EXTENT 346 // Raster extent: (%1!%.10g! %2!%.10g!) to (%3!%.10g! %4!%.10g!).
+#define MIR_INTERP_PREPARE_GRID_WARN1 347 // Warning: No patch coverage data available as input data was not parsed.
+#define MIR_INTERP_PREPARE_GRID_PATCH1 348 // Patch coverage: %1!%r! patches of size %2!%r! x %3!%r! cells with %4!%r! points per patch.
+#define MIR_INTERP_PREPARE_GRID_PATCH2 349 // Patch coverage: %1!%r! patches occupied (estimated) with %2!%r! points per patch.
+#define MIR_INTERP_INVALID_DATA_RANGE 350 // Interpolation Data range is invalid.
+#define MIR_INTERP_EXPORT_MASK 351 // Export Source Mask.
+#define MIR_INTERP_EXPORT_MASK1 352 // Exporting Source Mask...
+#define MIR_INTERP_FINALISE_EXPORT 353 // Finalize raster export.
+#define MIR_INTERP_FINALISE_EXPORT_UNPAD 354 // Processing: un-padding raster...
+#define MIR_INTERP_PREPARE 355 // Prepare to interpolate.
+#define MIR_INTERP_PREPARE_WARN1 356 // Volume %1!%r! requires an estimated %2!%r! MB.
+#define MIR_INTERP_PREPARE_WARN2 357 // Warning: Volume %1!%r! has insufficient storage space.
+#define MIR_INTERP_PREPARE_WARN3 358 // Warning: Volume %1!%r! may run out of storage space.
+#define MIR_INTERP_PREPARE_ERROR1 359 // Error: Volume %1!%r! is read-only.
+#define MIR_INTERP_PREPARE_STAMP1 360 // Source data stamping will be performed direct to memory.
+#define MIR_INTERP_PREPARE_STAMP2 361 // Establishing data cache. This can cause a short delay...
+#define MIR_INTERP_PREPARE_STAMP3 362 // Source data will be in memory.
+#define MIR_INTERP_PREPARE_STAMP4 363 // Source data will be in virtual memory.
+#define MIR_INTERP_PREPARE_STAMP5 364 // Patch cache size: %1!%r! bytes.
+#define MIR_INTERP_PREPARE_STAMP6 365 // Warning: Estimated memory usage (%1!%r! MB) exceeds available physical memory (%2!%r! MB).
+#define MIR_INTERP_PREPARE_STAMP7 366 // Source data stamping will be performed in virtual memory.
+#define MIR_INTERP_PREPARE_STAMP8 367 // Patch size has been adjusted.
+#define MIR_INTERP_PREPARE_STAMP9 368 // Patch coverage: %1!%r! patches of size %2!%r! x %3!%r! cells with %4!%r! points per patch.
+#define MIR_INTERP_PREPARE_STAMP10 369 // Patch coverage: %1!%r! patches occupied (estimated) with %2!%r! points per patch.
+#define MIR_INTERP_PREPARE_STAMP11 370 // Up to %1!%r! stations will be cached per patch.
+#define MIR_INTERP_PREPARE_STAMP12 371 // Up to %1!%r! input stations will be internally cached.
+#define MIR_INTERP_PREPARE_STAMP13 372 // Source data stamping will be performed in-memory.
+#define MIR_INTERP_PREPARE_PATCH1 373 // Patch cache: All points will be stored in memory.
+#define MIR_INTERP_PREPARE_ESTABLISH 374 // Establishing grid files on disk.
+#define MIR_INTERP_SOURCE_MASK_FAILURE1 375 // Export source mask: Failed to open for writing.
+#define MIR_INTERP_GRID_READER_FAILURE 376 // Could not open the raster reader.
+#define MIR_INTERP_GRID_WRITER_FAILURE 377 // Could not open the raster writer.
+#define MIR_INTERP_OUTPUT_VOLUME_NOSPACE 378 // The output volume has insufficient storage space.
+#define MIR_INTERP_OUTPUT_VOLUME_MAYHAVENOSPACE 379 // The output volume may run out of storage space.
+#define MIR_INTERP_OUTPUT_VOLUME_READONLY 380 // The output volume is read-only.
+#define MIR_INTERP_SOURCE_MASK_FAILURE 381 // Source mask could not be read from file.
+#define MIR_INTERP_MATH_EXCEPTION 382 // Invalid mathematical operation attempted.
+#define MIR_INTERP_FREE_MEMORY 383 // Estimated memory usage exceeds available physical.
+#define MIR_INTERP_SYSTEM_ERROR 384 // System error trying to allocate patch memory.
+#define MIR_INTERP_FAILURE1 385 // No command line control file argument found.
+#define MIR_INTERP_FAILURE2 386 // Failed to read supplied command file.
+#define MIR_INTERP_FAILURE3 387 // Failed to build input stream.
+#define MIR_INTERP_FAILURE4 388 // Failed to parse input for statistics.
+#define MIR_INTERP_FAILURE5 389 // Failed to parse input for extents.
+#define MIR_INTERP_FAILURE6 390 // Failed to prepare raster extents.
+#define MIR_INTERP_FAILURE7 391 // Failed raster export.
+#define MIR_INTERP_FAILURE8 392 // Failed to write a final parameters command file.
+#define MIR_INTERP_FAILURE9 393 // Failed to prepare for interpolation.
+#define MIR_INTERP_FAILURE10 394 // Failed to stamp input data.
+#define MIR_INTERP_FAILURE11 395 // Failed to clip.
+#define MIR_INTERP_FAILURE12 396 // Failed first phase interpolation.
+#define MIR_INTERP_FAILURE13 397 // Failed second phase interpolation.
+#define MIR_INTERP_FAILURE14 398 // Failed third phase interpolation.
+#define MIR_INTERP_FAILURE15 399 // Failed to sort input data.
+#define MIR_INTERP_FAILURE16 400 // Failed to triangulate.
+#define MIR_INTERP_FAILURE17 401 // Failed to focus source mask.
+#define MIR_INTERP_FAILURE18 402 // Failed to export source mask.
+#define MIR_INTERP_PARSE_AND_STAMP 403 // Parse input and stamp.
+#define MIR_INTERP_PARSE_AND_STAMP1 404 // Stamping input data...
+#define MIR_INTERP_PARSE_AND_STAMP2 405 // Reading all input files and stamping to grid...
+#define MIR_INTERP_PARSE_AND_STAMP3 406 // Stamped a total of %1!%r! grid cells: %2!%.10g! percent.
+#define MIR_INTERP_PARSE_AND_STAMP4 407 // Normalizing stamped data...
+#define MIR_INTERP_PARSE_AND_STAMP_SYSERROR 408 // System error %1!%r! trying to allocate patch memory.
+#define MIR_INTERP_FINALISE 409 // Final minimum curvature iteration.
+#define MIR_INTERP_SORTING 410 // Sorting input data...
+#define MIR_INTERP_SORTING1 411 // Reading all input files and spatially sorting data...
+#define MIR_INTERP_PATCH_STATS1 412 // Patch statistics: %1!%r! occupied patches.
+#define MIR_INTERP_PATCH_STATS2 413 // Patch statistics: Maximum points %1!%r!, minimum %2!%r!.
+#define MIR_INTERP_PATCH_STATS3 414 // Patch statistics: Median points %1!%r!.
+#define MIR_INTERP_FINAL_MINC 415 // Final minimum curvature iteration.
+#define MIR_INTERP_PATCH_COLLAPSE 416 // Collapsed patch from %1!%r! stations to %2!%r! unique stations.
+#define MIR_INTERP_EXIT 417 // Exit
+#define MIR_INTERP_FINAL_CHANGE 418 // Final change: %1!%.10g!.
+#define MIR_INTERP_CACHE_FLUSH 419 // Flushing caches - there may a delay.
+#define MIR_INTERP_TRIANGULATION 420 // Triangulation.
+#define MIR_INTERP_TRIANGULATION1 421 // Triangulating...
+#define MIR_INTERP_SMALL_CACHE 422 // Warning: Raster cache is small - performance may be affected.
+#define MIR_INTERP_TRIANGULATION2 423 // Incrementally triangulating the dataset and writing to output raster.
+#define MIR_INTERP_PATCH_ROW 424 // Patch row %1!%r!:
+#define MIR_INTERP_FULL_LOAD 425 // Fully loaded
+#define MIR_INTERP_TRIANGULATION3 426 // Patch triangulation attempt failed due to memory allocation failure. Trying again...
+#define MIR_INTERP_UNLOAD 427 // Unloading
+#define MIR_INTERP_LOADED 428 // Patches loaded %1!%r!.
+#define MIR_INTERP_PYRAMID 429 // Populate pyramid upwards.
+#define MIR_INTERP_PYRAMID1 430 // Changing cache status. This can cause a short delay...
+#define MIR_INTERP_INTERPOLATING 431 // Interpolating %1!%r!% complete.
+#define MIR_INTERP_CLIP 432 // Clip.
+#define MIR_INTERP_CLIP_CREATE_MASK 433 // Creating clip mask...
+#define MIR_INTERP_CLIP_NEAR 434 // Near field search...
+#define MIR_INTERP_CLIP_FAR 435 // Far field search...
+#define MIR_INTERP_FOCUS 436 // Focus source mask.
+#define MIR_INTERP_FOCUS1 437 // Focusing source mask...
+#define MIR_INTERP_PYRAMID2 438 // Populate pyramid downwards.
+#define MIR_INTERP_EXPORT1 439 // Exporting raster...
+#define MIR_INTERP_EXPORT_HEADER 440 // Writing raster header...
+#define MIR_INTERP_EXPORT_HEADER1 441 // Output header: %1!%r!.
+#define MIR_INTERP_EXPORT_DATA 442 // Writing raster data...
+#define MIR_INTERP_EXPORT2 443 // Output: %1!%r!.
+#define MIR_INTERP_WRITE_TAB 444 // Writing TAB companion...
+#define MIR_INTERP_WRITE_TAB1 445 // Output TAB companion: %1!%r!.
+#define MIR_INTERP_COMMAND_FILE 446 // Input command file: %1!%r!.
+#define MIR_INTERP_ESTIMATE 447 // Statistics: Estimating appropriate cell size.
+#define MIR_INTERP_TERMINATED 448 // Terminated...
+#define MIR_INTERP_PHASE1 449 // Interpolation phase 1...
+#define MIR_INTERP_PHASE2 450 // Interpolation phase 2...
+#define MIR_INTERP_PHASE3 451 // Interpolation phase 3...
+#define MIR_INTERP_STAMP_COMPLETE 452 // Stamping %1!%r!% complete.
+#define MIR_INTERP_EXPORT_COMPLETE 453 // Exporting %1!%r!% complete.
+#define MIR_INTERP_OUTPUT_HEADER_FAILED 454 // Output header: Failed to open for writing.
+#define MIR_INTERP_OUTPUT_BIL_FAILED 455 // Output BIL: Failed to open for writing.
+#define MIR_INTERP_OUTPUT_TAB_FAILED 456 // Output TAB companion: Failed to open for writing.
+#define MIR_INTERP_OPEN_CREATE_FAILED 457 // Could not create output file.
+#define MIR_INTERP_ITERATOR_FAILED 458 // Could not create iterator to write to output file.
+#define MIR_INTERP_ERROR 459 // An error has occurred during interpolating a grid.
+#define MIR_INTERP_TYPE1 460 // Gridding: Stamped minimum curvature.
+#define MIR_INTERP_TYPE2 461 // Gridding: Minimum curvature.
+#define MIR_INTERP_TYPE3 462 // Gridding: Delaunay triangulation with linear interpolation.
+#define MIR_INTERP_TYPE4 463 // Gridding: Stamped inverse distance.
+#define MIR_INTERP_TYPE5 464 // Gridding: Stamped data density.
+#define MIR_INTERP_TYPE7 465 // Processing: Raster Padding.
+#define MIR_INTERP_TYPE8 466 // Processing: Raster Unpadding.
+#define MIR_INTERP_OUTPUTFILES 467 // Determining output file names.
+#define MIR_INTERP_CLEAN 468 // Clearing memory and erasing temporary files...
+#define MIR_INTERP_INVALID_TAB_INTERNAL 469 // Invalid TAB format: %1!%r!.
+#define MIR_INTERP_INVALID_INPUT_POINTS 470 // There are no valid input points.
+#define MIR_INTERP_JANUARY 471 // January
+#define MIR_INTERP_FEBRUARY 472 // February
+#define MIR_INTERP_MARCH 473 // March
+#define MIR_INTERP_APRIL 474 // April
+#define MIR_INTERP_MAY 475 // May
+#define MIR_INTERP_JUNE 476 // June
+#define MIR_INTERP_JULY 477 // July
+#define MIR_INTERP_AUGUST 478 // August
+#define MIR_INTERP_SEPTEMBER 479 // September
+#define MIR_INTERP_OCTOBER 480 // October
+#define MIR_INTERP_NOVEMBER 481 // November
+#define MIR_INTERP_DECEMBER 482 // December
+#define MIR_INTERP_MONDAY 483 // Monday
+#define MIR_INTERP_TUESDAY 484 // Tuesday
+#define MIR_INTERP_WEDNESDAY 485 // Wednesday
+#define MIR_INTERP_THURSDAY 486 // Thursday
+#define MIR_INTERP_FRIDAY 487 // Friday
+#define MIR_INTERP_SATURDAY 488 // Saturday
+#define MIR_INTERP_SUNDAY 489 // Sunday
+#define MIR_INTERP_NULL_FIELD_BAND 948 // Grid %1!%r! not written as it only contains null data.
+#define MIR_INTERP_INVALID_TAB_NOT_MAPPABLE_INTERNAL 949 // Non mappable TAB file %1!%r! is not supported.
+#define MIR_INTERP_INPUT_FILE_COUNT_ZERO 490 // Input file count is zero.
+#define MIR_INTERP_INPUT_DATAFORMAT_INVALID 491 // Input file data format is invalid.
+#define MIR_INTERP_INPUT_FILENAME_INVALID 492 // Input file name is invalid.
+#define MIR_INTERP_INPUT_ZIPFILE_INVALID 493 // Input ZIP file does not contain a valid input file format.
+#define MIR_INTERP_INPUT_DATAFIELD_COUNT_ZERO 494 // No data columns have been selected in the Input file.
+#define MIR_INTERP_OUTPUT_FILENAME_INVALID 495 // Output file name is invalid.
+#define MIR_INTERP_OUTPUT_RASTER_FORMAT_INVALID 496 // Output file raster format is invalid.
+#define MIR_INTERP_OUTPUT_DATATYPE_COUNT_ZERO 497 // Output file defined data type count is zero.
+#define MIR_INTERP_OUTPUT_DATATYPE_INVALID 498 // Output file defined data type is invalid.
+#define MIR_INTERP_OUTPUT_COORDSYS_INVALID 499 // Output file coordinate system is invalid.
+#define MIR_INTERP_GEOMETRY_CELLSIZE_INVALID 500 // Geometry cell size is invalid, must be greater than 0.
+#define MIR_INTERP_GEOMETRY_CELLCOUNT_INVALID 501 // Geometry cell count is invalid, must be greater than 0.
+#define MIR_INTERP_TRIANGULATION_PATCHMULTIPLIER_INVALID 502 // Triangulation patch multiplier is invalid.
+#define MIR_INTERP_TRIANGULATION_LONGTRIANGLE_INVALID 503 // Triangulation longest triangle is invalid.
+#define MIR_INTERP_IDW_RADIUSX_INVALID 504 // Inverse Distance Weighted radius X is invalid.
+#define MIR_INTERP_IDW_RADIUSY_INVALID 505 // Inverse Distance Weighted radius Y is invalid.
+#define MIR_INTERP_IDW_SEARCH_INCREMENT_INVALID 956 // Inverse Distance Weighted search increment is invalid, valid values are 1 or greater.
+#define MIR_INTERP_DISTANCE_RADIUSX_INVALID 506 // Distance radius X is invalid.
+#define MIR_INTERP_DISTANCE_RADIUSY_INVALID 507 // Distance radius Y is invalid.
+#define MIR_INTERP_DENSITY_RADIUSX_INVALID 508 // Density radius X is invalid.
+#define MIR_INTERP_DENSITY_RADIUSY_INVALID 509 // Density radius Y is invalid.
+#define MIR_INTERP_STAMP_METHOD_INVALID 510 // Stamp method is invalid.
+#define MIR_INTERP_MINCURV_RADIUS_INVALID 511 // Minimum Curvature radius is invalid.
+#define MIR_INTERP_CONTROL_FILE_INVALID 512 // Control file name is invalid.
+#define MIR_INTERP_X_INVALID 513 // The X column index is invalid.
+#define MIR_INTERP_Y_INVALID 514 // The Y column index is invalid.
+#define MIR_INTERP_GROUP_INVALID 515 // The Group column index is invalid.
+#define MIR_INTERP_X_Y_INVALID 516 // The X and Y column indexes are invalid, they cannot be the same.
+#define MIR_INTERP_X_GROUP_INVALID 517 // The X and Group column indexes are invalid, they cannot be the same.
+#define MIR_INTERP_Y_GROUP_INVALID 518 // The Y and Group column indexes are invalid, they cannot be the same.
+#define MIR_INTERP_DATA_INVALID 519 // The Data column index is invalid.
+#define MIR_INTERP_X_DATA_INVALID 520 // The X and Data column indexes are invalid, they cannot be the same.
+#define MIR_INTERP_Y_DATA_INVALID 521 // The Y and Data column indexes are invalid, they cannot be the same.
+#define MIR_INTERP_GROUP_DATA_INVALID 522 // The Group and Data column indexes are invalid, they cannot be the same.
+#define MIR_INTERP_DATA_INDEX_COUNT_INVALID 523 // The data column indexes are invalid. The input file and data index count mismatched, they need to be the same.
+#define MIR_INTERP_NEARFAR_LESS_THAN_ONE 524 // Near or Far clipping parameter invalid, must be 1 or greater.
+#define MIR_INTERP_INVALID_ASCII_FILE 525 // Invalid ASCII file format.
+#define MIR_INTERP_COORDINATE_CONDITIONING_INVALID 526 // Coordinate conditioning parameters are invalid.
+#define MIR_INTERP_DATA_CONDITIONING_INVALID 527 // Data conditioning parameters are invalid.
+#define MIR_INTERP_LASZIP_DLL_NOT_LOADED 528 // LASZip DLL was not loaded.
+#define MIR_INTERP_LASZIP_ERROR_READING_FILE 529 // An error occurred while reading the LASZip file.
+#define MIR_INTERP_NN_SEARCH_DISTANCE_INVALID 530 // Search distance should be greater than 0.
+#define MIR_INTERP_NNI_SEARCH_DISTANCE_INVALID 531 // Search distance should be greater than 0.
+#define MIR_INTERP_NNI_GAUSSIAN_RANGE_INVALID 532 // Gaussian range should be greater than 0.
+#define MIR_INTERP_INVALID_LAS 533 // Invalid LAS format header signature, file needs to be of type LASF.
+#define MIR_INTERP_INVALID_TAB 534 // Invalid TAB format.
+#define MIR_INTERP_NEARFAR_LESS_THAN_ZERO 535 // Near or Far clipping parameter invalid, must be greater than 0.
+#define MIR_INTERP_NEAR_GREATER_THAN_FAR 536 // Near or Far clipping parameter invalid, Near must be less than Far.
+#define MIR_INTERP_SMOOTHING_INVALID 537 // The Smoothing parameter is invalid.
+#define MIR_INTERP_PATCH_SIZE_INVALID 538 // Patch size for triangulation exceeds 44 million points, reduce cell size and try again.
+#define MIR_INTERP_DATA_TYPE_FOR_MIN_MAX_INVALID 539 // Column data type is invalid for minimum and maximum comparisons.
+#define MIR_INTERP_POLYGONFILE_INVALID 540 // The supplied polygon file for clipping is invalid.
+#define MIR_INTERP_CLIPPING_METHOD_INVALID 541 // The clipping method supplied is invalid for this interpolation method.
+#define MIR_INTERP_INVALID_TAB_NOT_MAPPABLE 950 // Non-mappable TAB files are not supported.
+#define MIR_INTERP_IDW_SECTOR_COUNT_INVALID 951 // Inverse Distance Weighted sector count is invalid, valid values are 1 to 32.
+#define MIR_INTERP_IDW_MIN_POINTS_INVALID 952 // Inverse Distance Weighted sector minimum points is invalid, valid values are 1 and greater.
+#define MIR_INTERP_IDW_MAX_POINTS_INVALID 953 // Inverse Distance Weighted sector maximum points is invalid, valid values are 1 and greater.
+#define MIR_INTERP_IDW_MIN_SECTORS_INVALID 954 // Inverse Distance Weighted sector minimum valid count is invalid, valid values are 1 and greater.
+#define MIR_INTERP_IDW_SECTOR_ORIENTATION_INVALID 955 // Inverse Distance Weighted sector orientation is invalid, valid values are 0 to 360.
+#define MIR_INTERP_LIDAR_CLASS_0 927 // Created, never classified
+#define MIR_INTERP_LIDAR_CLASS_1 928 // Unclassified
+#define MIR_INTERP_LIDAR_CLASS_2 929 // Ground
+#define MIR_INTERP_LIDAR_CLASS_3 930 // Low Vegetation
+#define MIR_INTERP_LIDAR_CLASS_4 931 // Medium Vegetation
+#define MIR_INTERP_LIDAR_CLASS_5 932 // High Vegetation
+#define MIR_INTERP_LIDAR_CLASS_6 933 // Building
+#define MIR_INTERP_LIDAR_CLASS_7 934 // Low Point (Low noise)
+#define MIR_INTERP_LIDAR_CLASS_8 935 // Model Key/Reserved
+#define MIR_INTERP_LIDAR_CLASS_9 936 // Water
+#define MIR_INTERP_LIDAR_CLASS_10 937 // Rail
+#define MIR_INTERP_LIDAR_CLASS_11 938 // Road Surface
+#define MIR_INTERP_LIDAR_CLASS_12 939 // Bridge Deck
+#define MIR_INTERP_LIDAR_CLASS_13 940 // Wire - Guard (Shield)
+#define MIR_INTERP_LIDAR_CLASS_14 941 // Wire - Conductor (Phase)
+#define MIR_INTERP_LIDAR_CLASS_15 942 // Transmission Tower
+#define MIR_INTERP_LIDAR_CLASS_16 943 // Wire-structure Connector (Insulator)
+#define MIR_INTERP_LIDAR_CLASS_17 944 // Bridge
+#define MIR_INTERP_LIDAR_CLASS_18 945 // High Point (High noise)
+#define MIR_INTERP_LIDAR_CLASS_19_63 946 // Reserved for ASPRS Definition
+#define MIR_INTERP_LIDAR_CLASS_64_255 947 // User defined
+#define MIR_CONTOUR_ELAPSED 542 // Elapsed time: %1!%r! s
+#define MIR_CONTOUR_VERIFY_INPUT 543 // Verifying input data sources...
+#define MIR_CONTOUR_NO_TEMP 544 // Error: The temporary file folder %1!%r! does not exist.
+#define MIR_CONTOUR_COORDSYS_FAILURE 545 // Failed to assign coordinate system to output.
+#define MIR_CONTOUR_MINIMUM_SUPPORT 546 // Minimum contour level could not be supported, modified from %1!%r! to %2!%r!.
+#define MIR_CONTOUR_MAXIMUM_SUPPORT 547 // Maximum contour level could not be supported, modified from %1!%r! to %2!%r!.
+#define MIR_CONTOUR_PREPARE2 548 // Preparing to contour...
+#define MIR_PLYGISE_GENERATING 549 // Generating polygons...
+#define MIR_CONTOUR_INVALID_EXTENTS 550 // Contouring extents are invalid.
+#define MIR_CONTOUR_REGION1 551 // Contouring region from (%1!%r!, %2!%r!) to (%3!%r!, %4!%r!)
+#define MIR_CONTOUR_REGION2 552 // Contouring region over (%1!%r!, %2!%r!) cells of dimension (%3!%r!, %4!%r!)
+#define MIR_CONTOUR_PHYSICAL_LOW2 553 // Warning: The available physical memory is low - performance may be affected.
+#define MIR_CONTOUR_2 554 // Generating contours...
+#define MIR_CONTOUR_FINALISED 555 // Finalized %1!%r! contours with %2!%r! in progress and %3!%r! deferred...
+#define MIR_PLYGISE_INPROGRESS 556 // Finalized %1!%r! polygons with %2!%r! in progress and %3!%r! deferred...
+#define MIR_CONTOUR_FINALISE_2 557 // Finalizing contours...
+#define MIR_PLYGISE_FINALISE 558 // Finalising polygons...
+#define MIR_CONTOUR_EXPORT_2 559 // Exporting contours...
+#define MIR_PLYGISE_EXPORT 560 // Exporting polygons...
+#define MIR_CONTOUR_EXPORT_3 561 // Exporting a total of %1!%r! contours.
+#define MIR_CONTOUR_EXPORT_MULT_1 562 // Multiple output contour files will be generated.
+#define MIR_CONTOUR_EXPORT_MULT_2 563 // A total of %1!%r! output contour files will be written.
+#define MIR_CONTOUR_EXPORT_OUTPUT 564 // Created output file %1!%r! (%2!%r! lines and %3!%r! points).
+#define MIR_CONTOUR_GENERATE_1 565 // Loaded command file: %1!%r!.
+#define MIR_CONTOUR_GENERATE_FAIL0 566 // No command line control file argument found.
+#define MIR_CONTOUR_GENERATE_FAIL1 567 // Failed to read supplied command file.
+#define MIR_CONTOUR_GENERATE_FAIL2 568 // Failed to verify input raster file.
+#define MIR_CONTOUR_GENERATE_FAIL3 569 // Failed to initialize operation.
+#define MIR_CONTOUR_GENERATE_FAIL4 570 // Failed to execute operation.
+#define MIR_CONTOUR_GENERATE_FAIL5 571 // Failed to finalize operation.
+#define MIR_CONTOUR_GENERATE_FAIL6 572 // Failed to export.
+#define MIR_CONTOUR_REMOVE_DUPLICATE 573 // Removing duplicate manual level %1!%r!
+#define MIR_CONTOUR_AREA_REMOVED 574 // Number of contours removed under %1!%f! in size = %2!%r!
+#define MIR_CONTOUR_NO_INPUT_FILE 575 // Unable to open input file for contouring.
+#define MIR_MINCONTOUR_GREATERTHAN_MAXCONTOUR 576 // The minimum contour value is greater than the maximum contour value.
+#define MIR_CONTOUR_COUNT_ZERO 577 // Zero contours have been generated, output file will not be created.
+#define MIR_CONTOUR_NO_MANUAL_LEVELS 578 // Level Type is set to manual but no manual levels have been provided.
+#define MIR_CONTOUR_RASTER_OPEN_FAILURE 579 // Failed to open raster.
+#define MIR_CONTOUR_STATS_FAILURE 580 // Failed to acquire raster statistics.
+#define MIR_CONTOUR_TAB_FAILURE 581 // TAB output failure.
+#define MIR_CONTOUR_INVALID_SPACING 582 // Contour spacing cannot be a negative value.
+#define MIR_CONTOUR_INVALID_LINESTYLE_NONE 583 // Contour line style pattern cannot be set to PAT_NONE or a negative value.
+#define MIR_CONTOUR_INVALID_MAJORSTEP 584 // Major step cannot be a negative value.
+#define MIR_CONTOUR_INVALID_BRUSHSTYLE_NONE 585 // Contour brush style pattern cannot be set to a negative value.
+#define MIR_CONTOUR_INVALID_MIN_AREA 586 // Minimum defined contour area cannot be negative.
+#define MIR_CONTOUR_DUPLICATE_LEVEL 587 // A duplicate contour level has been found, please remove any duplicated levels.
+#define MIR_CONTOUR_INVALID_LINEWIDTH 588 // Contour line width can only be set to 0 if line style pattern is set to PAT_HOLLOW.
+#define MIR_CONTOUR_NOMEM 589 // Memory failure occurred during contouring.
+#define MIR_CONTOUR_ERROR 590 // An error has occurred during contour processing.
+#define MIR_POLY_ERROR 591 // An error has occurred during polygon processing.
+#define MIR_CONTOUR_LOWERBOUND 592 // Lower_Bound
+#define MIR_CONTOUR_UPPERBOUND 593 // Upper_Bound
+#define MIR_CONTOUR_LEVEL 594 // Level
+#define MIR_CONTOUR_INDEX 595 // Index
+#define MIR_CONTOUR_CLASS 596 // Class
+#define MIR_CONTOUR_VALUE 597 // Value
+#define MIR_CONTOUR_LABEL 598 // Label
+#define MIR_CLASSLBL_FIELD_NOT_FOUND 599 // Class Label field not found in class table.
+#define MIR_CLASSID_FIELD_NOT_FOUND 600 // Class ID field not found in class table.
+#define MIR_COLOUR_PALETTE_NOTFOUND 601 // Failed to find color palette directory.
+#define MIR_LEGEND_GHX_MISSING 602 // There is no GHX file for this Raster.
+#define MIR_ERR_FIELD_TYPE_NOT_ALLOWED 603 // Field type is not allowed by the driver.
+#define MIR_ERR_LEGEND_INVALID_RENDER_STYLE 604 // Legend not supported for this render style.
+#define MIR_LEGEND_NO_INFLECTION_DATA 605 // There is no inflection data for this raster.
+#define MIR_WRITE_LEGEND_FAIL 606 // Failed to write legend file.
+#define MIR_NORELEASE 607 // Unable to release memory.
+#define MIR_TRACKER_CREATE_FAIL 608 // Memory allocation failure. Could not create a process tracker object.
+#define MIR_FILE_ABSPATH_ERROR 609 // Absolute path error.
+#define MIR_FILE_INVALID_EXTN 610 // Invalid file extension.
+#define MIR_LOCATION_OFF_GRID 611 // Location provided is outside the raster extents.
+#define MIR_INVALID_COMPRESSION 612 // An invalid compression method has been provided.
+#define MIR_INVALID_FINALISE_ARGS 613 // Invalid finalization option.
+#define MIR_READ_CONFIG_FAIL 614 // Failed to read configuration file.
+#define MIR_FAIL_EXTRACT_FNAME 615 // Unable to extract file name from the given file.
+#define MIR_BEGIN_INTERP_FAILED 616 // Unable to start interpolator.
+#define MIR_TABLE_UNAVAILABLE 617 // Invalid input table.
+#define MIR_INVALID_RECORD 618 // An invalid table record index has been passed.
+#define MIR_EDIT_PROPERTY_NOT_SUPPORTED 619 // Editing the raster property is not supported.
+#define MIR_EDIT_PROPERTY_INVALID_VALUE 620 // Invalid property value.
+#define MIR_EDIT_PROPERTY_NOT_FOUND 621 // No property found to edit.
+#define MIR_CONTOUR_INVALID_MANUAL_LEVEL_NULL 622 // Number of manual levels is greater than zero but the manual level array has not been initialized.
+#define MIR_INVALID_FIELD_BAND_FILTER 623 // Invalid Field and Band filter for current operation.
+#define MIR_CONTOUR_SUGGESTED_REGION_SIZE 624 // Sub-region size is too small. Suggested sub-region size is X=%1!%r! Y=%2!%r!.
+#define MIR_CONTOUR_REGION_SIZE_TOO_SMALL 625 // Sub-region size is too small, increase the sub-region size.
+#define MIR_CONTOUR_CELLCOUNT_ZERO 626 // Cell count to contour is zero.
+#define MIR_CONTOUR_BLOCK_ERROR 627 // Block %1!%r! error: %2!%r!
+#define MIR_CONTOUR_BLOCK_PROCESS 628 // Processing block %1!%r! of %2!%r! for cell indexes (%3!%r!,%4!%r! to %5!%r!,%6!%r!) %7!%r!
+#define MIR_CONTOUR_CREATING_SEAMLESS 629 // Creating seamless table: %1!%r!
+#define MIR_CONTOUR_SEAMLESSTAB_FAILURE 630 // Seamless TAB output failure.
+#define MIR_CONTOUR_CREATED_SEAMLESS 631 // Created seamless table: %1!%r!
+#define MIR_RESOLUTION_RANGE_UNAVAILABLE 632 // Unable to retrieve resolution range for the raster file.
+#define MIR_FAIL_EPSG_NOTFOUND 633 // EPSG code matching MapInfo projection string not found.
+#define MIR_StatisticsFail 634 // Statistics failure.
+#define MIR_CLIPRECT_NO_OVERLAP 635 // No overlap found between raster and clip extent.
+#define MIR_DRIVER_NO_MULTI_FIELD_SUPPORT 636 // Selected driver does not provide Multi-field support for output.
+#define MIR_ALL_BANDS_SAME_TYPE 637 // Field type must match for all input rasters selected.
+#define MIR_CONTOUR_FIELD_INVALID 638 // Specified input Field does not exist.
+#define MIR_CONTOUR_BAND_INVALID 639 // Specified input Band does not exist.
+#define MIR_CONTOUR_VERIFY_INPUT_FAILURE 640 // Verify input file failure.
+#define MIR_CONTOUR_NO_OUTPUT_FOLDER 641 // The output grid file folder does not exist.
+#define MIR_CONTOUR_LOW_MEMORY 642 // Contouring is experiencing low memory. Adjust parameters and try again.
+#define MIR_FAIL_WRITE_STRUCTURE 643 // Unable to write structure.
+#define MIR_SAME_RASTER_TAB 644 // Input Raster's TAB file and Output Vector TAB file are at same location with same Name.
+#define MIR_FILTER_ONLY_SUPPORTS_ODD_KERNEL_ROW_COL 645 // Filter only supports odd numbers of rows and columns in the kernel.
+#define MIR_CLASSIFIED_FILTER_MIN_REGION_SIZE_TOO_LARGE 646 // The minimum region size for the classified filter is too large.
+#define MIR_NO_POINT_OBJECTS_FOUND 647 // No point objects found in Input vector file.
+#define MIR_ONLY_CONTINOUS_CLASSIFIED_SUPPORTED 648 // Field type is not valid, only Continuous and Classified fields allowed.
+#define MIR_IMPORT_DRIVER_NO_MULTI_BAND_SUPPORT 649 // Selected Driver doesn't provide Multi-band Support to Import.
+#define MIR_FILE_ACCESS_ERROR 650 // The file is not present or the user does not have access permission.
+#define MIR_SAME_SOURCE_DESTINATION 651 // Input and output file names are same.
+#define MIR_INVALID_VECTOR_FILE 652 // Invalid vector file.
+#define MIR_INVALID_CELLSIZE 653 // Invalid cell size.
+#define MIR_SOURCE_ORIGIN_NOT_VALID_CELL 654 // Source origin not over a valid cell, so height cannot be determined.
+#define MIR_DEST_ORIGIN_NOT_VALID_CELL 655 // Destination origin not over a valid cell, so height cannot be determined.
+#define MIR_MERGE_INCOMPATIBLE_GRIDS 656 // Input rasters are not compatible for merge operation.
+#define MIR_MRT_NOT_SUPPORTED 657 // Multi-resolution output is not supported by selected output driver.
+#define MIR_FAIL_SET_TABLE_RECORD 658 // Unable to set classification table record.
+#define MIR_INVALID_BANDED_AND_NONBANDED_COMBINATION 659 // You cannot mix banded and non-banded notation for the same raster/field in an expression.
+#define MIR_RASTER_FORMAT_ONLY_SINGLE_BANDED 660 // Raster format does not support multiple bands.
+#define MIR_START_FILE_OPEN_S 661 // Opening file %1!%r!.
+#define MIR_CLASSIFIED_OUTPUT_NOT_VALID 662 // Classified raster output is not supported for the specified parameters.
+#define MIR_GRIDS_DO_NOT_OVERLAP 663 // Source rasters do not overlap.
+#define MIR_CLASSIFIED_RASTERS_CAN_NOT_HAVE_MULTIPLE_BANDS 664 // Cannot create a classified raster with multiple bands.
+#define MIR_INVALID_MULTIBAND_CONTINUOUS_TO_IMAGE_INVALID 665 // You cannot convert a multi-band continuous raster directly to an image raster. Try using the individual bands.
+#define MIR_TOO_MANY_CALCULATOR_EXPRESSIONS 666 // You cannot have more calculator expressions than there are bands.
+#define MIR_WRONG_NUMBER_OF_CALCULATOR_EXPRESSIONS 667 // There must either be one expression or one expression for each band.
+#define MIR_CALCULATING 668 // Calculate operation started.
+#define MIR_BEGIN_INTERPOLATE_FAILED 669 // Failure while creating interpolator.
+#define MIR_CALCULATING_COMPLETE_S 670 // Calculating %1!%r!% complete.
+#define MIR_CREATING_FILE_S 671 // Creating output file %1!%r!.
+#define MIR_CALCULATE_COMPLETED 672 // Calculate operation completed successfully.
+#define MIR_VALID_EXPRESSION 673 // Valid expression.
+#define MIR_TOO_MANY_RASTER_ALIASES 674 // Too many raster aliases.
+#define MIR_OPERATION_STARTED_S 675 // %1!%r! operation started.
+#define MIR_CLIP_RASTER_TO_RASTER_OPERATION_NAME 676 // Clip raster to raster
+#define MIR_OPERATION_ENDED_S 677 // %1!%r! operation ended.
+#define MIR_CORDSYS_UNAVAILABLE 678 // Coordinate system is unavailable.
+#define MIR_CLIP_STARTED 679 // Clip operation started.
+#define MIR_INPUT_POLY_BOUNDS 680 // Input polygon world space clip bounds MinX: %1!%g! MaxX: %2!%g! MinY: %3!%g! MaxY: %4!%g!.
+#define MIR_INPUT_CELL_BOUNDS 681 // Input polygon Cell space clip bounds MinX: %1!%r! MaxX: %2!%r! MinY: %3!%r! MaxY: %4!%r!.
+#define MIR_INPUT_POLY_RETAIN 682 // Retain Inside Polygon: %1!%r!.
+#define MIR_CLIP_COMPLETED 683 // Clip operation completed successfully.
+#define MIR_VEC_FEATURE_NOTFOUND 684 // No supported vector feature found.
+#define MIR_TPIP_FAIL_ALLOCATE 685 // TPIP error, failed to allocate memory.
+#define MIR_TPIP_FAIL_PROCESS 686 // TPIP processing failed.
+#define MIR_SET_RANDOM_BLOCK_FAILED 687 // Failed to set Random Block.
+#define MIR_GET_RANDOM_BLOCK_FAILED 688 // Failed to get Random Block.
+#define MIR_CLIP_COMPLETE_S 689 // Clipping %1!%r!% complete.
+#define MIR_DRIVER_NO_MULTI_BAND_SUPPORT 690 // Selected driver does not provide Multi-band support to output.
+#define MIR_ALL_FIELDS_PROJECTION_NOT_MATCHING 691 // Projection must match for all selected rasters.
+#define MIR_ERR_MULTIPLE_NONCONTINUOUS 692 // Multiple non-continuous fields are not allowed in the same field.
+#define MIR_ALL_BANDS_CELLSIZE_MUST_MATCH 693 // Field Cell size must match for all input rasters selected.
+#define MIR_ALL_BANDS_TILEORIGIN_MUST_MATCH 694 // Field Origin must match for all input rasters selected.
+#define MIR_POPULATEDATA_FIELDID_D 695 // Populating data into destination raster fieldIndex: %1!%r!.
+#define MIR_MATCH_INPUT_GEOMTRY 696 // Verifying compatibility of all input raster's geometry.
+#define MIR_COMBINE_STARTED 697 // Combine operation Started.
+#define MIR_POPULATERASTER_DATA 698 // Populating data in destination raster.
+#define MIR_WRITING_OUTPUT_RASTER_S 699 // Start creating %1!%r! output raster file.
+#define MIR_COMBINE_COMPLETED 700 // Combine operation completed successfully.
+#define MIR_DIRECTORY_NOT_WRITEABLE 701 // Directory is not writable.
+#define MIR_COPY_RASTER 702 // Copy Operation Started.
+#define MIR_COPYING_FILE_S 703 // Copying %1!%r! and associated files.
+#define MIR_COPY_FAIL 704 // Failed to copy file.
+#define MIR_COPY_COMPLETED 705 // Copy operation completed successfully.
+#define MIR_DELETE_START 706 // Delete operation started.
+#define MIR_DELETE_RASTER 707 // Deleting raster file...
+#define MIR_DELETING_FILE_S 708 // Deleting %1!%r! and associated files.
+#define MIR_DELETE_FAIL1 709 // Not able to delete file %1!%r! error code: %2!%r!.
+#define MIR_DELETE_FAIL2 710 // Not able to delete file %1!s !with extension %2!%r! from Destination Directory %3!%r!.
+#define MIR_DELETE_ASSOCIATED 711 // Deleting associated files...
+#define MIR_DELETE_FAIL3 712 // Not able to delete file %1!%r! with extension %2!%r! error code: %3!%r!.
+#define MIR_DELETE_COMPLETED 713 // Delete operation completed successfully.
+#define MIR_RENAME_START 714 // Rename operation started.
+#define MIR_RENAME_FAIL1 715 // Not able to rename file %1!%r! to %2!%r!.
+#define MIR_NOT_SUPPORTED 716 // Not a supported operation.
+#define MIR_RENAMING_FILE_S 717 // Renaming %1!%r! and associated files.
+#define MIR_RENAME_FAIL2 718 // Not able to rename file %1!%r! with extension %2!%r! to %3!%r!.
+#define MIR_RENAME_COMPLETED 719 // Rename operation completed successfully.
+#define MIR_EXPORT_START 720 // Export operation started.
+#define MIR_OUTPUT_EXISTS2 721 // Output File %1!%r! exists, exiting as overwrite flag is false.
+#define MIR_EXPORT_STARTED 722 // Grid Export operation started.
+#define MIR_EXPORT_COMPLETED 723 // Grid Export operation completed successfully.
+#define MIR_INVALID_DELIMITER 724 // An invalid delimiter (like '.') has been provided.
+#define MIR_EXPORTTOASCII_COMPLETE_S 725 // Export to ASCII %1!%r!% complete.
+#define MIR_EXPORTTOTAB_COMPLETED 726 // Export to TAB file operation is completed.
+#define MIR_FAIL_COLOR_INFO 727 // Failed to get Color Information for this Raster.
+#define MIR_FILE_NOT_EXIST 728 // File does not exist.
+#define MIR_ELLIS_INIT_FAIL 729 // Ellis Initialization failed.
+#define MIR_COORDSYS_NOT_PRESENT 730 // CoordSys not present in input file, Using CoordSys supplied by user.
+#define MIR_EXPORTTOTAB_MEM_FAIL 731 // Operation may fail because of insufficient memory to Run.
+#define MIR_NATIVE_TAB_LIMIT 732 // TAB file creation will fail because of size restriction. Setting it to Extended TAB format.
+#define MIR_TAB_METADATA_FAIL 733 // Failed to set Table Meta Data.
+#define MIR_CREATE_TAB_FAIL 734 // Failed to create the TAB file.
+#define MIR_INSERT_TAB_FAIL 735 // Failed to insert object into the TAB file.
+#define MIR_EXPORTTOTAB_COMPLETE_S 736 // Export to TAB %1!%r!% complete.
+#define MIR_INVALID_OUTPUT_FIELD_TYPE 737 // Invalid output field type.
+#define MIR_FILTERING 738 // Filter operation started.
+#define MIR_FILTERING_COMPLETE_S 739 // Filtering %1!%r!% complete.
+#define MIR_FILTER_COMPLETED 740 // Filter operation completed successfully.
+#define MIR_FAIL_READ_KERNEL_FILE 741 // Failed to process input kernel file.
+#define MIR_INVALID_EXPORT_FILE 742 // Input file is not a valid exported file. Please add the standard header before proceeding.
+#define MIR_INVALID_EXPORT_FILE_VERSION 743 // Input file is not a valid exported file. Please add the standard header version before proceeding.
+#define MIR_INVALID_RASTER_SIZE 744 // Input file does not have valid rows and columns in header.
+#define MIR_IMPORT_START 745 // Import operation started.
+#define MIR_IMPORT_DRIVER_NO_MULTI_FIELD_SUPPORT 746 // Selected Driver doesn't provide Multi-field Support to Import.
+#define MIR_IMPORT_STARTED 747 // Grid Import operation started.
+#define MIR_IMPORT_COMPLETE_S 748 // Importing %1!%r!% complete.
+#define MIR_IMPORT_COMPLETED 749 // Grid Import operation completed successfully.
+#define MIR_COMP_STATS 750 // GetComputeStats:
+#define MIR_COMP_STAT_VAL 751 // Val: %1!%f! IsValid: %2!%r!
+#define MIR_INVALID_ARG_REQD_STAT_MISSING 752 // Select at least one statistics attribute.
+#define MIR_UNDEFINED_UNITCODE 753 // Input raster's unit code is not defined.
+#define MIR_WARN_RASTER_COORDSYS 754 // Warning! coordinate system is not present in the raster file %1!%r!, assuming its coordinate system is the same as the input vector file.
+#define MIR_COMP_POINTS 755 // GridPointsValues (x,y)
+#define MIR_COMP_POINTS_VAL 756 // Point[%1!%g!, %2!%g!]
+#define MIR_LINE_INSPECTION_START 757 // Line Inspection operation started.
+#define MIR_START_READ_VECTOR_FILE_S 758 // Start reading %1!%r! vector file.
+#define MIR_READFAIL 759 // Unable to read file.
+#define MIR_END_READ_VECTOR_FILE 760 // Vector file reading completed.
+#define MIR_NO_LINE_OBJECTS_FOUND 761 // No line objects found in input vector file.
+#define MIR_N_VECTOR_OBJECTS_FOUND_D_S 762 // %1!%r! %2!%r! objects found in input vector file.
+#define MIR_BEGIN_LINE_INSPECTION 763 // Line Inspection started for %1!%r!.
+#define MIR_END_LINE_INSPECTION 764 // Line inspection completed for %1!%r!.
+#define MIR_OUTPUT_VECTOR_WRITE_FAIL 765 // Unable to create output Tab file.
+#define MIR_LINE_INSPECTION_COMPLETED 766 // Line Inspection operation completed successfully.
+#define MIR_NONSPATIAL_UNITCODE 767 // Unit code is not a valid spatial unit code.
+#define MIR_SAMPLE_POINT_GENERATE_D 768 // Generating %1!%r! sample points between view points.
+#define MIR_LINEOFSIGHT_OPERATION_NAME 769 // Line of sight
+#define MIR_OPERATION_COMPLETE_S 770 // %1!%r! operation completed successfully.
+#define MIR_FAIL_READ_STRUCTURE 771 // Unable to read structure.
+#define MIR_FAIL_RELEASE_RESOURCE 772 // Failed to release the resource.
+#define MIR_MERGE_PREPROC_INPUT_GRIDS 773 // Pre-processing input rasters to merge...
+#define MIR_MERGE_PREPROC_S 774 // Pre-processing raster %1!%r!
+#define MIR_MERGE_INCOMPATIBLE_FIELDTYPE_S 775 // Incompatible Field type detected in the source raster %1!%r!.
+#define MIR_MERGE_INCOMPATIBLE_BANDCOUNT_S 776 // Incompatible Band count detected in the source raster %1!%r!.
+#define MIR_MERGE_INCOMPATIBLE_CORDSYS_S 777 // Incompatible coordinate system detected in the source raster %1!%r!.
+#define MIR_MERGE_MRT_NONSQUARE_CELL_S 778 // Non-square cells are not supported for multi-resolution output. Choose a source raster with square cells %1!%r!.
+#define MIR_MERGE_PREPROC_UPDATE_S 779 // Merge pre-processing %1!%r!% complete.
+#define MIR_MERGERECT_NO_OVERLAP 780 // No overlap found between merge rectangle and the union of input rasters' bound.
+#define MIR_MERGE_PREPROC_COMPLETE 781 // Merge pre-processing of input rasters completed.
+#define MIR_MERGE_STARTED 782 // Merge operation started.
+#define MIR_MERGE_PROC_UPDATE_S 783 // Merge data processing %1!%r!% completed.
+#define MIR_MERGE_COMPLETED 784 // Merge operation completed successfully.
+#define MIR_GET_INTERP_BLOCK_FAILED 785 // Failed to interpolate data block.
+#define MIR_CSYS_NULL 786 // CSYS is Null in Input vector and raster.
+#define MIR_DUP_COLNAME 787 // Column name should be unique. %1!%r! column name exists in input TAB or input column list
+#define MIR_BAD_COLNAME 788 // Column name:%1!%r!, doesn't exists in input TAB
+#define MIR_INVALID_COLNAME 789 // Invalid Column name: %1!%r!. Column name should not be more than 30 char with no spaces and special char.
+#define MIR_COL_DATATYPE_NOT_ALLOWED 790 // %1!%r! column data type is incompatible with band data type or the null/no cell values
+#define MIR_VECTOR_MODIFY_FAIL 791 // Vector file modification failure.
+#define MIR_COLINFO_NULL 792 // Output TAB column info is Null
+#define MIR_MISSING_COLINFO 793 // Missing Column info. Output TAB column info should be given for all input raster
+#define MIR_INVALID_DEST 794 // Incorrect destination TAB path
+#define MIR_POINT_INSPECTION_START 795 // Point Inspection operation started.
+#define MIR_XYBLOCK_COUNT_D_D 796 // Running operation on total %1!%r! XBlocks %2!%r! YBlocks.
+#define MIR_BLOCK_SIZE_G_G_G_G 797 // Current block size dMinX=%1!%g! dMaxX=%2!%g! dMinY=%3!%g! dMaxY=%4!%g!.
+#define MIR_READ_OBJECTS_VECTOR_S 798 // Reading objects from input vector file %1!%r!.
+#define MIR_READ_CELLVALUE_RASTER_VECTOR_S 799 // Reading cell values from input raster %1!%r!.
+#define MIR_MODIFY_RECORDS_VECTOR 800 // Modifying records in output vector.
+#define MIR_POINT_INSPECTION_COMPLETED 801 // Point Inspection operation completed successfully.
+#define MIR_PROCESSING_TASK1 802 // Input source file path: %1!%r!.
+#define MIR_PROCESSING_TASK2 803 // Output file path: %1!%r!.
+#define MIR_PROCESSING_TASK3 804 // Destination driver string: %1!%r!.
+#define MIR_PROCESSING_TASK4 805 // Finalize options delete: %1!%r! Discard: %2!%r! BuildOverViews: %3!%r! ComputeStats %4!%r!, StatsLevel %5!%r!.
+#define MIR_PROCESSING_TASK5 806 // Operation going to be performed: %1!%r!.
+#define MIR_REPROJECT_ERR_INPUT_COORDSYS_NOT_FOUND 807 // Input raster can not be re-projected, no coordinate system found in input raster.
+#define MIR_INVALID_PROJECTION_COMBINATION 808 // The selected projection/reprojection combination is not valid for this data.
+#define MIR_REPROJECT1 809 // Source raster CoordSys: [%1!%r!].
+#define MIR_REPROJECT2 810 // Destination raster requested CoordSys: [%1!%r!].
+#define MIR_REPROJECT3 811 // OldMinX: %1!%g! OldMinY: %2!%g! OldMaxX: %3!%g! OldMaxY: %4!%g!.
+#define MIR_REPROJECT4 812 // NewCellSize: %1!%g! nNewColumns: %2!%r! nNewRows: %3!%r! NewMinX: %4!%g! NewMinY: %5!%g! NewMaxX: %6!%g! NewMaxY: %7!%g!.
+#define MIR_REPROJECT_STARTING 813 // Reproject operation started.
+#define MIR_REPROJECT_COMPLETE_S 814 // Reprojecting %1!%r!% complete.
+#define MIR_REPROJECT_COMPLETED 815 // Reproject operation completed successfully.
+#define MIR_RESAMPLE_COMPLETE_S 816 // Resampling %1!%r!% complete.
+#define MIR_RESAMPLE_STARTED 817 // Resample operation started.
+#define MIR_RESAMPLE_COMPLETED 818 // Resample operation completed successfully.
+#define MIR_SLOPE_STARTED 819 // Slope operation started.
+#define MIR_SLOPE_COMPLETE_S 820 // Slope %1!%r!% complete.
+#define MIR_SLOPE_COMPLETED 821 // Slope operation completed successfully.
+#define MIR_ASPECT_STARTED 822 // Aspect operation started.
+#define MIR_ASPECT_COMPLETE_S 823 // Aspect %1!%r!% complete.
+#define MIR_ASPECT_COMPLETED 824 // Aspect operation completed successfully.
+#define MIR_CURVATURE_STARTED 825 // Curvature operation started.
+#define MIR_CURVATURE_COMPLETE_S 826 // Curvature %1!%r!% complete.
+#define MIR_CURVATURE_COMPLETED 827 // Curvature operation completed successfully.
+#define MIR_VEC_FIELD_TYPE_NOTSUPPORTED 828 // Vector field type is not supported by this operation.
+#define MIR_INVALID_VEC_FIELD_INDEX 829 // Invalid vector field index.
+#define MIR_VECTORTOGRID_INVALID_FOREGROUNDTYPE 830 // Incompatible foreground value type specified.
+#define MIR_VEC2GRID_PREPROC_INPUT_VECTOR 831 // Pre-processing input vector file...
+#define MIR_VEC2GRID_PREPROC_COMPLETED 832 // Completed pre-processing input vector file.
+#define MIR_VEC2GRID_STARTED 833 // Rasterize operation started.
+#define MIR_VEC2GRID_PROC_UPDATE_S 834 // Rasterize processing %1!%r!% complete..
+#define MIR_VEC2GRID_COMPLETED 835 // Rasterize operation completed successfully.
+#define MIR_VECTOR_TO_GRID1 836 // Start Load %1!%r!/%2!%r! :
+#define MIR_VECTOR_TO_GRID2 837 // End Load %1!%r!/%2!%r! : %3!%r!
+#define MIR_VECTOR_TO_GRID3 838 // Start Process %1!%r!/%2!%r! :
+#define MIR_VECTOR_TO_GRID4 839 // End Process %1!%r!/%2!%r! :
+#define MIR_VECTOR_TO_GRID5 840 // Start Block Write %1!%r!/%2!%r! : %3!%r!
+#define MIR_VECTOR_TO_GRID6 841 // End Block Write %1!%r!/%2!%r! :
+#define MIR_VECTOR_TO_GRID7 842 // End Load %1!%r!/%2!%r! : %3!%r! %4!%r!
+#define MIR_VECTOR_TO_GRID8 843 // Starting Chunk %1!%r!/%2!%r! :
+#define MIR_VECTOR_TO_GRID9 844 // Chunk size %1!%r!/%2!%r! :
+#define MIR_VECTOR_TO_GRID10 845 // Failed AddPoly %1!%r! :
+#define MIR_VECTOR_TO_GRID11 846 // Failed Process %1!%r! :
+#define MIR_VECTOR_TO_GRID12 847 // Succeed Process %1!%r!/%2!%r! : %3!%r!/%4!%r!
+#define MIR_VECTORTOGRID_NO_GEOMS_FOUND 848 // No supported geometry found to rasterize.
+#define MIR_INVALID_FILE 849 // Unable to verify file.
+#define MIR_VIEWSHED_INVALID_RADIUS 850 // Viewshed radius must be greater than or equal to cell size.
+#define MIR_VIEWSHED_INVALID_VIEWPOINTHEIGHT 851 // Viewpoint height must be positive.
+#define MIR_VIEWSHED_INVALID_SWEEP 852 // Invalid sweep angle/azimuth parameters
+#define MIR_VIEWSHED_INVALID_FILTER 853 // Invalid viewshed filter size.
+#define MIR_VIEWSHED_INVALID_CLASSIFICATION 854 // Invalid viewshed classification.
+#define MIR_VIEWSHED_INVALID_EARTHCURVATURE 855 // Invalid viewshed earth curvature.
+#define MIR_VIEWSHED_INVALID_TOWER_AREA 856 // Invalid viewshed tower area. Check coordinate systems.
+#define MIR_VIEWSHED_COMPLEX_CALC_NOT_SUPPORTED_FOR_MULTI_TILE_RASTERS 857 // The viewshed complex calculation option is not supported for multi-tile rasters.
+#define MIR_GENERATING_VIEWSHED 858 // Viewshed operation started.
+#define MIR_VIEWSHED_ORIGIN_IS_NOT_OVER_A_VALID_CELL 859 // Viewshed origin is not over a valid cell, so height cannot be determined.
+#define MIR_VIEWSHED_COMPLETE_S 860 // Viewshed %1!%r!% complete.
+#define MIR_VIEWSHED_WRITING_UNPROCESSED_TILES 861 // Writing unprocessed tiles.
+#define MIR_VIEWSHED_COMPLETED 862 // Viewshed operation completed successfully.
+#define MIR_TABLE_ACCESS_ERROR 863 // An error occurred accessing the table.
+#define MIR_HORIZONTAL_UNIT_MISMATCH 864 // Raster's horizontal unit code must be same.
+#define MIR_VERTICAL_UNIT_MISMATCH 865 // Raster's vertical unit code must be same.
+#define MIR_VOLUME_OUTPUT_UNIT_UNDEFINED 866 // Not able to deduce the output unit, define a valid output unit.
+#define MIR_VOLUME_PLANE_D 867 // Computing Volume of the raster against constant plane %1!%f!.
+#define MIR_VOLUME_SECONDARY_RASTER_S 868 // Computing Volume of the raster against secondary raster %1!%r!.
+#define MIR_RASTERVOLUME_OPERATION_NAME 869 // Raster volume
+#define MIR_VOLUME_OUTPUT 870 // Computed volume is %1!%.4f! and cell count is %2!%r!.
+#define MIR_XSection_DISTANCE_LT_BASERES 871 // Warning: Calculated distance between points is less than the base resolution cell size.
+#define MIR_XSection_DISTANCE_SAMPLES_F_D 872 // Computing cross section with %1!%f! distance between points and %2!%r! total samples ...
+#define MIR_CROSS_SECTION_START 873 // Cross Section operation started.
+#define MIR_COMPUTE_XSECTION 874 // Computing cross section for all lines...
+#define MIR_START_CREATE_VECTOR_FILE_S 875 // Start creating %1!%r! output vector file.
+#define MIR_END_CREATE_VECTOR_FILE 876 // Vector file creation completed.
+#define MIR_XSECTION_COMPLETED 877 // Cross Section operation completed successfully.
+#define MIR_ONLY_CONTINOUS_CLASSIFIED_IMAGE_SUPPORTED 878 // Field type is not valid, only Continuous, Classified and Image fields allowed.
+#define MIR_INPUT_VECTOR 879 // Input vector File Path: %1!%r!.
+#define MIR_INPUT_SOURCE 880 // Input Source File Path [%1!%r!]: %2!%r!.
+#define MIR_OUTPUT_VECTOR 881 // Output vector File Path: %1!%r!.
+#define MIR_OPERATION_PERFORMED 882 // Operation going to be performed: %1!%r!.
+#define MIR_REGION_INSPECTION_START 883 // Region Inspection operation started.
+#define MIR_NO_POLYGON_OBJECTS_FOUND 884 // No polygon objects found in Input vector file.
+#define MIR_BEGIN_REGION_INSPECTION 885 // Region inspection started for %1!%r!
+#define MIR_END_REGION_INSPECTION 886 // Region inspection completed for %1!%r!.
+#define MIR_REGION_INSPECTION_COMPLETED 887 // Region Inspection operation completed successfully.
+#define MIR_BEGIN_GRID_REGION_INSPECTION 888 // Begin region inspection %1!%r!
+#define MIR_END_GRID_REGION_INSPECTION 889 // End region inspection %1!%r!
+#define MIR_BEGION_REGION_STATS_COMPUTE 890 // Begin region statistics computation %1!%r!
+#define MIR_END_REGION_STATS_COMPUTE 891 // End region statistics computation %1!%r!
+#define MIR_INVALID_BIN_COUNT 892 // Invalid Number of Bins specified.
+#define MIR_INVALID_CLASSIFICATION_TYPE 893 // Invalid classification type. Reclassify operation not allowed.
+#define MIR_REQD_CLASS_NAME_MISSING 894 // Required class name missing from input or output classification info.
+#define MIR_INVALID_CLASS_VALUE 895 // Output class value is out of range. Maximum allowed value is 65535.
+#define MIR_INVALID_CLASSIFICATION_RANGE 896 // The classification info range is incorrect, lower bound greater than or equal to upper bound.
+#define MIR_FAIL_CLASSIFY 897 // Failed to classify grid.
+#define MIR_INVALID_CLASSIFICATION_RANGE_OVERLAP 898 // The classification ranges are overlapping.
+#define MIR_CLASSIFY_STARTED 899 // Classify operation started.
+#define MIR_CLASSIFY_COMPLETE_S 900 // Classifying %1!%r!% complete.
+#define MIR_CLASSIFY_COMPLETE 901 // Classify operation completed successfully.
+#define MIR_DUPLICATE_CLASS_VALUE 902 // Duplicate input class value are not allowed.
+#define MIR_COMPUTE_STATS_COMPLETE_S 903 // Computing statistics %1!%r!% completed.
+#define MIR_Align_Incompatible 904 // Input raster is incompatible to align with primary raster.
+#define MIR_RES_INSIDE 905 // Visible
+#define MIR_RES_OUTSIDE 906 // Invisible
+#define MIR_RES_FRINGE 907 // Fringe
+#define MIR_RES_TRUE 908 // True
+#define MIR_RES_FALSE 909 // False
+#define MIR_RES_NULL 910 // Null
+#define MIR_RES_OFFGRID 911 // Off Raster
+#define MIR_RES_POINTS 912 // point
+#define MIR_RES_LINE 913 // lines
+#define MIR_RES_REGIONS 914 // region
+#define MIR_RES_NOCELL 915 // No Cell
+#define MIR_RES_INVALID 916 // Invalid
+#define MIR_RES_VISIBLE 917 // Visible
+#define MIR_RES_DISTANCE 918 // Distance
+#define MIR_RES_OFFSETREQUIRED 919 // OffsetRequired
+#define MIR_RES_NUM_VISIBLE 920 // NumVisible
+#define MIR_RES_XML_READ_FAIL 921 // XMLReadFail
+#define MINT_RRENDER_NOLAYERTYPE 922 // Rendering failure. A layer has no defined type.
+#define MINT_RRENDER_NOCOMPTYPE 923 // Rendering failure. A component has no defined type.
+#define MINT_RRENDER_ALGINVALID 924 // Rendering failure. The algorithm has been incorrectly defined.
+#define MINT_RRENDER_ALGFAIL 925 // Rendering failure. The algorithm failed.
+#define MINT_RENDER_FAIL_BADSCENE 984 // Rendering failure. Bad scene parameters supplied.
+#define MINT_RENDER_FAIL_BADCOLORTYPE 985 // Rendering failure. Bad color type supplied.
+#define MINT_RENDER_FAIL_NOCONTEXT 986 // Rendering failure. Rendering context is invalid or does not exist.
+#define MINT_RENDER_FAIL_BADBUFFER 987 // Rendering failure. Bad memory buffer supplied.
+#define MINT_RENDER_FAIL_ALGDISABLED 988 // Rendering failure. The algorithm is disabled.
+#define MINT_ALGBLD_FAIL_XMLENCODE 972 // Failed to encode information to XML.
+#define MINT_ALGBLD_FAIL_NOALG 973 // Error. No algorithm defined.
+#define MINT_ALGBLD_FAIL_NOLAY 974 // Error. No layer defined.
+#define MINT_ALGBLD_FAIL_NOCPT 975 // Error. No component defined.
+#define MINT_ALGBLD_FAIL_NORASSRC 976 // Error. No raster source defined.
+#define MINT_ALGBLD_FAIL_NOCOLTAB 977 // Error. No color table defined.
+#define MINT_ALGBLD_FAIL_NODATTRAN 978 // Error. No data transform defined.
+#define MINT_ALGBLD_FAIL_NOCOLDATCOND 979 // Error. No data conditioning defined.
+#define MINT_ALGBLD_FAIL_NORASSRCFILE 980 // Error. Invalid file index.
+#define MINT_ALGBLD_FAIL_NOCOLTABCOL 981 // Error. Invalid color index.
+#define MINT_ALGBLD_FAIL_NODATTRANIND 982 // Error. Invalid data index.
+#define MINT_ALGBLD_FAIL_NOCOLDATCONDIND 983 // Error. Invalid data index.
+#define MINT_ALGBLD_FAIL_GHX 989 // Error. Could not interpret the GHX file.
+#define MINT_ALGBLD_FAIL_BADLAYTYPE 990 // Error. Layer type is not defined.
+#define MINT_ALGBLD_FAIL_BADCMPTYPE 992 // Error. Component type is not defined.
+#define MINT_ALGBLD_FAIL_NOLAYER 991 // Error. No renderable layers are defined.
+#define MIR_RESP_COLNAME_VALIDATE_FAIL 957 // Column name validation failed, column name should be unique.
+#define MIR_POLYGONISE_IMAGERY_NOT_SUPORTED 958 // Imagery field type is not supported for the selected polygonise mode.
+#define MIR_DUPLICATE_CLASS_VALUE_COLOR 959 // Output class values should have unique color values.
+#define MINT_SUGGESTINFO_FAIL 960 // Unable to Suggest Raster Info for provided inputs.
+#define MINT_DRIVERFAILEDWARPREQUIRED 926 // Driver failed because a warp is required.
+#define MINT_WARP_FAILCONTROLPNTS 961 // Warp failed. An insufficient number of control points were supplied.
+#define MINT_WARP_FAILDRIVERIMAGE 962 // Warp failed. The raster driver does not support Image fields.
+#define MINT_WARP_FAILTRANSFORM 963 // Warp failed. The warp could not be performed.
+#define MIR_COLNAME_NOT_EXIST 965 // Column not found, column name should pre-exist in the input TAB.
+#define MIR_COLUMN_DATATYPE_MISMATCH 966 // Input TAB Column datatype not compatible with raster data type.
+#define MIR_RACLASSIFY_WARNTABLEBANDCOUNT 967 // Warning: The number of declared bands (%1!%r!) in the classification table does not match the expected band count (%2!%r!).
+#define MIR_RACLASSIFY_WARNTABLEROWCOUNT 968 // Warning: The number of declared rows (%1!%r!) in the classification table does not match the expected row count (%2!%r!).
+#define MIR_GRIDOP_IMPORTMRRPNT 969 // Gridding: Import to point cache.
+#define MIR_GRIDOP_IMPORTVALIDSTATIONCOUNT 970 // Imported a total of %1!%r! valid stations.
+#define MIR_INTERP_CANOPYDENSITY 993 // Gridding: Canopy Density.
+#define MIR_INTERP_CANOPYHEIGHT 994 // Gridding: Canopy Height.
+#define MIR_INTERP_CANOPYCOVERAGE 995 // Gridding: Canopy Coverage.
+#define MIR_LIDAR_CLASSRULEINVALID 996 // Error. Classification rule does not match supplied inputs.
+#define MIR_AUTOFLOODEDIT_STARTED 997 // Automated flood edit operation started.
+#define MIR_ITERATOR_INVALID 998 // Error: Iterator is not in a valid state.
+#define MIR_ITERATOR_FINISHED 999 // Iterator has completed.
+#define MIR_ITERATOR_NOTILE 1000 // Error: Iterator failed to acquire a tile.
+#define MINT_SATIMPORT_INVALIDFILENAME 1001 // Error: The supplied filename is not interpretable.
+#define MINT_SATIMPORT_UNKNOWNSATELLITE 1002 // Error: The supplied filename refers to an unknown satellite.
+#define MINT_SATIMPORT_UNKNOWNSENSOR 1003 // Error: The supplied filename refers to an unknown sensor.
+#define MINT_SATIMPORT_MTLGROUPORDER 1004 // Error: The MTL file groups are out of order.
+#define MINT_SATIMPORT_UNSUPPORTEDSATELLITE 1005 // Error: The satellite platform is not supported.
+#define MINT_SATIMPORT_INVALIDMETADATA 1006 // Error: The metadata was not interpretable.
+#define MINT_SATIMPORT_UNSUPPORTEDCOLLECTION 1007 // Error: The processing collection is not supported.
+
+//
+// Dictionary CUSRDMutable
+//
+// Do not manually edit this file. It should be re-generated, when required, by running MakeAPICodes.exe.
+// This program will also re-generate RasterDictionary.xml.
+//
+// New error codes should be added to m_vvDictionary in MINTSystem.cpp
+//
+
diff --git a/gdal/frmts/mrr/APIDef.h b/gdal/frmts/mrr/APIDef.h
new file mode 100644
index 000000000000..3398918d9c40
--- /dev/null
+++ b/gdal/frmts/mrr/APIDef.h
@@ -0,0 +1,3006 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+/*!\file APIDEF.h
+ \brief MapInfo Pro Raster C-API header definitions.
+
+ This file contains definitions used by the MapInfo Pro Raster API.
+*/
+
+#ifndef APIDEF_H
+#define APIDEF_H
+
+#pragma once
+
+#include
+#ifdef __linux__
+#include
+#endif
+#include "APICodes.h"
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/*****************************************************************************************************************************/
+// Constants
+
+typedef int32_t MIRResult; //!> Result code returned by API functions
+
+static const int32_t MIRSuccess = 0; //!< Indicates successful result for an operation
+static const uint32_t MIRInvalidHandle = UINT32_MAX; //!< Default value of an invalid resource handle
+static const uint32_t InvalidTracker = 0u; //!< Indicates no tracker is supplied to an operation
+static const uint32_t InvalidBand = UINT32_MAX; //!< Indicates no band index is supplied to an operation
+static const size_t MAX_FILEPATH = 256u; //!< Maximum number of chars in the file path
+static const size_t MAX_COORDSYS = 512u; //!< Maximum number of coordinate system objects
+static const uint32_t DefaultSampleCount = 100u; //!< Default number of samples to be created along a line
+static const double DefaultNullValue = -9999.0; //!< Default null value for legacy rasters
+static const uint32_t DefaultExportMaxDecimal = 16u; //!< Default number of decimal points written on export
+static const wchar_t DefaultExportDelimiter = L' '; //!< Default Delimiter used in export
+static const uint32_t InvalidBinCount = UINT32_MAX; //!< Indicates no bin count is supplied to an operation
+static const uint32_t InvalidColor = 0xFEFFFFFF; //!< Indicates no color is supplied to this operation
+static const uint32_t MaxGroupCount = 1024; //!< Default maximum number of groups ro return
+
+/*****************************************************************************************************************************/
+// General enumerations
+
+/*! \enum MIR_DataType
+ \brief Data types representable by a variant.
+
+ MIR_DATETIME_OLE
+ The DATE type is implemented using an 8-byte floating-point number.
+ Days are represented by whole number increments starting with 30 December 1899, midnight as time zero.
+ Hour values are expressed as the absolute value of the fractional part of the number.
+ The DATE date type represents dates and times as a classic number line.
+ The DATE timeline becomes discontinuous for date values less than 0 (before 30 December 1899).
+ This is because the whole-number portion of the date value is treated as signed, while the fractional part is treated as
+ unsigned. In other words, the whole-number part of the date value may be positive or negative, while the fractional part
+ of the date value is always added to the overall logical date.
+
+ MIR_DATETIME_CPP
+ The number of seconds since January 1, 1970, 0:00 UTC.
+*/
+enum MIR_DataType
+{
+ // Invalid
+ MIR_UNDEFINED = 0, //!< Undefined data type
+ MIR_NULL, //!< Null data type
+ MIR_EMPTY, //!< Empty data type
+ // Boolean
+ MIR_BOOLEAN_INT8 = 10, //!< 8-bit boolean type
+ MIR_BOOLEAN_INT32, //!< 32-bit boolean type
+ // Bit
+ MIR_BIT1 = 20, //!< 1-bit data
+ MIR_BIT2, //!< 2-bit crumb
+ MIR_BIT4, //!< 4-bit nibble
+ // Unsigned integers
+ MIR_UNSIGNED_INT8 = 30, //!< 8-bit unsigned integer
+ MIR_UNSIGNED_INT16, //!< 16-bit unsigned integer
+ MIR_UNSIGNED_INT32, //!< 32-bit unsigned integer
+ MIR_UNSIGNED_INT64, //!< 64-bit unsigned integer
+ // Signed integers
+ MIR_SIGNED_INT8 = 40, //!< 8-bit signed integer
+ MIR_SIGNED_INT16, //!< 16-bit signed integer
+ MIR_SIGNED_INT32, //!< 32-bit signed integer
+ MIR_SIGNED_INT64, //!< 64-bit signed integer
+ // Floating point
+ MIR_REAL2 = 50, //!< 2 byte real (unimplemented)
+ MIR_REAL4, //!< 4 byte real
+ MIR_REAL8, //!< 8 byte real
+ MIR_REAL_LONG, //!< 8 byte real
+ // Complex numbers
+ MIR_COMPLEX_INT16 = 60, //!< 16-bit signed integer complex number (real, imaginary)
+ MIR_COMPLEX_INT32, //!< 32-bit signed integer complex number (real, imaginary)
+ MIR_COMPLEX_REAL4, //!< 4 byte real complex number (real, imaginary)
+ MIR_COMPLEX_REAL8, //!< 8 byte real complex number (real, imaginary)
+ // Time - Date
+ MIR_DATETIME_OLE = 70, //!< Windows DATE, 8 byte real
+ MIR_DATETIME_CPP, //!< Standard time_t, 64 bit integer
+ // String
+ MIR_STRING = 80, //!< ASCII, variable length
+ MIR_FIXED_STRING, //!< ASCII, Fixed length
+ MIR_STRING_UTF8, //!< Unicode, variable length, std::string
+ MIR_STRING_UTF16, //!< Unicode, variable length, std::wstring
+ MIR_STRING_UTF32, //!< Unicode, variable length, std::u32string
+ // Binary large objects
+ MIR_BINARY_OBJECT = 90, //!< Variable length
+ MIR_FIXED_BINARY_OBJECT, //!< Fixed length
+ // Color
+ MIR_RED = 100, //!< 8 bit red
+ MIR_GREEN, //!< 8 bit green
+ MIR_BLUE, //!< 8 bit blue
+ MIR_GREY, //!< 8 bit grey (minimum is black)
+ MIR_ALPHA, //!< 8 bit opacity, (minimum is transparent)
+ MIR_RED_ALPHA, //!< 8|8 bit
+ MIR_GREEN_ALPHA, //!< 8|8 bit
+ MIR_BLUE_ALPHA, //!< 8|8 bit
+ MIR_GREY_ALPHA, //!< 8|8 bit
+ MIR_RGB, //!< 8|8|8 bit
+ MIR_RGBA, //!< 8|8|8|8 bit
+ MIR_BGR, //!< 8|8|8 bit
+ MIR_BGRA, //!< 8|8|8|8 bit
+ MIR_HSI_Hue, //!< 8 bit hue (HSI)
+ MIR_HSI_Saturation, //!< 8 bit saturation (HSI)
+ MIR_HSI_Intensity, //!< 8 bit intensity (HSI)
+ MIR_HSL_Hue, //!< 8 bit hue (HSL/HLS)
+ MIR_HSL_Saturation, //!< 8 bit saturation (HSL/HLS)
+ MIR_HSL_Lightness, //!< 8 bit lightness (HSL/HLS)
+ MIR_HSV_Hue, //!< 8 bit hue (HSV/HSB)
+ MIR_HSV_Saturation, //!< 8 bit saturation (HSV/HSB)
+ MIR_HSV_Value, //!< 8 bit value (HSV/HSB)
+ MIR_HSI, //!< 8|8|8 bit
+ MIR_HSL, //!< 8|8|8 bit
+ MIR_HSV, //!< 8|8|8 bit
+ MIR_HSIA, //!< 8|8|8|8 bit
+ MIR_HSLA, //!< 8|8|8|8 bit
+ MIR_HSVA, //!< 8|8|8|8 bit
+ MIR_MINISBLACK1, //!< 1 bit grey (minimum is black)
+ MIR_MINISBLACK2, //!< 2 bit grey (minimum is black)
+ MIR_MINISBLACK4, //!< 4 bit grey (minimum is black)
+ MIR_MINISBLACK8, //!< 8 bit grey (minimum is black)
+ MIR_MINISWHITE1, //!< 1 bit grey (minimum is white)
+ MIR_MINISWHITE2, //!< 2 bit grey (minimum is white)
+ MIR_MINISWHITE4, //!< 4 bit grey (minimum is white)
+ MIR_MINISWHITE8 //!< 8 bit grey (minimum is white)
+};
+
+/*! \enum MIR_UnitCode
+ \brief MapInfo units.
+*/
+enum MIR_UnitCode
+{
+ MIR_Undefined = -1, //!< Undefined Unit Type
+ MIR_Miles = 0, //!< MapInfo Unit Type - Miles
+ MIR_Kilometers = 1, //!< MapInfo Unit Type - Kilometres
+ MIR_Inches, //!< MapInfo Unit Type - Inches
+ MIR_Feet, //!< MapInfo Unit Type - Feet
+ MIR_Yards, //!< MapInfo Unit Type - Yards
+ MIR_Millimeters, //!< MapInfo Unit Type - Millimeters
+ MIR_Centimeters, //!< MapInfo Unit Type - Centimeters
+ MIR_Meters, //!< MapInfo Unit Type - Meters
+ MIR_USSurveyFeet, //!< MapInfo Unit Type - US Survey Feet
+ MIR_NauticalMiles, //!< MapInfo Unit Type - Nautical Miles
+ MIR_Links = 30, //!< MapInfo Unit Type - Links
+ MIR_Chains = 31, //!< MapInfo Unit Type - Chains
+ MIR_Rods = 32, //!< MapInfo Unit Type - Rods
+ MIR_Degree = 64, //!< MapInfo Unit Type - Degree
+ MIR_ArcMinute = 65, //!< MapInfo Unit Type - Arc Minute
+ MIR_ArcSecond = 66, //!< MapInfo Unit Type - Arc Second
+ MIR_MilliArcSecond = 67, //!< MapInfo Unit Type - Milli Arc Second
+
+ MIR_Microseconds = 100,
+ MIR_Milliseconds,
+ MIR_Seconds,
+ MIR_Minutes,
+ MIR_Hours,
+ MIR_Days,
+ MIR_Weeks,
+ MIR_Years,
+
+ MIR_dB = 128,
+ MIR_dBm,
+ MIR_dBW,
+ MIR_dBuV_m,
+ MIR_Radians,
+ MIR_Percent,
+ MIR_DegreeDBP,
+ MIR_Calls_HR_KM2,
+ MIR_Msgs_HR_KM2,
+ MIR_Erlangs_HR_KM2,
+ MIR_SimCalls_KM2,
+
+ MIR_Erlang = 140,
+ MIR_Bits_Cell,
+ MIR_KBits_KM2,
+ MIR_MBits_KM2,
+ MIR_Events_Sec,
+ MIR_Kbps,
+ MIR_Kbps_KM2_Floor,
+ MIR_Subscribers,
+ MIR_Subscribers_KM2,
+ MIR_Subscribers_KM2_Floor,
+ MIR_Erlangs_KM2,
+ MIR_Erlangs_KM2_Floor,
+ MIR_Mbps,
+ MIR_Bits_S_Hz,
+ MIR_Kbps_KM2,
+ MIR_Kbps_MHz,
+ MIR_Calls,
+
+ MIR_Kilometres = MIR_Kilometers,
+ MIR_Millimetres = MIR_Millimeters,
+ MIR_Centimetres = MIR_Centimeters,
+ MIR_Metres = MIR_Meters,
+ MIR_Degrees = MIR_Degree
+};
+
+/*****************************************************************************************************************************/
+// Vehicles, drivers and driver capabilities
+
+/*! \struct SMIR_VehicleCapabilities
+ \brief Capabilities of the vehicle, applicable to all drivers it supports.
+*/
+struct SMIR_VehicleCapabilities
+{
+ char sUniqueID[256];
+ uint32_t nIdentificationStrength;
+
+ wchar_t sName[256];
+ wchar_t sDescription[256];
+
+ uint32_t bMultipleDriver : 1; //!< Supports multiple drivers
+ uint32_t bThreadSafeNative : 1; //!< Supports multiple thread access in Native support mode (ReadOnly & EditCell)
+ uint32_t bThreadSafeBase : 1; //!< Supports multiple thread access in Base support mode (ReadOnly & EditCell)
+ uint32_t bThreadSafeFull : 1; //!< Supports multiple thread access in Full support mode (ReadOnly & EditCell)
+};
+
+/*! \struct SMIR_DriverCapabilities
+ \brief Capabilities of a driver.
+*/
+struct SMIR_DriverCapabilities
+{
+ char sUniqueID[256];
+ uint32_t nIdentificationStrength;
+
+ wchar_t sName[256];
+ wchar_t sDescription[256];
+
+ wchar_t sExtension[32];
+ wchar_t sExtensionList[256];
+
+ // Support for fields, bands and events
+ uint32_t bMultipleField : 1; //!< Supports multiple unrelated fields
+ uint32_t bMultipleBand : 1; //!< Supports multi-banded fields
+ uint32_t bMultipleEvent : 1; //!< Supports the time dimension
+
+ // Support for field types
+ uint32_t bClassifiedField : 1; //!< Supports classified field type
+ uint32_t bImageField : 1; //!< Supports image field type
+ uint32_t bImagePaletteField : 1; //!< Supports image palette field type
+ uint32_t bContinuousField : 1; //!< Supports continuous field type
+
+ // Support for operations
+ uint32_t bEditCell : 1; //!< Supports edit cell operation
+ uint32_t bEditStructure : 1; //!< Supports edit operation: extension of the raster structure
+ uint32_t bCreate : 1; //!< Supports create operation
+
+ // Support for tile access
+ uint32_t bRandomRead : 1; //!< Supports random access for reading a tile
+ uint32_t bRandomWrite : 1; //!< Supports random access for writing a tile
+ uint32_t nLoadBandOnDemand : 2; //!< Supports loading bands on demand
+
+ // Support for overviews and statistics
+ uint32_t bStoredOverviews : 1; //!< Supports overviews stored in the raster file
+ uint32_t bSuppliesUnderviews : 1; //!< Supports underviews acquired from the driver
+ uint32_t bRequireStoreOverview : 1; //!< Writing overviews may be optional or required
+ uint32_t bAllowPermanentCache : 1; //!< Allow a permanent full or partial pyramid cache to be created as a raster companion file
+ uint32_t nPriorWriteStatistics : 3; //!< Requires statistics prior to writing
+ //!< 0 = None, 1 = Count, 2 = Summary, 3 = Distribution, 4 = Spatial
+ uint32_t nStoreWriteStatistics : 3; //!< Supports statistics stored in the raster file
+ //!< 0 = None, 1 = Count, 2 = Summary, 3 = Distribution, 4 = Spatial
+ uint32_t bRequireStoreStatistics : 1; //!< Writing statistics may be optional or required
+
+ uint32_t bVariableCellExtent : 1; //!< Supports extendable and modifiable cell count
+ uint32_t bSparseTiles : 1; //!< Supports sparse tile arrangements
+
+ uint32_t bFixedAnchor : 1; //!< Global anchor position for cell (0,0) in any level
+ uint32_t bPower2CellSize : 1; //!< Cell size varies by 2 for each level
+ uint32_t bDataASCII : 1; //!< Raster data file is ASCII format
+ uint32_t nCellValidityMethod : 2; //!< 0 = none,1 = numeric compare,2 = string compare,3 = mask
+ uint32_t bExtendedValidity : 1; //!< Supports invalid cell classification
+
+ // Data storage arrangement within the raster
+ // TODO Make this a mask of 4 bits to allow combinations.
+ uint32_t nCellArrangement_Storage : 2; //!< Cell/Row/Strip/Tile
+
+ // Order of tiles within the raster
+ uint32_t nCellArrangement_RasterXSense : 2; //!< W - E / E - W
+ uint32_t nCellArrangement_RasterYSense : 2; //!< S - N / N - S
+
+ // Order of cells within a tile
+ uint32_t nCellArrangement_TileXSense : 2; //!< W - E / E - W
+ uint32_t nCellArrangement_TileYSense : 2; //!< S - N / N - S
+
+ // The level at which fields are interleaved
+ uint32_t nCellArrangement_InterleaveField : 2; //!< Cell/Row/Tile/Raster
+
+ // The level at which bands are interleaved
+ uint32_t nCellArrangement_InterleaveBand : 2; //!< Cell/Row/Tile/Raster
+
+ uint32_t bThreadSafeNative : 1; //!< Supports multiple thread access in Native support mode (ReadOnly & EditCell)
+ uint32_t bThreadSafeBase : 1; //!< Supports multiple thread access in Base support mode (ReadOnly & EditCell)
+ uint32_t bThreadSafeFull : 1; //!< Supports multiple thread access in Full support mode (ReadOnly & EditCell)
+
+ uint32_t bCompression : 1; //!< Supports compression (methods not specified here)
+
+ uint32_t bFixedTableStructure : 1; //!< Supports fixed classification table structure
+ uint32_t nEndian : 2; //!< 0 = None, 1 = Little, 2 = Big, 3 = Little and Big
+};
+
+/*****************************************************************************************************************************/
+// Raster properties
+
+/*! \enum MIR_FieldType
+ \brief Raster field type.
+*/
+enum MIR_FieldType
+{
+ MIR_FIELD_Default = -1,
+ MIR_FIELD_Classified = 0,
+ MIR_FIELD_Image = 1,
+ MIR_FIELD_ImagePalette = 2,
+ MIR_FIELD_Continuous = 3
+};
+
+/*! \enum MIR_ClassTableFieldType
+ \brief Raster classification table field type.
+*/
+enum MIR_ClassTableFieldType
+{
+ MIR_TFT_Undefined = -1, //!< Classified field type is undefined (system may define it appropriately)
+ MIR_TFT_Class = 0, //!< Classified field contains original class identifier
+ MIR_TFT_Value, //!< Classified field contains primary data value
+ MIR_TFT_Colour, //!< Classified field contains primary color value
+ MIR_TFT_Label, //!< Classified field contains primary text label
+ MIR_TFT_Data, //!< Classified field contains data
+ MIR_TFT_ColourR, //!< Classified field contains primary color red value
+ MIR_TFT_ColourG, //!< Classified field contains primary color green value
+ MIR_TFT_ColourB //!< Classified field contains primary color blue value
+};
+
+/*! \enum MIR_CompressionType
+ \brief Compression types supported by MIRaster IO API.
+*/
+enum MIR_CompressionType
+{
+ // MRR
+ MIR_NoCompression = -1, //!< No Compression. Compression Level is ignored.
+ MIR_Compression_Zip = 0, //!< Zip Compression. Supported compression Levels are 1 to 9.
+ MIR_Compression_LZMA = 1, //!< LZMA Compression. Supported compression Levels are 0 to 9.
+ MIR_Compression_PNG = 2, //!< PNG Compression.
+ MIR_Compression_JPEG = 3, //!< JPEG Compression. Supported compression Levels are 0+, maps to Quality 100-(3*C).
+ MIR_Compression_LZ4 = 4, //!< LZ4 high speed lossless compression.
+ //MIR_Compression_LZ4HC
+
+ //Grouped into Balanced, speed and space for data and imagery compression.
+ MIR_Compression_DataBalanced = 50, //!< Lossless data compression, balanced.
+ MIR_Compression_DataSpeed = 51, //!< Lossless data compression, favor higher encoding speed.
+ MIR_Compression_DataSpace = 52, //!< Lossless data compression, favor higher compression.
+ MIR_Compression_ImageBalanced = 53, //!< Lossless image compression, balanced.
+ MIR_Compression_ImageSpeed = 54, //!< Lossless image compression, favor higher encoding speed.
+ MIR_Compression_ImageSpace = 55, //!< Lossless image compression, favor higher compression.
+ MIR_Compression_ImageLossyBalanced = 56, //!< Lossy image compression, balanced.
+ MIR_Compression_ImageLossySpeed = 57, //!< Lossy image compression, favor higher encoding speed.
+ MIR_Compression_ImageLossySpace = 58, //!< Lossy image compression, favor higher compression.
+
+ // GeoTIFF
+ MIR_Compression_TIFF_NONE = 1000, //!< dump mode
+ MIR_Compression_TIFF_CCITTRLE = 1001, //!< CCITT modified Huffman RLE
+ MIR_Compression_TIFF_CCITTFAX3 = 1002, //!< CCITT Group 3 fax encoding
+ MIR_Compression_TIFF_T4 = 1003, //!< CCITT T.4 (TIFF 6 name)
+ MIR_Compression_TIFF_CCITTFAX4 = 1004, //!< CCITT Group 4 fax encoding
+ MIR_Compression_TIFF_CCITT_T6 = 1005, //!< CCITT T.6 (TIFF 6 name)
+ MIR_Compression_TIFF_LZW = 1006, //!< Lempel-Ziv & Welch
+ MIR_Compression_TIFF_OJPEG = 1007, //!< !6.0 JPEG
+ MIR_Compression_TIFF_JPEG = 1008, //!< %JPEG DCT compression
+ MIR_Compression_TIFF_ADOBE_DEFLATE = 1009, //!< Deflate compression,as recognized by Adobe
+ MIR_Compression_TIFF_T85 = 1010, //!< !TIFF/FX T.85 JBIG compression
+ MIR_Compression_TIFF_T43 = 1011, //!< !TIFF/FX T.43 colour by layered JBIG compression
+ MIR_Compression_TIFF_NEXT = 1012, //!< NeXT 2-bit RLE
+ MIR_Compression_TIFF_CCITTRLEW = 1013, //!< #1 w/ word alignment
+ MIR_Compression_TIFF_PACKBITS = 1014, //!< Macintosh RLE
+ MIR_Compression_TIFF_THUNDERSCAN = 1015, //!< ThunderScan RLE
+ MIR_Compression_TIFF_IT8CTPAD = 1016, //!< IT8 CT w/padding
+ MIR_Compression_TIFF_IT8LW = 1017, //!< IT8 Linework RLE
+ MIR_Compression_TIFF_IT8MP = 1018, //!< IT8 Monochrome picture
+ MIR_Compression_TIFF_IT8BL = 1019, //!< IT8 Binary line art
+ MIR_Compression_TIFF_PIXARFILM = 1020, //!< Pixar companded 10bit LZW
+ MIR_Compression_TIFF_PIXARLOG = 1021, //!< Pixar companded 11bit ZIP
+ MIR_Compression_TIFF_DEFLATE = 1022, //!< Deflate compression
+ MIR_Compression_TIFF_DCS = 1023, //!< Kodak DCS encoding
+ MIR_Compression_TIFF_JBIG = 1024, //!< ISO JBIG
+ MIR_Compression_TIFF_SGILOG = 1025, //!< SGI Log Luminance RLE
+ MIR_Compression_TIFF_SGILOG24 = 1026, //!< SGI Log 24-bit packed
+ MIR_Compression_TIFF_JP2000 = 1027, //!< Leadtools JPEG2000
+ MIR_Compression_TIFF_LZMA = 1028 //!< LZMA2
+};
+
+/*! \enum MIR_BandType
+ \brief Raster band type.
+*/
+enum MIR_BandType
+{
+ MIR_Concrete = 0, //!< Band data is stored in the raster
+ MIR_Component = 1, //!< Band data is an acquired component of another concrete band
+ MIR_TableField = 2, //!< Band data is acquired from a classification table field
+ MIR_TableField_Component = 3 //!< Band data is an acquired component of another band acquired from a classification table field
+};
+
+/*! \enum MIR_NULLType
+ \brief Raster null cell identification method.
+*/
+enum MIR_NULLType
+{
+ MIR_NULL_NONE = 0x00000001, // Specify one of these
+ MIR_NULL_NUMERIC_COMPARE = 0x00000002,
+ MIR_NULL_STRING_COMPARE = 0x00000004,
+ MIR_NULL_MASK = 0x00000008,
+ MIR_NULL_METHOD_FIXED = 0x00010000, // Optional
+ MIR_NULL_VALUE_FIXED = 0x00020000 // Optional
+};
+
+/*! \enum MIR_PredictiveEncoding
+ \brief Predictive encoding schemes.
+*/
+enum MIR_PredictiveEncoding
+{
+ MIR_Encoding_None = -1, /*!< No encoding.*/
+ MIR_PreviousColumnValue = 0, /*!< Predict the value from previous column.*/
+ MIR_PreviousColumnLinear = 1, /*!< Linear estimate the value from previous two columns.*/
+ MIR_RunLength = 2 /*!MIR_EventType. */
+
+ // User modifiable variable states
+ SMIR_EventInfoState DataState;
+};
+
+/*! \struct SMIR_BandInfoState
+ \brief Initial and final states for each band property.
+
+ When you create a raster you set an initial state for each property and after it has been created you can find out a final state for that property
+ (See the XQDO class in MINTSystem.h)
+
+ The initial state can be : Default (0), Request (1), or Require (2)
+ The Final state can be : OK (0), Warning (1), or Error (2)
+
+ The char arrays below correspond to Initial and Final state values.
+ If you "Request" a property and it is denied, you may receive a "Warning".
+ If you "Require" a property and it is denied, you may receive an "Error".
+*/
+struct SMIR_BandInfoState
+{
+ char nType[2];
+ char nName[2];
+ char nXMLMetaData[2];
+ char nUnitCode[2];
+ char nDataType[2];
+ char nStoreDataType[2];
+ char nDiscreteValue[2];
+ char nNullValueType[2],nNullValue[2];
+ char nRestrictDecimals[2],nMaxDecimals[2];
+ char nTransform[2],nScale[2],nOffset[2];
+ char nClip[2],nClipMin[2],nClipMax[2];
+ char nPredictiveEncoding[2];
+};
+
+/*! \struct SMIR_BandInfo
+ \brief Structure for defining the composition of a band in a raster.
+*/
+struct SMIR_BandInfo
+{
+ MIR_BandType nType; /*!< The type of band in the source raster as defined in \link MIR_BandType \endlink. */
+ wchar_t sName[256]; /*!< The name of the band. */
+ wchar_t sXMLMetaData[4096]; /*!< The band metadata. */
+
+ MIR_UnitCode nUnitCode; /*!MIR_FieldType. */
+ wchar_t sName[256]; /*!= dBottom*/
+ double dTop; /*!0 and <=1
+ double dCumulativeCount; /*! */
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_Output
+ \brief Structure for defining output parameters used to interpolate a raster. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Output
+{
+ wchar_t sFile[1024]; /*!< Path to the output file. */
+ wchar_t sDriverId[64]; /*!< DriverId used to create the output raster.*/
+ bool bAutoDataType; /*!< If true the system will choose the best output data type, otherwise define them per band in pDataTypes. */
+ int32_t nDataTypes; /*!< Count of data types defined in pDataTypes. */
+ MIR_DataType* pDataTypes; /*!< Output grid data types. Valid MIR_DataType types are UnsignedInt8, SignedInt8, UnsignedInt16, SignedInt16, UnsignedInt32, SignedInt32, RealSingle, RealDouble. */
+ wchar_t sCoordinateSystem[512]; /*!< MapInfo coordinate system string for the output file. */
+ bool bAllowMultiBand; /*!< If true and output format can handle multi-banded data then a multi-banded raster will be created. */
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_Geometry
+ \brief Structure for defining geometry parameters used to interpolate a raster. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Geometry
+{
+ bool bAutoGridExtents; /*!< If false supply grid origin, columns and rows, otherwise if true the system will define.*/
+ bool bAutoGridCellSize; /*!< If false supply cell size, otherwise if true the system will define.*/
+ double dOriginX; /*!< X origin of the output grid.*/
+ double dOriginY; /*!< Y origin of the output grid.*/
+ MIR_ExtentType nExtentType; /*!< Determines if dExtentX and dExtentY are in coordinate values or cell values.*/
+ double dExtentX; /*!< Maximum X coordinate or number of columns of the output grid.*/
+ double dExtentY; /*!< Maximum Y coordinate or number of rows of the output grid.*/
+ double dCellSizeX; /*!< X Cell size of the output grid.*/
+ double dCellSizeY; /*!< Y Cell size of the output grid.*/
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_Parameters
+ \brief Structure for defining general parameters used to interpolate a raster. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Parameters
+{
+ SMIR_IMP_Preferences cPreferences; /*!< Structure defining interpolation preference parameters.*/
+ SMIR_IMP_Input cInput; /*!< Structure defining interpolation input parameters.*/
+ SMIR_IMP_Output cOutput; /*!< Structure defining interpolation output parameters.*/
+ SMIR_IMP_Geometry cGeometry; /*!< Structure defining interpolation geometry parameters.*/
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_Triangulation
+ \brief Structure for defining parameters used to interpolate a raster using the triangulation method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Triangulation
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+ uint8_t nPatchMultiplier; /*!< Side length of the triangulation patch, expressed as a number of raster tiles (ranges from 1 to 5).*/
+ double dLongTriangle; /*!< Maximum side length of a triangle, specified in nParameterUnitsType.*/
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_IDW_Sector
+\brief Structure for defining sector parameters used to interpolate a raster using the inverse distance weighted method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_IDW_Sector
+{
+ bool bApply; /*!< Apply sector support.*/
+ int32_t nCount; /*!< Count of sectors to use, valid values are 1 to 32.*/
+ double dOrientation; /*!< Starting orientation of sectors in degrees, valid values are 0 to 360.*/
+ int32_t nMinimumPoints; /*!< Minimum number of points per sector to validate sector, valid values are 1 and greater.*/
+ int32_t nMaximumPoints; /*!< Maximum number of points to use per sector when bNearestPoints is true, if bNearestPoints is false this parameter is not used. Valid values are 1 and greater.*/
+ bool bNearestPoints; /*!< Use nearest nMaximumPoints number of points.*/
+ int32_t nMinimumCount; /*!< Minimum number of valid sectors required, valid values are 1 and greater.*/
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_IDW
+ \brief Structure for defining parameters used to interpolate a raster using the inverse distance weighted method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_IDW
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+
+ double dRadiusX; /*!< X Radius of influence, specified in nParameterUnitsType.*/
+ double dRadiusY; /*!< Y Radius of influence, specified in nParameterUnitsType.*/
+ bool bElliptical; /*!< Radius of influence elliptical.*/
+ double dOrientation; /*!< Ellipse orientation.*/
+ uint32_t nIncrement; /*!< Search increment factor, valid values are 1 or greater.*/
+
+ // Weighting parameters
+ MIR_WeightingModel nModel; /*!< Weighting model.*/
+ double dPower; /*!< Distance weighting.*/
+ double dNugget; /*!< Minimum distance, specified in nParameterUnitsType.*/
+ double dRange; /*!< Maximum distance, specified in nParameterUnitsType.*/
+ double dScale; /*!< Scaling distance, specified in nParameterUnitsType.*/
+
+ // Tapering of input data
+ bool bTaper; /*!< If true a distance tapering function is applied to the interpolated values.*/
+ double dTaperFrom; /*!< Minimum taper distance, specified in nParameterUnitsType.*/
+ double dTaperTo; /*!< Maximum taper distance, specified in nParameterUnitsType.*/
+ double dTaperBackground; /*!< Defined background value.*/
+
+ SMIR_IMP_IDW_Sector cSectors; /*!< Structure defining IDW sector parameters.*/
+
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_Distance
+ \brief Structure for defining parameters used to interpolate a raster using the data distance method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Distance
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+ double dRadiusX; /*!< X Radius of influence, specified in nParameterUnitsType.*/
+ double dRadiusY; /*!< Y Radius of influence, specified in nParameterUnitsType.*/
+ bool bElliptical; /*!< Radius of influence elliptical.*/
+ double dOrientation; /*!< Ellipse orientation.*/
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+/*****************************************************************************************************************************/
+
+/*! \struct SMIR_IMP_Density
+ \brief Structure for defining parameters used to interpolate a raster using the data density method.
+ This is used by the Raster Interpolation API.
+
+ Kernel Model
+
+ Point Count Density Estimation Model = 0
+
+ Accumulates the number of points within the bandwidth. Optionally, bias
+ this count by the input data value. Optionally return either the count
+ or the true spatial density by dividing by the elliptical area (PI.A.B).
+
+ Kernel Density Estimation Model = 1 - 7
+
+ This method is well known as a robust statistical technique to compute the
+ point density of any collection of points at a point in space. Optionally
+ return either the estimated value or the normalized density by dividing by
+ the elliptical area (PI.A.B).
+
+ D = (1/(n*h)) * sum (K * U); or is it (1/n) * sum (K(U))?
+ n = number of input samples
+ h = bandwidth (a distance)
+ K = kernel function
+ U = (Xi - X)/h
+
+ So we need to find the distance of every point to the density location.
+ Generally, we only consider points that are within h distance.
+ h can be defined as (hx,hy,hz) for anisotropic density computations.
+
+ K is defined in the following way.
+
+ 1 Uniform 1/2
+ 2 Triangle 1-|U|
+ 3 Epanechnikov 3/4 * (1-U^2)
+ 4 Quartic 15/16 * (1-U^2)^2
+ 5 Triweight 35/32 * (1-U^2)^3
+ 6 Gaussian (1/sqrt(2PI)) * exp(-1/2 * U^2)
+ 7 Cosinus PI/4 * cos(U*PI/2)
+
+ Generally, the kernel is only evaluated for |U| <= 1.
+ For gaussian, h ought to be infinity as it is perfectly smooth.
+ Note that U and |U| are interchangeable in all cases except Triangle.
+*/
+struct SMIR_IMP_Density
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+ double dRadiusX; /*!< X Radius of influence, specified in nParameterUnitsType.*/
+ double dRadiusY; /*!< Y Radius of influence, specified in nParameterUnitsType.*/
+ bool bElliptical; /*!< Radius of influence elliptical.*/
+ double dOrientation; /*!< Ellipse orientation.*/
+ MIR_DensityKernel nKernel; /*!< Kernel model used to interpolate value.*/
+ bool bBiasByInput; /*!< If true interpret point value as a count.*/
+ bool bNormalise; /*!< Normalize data frequency values into data density values.*/
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+ double dGaussianSharpening; /*!< Sharpening to Gaussian kernel.*/
+};
+
+/*! \struct SMIR_IMP_Stamp
+ \brief Structure for defining parameters used to interpolate a raster using the stamp method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Stamp
+{
+ MIR_Stamp_StampMethod nStampMethod; /*!< Stamping method to use. */
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+/*! \struct SMIR_IMP_MinimumCurvature
+ \brief Structure for defining parameters used to interpolate a raster using the minimum curvature method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_MinimumCurvature
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+ MIR_IterationIntensity nIterations; /*!< Iteration intensity.*/
+ double dPercentChange; /*!< Degree of bending constraint.*/
+ double dTension; /*!< Spline tension.*/
+ MIR_MinimumCurvature_StampMethod nStampMethod; /*!< Stamping method to use.*/
+ double dIDWRadius; /*!< Search radius around a grid cell, specified in nParameterUnitsType.*/
+ double dIDWRange; /*!< Search range around a grid cell, specified in nParameterUnitsType.*/
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+/*! \struct SMIR_IMP_NearestNeighbour
+\brief Structure for defining parameters used to interpolate a raster using the nearest neaighbour method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_NearestNeighbour
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+ double dMaxSearchDistance; /*!< Maximum search distance (must be greater than 0), specified in nParameterUnitsType.*/
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+/*! \struct SMIR_IMP_NaturalNeighbourIntegration
+\brief Structure for defining parameters used to interpolate a raster using the natural neighbour integration method. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_NaturalNeighbourIntegration
+{
+ MIR_ParameterUnitsType nParameterUnitsType; /*!< Type of units that the specified parameters are stored in.*/
+ MIR_UnitCode nParameterUnitCode; /*!< Units that all parameters are specified in when nParameterUnitsType is set to Distance.*/
+ double dMaxSearchDistance; /*!< Maximum search distance (must be greater than 0), specified in nParameterUnitsType.*/
+ bool bGaussianDistanceWeighted; /*!< Use Gaussian weighting by distance.*/
+ bool bAutoGaussianRange; /*!< If true automatically determines the Gaussian range, if false uses dGaussianRange.*/
+ double dGaussianRange; /*!< Manually defined Gaussian range (must be greater than 0), used when bAutoGaussianRange is false, specified in nParameterUnitsType.*/
+ SMIR_IMP_Clip cClip; /*!< Structure defining clipping parameters.*/
+ SMIR_IMP_Smoothing cSmoothing; /*!< Smoothing parameters to be applied post processing.*/
+};
+
+
+/*! \struct SMIR_IMP_LiDAR_TREECANOPY
+\brief Common LAS filtering parameters for tree canopy analysis operations.
+*/
+struct SMIR_IMP_LiDAR_TREECANOPY
+{
+ bool bExtendedClassification; /*!< Use extended Classification data (LAS 1.4 onwards) instead of standard Classification data.*/
+ bool bEmptyIsZero; /*!< Populate raster cells with no assigned value with zero.*/
+ uint32_t nSuppliedClassRule; /*!< Use Ground classes only (0), Vegetation classes only (1) or Ground and Vegetation classes (2).*/
+ uint32_t nGroundClassCount; /*!< Number of ground classification values supplied.*/
+ uint8_t* pvnGroundClass; /*!< Array of ground classification values.*/
+ uint32_t nVegetationClassCount; /*!< Number of vegetation classification values supplied.*/
+ uint8_t* pvnVegetationClass; /*!< Array of vegetation classification values.*/
+ SMIR_IMP_Clip cCellClip; /*!< Raster cell clipping parameters.*/
+};
+
+/*! \struct SMIR_IMP_LiDAR_TREECANOPY_COVERAGE
+\brief LiDAR analysis Tree Canopy Coverage parameters.
+*/
+struct SMIR_IMP_LiDAR_TREECANOPY_COVERAGE
+{
+ SMIR_IMP_LiDAR_TREECANOPY cCommonLASFilter; /*!< Common LAS filtering parameters.*/
+ bool bIntegrateOverCell; /*!< Integrate over cell (true) or over a supplied radius (false).*/
+ double dSearchRadius; /*!< Integration radius.*/
+ bool bQuarticKernel; /*!< Use a Quartic weighting model for data within the integration radius.*/
+};
+
+/*! \struct SMIR_IMP_LiDAR_TREECANOPY_DENSITY
+\brief LiDAR analysis Tree Canopy Density parameters.
+*/
+struct SMIR_IMP_LiDAR_TREECANOPY_DENSITY
+{
+ SMIR_IMP_LiDAR_TREECANOPY cCommonLASFilter; /*!< Common LAS filtering parameters.*/
+ bool bIntegrateOverCell; /*!< Integrate over cell (true) or over a supplied radius (false).*/
+ double dSearchRadius; /*!< Integration radius.*/
+ bool bQuarticKernel; /*!< Use a Quartic weighting model for data within the integration radius.*/
+};
+
+/*! \struct SMIR_IMP_LiDAR_TREECANOPY_HEIGHT
+\brief LiDAR analysis Tree Canopy Height parameters.
+*/
+struct SMIR_IMP_LiDAR_TREECANOPY_HEIGHT
+{
+ SMIR_IMP_LiDAR_TREECANOPY cCommonLASFilter; /*!< Common LAS filtering parameters.*/
+ uint8_t nPatchMultiplier; /*!< Side length of the triangulation patch, expressed as a number of raster tiles (ranges from 1 to 5).*/
+};
+
+/*! \struct SMIR_IMP_Defaults
+ \brief Structure for defining recommended default parameters that interpolation system can auto compute. This is used by the Raster Interpolation API.
+*/
+struct SMIR_IMP_Defaults
+{
+ double dCellSize; /*!< Cell size to use for output raster.*/
+
+ // only computed if bComputeBounds for method is set to true.
+ double dMinimumX; /*!< Minimum X coordinate.*/
+ double dMinimumY; /*!< Minimum Y coordinate.*/
+ double dMaximumX; /*!< Maximum X coordinate.*/
+ double dMaximumY; /*!< Maximum Y coordinate.*/
+ uint32_t nRows; /*!< Number of rows at dCellSize for the computed bounds.*/
+ uint32_t nColumns; /*!< Number of columns at dCellSize for the computed bounds.*/
+};
+
+/*! \struct SMIR_IMP_Column
+ \brief Column data.
+*/
+struct SMIR_IMP_Column
+{
+ wchar_t sName[1024]; /*!< Column name.*/
+ MIR_DataType nDataType; /*!< Column data type if can be determined.*/
+};
+
+/*! \struct SMIR_IMP_ColumnInfo
+ \brief Structure for defining the number and names of the columns in a file that can be interpolated using the raster interpolation engine.
+*/
+struct SMIR_IMP_ColumnInfo
+{
+ uint32_t nColumnCount; /*!< Number of columns defined in vColumn.*/
+ SMIR_IMP_Column vColumns[1024]; /*!< List of column names.*/
+};
+
+/*! \struct SMIR_IMP_FileName
+ \brief File name.
+*/
+struct SMIR_IMP_FileName
+{
+ wchar_t sFileName[1024]; /*!< File name.*/
+};
+
+/*! \struct SMIR_IMP_Filenames
+ \brief Structure for defining the number and names of the output files that will be created when interpolated using the raster interpolation engine.
+*/
+struct SMIR_IMP_Filenames
+{
+ uint32_t nFileCount; /*!< Number of files defined in vFileName.*/
+ SMIR_IMP_FileName vFileName[1024]; /*!< List of file names.*/
+};
+
+/*! \struct SMIR_IMP_Group
+\brief Group info.
+*/
+struct SMIR_IMP_Group
+{
+ wchar_t sItem[1024]; /*!< Group name.*/
+ uint32_t nCount; /*!< Count of items in this group.*/
+};
+
+/*! \struct SMIR_IMP_Groups
+\brief Structure for defining the number and names of the groups that are defined the given grouping field in the file.
+*/
+struct SMIR_IMP_Groups
+{
+ uint32_t nCount; /*!< Number of groups defined in pvGroups.*/
+ SMIR_IMP_Group* pvGroups; /*!< List of group names.*/
+};
+
+/*! \struct MIR_RegistrationPoint
+ \brief Structure top control a registration point
+*/
+typedef struct
+{
+ double dWorldX, dWorldY;
+ double nPixelX, nPixelY;
+} MIR_RegistrationPoint;
+
+
+/*! \enum MIR_WarpTransformType
+ \brief Types of image warp transforms.
+*/
+enum MIR_WarpTransformType
+{
+ Auto = -1,
+ Conformal = 0,
+ Affine,
+ Projective,
+ Polynomial_O2,
+ Conformal_Polynomial_O2,
+ Polynomial_O3,
+};
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/gdal/frmts/mrr/GNUmakefile b/gdal/frmts/mrr/GNUmakefile
new file mode 100644
index 000000000000..524ba177411d
--- /dev/null
+++ b/gdal/frmts/mrr/GNUmakefile
@@ -0,0 +1,29 @@
+include ../../GDALmake.opt
+
+OBJ = MRRDataset.o MRRRasterBand.o MRRSDKImpl.o
+
+LDFLAGS += -ldl -shared
+
+CPPFLAGS := -DFRMT_mrr -std=c++11 $(CPPFLAGS)
+
+PLUGIN_SO = gdal_MRR.so
+
+default: $(OBJ:.o=.$(OBJ_EXT))
+
+clean:
+ rm -f *.o $(O_OBJ)
+ rm -f *.lo $(O_OBJ)
+
+install-obj: $(O_OBJ:.o=.$(OBJ_EXT))
+
+plugin: $(PLUGIN_SO)
+
+#$(PLUGIN_SO): $(OBJ:.o=.lo)
+# $(LD) $(LDFLAGS) ../../$(LIBGDAL) -o $@ $(OBJ:.o=.lo) \
+# -rpath $(INST_LIB) \
+# -no-undefined -export-dynamic
+
+$(PLUGIN_SO): $(OBJ)
+ $(LD_SHARED) $(LNK_FLAGS) $(OBJ) $(CONFIG_LIBS) $(EXTRA_LIBS) \
+ -o $(PLUGIN_SO)
+
diff --git a/gdal/frmts/mrr/MRRDataset.cpp b/gdal/frmts/mrr/MRRDataset.cpp
new file mode 100644
index 000000000000..51352885a1ef
--- /dev/null
+++ b/gdal/frmts/mrr/MRRDataset.cpp
@@ -0,0 +1,570 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+#include "MRRDataset.h"
+#include "MRRRasterBand.h"
+#include "MRRSDKImpl.h"
+#include "ogr_spatialref.h"
+
+CPL_C_START
+void GDALRegister_MRR(void);
+CPL_C_END
+
+//////////////////////////////////////////////////////////////////////////
+// Method declarations
+GDALDataType AdjustBandDataType(MIR_DataType& mirDataType);
+bool MRRInitialize(bool logError = true);
+void GDALDeregister_MRR(GDALDriver *);
+//////////////////////////////////////////////////////////////////////////
+
+/*
+ It returns the appropriate GDAL data type for the MIR data types.
+ If data type is not supported in the GDAL this mehtod promotes (modify) the MIRDataType.
+*/
+GDALDataType AdjustBandDataType(MIR_DataType& mirDataType)
+{
+ GDALDataType gdalDataType;
+
+ switch (mirDataType)
+ {
+ case MIR_DataType::MIR_BIT1: //GDAL doesn't have these data types, so promote to 8 bit
+ case MIR_DataType::MIR_BIT2:
+ case MIR_DataType::MIR_BIT4:
+ case MIR_DataType::MIR_RED:
+ case MIR_DataType::MIR_GREEN:
+ case MIR_DataType::MIR_BLUE:
+ case MIR_DataType::MIR_ALPHA:
+ case MIR_DataType::MIR_GREY:
+ case MIR_DataType::MIR_UNSIGNED_INT8:
+ gdalDataType = GDALDataType::GDT_Byte;
+ break;
+
+ case MIR_DataType::MIR_RED_ALPHA:
+ case MIR_DataType::MIR_BLUE_ALPHA:
+ case MIR_DataType::MIR_GREEN_ALPHA:
+ case MIR_DataType::MIR_GREY_ALPHA:
+ case MIR_DataType::MIR_UNSIGNED_INT16:
+ gdalDataType = GDALDataType::GDT_UInt16;
+ break;
+
+ case MIR_DataType::MIR_SIGNED_INT16:
+ gdalDataType = GDALDataType::GDT_Int16;
+ break;
+
+ case MIR_DataType::MIR_UNSIGNED_INT32:
+ gdalDataType = GDALDataType::GDT_UInt32;
+ break;
+
+ case MIR_DataType::MIR_SIGNED_INT32:
+ gdalDataType = GDALDataType::GDT_Int32;
+ break;
+
+ case MIR_DataType::MIR_REAL4:
+ gdalDataType = GDALDataType::GDT_Float32;
+ break;
+
+ case MIR_DataType::MIR_SIGNED_INT64:
+ case MIR_DataType::MIR_UNSIGNED_INT64:
+ case MIR_DataType::MIR_REAL8:
+ case MIR_DataType::MIR_REAL_LONG:
+ mirDataType = MIR_DataType::MIR_REAL8;
+ gdalDataType = GDALDataType::GDT_Float64;
+ break;
+
+ case MIR_DataType::MIR_BGR:
+ case MIR_DataType::MIR_BGRA:
+ case MIR_DataType::MIR_RGB:
+ case MIR_DataType::MIR_RGBA:
+ gdalDataType = GDALDataType::GDT_UInt32;
+ break;
+
+ //GDAL doesn't have this data type, so promote to 16 bit
+ case MIR_DataType::MIR_SIGNED_INT8:
+ gdalDataType = GDALDataType::GDT_Int16;
+ mirDataType = MIR_DataType::MIR_SIGNED_INT16;
+ break;
+
+ //8 bytes should be sufficient for all types
+ default:
+ mirDataType = MIR_DataType::MIR_REAL8;
+ gdalDataType = GDALDataType::GDT_Float64;
+ }
+
+ return gdalDataType;
+}
+
+bool MRRInitialize(bool logError)
+{
+ if (SDKDynamicImpl::Get().Init() == false)
+ {
+ if (logError)
+ {
+ CPLError(CE_Failure, CPLE_AppDefined, "Unable to load MapInfo MRR SDK \n");
+ }
+ return false;
+ }
+
+ return true;
+}
+
+MRRDataset::MRRDataset(const uint32_t& dsHandle, const uint32_t& infoHandle) : nDatasetHandle(dsHandle), nInfoHandle(infoHandle)
+{
+ pszProjection = CPLStrdup("");
+ dCellSizeX = dCellSizeY = dOriginX = dOriginY = 0.0;
+ nCellAtGridOriginX = nCellAtGridOriginY = 0;
+ pColorTable = nullptr;
+ bCategoriesInitialized = false;
+ pszCategories = nullptr;
+}
+
+MRRDataset::~MRRDataset()
+{
+ SDKDynamicImpl::Get().ReleaseRasterInfo()(nInfoHandle);
+ SMIR_FinalisationOptions cFinalize;
+ SDKDynamicImpl::Get().CloseRaster()(nDatasetHandle, nullptr, InvalidTracker);
+
+ CSLDestroy(pszCategories);
+
+ CPLFree(pszProjection);
+
+ if (pColorTable)
+ delete pColorTable;
+ pColorTable = nullptr;
+}
+
+/*
+ Populate color entries.
+*/
+void MRRDataset::PopulateColorTable(const uint32_t& nFieldIndex)
+{
+ pColorTable = new GDALColorTable();
+
+ uint32_t nRecordCount = 0;
+ auto nDSHandle = GetDSHandle();
+ if (SDKDynamicImpl::Get().ClassTableGetRecordCount()(nDSHandle, nFieldIndex, nRecordCount) == MIRSuccess)
+ {
+ uint32_t nClassTableRGBField = 0;
+ if (SDKDynamicImpl::Get().ClassTableFindField()(nDSHandle, nFieldIndex, MIR_ClassTableFieldType::MIR_TFT_Colour, nClassTableRGBField) == MIRSuccess)
+ {
+ for (uint32_t nRec = 0; nRec < nRecordCount; nRec++)
+ {
+ GDALColorEntry colorEntry;
+ MIR_DataType nDataType;
+ uint32_t nDataSize;
+ uint32_t *pData = nullptr;
+
+ if (SDKDynamicImpl::Get().ClassTableGetRecord()(nDSHandle, nFieldIndex, nClassTableRGBField, nRec, (uint8_t**)&pData, nDataType, nDataSize) == MIRSuccess)
+ {
+ colorEntry.c1 = (uint8_t)((*pData & 0x000000ff)); //red
+ colorEntry.c2 = (uint8_t)((*pData & 0x0000ff00) >> 8); //green
+ colorEntry.c3 = (uint8_t)((*pData & 0x00ff0000) >> 16); //blue
+ colorEntry.c4 = (short)255; //alpha
+
+ SDKDynamicImpl::Get().ReleaseData()((uint8_t**)&pData);
+ }
+
+ pColorTable->SetColorEntry(nRec, &colorEntry);
+ }
+ }
+ else
+ {
+ MIR_ClassTableFieldType nTFTColours[] = { MIR_ClassTableFieldType::MIR_TFT_ColourR, MIR_ClassTableFieldType::MIR_TFT_ColourG, MIR_ClassTableFieldType::MIR_TFT_ColourB };
+ uint32_t nClassTableFields[3] = { 0 };
+
+ for (int nB = 0; nB < 3; nB++)
+ SDKDynamicImpl::Get().ClassTableFindField()(nDSHandle, nFieldIndex, nTFTColours[nB], nClassTableFields[nB]);
+
+ for (uint32_t nRec = 0; nRec < nRecordCount; nRec++)
+ {
+ GDALColorEntry colorEntry;
+ uint32_t *pData = nullptr;
+ MIR_DataType nDataType;
+ uint32_t nDataSize;
+
+ if (SDKDynamicImpl::Get().ClassTableGetRecord()(nDSHandle, nFieldIndex, nClassTableFields[0], nRec, (uint8_t**)&pData, nDataType, nDataSize) == MIRSuccess)
+ {
+ colorEntry.c1 = (uint8_t)((*pData)); //red
+ SDKDynamicImpl::Get().ReleaseData()((uint8_t**)&pData);
+ }
+ if (SDKDynamicImpl::Get().ClassTableGetRecord()(nDSHandle, nFieldIndex, nClassTableFields[1], nRec, (uint8_t**)&pData, nDataType, nDataSize) == MIRSuccess)
+ {
+ colorEntry.c2 = (uint8_t)((*pData)); //green
+ SDKDynamicImpl::Get().ReleaseData()((uint8_t**)&pData);
+ }
+ if (SDKDynamicImpl::Get().ClassTableGetRecord()(nDSHandle, nFieldIndex, nClassTableFields[2], nRec, (uint8_t**)&pData, nDataType, nDataSize) == MIRSuccess)
+ {
+ colorEntry.c3 = (uint8_t)((*pData)); //blue
+ SDKDynamicImpl::Get().ReleaseData()((uint8_t**)&pData);
+ }
+
+ colorEntry.c4 = (short)255; //alpha
+ pColorTable->SetColorEntry(nRec, &colorEntry);
+ }
+ }
+ }
+}
+
+/*
+ Populate categories.
+*/
+void MRRDataset::PopulateCategories(const uint32_t& nFieldIndex)
+{
+ if (bCategoriesInitialized)
+ return;
+
+ uint32_t nRecordCount = 0;
+ auto nDSHandle = GetDSHandle();
+ if (SDKDynamicImpl::Get().ClassTableGetRecordCount()(nDSHandle, nFieldIndex, nRecordCount) == MIRSuccess)
+ {
+ {
+ uint32_t nClassTableLabelField = 0;
+ if (SDKDynamicImpl::Get().ClassTableFindField()(nDSHandle, nFieldIndex, MIR_ClassTableFieldType::MIR_TFT_Label, nClassTableLabelField) == MIRSuccess)
+ {
+ pszCategories = (char**)CPLCalloc(nRecordCount + 2, sizeof(char*));
+
+ for (uint32_t nRec = 0; nRec < nRecordCount; nRec++)
+ {
+ MIR_DataType nDataType;
+ uint32_t nDataSize;
+ uint8_t *pData = nullptr;
+
+ if (SDKDynamicImpl::Get().ClassTableGetRecord()(nDSHandle, nFieldIndex, nClassTableLabelField, nRec, (uint8_t**)&pData, nDataType, nDataSize) == MIRSuccess)
+ {
+ char* pStr = (char*)CPLMalloc(nDataSize + 1);
+ strncpy(pStr, (char*)pData, nDataSize);
+ pStr[nDataSize] = '\0';
+ pszCategories[nRec] = pStr;
+
+ SDKDynamicImpl::Get().ReleaseData()((uint8_t**)&pData);
+ }
+ else
+ {
+ pszCategories[nRec] = CPLStrdup("");
+ }
+ }
+
+ //Let's not leave any entry to null, mark them as ""
+ for (uint32_t nID = 0; nID < nRecordCount; nID++)
+ {
+ if (pszCategories[nID] == nullptr)
+ pszCategories[nID] = CPLStrdup("");
+ }
+
+ pszCategories[nRecordCount + 1] = nullptr;
+ }
+ }
+ }
+
+ bCategoriesInitialized = true;
+}
+
+char** MRRDataset::GetCategoryNames(const CPL_UNUSED uint32_t& nField)
+{
+ return pszCategories;
+}
+
+
+GDALDataset *MRRDataset::OpenMRR(GDALOpenInfo * poOpenInfo)
+{
+ if (MRRInitialize() == false)
+ return nullptr;
+
+ // -------------------------------------------------------------------- //
+ // Confirm that the file is a valid MRR dataset. //
+ // -------------------------------------------------------------------- //
+
+ if (!IdentifyMRR(poOpenInfo))
+ return nullptr;
+
+ // -------------------------------------------------------------------- //
+ // Confirm the requested access is supported. //
+ // -------------------------------------------------------------------- //
+ if (poOpenInfo->eAccess == GA_Update)
+ {
+ CPLError(CE_Failure, CPLE_NotSupported, "MapInfo MRR driver does not support update access to existing files"
+ " datasets.\n");
+ return nullptr;
+ }
+
+ // -------------------------------------------------------------------- //
+ // Create a corresponding GDALDataset. //
+ // -------------------------------------------------------------------- //
+
+ uint32_t nDSHandle = MIRInvalidHandle, nInfoHandle = MIRInvalidHandle;
+ {
+ wchar_t *pwszFilename = CPLRecodeToWChar(poOpenInfo->pszFilename, CPL_ENC_UTF8, CPL_ENC_UCS2);
+ if (SDKDynamicImpl::Get().OpenRaster_ReadOnly()(pwszFilename, nDSHandle, MIR_RasterSupportMode::MIR_Support_Full, MIR_FieldType::MIR_FIELD_Default, InvalidTracker) != MIRSuccess)
+ {
+ CPLError(CE_Failure, CPLE_OpenFailed, "MapInfo MRR driver is unable to open the file.\n");
+ CPLFree(pwszFilename);
+ return nullptr;
+ }
+ CPLFree(pwszFilename);
+ }
+
+ MRRDataset* poDS = nullptr;
+ const uint32_t nFieldIndex = 0;
+ if (SDKDynamicImpl::Get().GetOpenInfo()(nDSHandle, nInfoHandle, InvalidTracker) == MIRSuccess)
+ {
+ SMIR_RasterInfo *pRasterInfo = nullptr;
+ SMIR_FieldInfo* pFieldInfo = nullptr;
+ uint32_t nXBlockSize, nYBlockSize;
+
+ SDKDynamicImpl::Get().RasterInfo()(nInfoHandle, &pRasterInfo);
+
+ SDKDynamicImpl::Get().FieldInfo()(nInfoHandle, 0, &pFieldInfo);
+ uint32_t nBandCount = SDKDynamicImpl::Get().InfoBandCount()(nInfoHandle, nFieldIndex);
+
+ poDS = new MRRDataset(nDSHandle, nInfoHandle);
+ poDS->nRasterXSize = (int)pRasterInfo->nGridSizeX;
+ poDS->nRasterYSize = (int)pRasterInfo->nGridSizeY;
+ nXBlockSize = (uint32_t)pRasterInfo->nBaseTileSizeX;
+ nYBlockSize = (uint32_t)pRasterInfo->nBaseTileSizeY;
+ poDS->nXBlocksCount = (uint32_t)ceil((double)(pRasterInfo->nGridSizeX * 1.0 / nXBlockSize));
+ poDS->nYBlocksCount = (uint32_t)ceil((double)(pRasterInfo->nGridSizeY * 1.0 / nYBlockSize));
+
+ poDS->dCellSizeX = pFieldInfo->cCellSizeX.m_dDecimal;
+ poDS->dCellSizeY = pFieldInfo->cCellSizeY.m_dDecimal;
+ poDS->dOriginX = pFieldInfo->cTileOriginX.m_dDecimal;
+ poDS->dOriginY = pFieldInfo->cTileOriginY.m_dDecimal;
+
+ poDS->nCellAtGridOriginX = pFieldInfo->nCellAtGridOriginX;
+ poDS->nCellAtGridOriginY = pFieldInfo->nCellAtGridOriginY;
+
+ //Convert projection to WKT
+ OGRSpatialReference oSRS;
+ auto pCoordSys = CPLRecodeFromWChar(pRasterInfo->sCoordinateSystem, CPL_ENC_UCS2, CPL_ENC_UTF8);
+ if (pCoordSys && oSRS.importFromMICoordSys(pCoordSys) == OGRERR_NONE)
+ {
+ CPLFree(poDS->pszProjection);
+ oSRS.exportToWkt(&poDS->pszProjection);
+ }
+ poDS->SetProjection(poDS->pszProjection);
+ CPLFree(pCoordSys);
+
+ // -------------------------------------------------------------------- //
+ // Mount Bands, Create band information objects. //
+ // -------------------------------------------------------------------- //
+
+ switch (pFieldInfo->nType)
+ {
+ //Mount all bands
+ case MIR_FieldType::MIR_FIELD_Continuous:
+ {
+ uint32_t nGDALBandIndex = 1;
+ for (uint32_t nBand = 0; nBand < nBandCount; nBand++)
+ {
+ SMIR_BandInfo* pBandInfo = nullptr;
+ if (SDKDynamicImpl::Get().BandInfo()(nInfoHandle, nFieldIndex, nBand, &pBandInfo) == MIRSuccess)
+ {
+ auto nMIRDataType = pBandInfo->nDataType;
+ auto nGDALDataType = AdjustBandDataType(nMIRDataType);
+ poDS->SetBand(nGDALBandIndex, new MRRRasterBand(poDS, pFieldInfo->nType, nFieldIndex, nBand, 0, nMIRDataType,
+ nGDALDataType, (int)pRasterInfo->nGridSizeX, (int)pRasterInfo->nGridSizeY, nXBlockSize, nYBlockSize));
+ nGDALBandIndex++;
+ }
+ }
+ }
+ break;
+
+ //If band count is >= 4 , mount 3 bands starting from 1st index.
+ //If there is only one band, mount 0th band.
+ case MIR_FieldType::MIR_FIELD_Image:
+ {
+ if (nBandCount >= 4)
+ {
+ uint32_t nGDALBandIndex = 1;
+ uint32_t nMRRBandIndex = 1;
+ for (uint32_t nB = 1; nB <= nBandCount; nB++)
+ {
+ SMIR_BandInfo* pBandInfo = nullptr;
+ if (SDKDynamicImpl::Get().BandInfo()(nInfoHandle, nFieldIndex, nB, &pBandInfo) == MIRSuccess)
+ {
+ auto nMIRDataType = pBandInfo->nDataType;
+ auto nGDALDataType = AdjustBandDataType(nMIRDataType);
+ poDS->SetBand(nGDALBandIndex, new MRRRasterBand(poDS, pFieldInfo->nType, nFieldIndex, nMRRBandIndex, 0, nMIRDataType,
+ nGDALDataType, (int)pRasterInfo->nGridSizeX, (int)pRasterInfo->nGridSizeY, nXBlockSize, nYBlockSize));
+ nGDALBandIndex++;
+ nMRRBandIndex++;
+ }
+ }
+ }
+ else if (nBandCount == 1)
+ {
+ uint32_t nMRRBandIndex = 0;
+ SMIR_BandInfo* pBandInfo = nullptr;
+ if (SDKDynamicImpl::Get().BandInfo()(nInfoHandle, nFieldIndex, nMRRBandIndex, &pBandInfo) == MIRSuccess)
+ {
+ auto nMIRDataType = pBandInfo->nDataType;
+ auto nGDALDataType = AdjustBandDataType(nMIRDataType);
+ uint32_t nGDALBandIndex = 1;
+
+ poDS->SetBand(nGDALBandIndex, new MRRRasterBand(poDS, pFieldInfo->nType, nFieldIndex, nMRRBandIndex, 0, nMIRDataType,
+ nGDALDataType, (int)pRasterInfo->nGridSizeX, (int)pRasterInfo->nGridSizeY, nXBlockSize, nYBlockSize));
+ nGDALBandIndex++;
+ }
+ }
+ }
+ break;
+
+ //Mount 0th band, populate Colour table too.
+ case MIR_FieldType::MIR_FIELD_ImagePalette:
+ {
+ uint32_t nMRRBandIndex = 0;
+ SMIR_BandInfo* pBandInfo = nullptr;
+ if (SDKDynamicImpl::Get().BandInfo()(nInfoHandle, nFieldIndex, nMRRBandIndex, &pBandInfo) == MIRSuccess)
+ {
+ auto nMIRDataType = pBandInfo->nDataType;
+ auto nGDALDataType = AdjustBandDataType(nMIRDataType);
+ uint32_t nGDALBandIndex = 1;
+
+ poDS->SetBand(nGDALBandIndex, new MRRRasterBand(poDS, pFieldInfo->nType, nFieldIndex, nMRRBandIndex, 0, nMIRDataType,
+ nGDALDataType, (int)pRasterInfo->nGridSizeX, (int)pRasterInfo->nGridSizeY, nXBlockSize, nYBlockSize));
+ nGDALBandIndex++;
+ }
+
+ ///////////////////////////////////////////////////////
+ //Initialize color table here.
+ ///////////////////////////////////////////////////////
+ {
+ poDS->PopulateColorTable(nFieldIndex);
+ }
+ }
+ break;
+
+ //Mount 0th band, populate Colour table and Categories.
+ case MIR_FieldType::MIR_FIELD_Classified:
+ {
+ uint32_t nGDALBandIndex = 1;
+ uint32_t nMRRBandIndex = 0;
+ SMIR_BandInfo* pBandInfo = nullptr;
+ if (SDKDynamicImpl::Get().BandInfo()(nInfoHandle, nFieldIndex, nMRRBandIndex, &pBandInfo) == MIRSuccess)
+ {
+ auto nMIRDataType = pBandInfo->nDataType;
+ auto nGDALDataType = AdjustBandDataType(nMIRDataType);
+ poDS->SetBand(nGDALBandIndex, new MRRRasterBand(poDS, pFieldInfo->nType, nFieldIndex, nMRRBandIndex, 0, nMIRDataType,
+ nGDALDataType, (int)pRasterInfo->nGridSizeX, (int)pRasterInfo->nGridSizeY, nXBlockSize, nYBlockSize));
+ nGDALBandIndex++;
+ }
+
+ ///////////////////////////////////////////////////////
+ //Initialize color table here.
+ ///////////////////////////////////////////////////////
+ {
+ poDS->PopulateColorTable(nFieldIndex);
+ }
+
+ ///////////////////////////////////////////////////////
+ //Initialize class table (categories) here.
+ ///////////////////////////////////////////////////////
+ {
+ poDS->PopulateCategories(nFieldIndex);
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ // -------------------------------------------------------------------- //
+ // Initialize any PAM information. //
+ // -------------------------------------------------------------------- //
+ poDS->SetDescription(poOpenInfo->pszFilename);
+
+ // -------------------------------------------------------------------- //
+ // Initialize default overviews. //
+ // -------------------------------------------------------------------- //
+ poDS->oOvManager.Initialize(poDS, poOpenInfo->pszFilename);
+ }
+
+ return(poDS);
+}
+
+
+
+// IdentifyMRR()
+//Return 1 if the passed file is certainly recognized by the driver
+//Return 0 if the passed file is certainly NOT recognized by the driver
+//Return - 1 if the passed file may be or may not be recognized by the driver and that a potentially costly test must be done with pfnOpen.
+
+int MRRDataset::IdentifyMRR(GDALOpenInfo * poOpenInfo)
+{
+ if (MRRInitialize() == false)
+ return 0;
+
+ if (EQUAL(CPLGetExtension(poOpenInfo->pszFilename), "mrr"))
+ {
+ const char* pszFileName = poOpenInfo->pszFilename;
+ {
+ wchar_t *pwszFilename = CPLRecodeToWChar(pszFileName, CPL_ENC_UTF8, CPL_ENC_UCS2);
+ bool bIdentify = (SDKDynamicImpl::Get().VerifyRaster() && SDKDynamicImpl::Get().VerifyRaster()(pwszFilename) == MIRSuccess);
+ CPLFree(pwszFilename);
+ return bIdentify ? 1 : 0;
+ }
+ }
+
+ return 0;
+}
+
+/************************************************************************/
+/* GetGeoTransform() */
+/************************************************************************/
+
+CPLErr MRRDataset::GetGeoTransform(double * padfTransform)
+{
+ padfTransform[0] = dOriginX; /* X Origin (top left corner) */
+ padfTransform[1] = dCellSizeX; /* X Pixel size */
+ padfTransform[2] = 0;
+ padfTransform[3] = dOriginY + (dCellSizeY * nRasterYSize); /* Y Origin (top left corner) */
+ padfTransform[4] = 0;
+ padfTransform[5] = -dCellSizeY; /* Y Pixel Size */
+
+ return CE_None;
+}
+
+const char * MRRDataset::GetProjectionRef()
+{
+ return pszProjection;
+}
+
+void GDALDeregister_MRR(GDALDriver *)
+{
+}
+
+void GDALRegister_MRR()
+{
+ if (!GDAL_CHECK_VERSION("MRR"))
+ return;
+
+ if (MRRInitialize(false) == false)
+ return;
+
+ if (GDALGetDriverByName("MRR") == nullptr)
+ {
+ GDALDriver *poDriver = new GDALDriver();
+
+ poDriver->SetDescription("MRR");
+ poDriver->SetMetadataItem(GDAL_DCAP_RASTER, "YES");
+ poDriver->SetMetadataItem(GDAL_DMD_LONGNAME, "MapInfo Multi Resolution Raster");
+ poDriver->SetMetadataItem(GDAL_DMD_HELPTOPIC, "frmt_mrr.html");
+ poDriver->SetMetadataItem(GDAL_DMD_EXTENSION, "mrr");
+
+ poDriver->pfnOpen = MRRDataset::OpenMRR;
+ poDriver->pfnIdentify = MRRDataset::IdentifyMRR;
+ poDriver->pfnUnloadDriver = GDALDeregister_MRR;
+
+ GetGDALDriverManager()->RegisterDriver(poDriver);
+ }
+}
diff --git a/gdal/frmts/mrr/MRRDataset.h b/gdal/frmts/mrr/MRRDataset.h
new file mode 100644
index 000000000000..a1d55a813d61
--- /dev/null
+++ b/gdal/frmts/mrr/MRRDataset.h
@@ -0,0 +1,56 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+#include "gdal_pam.h"
+#include "APIDef.h"
+
+class MRRDataset : public GDALPamDataset
+{
+ friend class MRRRasterBand;
+ uint32_t nDatasetHandle;
+ uint32_t nInfoHandle;
+ uint32_t nXBlocksCount; //block count in X direction
+ uint32_t nYBlocksCount; //block count in Y direction
+ int64_t nCellAtGridOriginX; //Cell Offset in X direction
+ int64_t nCellAtGridOriginY; //Cell Offset in Y direction
+ double dCellSizeX, dCellSizeY, dOriginX, dOriginY;
+ char* pszProjection;
+ bool bCategoriesInitialized;
+ char** pszCategories;
+ GDALColorTable* pColorTable;
+
+
+ MRRDataset() {}
+ const uint32_t& GetDSHandle() const { return nDatasetHandle; }
+ const uint32_t& GetInfoHandle() const { return nInfoHandle; }
+ const unsigned int & GetXBlocks() { return nXBlocksCount; }
+ const unsigned int & GetYBlocks() { return nYBlocksCount; }
+ void PopulateColorTable(const uint32_t& nFieldIndex);
+ void PopulateCategories(const uint32_t& nFieldIndex);
+ GDALColorTable* GetColorTable() const { return pColorTable; }
+ char** GetCategoryNames(const uint32_t& nField);
+
+public:
+ MRRDataset(const uint32_t& nDatasetHandle, const uint32_t& nInfoHandle);
+ ~MRRDataset();
+
+ CPLErr GetGeoTransform(double * padfTransform) override;
+ const char * GetProjectionRef();
+
+ //Static methods
+ static GDALDataset* OpenMRR(GDALOpenInfo *);
+ static int IdentifyMRR(GDALOpenInfo *);
+};
+
+
diff --git a/gdal/frmts/mrr/MRRRasterBand.cpp b/gdal/frmts/mrr/MRRRasterBand.cpp
new file mode 100644
index 000000000000..94f8a7d0615c
--- /dev/null
+++ b/gdal/frmts/mrr/MRRRasterBand.cpp
@@ -0,0 +1,670 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+#include "MRRDataset.h"
+#include "MRRRasterBand.h"
+#include "MRRSDKImpl.h"
+#include
+
+/*
+ Fill data array with NoDataValue If cell is not valid.
+*/
+
+//////////////////////////////////////////////////////////////////////////
+// Method declarations
+void FilterDataArray(const int& nXSize, const int& nYSize, uint8_t* pDataArray, uint8_t* pValidArray, const MIR_DataType& nDataType, const double& dNoDataValue);
+MIR_DataType ConvertToMIRDataTypes(const GDALDataType& gdalDataType);
+double DataTypeNoDataVal(const MIR_DataType& mirDataType);
+MIR_InterpolationMethod GetInterpMethod(const GDALRIOResampleAlg& resampleAlgo);
+CPLErr MIRReadBlock(const uint32_t& nItHandle, const uint32_t& nBand, const int64_t& nCellX, const int64_t& nCellY,
+ const int& nBlockXSize, const int& nBlockYSize, const MIR_DataType& nDataType, const uint32_t& nSizeInByte, void* pImage, const double& dNoDataValue);
+//////////////////////////////////////////////////////////////////////////
+
+
+void FilterDataArray(const int& nXSize, const int& nYSize, uint8_t* pDataArray, uint8_t* pValidArray, const MIR_DataType& nDataType, const double& dNoDataValue)
+{
+ for (int nY = 0; nY < nYSize; nY++)
+ {
+ auto nRowPos = nXSize * nY;
+ for (int nX = 0; nX < nXSize; nX++)
+ {
+ auto nCellPos = nRowPos + nX;
+ if (pValidArray[nCellPos] != 1)
+ {
+ switch (nDataType)
+ {
+ case MIR_DataType::MIR_BIT1: //GDAL doesn't have these data types, so promote to 8 bit
+ case MIR_DataType::MIR_BIT2:
+ case MIR_DataType::MIR_BIT4:
+ case MIR_DataType::MIR_RED:
+ case MIR_DataType::MIR_GREEN:
+ case MIR_DataType::MIR_BLUE:
+ case MIR_DataType::MIR_ALPHA:
+ case MIR_DataType::MIR_GREY:
+ case MIR_DataType::MIR_UNSIGNED_INT8:
+ ((uint8_t*)pDataArray)[nCellPos] = (uint8_t)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_RED_ALPHA:
+ case MIR_DataType::MIR_BLUE_ALPHA:
+ case MIR_DataType::MIR_GREEN_ALPHA:
+ case MIR_DataType::MIR_GREY_ALPHA:
+ case MIR_DataType::MIR_UNSIGNED_INT16:
+ ((uint16_t*)pDataArray)[nCellPos] = (uint16_t)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_SIGNED_INT16:
+ ((int16_t*)pDataArray)[nCellPos] = (int16_t)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_UNSIGNED_INT32:
+ ((uint32_t*)pDataArray)[nCellPos] = (uint32_t)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_SIGNED_INT32:
+ ((int32_t*)pDataArray)[nCellPos] = (int32_t)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_REAL4:
+ // cppcheck-suppress invalidPointerCast
+ ((float*)pDataArray)[nCellPos] = (float)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_SIGNED_INT64:
+ case MIR_DataType::MIR_UNSIGNED_INT64:
+ case MIR_DataType::MIR_REAL8:
+ case MIR_DataType::MIR_REAL_LONG:
+ // cppcheck-suppress invalidPointerCast
+ ((double*)pDataArray)[nCellPos] = (double)dNoDataValue;
+ break;
+
+ case MIR_DataType::MIR_BGR:
+ case MIR_DataType::MIR_BGRA:
+ case MIR_DataType::MIR_RGB:
+ case MIR_DataType::MIR_RGBA:
+ ((uint32_t*)pDataArray)[nCellPos] = (uint32_t)dNoDataValue;
+ break;
+
+ //GDAL doesn't have this data type, so promote to 16 bit
+ case MIR_DataType::MIR_SIGNED_INT8:
+ ((int16_t*)pDataArray)[nCellPos] = (std::numeric_limits::max)();
+ break;
+
+ //8 bytes should be sufficient for rest of the types.
+ default:
+ // cppcheck-suppress invalidPointerCast
+ ((double*)pDataArray)[nCellPos] = (double)dNoDataValue;
+
+ }
+ }
+ }
+ }
+}
+
+/*
+ Convert GDALDataType to corresponding MIRDataType
+*/
+MIR_DataType ConvertToMIRDataTypes(const GDALDataType& gdalDataType)
+{
+ switch (gdalDataType)
+ {
+ case GDALDataType::GDT_Byte:
+ return MIR_DataType::MIR_UNSIGNED_INT8;
+ case GDALDataType::GDT_Int16:
+ return MIR_DataType::MIR_SIGNED_INT16;
+ case GDALDataType::GDT_UInt16:
+ return MIR_DataType::MIR_UNSIGNED_INT16;
+ case GDALDataType::GDT_Int32:
+ return MIR_DataType::MIR_SIGNED_INT32;
+ case GDALDataType::GDT_UInt32:
+ return MIR_DataType::MIR_UNSIGNED_INT32;
+ case GDALDataType::GDT_Float32:
+ return MIR_DataType::MIR_REAL4;
+ default:
+ case GDALDataType::GDT_Float64:
+ return MIR_DataType::MIR_REAL8;
+ }
+}
+
+/*
+ Returns NoDataValue for the datatype.
+*/
+double DataTypeNoDataVal(const MIR_DataType& mirDataType)
+{
+ switch (mirDataType)
+ {
+ case MIR_DataType::MIR_BIT1: //GDAL doesn't have these data types, so promote to 8 bit
+ case MIR_DataType::MIR_BIT2:
+ case MIR_DataType::MIR_BIT4:
+ case MIR_DataType::MIR_RED:
+ case MIR_DataType::MIR_GREEN:
+ case MIR_DataType::MIR_BLUE:
+ case MIR_DataType::MIR_ALPHA:
+ case MIR_DataType::MIR_GREY:
+ case MIR_DataType::MIR_UNSIGNED_INT8:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_RED_ALPHA:
+ case MIR_DataType::MIR_BLUE_ALPHA:
+ case MIR_DataType::MIR_GREEN_ALPHA:
+ case MIR_DataType::MIR_GREY_ALPHA:
+ case MIR_DataType::MIR_UNSIGNED_INT16:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_SIGNED_INT16:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_UNSIGNED_INT32:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_SIGNED_INT32:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_REAL4:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_SIGNED_INT64:
+ case MIR_DataType::MIR_UNSIGNED_INT64:
+ case MIR_DataType::MIR_REAL8:
+ return (std::numeric_limits::max)();
+
+ case MIR_DataType::MIR_BGR:
+ case MIR_DataType::MIR_BGRA:
+ case MIR_DataType::MIR_RGB:
+ case MIR_DataType::MIR_RGBA:
+ return (std::numeric_limits::max)();
+
+ //GDAL doesn't have this data type, so promote to 16 bit
+ case MIR_DataType::MIR_SIGNED_INT8:
+ return (std::numeric_limits::max)();
+
+ //8 bytes should be sufficient for rest of the types.
+ default:
+ return (std::numeric_limits::max)();
+ }
+}
+
+MIR_InterpolationMethod GetInterpMethod(const GDALRIOResampleAlg& resampleAlgo)
+{
+ switch (resampleAlgo)
+ {
+ case GDALRIOResampleAlg::GRIORA_NearestNeighbour:
+ return MIR_InterpolationMethod::Interp_Nearest;
+ case GDALRIOResampleAlg::GRIORA_Bilinear:
+ return MIR_InterpolationMethod::Interp_Linear;
+ case GDALRIOResampleAlg::GRIORA_Cubic:
+ return MIR_InterpolationMethod::Interp_Cubic;
+ case GDALRIOResampleAlg::GRIORA_CubicSpline:
+ return MIR_InterpolationMethod::Interp_CubicOperator;
+ default:
+ return MIR_InterpolationMethod::Interp_Default;
+ }
+}
+
+CPLErr MIRReadBlock(const uint32_t& nItHandle, const uint32_t& nBand, const int64_t& nCellX, const int64_t& nCellY,
+ const int& nBlockXSize, const int& nBlockYSize, const MIR_DataType& nDataType, const uint32_t& nSizeInByte, void* pImage, const double& dNoDataValue)
+{
+ uint8_t *pszRecord = nullptr;
+ uint8_t *pszValid = nullptr;
+
+ if (SDKDynamicImpl::Get().RBIGetBlock()(nItHandle, nBand, nCellX, nCellY, nBlockXSize, nBlockYSize, &pszRecord, &pszValid, nDataType, true) == MIRSuccess)
+ {
+ FilterDataArray(nBlockXSize, nBlockYSize, pszRecord, pszValid, nDataType, dNoDataValue);
+
+ uint8_t *pDstImage = (uint8_t *)pImage;
+ uint8_t *pSrcImage = (uint8_t *)pszRecord + nBlockXSize * (nBlockYSize)*nSizeInByte;
+
+ for (int nY = 0; nY < nBlockYSize; nY++)
+ {
+ pSrcImage -= nBlockXSize * nSizeInByte;
+ memcpy(pDstImage, pSrcImage, nBlockXSize*nSizeInByte);
+ pDstImage += nBlockXSize * nSizeInByte;
+ }
+
+ SDKDynamicImpl::Get().ReleaseData()(&pszRecord);
+ SDKDynamicImpl::Get().ReleaseData()(&pszValid);
+ }
+
+ return CE_None;
+}
+
+MRRRasterBand::MRRRasterBand(MRRDataset *pDS, const MIR_FieldType & nType, const int& nFieldIndex, const int& nBandIndex, const int& nLevel,
+ const MIR_DataType& nMirDataType, const GDALDataType& nGDALBandDataType, const int& nXSize, const int& nYSize, const uint32_t& nXBlockSize, const uint32_t& nYBlockSize)
+{
+ this->poDS = pDS;
+ nFieldType = nType;
+ eDataType = nGDALBandDataType;
+
+ nRasterXSize = nXSize;
+ nRasterYSize = nYSize;
+
+ nBlockXSize = nXBlockSize;
+ nBlockYSize = nYBlockSize;
+
+ nField = nFieldIndex;
+ nMRRBandIndex = nBandIndex;
+ nEvent = 0;
+
+ nXBlocksCount = (uint32_t)ceil((double)(nRasterXSize * 1.0 / nBlockXSize));
+ nYBlocksCount = (uint32_t)ceil((double)(nRasterYSize * 1.0 / nBlockYSize));
+ nXBlocksCount = nXBlocksCount == 0 ? 1 : nXBlocksCount;
+ nYBlocksCount = nYBlocksCount == 0 ? 1 : nYBlocksCount;
+
+ nResolution = nLevel;
+ nMIRDataType = nMirDataType;
+ nSizeInBytes = SDKDynamicImpl::Get().DataTypeSizeInBytes()(nMirDataType);
+
+ pStatistics = nullptr;
+ bIteratorInitialized = false;
+ nIteratorHandle = 0;
+
+ SetNoDataValue(DataTypeNoDataVal(nMIRDataType));
+
+ //In case of base level define overviews.
+ if (nLevel == 0)
+ {
+ auto nLevels = SDKDynamicImpl::Get().InfoLevelCount()(pDS->nInfoHandle, nField, nEvent);
+ for (uint32_t nL = 1; nL < nLevels; nL++)
+ {
+ SMIR_LevelInfo* pLevelInfo = nullptr;
+ SDKDynamicImpl::Get().LevelInfo()(pDS->nInfoHandle, nField, nEvent, nL, &pLevelInfo);
+ if (pLevelInfo)
+ {
+ auto nLevelWidth = pLevelInfo->nCellBBoxXMax - pLevelInfo->nCellBBoxXMin;
+ auto nLevelHeight = pLevelInfo->nCellBBoxYMax - pLevelInfo->nCellBBoxYMin;
+
+ auto nLevelBlockSizeX = nBlockXSize > nLevelWidth ? nLevelWidth : nBlockXSize;
+ auto nLevelBlockSizeY = nBlockYSize > nLevelHeight ? nLevelHeight : nBlockYSize;
+
+ vOverviewBands.push_back(std::unique_ptr(new MRRRasterBand(pDS, nType, nField, nBandIndex, nL, nMirDataType, nGDALBandDataType,
+ (int)nLevelWidth, (int)nLevelHeight, (uint32_t)nLevelBlockSizeX, (uint32_t)nLevelBlockSizeY)));
+ }
+ }
+ }
+}
+
+MRRRasterBand::~MRRRasterBand()
+{
+ ReleaseStats();
+
+ ReleaseIterator();
+}
+
+GDALRasterBand *MRRRasterBand::GetOverview(int iOverview)
+{
+ if (iOverview >= 0 && iOverview < (int)vOverviewBands.size() && vOverviewBands[iOverview].get())
+ return vOverviewBands[iOverview].get();
+ else
+ return nullptr;
+}
+
+bool MRRRasterBand::BeginIterator()
+{
+ if (bIteratorInitialized)
+ return true;
+
+ bIteratorInitialized = SDKDynamicImpl::Get().RBIBeginRead()(((MRRDataset *)poDS)->GetDSHandle(), GetIterator(), nField, INTPTR_MIN, INTPTR_MAX, nResolution, false) == MIRSuccess;
+
+ return bIteratorInitialized;
+}
+
+bool MRRRasterBand::ReleaseIterator()
+{
+ if (bIteratorInitialized)
+ return (SDKDynamicImpl::Get().RBIEnd()(GetIterator()) == MIRSuccess);
+
+ bIteratorInitialized = false;
+
+ return true;
+}
+
+void MRRRasterBand::ReleaseStats()
+{
+ if (pStatistics != nullptr)
+ SDKDynamicImpl::Get().ReleaseStatistics()(&pStatistics);
+ pStatistics = nullptr;
+}
+
+CPLErr MRRRasterBand::IReadBlock(int nBlockXOff, int nBlockYOff, void * pImage)
+{
+ CPLErr nResult = CE_Failure;
+
+ if (BeginIterator())
+ {
+ int64_t nCellX = nBlockXOff * nBlockXSize;
+ int64_t nCellY = (nYBlocksCount - nBlockYOff - 1) * nBlockYSize;
+
+ nResult = MIRReadBlock(GetIterator(), MRRBandIndex(), nCellX, nCellY, nBlockXSize, nBlockYSize, nMIRDataType, nSizeInBytes, pImage, GetNoDataValue());
+
+ if (nResult != CE_None)
+ {
+ CPLError(CE_Failure, CPLE_AppDefined, "Unable to read block. \n");
+ }
+ }
+
+ return nResult;
+}
+
+CPLErr MRRRasterBand::IRasterIO(GDALRWFlag eRWFlag,
+ int nXOff, int nYOff,
+ int nXSize, int nYSize, //Source size X and Y
+ void * pData,
+ int nBufXSize, int nBufYSize, //Destination size X and Y
+ GDALDataType eBufType,
+ GSpacing /*nPixelSpace*/, GSpacing /*nLineSpace*/,
+ GDALRasterIOExtraArg* psExtraArg)
+{
+ if (eRWFlag == GF_Write)
+ return CE_Failure;
+
+ /* if (nPixelSpace != (GDALGetDataTypeSize(eBufType) / 8))
+ return GDALRasterBand::IRasterIO(eRWFlag,
+ nXOff, nYOff, nXSize, nYSize,
+ pData, nBufXSize, nBufYSize,
+ eBufType,
+ nPixelSpace, nLineSpace,
+ psExtraArg); */
+
+ int nMRRXOffset = nXOff + (int)((MRRDataset*)poDS)->nCellAtGridOriginX;
+ int nMRRRYOffset = ((MRRDataset*)poDS)->nRasterYSize - nYOff - nYSize + (int)((MRRDataset*)poDS)->nCellAtGridOriginY;
+ MIR_InterpolationMethod nInterpMethod = psExtraArg != nullptr ? GetInterpMethod(psExtraArg->eResampleAlg) : MIR_InterpolationMethod::Interp_Default;
+
+ /*
+ if (nPixelSpace == 0)
+ nPixelSpace = GDALGetDataTypeSize(eBufType) / 8;
+
+ if (nLineSpace == 0)
+ nLineSpace = nPixelSpace * nBufXSize;
+ */
+
+ CPLDebug("MRRRasterBand",
+ "RasterIO(nBand=%d,nlevel=%d,nXOff=%d,nYOff=%d,nXSize=%d,nYSize=%d -> %dx%d)",
+ MRRBandIndex(), nResolution, nXOff, nYOff, nXSize, nYSize, nBufXSize, nBufYSize);
+
+ uint8_t* pDataArray = nullptr;
+ uint8_t* pValidArray = nullptr;
+
+ auto nDataType = ConvertToMIRDataTypes(eBufType);
+
+ auto nSizeInByte = GDALGetDataTypeSize(eBufType) / 8;
+ if (nSizeInByte == SDKDynamicImpl::Get().DataTypeSizeInBytes()(nDataType))
+ {
+ if (SDKDynamicImpl::Get().PopulateCellBlock()(((MRRDataset*)poDS)->GetDSHandle(), &pDataArray, &pValidArray, nDataType,
+ nMRRXOffset, nMRRRYOffset, nXSize, nYSize, nBufXSize, nBufYSize, nField, MRRBandIndex(), nInterpMethod,
+ std::numeric_limits::lowest(), (std::numeric_limits::max)()) == MIRSuccess)
+ {
+ auto dNoDataValue = GetNoDataValue();
+ FilterDataArray(nBufXSize, nBufYSize, pDataArray, pValidArray, nDataType, dNoDataValue);
+
+ uint8_t *pDstImage = (uint8_t *)pData;
+ uint8_t *pSrcImage = (uint8_t *)pDataArray + nBufXSize * (nBufYSize)*nSizeInByte;
+
+ for (int nY = 0; nY < nBufYSize; nY++)
+ {
+ pSrcImage -= nBufXSize * nSizeInByte;
+ memcpy(pDstImage, pSrcImage, nBufXSize*nSizeInByte);
+ pDstImage += nBufXSize * nSizeInByte;
+ }
+
+ SDKDynamicImpl::Get().ReleaseData()(&pDataArray);
+ SDKDynamicImpl::Get().ReleaseData()(&pValidArray);
+
+ return CE_None;
+ }
+ }
+
+ return CE_Failure;
+}
+
+bool MRRRasterBand::StatisticsEnsureInitialized(bool bSummary, int bApproxOk, CPL_UNUSED bool bCompute, int nBins)
+{
+ bool bResult = true;
+ int nBuckets = nBins == 0 ? (int)InvalidBinCount : nBins;
+
+ //Check if we need to initialize
+ if (GetStats() == nullptr || (GetStats() != nullptr && (int)GetStats()->cEWHistogram.nBinCount != nBuckets && nBuckets != (int)InvalidBinCount))
+ {
+ //Release statistics if required.
+ ReleaseStats();
+
+ auto nStatsMode = MIR_StatisticsMode::MIR_StatsMode_Distribution;
+ if (bSummary)
+ {
+ nStatsMode = MIR_StatisticsMode::MIR_StatsMode_Summary;
+ }
+
+ if (SDKDynamicImpl::Get().GetStatistics()(((MRRDataset*)poDS)->GetDSHandle(), nField, MRRBandIndex(), nResolution, &pStatistics,
+ nStatsMode, false, nBuckets, InvalidTracker) == MIRSuccess)
+ {
+ bResult = true;
+ }
+ else
+ {
+ uint64_t nBaseLevelCellCount = ((MRRDataset*)poDS)->nRasterXSize * ((MRRDataset*)poDS)->nRasterYSize;
+ bool bSmall = (nBaseLevelCellCount < (uint64_t(1) << (20)));
+ if (bSmall)
+ {
+ if (SDKDynamicImpl::Get().GetStatistics()(((MRRDataset *)poDS)->GetDSHandle(), nField, MRRBandIndex(), nResolution, &pStatistics,
+ MIR_StatisticsMode::MIR_StatsMode_Distribution, true, nBuckets, InvalidTracker) == MIRSuccess)
+ bResult = true;
+ }
+ else if (bApproxOk == 1)
+ {
+ int nApproxHighResolution = SDKDynamicImpl::Get().InfoLevelCount()(((MRRDataset *)poDS)->GetInfoHandle(), nField, nEvent);
+
+ for (; nApproxHighResolution >= 0; --nApproxHighResolution)
+ {
+ SMIR_LevelInfo *pLevelInfo = nullptr;
+ SDKDynamicImpl::Get().LevelInfo()(((MRRDataset *)poDS)->GetDSHandle(), nField, nEvent, nApproxHighResolution, &pLevelInfo);
+ auto nXSize = pLevelInfo->nCellBBoxXMax - pLevelInfo->nCellBBoxXMin;
+ auto nYSize = pLevelInfo->nCellBBoxYMax - pLevelInfo->nCellBBoxYMin;
+
+ // Statistics come from lower resolution levels that have 1M cells or more
+ if (nXSize*nYSize >= 1048576)
+ break;
+ }
+
+ if (SDKDynamicImpl::Get().ComputeStatistics()(((MRRDataset *)poDS)->GetDSHandle(), nField, MRRBandIndex(), nApproxHighResolution,
+ std::numeric_limits::lowest(), (std::numeric_limits::max)(), &pStatistics, nStatsMode, nBuckets, InvalidTracker) == MIRSuccess)
+ bResult = true;
+ }
+ }
+
+ if (!pStatistics || pStatistics->nStatMode == MIR_StatisticsMode::MIR_StatsMode_None)
+ if (SDKDynamicImpl::Get().GetStatistics()(((MRRDataset *)poDS)->GetDSHandle(), nField, MRRBandIndex(), nResolution, &pStatistics, nStatsMode, true, nBuckets, InvalidTracker) == MIRSuccess)
+ bResult = false;
+ }
+
+ return bResult;
+}
+
+double MRRRasterBand::GetMinimum(int* pbSuccess)
+{
+ //Initialize if required
+ StatisticsEnsureInitialized(true, 0);
+
+ if (GetStats())
+ {
+ if (pbSuccess)
+ *pbSuccess = TRUE;
+ return GetStats()->dMin;
+ }
+ return GDALPamRasterBand::GetMinimum(pbSuccess);
+}
+
+double MRRRasterBand::GetMaximum(int* pbSuccess)
+{
+ //Initialize if required
+ StatisticsEnsureInitialized(true, 0);
+
+ if (GetStats())
+ {
+ if (pbSuccess)
+ *pbSuccess = TRUE;
+ return GetStats()->dMax;
+ }
+ return GDALPamRasterBand::GetMaximum(pbSuccess);
+}
+
+CPLErr MRRRasterBand::ComputeRasterMinMax(int bApproxOK, double* adfMinMax)
+{
+ //Initialize if required
+ StatisticsEnsureInitialized(true, bApproxOK);
+
+ int bSuccessMin, bSuccessMax;
+
+ double dfMin = GetMinimum(&bSuccessMin);
+ double dfMax = GetMaximum(&bSuccessMax);
+
+ if (bSuccessMin && bSuccessMax)
+ {
+ adfMinMax[0] = dfMin;
+ adfMinMax[1] = dfMax;
+ return CE_None;
+ }
+
+ return CE_Failure;
+}
+
+CPLErr MRRRasterBand::GetStatistics(int bApproxOK, int bForce,
+ double *pdfMin, double *pdfMax,
+ double *pdfMean, double *padfStdDev)
+{
+ StatisticsEnsureInitialized(true, bApproxOK, bForce != 0);
+
+ if (GetStats())
+ {
+ if (pdfMin)
+ *pdfMin = GetStats()->dMin;
+ if (pdfMax)
+ *pdfMax = GetStats()->dMax;
+ if (pdfMean)
+ *pdfMean = GetStats()->dMean;
+ if (padfStdDev)
+ *padfStdDev = GetStats()->dStdDev;
+
+ return CE_None;
+ }
+
+ if (!bForce && bApproxOK)
+ return CE_Warning;
+ else
+ return CE_Failure;
+}
+
+CPLErr MRRRasterBand::ComputeStatistics(int bApproxOK,
+ double *pdfMin, double *pdfMax,
+ double *pdfMean, double *pdfStdDev,
+ GDALProgressFunc, CPL_UNUSED void *pProgressData)
+{
+ StatisticsEnsureInitialized(true, bApproxOK);
+
+ if (GetStats())
+ {
+ if (pdfMin)
+ *pdfMin = GetStats()->dMin;
+ if (pdfMax)
+ *pdfMax = GetStats()->dMax;
+ if (pdfMean)
+ *pdfMean = GetStats()->dMean;
+ if (pdfStdDev)
+ *pdfStdDev = GetStats()->dStdDev;
+
+ return CE_None;
+ }
+
+ return CE_Warning;
+}
+
+CPLErr MRRRasterBand::GetDefaultHistogram(double *pdfMin, double *pdfMax, int *pnBuckets, GUIntBig ** ppanHistogram,
+ int bForce, GDALProgressFunc pfnProgress, void *pProgressData)
+{
+ StatisticsEnsureInitialized(false, 0, bForce != 0);
+
+ if (GetStats())
+ {
+ if (pdfMin)
+ *pdfMin = GetStats()->dMin;
+ if (pdfMax)
+ *pdfMax = GetStats()->dMax;
+
+ *pnBuckets = GetStats()->cEWHistogram.nBinCount;
+
+ *ppanHistogram = (GUIntBig *)CPLCalloc(sizeof(GUIntBig), *pnBuckets);
+
+ for (size_t i = 0; i < (size_t)*pnBuckets; i++) {
+ (*ppanHistogram)[i] = (GUIntBig)GetStats()->cEWHistogram.pvcBins[i].dCount;
+ }
+
+ return CE_None;
+ }
+
+ return GDALPamRasterBand::GetDefaultHistogram(pdfMin, pdfMax,
+ pnBuckets, ppanHistogram,
+ bForce,
+ pfnProgress,
+ pProgressData);
+}
+
+/*
+ In case of Imagery MRR
+ If band count is >= 4, we mount 3 bands starting from 1st index, so 1st is a red band.
+ If there is only one band in imagery raster, we mount 0th band and that would be Gray.
+*/
+GDALColorInterp MRRRasterBand::GetColorInterpretation()
+{
+ switch (nFieldType)
+ {
+ case MIR_FieldType::MIR_FIELD_Continuous:
+ return GDALColorInterp::GCI_Undefined;
+
+ case MIR_FieldType::MIR_FIELD_Image:
+ {
+ switch (MRRBandIndex())
+ {
+ case 0:
+ return GDALColorInterp::GCI_GrayIndex;
+ case 1:
+ return GDALColorInterp::GCI_RedBand;
+ case 2:
+ return GDALColorInterp::GCI_GreenBand;
+ case 3:
+ return GDALColorInterp::GCI_BlueBand;
+ default:
+ return GDALColorInterp::GCI_Undefined;
+ }
+ }
+ break;
+
+ case MIR_FieldType::MIR_FIELD_ImagePalette:
+ case MIR_FieldType::MIR_FIELD_Classified:
+ return GDALColorInterp::GCI_PaletteIndex;
+
+ default:
+ return GDALColorInterp::GCI_Undefined;
+ }
+}
+
+GDALColorTable* MRRRasterBand::GetColorTable()
+{
+ return ((MRRDataset *)poDS)->GetColorTable();
+}
+
+char** MRRRasterBand::GetCategoryNames()
+{
+ if (nFieldType != MIR_FieldType::MIR_FIELD_Classified)
+ return nullptr;
+
+ return ((MRRDataset *)poDS)->GetCategoryNames(nField);
+}
diff --git a/gdal/frmts/mrr/MRRRasterBand.h b/gdal/frmts/mrr/MRRRasterBand.h
new file mode 100644
index 000000000000..1422178fce1a
--- /dev/null
+++ b/gdal/frmts/mrr/MRRRasterBand.h
@@ -0,0 +1,76 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+#include "APIDef.h"
+#include
+
+class MRRDataset;
+
+class MRRRasterBand : public GDALPamRasterBand
+{
+private:
+ friend class MRRRasterDataset;
+ MIR_FieldType nFieldType; //Field type this band belongs to
+ uint32_t nEvent; //zero based EventIndex of MRR this band belongs to.
+ uint32_t nField; //zero based FieldIndex of MRR this band belongs to.
+ uint32_t nMRRBandIndex; //zero based bandIndex (as per MRR SDK).
+ uint32_t nResolution; //zero based level index.
+ MIR_DataType nMIRDataType; //GDAL compatible data type
+ uint32_t nSizeInBytes;
+ SMIR_Statistics* pStatistics;
+ bool bIteratorInitialized; //flag to indicate whether iterator has been initialized
+ uint32_t nIteratorHandle;
+ int nOverviewLevel;
+ std::vector> vOverviewBands; //store overviews.
+ uint32_t nXBlocksCount;
+ uint32_t nYBlocksCount;
+
+ //Private Methods
+ const uint32_t& MRRBandIndex() { return nMRRBandIndex; }
+ unsigned int& GetIterator() { return nIteratorHandle; }
+ bool BeginIterator();
+ bool ReleaseIterator();
+ bool StatisticsEnsureInitialized(bool bSummary, int bApproxOk, bool bCompute = true, int nBins = 0);
+ const SMIR_Statistics* GetStats() const { return pStatistics; }
+ void ReleaseStats();
+
+ CPLErr IRasterIO(GDALRWFlag, int, int, int, int, void *, int, int,
+ GDALDataType, GSpacing nPixelSpace, GSpacing nLineSpace, GDALRasterIOExtraArg* psExtraArg) override;
+
+ CPLErr IReadBlock(int, int, void *) override;
+
+public:
+
+ MRRRasterBand(MRRDataset *, const MIR_FieldType &, const int& nFieldIndex, const int& nBandIndex, const int& nOverview,
+ const MIR_DataType& nMIRDataType, const GDALDataType& nGDALDataType, const int&, const int&, const uint32_t&, const uint32_t&);
+ ~MRRRasterBand();
+
+ //Statistics related method
+ double GetMinimum(int *pbSuccess = nullptr) override;
+ double GetMaximum(int *pbSuccess = nullptr) override;
+ CPLErr ComputeRasterMinMax(int, double*) override;
+ CPLErr GetStatistics(int bApproxOK, int bForce, double *pdfMin, double *pdfMax, double *pdfMean, double *padfStdDev) override;
+ CPLErr ComputeStatistics(int bApproxOK, double *pdfMin, double *pdfMax, double *pdfMean, double *pdfStdDev, GDALProgressFunc, void *pProgressData) override;
+ CPLErr GetDefaultHistogram(double *pdfMin, double *pdfMax, int *pnBuckets, GUIntBig ** ppanHistogram, int bForce, GDALProgressFunc, void *pProgressData) override;
+
+ //Color table related methods
+ GDALColorInterp GetColorInterpretation() override;
+ GDALColorTable* GetColorTable() override;
+ char** GetCategoryNames() override;
+
+ //Overview related method
+ int HasArbitraryOverviews() override { return vOverviewBands.size() != 0; }
+ int GetOverviewCount() override { return (int)vOverviewBands.size(); }
+ GDALRasterBand* GetOverview(int) override;
+};
diff --git a/gdal/frmts/mrr/MRRSDKImpl.cpp b/gdal/frmts/mrr/MRRSDKImpl.cpp
new file mode 100644
index 000000000000..4580b670806c
--- /dev/null
+++ b/gdal/frmts/mrr/MRRSDKImpl.cpp
@@ -0,0 +1,175 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+#include "MRRSDKImpl.h"
+
+#if defined(_WIN32) || defined(WIN32)
+#define MIRASTER_SDK_DLL "MIRasterAPIRT.dll"
+#else
+#define MIRASTER_SDK_DLL "libMIRasterAPIRT.so"
+#endif
+
+SDKDynamicImpl* SDKDynamicImpl::m_pSDKImpl = nullptr;
+
+// cppcheck-suppress uninitMemberVarPrivate
+SDKDynamicImpl::SDKDynamicImpl() : m_hMIRasterSDKInstance(nullptr)
+{
+ ClearAll();
+}
+
+SDKDynamicImpl::~SDKDynamicImpl()
+{
+ Release();
+}
+
+SDKDynamicImpl& SDKDynamicImpl::Get()
+{
+ if (!m_pSDKImpl)
+ m_pSDKImpl = new SDKDynamicImpl();
+
+ return *m_pSDKImpl;
+}
+
+bool SDKDynamicImpl::Init()
+{
+ //If SDK is already loaded no need to load it again
+ if (m_hMIRasterSDKInstance != nullptr)
+ return true;
+
+ //Load APIRT.dll
+ {
+#if defined(_WIN32) || defined(WIN32)
+ m_hMIRasterSDKInstance = LoadLibrary(MIRASTER_SDK_DLL);
+#else
+ m_hMIRasterSDKInstance = dlopen(MIRASTER_SDK_DLL, RTLD_LAZY);
+#endif
+ }
+
+ if (m_hMIRasterSDKInstance == nullptr) {
+ return false;
+ }
+
+ //resolve function address here
+ {
+ //Use non-Handler version of methods
+ m_fpOpenRaster_ReadOnly = (pOpenRaster_ReadOnly)GetProcAddress(m_hMIRasterSDKInstance, "MIR_OpenRasterReadOnly");
+ m_fpGetStatistics = (pGetStatistics)GetProcAddress(m_hMIRasterSDKInstance, "MIR_GetStatistics");
+ m_fpComputeStatistics = (pComputeStatistics)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ComputeStatistics");
+ m_fpVerifyRaster = (pVerifyRaster)GetProcAddress(m_hMIRasterSDKInstance, "MIR_VerifyRaster");
+ m_fpReleaseData = (pReleaseData)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ReleaseData");
+ m_fpReleaseRasterInfo = (pReleaseRasterInfo)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ReleaseRasterInfo");
+ m_fpReleaseStatistics = (pReleaseStatistics)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ReleaseStatistics");
+ m_fpGetOpenInfo = (pGetOpenInfo)GetProcAddress(m_hMIRasterSDKInstance, "MIR_GetOpenInfo");
+ m_fpRasterInfo = (pRasterInfo)GetProcAddress(m_hMIRasterSDKInstance, "MIR_RasterInfo");
+ m_fpCloseRaster = (pCloseRaster)GetProcAddress(m_hMIRasterSDKInstance, "MIR_CloseRaster");
+ m_fpGetCellSize = (pGetCellSize)GetProcAddress(m_hMIRasterSDKInstance, "MIR_GetCellSize");
+ m_fpPopulateCellBlock = (pPopulateCellBlock)GetProcAddress(m_hMIRasterSDKInstance, "MIR_PopulateCellBlock");
+ m_fpFieldInfo = (pFieldInfo)GetProcAddress(m_hMIRasterSDKInstance, "MIR_FieldInfo");
+ m_fpInfoLevelCount = (pInfoLevelCount)GetProcAddress(m_hMIRasterSDKInstance, "MIR_InfoLevelCount");
+ m_fpLevelInfo = (pLevelInfo)GetProcAddress(m_hMIRasterSDKInstance, "MIR_LevelInfo");
+ m_fpInfoBandCount = (pInfoBandCount)GetProcAddress(m_hMIRasterSDKInstance, "MIR_InfoBandCount");
+ m_fpBandInfo = (pBandInfo)GetProcAddress(m_hMIRasterSDKInstance, "MIR_BandInfo");
+ m_fpDataTypeSizeInBytes = (pDataTypeSizeInBytes)GetProcAddress(m_hMIRasterSDKInstance, "MIR_DataTypeSizeInBytes");
+
+ m_fpClassTableGetRecordCount = (pClassTableGetRecordCount)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ClassTableGetRecordCount");
+ m_fpClassTableGetRecord = (pClassTableGetRecord)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ClassTableGetRecord");
+ m_fpClassTableFindField = (pClassTableFindField)GetProcAddress(m_hMIRasterSDKInstance, "MIR_ClassTableFindField");
+
+ m_fpRBIBeginRead = (pRBIBeginRead)GetProcAddress(m_hMIRasterSDKInstance, "MIR_RBI_BeginRead");
+ m_fpRBIEnd = (pRBIEnd)GetProcAddress(m_hMIRasterSDKInstance, "MIR_RBI_End");
+ m_fpRBIGetBlock = (pRBIGetBlock)GetProcAddress(m_hMIRasterSDKInstance, "MIR_RBI_GetBlock");
+ }
+
+ if (!IsAllValid())
+ return false;
+
+ return true;
+}
+
+/*
+ Release resource
+*/
+
+bool SDKDynamicImpl::Release()
+{
+#if defined(_WIN32) || defined(WIN32)
+ bool bRet = FreeLibrary(m_hMIRasterSDKInstance) == TRUE;
+#else
+ bool bRet = dlclose(m_hMIRasterSDKInstance);
+#endif
+ m_hMIRasterSDKInstance = nullptr;
+
+ ClearAll();
+
+ return bRet;
+}
+
+void SDKDynamicImpl::ClearAll()
+{
+ m_fpOpenRaster_ReadOnly = nullptr;
+ m_fpGetStatistics = nullptr;
+ m_fpComputeStatistics = nullptr;
+ m_fpVerifyRaster = nullptr;
+ m_fpReleaseData = nullptr;
+ m_fpReleaseRasterInfo = nullptr;
+ m_fpReleaseStatistics = nullptr;
+ m_fpGetOpenInfo = nullptr;
+ m_fpRasterInfo = nullptr;
+ m_fpCloseRaster = nullptr;
+ m_fpGetCellSize = nullptr;
+ m_fpPopulateCellBlock = nullptr;
+ m_fpFieldInfo = nullptr;
+ m_fpInfoLevelCount = nullptr;
+ m_fpLevelInfo = nullptr;
+ m_fpInfoBandCount = nullptr;
+ m_fpBandInfo = nullptr;
+ m_fpRBIBeginRead = nullptr;
+ m_fpRBIEnd = nullptr;
+ m_fpRBIGetBlock = nullptr;
+ m_fpDataTypeSizeInBytes = nullptr;
+ m_fpClassTableGetRecordCount = nullptr;
+ m_fpClassTableGetRecord = nullptr;
+ m_fpClassTableFindField = nullptr;
+}
+
+bool SDKDynamicImpl::IsAllValid()
+{
+ //if Any of the pointers is not initialized return false
+ if (m_fpOpenRaster_ReadOnly == nullptr ||
+ m_fpGetStatistics == nullptr ||
+ m_fpComputeStatistics == nullptr ||
+ m_fpVerifyRaster == nullptr ||
+ m_fpReleaseData == nullptr ||
+ m_fpReleaseRasterInfo == nullptr ||
+ m_fpReleaseStatistics == nullptr ||
+ m_fpGetOpenInfo == nullptr ||
+ m_fpRasterInfo == nullptr ||
+ m_fpCloseRaster == nullptr ||
+ m_fpGetCellSize == nullptr ||
+ m_fpFieldInfo == nullptr ||
+ m_fpInfoLevelCount == nullptr ||
+ m_fpLevelInfo == nullptr ||
+ m_fpInfoBandCount == nullptr ||
+ m_fpBandInfo == nullptr ||
+ m_fpRBIBeginRead == nullptr ||
+ m_fpRBIEnd == nullptr ||
+ m_fpRBIGetBlock == nullptr ||
+ m_fpDataTypeSizeInBytes == nullptr ||
+ m_fpClassTableGetRecordCount == nullptr ||
+ m_fpClassTableGetRecord == nullptr ||
+ m_fpClassTableFindField == nullptr)
+ return false;
+
+ return true;
+}
diff --git a/gdal/frmts/mrr/MRRSDKImpl.h b/gdal/frmts/mrr/MRRSDKImpl.h
new file mode 100644
index 000000000000..55d821e1862e
--- /dev/null
+++ b/gdal/frmts/mrr/MRRSDKImpl.h
@@ -0,0 +1,152 @@
+/*****************************************************************************
+* Copyright 2016, 2020 Precisely.
+*
+* Licensed under the MIT License (the “License”); you may not use this file
+* except in the compliance with the License.
+* You may obtain a copy of the License at https://opensource.org/licenses/MIT
+
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an “AS IS” WITHOUT
+* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*****************************************************************************/
+
+#pragma once
+#ifndef __SDKDYNAMICIMPL_H_
+#define __SDKDYNAMICIMPL_H_
+
+#include "APIDef.h"
+#if defined(_WIN32) || defined(WIN32)
+#include
+#else
+#include
+#define HINSTANCE void*
+#define GetProcAddress(x,y) dlsym(x,y)
+#endif
+
+/*
+ Responsible for Raster SDK dynamic loading.
+*/
+class SDKDynamicImpl
+{
+private:
+ //If any change happens in the signature of these API's we need to reflect that here
+ //Resource management
+ typedef MIRResult(*pReleaseStatistics) (SMIR_Statistics** ppStats);
+ typedef MIRResult(*pReleaseData) (uint8_t** ppData);
+ typedef MIRResult(*pReleaseRasterInfo) (uint32_t nInfoHandle);
+
+ // Dataset access
+ typedef MIRResult(*pVerifyRaster) (const wchar_t* pwsFilePath);
+ typedef MIRResult(*pOpenRaster_ReadOnly) (const wchar_t* pwsFilePath, uint32_t& nRasterHandle, MIR_RasterSupportMode eRasterSupportMode, MIR_FieldType eMountAsFieldType, uint32_t nProgressTrackerHandle);
+ typedef MIRResult(*pGetStatistics) (uint32_t nRasterHandle, uint32_t nField, uint32_t nBand, int32_t nResolution, SMIR_Statistics** ppStats,
+ MIR_StatisticsMode nMode, bool bRecalculate_if_invalid, uint32_t nBinCount, uint32_t nProgressTrackerHandle);
+ typedef MIRResult(*pComputeStatistics) (uint32_t nRasterHandle, uint32_t nField, uint32_t nBand, int32_t nResolution, time_t nFirstTime, time_t nLastTime,
+ SMIR_Statistics** ppStats, MIR_StatisticsMode nMode, uint32_t nBinCount, uint32_t nProgressTrackerHandle);
+ typedef MIRResult(*pCloseRaster) (uint32_t nRasterHandle, SMIR_FinalisationOptions* pFinalise, uint32_t nProgressTrackerHandle);
+ //Iterator
+ typedef MIRResult(*pRBIBeginRead) (uint32_t nRasterHandle, uint32_t& nItHandle, uint32_t nField, time_t nStartTime, time_t nEndTime, int32_t nResolution, bool bGridCellCoords);
+ typedef MIRResult(*pRBIEnd) (uint32_t nItHandle);
+ typedef MIRResult(*pRBIGetBlock) (uint32_t nItHandle, uint32_t nBand, int64_t nCellX, int64_t nCellY, uint32_t nWidth, uint32_t nHeight, uint8_t** ppDataArray, uint8_t** ppValidArray, MIR_DataType nDataType, bool bUnloadTiles);
+
+ //Dataset field information
+ typedef MIRResult(*pGetCellSize) (uint32_t nRasterHandle, uint32_t nField, int32_t nResolution, double& dCellX, double& dCellY);
+ typedef MIRResult(*pGetOpenInfo) (uint32_t nRasterHandle, uint32_t& nInfoHandle, uint32_t nProgressTrackerHandle);
+
+ // Acquire raster info data for get/set
+ typedef MIRResult(*pRasterInfo) (uint32_t nInfoHandle, SMIR_RasterInfo** ppRasterInfo);
+ typedef MIRResult(*pFieldInfo) (uint32_t nInfoHandle, uint32_t nField, SMIR_FieldInfo** ppFieldInfo);
+ typedef unsigned int(*pInfoBandCount) (uint32_t nInfoHandle, uint32_t nField);
+ typedef MIRResult(*pBandInfo) (uint32_t nInfoHandle, uint32_t nField, uint32_t nBand, SMIR_BandInfo** ppBandInfo);
+ typedef unsigned int(*pInfoLevelCount) (uint32_t nInfoHandle, uint32_t nField, uint32_t nEvent);
+ typedef MIRResult(*pLevelInfo) (uint32_t nInfoHandle, uint32_t nField, uint32_t nEvent, uint32_t nLevel, SMIR_LevelInfo** ppLevelInfo);
+
+ typedef MIRResult(*pSetCacheSize) (uint64_t nCacheSizeMB);
+ typedef int(*pDataTypeSize_InBytes) (MIR_DataType nDataType);
+ typedef MIRResult(*pPopulateCellBlock) (uint32_t nRasterHandle, uint8_t** ppData, uint8_t** ppValid, MIR_DataType nDestDataType,
+ int64_t nCol, int64_t nRow, uint64_t nCols, uint64_t nRows, uint64_t nDestCols, uint64_t nDestRows,
+ uint32_t nField, uint32_t nBand, MIR_InterpolationMethod nInterpolationMethod,
+ time_t nFirstTime, time_t nLastTime);
+ typedef int32_t(*pDataTypeSizeInBytes) (MIR_DataType nDataType);
+
+ typedef MIRResult(*pClassTableGetRecordCount) (uint32_t nRasterHandle, uint32_t nField, uint32_t& nRecordCount);
+ typedef MIRResult(*pClassTableGetRecord) (uint32_t nRasterHandle, uint32_t nField, uint32_t nTableField, uint32_t nRecord, uint8_t** ppData, MIR_DataType& nDataType, uint32_t& nDataSize);
+ typedef MIRResult(*pClassTableFindField) (uint32_t nRasterHandle, uint32_t nField, MIR_ClassTableFieldType eType, uint32_t& nTableField);
+
+ //function pointers
+ pOpenRaster_ReadOnly m_fpOpenRaster_ReadOnly;
+ pGetStatistics m_fpGetStatistics;
+ pComputeStatistics m_fpComputeStatistics;
+ pReleaseStatistics m_fpReleaseStatistics;
+ pReleaseData m_fpReleaseData;
+ pReleaseRasterInfo m_fpReleaseRasterInfo;
+ pVerifyRaster m_fpVerifyRaster;
+ pGetCellSize m_fpGetCellSize;
+ pGetOpenInfo m_fpGetOpenInfo;
+ pRasterInfo m_fpRasterInfo;
+ pCloseRaster m_fpCloseRaster;
+ pPopulateCellBlock m_fpPopulateCellBlock;
+ pFieldInfo m_fpFieldInfo;
+ pInfoLevelCount m_fpInfoLevelCount;
+ pLevelInfo m_fpLevelInfo;
+ pInfoBandCount m_fpInfoBandCount;
+ pBandInfo m_fpBandInfo;
+ pSetCacheSize m_fpSetCacheSize;
+ pDataTypeSizeInBytes m_fpDataTypeSizeInBytes;
+ pRBIBeginRead m_fpRBIBeginRead;
+ pRBIEnd m_fpRBIEnd;
+ pRBIGetBlock m_fpRBIGetBlock;
+ pClassTableGetRecord m_fpClassTableGetRecord;
+ pClassTableGetRecordCount m_fpClassTableGetRecordCount;
+ pClassTableFindField m_fpClassTableFindField;
+
+ HINSTANCE m_hMIRasterSDKInstance; //handle of the MRR Raster SDK dll.
+ static SDKDynamicImpl* m_pSDKImpl;
+
+ void ClearAll();
+ bool IsAllValid();
+ SDKDynamicImpl();
+ ~SDKDynamicImpl();
+
+public:
+
+ static SDKDynamicImpl& Get();
+
+ bool Init();
+ bool Release();
+
+
+ pOpenRaster_ReadOnly OpenRaster_ReadOnly() { return m_fpOpenRaster_ReadOnly; }
+ pGetStatistics GetStatistics() { return m_fpGetStatistics; }
+ pComputeStatistics ComputeStatistics() { return m_fpComputeStatistics; }
+ pReleaseStatistics ReleaseStatistics() { return m_fpReleaseStatistics; }
+ pReleaseData ReleaseData() { return m_fpReleaseData; }
+ pReleaseRasterInfo ReleaseRasterInfo() { return m_fpReleaseRasterInfo; }
+ pVerifyRaster VerifyRaster() { return m_fpVerifyRaster; }
+ pGetCellSize GetCellSize() { return m_fpGetCellSize; }
+ pGetOpenInfo GetOpenInfo() { return m_fpGetOpenInfo; }
+ pRasterInfo RasterInfo() { return m_fpRasterInfo; }
+ pCloseRaster CloseRaster() { return m_fpCloseRaster; }
+ pPopulateCellBlock PopulateCellBlock() { return m_fpPopulateCellBlock; }
+
+ pFieldInfo FieldInfo() { return m_fpFieldInfo; }
+ pInfoLevelCount InfoLevelCount() { return m_fpInfoLevelCount; }
+ pLevelInfo LevelInfo() { return m_fpLevelInfo; }
+ pInfoBandCount InfoBandCount() { return m_fpInfoBandCount; }
+ pBandInfo BandInfo() { return m_fpBandInfo; }
+ pSetCacheSize SetCacheSize() { return m_fpSetCacheSize; }
+ pDataTypeSizeInBytes DataTypeSizeInBytes() { return m_fpDataTypeSizeInBytes; }
+
+ //Iterator
+ pRBIBeginRead RBIBeginRead() { return m_fpRBIBeginRead; }
+ pRBIEnd RBIEnd() { return m_fpRBIEnd; }
+ pRBIGetBlock RBIGetBlock() { return m_fpRBIGetBlock; }
+
+ //ClassTable methods
+ pClassTableGetRecord ClassTableGetRecord() { return m_fpClassTableGetRecord; }
+ pClassTableGetRecordCount ClassTableGetRecordCount() { return m_fpClassTableGetRecordCount; }
+ pClassTableFindField ClassTableFindField() { return m_fpClassTableFindField; }
+};
+
+#endif
diff --git a/gdal/frmts/mrr/VERSION b/gdal/frmts/mrr/VERSION
new file mode 100644
index 000000000000..f3229c5b9876
--- /dev/null
+++ b/gdal/frmts/mrr/VERSION
@@ -0,0 +1 @@
+..
diff --git a/gdal/frmts/mrr/makefile.vc b/gdal/frmts/mrr/makefile.vc
new file mode 100644
index 000000000000..43c5dec69f53
--- /dev/null
+++ b/gdal/frmts/mrr/makefile.vc
@@ -0,0 +1,25 @@
+
+OBJ = mrrdataset.obj MRRRasterBand.obj MRRSDKImpl.obj
+
+PLUGIN_DLL = gdal_MRR.dll
+
+GDAL_ROOT = ..\..
+
+!INCLUDE $(GDAL_ROOT)\nmake.opt
+
+default: $(OBJ)
+ xcopy /D /Y *.obj ..\o
+
+clean:
+ -del *.obj
+
+plugin: $(PLUGIN_DLL)
+
+$(PLUGIN_DLL): $(OBJ)
+ link /dll $(LDEBUG) /out:$(PLUGIN_DLL) $(OBJ) $(GDAL_ROOT)/gdal_i.lib $(MRR_LIB)
+ if exist $(PLUGIN_DLL).manifest mt -manifest $(PLUGIN_DLL).manifest -outputresource:$(PLUGIN_DLL);2
+
+plugin-install:
+ -mkdir $(PLUGINDIR)
+ $(INSTALL) $(PLUGIN_DLL) $(PLUGINDIR)
+
diff --git a/gdal/gcore/gdal_frmts.h b/gdal/gcore/gdal_frmts.h
index 04e982d603ab..2e5dfbcce7cc 100644
--- a/gdal/gcore/gdal_frmts.h
+++ b/gdal/gcore/gdal_frmts.h
@@ -199,6 +199,7 @@ void CPL_DLL GDALRegister_EEDA(void);
void CPL_DLL GDALRegister_SIGDEM(void);
void CPL_DLL GDALRegister_BYN(void);
void CPL_DLL GDALRegister_IGNFHeightASCIIGrid(void);
+void CPL_DLL GDALRegister_MRR(void);
void CPL_DLL GDALRegister_TileDB(void);
void CPL_DLL GDALRegister_DAAS(void);
void CPL_DLL GDALRegister_COG(void);
diff --git a/gdal/nmake.opt b/gdal/nmake.opt
index 09245623504b..ad24dcf4002a 100644
--- a/gdal/nmake.opt
+++ b/gdal/nmake.opt
@@ -711,6 +711,14 @@ OCI_INCLUDE = -I$(ORACLE_HOME)\oci\include
#SDE_LIB = $(SDE_SDK)\lib\pe$(SDE_VERSION).lib \
# $(SDE_SDK)\lib\sde$(SDE_VERSION).lib $(SDE_SDK)\lib\sg$(SDE_VERSION).lib
+#MRR_PLUGIN = YES
+#MRR_ENABLED = YES
+#MRR_VERSION=1
+#MRR_SDK = C:\MRRSDK\sdk
+#MRR_INC = $(MRR_SDK)\include
+#MRR_LIB = $(MRR_SDK)\lib\pe$(MRR_VERSION).lib \
+# $(MRR_SDK)\lib\sde$(MRR_VERSION).lib $(MRR_SDK)\lib\sg$(MRR_VERSION).lib
+
#FGDB_ENABLED = YES
#FGDB_PLUGIN = YES