geotrellis.raster.mapalgebra.focal.Mode.scala Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of geotrellis-raster_2.11 Show documentation
Show all versions of geotrellis-raster_2.11 Show documentation
GeoTrellis is an open source geographic data processing engine for high performance applications.
The newest version!
package geotrellis.raster.mapalgebra.focal
import geotrellis.raster._
/**
* Computes the mode of a neighborhood for a given raster
*
* @note Mode does not currently support Double raster data.
* If you use a Tile with a Double CellType (FloatConstantNoDataCellType, DoubleConstantNoDataCellType)
* the data values will be rounded to integers.
*/
object Mode {
def calculation(tile: Tile, n: Neighborhood, bounds: Option[GridBounds] = None): FocalCalculation[Tile] = {
n match {
case Square(ext) => new CellwiseModeCalc(tile, n, bounds, ext)
case _ => new CursorModeCalc(tile, n, bounds, n.extent)
}
}
def apply(tile: Tile, n: Neighborhood, bounds: Option[GridBounds] = None): Tile =
calculation(tile, n, bounds).execute()
}
class CursorModeCalc(r: Tile, n: Neighborhood, bounds: Option[GridBounds], extent: Int)
extends CursorCalculation[Tile](r, n, bounds)
with IntArrayTileResult
with MedianModeCalculation
{
initArray(extent)
def calc(r: Tile, cursor: Cursor) = {
cursor.removedCells.foreach { (x, y) =>
val v = r.get(x, y)
if(isData(v)) {
removeValue(v)
}
}
cursor.addedCells.foreach { (x, y) =>
val v = r.get(x, y)
if(isData(v)) addValue(v)
}
resultTile.set(cursor.col, cursor.row, mode)
}
}
class CellwiseModeCalc(r: Tile, n: Neighborhood, bounds: Option[GridBounds], extent: Int)
extends CellwiseCalculation[Tile](r, n, bounds)
with IntArrayTileResult
with MedianModeCalculation
{
initArray(extent)
def add(r: Tile, x: Int, y: Int) = {
val v = r.get(x, y)
if (isData(v)) {
addValue(v)
}
}
def remove(r: Tile, x: Int, y: Int) = {
val v = r.get(x, y)
if (isData(v)) {
removeValue(v)
}
}
def setValue(x: Int, y: Int) = {
resultTile.setDouble(x, y, mode)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy