Indices

class hubflow.core.Applier(defaultGrid=None, **kwargs)[source]

Bases: sphinx.ext.autodoc.importer._MockObject

apply(operatorType=None, description=None, *ufuncArgs, **ufuncKwargs)[source]
setFlowClassification(name, classification)[source]
setFlowFraction(name, fraction)[source]
setFlowInput(name, input)[source]
setFlowMask(name, mask)[source]
setFlowMasks(masks)[source]
setFlowRaster(name, raster)[source]
setFlowRegression(name, regression)[source]
setFlowVector(name, vector)[source]
setOutputRaster(name, filename)[source]
class hubflow.core.ApplierOperator(*args, **kwargs)[source]

Bases: sphinx.ext.autodoc.importer._MockObject

flowClassificationArray(name, classification, overlap=0)[source]
flowFractionArray(name, fraction, overlap=0)[source]
flowInputArray(name, input, overlap=0)[source]
flowInputDType(name, input)[source]
flowInputZSize(name, input)[source]
flowMaskArray(name, mask, aggregateFunction=None, overlap=0)[source]
flowMasksArray(masks, aggregateFunction=None, overlap=0)[source]
flowRasterArray(name, raster, indices=None, overlap=0)[source]
flowRegressionArray(name, regression, overlap=0)[source]
flowVectorArray(name, vector, overlap=0)[source]
maskFromArray(array, noDataValues=None, defaultNoDataValue=None, noDataValueSource=None, aggregateFunction=None)[source]
maskFromBandArray(array, noDataValue=None, noDataValueSource=None, index=None)[source]
maskFromFractionArray(fractionArray, minOverallCoverage, minDominantCoverage, invert=False)[source]
setFlowMetadataBandNames(name, bandNames)[source]
setFlowMetadataClassDefinition(name, classDefinition)[source]
setFlowMetadataFractionDefinition(name, classDefinition)[source]
setFlowMetadataNoDataValues(name, noDataValues)[source]
setFlowMetadataRegressionDefinition(name, noDataValues, outputNames)[source]
setFlowMetadataSensorDefinition(name, sensor)[source]
class hubflow.core.ClassDefinition(classes=None, names=None, colors=None)[source]

Bases: hubflow.core.FlowObject

Class for managing class definitions.

classes()[source]
color(label)[source]
colorByName(name)[source]
colors()[source]
colorsFlatRGB()[source]
dtype()[source]
equal(other, compareColors=True)[source]
static fromENVIClassification(raster)[source]
static fromENVIFraction(raster)[source]
static fromGDALMeta(raster, index=0, skipZeroClass=True)[source]
static fromRaster(raster)[source]
labelByName(name)[source]
labels()[source]
name(label)[source]
names()[source]
class hubflow.core.Classification(filename, classDefinition=None, minOverallCoverage=0.5, minDominantCoverage=0.5)[source]

Bases: hubflow.core.Raster

asMask(minOverallCoverage=0.5)[source]

Return itself as a Mask.

Parameters:
  • noDataValues (List[Union[None, float]]) – list of band-wise no data values
  • minOverallCoverage (float) – threshold that defines, in case of on-the-fly average-resampling, which pixel will be evaluated as True
  • indices (int) – if set, a band subset mask for the given indices is created
  • invert (int) – whether to invert the mask
Return type:

Mask

Example:
>>> raster = Raster.fromArray(array=[[[-1, 0, 5, 3, 0]]], filename='/vsimem/raster.bsq',
...                           noDataValues=[-1])
>>> raster.array()
array([[[-1,  0,  5,  3,  0]]])
>>> raster.asMask().array()
array([[[0, 1, 1, 1, 1]]], dtype=uint8)
classDefinition()[source]
dtype()[source]

Forwards hubdc.core.RasterDataset.dtype() result.

classmethod fromArray(array, filename, classDefinition=None, grid=None, noDataValues=None)[source]

Create instance from given array.

Parameters:
  • array (Union[numpy.ndarray, list]) –
  • filename (str) – output path
  • grid (hubdc.core.Grid) – output grid
  • noDataValues (List[float]) – list of band no data values
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=np.zeros(shape=[177, 100, 100]), filename='/vsimem/raster.bsq')
>>> raster.shape()
(177, 100, 100)
>>> raster.grid() # default grid uses WGS84 projection and millisecond (1/3600 degree) resolution
Grid(extent=Extent(xmin=0.0, xmax=0.027777777777777776, ymin=0.0, ymax=0.027777777777777776), resolution=Resolution(x=0.0002777777777777778, y=0.0002777777777777778), projection=Projection(wkt=GEOGCS["WGS84", DATUM["WGS_1984", SPHEROID["WGS84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4326"]])
classmethod fromClassification(filename, classification, grid=None, masks=None, **kwargs)[source]
static fromENVISpectralLibrary(filename, library, attribute)[source]

Create instance from given library.

Parameters:
  • filename (str) – output path
  • library (ENVISpectralLibrary`) –
Return type:

Raster

Example:
>>> import enmapboxtestdata
>>> speclib = ENVISpectralLibrary(filename=enmapboxtestdata.speclib)
>>> raster = Raster.fromENVISpectralLibrary(filename='/vsimem/raster.bsq', library=speclib)
>>> raster.shape()
(177, 75, 1)
classmethod fromFraction(filename, fraction, grid=None, masks=None, **kwargs)[source]
classmethod fromRasterAndFunction(filename, raster, ufunc, classDefinition, **kwargs)[source]
minDominantCoverage()[source]
minOverallCoverage()[source]
noDataValues()[source]
reclassify(filename, classDefinition, mapping, **kwargs)[source]
resample(filename, grid, **kwargs)[source]

Return itself resampled into the given grid.

Parameters:
  • filename (str) – output path
  • grid (hubdc.core.Grid) –
  • resampleAlg (int) – GDAL resampling algorithm
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2, 3]]])
>>> grid = Grid(extent=raster.grid().spatialExtent(),
...             resolution=raster.grid().resolution() / (2, 1))
>>> result = raster.resample(filename='/vsimem/result.bsq', grid=grid)
>>> result.array()
array([[[1, 1, 2, 2, 3, 3]]])
statistics(mask=None, **kwargs)[source]

Return a list of BandStatistic named tuples:

key value/description
index band index
nvalid number of valid pixel (not equal to noDataValue and not masked)
ninvalid number of invalid pixel (equal to noDataValue or masked)
min smallest value
max largest value
percentiles+ list of (rank, value) tuples for given percentiles
std+ standard deviation
mean+ mean
histo+ Histogram(hist, bin_edges) tuple with histogram counts and bin edges

+set corresponding calcPercentiles/Histogram/Mean/Std keyword to True

Parameters:
  • bandIndices (Union[None, None, None]) – calculate statistics only for given bandIndices
  • mask (Union[None, None, None]) –
  • calcPercentiles (bool) – if set True, band percentiles are calculated; see percentiles keyword
  • calcHistogram (bool) – if set True, band histograms are calculated; see histogramRanges and histogramBins keywords
  • calcMean (bool) – if set True, band mean values are calculated
  • calcStd (bool) – if set True, band standard deviations are calculated
  • percentiles (List[float]) – values between 0 (i.e. min value) and 100 (i.e. max value), 50 is the median
  • histogramRanges (List[numpy.histogram ranges]) – list of ranges, one for each band; ranges are passed to numpy.histogram; None ranges are set to (min, max)
  • histogramBins (List[numpy.histogram bins]) – list of bins, one for each band; bins are passed to numpy.histogram; None bins are set to 256
  • kwargs – passed to hubflow.core.Applier
Return type:

List[BandStatistics(index, nvalid, ninvalid, min, max, percentiles, std, mean, histo)]

Example:
>>> # create raster with no data values
>>> raster = Raster.fromArray(array=[[[1, np.nan, 3], [0, 2, np.inf], [1, 0, 3]]], filename='/vsimem/raster.bsq', noDataValues=[0])
>>> # calculate basic statistics
>>> statistics = raster.statistics()
>>> print(statistics[0])
BandStatistics(index=0, nvalid=5, ninvalid=4, min=1.0, max=3.0, percentiles=None, std=None, mean=None, histo=None)
>>> # calculate histograms
>>> statistics = raster.statistics(calcHistogram=True, histogramRanges=[(1, 4)], histogramBins=[3])
>>> print(statistics[0].histo)
Histogram(hist=array([2, 1, 2], dtype=int64), bin_edges=array([ 1.,  2.,  3.,  4.]))
>>> # calculate percentiles (min, median, max)
>>> statistics = raster.statistics(calcPercentiles=True, percentiles=[0, 50, 100])
>>> print(statistics[0].percentiles)
[Percentile(rank=0, value=1.0), Percentile(rank=50, value=2.0), Percentile(rank=100, value=3.0)]
class hubflow.core.ClassificationPerformance(yP, yT, classDefinitionP, classDefinitionT, classProportions=None, N=0)[source]

Bases: hubflow.core.FlowObject

static fromRaster(prediction, reference, mask=None, **kwargs)[source]
report()[source]
class hubflow.core.ClassificationSample(raster, classification, mask=None, grid=None)[source]

Bases: hubflow.core.Sample

classification()[source]
masks()[source]
synthMix(filenameFeatures, filenameFractions, mixingComplexities, classLikelihoods=None, n=10, **kwargs)[source]
synthMix2(filenameFeatures, filenameFractions, target, mixingComplexities, classLikelihoods=None, n=10, includeEndmember=False, includeWithinclassMixtures=False, targetRange=(0, 1), **kwargs)[source]
class hubflow.core.Classifier(sklEstimator, sample=None)[source]

Bases: hubflow.core.Estimator

PREDICT_TYPE

alias of Classification

SAMPLE_TYPE

alias of ClassificationSample

fit(sample)
predict(filename, raster, mask=None, **kwargs)
predictProbability(filename, raster, mask=None, mask2=None, **kwargs)
class hubflow.core.Clusterer(sklEstimator, sample=None, classDefinition=None)[source]

Bases: hubflow.core.Estimator

PREDICT_TYPE

alias of Classification

SAMPLE_TYPE

alias of Sample

classDefinition()[source]
fit(sample)
predict(filename, raster, mask=None, **kwargs)
transform(filename, raster, inverse=False, mask=None, mask2=None, **kwargs)
class hubflow.core.ClusteringPerformance(yT, yP)[source]

Bases: hubflow.core.FlowObject

static fromRaster(prediction, reference, mask=None, **kwargs)[source]
report()[source]
class hubflow.core.ENVISpectralLibrary(filename)[source]

Bases: hubflow.core.FlowObject

Class for managing ENVI Spectral Library files.

filename()[source]

Return the filename.

static fromRaster(filename, raster)[source]

Create instance from given raster.

Parameters:
Returns:

Return type:

hubflow.core.ENVISpectralLibrary

Example:
>>> import enmapboxtestdata, tempfile, os
>>> raster = ENVISpectralLibrary(filename=enmapboxtestdata.speclib).raster()
>>> library = ENVISpectralLibrary.fromRaster(filename='/vsimem/speclib.sli', raster=raster)
>>> library
ENVISpectralLibrary(filename=/vsimem/speclib.sli)
raster(transpose=True)[source]

Return a Raster pointing to the library’s binary file.

If transpose=False the binary raster is a single band, where profiles are arranged along the y axis and wavebands along the x axis. If transpose=True profiles are still arranged along the y axis, but wavebands are transpose into the z axis, which matches the natural order of spectral raster files, and enables the direct application of various raster processing algorithms to library profiles.

Parameters:transpose (bool) – whether or not to transpose the profiles from [1, profiles, bands] to [bands, profiles, 1] order.
Return type:hubflow.core.Raster
Example:
>>> import enmapboxtestdata
>>> # as single column multiband raster
>>> ENVISpectralLibrary(filename=enmapboxtestdata.speclib).raster().shape()
(177, 75, 1)
>>> # as single band raster (original ENVI format)
>>> ENVISpectralLibrary(filename=enmapboxtestdata.speclib).raster(transpose=False).shape()
(1, 75, 177)
class hubflow.core.Estimator(sklEstimator, sample=None)[source]

Bases: hubflow.core.FlowObject

PREDICT_TYPE

alias of Raster

SAMPLE_TYPE

alias of Sample

sample()[source]
sklEstimator()[source]
class hubflow.core.FlowObject[source]

Bases: object

Base class for all workflow type.

pickle(filename, progressBar=None)[source]

Pickles itself into the given file.

Parameters:
  • filename (str) – path to the output file
  • progressBar (hubdc.progressbar.ProgressBar) – reports pickling action
Return type:

FlowObject

classmethod unpickle(filename, raiseError=True)[source]

Unpickle FlowObject from the given file.

Parameters:
  • filename (str) – path to input file.
  • raiseError (bool) – If set to True and unpickling is not successful, an exception is raised. If set to False, None is returned.
Return type:

Union[FlowObject, None]

Raises:

Union[hubflow.errors.FlowObjectTypeError, hubflow.errors.FlowObjectPickleFileError]

class hubflow.core.Fraction(filename, classDefinition=None, minOverallCoverage=0.5, minDominantCoverage=0.5)[source]

Bases: hubflow.core.Regression

asClassColorRGBRaster(filename, filterById=None, filterByName=None, **kwargs)[source]
classDefinition()[source]
classmethod fromClassification(filename, classification, grid=None, **kwargs)[source]
minDominantCoverage()[source]
minOverallCoverage()[source]
noDataValues()[source]
resample(filename, grid, **kwargs)[source]

Return itself resampled into the given grid.

Parameters:
  • filename (str) – output path
  • grid (hubdc.core.Grid) –
  • resampleAlg (int) – GDAL resampling algorithm
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2, 3]]])
>>> grid = Grid(extent=raster.grid().spatialExtent(),
...             resolution=raster.grid().resolution() / (2, 1))
>>> result = raster.resample(filename='/vsimem/result.bsq', grid=grid)
>>> result.array()
array([[[1, 1, 2, 2, 3, 3]]])
subsetClasses(filename, labels, **kwargs)[source]
subsetClassesByName(filename, names, **kwargs)[source]
toRasterMetadata(raster)[source]
class hubflow.core.FractionPerformance(yP, yT, classDefinitionP, classDefinitionT)[source]

Bases: hubflow.core.FlowObject

classmethod fromRaster(prediction, reference, mask=None, **kwargs)[source]
report()[source]
class hubflow.core.FractionSample(raster, fraction, mask=None, grid=None)[source]

Bases: hubflow.core.RegressionSample

fraction()[source]
class hubflow.core.Map[source]

Bases: hubflow.core.FlowObject

Base class for all spatial workflow types. For example Raster and Vector.

class hubflow.core.MapCollection(maps)[source]

Bases: hubflow.core.FlowObject

Class for managing a collection of Map ‘s.

extractAsArray(masks, grid=None, onTheFlyResampling=False, **kwargs)[source]

Returns a list of arrays, one for each map in the collection. Each array holds the extracted profiles for all pixels, where all maps inside masks evaluate to True.

Parameters:
  • masks (List[Map]) – List of maps that are evaluated as masks.
  • grid (hubdc.core.Grid) – If set to None, all pixel grids in the collection and in masks must match. If set to a valid Grid and onTheFlyResampling=True, all maps and masks are resampled.
  • onTheFlyResampling (bool) – If set to True, all maps and masks are resampled into the given grid.
  • kwargs – passed to hubflow.core.Applier
Returns:

list of 2d arrays of size (bands, profiles)

Return type:

List[numpy.ndarray]

Example:
>>> raster = Raster.fromArray(array=[[[1, 2], [3, 4]],[[1, 2], [3, 4]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2],
        [3, 4]],
<BLANKLINE>
       [[1, 2],
        [3, 4]]])
>>> mask = Mask.fromArray(array=[[[1, 0], [0, 1]]], filename='/vsimem/mask.bsq')
>>> mask.array()
array([[[1, 0],
        [0, 1]]], dtype=uint8)
>>> mapCollection = MapCollection(maps=[raster])
>>> mapCollection.extractAsArray(masks=[mask])
[array([[1, 4],
       [1, 4]])]
extractAsRaster(filenames, masks, grid=None, onTheFlyResampling=False, **kwargs)[source]

Returns the result of extractAsArray() as a list of Map objects.

Parameters:filenames (List[str]) – list of output paths, one for each map inside the collection
Return type:List[Map]

All other parameters are passed to extractAsArray().

Example:

Same example as in extractAsArray().

>>> raster = Raster.fromArray(array=[[[1, 2], [3, 4]],[[1, 2], [3, 4]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2],
        [3, 4]],
<BLANKLINE>
       [[1, 2],
        [3, 4]]])
>>> mask = Mask.fromArray(array=[[[1, 0], [0, 1]]], filename='/vsimem/mask.bsq')
>>> mask.array()
array([[[1, 0],
        [0, 1]]], dtype=uint8)
>>> mapCollection = MapCollection(maps=[raster])
>>> extractedRaster = mapCollection.extractAsRaster(filenames=['/vsimem/rasterExtracted.bsq'], masks=[mask])
>>> extractedRaster[0].array()
array([[[1],
        [4]],
<BLANKLINE>
       [[1],
        [4]]])
maps()[source]

Return the list of maps

class hubflow.core.Mask(filename, noDataValues=None, minOverallCoverage=0.5, indices=None, invert=False)[source]

Bases: hubflow.core.Raster

static fromRaster(filename, raster, initValue=False, true=(), false=(), invert=False, aggregateFunction=None, **kwargs)[source]

Returns a mask created from a raster map, where given lists of true and false values and value ranges are used to define True and False regions.

Parameters:
  • filename – output path
  • raster (hubflow.core.Raster) – input raster
  • initValue (bool) – initial fill value, default is False
  • true (List[number or range]) – list of forground numbers and ranges
  • false (List[number or range]) – list of forground numbers and ranges
  • invert (bool) – whether to invert the mask
  • aggregateFunction (func) – aggregation function (e.g. numpy.all or numpy.any) to reduce multiband rasters to a single band mask; the default is to not reduce and returning a multiband mask
  • kwargs – passed to hubflow.core.Applier
Returns:

hubflow.core.Mask

Return type:

Example:
>>> raster = Raster.fromArray(array=[[[-99, 1, 2, 3, 4, 5]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[-99,   1,   2,   3,   4,   5]]])
>>> # values 1, 2, 3 are True
>>> Mask.fromRaster(raster=raster, true=[1, 2, 3], filename='/vsimem/mask.bsq').array()
array([[[0, 1, 1, 1, 0, 0]]], dtype=uint8)
>>> # value range 1 to 4 is True
>>> Mask.fromRaster(raster=raster, true=[range(1, 4)], filename='/vsimem/mask.bsq').array()
array([[[0, 1, 1, 1, 1, 0]]], dtype=uint8)
>>> # all values are True, but -99
>>> Mask.fromRaster(raster=raster, initValue=True, false=[-99], filename='/vsimem/mask.bsq').array()
array([[[0, 1, 1, 1, 1, 1]]], dtype=uint8)

Different aggregations over multiple bands

>>> raster = Raster.fromArray(array=[[[0, 0, 1, 1]], [[0, 1, 0, 1]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[0, 0, 1, 1]],
<BLANKLINE>
       [[0, 1, 0, 1]]])
>>> # no aggregation
>>> Mask.fromRaster(raster=raster, true=[1], filename='/vsimem/mask.bsq').readAsArray()
array([[[0, 0, 1, 1]],
<BLANKLINE>
       [[0, 1, 0, 1]]], dtype=uint8)
>>> # True if all pixel profile values are True
>>> def aggregate(array): return np.all(array, axis=0)
>>> Mask.fromRaster(raster=raster, true=[1], aggregateFunction=aggregate, filename='/vsimem/mask.bsq').readAsArray()
array([[[0, 0, 0, 1]]], dtype=uint8)
>>> # True if any pixel profile values are True
>>> def aggregate(array): return np.any(array, axis=0)
>>> Mask.fromRaster(raster=raster, true=[1], aggregateFunction=aggregate, filename='/vsimem/mask.bsq').readAsArray()
array([[[0, 1, 1, 1]]], dtype=uint8)
static fromVector(filename, vector, grid, **kwargs)[source]

Create a mask from a vector.

Parameters:
  • filename – output path
  • vector (hubflow.core.Vector) – input vector
  • grid (hubdc.core.Grid) –
  • kwargs
Returns:

Return type:

hubflow.core.Mask

Example:
>>> import enmapboxtestdata
>>> vector = Vector(filename=enmapboxtestdata.landcover, initValue=0)
>>> grid = Raster(filename=enmapboxtestdata.enmap).grid()
>>> mask = Mask.fromVector(filename='/vsimem/mask.bsq', vector=vector, grid=grid)
>>> plotWidget = mask.plotSinglebandGrey()
_images/mask_fromVector.png
indices()[source]

Return band subset indices.

invert()[source]

Whether to invert the mask.

minOverallCoverage()[source]

Return minimal overall coverage threshold.

noDataValues()[source]

Return band no data values.

resample(filename, grid, **kwargs)[source]

Returns a resampled mask of itself into the given grid.

Parameters:
  • filename (str) – output path
  • grid (hubdc.core.Grid) – output grid
  • kwargs – passed to hubflow.core.Applier
Returns:

Return type:

hubflow.core.Mask

Example:
>>> mask = Mask.fromArray(array=[[[0, 1]]], filename='/vsimem/mask.bsq')
>>> grid = Grid(extent=mask.grid().spatialExtent(), resolution=mask.grid().resolution().zoom(factor=(2, 1)))
>>> mask.resample(grid=grid, filename='/vsimem/resampled.bsq').array()
array([[[0, 0, 1, 1]]], dtype=uint8)
class hubflow.core.MetadataEditor[source]

Bases: object

classmethod bandCharacteristics(rasterDataset)[source]
classmethod bandNames(rasterDataset)[source]
classmethod setBandCharacteristics(rasterDataset, bandNames=None, wavelength=None, fwhm=None, wavelengthUnits=None)[source]
classmethod setBandNames(rasterDataset, bandNames)[source]
static setClassDefinition(rasterDataset, classDefinition)[source]
classmethod setFractionDefinition(rasterDataset, classDefinition)[source]
classmethod setRegressionDefinition(rasterDataset, noDataValues, outputNames)[source]
class hubflow.core.Raster(filename)[source]

Bases: hubflow.core.Map

Class for managing raster maps like Mask, Classification, Regression and Fraction.

applyMask(filename, mask, **kwargs)[source]

Applies a mask to itself.

Parameters:
  • filename (str) – output path
  • mask (Map) – a map that is evaluated as a mask
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq', noDataValues=[-1])
>>> mask = Mask.fromArray(array=[[[0, 0, 1]]], filename='/vsimem/mask.bsq')
>>> result = raster.applyMask(filename='/vsimem/result.bsq', mask=mask)
>>> result.array()
array([[[-1, -1,  3]]])
applySpatial(filename, function, **kwargs)[source]

Apply given function to each band of itself and return the result raster.

Parameters:
  • filename (str) –
  • function (function) – user defined function that takes one argument array
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2, 3]]])
>>> def square(array): return array**2
>>> result = raster.applySpatial(filename='/vsimem/result.bsq', function=square)
>>> result.array()
array([[[1, 4, 9]]])
array(grid=None, resampleAlg=<sphinx.ext.autodoc.importer._MockObject object>, **kwargs)[source]

Returns raster data as array. Performes on-the-fly resampling if grid is given.

Parameters:
  • grid (Grid) –
  • resampleAlg – GDAL resampling algorithm, e.g. gdal.GRA_NearestNeighbour
  • kwargs – passed to resample()
Returns:

Return type:

numpy.ndarray

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2, 3]]])
asMask(noDataValues=None, minOverallCoverage=0.5, indices=None, invert=False)[source]

Return itself as a Mask.

Parameters:
  • noDataValues (List[Union[None, float]]) – list of band-wise no data values
  • minOverallCoverage (float) – threshold that defines, in case of on-the-fly average-resampling, which pixel will be evaluated as True
  • indices (int) – if set, a band subset mask for the given indices is created
  • invert (int) – whether to invert the mask
Return type:

Mask

Example:
>>> raster = Raster.fromArray(array=[[[-1, 0, 5, 3, 0]]], filename='/vsimem/raster.bsq',
...                           noDataValues=[-1])
>>> raster.array()
array([[[-1,  0,  5,  3,  0]]])
>>> raster.asMask().array()
array([[[0, 1, 1, 1, 1]]], dtype=uint8)
convolve(filename, kernel, **kwargs)[source]

Perform convolution of itself with the given kernel and return the result raster, where an 1D kernel is applied along the z dimension, an 2D kernel is applied spatially (i.e. y/x dimensions), and an 3D kernel is applied directly to the 3D z-y-x data cube.

Parameters:
  • filename (str) – output path
  • kernel (astropy.convolution.kernels.Kernel) –
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> array = np.zeros(shape=[1, 5, 5])
>>> array[0, 2, 2] = 1
>>> raster = Raster.fromArray(array=array, filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]]])
>>> from astropy.convolution.kernels import Kernel2D
>>> kernel = Kernel2D(array=np.ones(shape=[3, 3]))
>>> kernel.array
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
>>> result = raster.convolve(filename='/vsimem/result.bsq', kernel=kernel)
>>> result.array()
array([[[ 0.,  0.,  0.,  0.,  0.],
        [ 0.,  1.,  1.,  1.,  0.],
        [ 0.,  1.,  1.,  1.,  0.],
        [ 0.,  1.,  1.,  1.,  0.],
        [ 0.,  0.,  0.,  0.,  0.]]], dtype=float32)
dataset()[source]

Return the hubdc.core.RasterDataset object.

dtype()[source]

Forwards hubdc.core.RasterDataset.dtype() result.

filename()[source]

Return the filename.

classmethod fromArray(array, filename, grid=None, noDataValues=None, **kwargs)[source]

Create instance from given array.

Parameters:
  • array (Union[numpy.ndarray, list]) –
  • filename (str) – output path
  • grid (hubdc.core.Grid) – output grid
  • noDataValues (List[float]) – list of band no data values
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=np.zeros(shape=[177, 100, 100]), filename='/vsimem/raster.bsq')
>>> raster.shape()
(177, 100, 100)
>>> raster.grid() # default grid uses WGS84 projection and millisecond (1/3600 degree) resolution
Grid(extent=Extent(xmin=0.0, xmax=0.027777777777777776, ymin=0.0, ymax=0.027777777777777776), resolution=Resolution(x=0.0002777777777777778, y=0.0002777777777777778), projection=Projection(wkt=GEOGCS["WGS84", DATUM["WGS_1984", SPHEROID["WGS84",6378137,298.257223563, AUTHORITY["EPSG","7030"]], AUTHORITY["EPSG","6326"]], PRIMEM["Greenwich",0, AUTHORITY["EPSG","8901"]], UNIT["degree",0.0174532925199433, AUTHORITY["EPSG","9122"]], AUTHORITY["EPSG","4326"]])
static fromENVISpectralLibrary(filename, library)[source]

Create instance from given library.

Parameters:
  • filename (str) – output path
  • library (ENVISpectralLibrary`) –
Return type:

Raster

Example:
>>> import enmapboxtestdata
>>> speclib = ENVISpectralLibrary(filename=enmapboxtestdata.speclib)
>>> raster = Raster.fromENVISpectralLibrary(filename='/vsimem/raster.bsq', library=speclib)
>>> raster.shape()
(177, 75, 1)
classmethod fromRasterDataset(rasterDataset, **kwargs)[source]

Create instance from given rasterDataset.

Parameters:
  • rasterDataset (hubdc.core.RasterDataset) – existing hubdc.core.RasterDataset
  • kwargs – passed to class constructor
Return type:

Raster

Example:
>>> rasterDataset = RasterDataset.fromArray(array=[[[1,2,3]]], filename='/vsimem/raster.bsq', driver=ENVIBSQDriver())
>>> rasterDataset # doctest: +ELLIPSIS
RasterDataset(gdalDataset=<osgeo.gdal.Dataset; proxy of <Swig Object of type 'GDALDatasetShadow *' at 0x...> >)
>>> Raster.fromRasterDataset(rasterDataset=rasterDataset)
Raster(filename=/vsimem/raster.bsq)
classmethod fromVector(filename, vector, grid, noDataValue=None, **kwargs)[source]

Create instance from given vector by rasterizing it into the given grid.

Parameters:
  • filename (str) – output path
  • vector (Vector) – input vector
  • grid (hubdc.core.Grid) – output pixel grid
  • noDataValue (float) – output no data value
  • kwargs – passed to hubflow.core.Applier
Return type:

hubflow.core.Raster

Example:
>>> import tempfile
>>> vector = Vector.fromPoints(points=[(-1, -1), (1, 1)], filename=join(tempfile.gettempdir(), 'vector.shp'), projection=Projection.WGS84())
>>> grid = Grid(extent=Extent(xmin=-1.5, xmax=1.5, ymin=-1.5, ymax=1.5), resolution=1, projection=Projection.WGS84())
>>> raster = Raster.fromVector(filename='/vsimem/raster.bsq', vector=vector, grid=grid)
>>> print(raster.array())
[[[ 0.  0.  1.]
  [ 0.  0.  0.]
  [ 1.  0.  0.]]]
grid()[source]

Forwards hubdc.core.RasterDataset.grid() result.

metadataFWHM(required=False)[source]

Return list of band full width at half maximums in nanometers. If not defined, list entries are None.

Example:
>>> import enmapboxtestdata
>>> Raster(filename=enmapboxtestdata.enmap).metadataFWHM() # doctest: +ELLIPSIS
[5.8, 5.8, 5.8, ..., 9.1, 9.1, 9.1]
metadataWavelength()[source]

Return list of band center wavelengths in nanometers.

Example:
>>> import enmapboxtestdata
>>> Raster(filename=enmapboxtestdata.enmap).metadataWavelength() # doctest: +ELLIPSIS
[460.0, 465.0, 470.0, ..., 2393.0, 2401.0, 2409.0]
noDataValue(default=None)[source]

Forwards hubdc.core.RasterDataset.noDataValue() result.

plotCategoryBand(*args, **kwargs)[source]

Forwards hubdc.core.RasterDataset.plotCategoryBand()

plotSinglebandGrey(*args, **kwargs)[source]

Forwards hubdc.core.RasterDataset.plotSinglebandGrey()

plotZProfile(*args, **kwargs)[source]

Forwards hubdc.core.RasterDataset.plotZProfile()

readAsArray(grid=None, resampleAlg=<sphinx.ext.autodoc.importer._MockObject object>)[source]

Forwards hubdc.core.RasterDataset.readAsArray() result.

resample(filename, grid, resampleAlg=<sphinx.ext.autodoc.importer._MockObject object>, **kwargs)[source]

Return itself resampled into the given grid.

Parameters:
  • filename (str) – output path
  • grid (hubdc.core.Grid) –
  • resampleAlg (int) – GDAL resampling algorithm
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2, 3]]])
>>> grid = Grid(extent=raster.grid().spatialExtent(),
...             resolution=raster.grid().resolution() / (2, 1))
>>> result = raster.resample(filename='/vsimem/result.bsq', grid=grid)
>>> result.array()
array([[[1, 1, 2, 2, 3, 3]]])
scatterMatrix(raster2, bandIndex1, bandIndex2, range1, range2, bins=256, mask=None, stratification=None, **kwargs)[source]

Return scatter matrix between itself’s band given by bandIndex1 and raster2’s band given by bandIndex2 stored as a named tuple ScatterMatrix(H, xedges, yedges). Where H is the 2d count matrix for the binning given by xedges and yedges lists. If a stratication is defined, H will be a list of 2d count matrices, one for each strata.

Parameters:
  • raster2 (Raster) –
  • bandIndex1 (int) – first band index
  • bandIndex2 (int) – second band index
  • range1 (Tuple[float, float]) – first band range as (min, max) tuple
  • range2 (Tuple[float, float]) – second band range as (min, max) tuple
  • bins – passed to np.histogram2d
  • mask (Map) – map that is evaluated as a mask
  • stratification (Classification) – classification that stratifies the calculation into different classes
  • kwargs – passed to hubflow.core.Applier
Return type:

ScatterMatrix(H, xedges, yedges)

Example:
>>> # create two single band raster
>>> raster1 = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster1.bsq')
>>> raster2 = Raster.fromArray(array=[[[10, 20, 30]]], filename='/vsimem/raster2.bsq')
>>> # calculate scatter matrix between both raster bands
>>> scatterMatrix = raster1.scatterMatrix(raster2=raster2, bandIndex1=0, bandIndex2=0, range1=[1, 4], range2=[10, 40], bins=3)
>>> scatterMatrix.H
array([[1, 0, 0],
       [0, 1, 0],
       [0, 0, 1]], dtype=uint64)
>>> scatterMatrix.xedges
array([ 1.,  2.,  3.,  4.])
>>> scatterMatrix.yedges
array([ 10.,  20.,  30.,  40.])
sensorDefinition()[source]

Return SenserDefinition created from center wavelength and FWHM.

Example:
>>> SensorDefinition.predefinedSensorNames()
['modis', 'moms', 'mss', 'npp_viirs', 'pleiades1a', 'pleiades1b', 'quickbird', 'rapideye', 'rasat', 'seawifs', 'sentinel2', 'spot', 'spot6', 'tm', 'worldview1', 'worldview2', 'worldview3']
>>> SensorDefinition.fromPredefined('sentinel2') # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
SensorDefinition(wavebandDefinitions=[WavebandDefinition(center=443.0, fwhm=None, responses=[...], name=Sentinel-2 - Band B1), ...,
                                      WavebandDefinition(center=2196.5, fwhm=None, responses=[...], name=Sentinel-2 - Band B12)])
shape()[source]

Forwards hubdc.core.RasterDataset.shape() result.

statistics(bandIndices=None, mask=None, calcPercentiles=False, calcHistogram=False, calcMean=False, calcStd=False, percentiles=[], histogramRanges=None, histogramBins=None, **kwargs)[source]

Return a list of BandStatistic named tuples:

key value/description
index band index
nvalid number of valid pixel (not equal to noDataValue and not masked)
ninvalid number of invalid pixel (equal to noDataValue or masked)
min smallest value
max largest value
percentiles+ list of (rank, value) tuples for given percentiles
std+ standard deviation
mean+ mean
histo+ Histogram(hist, bin_edges) tuple with histogram counts and bin edges

+set corresponding calcPercentiles/Histogram/Mean/Std keyword to True

Parameters:
  • bandIndices (Union[None, None, None]) – calculate statistics only for given bandIndices
  • mask (Union[None, None, None]) –
  • calcPercentiles (bool) – if set True, band percentiles are calculated; see percentiles keyword
  • calcHistogram (bool) – if set True, band histograms are calculated; see histogramRanges and histogramBins keywords
  • calcMean (bool) – if set True, band mean values are calculated
  • calcStd (bool) – if set True, band standard deviations are calculated
  • percentiles (List[float]) – values between 0 (i.e. min value) and 100 (i.e. max value), 50 is the median
  • histogramRanges (List[numpy.histogram ranges]) – list of ranges, one for each band; ranges are passed to numpy.histogram; None ranges are set to (min, max)
  • histogramBins (List[numpy.histogram bins]) – list of bins, one for each band; bins are passed to numpy.histogram; None bins are set to 256
  • kwargs – passed to hubflow.core.Applier
Return type:

List[BandStatistics(index, nvalid, ninvalid, min, max, percentiles, std, mean, histo)]

Example:
>>> # create raster with no data values
>>> raster = Raster.fromArray(array=[[[1, np.nan, 3], [0, 2, np.inf], [1, 0, 3]]], filename='/vsimem/raster.bsq', noDataValues=[0])
>>> # calculate basic statistics
>>> statistics = raster.statistics()
>>> print(statistics[0])
BandStatistics(index=0, nvalid=5, ninvalid=4, min=1.0, max=3.0, percentiles=None, std=None, mean=None, histo=None)
>>> # calculate histograms
>>> statistics = raster.statistics(calcHistogram=True, histogramRanges=[(1, 4)], histogramBins=[3])
>>> print(statistics[0].histo)
Histogram(hist=array([2, 1, 2], dtype=int64), bin_edges=array([ 1.,  2.,  3.,  4.]))
>>> # calculate percentiles (min, median, max)
>>> statistics = raster.statistics(calcPercentiles=True, percentiles=[0, 50, 100])
>>> print(statistics[0].percentiles)
[Percentile(rank=0, value=1.0), Percentile(rank=50, value=2.0), Percentile(rank=100, value=3.0)]
uniqueValues(index)[source]

Return unique values for band at given index.

Example:
>>> raster = Raster.fromArray(array=[[[1, 1, 1, 5, 2]]], filename='/vsimem/raster.bsq')
>>> raster.uniqueValues(index=0)
array([1, 2, 5])
class hubflow.core.RasterStack(rasters)[source]

Bases: hubflow.core.FlowObject

Class for managing virtual raster stacks that can be used inside an Applier.

Example:

Stack two rasters virtually and read on-the-fly stacked data inside Applier.

>>> raster = RasterStack(rasters=[Raster.fromArray(array=[[[1, 1], [1, 1]]], filename='/vsimem/raster1.bsq'),
...                               Raster.fromArray(array=[[[2, 2], [2, 2]]], filename='/vsimem/raster2.bsq')])
>>>
>>> applier = Applier(progressBar=SilentProgressBar())
>>> applier.setFlowRaster(name='stack', raster=raster)
>>>
>>> class MyOperator(ApplierOperator):
...     def ufunc(self, raster):
...         array = self.flowRasterArray(name='stack', raster=raster)
...         return array
>>>
>>> applier.apply(operatorType=MyOperator, raster=raster) # doctest: +NORMALIZE_WHITESPACE
[array([[[1, 1],
         [1, 1]],
<BLANKLINE>
        [[2, 2],
         [2, 2]]])]
raster(index)[source]

Return raster at given index

rasters()[source]

Return iterator over all raster.

class hubflow.core.Regression(filename, noDataValues=None, outputNames=None, minOverallCoverage=0.5)[source]

Bases: hubflow.core.Raster

asMask(minOverallCoverage=None)[source]

Return itself as a Mask.

Parameters:
  • noDataValues (List[Union[None, float]]) – list of band-wise no data values
  • minOverallCoverage (float) – threshold that defines, in case of on-the-fly average-resampling, which pixel will be evaluated as True
  • indices (int) – if set, a band subset mask for the given indices is created
  • invert (int) – whether to invert the mask
Return type:

Mask

Example:
>>> raster = Raster.fromArray(array=[[[-1, 0, 5, 3, 0]]], filename='/vsimem/raster.bsq',
...                           noDataValues=[-1])
>>> raster.array()
array([[[-1,  0,  5,  3,  0]]])
>>> raster.asMask().array()
array([[[0, 1, 1, 1, 1]]], dtype=uint8)
static fromRasterMetadata(filename, raster, outputNames, noDataValues=None)[source]
minOverallCoverage()[source]
noDataValues()[source]
outputNames()[source]
resample(filename, grid, **kwargs)[source]

Return itself resampled into the given grid.

Parameters:
  • filename (str) – output path
  • grid (hubdc.core.Grid) –
  • resampleAlg (int) – GDAL resampling algorithm
  • kwargs – passed to hubflow.core.Applier
Return type:

Raster

Example:
>>> raster = Raster.fromArray(array=[[[1, 2, 3]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2, 3]]])
>>> grid = Grid(extent=raster.grid().spatialExtent(),
...             resolution=raster.grid().resolution() / (2, 1))
>>> result = raster.resample(filename='/vsimem/result.bsq', grid=grid)
>>> result.array()
array([[[1, 1, 2, 2, 3, 3]]])
toRasterMetadata(raster)[source]
class hubflow.core.RegressionPerformance(yT, yP, outputNamesT, outputNamesP)[source]

Bases: hubflow.core.FlowObject

classmethod fromRaster(prediction, reference, mask=None, **kwargs)[source]
report()[source]
class hubflow.core.RegressionSample(raster, regression, mask=None, grid=None)[source]

Bases: hubflow.core.Sample

masks()[source]
regression()[source]
class hubflow.core.Regressor(sklEstimator, sample=None)[source]

Bases: hubflow.core.Estimator

PREDICT_TYPE

alias of Regression

SAMPLE_TYPE

alias of RegressionSample

fit(sample)
predict(filename, raster, mask=None, **kwargs)
class hubflow.core.Sample(raster, mask=None, grid=None)[source]

Bases: hubflow.core.MapCollection

extractAsArray(grid=None, masks=None, onTheFlyResampling=False, **kwargs)[source]

Returns a list of arrays, one for each map in the collection. Each array holds the extracted profiles for all pixels, where all maps inside masks evaluate to True.

Parameters:
  • masks (List[Map]) – List of maps that are evaluated as masks.
  • grid (hubdc.core.Grid) – If set to None, all pixel grids in the collection and in masks must match. If set to a valid Grid and onTheFlyResampling=True, all maps and masks are resampled.
  • onTheFlyResampling (bool) – If set to True, all maps and masks are resampled into the given grid.
  • kwargs – passed to hubflow.core.Applier
Returns:

list of 2d arrays of size (bands, profiles)

Return type:

List[numpy.ndarray]

Example:
>>> raster = Raster.fromArray(array=[[[1, 2], [3, 4]],[[1, 2], [3, 4]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2],
        [3, 4]],
<BLANKLINE>
       [[1, 2],
        [3, 4]]])
>>> mask = Mask.fromArray(array=[[[1, 0], [0, 1]]], filename='/vsimem/mask.bsq')
>>> mask.array()
array([[[1, 0],
        [0, 1]]], dtype=uint8)
>>> mapCollection = MapCollection(maps=[raster])
>>> mapCollection.extractAsArray(masks=[mask])
[array([[1, 4],
       [1, 4]])]
extractAsRaster(filenames, grid=None, masks=None, onTheFlyResampling=False, **kwargs)[source]

Returns the result of extractAsArray() as a list of Map objects.

Parameters:filenames (List[str]) – list of output paths, one for each map inside the collection
Return type:List[Map]

All other parameters are passed to extractAsArray().

Example:

Same example as in extractAsArray().

>>> raster = Raster.fromArray(array=[[[1, 2], [3, 4]],[[1, 2], [3, 4]]], filename='/vsimem/raster.bsq')
>>> raster.array()
array([[[1, 2],
        [3, 4]],
<BLANKLINE>
       [[1, 2],
        [3, 4]]])
>>> mask = Mask.fromArray(array=[[[1, 0], [0, 1]]], filename='/vsimem/mask.bsq')
>>> mask.array()
array([[[1, 0],
        [0, 1]]], dtype=uint8)
>>> mapCollection = MapCollection(maps=[raster])
>>> extractedRaster = mapCollection.extractAsRaster(filenames=['/vsimem/rasterExtracted.bsq'], masks=[mask])
>>> extractedRaster[0].array()
array([[[1],
        [4]],
<BLANKLINE>
       [[1],
        [4]]])
grid()[source]
mask()[source]
masks()[source]
raster()[source]
class hubflow.core.SensorDefinition(wavebandDefinitions)[source]

Bases: hubflow.core.FlowObject

Class for managing sensor definitions.

classmethod fromENVISpectralLibrary(library, isResponseFunction)[source]

Create instance from ENVISpectralLibrary.

Parameters:
  • library (ENVISpectralLibrary) –
  • isResponseFunction (bool) – If True, library is interpreted as sensor response function. If False, center wavelength and FWHM information is used.
Return type:

SensorDefinition

Example:

Case 1 - Library contains spectra with wavelength and FWHM information (i.e. set isResponseFunction=False)

>>> import enmapboxtestdata
>>> library = ENVISpectralLibrary(filename=enmapboxtestdata.speclib)
>>> SensorDefinition.fromENVISpectralLibrary(library=library, isResponseFunction=False) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
SensorDefinition(wavebandDefinitions=[WavebandDefinition(center=460.0, fwhm=5.8, responses=[...], name=None),
                                      ...,
                                      WavebandDefinition(center=2409.0, fwhm=9.1, responses=[...], name=None)])

Case 2 - Library contains response function (i.e. set isResponseFunction=True)

>>> import hubflow.sensors, os.path
>>> library = ENVISpectralLibrary(filename = os.path.join(hubflow.sensors.__path__[0], 'sentinel2.sli'))
>>> SensorDefinition.fromENVISpectralLibrary(library=library, isResponseFunction=True) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
SensorDefinition(wavebandDefinitions=[WavebandDefinition(center=443.0, fwhm=None, responses=[...], name=Sentinel-2 - Band B1),
                                      ...,
                                      WavebandDefinition(center=2196.5, fwhm=None, responses=[...], name=Sentinel-2 - Band B12)])
static fromPredefined(name)[source]

Create an instance for a predefined sensor (e.g. name='sentinel2'). See predefinedSensorNames() for a full list of predifined sensors. Sensor response filter functions (.sli files) are stored here hubflow/sensors.

Example:
>>> SensorDefinition.fromPredefined(name='sentinel2') # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
SensorDefinition(wavebandDefinitions=[WavebandDefinition(center=443.0, fwhm=None, responses=[...], name=Sentinel-2 - Band B1),
                                      ...,
                                      WavebandDefinition(center=2196.5, fwhm=None, responses=[...], name=Sentinel-2 - Band B12)])
static fromRaster(raster)[source]

Forwards Raster.sensorDefinition().

plot(plotWidget=None, yscale=1.0, **kwargs)[source]

Return sensor definition plot.

Parameters:
  • plotWidget (pyqtgraph.graphicsWindows.PlotWindow) – if None, a new plot widget is created, otherwise, the given plotWidget is used
  • yscale (float) – scale factor for y values
  • kwargs – passed to pyqtgraph.graphicsWindows.PlotWindow.plot
Return type:

pyqtgraph.graphicsWindows.PlotWindow

Example:
>>> plotWidget = SensorDefinition.fromPredefined(name='sentinel2').plot()
_images/sensorDefinition_plot.png
static predefinedSensorNames()[source]

Return list of predefined sensor names.

Example:
>>> SensorDefinition.predefinedSensorNames()
['modis', 'moms', 'mss', 'npp_viirs', 'pleiades1a', 'pleiades1b', 'quickbird', 'rapideye', 'rasat', 'seawifs', 'sentinel2', 'spot', 'spot6', 'tm', 'worldview1', 'worldview2', 'worldview3']
resampleProfiles(array, wavelength, wavelengthUnits, minResponse=None, resampleAlg=None, **kwargs)[source]

Resample a list of profiles given as a 2d array of size (profiles, bands).

Implementation: the array, together with the wavelength and wavelengthUnits metadata, is turned into a spectral raster, which is resampled using :class:~hubflow.core.SensorDefinition.resampleRaster``.

Parameters:
  • array (Union[list, numpy.ndarray]) – list of profiles or 2d array of size (profiles, bands)
  • wavelength (List[float]) – list of center wavelength of size (bands, )
  • wavelengthUnits (str) – wavelength unit ‘nanometers’ | ‘micrometers’
  • minResponse – passed to resampleRaster()
  • resampleAlg – passed to resampleRaster()
  • kwargs – passed to resampleRaster
Return type:

numpy.ndarray

Example:
>>> import pyqtgraph as pg
>>> import enmapboxtestdata
>>> sentinel2Sensor = SensorDefinition.fromPredefined(name='sentinel2')
>>> enmapRaster = Raster(filename=enmapboxtestdata.enmap)
>>> enmapArray = enmapRaster.array().reshape((enmapRaster.shape()[0], -1)).T
>>> resampled = sentinel2Sensor.resampleProfiles(array=enmapArray, wavelength=enmapRaster.metadataWavelength(), wavelengthUnits='nanometers')
>>> index = 0 # select single profile
>>> plotWidget = pg.plot(x=enmapRaster.metadataWavelength(), y=enmapArray[index]) # draw original enmap profile
>>> plotWidget = plotWidget.plot(x=[wd.center() for wd in sentinel2Sensor.wavebandDefinitions()], y=resampled[index]) # draw resampled profile on top
_images/sensorDefinition_resampleProfiles.png
resampleRaster(filename, raster, minResponse=None, resampleAlg='linear', **kwargs)[source]

Resample the given spectral raster.

Parameters:
  • filename (str) – output path
  • raster (hubflow.core.Raster) – spectral raster
  • minResponse (float) – limits the wavelength region of the response filter function to wavelength with responses higher than minResponse; higher values speed up computation; 0.5 corresponds to the full width at half maximum region; values greater 0.5 may lead to very inaccurate results
  • resampleAlg (enum(SensorDefinition.RESAMPLE_LINEAR, SensorDefinition.RESAMPLE_RESPONSE)) – available resampling algorithms are linear interpolation between neighbouring wavelength and response function filtering
  • kwargs – passed to hubflow.core.Applier
Return type:

Union[hubflow.core.Raster, None]

Example:
>>> import enmapboxtestdata
>>> sentinel2Sensor = SensorDefinition.fromPredefined(name='sentinel2')
>>> enmapRaster = Raster(filename=enmapboxtestdata.enmap)
>>> resampled = sentinel2Sensor.resampleRaster(filename='/vsimem/resampledLinear.bsq', raster=enmapRaster)
>>> pixel = Pixel(x=0, y=0)
>>> plotWidget = enmapRaster.plotZProfile(pixel=pixel, spectral=True, xscale=1000) # draw original enmap profile
>>> plotWidget = resampled.plotZProfile(pixel=pixel, spectral=True, plotWidget=plotWidget) # draw resampled profile on top
_images/sensorDefinition_resampleRaster.png
wavebandCount()[source]

Return number of wavebands.

wavebandDefinition(index)[source]

Return WavebandDefinition for band given by index.

wavebandDefinitions()[source]

Return iterator over all WavebandDefinition’s.

RESAMPLE_LINEAR = 'linear'
RESAMPLE_OPTIONS = ['linear', 'response']
RESAMPLE_RESPONSE = 'response'
class hubflow.core.StringParser[source]

Bases: object

class Range(start, end)[source]

Bases: object

range()[source]
eval(text)[source]
list(text, extendRanges=True)[source]
range(text)[source]
strlist(text)[source]
value(text)[source]
class hubflow.core.Transformer(sklEstimator, sample=None)[source]

Bases: hubflow.core.Estimator

PREDICT_TYPE

alias of Raster

SAMPLE_TYPE

alias of Sample

fit(sample)
inverseTransform(filename, raster, mask=None, mask2=None, **kwargs)
transform(filename, raster, inverse=False, mask=None, mask2=None, **kwargs)
class hubflow.core.Vector(filename, layer=0, initValue=0, burnValue=1, burnAttribute=None, allTouched=False, filterSQL=None, dtype=<sphinx.ext.autodoc.importer._MockObject object>, noDataValue=None)[source]

Bases: hubflow.core.Map

Class for managing vector maps. See also VectorMask, VectorClassification

allTouched()[source]

Return rasterization all touched option.

burnAttribute()[source]

Return rasterization burn attribute.

burnValue()[source]

Return rasterization burn value.

dataset()[source]

Return hubdc.core.VectorDataset object.

dtype()[source]

Return rasterization data type.

filename()[source]

Return filename.

filterSQL()[source]

Return rasterization SQL filter statement.

classmethod fromPoints(filename, points, projection)[source]

Create instance from given points.

Parameters:
  • filename (str) – output path
  • points (List[Tuple[int, int]]) – list of points
  • projection (hubdc.core.Projection) –
Returns:

Return type:

hubflow.core.Vector

Example:
>>> vector = Vector.fromPoints(points=[(-1, -1), (1, 1)], filename=join(tempfile.gettempdir(), 'vector.shp'), projection=Projection.WGS84())
>>> grid = Grid(extent=Extent(xmin=-1.5, xmax=1.5, ymin=-1.5, ymax=1.5), resolution=1, projection=Projection.WGS84())
>>> raster = Raster.fromVector(filename='/vsimem/raster.bsq', vector=vector, grid=grid)
>>> raster.array()
array([[[ 0.,  0.,  1.],
        [ 0.,  0.,  0.],
        [ 1.,  0.,  0.]]], dtype=float32)
classmethod fromRandomPointsFromClassification(filename, classification, n, **kwargs)[source]

Draw stratified random locations from raster classification and return as point vector.

Parameters:
  • filename (str) – output path
  • classification – input classification used as stratification
  • n (List[int]) – list of number of points, one for each class
  • kwargs – passed to hubflow.core.Applier
Returns:

Return type:

hubflow.core.Vector

Example:

Create classification from landcover polygons, …

>>> import enmapboxtestdata
>>> grid = Raster(filename=enmapboxtestdata.enmap).grid()
>>> vectorClassification = VectorClassification(filename=enmapboxtestdata.landcover,
...                                             classAttribute=enmapboxtestdata.landcoverAttributes.Level_2_ID,
...                                             classDefinition=ClassDefinition(colors=enmapboxtestdata.landcoverClassDefinition.level2.lookup),
...                                             oversampling=5)
>>> classification = Classification.fromClassification(filename='/vsimem/classification.bsq', classification=vectorClassification, grid=grid)
>>> classification.plotCategoryBand()
_images/classification_fromClassification.png

… draw 10 random locations from each class, …

>>> points = Vector.fromRandomPointsFromClassification(classification=classification, n=[10]*6, filename=join(tempfile.gettempdir(), 'vector.shp'))

… apply those points as mask to the original classification

>>> labels = classification.applyMask(filename='/vsimem/labels.bsq', mask=points)
>>> labels.plotCategoryBand()
_images/classification_applyMask.png
classmethod fromRandomPointsFromMask(filename, mask, n, **kwargs)[source]

Draw random locations from raster mask and return as point vector.

Parameters:
  • filename (str) – output path
  • mask (hubflow.core.Mask) – input mask
  • n (int) – number of points
  • kwargs – passed to hubflow.core.Applier
Returns:

Return type:

hubflow.core.Vector

Example:

Create a mask, …

>>> import enmapboxtestdata
>>> grid = Raster(filename=enmapboxtestdata.enmap).grid()
>>> mask = Mask.fromVector(filename='/vsimem/mask.bsq',
...                        vector=Vector(filename=enmapboxtestdata.landcover), grid=grid)
>>> mask.plotSinglebandGrey()
_images/mask_fromVector.png

… draw 10 random locations, …

>>> points = Vector.fromRandomPointsFromMask(mask=mask, n=10, filename=join(tempfile.gettempdir(), 'vector.shp'))

… and rasterize the result into the grid of the mask.

>>> Mask.fromVector(filename='/vsimem/mask.bsq', vector=points, grid=grid).plotSinglebandGrey()
_images/vector_fromRandomPointsFromMask.png
classmethod fromVectorDataset(vectorDataset, **kwargs)[source]

Create instance from hubdc.core.VectorDataset.

Parameters:
  • vectorDataset (hubdc.core.VectorDataset) –
  • kwargs – passed to cls.__init__ constructor
Returns:

Return type:

hubflow.core.Vector

Example:
>>> import enmapboxtestdata
>>> vectorDataset = Vector(filename=enmapboxtestdata.landcover).dataset()
>>> Vector.fromVectorDataset(vectorDataset=vectorDataset) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
Vector(filename=...LandCov_BerlinUrbanGradient.shp, layer=0, initValue=0, burnValue=1, burnAttribute=None, allTouched=False, filterSQL=None, dtype=<class 'numpy.float32'>, noDataValue=None)
grid(resolution)[source]

Returns the grid for the given resolution.

Parameters:resolution (hubdc.core.Resolution) –
Returns:
Return type:hubdc.core.Grid
Example:
>>> import enmapboxtestdata
>>> Vector(filename=enmapboxtestdata.landcover).grid(resolution=30) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
Grid(extent=Extent(xmin=383918.24389999924, xmax=384878.24389999924,
                   ymin=5815685.854300001, ymax=5818415.854300001),
     resolution=Resolution(x=30.0, y=30.0),
     projection=Projection(wkt=PROJCS["WGS_1984_UTM_Zone_33N", GEOGCS["GCS_WGS_1984", DATUM["WGS_1984", SPHEROID["WGS_84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295], AUTHORITY["EPSG","4326"]], ..., AUTHORITY["EPSG","32633"]])
initValue()[source]

Return rasterization initialization value.

layer()[source]

Return layer name or index

noDataValue(default=None)[source]

Return rasterization no data value.

projection()[source]

Returns the projection.

Returns:
Return type:hubdc.core.Projection
Example:
>>> import enmapboxtestdata
>>> Vector(filename=enmapboxtestdata.landcover).projection() # doctest: +ELLIPSIS
Projection(wkt=PROJCS["WGS_1984_UTM_Zone_33N", GEOGCS["GCS_WGS_1984", DATUM["WGS_1984", SPHEROID["WGS_84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295], AUTHORITY["EPSG","4326"]], PROJECTION["Transverse_Mercator"], PARAMETER["latitude_of_origin",0], PARAMETER["central_meridian",15], PARAMETER["scale_factor",0.9996], PARAMETER["false_easting",500000], PARAMETER["false_northing",0], UNIT["Meter",1], AUTHORITY["EPSG","32633"]])
spatialExtent()[source]

Returns the spatial extent.

Returns:
Return type:hubdc.core.SpatialExtent
Example:
>>> import enmapboxtestdata
>>> Vector(filename=enmapboxtestdata.landcover).spatialExtent() # doctest: +ELLIPSIS
SpatialExtent(xmin=383918.24389999924, xmax=384883.2196000004, ymin=5815685.854300001, ymax=5818407.0616999995, projection=Projection(wkt=PROJCS["WGS_1984_UTM_Zone_33N", GEOGCS["GCS_WGS_1984", DATUM["WGS_1984", SPHEROID["WGS_84",6378137,298.257223563]], PRIMEM["Greenwich",0], UNIT["Degree",0.017453292519943295], AUTHORITY["EPSG","4326"]], ..., AUTHORITY["EPSG","32633"]]))
uniqueValues(attribute, spatialFilter=None)[source]

Returns unique values for given attribute.

Parameters:
  • attribute (str) –
  • spatialFilter (hubdc.core.SpatialGeometry) – optional spatial filter
Returns:

Return type:

List

Example:
>>> import enmapboxtestdata
>>> vector = Vector(filename=enmapboxtestdata.landcover)
>>> vector.uniqueValues(attribute=enmapboxtestdata.landcoverAttributes.Level_2)
['Low vegetation', 'Other', 'Pavement', 'Roof', 'Soil', 'Tree']
>>> spatialFilter = SpatialExtent(xmin=384000, xmax=384800,
...                               ymin=5818000, ymax=5819000,
...                               projection=vector.projection()).geometry()
>>> spatialFilter # doctest: +ELLIPSIS
SpatialGeometry(wkt='POLYGON ((384000 5819000 0,384800 5819000 0,384800 5818000 0,384000 5818000 0,384000 5819000 0))', projection=Projection(wkt=PROJCS["WGS_1984_UTM_Zone_33N", ..., AUTHORITY["EPSG","32633"]]))
>>> vector.uniqueValues(attribute=enmapboxtestdata.landcoverAttributes.Level_2,
...                     spatialFilter=spatialFilter)
['Low vegetation', 'Pavement', 'Roof', 'Tree']
class hubflow.core.VectorClassification(filename, classAttribute, classDefinition=None, layer=0, minOverallCoverage=0.5, minDominantCoverage=0.5, dtype=<sphinx.ext.autodoc.importer._MockObject object>, oversampling=1)[source]

Bases: hubflow.core.Vector

Class for manaing vector classifications.

classAttribute()[source]

Returns the class attribute.

classDefinition()[source]

Returns the class definition.

minDominantCoverage()[source]

Returns the minimal dominant class coverage threshold.

minOverallCoverage()[source]

Returns the minimal overall coverage threshold.

oversampling()[source]

Returns the oversampling factor.

class hubflow.core.VectorMask(filename, invert=False, **kwargs)[source]

Bases: hubflow.core.Vector

Class for managing vector masks.

invert()[source]

Returns whether to invert the mask.

kwargs()[source]

Returns additional keyword arguments.

class hubflow.core.WavebandDefinition(center, fwhm=None, responses=None, name=None)[source]

Bases: hubflow.core.FlowObject

Class for managing waveband definitions.

center()[source]

Return center wavelength location.

>>> WavebandDefinition(center=560).center()
560.0
static fromFWHM(center, fwhm, sigmaLimits=3)[source]

Create an instance from given center and fwhm. The waveband response function is modeled inside the range: center +/- sigma * sigmaLimits, where sigma is given by fwhm / 2.3548.

Example:
>>> WavebandDefinition.fromFWHM(center=500, fwhm=10) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
WavebandDefinition(center=500.0, fwhm=10.0, responses=[(487.0, 0.009227241211564235), (488.0, 0.01845426465118729), (489.0, 0.03491721729455092), (490.0, 0.06250295020961404), (491.0, 0.10584721091054979), (492.0, 0.1695806637893581), (493.0, 0.2570344015689991), (494.0, 0.3685735673688072), (495.0, 0.5000059003147861), (496.0, 0.6417177952459099), (497.0, 0.7791678897157294), (498.0, 0.8950267608170881), (499.0, 0.9726554065273144), (500.0, 1.0), (501.0, 0.9726554065273144), (502.0, 0.8950267608170881), (503.0, 0.7791678897157294), (504.0, 0.6417177952459099), (505.0, 0.5000059003147861), (506.0, 0.3685735673688072), (507.0, 0.2570344015689991), (508.0, 0.1695806637893581), (509.0, 0.10584721091054979), (510.0, 0.06250295020961404), (511.0, 0.03491721729455092)], name=None)
fwhm()[source]

Return full width at half maximum.

>>> WavebandDefinition(center=560, fwhm=10).fwhm()
10.0
name()[source]

Return waveband name.

Example:
>>> for wavebandDefinition in SensorDefinition.fromPredefined(name='sentinel2').wavebandDefinitions():
...     print(wavebandDefinition.name())
Sentinel-2 - Band B1
Sentinel-2 - Band B2
Sentinel-2 - Band B3
Sentinel-2 - Band B4
Sentinel-2 - Band B5
Sentinel-2 - Band B6
Sentinel-2 - Band B7
Sentinel-2 - Band B8
Sentinel-2 - Band B8A
Sentinel-2 - Band B9
Sentinel-2 - Band B10
Sentinel-2 - Band B11
Sentinel-2 - Band B12
plot(plotWidget=None, yscale=1.0, **kwargs)[source]

Return response function plot.

Parameters:
  • plotWidget (pyqtgraph.graphicsWindows.PlotWindow) – if None, a new plot widget is created, otherwise, the given plotWidget is used
  • yscale (float) – scale factor for y values
  • kwargs – passed to pyqtgraph.graphicsWindows.PlotWindow.plot
Return type:

pyqtgraph.graphicsWindows.PlotWindow

Example:
>>> plotWidget = SensorDefinition.fromPredefined(name='sentinel2').wavebandDefinition(index=2).plot()
_images/wavebandDefinition_plot.png
resamplingWeights(sensor)[source]

Return resampling weights for the center wavelength of the given SensorDefinition.

Example:

Calculate weights for resampling EnMAP sensor into Sentinel-2 band 3.

>>> import enmapboxtestdata
>>> enmapSensor = Raster(filename=enmapboxtestdata.enmap).sensorDefinition()
>>> enmapSensor # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
SensorDefinition(wavebandDefinitions=[WavebandDefinition(center=460.0, fwhm=5.8, responses=[(452.0, 0.0051192261189367235), ..., (466.0, 0.051454981460462346)], name=None),
                                      ...,
                                      WavebandDefinition(center=2409.0, fwhm=9.1, responses=[(2397.0, 0.008056878623001433), ..., (2419.0, 0.035151930528992195)], name=None)])
>>> sentinel2Band4 = SensorDefinition.fromPredefined(name='sentinel2').wavebandDefinition(index=2)
>>> sentinel2Band4 # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
WavebandDefinition(center=560.0, fwhm=None, responses=[(538.0, 0.01591234), ..., (582.0, 0.01477064)], name=Sentinel-2 - Band B3)
>>> weights = sentinel2Band4.resamplingWeights(sensor=enmapSensor)
>>> centers = [wd.center() for wd in enmapSensor.wavebandDefinitions()]
>>> list(zip(centers, weights)) # doctest: +ELLIPSIS, +NORMALIZE_WHITESPACE
[(460.0, 0.0), ..., (533.0, 0.0), (538.0, 0.01591234), (543.0, 0.6156192), (549.0, 0.99344666), (554.0, 0.98899243), (559.0, 0.99746124), (565.0, 0.98366361), (570.0, 0.99787368), (575.0, 0.95940618), (581.0, 0.03900649), (587.0, 0.0), ..., (2409.0, 0.0)]
responses()[source]

Return response function as list of (wavelength, response) tuples.

Example:
>>> sentinelBlue = SensorDefinition.fromPredefined(name='sentinel2').wavebandDefinition(index=1)
>>> sentinelBlue.responses()
[(454.0, 0.02028969), (455.0, 0.06381729), (456.0, 0.14181057), (457.0, 0.27989078), (458.0, 0.53566604), (459.0, 0.75764752), (460.0, 0.81162521), (461.0, 0.81796823), (462.0, 0.82713398), (463.0, 0.8391982), (464.0, 0.85271397), (465.0, 0.85564352), (466.0, 0.85505457), (467.0, 0.86079216), (468.0, 0.86901422), (469.0, 0.8732093), (470.0, 0.8746579), (471.0, 0.87890232), (472.0, 0.88401742), (473.0, 0.88568426), (474.0, 0.8864462), (475.0, 0.89132953), (476.0, 0.89810187), (477.0, 0.89921862), (478.0, 0.89728783), (479.0, 0.899455), (480.0, 0.90808729), (481.0, 0.91663575), (482.0, 0.92044598), (483.0, 0.92225061), (484.0, 0.9262647), (485.0, 0.93060572), (486.0, 0.93187505), (487.0, 0.93234856), (488.0, 0.93660786), (489.0, 0.94359652), (490.0, 0.94689153), (491.0, 0.94277939), (492.0, 0.93912406), (493.0, 0.9435992), (494.0, 0.95384075), (495.0, 0.96115588), (496.0, 0.96098811), (497.0, 0.96023166), (498.0, 0.96653039), (499.0, 0.97646982), (500.0, 0.98081022), (501.0, 0.97624561), (502.0, 0.97399225), (503.0, 0.97796507), (504.0, 0.98398942), (505.0, 0.98579982), (506.0, 0.98173313), (507.0, 0.97932703), (508.0, 0.98329935), (509.0, 0.98777523), (510.0, 0.98546073), (511.0, 0.97952735), (512.0, 0.97936162), (513.0, 0.98807291), (514.0, 0.99619133), (515.0, 0.99330779), (516.0, 0.98572054), (517.0, 0.9860457), (518.0, 0.99517659), (519.0, 1.0), (520.0, 0.99782113), (521.0, 0.93955431), (522.0, 0.70830999), (523.0, 0.42396802), (524.0, 0.24124566), (525.0, 0.13881543), (526.0, 0.07368388), (527.0, 0.03404689), (528.0, 0.01505348)]
hubflow.core.extractPixels(inputs, masks, grid, **kwargs)[source]