Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

issue846 implement addTemporal in TileRasterLayer #383

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 2 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
34 changes: 34 additions & 0 deletions geopyspark-geotrellis/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,24 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.locationtech.geotrellis</groupId>
<artifactId>geotrellis-spark-testkit_${scala.binary.version}</artifactId>
<version>${geotrellis.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.locationtech.geotrellis</groupId>
<artifactId>geotrellis-s3-spark_${scala.binary.version}</artifactId>
Expand All @@ -106,6 +124,21 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.openeo</groupId>
<artifactId>openeo-geotrellis</artifactId>
<version>${parent.version}</version>
<!-- Extra include, just for test classes-->
<type>test-jar</type>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.openeo</groupId>
<artifactId>openeo-geotrellis</artifactId>
<version>${parent.version}</version>
<!-- Extra include, just for test classes-->
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.azavea.geotrellis</groupId>
<artifactId>gdal-warp-bindings</artifactId>
Expand Down Expand Up @@ -144,6 +177,7 @@
<LD_LIBRARY_PATH>/tmp_epod/gdal:../venv/lib/python3.8/site-packages/jep</LD_LIBRARY_PATH>
<PROJ_LIB>/tmp_epod/gdal/data</PROJ_LIB>
</environmentVariables>
<argLine>--add-opens=java.base/java.nio=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/sun.nio.ch=ALL-UNNAMED --add-opens=java.base/sun.security.action=ALL-UNNAMED</argLine>
<reuseForks>false</reuseForks>
<includes>
<include>**/Test*.*</include>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,14 @@ class SpatialTiledRasterLayer(
SpatialTiledRasterLayer(zoom, tileLayer)
}

def addTemporal(temporalKey:TemporalKey): TiledRasterLayer[SpaceTimeKey] = {
val bounds = rdd.metadata.bounds.get
val spaceTimeBound = Bounds[SpaceTimeKey](SpaceTimeKey(bounds.minKey,temporalKey),SpaceTimeKey(bounds.maxKey,temporalKey))
val newMetadata = rdd.metadata.copy(bounds = spaceTimeBound)
val newRdd = rdd.map(p => (SpaceTimeKey(p._1,temporalKey),p._2))
TemporalTiledRasterLayer(zoomLevel, ContextRDD(newRdd,newMetadata))
}

def pyramid(resampleMethod: ResampleMethod, partitionStrategy: PartitionStrategy): Array[TiledRasterLayer[SpatialKey]] = {
require(! rdd.metadata.bounds.isEmpty, "Can not pyramid an empty RDD")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,14 @@ class TemporalTiledRasterLayer(
TemporalTiledRasterLayer(zoom, tileLayer)
}

def addTemporal(temporalKey:TemporalKey): TiledRasterLayer[SpaceTimeKey] = {
val bounds = rdd.metadata.bounds.get
val spaceTimeBound = Bounds(SpaceTimeKey(bounds.minKey.spatialKey,temporalKey),SpaceTimeKey(bounds.maxKey.spatialKey,temporalKey))
val newMetadata = rdd.metadata.copy(bounds = spaceTimeBound)
val newRdd = rdd.map(p => (SpaceTimeKey(p._1.spatialKey,temporalKey),p._2))
TemporalTiledRasterLayer(zoomLevel, ContextRDD(rdd = newRdd, metadata = newMetadata))
}

def pyramid(resampleMethod: ResampleMethod, partitionStrategy: PartitionStrategy): Array[TiledRasterLayer[SpaceTimeKey]] = {
require(! rdd.metadata.bounds.isEmpty, "Can not pyramid an empty RDD")

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,8 @@ abstract class TiledRasterLayer[K: SpatialComponent: Encoder: Decoder: ClassTag:
partitionStrategy: PartitionStrategy
): TiledRasterLayer[K]

def addTemporal(temporalKey:TemporalKey):TiledRasterLayer[SpaceTimeKey]

def pyramid(resampleMethod: ResampleMethod, partitionStrategy: PartitionStrategy): Array[_] // Array[TiledRasterLayer[K]]

def focal(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package geopyspark.geotrellis

import geotrellis.layer.{KeyBounds, SpaceTimeKey, TemporalKey}
import org.apache.spark.{SparkConf, SparkContext}
import org.junit.{AfterClass, BeforeClass, Test}
import org.junit.jupiter.api.Assertions.assertEquals
import org.openeo.geotrellis.LayerFixtures
import org.slf4j.{Logger, LoggerFactory}

import java.time.ZonedDateTime

object TestTiledRasterLayer{
private implicit val logger: Logger = LoggerFactory.getLogger(classOf[TestTiledRasterLayer])

var sc: SparkContext = _

@BeforeClass
def setupSpark() = {
sc = {
val conf = new SparkConf().setMaster("local[8]").setAppName(getClass.getSimpleName)
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryo.registrator", classOf[geotrellis.spark.store.kryo.KryoRegistrator].getName)
.set("spark.ui.enabled", "true")
SparkContext.getOrCreate(conf)
}
if (sc.uiWebUrl.isDefined) logger.info("Spark uiWebUrl: " + sc.uiWebUrl.get)
}

@AfterClass
def tearDownSpark(): Unit = sc.stop()
}


class TestTiledRasterLayer {

@Test
def testAddTemporal():Unit= {
val (rdd,_) = LayerFixtures.aSpacetimeTileLayerRdd(10,10,5)
val bounds = rdd.metadata.bounds.get
val tempKey = TemporalKey(ZonedDateTime.parse("2017-01-01T00:00:00Z"))
val temporalLayer = TemporalTiledRasterLayer(1,rdd)
val spatialLayer = temporalLayer.toSpatialLayer()
val spatialWithTemp = spatialLayer.addTemporal(tempKey)
spatialWithTemp.rdd.map(p => {
assert(p._1.isInstanceOf[SpaceTimeKey])
assertEquals(tempKey,p._1.temporalKey)
}).collect
val temporalWithTemp = temporalLayer.addTemporal(tempKey)
temporalWithTemp.rdd.map(p => {
assert(p._1.isInstanceOf[SpaceTimeKey])
assertEquals(tempKey,p._1.temporalKey)
}).collect
val boundsWithTemp = KeyBounds[SpaceTimeKey](SpaceTimeKey(bounds.minKey.spatialKey,tempKey),SpaceTimeKey(bounds.maxKey.spatialKey,tempKey))
val metadataWithTemp = rdd.metadata.copy(bounds = boundsWithTemp)
assertEquals(metadataWithTemp,spatialWithTemp.rdd.metadata)
assertEquals(metadataWithTemp,temporalWithTemp.rdd.metadata)

}
}