Skip to content

Raster Visualizer

Sedona offers some APIs to aid in easy visualization of a raster object.

Image-based visualization

Sedona offers APIs to visualize a raster in an image form. This API only works for rasters with byte data, and bands <= 4 (Grayscale - RGBA). You can check the data type of an existing raster by using RS_BandPixelType or create your own raster by passing 'B' while using RS_MakeEmptyRaster.

RS_AsBase64

Introduction: Returns a base64 encoded string of the given raster. If the datatype is integral then this function internally takes the first 4 bands as RGBA, and converts them to the PNG format, finally produces a base64 string. When the datatype is not integral, the function converts the raster to TIFF format, and then generates a base64 string. To visualize other bands, please use it together with RS_Band. You can take the resulting base64 string in an online viewer to check how the image looks like.

Warning

This is not recommended for large files.

Format: RS_AsBase64(raster: Raster)

SQL example:

SELECT RS_AsBase64(raster) from rasters

Output:

iVBORw0KGgoAAAA...

RS_AsImage

Introduction: Returns a HTML that when rendered using an HTML viewer or via a Jupyter Notebook, displays the raster as a square image of side length imageWidth. Optionally, an imageWidth parameter can be passed to RS_AsImage in order to increase the size of the rendered image (default: 200).

Format: RS_AsImage(raster: Raster, imageWidth: Integer = 200)

SQL example:

SELECT RS_AsImage(raster, 500) from rasters
SELECT RS_AsImage(raster) from rasters

Output:

"<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAECAAAAABjWKqcAAAAIElEQVR42mPgPfGfkYUhhfcBNw+DT1KihS6DqLKztjcATWMFp9rkkJgAAAAASUVORK5CYII=\" width=\"200\" />";

Tip

RS_AsImage can be paired with SedonaUtils.display_image(df) wrapper inside a Jupyter notebook to directly print the raster as an image in the output, where the 'df' parameter is the dataframe containing the HTML data provided by RS_AsImage

Example:

df = sedona.read.format('binaryFile').load(DATA_DIR + 'raster.tiff').selectExpr(\"RS_FromGeoTiff(content) as raster\")
htmlDF = df.selectExpr(\"RS_AsImage(raster, 500) as raster_image\")
SedonaUtils.display_image(htmlDF)

Output

Text-based visualization

RS_AsMatrix

Introduction: Returns a string representation of a specified raster band, formatted as a 2D matrix. It converts all raster values to doubles and allows customization of the number of decimal places. The function primarily requires a raster input and optionally accepts two parameters: band (defaulting to 1, with 1-based indexing) and postDecimalPrecision (defaulting to 6).

Format:

RS_AsMatrix(raster: Raster, band: Integer = 1, postDecimalPrecision: Integer = 6)

Note

  • Band Selection: Throws an IllegalArgumentException if the specified band is not present in the raster.

  • Value Type: For rasters with integral values, the postDecimalPrecision is ignored, resulting in integer output.

  • Output Display: When using show() to display the matrix, escape sequences may appear for special characters. To correctly view the matrix as intended, use the following examples.

print("\n".join(df.selectExpr("RS_AsMatrix(rast)").sample(0.5).collect()))
println(df.selectExpr("RS_AsMatrix(rast)").sample(0.5).collect().mkString("\n"))
System.out.println(String.join("\n", df.selectExpr("RS_AsMatrix(rast)").sample(0.5).collect()))

The sample() function in the examples is used to reduce the amount of data sent to collect(), but you can also use filter() if it's more appropriate for your data.

SQL example:

val inputDf = Seq(Seq(1, 3.333333, 4, 0.0001, 2.2222, 9, 10, 11.11111111, 3, 4, 5, 6)).toDF("band")
print(inputDf.selectExpr("RS_AsMatrix(RS_AddBandFromArray(RS_MakeEmptyRaster(1, 'd', 4, 3, 0, 0, 1, -1, 0, 0, 0), band, 1, 0))").sample(0.5).collect()(0))

Output:

| 1.00000   3.33333   4.00000   0.00010|
| 2.22220   9.00000  10.00000  11.11111|
| 3.00000   4.00000   5.00000   6.00000|

SQL example:

val inputDf = Seq(Seq(1, 3, 4, 0, 2, 9, 10, 11, 3, 4, 5, 6)).toDF("band")
print(inputDf.selectExpr("RS_AsMatrix(RS_AddBandFromArray(RS_MakeEmptyRaster(1, 'i', 4, 3, 0, 0, 1, -1, 0, 0, 0), band, 1, 0))").sample(0.5).collect()(0))

Output:

| 1   3   4   0|
| 2   9  10  11|
| 3   4   5   6|


Last update: February 9, 2024 03:04:11