Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@
**/.settings
target
atlassian*
*.png
Original file line number Diff line number Diff line change
Expand Up @@ -105,17 +105,6 @@ object ImageUtils {
new BufferedImage(colorModel, raster, false, null)
}

def getEmptyImage(width: Int = 256, height: Int = 256) = {
val emptyImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY)
val g2D = emptyImage.getGraphics.asInstanceOf[Graphics2D]
val save = g2D.getColor
g2D.setColor(Color.WHITE)
g2D.setComposite(AlphaComposite.Clear)
g2D.fillRect(0, 0, emptyImage.getWidth, emptyImage.getHeight)
g2D.setColor(save)
emptyImage
}

def imageSerialize(coverage: GridCoverage2D): Array[Byte] = {
val buffer: ByteArrayOutputStream = new ByteArrayOutputStream
val out: ObjectOutputStream = new ObjectOutputStream(buffer)
Expand All @@ -138,17 +127,4 @@ object ImageUtils {
}
read
}

def mosaicGridCoverages(coverageList: Iterator[GridCoverage], width: Int = 256, height: Int = 256, env: Envelope, startImage: BufferedImage = null) = {
val image = if (startImage == null) { getEmptyImage(width, height) } else { startImage }
while (coverageList.hasNext) {
val coverage = coverageList.next()
val coverageEnv = coverage.getEnvelope
val coverageImage = coverage.getRenderedImage
val posx = ((coverageEnv.getMinimum(0) - env.getMinimum(0)) / 1.0).asInstanceOf[Int]
val posy = ((env.getMaximum(1) - coverageEnv.getMaximum(1)) / 1.0).asInstanceOf[Int]
image.getRaster.setDataElements(posx, posy, coverageImage.getData)
}
image
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import org.geotools.factory.Hints
import org.geotools.geometry.jts.ReferencedEnvelope
import org.geotools.referencing.crs.DefaultGeographicCRS
import org.junit.runner.RunWith
import org.locationtech.geomesa.plugin.ImageUtils
import org.locationtech.geomesa.raster.util.RasterUtils
import org.specs2.mutable.Specification
import org.specs2.runner.JUnitRunner

Expand Down Expand Up @@ -54,7 +54,7 @@ class GeoMesaCoverageReaderTest extends Specification {

def getImageFromGridCoverages(gridCoverageIterator: Iterator[GridCoverage2D], width: Int, height: Int): BufferedImage = {
val envTotal = new ReferencedEnvelope(width * -1, width, height * -1, height, DefaultGeographicCRS.WGS84)
ImageUtils.mosaicGridCoverages(gridCoverageIterator, width * 2, height * 2, envTotal)
RasterUtils.mosaicGridCoverages(gridCoverageIterator, width * 2, height * 2, envTotal)
}

def getImageByteArray(imageName: String): Array[Byte] = {
Expand All @@ -64,41 +64,28 @@ class GeoMesaCoverageReaderTest extends Specification {
baos.toByteArray
}

def runMosaicTest(width: Int , height: Int) = {
val gridCoverageIterator = getTestGridCoverages(width, height)
val image = getImageFromGridCoverages(gridCoverageIterator, width, height)
val randString = Random.alphanumeric.take(5).mkString
val tempFile = File.createTempFile(s"test-$randString", ".png")
ImageIO.write(image, "png", tempFile)
val checkImage = getImageByteArray(this.getClass.getClassLoader.getResource(s"wcs/test-$width-$height.png").getPath)
val newImage = getImageByteArray(tempFile.getAbsolutePath)
ArrayUtil.equals(checkImage, newImage) must beTrue
}

"GeoMesaCoverageReader" should {
"mosaic GridCoverages appropriately for 4 10x10 grid coverages" in {
val width = 10
val height = 10
val gridCoverageIterator = getTestGridCoverages(width, height)
val image = getImageFromGridCoverages(gridCoverageIterator, width, height)
val randString = Random.alphanumeric.take(5).mkString
ImageIO.write(image, "png", new File(s"test-$randString.png"))
val checkImage = getImageByteArray("src/test/resources/wcs/test-10-10.png")
val newImage = getImageByteArray(s"test-$randString.png")
ArrayUtil.equals(checkImage, newImage) must beTrue
runMosaicTest(10, 10)
}

"mosaic GridCoverages appropriately for 4 100x100 grid coverages" in {
val width = 100
val height = 100
val gridCoverageIterator = getTestGridCoverages(width, height)
val image = getImageFromGridCoverages(gridCoverageIterator, width, height)
val randString = Random.alphanumeric.take(5).mkString
ImageIO.write(image, "png", new File(s"test-$randString.png"))
val checkImage = getImageByteArray("src/test/resources/wcs/test-100-100.png")
val newImage = getImageByteArray(s"test-$randString.png")
ArrayUtil.equals(checkImage, newImage) must beTrue
runMosaicTest(100, 100)
}

"mosaic GridCoverages appropriately for 4 1000x1000 grid coverages" in {
val width = 1000
val height = 1000
val gridCoverageIterator = getTestGridCoverages(width, height)
val image = getImageFromGridCoverages(gridCoverageIterator, width, height)
val randString = Random.alphanumeric.take(5).mkString
ImageIO.write(image, "png", new File(s"test-$randString.png"))
val checkImage = getImageByteArray("src/test/resources/wcs/test-1000-1000.png")
val newImage = getImageByteArray(s"test-$randString.png")
ArrayUtil.equals(checkImage, newImage) must beTrue
runMosaicTest(1000, 1000)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
package org.locationtech.geomesa.raster.util

import java.awt.image.RenderedImage
import java.awt.{AlphaComposite, Color, Graphics2D}
import java.awt.image.{BufferedImage, RenderedImage}
import java.io.{ByteArrayInputStream, ByteArrayOutputStream, ObjectInputStream, ObjectOutputStream}
import java.nio.ByteBuffer
import java.nio.charset.Charset
import javax.media.jai.remote.SerializableRenderedImage
import org.geotools.coverage.grid.{GridCoverage2D, GridCoverageFactory}
import org.opengis.coverage.grid.GridCoverage
import org.opengis.geometry.Envelope

object RasterUtils {
Expand Down Expand Up @@ -64,5 +66,29 @@ object RasterUtils {

def renderedImageToGridCoverage2d(name: String, image: RenderedImage, env: Envelope): GridCoverage2D =
defaultGridCoverageFactory.create(name, image, env)

def getEmptyImage(width: Int = 256, height: Int = 256) = {
val emptyImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY)
val g2D = emptyImage.getGraphics.asInstanceOf[Graphics2D]
val save = g2D.getColor
g2D.setColor(Color.WHITE)
g2D.setComposite(AlphaComposite.Clear)
g2D.fillRect(0, 0, emptyImage.getWidth, emptyImage.getHeight)
g2D.setColor(save)
emptyImage
}

def mosaicGridCoverages(coverageList: Iterator[GridCoverage], width: Int = 256, height: Int = 256, env: Envelope, startImage: BufferedImage = null) = {
val image = if (startImage == null) { getEmptyImage(width, height) } else { startImage }
while (coverageList.hasNext) {
val coverage = coverageList.next()
val coverageEnv = coverage.getEnvelope
val coverageImage = coverage.getRenderedImage
val posx = ((coverageEnv.getMinimum(0) - env.getMinimum(0)) / 1.0).asInstanceOf[Int]
val posy = ((env.getMaximum(1) - coverageEnv.getMaximum(1)) / 1.0).asInstanceOf[Int]
image.getRaster.setDataElements(posx, posy, coverageImage.getData)
}
image
}
}