Skip to content

Instantly share code, notes, and snippets.

@CloudNiner
Created March 5, 2020 22:33
Show Gist options
  • Save CloudNiner/adf1c4bd07aa4043b17b5fc9ccf3667e to your computer and use it in GitHub Desktop.
Save CloudNiner/adf1c4bd07aa4043b17b5fc9ccf3667e to your computer and use it in GitHub Desktop.
GeoTrellis Layer from Landsat 8 GeoTIFFs
package geotrellis.server.ogc
import java.time.ZonedDateTime
import cats.implicits._
import geotrellis.layer.{LayoutLevel, TemporalKeyExtractor, ZoomedLayoutScheme}
import geotrellis.proj4.WebMercator
import geotrellis.raster._
import geotrellis.spark._
import geotrellis.spark.store.kryo.KryoRegistrator
import geotrellis.store.LayerId
import geotrellis.store.index.ZCurveKeyIndexMethod
import geotrellis.store.s3.S3AttributeStore
import geotrellis.spark.store.s3.S3LayerWriter
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.serializer.KryoSerializer
object CreateSpaceTimeGTLayer {
def main(args: Array[String]): Unit = {
val targetCrs = WebMercator
val layoutScheme = ZoomedLayoutScheme(targetCrs, tileSize = 256)
val geotiffs = Array(
"gtiff+s3://geotrellis-test-non-public/landsat-8-PIT.2019-05-06T00:00:00Z.tif",
"gtiff+s3://geotrellis-test-non-public/landsat-8-PIT.2019-11-14T00:00:00Z.tif"
)
val layerName = "spacetimekey-test"
val keyExtractor = TemporalKeyExtractor.fromPath { sourceName =>
ZonedDateTime.parse(sourceName.toString.split('.')(1))
}
val sparkConf = new SparkConf()
.setAppName("CreateSpaceTimeGTLayer")
.setIfMissing("spark.master", "local[*]")
.set("spark.serializer", classOf[KryoSerializer].getName)
.set("spark.kryo.registrator", classOf[KryoRegistrator].getName)
implicit val sc: SparkContext = new SparkContext(sparkConf)
val rasterSourceRDD: RDD[RasterSource] =
sc.parallelize(geotiffs).map { uri =>
RasterSource(uri).reproject(targetCrs)
}
val rasterSummary =
RasterSummary.fromRDD(rasterSourceRDD, keyExtractor.getMetadata)
val LayoutLevel(zoom, layout) = rasterSummary.levelFor(layoutScheme)
val contextRDD =
RasterSourceRDD.tiledLayerRDD(
rasterSourceRDD,
layout,
keyExtractor,
rasterSummary = Some(rasterSummary)
)
val attributeStore = S3AttributeStore(
"geotrellis-test-non-public",
"spacetimekey-test"
)
val writer = S3LayerWriter(attributeStore)
writer.write(
LayerId(layerName, zoom),
contextRDD,
ZCurveKeyIndexMethod.byDay
)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment