Exemplo n.º 1
0
    def getSupportedRasters():
        if not gdalAvailable:
            return {}

        if GdalUtils.supportedRasters is not None:
            return GdalUtils.supportedRasters

        if gdal.GetDriverCount() == 0:
            gdal.AllRegister()

        GdalUtils.supportedRasters = {}
        GdalUtils.supportedOutputRasters = {}
        GdalUtils.supportedRasters['GTiff'] = ['tif']
        GdalUtils.supportedOutputRasters['GTiff'] = ['tif']

        for i in range(gdal.GetDriverCount()):
            driver = gdal.GetDriver(i)
            if driver is None:
                continue
            shortName = driver.ShortName
            metadata = driver.GetMetadata()
            if gdal.DCAP_RASTER not in metadata \
                    or metadata[gdal.DCAP_RASTER] != 'YES':
                continue

            if gdal.DMD_EXTENSION in metadata:
                extensions = metadata[gdal.DMD_EXTENSION].split('/')
                if extensions:
                    GdalUtils.supportedRasters[shortName] = extensions
                    # Only creatable rasters can be referenced in output rasters
                    if ((gdal.DCAP_CREATE in metadata
                         and metadata[gdal.DCAP_CREATE] == 'YES')
                            or (gdal.DCAP_CREATECOPY in metadata
                                and metadata[gdal.DCAP_CREATECOPY] == 'YES')):
                        GdalUtils.supportedOutputRasters[
                            shortName] = extensions

        return GdalUtils.supportedRasters
Exemplo n.º 2
0
def GetOutputDriversFor(filename):
    drv_list = []
    ext = GetExtension(filename)
    for i in range(gdal.GetDriverCount()):
        drv = gdal.GetDriver(i)
        if (drv.GetMetadataItem(gdal.DCAP_CREATE) is not None or
            drv.GetMetadataItem(gdal.DCAP_CREATECOPY) is not None) and \
           drv.GetMetadataItem(gdal.DCAP_RASTER) is not None:
            if ext and DoesDriverHandleExtension(drv, ext):
                drv_list.append(drv.ShortName)
            else:
                prefix = drv.GetMetadataItem(gdal.DMD_CONNECTION_PREFIX)
                if prefix is not None and filename.lower().startswith(
                        prefix.lower()):
                    drv_list.append(drv.ShortName)

    # GMT is registered before netCDF for opening reasons, but we want
    # netCDF to be used by default for output.
    if ext.lower() == 'nc' and not drv_list and \
       drv_list[0].upper() == 'GMT' and drv_list[1].upper() == 'NETCDF':
        drv_list = ['NETCDF', 'GMT']

    return drv_list
Exemplo n.º 3
0
def driverList(drivertype='raster'):
    '''Return the list of available GDAL/OGR drivers'''

    if not drivertype:
        types = ['gdal']
    elif isinstance(drivertype, string_types):
        types = [drivertype]
    else:
        types = drivertype
        if not set(('raster', 'vector')).issuperset(types):
            raise ValueError('invalid type list: "%s"' % types)

    drivers = []
    if 'raster' in types:
        drivers.extend(
            gdal.GetDriver(index) for index in range(gdal.GetDriverCount()))

    if 'vector' in types:
        # @TODO: check
        from osgeo import ogr
        drivers.extend(
            ogr.GetDriver(index) for index in range(ogr.GetDriverCount()))

    return drivers
Exemplo n.º 4
0
    def getSupportedRasters(self):
        if self.supportedRasters != None:
            return self.supportedRasters

        # first get the GDAL driver manager
        if gdal.GetDriverCount() == 0:
            gdal.AllRegister()

        self.supportedRasters = dict()
        jp2Driver = None

        # for each loaded GDAL driver
        for i in range(gdal.GetDriverCount()):
            driver = gdal.GetDriver(i)

            if driver == None:
                QgsLogger.warning("unable to get driver " + QString.number(i))
                continue

            # now we need to see if the driver is for something currently
            # supported; if not, we give it a miss for the next driver

            longName = QString(driver.LongName).remove(
                QRegExp('\(.*$')).trimmed()
            shortName = QString(driver.ShortName).remove(
                QRegExp('\(.*$')).trimmed()
            extensions = QString()

            description = QString(driver.GetDescription())
            glob = QStringList()

            metadata = driver.GetMetadata()
            if metadata.has_key(gdal.DMD_EXTENSION):
                extensions = QString(metadata[gdal.DMD_EXTENSION])

            if not longName.isEmpty():
                if not extensions.isEmpty():
                    # XXX add check for SDTS; in that case we want (*CATD.DDF)
                    glob << QString("*." +
                                    extensions.replace("/", " *.")).split(" ")

                    # Add only the first JP2 driver found to the filter list (it's the one GDAL uses)
                    if description == "JPEG2000" or description.startsWith(
                            "JP2"):  # JP2ECW, JP2KAK, JP2MrSID
                        if jp2Driver != None:
                            continue  # skip if already found a JP2 driver
                        jp2Driver = driver  # first JP2 driver found
                        glob << "*.j2k"  # add alternate extension
                    elif description == "GTiff":
                        glob << "*.tiff"
                    elif description == "JPEG":
                        glob << "*.jpeg"
                else:
                    # USGS DEMs use "*.dem"
                    if description.startsWith("USGSDEM"):
                        glob << "*.dem"
                    elif description.startsWith("DTED"):
                        # DTED use "*.dt0"
                        glob << "*.dt0"
                    elif description.startsWith("MrSID"):
                        # MrSID use "*.sid"
                        glob << "*.sid"
                    else:
                        continue

                self.supportedRasters[longName] = {
                    'EXTENSIONS': glob,
                    'LONGNAME': longName,
                    'SHORTNAME': shortName,
                    'DESCRIPTION': description
                }

        return self.supportedRasters
Exemplo n.º 5
0
    "version of the original Sentinel-2 file.")
parser.add_argument(
    "--save_prefix",
    default="",
    help=
    "If set, speficies the name of a prefix for all output files. Use a trailing / to save into a "
    "directory. The default of no prefix will save into the current directory. "
    "Example: --save_prefix result/")

args = parser.parse_args()
globals().update(args.__dict__)

if list_output_file_formats:
    dcount = gdal.GetDriverCount()
    for didx in range(dcount):
        driver = gdal.GetDriver(didx)
        if driver:
            metadata = driver.GetMetadata()
        if (gdal.DCAP_CREATE in (driver and metadata)
                and metadata[gdal.DCAP_CREATE] == 'YES'
                and gdal.DCAP_RASTER in metadata
                and metadata[gdal.DCAP_RASTER] == 'YES'):
            name = driver.GetDescription()
            if "DMD_LONGNAME" in metadata:
                name += ": " + metadata["DMD_LONGNAME"]
            else:
                name = driver.GetDescription()
            if "DMD_EXTENSIONS" in metadata:
                name += " (" + metadata["DMD_EXTENSIONS"] + ")"
            print(name)
    sys.exit(0)
Exemplo n.º 6
0
def check_config(args):
    """
    Check config and set some defaults if necessary.
    """
    log(f"# Checking configuration")

    errors = False

    # Set some defaults

    defaults = [
        ("quiet", False),
        ("product", "NBAR"),
        ("obstmp", "/tmp/obs.tif"),
        ("clipshpfn", "/tmp/clip.json"),
        ("tmpdir", "/tmp"),
        ("nocleanup", False),
        ("gdalconfig", {}),
        ("models", []),
    ]

    for arg, value in defaults:
        if not arg in args:
            log(f"'{arg}' not set, setting to default: {arg} = {value}")
            args[arg] = value

    # Set GDAL config

    for k, v in args["gdalconfig"].items():
        if v == True:
            v = "YES"
        if v == False:
            v = "NO"
        gdal.SetConfigOption(k, v)
        log(f"GDAL option {k} = {v}")

    ## Check that models exists

    if not isinstance(args["models"], list):
        log("'models' must be a list of models")
        errors = True

    # Set some model defaults

    avail = [gdal.GetDriver(i).ShortName for i in range(gdal.GetDriverCount())]

    # Check the models

    models = args["models"]
    for m in models:

        name = m["name"]

        if name[:7] == "file://":
            try:
                path = name[7:]
                path, checksum = path.split(":")
            except ValueError:
                log(f"Incorrect model name format, it should be file://filename:sha256checksum"
                    )
                errors = True

        if name[:5] == "s3://":
            try:
                path = name[5:]
                path, checksum = path.split(":")
            except ValueError:
                log(f"Incorrect model name format, it should be s3://bucket/key:sha256checksum"
                    )
                errors = True

        if "driver" not in m:
            if gdal.GetDriverByName("COG"):
                m["driver"] = "COG"
            else:
                m["driver"] = "GTiff"

        if m["driver"] not in avail:
            log(f"'driver' for model '{name}' is not available")
            log(f"available drivers: {avail}")
            errors = True

        if "inputs" not in m:
            m["inputs"] = []

        # Normalise the urls

        for ip in m["inputs"]:
            fn = normalise_url(ip["filename"])
            ip["filename"] = fn

        # Parse tuples as tuples of numbers for models

        for k, v in m.items():
            if isinstance(v, dict):
                for kk, vv in v.items():
                    if isinstance(
                            vv,
                            str) and vv.startswith("(") and vv.endswith(")"):
                        v[kk] = astuple(vv)

        defaults = [
            ("output", "result.tif"),
        ]

        for arg, value in defaults:
            if not arg in m.keys():
                log(f"Model {name} '{arg}' not set, setting to default: {arg} = {value}"
                    )
                m[arg] = value

    args["models"] = models

    if errors:
        sys.exit(1)

    # TODO: Check GPU resources if needed?

    return args
Exemplo n.º 7
0
# https://pcjericks.github.io/py-gdalogr-cookbook/
import sys

try:
    from osgeo import ogr, osr, gdal

    print("GDAL VERSION: {}".format(gdal.__version__))
    gdal_driver_list = [
        gdal.GetDriver(i).GetDescription()
        for i in range(gdal.GetDriverCount())
    ]
    ogr_driver_list = [
        ogr.GetDriver(i).GetDescription() for i in range(ogr.GetDriverCount())
    ]

    print("\nGDAL DRIVERS:")
    print(gdal_driver_list)

    print("\nOGR DRIVERS:")
    print(ogr_driver_list)
except:
    sys.exit('ERROR: cannot find GDAL/OGR modules')
Exemplo n.º 8
0
    def __init__(self, parent: QtWidgets.QWidget=None):
        super().__init__(parent)

        self.layout = QtWidgets.QVBoxLayout()
        self.setLayout(self.layout)

        # Top

        self.top_layout = QtWidgets.QHBoxLayout()

        self.layout.addLayout(self.top_layout)
        self.version_groupbox = QtWidgets.QGroupBox(self)
        self.version_groupbox.setTitle("Version")
        self.top_layout.addWidget(self.version_groupbox)
        self.version_layout = QtWidgets.QVBoxLayout()
        self.version_groupbox.setLayout(self.version_layout)
        self.version_release = QtWidgets.QLabel("Release: %s" % gdal.VersionInfo('RELEASE_NAME'))
        self.version_layout.addWidget(self.version_release)
        self.version_date = QtWidgets.QLabel("Date: %s" % gdal.VersionInfo('RELEASE_DATE'))
        self.version_layout.addWidget(self.version_date)

        self.cache_groupbox = QtWidgets.QGroupBox(self)
        self.cache_groupbox.setTitle("Cache")
        self.top_layout.addWidget(self.cache_groupbox)
        self.cache_layout = QtWidgets.QVBoxLayout()
        self.cache_groupbox.setLayout(self.cache_layout)
        self.cache_max = QtWidgets.QLabel("Max: %.1f MB" % (gdal.GetCacheMax() / (1024 * 1024),))
        self.cache_layout.addWidget(self.cache_max)
        self.cache_used = QtWidgets.QLabel("Used: %.1f MB" % (gdal.GetCacheUsed() / (1024 * 1024),))
        self.cache_layout.addWidget(self.cache_used)

        # Bottom

        self.bottom_layout = QtWidgets.QHBoxLayout()
        self.layout.addLayout(self.bottom_layout)

        self.drivers_groupbox = QtWidgets.QGroupBox(self)
        self.drivers_groupbox.setTitle("Drivers")
        self.bottom_layout.addWidget(self.drivers_groupbox)
        self.drivers_layout = QtWidgets.QVBoxLayout()
        self.drivers_groupbox.setLayout(self.drivers_layout)
        self.drivers_count = QtWidgets.QLabel("Number of drivers: %d" % (gdal.GetDriverCount(),))
        self.drivers_layout.addWidget(self.drivers_count)

        self.table = QtWidgets.QTableWidget(self)
        self.table.setObjectName("GdalDriversTable")
        self.table.setColumnCount(8)
        self.table.setRowCount(0)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Short Name")
        self.table.setHorizontalHeaderItem(0, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Long Name")
        self.table.setHorizontalHeaderItem(1, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Help Page")
        self.table.setHorizontalHeaderItem(2, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Mime Type")
        self.table.setHorizontalHeaderItem(3, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Extensions")
        self.table.setHorizontalHeaderItem(4, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Data Types")
        self.table.setHorizontalHeaderItem(5, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Creation Options")
        self.table.setHorizontalHeaderItem(6, item)
        item = QtWidgets.QTableWidgetItem()
        item.setText("Metadata")
        self.table.setHorizontalHeaderItem(7, item)
        self.table.horizontalHeader().setStretchLastSection(True)
        self.table.horizontalHeader().setVisible(True)
        self.table.verticalHeader().setVisible(False)
        self.table.setRowCount(gdal.GetDriverCount())
        for row in range(gdal.GetDriverCount()):
            driver = gdal.GetDriver(row)
            self.table.setItem(row, 0, QtWidgets.QTableWidgetItem(driver.ShortName))
            self.table.setItem(row, 1, QtWidgets.QTableWidgetItem(driver.LongName))
            self.table.setItem(row, 2, QtWidgets.QTableWidgetItem(driver.HelpTopic))

            metadata = driver.GetMetadata()
            if metadata:
                self.table.setItem(row, 3, QtWidgets.QTableWidgetItem(str(metadata.pop(gdal.DMD_MIMETYPE, ''))))
                self.table.setItem(row, 4, QtWidgets.QTableWidgetItem(str(metadata.pop(gdal.DMD_EXTENSION, ''))))
                self.table.setItem(row, 5,
                                   QtWidgets.QTableWidgetItem(str(metadata.pop(gdal.DMD_CREATIONDATATYPES, ''))))

                full_data = metadata.pop(gdal.DMD_CREATIONOPTIONLIST, '')
                if full_data:
                    data = full_data[:10] + "[..]"
                else:
                    data = full_data
                table_item = QtWidgets.QTableWidgetItem(data)
                table_item.setToolTip(full_data)
                self.table.setItem(row, 6, table_item)

                metadata_list = ['%s=%s' % (k, v) for k, v in metadata.items()]
                metadata = ", ".join(metadata_list)[:10] + "[..]"
                table_item = QtWidgets.QTableWidgetItem(metadata)
                table_item.setToolTip('\n'.join(metadata_list))
                self.table.setItem(row, 7, table_item)

        self.table.horizontalHeader().resizeSections(QtWidgets.QHeaderView.ResizeToContents)
        self.table.setSortingEnabled(True)
        self.table.sortItems(0, QtCore.Qt.AscendingOrder)
        self.drivers_layout.addWidget(self.table)
Exemplo n.º 9
0
def misc_12():

    if int(gdal.VersionInfo('VERSION_NUM')) < 1900:
        gdaltest.post_reason('would crash')
        return 'skip'

    import test_cli_utilities
    gdal_translate_path = test_cli_utilities.get_gdal_translate_path()

    for i in range(gdal.GetDriverCount()):
        drv = gdal.GetDriver(i)
        md = drv.GetMetadata()
        if ('DCAP_CREATECOPY' in md
                or 'DCAP_CREATE' in md) and 'DCAP_RASTER' in md:

            nbands = 1
            if drv.ShortName == 'WEBP' or drv.ShortName == 'ADRG':
                nbands = 3

            datatype = gdal.GDT_Byte
            if drv.ShortName == 'BT' or drv.ShortName == 'BLX':
                datatype = gdal.GDT_Int16
            elif drv.ShortName == 'GTX' or drv.ShortName == 'NTv2' or drv.ShortName == 'Leveller':
                datatype = gdal.GDT_Float32

            size = 1201
            if drv.ShortName == 'BLX':
                size = 128

            src_ds = gdal.GetDriverByName('GTiff').Create(
                '/vsimem/misc_12_src.tif', size, size, nbands, datatype)
            set_gt = (2, 1.0 / size, 0, 49, 0, -1.0 / size)
            src_ds.SetGeoTransform(set_gt)
            src_ds.SetProjection(
                'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]'
            )

            # Test to detect crashes
            gdal.PushErrorHandler('CPLQuietErrorHandler')
            ds = drv.CreateCopy('/nonexistingpath' + get_filename(drv, ''),
                                src_ds)
            gdal.PopErrorHandler()
            if ds is None and gdal.GetLastErrorMsg() == '':
                gdaltest.post_reason('failure')
                print(
                    'CreateCopy() into non existing dir fails without error message for driver %s'
                    % drv.ShortName)
                gdal.Unlink('/vsimem/misc_12_src.tif')
                return 'fail'
            ds = None

            if gdal_translate_path is not None:
                # Test to detect memleaks
                ds = gdal.GetDriverByName('VRT').CreateCopy(
                    'tmp/misc_12.vrt', src_ds)
                (out, _) = gdaltest.runexternal_out_and_err(
                    gdal_translate_path + ' -of ' + drv.ShortName +
                    ' tmp/misc_12.vrt /nonexistingpath/' +
                    get_filename(drv, ''),
                    check_memleak=False)
                del ds
                gdal.Unlink('tmp/misc_12.vrt')

                # If DEBUG_VSIMALLOC_STATS is defined, this is an easy way
                # to catch some memory leaks
                if out.find('VSIMalloc + VSICalloc - VSIFree') != -1 and \
                        out.find('VSIMalloc + VSICalloc - VSIFree : 0') == -1:
                    if drv.ShortName == 'Rasterlite' and out.find(
                            'VSIMalloc + VSICalloc - VSIFree : 1') != -1:
                        pass
                    else:
                        print('memleak detected for driver %s' % drv.ShortName)

            src_ds = None

            gdal.Unlink('/vsimem/misc_12_src.tif')

    return 'success'
Exemplo n.º 10
0
                    or __CODERS                                                             \
                    .update({'GoogleV3':        'api_key', # since July 2018 Google requires each request to have an API key
                             'Bing':            'api_key',
                             'GeoNames':        'username',
                             'Yandex':          'api_key',
                             'MapQuest':        'key',
                             'Nominatim':       None, # using Nominatim with the default geopy is strongly discouraged
                             'OpenMapQuest':    'api_key'} if _is_geopy_installed else {})      \
                    or __CODERS # at the end, CODERS will be equal to __CODERS after its updates

# default geocoder... but this can be reset when declaring a subclass
DEF_CODER       = {'Nominatim': None} # {'Bing' : None}

DEF_AGENT       = PACKNAME

DRIVERS         = {gdal.GetDriver(i).ShortName: gdal.GetDriver(i).LongName
                   for i in range(gdal.GetDriverCount())}

DEF_DRIVER      = "GeoJSON"

DEF_PROJ        = 'WGS84'
DEF_PROJ4LL     = '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
DEF_PROJ4SM     = '+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs'


# LATLON        = ['lat', 'lon'] # 'coord' # 'latlon'
# ORDER         = 'lL' # first lat, second Lon

DEF_PLACE       = ['street', 'number', 'postcode', 'city', 'country']
"""Fields used to defined a toponomy (location/place).
"""
Exemplo n.º 11
0
Arquivo: grib.py Projeto: plkms/gdal
def has_jp2kdrv():
    for i in range(gdal.GetDriverCount()):
        if gdal.GetDriver(i).ShortName.startswith('JP2'):
            return True
    return False
Exemplo n.º 12
0
def export(world,
           export_filetype='GTiff',
           export_datatype='float32',
           path='seed_output'):
    try:
        gdal
    except NameError:
        print("Cannot export: please install pygdal.")
        sys.exit(1)

    gdal.AllRegister()
    for i in range(1, gdal.GetDriverCount()):
        drv = gdal.GetDriver(i)
        sTmp = drv.GetDescription()
        print(sTmp)

    final_driver = gdal.GetDriverByName(export_filetype)

    metadata = final_driver.GetMetadata()

    if metadata.has_key(
            gdal.DCAP_CREATE) and metadata[gdal.DCAP_CREATE] == 'YES':
        print('Driver %s supports Create() method.' % final_driver)

    if metadata.has_key(
            gdal.DCAP_CREATECOPY) and metadata[gdal.DCAP_CREATECOPY] == 'YES':
        print('Driver %s supports CreateCopy() method.' % final_driver)

    if final_driver is None:
        print("%s driver not registered." % export_filetype)
        sys.exit(1)

    # try to find the proper file-suffix
    export_filetype = export_filetype.lower()
    if export_filetype in gdal_mapper:
        export_filetype = gdal_mapper[export_filetype]

    # Note: GDAL will throw informative errors on its own whenever file type and data type cannot be matched.

    # translate export_datatype; http://www.gdal.org/gdal_8h.html#a22e22ce0a55036a96f652765793fb7a4
    export_datatype = export_datatype.lower()
    if export_datatype in ['gdt_byte', 'uint8', 'int8', 'byte',
                           'char']:  # GDAL does not support int8
        bpp, signed, normalize = (8, False, True)
        numpy_type = numpy.uint8
        gdal_type = gdal.GDT_Byte
    elif export_datatype in ['gdt_uint16', 'uint16']:
        bpp, signed, normalize = (16, False, True)
        numpy_type = numpy.uint16
        gdal_type = gdal.GDT_UInt16
    elif export_datatype in ['gdt_uint32', 'uint32']:
        bpp, signed, normalize = (32, False, True)
        numpy_type = numpy.uint32
        gdal_type = gdal.GDT_UInt32
    elif export_datatype in ['gdt_int16', 'int16']:
        bpp, signed, normalize = (16, True, True)
        numpy_type = numpy.int16
        gdal_type = gdal.GDT_Int16
    elif export_datatype in ['gdt_int32', 'int32',
                             'int']:  # fallback for 'int'
        bpp, signed, normalize = (32, True, True)
        numpy_type = numpy.int32
        gdal_type = gdal.GDT_Int32
    elif export_datatype in ['gdt_float32', 'float32',
                             'float']:  # fallback for 'float'
        bpp, signed, normalize = (32, True, False)
        numpy_type = numpy.float32
        gdal_type = gdal.GDT_Float32
    elif export_datatype in ['gdt_float64', 'float64']:
        bpp, signed, normalize = (64, True, False)
        numpy_type = numpy.float64
        gdal_type = gdal.GDT_Float64
    else:
        raise TypeError(
            "Type of data not recognized or not supported by GDAL: %s" %
            export_datatype)

    # massage data to scale between the absolute min and max
    elevation = numpy.copy(world.layers['elevation'].data)

    # shift data according to minimum possible value
    if signed:
        elevation = elevation - world.sea_level(
        )  # elevation 0.0 now refers to sea-level
    else:
        elevation -= elevation.min()  # lowest point at 0.0

    # rescale data (currently integer-types only)
    if normalize:
        # elevation maps usually have a range of 0 to 10, maybe 15 - rescaling for integers is essential
        if signed:
            elevation *= (2**(bpp - 1) - 1) / max(abs(elevation.min()),
                                                  abs(elevation.max()))
        else:
            elevation *= (2**bpp - 1) / abs(elevation.max())

    # round data (integer-types only)
    if numpy_type != numpy.float32 and numpy_type != numpy.float64:
        elevation = elevation.round()

    # switch to final data type; no rounding performed
    elevation = elevation.astype(numpy_type)

    # take elevation data and push it into an intermediate GTiff format (some formats don't support being written by Create())
    inter_driver = gdal.GetDriverByName("GTiff")
    fh_inter_file, inter_file = tempfile.mkstemp(
    )  # returns: (file-handle, absolute path)
    initial_ds = inter_driver.Create(inter_file, world.width, world.height, 1,
                                     gdal_type)
    band = initial_ds.GetRasterBand(1)

    band.WriteArray(elevation)
    band = None  # dereference band
    initial_ds = None  # save/flush and close

    # take the intermediate GTiff format and convert to final format
    initial_ds = gdal.Open(inter_file)
    final_driver.CreateCopy('%s-%d.%s' % (path, bpp, export_filetype),
                            initial_ds)

    initial_ds = None
    os.close(fh_inter_file)
    os.remove(inter_file)
Exemplo n.º 13
0
def create_transform(src, dst, transforms, format, dtype, scaling, sensor,
                     blue, green, red, nir, swir1, swir2, verbose):
    if not transforms:
        raise click.BadParameter('No transforms specified',
                                 param_hint='<transform>...')

    if verbose:
        logger.setLevel(logging.DEBUG)

    # Pair transforms requested with functions that calculate each transform
    transform_funcs = [
        obj for name, obj in inspect.getmembers(sys.modules[__name__],
                                                inspect.isfunction)
        if hasattr(obj, 'transform_name')
    ]

    # Read input image
    try:
        ds = gdal.Open(src, gdal.GA_ReadOnly)
    except:
        logger.error("Could not open source dataset {0}".format(src))
        raise
    #driver = gdal.GetDriverByName(str(format))
    driver = gdal.GetDriver(1)

    # If no output dtype selected, default to input image dtype
    if not dtype:
        dtype = gdal_array.GDALTypeCodeToNumericTypeCode(
            ds.GetRasterBand(1).DataType)
    dtype = np.dtype(dtype)
    gdal_dtype = gdal_array.NumericTypeCodeToGDALTypeCode(dtype)

    # Only read in the bands that are required for the transforms
    required_bands = set()
    for t in transform_funcs:
        required_bands.update(t.required_bands)

    func_args = inspect.getargvalues(inspect.currentframe())[-1]
    transform_args = dict.fromkeys(required_bands)
    for b in transform_args.keys():
        idx = func_args[b]
        transform_args[b] = ds.GetRasterBand(idx).ReadAsArray()
    logger.debug('Opened input file')

    transform_args['scaling'] = scaling
    transform_args['sensor'] = sensor

    # Create transforms
    transforms = OrderedDict([[t.transform_name,
                               t(**transform_args)] for t in transform_funcs
                              if t.transform_name.lower() in transforms])
    logger.debug('Calculated transforms')

    # Write output
    nbands = len(transforms.keys())
    out_ds = driver.Create(dst, ds.RasterXSize, ds.RasterYSize, nbands,
                           gdal_dtype)
    metadata = {}
    for i_b, (name, array) in enumerate(transforms.iteritems()):
        r_band = out_ds.GetRasterBand(i_b + 1)
        r_band.WriteArray(array)
        r_band.SetDescription(name)
        metadata['Band_' + str(i_b + 1)] = name

    out_ds.SetMetadata(metadata)
    out_ds.SetProjection(ds.GetProjection())
    out_ds.SetGeoTransform(ds.GetGeoTransform())
    logger.debug('Complete')
Exemplo n.º 14
0
import logging
import warnings

import numpy

from osgeo import gdal
from osgeo import ogr
from osgeo import osr

LOGGER = logging.getLogger('pygeoprocessing.testing.sampledata')

ReferenceData = collections.namedtuple('ReferenceData',
                                       'projection origin pixel_size')
gdal.AllRegister()
try:
    GDAL_DRIVERS = sorted([gdal.GetDriver(i).GetDescription()
                           for i in range(1, gdal.GetDriverCount())])
    OGR_DRIVERS = sorted([ogr.GetDriver(i).GetName()
                          for i in range(ogr.GetDriverCount())])
except TypeError:
    # When building InVEST sphinx documentation, gdal.GetDriverCount() doesn't
    # return an int.
    GDAL_DRIVERS = OGR_DRIVERS = []


# Higher index in list represents more information is stored by the datatype
# Helpful for debug messages, used when creating sample rasters.
DTYPES = [
    (numpy.byte, gdal.GDT_Byte),
    (numpy.uint16, gdal.GDT_UInt16),
    (numpy.uint32, gdal.GDT_UInt32),
Exemplo n.º 15
0
def misc_12():

    if int(gdal.VersionInfo('VERSION_NUM')) < 1900:
        gdaltest.post_reason('would crash')
        return 'skip'

    import test_cli_utilities
    gdal_translate_path = test_cli_utilities.get_gdal_translate_path()

    for i in range(gdal.GetDriverCount()):
        drv = gdal.GetDriver(i)
        #if drv.ShortName == 'ECW' or drv.ShortName == 'JP2ECW':
        #    continue
        md = drv.GetMetadata()
        if 'DCAP_CREATECOPY' in md or 'DCAP_CREATE' in md and 'DCAP_RASTER' in md:

            ext = ''
            if drv.ShortName == 'GTX':
                ext = '.gtx'
            elif drv.ShortName == 'RST':
                ext = '.rst'
            elif drv.ShortName == 'SAGA':
                ext = '.sdat'
            elif drv.ShortName == 'ECW':
                ext = '.ecw'
            elif drv.ShortName == 'KMLSUPEROVERLAY':
                ext = '.kmz'
            elif drv.ShortName == 'ADRG':
                ext = '/ABCDEF01.GEN'
            elif drv.ShortName == 'SRTMHGT':
                ext = '/N48E002.HGT'

            nbands = 1
            if drv.ShortName == 'WEBP' or drv.ShortName == 'ADRG':
                nbands = 3

            datatype = gdal.GDT_Byte
            if drv.ShortName == 'BT' or drv.ShortName == 'BLX':
                datatype = gdal.GDT_Int16
            elif drv.ShortName == 'GTX' or drv.ShortName == 'NTv2' or drv.ShortName == 'Leveller':
                datatype = gdal.GDT_Float32

            size = 1201
            if drv.ShortName == 'BLX':
                size = 128

            src_ds = gdal.GetDriverByName('GTiff').Create(
                '/vsimem/misc_12_src.tif', size, size, nbands, datatype)
            set_gt = (2, 1.0 / size, 0, 49, 0, -1.0 / size)
            src_ds.SetGeoTransform(set_gt)
            src_ds.SetProjection(
                'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]'
            )

            # Test to detect crashes
            gdal.PushErrorHandler('CPLQuietErrorHandler')
            ds = drv.CreateCopy('/nonexistingpath/nonexistingfile' + ext,
                                src_ds)
            gdal.PopErrorHandler()
            ds = None

            if gdal_translate_path is not None:
                # Test to detect memleaks
                ds = gdal.GetDriverByName('VRT').CreateCopy(
                    'tmp/misc_12.vrt', src_ds)
                (out, err) = gdaltest.runexternal_out_and_err(
                    gdal_translate_path + ' -of ' + drv.ShortName +
                    ' tmp/misc_12.vrt /nonexistingpath/nonexistingfile' + ext,
                    check_memleak=False)
                ds = None
                gdal.Unlink('tmp/misc_12.vrt')

                # If DEBUG_VSIMALLOC_STATS is defined, this is an easy way
                # to catch some memory leaks
                if out.find('VSIMalloc + VSICalloc - VSIFree') != -1 and \
                out.find('VSIMalloc + VSICalloc - VSIFree : 0') == -1:
                    if drv.ShortName == 'Rasterlite' and out.find(
                            'VSIMalloc + VSICalloc - VSIFree : 1') != -1:
                        pass
                    else:
                        print('memleak detected for driver %s' % drv.ShortName)

            src_ds = None

            gdal.Unlink('/vsimem/misc_12_src.tif')

    return 'success'
Exemplo n.º 16
0
    def getSupportedRasters(self):
        '''Get list of the supported rasters.

    Return list of extensions of the supported rasters.
    '''
        if self.rasterExtensions != None:
            return self.rasterExtensions

        # first get the GDAL driver manager
        if gdal.GetDriverCount() == 0:
            gdal.AllRegister()

        self.rasterExtensions = []
        jp2Driver = None

        # for each loaded GDAL driver
        for i in range(gdal.GetDriverCount()):
            driver = gdal.GetDriver(i)
            if driver == None:
                print('Unable to get driver', i)
                continue

            # now we need to see if the driver is for something currently
            # supported; if not, we give it a miss for the next driver
            longName = driver.LongName
            description = driver.GetDescription()
            extensions = []
            metadata = driver.GetMetadata()
            if metadata.has_key(gdal.DMD_EXTENSION):
                extensions = metadata[gdal.DMD_EXTENSION]

            ext = []
            if longName != '':
                if len(extensions) > 0:
                    # XXX add check for SDTS; in that case we want (*CATD.DDF)
                    ext.extend(
                        ('*.' + extensions.replace('/', ' *.')).split(' '))

                    # Add only the first JP2 driver found to the filter list (it's the one GDAL uses)
                    if description == 'JPEG2000' or description.startswith(
                            'JP2'):  # JP2ECW, JP2KAK, JP2MrSID
                        if jp2Driver != None:
                            continue
                        jp2Driver = driver
                        ext.append('*.j2k')
                    elif description == 'GTiff':
                        ext.append('*.tiff')
                    elif description == 'JPEG':
                        ext.append('*.jpeg')
                else:
                    # USGS DEMs use "*.dem"
                    if description.startswith('USGSDEM'):
                        ext.append('*.dem')
                    elif description.startswith('DTED'):
                        # DTED use "*.dt0"
                        ext.append('*.dt0')
                    elif description.startswith('MrSID'):
                        # MrSID use "*.sid"
                        ext.append('*.sid')
                    else:
                        continue
            self.rasterExtensions.extend(ext)

        return list(set(self.rasterExtensions))
Exemplo n.º 17
0
import numpy

from osgeo import gdal
from osgeo import ogr
from osgeo import osr
from .. import geoprocessing
from ..geoprocessing_core import DEFAULT_GTIFF_CREATION_TUPLE_OPTIONS

LOGGER = logging.getLogger('pygeoprocessing.testing.sampledata')

ReferenceData = collections.namedtuple('ReferenceData',
                                       'projection origin pixel_size')
gdal.AllRegister()
GDAL_DRIVERS = sorted([
    gdal.GetDriver(i).GetDescription() for i in range(1, gdal.GetDriverCount())
])
OGR_DRIVERS = sorted(
    [ogr.GetDriver(i).GetName() for i in range(ogr.GetDriverCount())])

# Mappings of numpy -> GDAL types and GDAL -> numpy types.
NUMPY_GDAL_DTYPES = {
    numpy.byte: gdal.GDT_Byte,
    numpy.ubyte: gdal.GDT_Byte,
    numpy.uint16: gdal.GDT_UInt16,
    numpy.uint32: gdal.GDT_UInt32,
    numpy.int16: gdal.GDT_Int16,
    numpy.int32: gdal.GDT_Int32,
    numpy.int64: gdal.GDT_Int32,  # GDAL doesn't have an int6.
    numpy.float32: gdal.GDT_Float32,
    numpy.float64: gdal.GDT_Float64,
Exemplo n.º 18
0
def misc_6_internal(datatype, nBands):
    if nBands == 0:
        ds = gdal.GetDriverByName('ILWIS').Create('tmp/tmp.mpl', 100, 100,
                                                  nBands, datatype)
    else:
        ds = gdal.GetDriverByName('MEM').Create('', 10, 10, nBands, datatype)
        ds.GetRasterBand(1).Fill(255)
        ds.SetGeoTransform([2, 1.0 / 10, 0, 49, 0, -1.0 / 10])
        ds.SetProjection(
            'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]'
        )
        ds.SetMetadata(['a'])
    if ds is not None:
        for i in range(gdal.GetDriverCount()):
            drv = gdal.GetDriver(i)
            md = drv.GetMetadata()
            if 'DCAP_CREATECOPY' in md or 'DCAP_CREATE' in md and 'DCAP_RASTER' in md:
                #print ('drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype)))

                skip = False
                # FIXME: A few cases that crashes and should be investigated
                if drv.ShortName == 'JPEG2000':
                    if (nBands == 2 or nBands >= 5) or \
                        not (datatype == gdal.GDT_Byte or datatype == gdal.GDT_Int16 or datatype == gdal.GDT_UInt16):
                        skip = True
                if drv.ShortName == 'JP2ECW' and datatype == gdal.GDT_Float64:
                    skip = True

                if skip is False:
                    dirname = 'tmp/tmp/tmp_%s_%d_%s' % (
                        drv.ShortName, nBands, gdal.GetDataTypeName(datatype))
                    try:
                        os.mkdir(dirname)
                    except:
                        try:
                            os.stat(dirname)
                            # Hum the directory already exists... Not expected, but let's try to go on
                        except:
                            reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (
                                dirname, drv.ShortName, nBands,
                                gdal.GetDataTypeName(datatype))
                            gdaltest.post_reason(reason)
                            return 'fail'

                    filename = '%s/foo' % dirname
                    if drv.ShortName == 'GTX':
                        filename = filename + '.gtx'
                    elif drv.ShortName == 'RST':
                        filename = filename + '.rst'
                    elif drv.ShortName == 'SAGA':
                        filename = filename + '.sdat'
                    elif drv.ShortName == 'ADRG':
                        filename = '%s/ABCDEF01.GEN' % dirname
                    elif drv.ShortName == 'SRTMHGT':
                        filename = '%s/N48E002.HGT' % dirname
                    elif drv.ShortName == 'ECW':
                        filename = filename + '.ecw'
                    elif drv.ShortName == 'KMLSUPEROVERLAY':
                        filename = filename + '.kmz'

                    dst_ds = drv.CreateCopy(filename, ds)
                    has_succeeded = dst_ds is not None
                    dst_ds = None

                    try:
                        shutil.rmtree(dirname)
                    except:
                        reason = 'Cannot remove %s after drv = %s, nBands = %d, datatype = %s' % (
                            dirname, drv.ShortName, nBands,
                            gdal.GetDataTypeName(datatype))
                        gdaltest.post_reason(reason)
                        return 'fail'

                    if has_succeeded and not drv.ShortName in [
                            'ECW', 'JP2ECW', 'VRT', 'XPM', 'JPEG2000', 'FIT',
                            'RST', 'INGR', 'USGSDEM', 'KMLSUPEROVERLAY', 'GMT'
                    ]:
                        dst_ds = drv.CreateCopy(
                            filename,
                            ds,
                            callback=misc_6_interrupt_callback_class().cbk)
                        if dst_ds is not None:
                            gdaltest.post_reason(
                                'interruption did not work with drv = %s, nBands = %d, datatype = %s'
                                % (drv.ShortName, nBands,
                                   gdal.GetDataTypeName(datatype)))
                            dst_ds = None

                            try:
                                shutil.rmtree(dirname)
                            except:
                                pass

                            return 'fail'

                        dst_ds = None

                        try:
                            shutil.rmtree(dirname)
                        except:
                            pass
                        try:
                            os.mkdir(dirname)
                        except:
                            reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (
                                dirname, drv.ShortName, nBands,
                                gdal.GetDataTypeName(datatype))
                            gdaltest.post_reason(reason)
                            return 'fail'
        ds = None
        if nBands == 0:
            gdal.GetDriverByName('ILWIS').Delete('tmp/tmp.mpl')
    return 'success'
Exemplo n.º 19
0
def detect_ogr_driver(
        ogr_ds: str,
        name_only: bool = False) -> typing.Tuple[gdal.Driver, str]:
    """
    Autodetect the appropriate driver for an OGR datasource.

    Parameters
    ----------
    ogr_ds : OGR datasource
        Path to OGR datasource.
    name_only : bool
        True to return the name of the driver, else the ogr.Driver object will
        be return
    Returns
    -------
    OGR driver OR
    OGR driver, layer name

    """
    # Driver names
    FileGDB = 'FileGDB'
    OpenFileGDB = 'OpenFileGDB'
    # Suffixes
    GPKG = '.gpkg'
    SHP = '.shp'
    GEOJSON = '.geojson'
    GDB = '.gdb'

    supported_drivers = [
        gdal.GetDriver(i).GetDescription()
        for i in range(gdal.GetDriverCount())
    ]
    if FileGDB in supported_drivers:
        gdb_driver = FileGDB
    else:
        gdb_driver = OpenFileGDB

    # OGR driver lookup table
    driver_lut = {
        GEOJSON: 'GeoJSON',
        SHP: 'ESRI Shapefile',
        GPKG: 'GPKG',
        GDB: gdb_driver
    }
    layer = None

    # Check if in-memory datasource
    if isinstance(ogr_ds, PurePath):
        ogr_ds = str(ogr_ds)
    if isinstance(ogr_ds, ogr.DataSource):
        driver = 'Memory'
    elif 'vsimem' in ogr_ds:
        driver = 'ESRI Shapefile'
    else:
        # Check if extension in look up table
        if GPKG in ogr_ds:
            drv_sfx = GPKG
            layer = Path(ogr_ds).stem
        elif GDB in ogr_ds:
            drv_sfx = GDB
            layer = Path(ogr_ds).stem
        else:
            drv_sfx = Path(ogr_ds).suffix

        if drv_sfx in driver_lut.keys():
            driver = driver_lut[drv_sfx]
        else:
            logger.warning("""Unsupported driver extension {}
                            Defaulting to 'ESRI Shapefile'""".format(drv_sfx))
            driver = driver_lut[SHP]

    logger.debug('Driver autodetected: {}'.format(driver))

    if not name_only:
        try:
            driver = ogr.GetDriverByName(driver)
        except ValueError as e:
            logger.error('ValueError with driver_name: {}'.format(driver))
            logger.error('OGR DS: {}'.format(ogr_ds))
            raise e

    return driver, layer
Exemplo n.º 20
0
def misc_6_internal(datatype, nBands, setDriversDone):

    ds = gdal.GetDriverByName('MEM').Create('', 10, 10, nBands, datatype)
    if nBands > 0:
        ds.GetRasterBand(1).Fill(255)
    ds.SetGeoTransform([2, 1.0 / 10, 0, 49, 0, -1.0 / 10])
    ds.SetProjection(
        'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["degree",0.01745329251994328]]'
    )
    ds.SetMetadata(['a'])

    for i in range(gdal.GetDriverCount()):
        drv = gdal.GetDriver(i)
        md = drv.GetMetadata()
        if ('DCAP_CREATECOPY' in md
                or 'DCAP_CREATE' in md) and 'DCAP_RASTER' in md:
            # print ('drv = %s, nBands = %d, datatype = %s' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype)))

            skip = False
            # FIXME: A few cases that crashes and should be investigated
            if drv.ShortName == 'JPEG2000':
                if (nBands == 2 or nBands >= 5) or \
                        not (datatype == gdal.GDT_Byte or datatype == gdal.GDT_Int16 or datatype == gdal.GDT_UInt16):
                    skip = True

            if skip is False:
                dirname = 'tmp/tmp/tmp_%s_%d_%s' % (
                    drv.ShortName, nBands, gdal.GetDataTypeName(datatype))
                try:
                    os.mkdir(dirname)
                except OSError:
                    try:
                        os.stat(dirname)
                        # Hum the directory already exists... Not expected, but let's try to go on
                    except OSError:
                        reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (
                            dirname, drv.ShortName, nBands,
                            gdal.GetDataTypeName(datatype))
                        gdaltest.post_reason(reason)
                        return 'fail'

                filename = get_filename(drv, dirname)

                dst_ds = drv.CreateCopy(filename, ds)
                has_succeeded = dst_ds is not None
                dst_ds = None

                size = 0
                stat = gdal.VSIStatL(filename)
                if stat is not None:
                    size = stat.size

                try:
                    shutil.rmtree(dirname)
                except OSError:
                    reason = 'Cannot remove %s after drv = %s, nBands = %d, datatype = %s' % (
                        dirname, drv.ShortName, nBands,
                        gdal.GetDataTypeName(datatype))
                    gdaltest.post_reason(reason)
                    return 'fail'

                if has_succeeded and drv.ShortName not in setDriversDone and nBands > 0:
                    setDriversDone.add(drv.ShortName)

                    # The first list of drivers fail to detect short writing
                    # The second one is because they are verbose in stderr
                    if 'DCAP_VIRTUALIO' in md and size != 0 and \
                            drv.ShortName not in ['JPEG2000', 'KMLSUPEROVERLAY', 'HF2', 'ZMap', 'DDS'] and \
                            drv.ShortName not in ['GIF', 'JP2ECW', 'JP2Lura']:

                        for j in range(10):
                            truncated_size = (size * j) / 10
                            vsimem_filename = (
                                '/vsimem/test_truncate/||maxlength=%d||' %
                                truncated_size) + get_filename(drv, '')[1:]
                            # print('drv = %s, nBands = %d, datatype = %s, truncated_size = %d' % (drv.ShortName, nBands, gdal.GetDataTypeName(datatype), truncated_size))
                            dst_ds = drv.CreateCopy(vsimem_filename, ds)
                            error_detected = False
                            if dst_ds is None:
                                error_detected = True
                            else:
                                gdal.ErrorReset()
                                dst_ds = None
                                if gdal.GetLastErrorMsg() != '':
                                    error_detected = True
                            if not error_detected:
                                msg = 'write error not decteded with with drv = %s, nBands = %d, datatype = %s, truncated_size = %d' % (
                                    drv.ShortName, nBands,
                                    gdal.GetDataTypeName(datatype),
                                    truncated_size)
                                print(msg)
                                gdaltest.post_reason(msg)

                            fl = gdal.ReadDirRecursive('/vsimem/test_truncate')
                            if fl is not None:
                                for myf in fl:
                                    gdal.Unlink('/vsimem/test_truncate/' + myf)
                                fl = gdal.ReadDirRecursive(
                                    '/vsimem/test_truncate')
                                if fl is not None:
                                    print(fl)

                    if drv.ShortName not in [
                            'ECW', 'JP2ECW', 'VRT', 'XPM', 'JPEG2000', 'FIT',
                            'RST', 'INGR', 'USGSDEM', 'KMLSUPEROVERLAY', 'GMT'
                    ]:
                        dst_ds = drv.CreateCopy(
                            filename,
                            ds,
                            callback=misc_6_interrupt_callback_class().cbk)
                        if dst_ds is not None:
                            gdaltest.post_reason(
                                'interruption did not work with drv = %s, nBands = %d, datatype = %s'
                                % (drv.ShortName, nBands,
                                   gdal.GetDataTypeName(datatype)))
                            dst_ds = None

                            try:
                                shutil.rmtree(dirname)
                            except OSError:
                                pass

                            return 'fail'

                        dst_ds = None

                        try:
                            shutil.rmtree(dirname)
                        except OSError:
                            pass
                        try:
                            os.mkdir(dirname)
                        except OSError:
                            reason = 'Cannot create %s before drv = %s, nBands = %d, datatype = %s' % (
                                dirname, drv.ShortName, nBands,
                                gdal.GetDataTypeName(datatype))
                            gdaltest.post_reason(reason)
                            return 'fail'
    ds = None

    return 'success'
Exemplo n.º 21
0
    def getSupportedRasters(self):
        if self.supportedRasters != None:
            return self.supportedRasters

        # first get the GDAL driver manager
        if gdal.GetDriverCount() == 0:
            gdal.AllRegister()

        self.supportedRasters = dict()
        jp2Driver = None

        # for each loaded GDAL driver
        for i in range(gdal.GetDriverCount()):
            driver = gdal.GetDriver(i)

            if driver == None:
                QgsLogger.warning("unable to get driver " + str(i))
                continue

            # now we need to see if the driver is for something currently
            # supported; if not, we give it a miss for the next driver

            longName = string.strip(re.sub('\(.*$', '', driver.LongName))
            shortName = string.strip(re.sub('\(.*$', '', driver.ShortName))
            extensions = ''

            description = driver.GetDescription()
            glob = []

            metadata = driver.GetMetadata()
            if metadata.has_key(gdal.DMD_EXTENSION):
                extensions = str(metadata[gdal.DMD_EXTENSION])

            if longName != '':
                if extensions != '':
                    # XXX add check for SDTS; in that case we want (*CATD.DDF)

                    #TODO fix and test
                    #glob.append( QString("*." + extensions.replace("/", " *.")).split(" "))
                    glob.append(
                        string.split("*." +
                                     string.replace(extensions, "/", " *."),
                                     sep=(" ")))

                    # Add only the first JP2 driver found to the filter list (it's the one GDAL uses)
                    if description == "JPEG2000" or description.startswith(
                            "JP2"):  # JP2ECW, JP2KAK, JP2MrSID
                        if jp2Driver != None:
                            continue  # skip if already found a JP2 driver
                        jp2Driver = driver  # first JP2 driver found
                        glob.append("*.j2k")  # add alternate extension
                    elif description == "GTiff":
                        glob.append("*.tiff")
                    elif description == "JPEG":
                        glob.append("*.jpeg")
                else:
                    # USGS DEMs use "*.dem"
                    if description.startswith("USGSDEM"):
                        glob.append("*.dem")
                    elif description.startswith("DTED"):
                        # DTED use "*.dt0"
                        glob.append("*.dt0")
                    elif description.startswith("MrSID"):
                        # MrSID use "*.sid"
                        glob.append("*.sid")
                    else:
                        continue

                self.supportedRasters[longName] = {
                    'EXTENSIONS': glob,
                    'LONGNAME': longName,
                    'SHORTNAME': shortName,
                    'DESCRIPTION': description
                }

        return self.supportedRasters
Exemplo n.º 22
0
def UsageFormat():
    print('Valid formats:')
    count = gdal.GetDriverCount()
    for index in range(count):
        driver = gdal.GetDriver(index)
        print(driver.ShortName)
Exemplo n.º 23
0
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "Uncle Xiang"
# Email: [email protected]
# Time: 2020/3/4 15:57
# version: python 37

from osgeo import gdal

driver_count = gdal.GetDriverCount()
print(driver_count)

driver = gdal.GetDriver(1)
print(driver)
Exemplo n.º 24
0
    def _export_raster(self,
                       raster_name,
                       format="COG",
                       additional_options=[],
                       use_raster_region=False):
        """Export a specific raster layer with r.out.gdal as GeoTiff.

        The result is stored in a temporary directory
        that is located in the temporary grass database.

        The region of the raster layer can be used for export. In this case a
        temporary region will be used for export, so that the original region
        of the mapset is not modified.
        COG-Driver: https://gdal.org/drivers/raster/cog.html

        Args:
            raster_name (str): The name of the raster layer
            format (str): COG (default; requires GDAL >= 3.1 on server), GTiff
            additional_options (list): Unused
            use_raster_region (bool): Use the region of the raster layer for export

        Returns:
            tuple: A tuple (file_name, output_path)

        Raises:
            AsyncProcessError: If a GRASS module return status is not 0

        """
        # Export the layer
        suffix = ".tif"
        # Remove a potential mapset
        file_name = raster_name.split("@")[0] + suffix

        if use_raster_region is True:

            p = Process(exec_type="grass",
                        executable="g.region",
                        executable_params=["raster=%s" % raster_name, "-g"],
                        id=f"exporter_region_{raster_name}",
                        stdin_source=None)

            self._update_num_of_steps(1)
            self._run_module(p)

        if format == 'COG':
            # check if GDAL has COG driver
            from osgeo import gdal
            driver_list = [
                gdal.GetDriver(i).ShortName
                for i in range(gdal.GetDriverCount())
            ]
            if 'COG' not in driver_list:
                format = 'GTiff'
                self.message_logger.info(
                    "COG driver not available, using GTiff driver")

        # Save the file in the temporary directory of the temporary gisdb
        output_path = os.path.join(self.temp_file_path, file_name)

        module_name = "r.out.gdal"
        args = [
            "-fmt",
            "input=%s" % raster_name,
            "format=%s" % format,
            "output=%s" % output_path
        ]
        create_opts = "createopt=BIGTIFF=YES,COMPRESS=LZW"

        if format == "GTiff":
            # generate overviews with compression:
            os.environ['COMPRESS_OVERVIEW'] = "LZW"
            args.append("overviews=5")
            create_opts += ",TILED=YES"

        args.append(create_opts)
        # current workaround due to color table export
        # COG bug in GDAL, see https://github.com/OSGeo/gdal/issues/2946
        # TODO: DELETE AND TEST ONCE GDAL 3.1.4 HAS BEEN RELEASED
        if format == "COG":
            args.append("-c")

        if additional_options:
            args.extend(additional_options)

        p = Process(exec_type="grass",
                    executable=module_name,
                    executable_params=args,
                    id=f"exporter_raster_{raster_name}",
                    stdin_source=None)

        self._update_num_of_steps(1)
        self._run_module(p)

        return file_name, output_path
Exemplo n.º 25
0
def get_drivers() -> dict:
    drivers = {}
    for i in range(gdal.GetDriverCount()):
        driver = gdal.GetDriver(i)
        drivers[driver.ShortName] = driver.GetDescription()
    return drivers