From 88398822ab9f084796b0e67e37784500fc3e26ba Mon Sep 17 00:00:00 2001 From: Jean-Denis Giguere Date: Thu, 7 Feb 2019 09:27:52 -0500 Subject: [PATCH 001/380] Build instructions documentation --- README.md | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/README.md b/README.md index 8644f40a5..f592c2126 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,43 @@ Please see the [Getting Started](http://rasterframes.io/getting-started.html) se * [List of available UDFs](http://rasterframes.io/latest/api/index.html#astraea.spark.rasterframes.RasterFunctions) * [RasterFrames Jupyter Notebook Docker Image](https://hub.docker.com/r/s22s/rasterframes-notebooks/) +## Build instruction + +First, you will need [sbt](https://www.scala-sbt.org/). + +Download the source from GitHub. + +```bash +git clone https://github.com/locationtech/rasterframes.git +cd rasterframes +``` + +To publish to hyou Ivy local repository: + +```bash +sbt publishLocal +``` + +You can run tests with + +```bash +sbt test +``` + +and integration tests + +```bash +sbt it:test +``` + +The documentation may be built with + +```bash +sbt makeSite +``` + +The `pyrasteframes` build instructions are located (pyrasterframes/python/README.rst)[pyrasterframes/python/README.rst] + ## Copyright and License RasterFrames is released under the Apache 2.0 License, copyright Astraea, Inc. 2017-2018. From 1d854ffe4bd6e91149f477ab9b94e99d874d48f1 Mon Sep 17 00:00:00 2001 From: Jean-Denis Giguere Date: Thu, 7 Feb 2019 09:30:56 -0500 Subject: [PATCH 002/380] Build instructions documentation - fix link syntax --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f592c2126..9ad3c9c98 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ The documentation may be built with sbt makeSite ``` -The `pyrasteframes` build instructions are located (pyrasterframes/python/README.rst)[pyrasterframes/python/README.rst] +The `pyrasteframes` build instructions are located [pyrasterframes/python/README.rst](pyrasterframes/python/README.rst) ## Copyright and License From fb93767517592305df9455d1c459649406f64960 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 13 Mar 2019 13:52:24 -0400 Subject: [PATCH 003/380] Collecting all Astraea-specific build overrides into a separate sbt file. Due to sbt evaluating build scripts in alphabetical order we can use a `x-` prefix for the filename and ensure the settings in it take precidence over the standard settings, while still maintaining syncronization/parity with the standard branches. --- project/ProjectPlugin.scala | 10 +--------- version.sbt | 2 +- x-astraea.sbt | 10 ++++++++++ 3 files changed, 12 insertions(+), 10 deletions(-) create mode 100644 x-astraea.sbt diff --git a/project/ProjectPlugin.scala b/project/ProjectPlugin.scala index 0a8df52af..ee6359d1c 100644 --- a/project/ProjectPlugin.scala +++ b/project/ProjectPlugin.scala @@ -40,15 +40,7 @@ object ProjectPlugin extends AutoPlugin { rfSparkVersion in ThisBuild := "2.3.2" , rfGeoTrellisVersion in ThisBuild := "2.1.0", rfGeoMesaVersion in ThisBuild := "2.1.0", - - credentials += Credentials(Path.userHome / ".sbt" / ".credentials"), - publishTo := { - val base = "https://s22s.mycloudrepo.io/repositories" - if (isSnapshot.value) - Some("Astraea Internal Snapshots" at s"$base/snapshots/") - else - Some("Astraea Internal Releases" at s"$base/releases/") - }, + publishTo := sonatypePublishTo.value, publishMavenStyle := true, publishArtifact in (Compile, packageDoc) := true, publishArtifact in Test := false, diff --git a/version.sbt b/version.sbt index 6f256b13e..d8a83a96c 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.8.0-astraea-SNAPSHOT" +version in ThisBuild := "0.8.0-SNAPSHOT" diff --git a/x-astraea.sbt b/x-astraea.sbt new file mode 100644 index 000000000..f3b51a14c --- /dev/null +++ b/x-astraea.sbt @@ -0,0 +1,10 @@ +// Internal Astraea-specific overides +version in ThisBuild := "0.8.0-astraea-SNAPSHOT" +credentials in ThisBuild += Credentials(Path.userHome / ".sbt" / ".credentials") +publishTo := { + val base = "https://s22s.mycloudrepo.io/repositories" + if (isSnapshot.value) + Some("Astraea Internal Snapshots" at s"$base/snapshots/") + else + Some("Astraea Internal Releases" at s"$base/releases/") +} \ No newline at end of file From 76badd7831d508f70f029a8ddadf6b17e08b43b0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 19 Mar 2019 14:30:02 -0400 Subject: [PATCH 004/380] Fixes to override capability. --- project/ProjectPlugin.scala | 2 +- x-astraea.sbt | 14 +++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/project/ProjectPlugin.scala b/project/ProjectPlugin.scala index ee6359d1c..42d3696c7 100644 --- a/project/ProjectPlugin.scala +++ b/project/ProjectPlugin.scala @@ -40,7 +40,7 @@ object ProjectPlugin extends AutoPlugin { rfSparkVersion in ThisBuild := "2.3.2" , rfGeoTrellisVersion in ThisBuild := "2.1.0", rfGeoMesaVersion in ThisBuild := "2.1.0", - publishTo := sonatypePublishTo.value, + publishTo in ThisBuild := sonatypePublishTo.value, publishMavenStyle := true, publishArtifact in (Compile, packageDoc) := true, publishArtifact in Test := false, diff --git a/x-astraea.sbt b/x-astraea.sbt index f3b51a14c..0e2aac86d 100644 --- a/x-astraea.sbt +++ b/x-astraea.sbt @@ -1,10 +1,18 @@ // Internal Astraea-specific overides -version in ThisBuild := "0.8.0-astraea-SNAPSHOT" -credentials in ThisBuild += Credentials(Path.userHome / ".sbt" / ".credentials") +ThisBuild / version := "0.8.0-astraea-SNAPSHOT" +ThisBuild / credentials += Credentials(Path.userHome / ".sbt" / ".credentials") publishTo := { val base = "https://s22s.mycloudrepo.io/repositories" if (isSnapshot.value) Some("Astraea Internal Snapshots" at s"$base/snapshots/") else Some("Astraea Internal Releases" at s"$base/releases/") -} \ No newline at end of file +} + +// Coudn't figure out why we have to call all these out explicitly. +// The above should have been sufficient based on my understanding of +// the precidence rules in sbt. +LocalProject("core") / publishTo := publishTo.value +LocalProject("datasource") / publishTo := publishTo.value +LocalProject("pyrasterframes") / publishTo := publishTo.value +LocalProject("experimental") / publishTo := publishTo.value \ No newline at end of file From c92323fda69d6de31b3a2149a70fb7f3b324a82a Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 25 Mar 2019 11:31:33 -0400 Subject: [PATCH 005/380] Expose python expm1 function Signed-off-by: Jason T. Brown --- docs/src/main/tut/reference.md | 2 +- pyrasterframes/python/pyrasterframes/rasterfunctions.py | 2 +- pyrasterframes/python/tests/PyRasterFramesTests.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 47a9b3384..d264d900d 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -547,7 +547,7 @@ _Python_: _SQL_: `rf_log1p` -Performs natural logarithm of cell values plus one. Invers of @ref:[`expm1`](reference.md#expm1). +Performs natural logarithm of cell values plus one. Inverse of @ref:[`expm1`](reference.md#expm1). ### Tile Statistics diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index b035bb253..589b256d8 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -243,7 +243,7 @@ def _(data_tile, mask_tile, mask_value): 'exp': 'Performs cell-wise exponential', 'exp2': 'Compute 2 to the power of cell values', 'exp10': 'Compute 10 to the power of cell values', - 'exp1m': 'Performs cell-wise exponential, then subtract one', + 'expm1': 'Performs cell-wise exponential, then subtract one', 'resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', # ------- JTS functions ------- diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 512809efa..b47e25577 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -101,6 +101,7 @@ def test_general(self): .withColumn('ascii', render_ascii(self.tileCol)) \ .withColumn('log', log(self.tileCol)) \ .withColumn('exp', exp(self.tileCol)) \ + .withColumn('expm1', expm1(self.tileCol)) \ .withColumn('round', round(self.tileCol)) df.show() From cd622a0ab814538a475345b854069b90772fd23b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 26 Mar 2019 10:54:51 -0400 Subject: [PATCH 006/380] Setting version to 0.8.0-SNAPSHOT --- version.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/version.sbt b/version.sbt index eb883072c..d8a83a96c 100644 --- a/version.sbt +++ b/version.sbt @@ -1 +1 @@ -version in ThisBuild := "0.8.0-RC4" +version in ThisBuild := "0.8.0-SNAPSHOT" From 0159a672f9497ed7513511618408b39145e6c5e0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 13 Mar 2019 13:52:24 -0400 Subject: [PATCH 007/380] Initial, change minimized integration of geotrellis-gdal. --- core/build.sbt | 2 +- .../spark/rasterframes/ref/RasterSource.scala | 52 +++++++++++++++++++ .../astraea/spark/rasterframes/TestData.scala | 6 +-- .../rasterframes/ref/RasterRefSpec.scala | 2 +- x-astraea.sbt | 10 ++++ 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 x-astraea.sbt diff --git a/core/build.sbt b/core/build.sbt index eb5164045..830ec2d2f 100644 --- a/core/build.sbt +++ b/core/build.sbt @@ -6,7 +6,7 @@ libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.3.2", "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.7.4-local.1", spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 9dc9bd55e..83acf8103 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -134,8 +134,10 @@ object RasterSource extends LazyLogging { private def _logger = logger + def apply(source: URI, callback: Option[ReadCallback] = None): RasterSource = source.getScheme match { + case GDALRasterSource() ⇒ GDALRasterSource(source, callback) case "http" | "https" ⇒ HttpGeoTiffRasterSource(source, callback) case "file" ⇒ FileGeoTiffRasterSource(source, callback) case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" ⇒ @@ -209,6 +211,56 @@ object RasterSource extends LazyLogging { } } + case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) extends RasterSource with URIRasterSource { + import geotrellis.contrib.vlm.gdal.{GDALRasterSource ⇒ VLMRasterSource} + + @transient + private lazy val gdal = { + val cleaned = source.toASCIIString.replace("gdal+", "") + VLMRasterSource(cleaned) + } + + override def crs: CRS = gdal.crs + + override def extent: Extent = gdal.extent + + // TODO: See if dates are available in gdal. + // Maybe useful: gdal.dataset.getMetadata_Dict + override def timestamp: Option[ZonedDateTime] = None + + override def cellType: CellType = gdal.cellType + + override def bandCount: Int = gdal.bandCount + + override def cols: Int = gdal.cols + + override def rows: Int = gdal.rows + + override def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = + if (bandCount == 1) + Left(gdal.read(extent, Seq(0)).get.mapTile(_.band(0))) + else + Right(gdal.read(extent).get) + + override def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { + val grid = gdal.gridBounds + + val tiled = grid.split(256, 256).toTraversable + + if (bandCount == 1) + Left(gdal.readBounds(tiled, Seq(0)).map(_.mapTile(_.band(0))).toSeq) + else + Right(gdal.readBounds(tiled).toSeq) + } + + override def nativeLayout: Option[TileLayout] = + Some(TileLayout(1, 1, cols, rows)) + } + + object GDALRasterSource { + def unapply(scheme: String): Boolean = scheme.startsWith("gdal+") + } + trait RangeReaderRasterSource extends RasterSource with GeoTiffInfoSupport with LazyLogging { protected def rangeReader: RangeReader diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala index 29c06849e..db59dfb58 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala @@ -123,13 +123,13 @@ trait TestData { rf.toTileLayerRDD(rf.tileColumns.head).left.get } - private val baseCOG = "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_%s.TIF" + private val baseCOG = "gdal+https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_%s.TIF" lazy val remoteCOGSingleband1 = URI.create(baseCOG.format("B1")) lazy val remoteCOGSingleband2 = URI.create(baseCOG.format("B2")) - lazy val remoteCOGMultiband = URI.create("https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/2014/02/14/IP0201402141023382027S03100E/IP0201402141023382027S03100E-COG.tif") + lazy val remoteCOGMultiband = URI.create("gdal+https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/2014/02/14/IP0201402141023382027S03100E/IP0201402141023382027S03100E-COG.tif") - lazy val remoteMODIS = URI.create("https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") + lazy val remoteMODIS = URI.create("gdal+https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") object JTS { val fact = new GeometryFactory() diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala index 4efe2b474..dbf0327cd 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala @@ -150,8 +150,8 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { assert(counter.reads === 0) assert(subRaster.tile.statistics.map(_.dataCells) === Some(subRaster.cols * subRaster.rows)) - assert(counter.reads > 0) println(counter) + assert(counter.reads > 0) } } diff --git a/x-astraea.sbt b/x-astraea.sbt new file mode 100644 index 000000000..f3b51a14c --- /dev/null +++ b/x-astraea.sbt @@ -0,0 +1,10 @@ +// Internal Astraea-specific overides +version in ThisBuild := "0.8.0-astraea-SNAPSHOT" +credentials in ThisBuild += Credentials(Path.userHome / ".sbt" / ".credentials") +publishTo := { + val base = "https://s22s.mycloudrepo.io/repositories" + if (isSnapshot.value) + Some("Astraea Internal Snapshots" at s"$base/snapshots/") + else + Some("Astraea Internal Releases" at s"$base/releases/") +} \ No newline at end of file From d67cedd16895cab94d665d88d315c16f97f717a6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 2 Jan 2019 16:10:42 -0500 Subject: [PATCH 008/380] Added basic read callback support. --- .../spark/rasterframes/ref/LayerSpace.scala | 80 ------------------- .../spark/rasterframes/ref/RasterSource.scala | 22 ++++- .../rasterframes/ref/RasterRefSpec.scala | 10 +-- 3 files changed, 22 insertions(+), 90 deletions(-) delete mode 100644 core/src/main/scala/astraea/spark/rasterframes/ref/LayerSpace.scala diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/LayerSpace.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/LayerSpace.scala deleted file mode 100644 index 25a9d050c..000000000 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/LayerSpace.scala +++ /dev/null @@ -1,80 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package astraea.spark.rasterframes.ref - -import astraea.spark.rasterframes.tiles.ProjectedRasterTile -import geotrellis.proj4.CRS -import geotrellis.raster._ -import geotrellis.raster.resample.ResampleMethod -import geotrellis.spark.tiling.LayoutDefinition -import geotrellis.spark.{SpatialKey, _} - - -/** - * NB: This package is only a temporary home for this. - * - * @since 9/5/18 - */ -case class LayerSpace( - crs: CRS, - cellType: CellType, - layout: LayoutDefinition, - resampleMethod: ResampleMethod = ResampleMethod.DEFAULT -) { - - def reproject(dest: CRS): LayerSpace = { - copy( - crs = dest, - layout = layout.copy(extent = layout.extent.reproject(crs, dest)) - ) - } - - def asTileLayerMetadata: TileLayerMetadata[SpatialKey] = { - val bounds = KeyBounds( - SpatialKey(0, 0), - SpatialKey(layout.layoutCols - 1, layout.layoutRows - 1) - ) - TileLayerMetadata(cellType, layout, layout.extent, crs, bounds) - } -} - -object LayerSpace { - - private[rasterframes] - def defaultLayout(prt: ProjectedRasterTile): LayoutDefinition = - LayoutDefinition(prt.extent, TileLayout(1, 1, prt.cols, prt.rows)) - - def from(rs: RasterSource): LayerSpace = new LayerSpace( - rs.crs, rs.cellType, LayoutDefinition(rs.extent, rs.nativeLayout - .getOrElse(TileLayout(1, 1, rs.cols, rs.rows)) - ) - ) - - def from(rr: RasterRef): LayerSpace = new LayerSpace( - rr.crs, rr.cellType, RasterRef.defaultLayout(rr) - ) - - def from(prt: ProjectedRasterTile): LayerSpace = new LayerSpace( - prt.crs, prt.cellType, defaultLayout(prt) - ) - -} diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 83acf8103..c71417a83 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -213,6 +213,7 @@ object RasterSource extends LazyLogging { case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) extends RasterSource with URIRasterSource { import geotrellis.contrib.vlm.gdal.{GDALRasterSource ⇒ VLMRasterSource} + import GDALRasterSource.MAX_SIZE @transient private lazy val gdal = { @@ -236,16 +237,27 @@ object RasterSource extends LazyLogging { override def rows: Int = gdal.rows - override def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = + override def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = { + + callback.foreach { cb ⇒ + val grid = rasterExtent.gridBoundsFor(extent, clamp = false) + cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) + } + if (bandCount == 1) Left(gdal.read(extent, Seq(0)).get.mapTile(_.band(0))) else Right(gdal.read(extent).get) + } override def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { val grid = gdal.gridBounds - val tiled = grid.split(256, 256).toTraversable + callback.foreach { cb ⇒ + cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) + } + + val tiled = grid.split(MAX_SIZE, MAX_SIZE).toTraversable if (bandCount == 1) Left(gdal.readBounds(tiled, Seq(0)).map(_.mapTile(_.band(0))).toSeq) @@ -253,11 +265,13 @@ object RasterSource extends LazyLogging { Right(gdal.readBounds(tiled).toSeq) } - override def nativeLayout: Option[TileLayout] = - Some(TileLayout(1, 1, cols, rows)) + override def nativeLayout: Option[TileLayout] = { + Some(TileLayout(cols / MAX_SIZE + 1, rows / MAX_SIZE + 1, math.min(cols, MAX_SIZE), math.min(rows, MAX_SIZE))) + } } object GDALRasterSource { + final val MAX_SIZE = 256 def unapply(scheme: String): Boolean = scheme.startsWith("gdal+") } diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala index dbf0327cd..ad29e0e0e 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala @@ -26,7 +26,7 @@ import astraea.spark.rasterframes._ import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.expressions.accessors._ import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile -import geotrellis.raster.Tile +import geotrellis.raster.{GridBounds, Tile} import geotrellis.vector.Extent /** @@ -36,6 +36,7 @@ import geotrellis.vector.Extent */ //noinspection TypeAnnotation class RasterRefSpec extends TestEnvironment with TestData { + def sub(e: Extent) = { val c = e.center val w = e.width @@ -44,7 +45,7 @@ class RasterRefSpec extends TestEnvironment with TestData { } trait Fixture { - val counter = new ReadMonitor + val counter = new ReadMonitor(false) val src = RasterSource(remoteCOGSingleband1, Some(counter)) val fullRaster = RasterRef(src) val subExtent = sub(src.extent) @@ -94,7 +95,6 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { val ds = Seq((1, RasterRefTile(fullRaster): Tile)).toDF("index", "ref") val dims = ds.select(GetDimensions($"ref")) - println(counter) assert(dims.count() === 1) assert(dims.first() !== null) } @@ -103,7 +103,6 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { val ds = Seq((1, RasterRefTile(subRaster): Tile)).toDF("index", "ref") val dims = ds.select(GetDimensions($"ref")) - println(counter) assert(dims.count() === 1) assert(dims.first() !== null) } @@ -150,8 +149,7 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { assert(counter.reads === 0) assert(subRaster.tile.statistics.map(_.dataCells) === Some(subRaster.cols * subRaster.rows)) - println(counter) - assert(counter.reads > 0) + assert(counter.reads > 0) } } From e39e17ec8cdef9b2e91527ff9e15cd8e172a216b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 3 Jan 2019 10:36:31 -0500 Subject: [PATCH 009/380] Misc updates to prototype gdal connector. --- .scalafmt.conf | 6 +- .../spark/rasterframes/ref/RasterSource.scala | 168 ++++++++++-------- 2 files changed, 96 insertions(+), 78 deletions(-) diff --git a/.scalafmt.conf b/.scalafmt.conf index 4d09e93c7..ca5e10394 100644 --- a/.scalafmt.conf +++ b/.scalafmt.conf @@ -1,10 +1,7 @@ maxColumn = 138 continuationIndent.defnSite = 2 -continuationIndent.callSite = 2 -continuationIndent.extendSite = 2 binPack.parentConstructors = true binPack.literalArgumentLists = false -binPack.unsafeCallSite = true newlines.penalizeSingleSelectMultiArgList = false newlines.sometimesBeforeColonInMethodReturnType = false align.openParenCallSite = false @@ -16,5 +13,4 @@ rewriteTokens { } optIn.selfAnnotationNewline = false optIn.breakChainOnFirstMethodDot = true -optIn.configStyleArguments = false -importSelectors = BinPack +importSelectors = BinPack \ No newline at end of file diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index c71417a83..e4cf4c4a1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -86,17 +86,17 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { val extents = nativeTiling if (bandCount == 1) { val rasters = for { - extent ← extents + extent <- extents rr = RasterRef(this, Some(extent)) tile: Tile = RasterRefTile(rr) } yield Raster(tile, extent) Left(rasters) - } - else { + } else { // Need to figure this out. - RasterSource._logger.warn("Lazy reading is not available for multiband images. Performing eager read.") + RasterSource._logger.warn( + "Lazy reading is not available for multiband images. Performing eager read.") val rasters = for { - extent ← extents + extent <- extents raster = this.read(extent).right.get } yield raster Right(rasters) @@ -114,14 +114,15 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def tileContext: TileContext = TileContext(extent, crs) def nativeTiling: Seq[Extent] = { - nativeLayout.map { tileLayout ⇒ - val layout = LayoutDefinition(extent, tileLayout) - val transform = layout.mapTransform - for { - col ← 0 until tileLayout.layoutCols - row ← 0 until tileLayout.layoutRows - } yield transform(col, row) - } + nativeLayout + .map { tileLayout => + val layout = LayoutDefinition(extent, tileLayout) + val transform = layout.mapTransform + for { + col <- 0 until tileLayout.layoutCols + row <- 0 until tileLayout.layoutRows + } yield transform(col, row) + } .getOrElse(Seq(extent)) } } @@ -134,24 +135,22 @@ object RasterSource extends LazyLogging { private def _logger = logger - def apply(source: URI, callback: Option[ReadCallback] = None): RasterSource = source.getScheme match { - case GDALRasterSource() ⇒ GDALRasterSource(source, callback) - case "http" | "https" ⇒ HttpGeoTiffRasterSource(source, callback) - case "file" ⇒ FileGeoTiffRasterSource(source, callback) - case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" ⇒ + case GDALRasterSource() => GDALRasterSource(source, callback) + case "http" | "https" => HttpGeoTiffRasterSource(source, callback) + case "file" => FileGeoTiffRasterSource(source, callback) + case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" => // TODO: How can we get the active hadoop configuration // TODO: without having to pass it through? - val config = () ⇒ new Configuration() + val config = () => new Configuration() HadoopGeoTiffRasterSource(source, config, callback) - case "s3" ⇒ - val client = () ⇒ S3Client.DEFAULT + case "s3" => + val client = () => S3Client.DEFAULT S3GeoTiffRasterSource(source, client, callback) - case s ⇒ throw new UnsupportedOperationException(s"Scheme '$s' not supported") + case s => throw new UnsupportedOperationException(s"Scheme '$s' not supported") } - case class SimpleGeoTiffInfo( cellType: CellType, extent: Extent, @@ -165,13 +164,21 @@ object RasterSource extends LazyLogging { object SimpleGeoTiffInfo { def apply(info: GeoTiffReader.GeoTiffInfo): SimpleGeoTiffInfo = - SimpleGeoTiffInfo(info.cellType, info.extent, info.rasterExtent, info.crs, info.tags, info.segmentLayout, info.bandCount, info.noDataValue) + SimpleGeoTiffInfo( + info.cellType, + info.extent, + info.rasterExtent, + info.crs, + info.tags, + info.segmentLayout, + info.bandCount, + info.noDataValue) } // According to https://goo.gl/2z8xx9 the GeoTIFF date format is 'YYYY:MM:DD HH:MM:SS' private val dateFormat = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss") - trait URIRasterSource { _: RasterSource ⇒ + trait URIRasterSource { _: RasterSource => def source: URI abstract override def toString: String = { @@ -211,9 +218,10 @@ object RasterSource extends LazyLogging { } } - case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) extends RasterSource with URIRasterSource { - import geotrellis.contrib.vlm.gdal.{GDALRasterSource ⇒ VLMRasterSource} + case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) + extends RasterSource with URIRasterSource { import GDALRasterSource.MAX_SIZE + import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} @transient private lazy val gdal = { @@ -227,7 +235,10 @@ object RasterSource extends LazyLogging { // TODO: See if dates are available in gdal. // Maybe useful: gdal.dataset.getMetadata_Dict - override def timestamp: Option[ZonedDateTime] = None + override def timestamp: Option[ZonedDateTime] = { + val meta = gdal.dataset.getMetadata_Dict + dateFromMetadata(meta) + } override def cellType: CellType = gdal.cellType @@ -239,7 +250,7 @@ object RasterSource extends LazyLogging { override def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = { - callback.foreach { cb ⇒ + callback.foreach { cb => val grid = rasterExtent.gridBoundsFor(extent, clamp = false) cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) } @@ -253,7 +264,7 @@ object RasterSource extends LazyLogging { override def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { val grid = gdal.gridBounds - callback.foreach { cb ⇒ + callback.foreach { cb => cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) } @@ -266,7 +277,12 @@ object RasterSource extends LazyLogging { } override def nativeLayout: Option[TileLayout] = { - Some(TileLayout(cols / MAX_SIZE + 1, rows / MAX_SIZE + 1, math.min(cols, MAX_SIZE), math.min(rows, MAX_SIZE))) + Some( + TileLayout( + cols / MAX_SIZE + 1, + rows / MAX_SIZE + 1, + math.min(cols, MAX_SIZE), + math.min(rows, MAX_SIZE))) } } @@ -281,13 +297,13 @@ object RasterSource extends LazyLogging { private def realInfo = GeoTiffReader.readGeoTiffInfo(rangeReader, streaming = true, withOverviews = false) - private lazy val tiffInfo = SimpleGeoTiffInfo(realInfo) + protected lazy val tiffInfo = SimpleGeoTiffInfo(realInfo) def crs: CRS = tiffInfo.crs def extent: Extent = tiffInfo.extent - def timestamp: Option[ZonedDateTime] = resolveDate + def timestamp: Option[ZonedDateTime] = dateFromMetadata(tiffInfo.tags.headTags) override def cols: Int = tiffInfo.rasterExtent.cols @@ -305,16 +321,6 @@ object RasterSource extends LazyLogging { else None } - // TODO: Determine if this is the correct way to handle time. - protected def resolveDate: Option[ZonedDateTime] = { - tiffInfo.tags.headTags - .get(Tags.TIFFTAG_DATETIME) - .flatMap(ds ⇒ Try({ - logger.debug("Parsing header date: " + ds) - ZonedDateTime.parse(ds, dateFormat) - }).toOption) - } - def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = { val info = realInfo if (bandCount == 1) { @@ -328,8 +334,7 @@ object RasterSource extends LazyLogging { List.empty ) Left(gt.crop(extent).raster) - } - else { + } else { val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) val gt = new MultibandGeoTiff( geoTiffTile, @@ -353,18 +358,17 @@ object RasterSource extends LazyLogging { if (info.bandCount == 1) { val geotile = GeoTiffReader.geoTiffSinglebandTile(info) - val rows = windows.map(gb ⇒ { + val rows = windows.map(gb => { val tile = geotile.crop(gb) val extent = re.extentFor(gb, clamp = false) Raster(tile, extent) }) Left(rows.toSeq) - } - else { + } else { val geotile = GeoTiffReader.geoTiffMultibandTile(info) - val rows = windows.map(gb ⇒ { + val rows = windows.map(gb => { val tile = geotile.crop(gb) val extent = re.extentFor(gb, clamp = false) Raster(tile, extent) @@ -375,57 +379,73 @@ object RasterSource extends LazyLogging { } } - case class FileGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) extends RangeReaderRasterSource - with URIRasterSource with URIRasterSourceDebugString { self ⇒ + case class FileGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) + extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient protected lazy val rangeReader = { val base = FileRangeReader(source.getPath) // TODO: DRY - callback.map(cb ⇒ ReportingRangeReader(base, cb, self)).getOrElse(base) + callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) } } - case class HadoopGeoTiffRasterSource(source: URI, config: () ⇒ Configuration, callback: Option[ReadCallback]) extends RangeReaderRasterSource - with URIRasterSource with URIRasterSourceDebugString { self ⇒ + case class HadoopGeoTiffRasterSource( + source: URI, + config: () => Configuration, + callback: Option[ReadCallback]) + extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient protected lazy val rangeReader = { val base = HdfsRangeReader(new Path(source.getPath), config()) - callback.map(cb ⇒ ReportingRangeReader(base, cb, self)).getOrElse(base) + callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) } } - case class S3GeoTiffRasterSource(source: URI, client: () ⇒ S3Client, callback: Option[ReadCallback]) extends RangeReaderRasterSource - with URIRasterSource with URIRasterSourceDebugString { self ⇒ + case class S3GeoTiffRasterSource( + source: URI, + client: () => S3Client, + callback: Option[ReadCallback]) + extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient protected lazy val rangeReader = { val base = S3RangeReader(source, client()) - callback.map(cb ⇒ ReportingRangeReader(base, cb, self)).getOrElse(base) + callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) } } - case class HttpGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) extends RangeReaderRasterSource - with URIRasterSource with URIRasterSourceDebugString { self ⇒ + case class HttpGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) + extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient protected lazy val rangeReader = { val base = HttpRangeReader(source) - callback.map(cb ⇒ ReportingRangeReader(base, cb, self)).getOrElse(base) + callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) } - override protected def resolveDate: Option[ZonedDateTime] = { - super.resolveDate + override def timestamp: Option[ZonedDateTime] = + dateFromMetadata(tiffInfo.tags.headTags) .orElse { val hrr = rangeReader match { - case h: HttpRangeReader ⇒ h - case ReportingRangeReader(h: HttpRangeReader, _, _) ⇒ h + case h: HttpRangeReader => h + case ReportingRangeReader(h: HttpRangeReader, _, _) => h } - hrr.response.headers.get("Last-Modified") + hrr.response.headers + .get("Last-Modified") .flatMap(_.headOption) - .flatMap(s ⇒ Try(ZonedDateTime.parse(s, DateTimeFormatter.RFC_1123_DATE_TIME)).toOption) + .flatMap(s => + Try(ZonedDateTime.parse(s, DateTimeFormatter.RFC_1123_DATE_TIME)).toOption) } - } } + private[ref] def dateFromMetadata(meta: Map[String, String]): Option[ZonedDateTime] = + meta + .get(Tags.TIFFTAG_DATETIME) + .flatMap(ds => + Try({ + logger.debug("Parsing header date: " + ds) + ZonedDateTime.parse(ds, dateFormat) + }).toOption) + /** Trait for registering a callback for logging or monitoring range reads. * NB: the callback will be invoked from within a Spark task, and therefore * is serialized along with its closure to executors. */ @@ -433,7 +453,11 @@ object RasterSource extends LazyLogging { def readRange(source: RasterSource, start: Long, length: Int): Unit } - private case class ReportingRangeReader(delegate: RangeReader, callback: ReadCallback, parent: RasterSource) extends RangeReader { + private case class ReportingRangeReader( + delegate: RangeReader, + callback: ReadCallback, + parent: RasterSource) + extends RangeReader { override def totalLength: Long = delegate.totalLength override protected def readClippedRange(start: Long, length: Int): Array[Byte] = { @@ -442,8 +466,7 @@ object RasterSource extends LazyLogging { } } - trait URIRasterSourceDebugString { - _: RangeReaderRasterSource with URIRasterSource with Product ⇒ + trait URIRasterSourceDebugString { _: RangeReaderRasterSource with URIRasterSource with Product => def toDebugString: String = { val buf = new StringBuilder() buf.append(productPrefix) @@ -464,5 +487,4 @@ object RasterSource extends LazyLogging { buf.toString } } - -} \ No newline at end of file +} From fd1e557b8f5dbdaaa718943a7e19ab2722e24b0a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 13 Mar 2019 14:51:35 -0400 Subject: [PATCH 010/380] Updated geotrellis contrib version. --- core/build.sbt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/build.sbt b/core/build.sbt index 830ec2d2f..d65a95cab 100644 --- a/core/build.sbt +++ b/core/build.sbt @@ -2,11 +2,13 @@ enablePlugins(BuildInfoPlugin) moduleName := "rasterframes" +resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis" + libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.3.2", "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.7.4-local.1", + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.9.0", spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, From abd1ac4c287460f59fdd9db2a3700c3fb42bd84a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 13 Mar 2019 16:36:09 -0400 Subject: [PATCH 011/380] Bunch of sbt build cleanup. --- .circleci/config.yml | 1 + build.sbt | 64 ++++++++- core/build.sbt | 37 ------ .../extensions/RasterFrameMethods.scala | 4 +- .../spark/rasterframes/ref/RasterSource.scala | 1 + .../spark/rasterframes/util/package.scala | 3 +- datasource/build.sbt | 35 ----- docs/build.sbt | 1 - experimental/build.sbt | 12 -- project/RFAssemblyPlugin.scala | 56 ++++++++ ...jectPlugin.scala => RFProjectPlugin.scala} | 124 ++++-------------- project/RFReleasePlugin.scala | 71 ++++++++++ project/plugins.sbt | 14 +- project/project/plugins.sbt | 1 + 14 files changed, 228 insertions(+), 196 deletions(-) delete mode 100644 core/build.sbt delete mode 100644 datasource/build.sbt delete mode 100644 experimental/build.sbt create mode 100644 project/RFAssemblyPlugin.scala rename project/{ProjectPlugin.scala => RFProjectPlugin.scala} (51%) create mode 100644 project/RFReleasePlugin.scala create mode 100644 project/project/plugins.sbt diff --git a/.circleci/config.yml b/.circleci/config.yml index 32e5a1e18..fe3a6f3fc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -25,6 +25,7 @@ _restore_cache: &restore_cache _save_cache: &save_cache key: v2-dependencies--{{ checksum "build.sbt" }} paths: + - ~/.cache/coursier - ~/.ivy2/cache - ~/.sbt - ~/.rf_cache diff --git a/build.sbt b/build.sbt index 05aed4e8d..ba8885577 100644 --- a/build.sbt +++ b/build.sbt @@ -1,3 +1,4 @@ +import sbt.Keys.resolvers addCommandAlias("makeSite", "docs/makeSite") addCommandAlias("console", "datasource/console") @@ -5,8 +6,8 @@ lazy val root = project .in(file(".")) .withId("RasterFrames") .aggregate(core, datasource, pyrasterframes, experimental) + .enablePlugins(RFReleasePlugin) .settings(publish / skip := true) - .settings(releaseSettings) lazy val deployment = project .dependsOn(root) @@ -15,18 +16,65 @@ lazy val deployment = project lazy val IntegrationTest = config("it") extend Test lazy val core = project + .enablePlugins(BuildInfoPlugin) .configs(IntegrationTest) .settings(inConfig(IntegrationTest)(Defaults.testSettings)) .settings(Defaults.itSettings) .disablePlugins(SparkPackagePlugin) + .settings( + moduleName := "rasterframes", + resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis", + libraryDependencies ++= Seq( + "com.chuusai" %% "shapeless" % "2.3.2", + "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, + "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), + //"com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.9.0", + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.7.4-local.1", + spark("core").value % Provided, + spark("mllib").value % Provided, + spark("sql").value % Provided, + geotrellis("spark").value, + geotrellis("raster").value, + geotrellis("s3").value, + geotrellis("spark-testkit").value % Test excludeAll ( + ExclusionRule(organization = "org.scalastic"), + ExclusionRule(organization = "org.scalatest") + ), + scalaTest + ), + + buildInfoKeys ++= Seq[BuildInfoKey]( + name, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion + ), + buildInfoPackage := "astraea.spark.rasterframes", + buildInfoObject := "RFBuildInfo", + buildInfoOptions := Seq( + BuildInfoOption.ToMap, + BuildInfoOption.BuildTime + ) + ) lazy val pyrasterframes = project .dependsOn(core, datasource, experimental) - .settings(assemblySettings) + .enablePlugins(RFAssemblyPlugin) lazy val datasource = project .dependsOn(core % "test->test;compile->compile") .disablePlugins(SparkPackagePlugin) + .settings( + moduleName := "rasterframes-datasource", + libraryDependencies ++= Seq( + geotrellis("s3").value, + spark("core").value % Provided, + spark("mllib").value % Provided, + spark("sql").value % Provided + ), + initialCommands in console := (initialCommands in console).value + + """ + |import astraea.spark.rasterframes.datasource.geotrellis._ + |import astraea.spark.rasterframes.datasource.geotiff._ + |""".stripMargin + ) lazy val experimental = project .configs(IntegrationTest) @@ -34,6 +82,18 @@ lazy val experimental = project .dependsOn(core % "test->test;it->test;compile->compile") .dependsOn(datasource % "test->test;it->test;compile->compile") .disablePlugins(SparkPackagePlugin) + .settings( + moduleName := "rasterframes-experimental", + libraryDependencies ++= Seq( + geotrellis("s3").value, + spark("core").value % Provided, + spark("mllib").value % Provided, + spark("sql").value % Provided + ), + fork in IntegrationTest := true, + javaOptions in IntegrationTest := Seq("-Xmx2G"), + parallelExecution in IntegrationTest := false + ) lazy val docs = project .dependsOn(core, datasource) diff --git a/core/build.sbt b/core/build.sbt deleted file mode 100644 index d65a95cab..000000000 --- a/core/build.sbt +++ /dev/null @@ -1,37 +0,0 @@ -enablePlugins(BuildInfoPlugin) - -moduleName := "rasterframes" - -resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis" - -libraryDependencies ++= Seq( - "com.chuusai" %% "shapeless" % "2.3.2", - "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, - "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.9.0", - spark("core").value % Provided, - spark("mllib").value % Provided, - spark("sql").value % Provided, - geotrellis("spark").value, - geotrellis("raster").value, - geotrellis("s3").value, - geotrellis("spark-testkit").value % Test excludeAll ( - ExclusionRule(organization = "org.scalastic"), - ExclusionRule(organization = "org.scalatest") - ), - scalaTest -) - -buildInfoKeys ++= Seq[BuildInfoKey]( - name, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion -) - -buildInfoPackage := "astraea.spark.rasterframes" - -buildInfoObject := "RFBuildInfo" - -buildInfoOptions := Seq( - BuildInfoOption.ToMap, - BuildInfoOption.BuildTime -) - diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala index e83e55fd3..7e0130010 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala @@ -26,7 +26,7 @@ import geotrellis.raster.{MultibandTile, ProjectedRaster, Tile, TileLayout} import geotrellis.spark._ import geotrellis.spark.io._ import geotrellis.spark.tiling.{LayoutDefinition, Tiler} -import geotrellis.util.{LazyLogging, MethodExtensions} +import geotrellis.util.MethodExtensions import geotrellis.vector.ProjectedExtent import org.apache.spark.annotation.Experimental import org.apache.spark.sql._ @@ -35,6 +35,8 @@ import org.apache.spark.sql.types.{Metadata, TimestampType} import spray.json._ import astraea.spark.rasterframes.encoders.StandardEncoders._ import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import com.typesafe.scalalogging.LazyLogging + import scala.reflect.runtime.universe._ /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index e4cf4c4a1..b3cb72757 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -284,6 +284,7 @@ object RasterSource extends LazyLogging { math.min(cols, MAX_SIZE), math.min(rows, MAX_SIZE))) } + override def tags: Option[Tags] = Some(Tags(gdal.dataset.getMetadata_Dict, List.empty)) } object GDALRasterSource { diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala b/core/src/main/scala/astraea/spark/rasterframes/util/package.scala index 02a365cea..0581342e1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/package.scala @@ -19,6 +19,7 @@ package astraea.spark.rasterframes +import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.raster import geotrellis.raster.{CellGrid, Tile, isNoData} @@ -30,7 +31,7 @@ import geotrellis.raster.merge.TileMergeMethods import geotrellis.raster.prototype.TilePrototypeMethods import geotrellis.spark.Bounds import geotrellis.spark.tiling.TilerKeyMethods -import geotrellis.util.{ByteReader, GetComponent, LazyLogging} +import geotrellis.util.{ByteReader, GetComponent} import org.apache.spark.sql.catalyst.expressions.{Expression, NamedExpression} import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.catalyst.rules.Rule diff --git a/datasource/build.sbt b/datasource/build.sbt deleted file mode 100644 index b42fe3d3f..000000000 --- a/datasource/build.sbt +++ /dev/null @@ -1,35 +0,0 @@ -moduleName := "rasterframes-datasource" - -libraryDependencies ++= Seq( - geotrellis("s3").value, - spark("core").value % Provided, - spark("mllib").value % Provided, - spark("sql").value % Provided -) - -initialCommands in console := """ - |import astraea.spark.rasterframes._ - |import geotrellis.raster._ - |import geotrellis.spark.io.kryo.KryoRegistrator - |import org.apache.spark.serializer.KryoSerializer - |import org.apache.spark.sql._ - |import org.apache.spark.sql.functions._ - |import astraea.spark.rasterframes.datasource.geotrellis._ - |import astraea.spark.rasterframes.datasource.geotiff._ - |implicit val spark = SparkSession.builder() - | .master("local[*]") - | .appName(getClass.getName) - | .config("spark.serializer", classOf[KryoSerializer].getName) - | .config("spark.kryoserializer.buffer.max", "500m") - | .config("spark.kryo.registrationRequired", "false") - | .config("spark.kryo.registrator", classOf[KryoRegistrator].getName) - | .getOrCreate() - | .withRasterFrames - |spark.sparkContext.setLogLevel("ERROR") - |import spark.implicits._ - | - |""".stripMargin - -cleanupCommands in console := """ - |spark.stop() - |""".stripMargin \ No newline at end of file diff --git a/docs/build.sbt b/docs/build.sbt index 3025e7c75..d7bb66c61 100644 --- a/docs/build.sbt +++ b/docs/build.sbt @@ -9,7 +9,6 @@ libraryDependencies ++= Seq( spark("sql").value % Tut ) -git.remoteRepo := "git@github.com:locationtech/rasterframes.git" apiURL := Some(url("http://rasterframes.io/latest/api")) autoAPIMappings := true ghpagesNoJekyll := true diff --git a/experimental/build.sbt b/experimental/build.sbt deleted file mode 100644 index 2b5168fbc..000000000 --- a/experimental/build.sbt +++ /dev/null @@ -1,12 +0,0 @@ -moduleName := "rasterframes-experimental" - -libraryDependencies ++= Seq( - geotrellis("s3").value, - spark("core").value % Provided, - spark("mllib").value % Provided, - spark("sql").value % Provided -) - -fork in IntegrationTest := true -javaOptions in IntegrationTest := Seq("-Xmx2G") -parallelExecution in IntegrationTest := false diff --git a/project/RFAssemblyPlugin.scala b/project/RFAssemblyPlugin.scala new file mode 100644 index 000000000..d3fce3c68 --- /dev/null +++ b/project/RFAssemblyPlugin.scala @@ -0,0 +1,56 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +import sbt.Keys._ +import sbt._ +import sbtassembly.AssemblyPlugin.autoImport._ + +object RFAssemblyPlugin extends AutoPlugin { + override def trigger: PluginTrigger = noTrigger + override def projectSettings = Seq( + test in assembly := {}, + assemblyMergeStrategy in assembly := { + case "logback.xml" ⇒ MergeStrategy.singleOrError + case "git.properties" ⇒ MergeStrategy.discard + case x if Assembly.isConfigFile(x) ⇒ MergeStrategy.concat + case PathList(ps @ _*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) ⇒ + MergeStrategy.rename + case PathList("META-INF", xs @ _*) ⇒ + xs map {_.toLowerCase} match { + case "manifest.mf" :: Nil | "index.list" :: Nil | "dependencies" :: Nil ⇒ + MergeStrategy.discard + case ps @ x :: _ if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") ⇒ + MergeStrategy.discard + case "plexus" :: _ ⇒ + MergeStrategy.discard + case "services" :: _ ⇒ + MergeStrategy.filterDistinctLines + case "spring.schemas" :: Nil | "spring.handlers" :: Nil ⇒ + MergeStrategy.filterDistinctLines + case "maven" :: rest if rest.lastOption.exists(_.startsWith("pom")) ⇒ + MergeStrategy.discard + case _ ⇒ MergeStrategy.deduplicate + } + + case _ ⇒ MergeStrategy.deduplicate + } + ) +} diff --git a/project/ProjectPlugin.scala b/project/RFProjectPlugin.scala similarity index 51% rename from project/ProjectPlugin.scala rename to project/RFProjectPlugin.scala index 4f575edb2..5388e5518 100644 --- a/project/ProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -1,32 +1,44 @@ +import com.typesafe.sbt.{GitPlugin, SbtGit} +import com.typesafe.sbt.SbtGit.git import sbt.Keys._ import sbt._ -import sbtassembly.AssemblyKeys.assembly -import sbtassembly.AssemblyPlugin.autoImport._ -import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations._ -import sbtrelease.ReleasePlugin.autoImport._ - -import com.servicerocket.sbt.release.git.flow.Steps._ -import com.typesafe.sbt.sbtghpages.GhpagesPlugin.autoImport._ -import com.typesafe.sbt.site.SitePlugin.autoImport._ import xerial.sbt.Sonatype.autoImport._ /** * @since 8/20/17 */ -object ProjectPlugin extends AutoPlugin { +object RFProjectPlugin extends AutoPlugin { override def trigger: PluginTrigger = allRequirements + override def requires = GitPlugin + object autoImport { + val rfSparkVersion = settingKey[String]("Apache Spark version") + val rfGeoTrellisVersion = settingKey[String]("GeoTrellis version") + val rfGeoMesaVersion = settingKey[String]("GeoMesa version") + + def geotrellis(module: String) = Def.setting { + "org.locationtech.geotrellis" %% s"geotrellis-$module" % rfGeoTrellisVersion.value + } + def spark(module: String) = Def.setting { + "org.apache.spark" %% s"spark-$module" % rfSparkVersion.value + } + + val scalaTest = "org.scalatest" %% "scalatest" % "3.0.3" % Test + } import autoImport._ override def projectSettings = Seq( organization := "org.locationtech.rasterframes", - //organization := "io.astraea", organizationName := "LocationTech RasterFrames", startYear := Some(2017), homepage := Some(url("http://rasterframes.io")), + git.remoteRepo := "git@github.com:locationtech/rasterframes.git", scmInfo := Some(ScmInfo(url("https://github.com/locationtech/rasterframes"), "git@github.com:locationtech/rasterframes.git")), description := "RasterFrames brings the power of Spark DataFrames to geospatial raster data, empowered by the map algebra and tile layer operations of GeoTrellis", licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html")), scalaVersion := "2.11.12", + rfSparkVersion in ThisBuild := "2.3.2" , + rfGeoTrellisVersion in ThisBuild := "2.1.0", + rfGeoMesaVersion in ThisBuild := "2.1.1", scalacOptions ++= Seq("-feature", "-deprecation"), scalacOptions in (Compile, doc) ++= Seq("-no-link-warnings"), javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), @@ -37,9 +49,6 @@ object ProjectPlugin extends AutoPlugin { "Open Source Geospatial Foundation Repository" at "http://download.osgeo.org/webdav/geotools/" ), // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py - rfSparkVersion in ThisBuild := "2.3.2" , - rfGeoTrellisVersion in ThisBuild := "2.1.0", - rfGeoMesaVersion in ThisBuild := "2.1.0", publishTo := sonatypePublishTo.value, publishMavenStyle := true, publishArtifact in (Compile, packageDoc) := true, @@ -82,89 +91,14 @@ object ProjectPlugin extends AutoPlugin { |import geotrellis.raster._ |import geotrellis.spark._ |import astraea.spark.rasterframes._ - |implicit val spark = SparkSession.builder().master("local[*]").getOrCreate().withRasterFrames + |implicit val spark = SparkSession.builder() + | .master("local[*]") + | .withKryoSerialization + | .getOrCreate() + | .withRasterFrames + |spark.sparkContext.setLogLevel("ERROR") + |import spark.implicits._ """.stripMargin.trim, cleanupCommands in console := "spark.stop()" ) - - object autoImport { - val rfSparkVersion = settingKey[String]("Apache Spark version") - val rfGeoTrellisVersion = settingKey[String]("GeoTrellis version") - val rfGeoMesaVersion = settingKey[String]("GeoMesa version") - - def geotrellis(module: String) = Def.setting { - "org.locationtech.geotrellis" %% s"geotrellis-$module" % rfGeoTrellisVersion.value - } - def spark(module: String) = Def.setting { - "org.apache.spark" %% s"spark-$module" % rfSparkVersion.value - } - - val scalaTest = "org.scalatest" %% "scalatest" % "3.0.3" % Test - - def assemblySettings: Seq[Def.Setting[_]] = Seq( - test in assembly := {}, - assemblyMergeStrategy in assembly := { - case "logback.xml" ⇒ MergeStrategy.singleOrError - case "git.properties" ⇒ MergeStrategy.discard - case x if Assembly.isConfigFile(x) ⇒ MergeStrategy.concat - case PathList(ps @ _*) if Assembly.isReadme(ps.last) || Assembly.isLicenseFile(ps.last) ⇒ - MergeStrategy.rename - case PathList("META-INF", xs @ _*) ⇒ - xs map {_.toLowerCase} match { - case "manifest.mf" :: Nil | "index.list" :: Nil | "dependencies" :: Nil ⇒ - MergeStrategy.discard - case ps @ _ :: _ if ps.last.endsWith(".sf") || ps.last.endsWith(".dsa") ⇒ - MergeStrategy.discard - case "plexus" :: _ ⇒ - MergeStrategy.discard - case "services" :: _ ⇒ - MergeStrategy.filterDistinctLines - case "spring.schemas" :: Nil | "spring.handlers" :: Nil ⇒ - MergeStrategy.filterDistinctLines - case "maven" :: rest if rest.lastOption.exists(_.startsWith("pom")) ⇒ - MergeStrategy.discard - case _ ⇒ MergeStrategy.deduplicate - } - - case _ ⇒ MergeStrategy.deduplicate - } - ) - - def releaseSettings: Seq[Def.Setting[_]] = { - val buildSite: State ⇒ State = releaseStepTask(makeSite in LocalProject("docs")) - val publishSite: State ⇒ State = releaseStepTask(ghpagesPushSite in LocalProject("docs")) - Seq( - releaseIgnoreUntrackedFiles := true, - releaseTagName := s"${version.value}", - releaseProcess := Seq[ReleaseStep]( - checkSnapshotDependencies, - checkGitFlowExists, - inquireVersions, - runTest, - gitFlowReleaseStart, - setReleaseVersion, - buildSite, - publishSite, - commitReleaseVersion, - tagRelease, - releaseStepCommand("publishSigned"), - releaseStepCommand("sonatypeReleaseAll"), - gitFlowReleaseFinish, - setNextVersion, - commitNextVersion - ), - commands += Command.command("bumpVersion"){ st ⇒ - val extracted = Project.extract(st) - val ver = extracted.get(version) - val nextFun = extracted.runTask(releaseNextVersion, st)._2 - - val nextVersion = nextFun(ver) - - val file = extracted.get(releaseVersionFile) - IO.writeLines(file, Seq(s"""version in ThisBuild := "$nextVersion"""")) - extracted.appendWithSession(Seq(version := nextVersion), st) - } - ) - } - } } diff --git a/project/RFReleasePlugin.scala b/project/RFReleasePlugin.scala new file mode 100644 index 000000000..8d439927b --- /dev/null +++ b/project/RFReleasePlugin.scala @@ -0,0 +1,71 @@ + +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +import sbt.Keys._ +import sbt._ +import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations._ +import sbtrelease.ReleasePlugin.autoImport._ +import com.servicerocket.sbt.release.git.flow.Steps._ +import com.typesafe.sbt.sbtghpages.GhpagesPlugin +import com.typesafe.sbt.sbtghpages.GhpagesPlugin.autoImport.ghpagesPushSite +import com.typesafe.sbt.site.SitePlugin +import com.typesafe.sbt.site.SitePlugin.autoImport.makeSite +object RFReleasePlugin extends AutoPlugin { + override def trigger: PluginTrigger = noTrigger + override def requires = RFProjectPlugin && SitePlugin && GhpagesPlugin + override def projectSettings = { + val buildSite: State ⇒ State = releaseStepTask(makeSite in LocalProject("docs")) + val publishSite: State ⇒ State = releaseStepTask(ghpagesPushSite in LocalProject("docs")) + Seq( + releaseIgnoreUntrackedFiles := true, + releaseTagName := s"${version.value}", + releaseProcess := Seq[ReleaseStep]( + checkSnapshotDependencies, + checkGitFlowExists, + inquireVersions, + runTest, + gitFlowReleaseStart, + setReleaseVersion, + buildSite, + publishSite, + commitReleaseVersion, + tagRelease, + releaseStepCommand("publishSigned"), + releaseStepCommand("sonatypeReleaseAll"), + gitFlowReleaseFinish, + setNextVersion, + commitNextVersion + ), + commands += Command.command("bumpVersion"){ st ⇒ + val extracted = Project.extract(st) + val ver = extracted.get(version) + val nextFun = extracted.runTask(releaseNextVersion, st)._2 + + val nextVersion = nextFun(ver) + + val file = extracted.get(releaseVersionFile) + IO.writeLines(file, Seq(s"""version in ThisBuild := "$nextVersion"""")) + extracted.appendWithSession(Seq(version := nextVersion), st) + } + ) + } +} diff --git a/project/plugins.sbt b/project/plugins.sbt index a3fd9b0e9..5aa78c4dc 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,30 +1,20 @@ logLevel := sbt.Level.Error resolvers += Resolver.bintrayIvyRepo("s22s", "sbt-plugins") - +//addSbtCoursier addSbtPlugin("com.servicerocket" % "sbt-git-flow" % "0.1.3-astraea.1") - addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") - addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0") - addSbtPlugin("de.heikoseeberger" % "sbt-header" % "3.0.2") - addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.6.10") - addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.2") - addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.3.2") addSbtPlugin("com.lightbend.paradox" % "sbt-paradox" % "0.5.0") - addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.4") - addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.1") - addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") - addSbtPlugin("org.spark-packages" % "sbt-spark-package" % "0.2.7-astraea.1") - addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.1") addSbtPlugin("net.vonbuchholtz" % "sbt-dependency-check" % "0.2.10") + diff --git a/project/project/plugins.sbt b/project/project/plugins.sbt new file mode 100644 index 000000000..9c5ecac47 --- /dev/null +++ b/project/project/plugins.sbt @@ -0,0 +1 @@ +addSbtPlugin("io.get-coursier" % "sbt-coursier" % "1.1.0-M11") \ No newline at end of file From 6768790178042fdc694a4f3c5274e00f9bfcdd16 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 14 Mar 2019 13:16:36 -0400 Subject: [PATCH 012/380] Upgraded multiple base libraries: * GeoTrellis 2.2.0 * GeoMesa 2.2.1 * JTS 1.16.0 --- build.sbt | 12 +- .../spark/rasterframes/RasterFunctions.scala | 2 +- .../spark/rasterframes/StandardColumns.scala | 2 +- .../encoders/EnvelopeEncoder.scala | 2 +- .../encoders/StandardEncoders.scala | 2 +- .../encoders/StandardSerializers.scala | 2 +- .../expressions/SpatialRelation.scala | 2 +- .../expressions/accessors/GetEnvelope.scala | 2 +- .../transformers/BoundsToGeometry.scala | 2 +- .../transformers/ReprojectGeometry.scala | 2 +- .../extensions/ProjectedRasterMethods.scala | 4 +- .../extensions/RFSpatialColumnMethods.scala | 2 +- .../rasterframes/functions/package.scala | 2 +- .../spark/rasterframes/jts/Implicits.scala | 2 +- .../jts/ReprojectionTransformer.scala | 4 +- .../rasterframes/ref/HttpRangeReader.scala | 4 +- .../spark/rasterframes/ref/RasterSource.scala | 28 +++- .../rasterframes/rules/SpatialFilters.scala | 2 +- .../util/ZeroSevenCompatibilityKit.scala | 2 +- .../astraea/spark/rasterframes/JTSSpec.scala | 2 +- .../rasterframes/ReprojectGeometrySpec.scala | 2 +- .../spark/rasterframes/SpatialKeySpec.scala | 2 +- .../astraea/spark/rasterframes/TestData.scala | 2 +- .../spark/rasterframes/TestEnvironment.scala | 4 +- .../encoders/CatalystSerializerSpec.scala | 2 +- .../rasterframes/encoders/EncodingSpec.scala | 2 +- .../datasource/geotiff/GeoTiffRelation.scala | 1 + .../geotrellis/GeoTrellisRelation.scala | 7 +- docs/src/main/tut/release-notes.md | 7 +- .../datasource/ReadTilesExpression.scala | 2 +- .../datasource/awspds/L8CatalogRelation.scala | 2 +- .../experimental/datasource/geojson/DOM.scala | 4 +- .../geojson/GeoJsonDataSource.scala | 2 +- .../experimental/slippy/SlippyExport.scala | 157 ------------------ project/RFProjectPlugin.scala | 5 - project/plugins.sbt | 2 +- .../spark/rasterframes/py/PyRFContext.scala | 6 +- 37 files changed, 80 insertions(+), 211 deletions(-) delete mode 100644 experimental/src/main/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExport.scala diff --git a/build.sbt b/build.sbt index ba8885577..09e9d4dae 100644 --- a/build.sbt +++ b/build.sbt @@ -2,6 +2,11 @@ import sbt.Keys.resolvers addCommandAlias("makeSite", "docs/makeSite") addCommandAlias("console", "datasource/console") +// NB: Make sure to update the Spark version in pyrasterframes/python/setup.py +rfSparkVersion in ThisBuild := "2.3.2" +rfGeoTrellisVersion in ThisBuild := "2.2.0" +rfGeoMesaVersion in ThisBuild := "2.2.1" + lazy val root = project .in(file(".")) .withId("RasterFrames") @@ -26,10 +31,10 @@ lazy val core = project resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis", libraryDependencies ++= Seq( "com.chuusai" %% "shapeless" % "2.3.2", + "org.locationtech.jts" % "jts-core" % "1.16.0", "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - //"com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.9.0", - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.7.4-local.1", + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.9.0", spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, @@ -42,7 +47,6 @@ lazy val core = project ), scalaTest ), - buildInfoKeys ++= Seq[BuildInfoKey]( name, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion ), @@ -69,7 +73,7 @@ lazy val datasource = project spark("mllib").value % Provided, spark("sql").value % Provided ), - initialCommands in console := (initialCommands in console).value + + initialCommands in console := (initialCommands in console).value + """ |import astraea.spark.rasterframes.datasource.geotrellis._ |import astraea.spark.rasterframes.datasource.geotiff._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala index ff08dd44c..906f2a38d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala @@ -28,7 +28,7 @@ import astraea.spark.rasterframes.expressions.tilestats._ import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics} import astraea.spark.rasterframes.{functions => F} -import com.vividsolutions.jts.geom.{Envelope, Geometry} +import org.locationtech.jts.geom.{Envelope, Geometry} import geotrellis.proj4.CRS import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import geotrellis.raster.{CellType, Tile} diff --git a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala index 340b17198..d08df5d3c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala @@ -5,7 +5,7 @@ import java.sql.Timestamp import geotrellis.raster.{Tile, TileFeature} import geotrellis.spark.{SpatialKey, TemporalKey} import org.apache.spark.sql.functions.col -import com.vividsolutions.jts.geom.{Point => jtsPoint, Polygon => jtsPolygon} +import org.locationtech.jts.geom.{Point => jtsPoint, Polygon => jtsPolygon} import geotrellis.proj4.CRS import geotrellis.vector.Extent import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala index 5888a1974..e8f168db5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala @@ -1,6 +1,6 @@ package astraea.spark.rasterframes.encoders -import com.vividsolutions.jts.geom.Envelope +import org.locationtech.jts.geom.Envelope import org.apache.spark.sql.catalyst.ScalaReflection import org.apache.spark.sql.catalyst.analysis.GetColumnByOrdinal import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala index 625eea1cd..d0a11ab78 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala @@ -24,7 +24,7 @@ import java.sql.Timestamp import astraea.spark.rasterframes.model._ import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics, LocalCellStatistics} -import com.vividsolutions.jts.geom.Envelope +import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS import geotrellis.raster.{CellSize, CellType, Tile, TileLayout} import geotrellis.spark.tiling.LayoutDefinition diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala index aaff5c534..11a236b10 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala @@ -22,7 +22,7 @@ package astraea.spark.rasterframes.encoders import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO import astraea.spark.rasterframes.util.CRSParser -import com.vividsolutions.jts.geom.Envelope +import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.spark._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala index e994c8a64..18f93dd87 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala @@ -20,7 +20,7 @@ package astraea.spark.rasterframes.expressions import astraea.spark.rasterframes.expressions.SpatialRelation.RelationPredicate -import com.vividsolutions.jts.geom._ +import org.locationtech.jts.geom._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala index 551f64eb0..b082f14b0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala @@ -22,7 +22,7 @@ package astraea.spark.rasterframes.expressions.accessors import astraea.spark.rasterframes.encoders.EnvelopeEncoder -import com.vividsolutions.jts.geom.{Envelope, Geometry} +import org.locationtech.jts.geom.{Envelope, Geometry} import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, UnaryExpression} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala index 9d6a8c652..b928e9971 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala @@ -24,7 +24,7 @@ package astraea.spark.rasterframes.expressions.transformers import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.row -import com.vividsolutions.jts.geom.{Envelope, Geometry} +import org.locationtech.jts.geom.{Envelope, Geometry} import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.analysis.TypeCheckResult import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.{TypeCheckFailure, TypeCheckSuccess} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala index 7e78c5942..6958d2ab8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -25,7 +25,7 @@ import astraea.spark.rasterframes._ import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.encoders.{CatalystSerializer, serialized_literal} import astraea.spark.rasterframes.jts.ReprojectionTransformer -import com.vividsolutions.jts.geom.Geometry +import org.locationtech.jts.geom.Geometry import geotrellis.proj4.CRS import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala index 96709ef10..df1f6a893 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala @@ -92,7 +92,7 @@ abstract class ProjectedRasterMethods[T <: CellGrid: WithMergeMethods: WithProto */ def toTileLayerRDD(tileCols: Int, tileRows: Int)(implicit spark: SparkSession): XTileLayerRDD[SpatialKey] = { - val layout = LayoutDefinition(self.rasterExtent, tileCols, tileRows) + val layout = LayoutDefinition(self.raster.rasterExtent, tileCols, tileRows) val kb = KeyBounds(SpatialKey(0, 0), SpatialKey(layout.layoutCols - 1, layout.layoutRows - 1)) val tlm = TileLayerMetadata(self.tile.cellType, layout, self.extent, self.crs, kb) @@ -115,7 +115,7 @@ abstract class ProjectedRasterMethods[T <: CellGrid: WithMergeMethods: WithProto * @param spark [[SparkSession]] in which to create RDD */ def toTileLayerRDD(tileCols: Int, tileRows: Int, timestamp: ZonedDateTime)(implicit spark: SparkSession): XTileLayerRDD[SpaceTimeKey] = { - val layout = LayoutDefinition(self.rasterExtent, tileCols, tileRows) + val layout = LayoutDefinition(self.raster.rasterExtent, tileCols, tileRows) val kb = KeyBounds(SpaceTimeKey(0, 0, timestamp), SpaceTimeKey(layout.layoutCols - 1, layout.layoutRows - 1, timestamp)) val tlm = TileLayerMetadata(self.tile.cellType, layout, self.extent, self.crs, kb) diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala index af744f5f4..71204c8ec 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.extensions import astraea.spark.rasterframes.util._ import astraea.spark.rasterframes.{RasterFrame, StandardColumns} -import com.vividsolutions.jts.geom.{Point, Polygon} +import org.locationtech.jts.geom.{Point, Polygon} import geotrellis.proj4.LatLng import geotrellis.spark.SpatialKey import geotrellis.spark.tiling.MapKeyTransform diff --git a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala index 060b08fa3..2594a6590 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala @@ -18,7 +18,7 @@ package astraea.spark.rasterframes import astraea.spark.rasterframes.expressions.aggstats._ import astraea.spark.rasterframes.jts.ReprojectionTransformer import astraea.spark.rasterframes.util.CRSParser -import com.vividsolutions.jts.geom.Geometry +import org.locationtech.jts.geom.Geometry import geotrellis.raster.mapalgebra.local._ import geotrellis.raster.{Tile, _} import geotrellis.vector.Extent diff --git a/core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala b/core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala index e257ebfa5..86d4dd73b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala @@ -23,7 +23,7 @@ import java.sql.{Date, Timestamp} import java.time.{LocalDate, ZonedDateTime} import astraea.spark.rasterframes.expressions.SpatialRelation.{Contains, Intersects} -import com.vividsolutions.jts.geom._ +import org.locationtech.jts.geom._ import geotrellis.util.MethodExtensions import geotrellis.vector.{Point ⇒ gtPoint} import org.apache.spark.sql.{Column, TypedColumn} diff --git a/core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala b/core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala index 1d583c739..4946001c8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala @@ -20,8 +20,8 @@ package astraea.spark.rasterframes.jts -import com.vividsolutions.jts.geom.{CoordinateSequence, Geometry} -import com.vividsolutions.jts.geom.util.GeometryTransformer +import org.locationtech.jts.geom.{CoordinateSequence, Geometry} +import org.locationtech.jts.geom.util.GeometryTransformer import geotrellis.proj4.CRS /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala index b0675e8f4..f85f5b398 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala @@ -22,10 +22,12 @@ package astraea.spark.rasterframes.ref -import geotrellis.util.{LazyLogging, RangeReader} +import geotrellis.util.RangeReader import scalaj.http.{Http, HttpResponse} import java.net.{URI, URL} +import com.typesafe.scalalogging.LazyLogging + import scala.util.Try diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index b3cb72757..3f1f662c8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -46,7 +46,7 @@ import org.apache.hadoop.fs.Path import org.apache.spark.annotation.Experimental import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT - +import scala.collection.JavaConverters._ import scala.util.Try /** @@ -148,6 +148,9 @@ object RasterSource extends LazyLogging { case "s3" => val client = () => S3Client.DEFAULT S3GeoTiffRasterSource(source, client, callback) + case s if s.startsWith("gdal+") => + val cleaned = new URI(source.toASCIIString.replace("gdal+", "")) + apply(cleaned, callback) case s => throw new UnsupportedOperationException(s"Scheme '$s' not supported") } @@ -233,11 +236,16 @@ object RasterSource extends LazyLogging { override def extent: Extent = gdal.extent + private def metadata = gdal.dataset + .GetMetadata_Dict() + .asInstanceOf[java.util.Dictionary[String, String]] + .asScala + .toMap + // TODO: See if dates are available in gdal. // Maybe useful: gdal.dataset.getMetadata_Dict override def timestamp: Option[ZonedDateTime] = { - val meta = gdal.dataset.getMetadata_Dict - dateFromMetadata(meta) + dateFromMetadata(metadata) } override def cellType: CellType = gdal.cellType @@ -284,12 +292,22 @@ object RasterSource extends LazyLogging { math.min(cols, MAX_SIZE), math.min(rows, MAX_SIZE))) } - override def tags: Option[Tags] = Some(Tags(gdal.dataset.getMetadata_Dict, List.empty)) + override def tags: Option[Tags] = Some(Tags(metadata, List.empty)) } object GDALRasterSource { final val MAX_SIZE = 256 - def unapply(scheme: String): Boolean = scheme.startsWith("gdal+") + @transient + lazy val hasGDAL: Boolean = try { + org.gdal.gdal.gdal.AllRegister() + true + } + catch { + case _: UnsatisfiedLinkError => + logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader.") + false + } + def unapply(scheme: String): Boolean = scheme.startsWith("gdal+") && hasGDAL } trait RangeReaderRasterSource extends RasterSource with GeoTiffInfoSupport with LazyLogging { diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala b/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala index 1a1128150..e2cae5734 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala @@ -20,7 +20,7 @@ package astraea.spark.rasterframes.rules -import com.vividsolutions.jts.geom.Geometry +import org.locationtech.jts.geom.Geometry import org.apache.spark.sql.sources.Filter /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala index bbb23a282..16d3ba271 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -29,7 +29,7 @@ import astraea.spark.rasterframes.expressions.tilestats._ import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics} import astraea.spark.rasterframes.{functions => F} -import com.vividsolutions.jts.geom.Geometry +import org.locationtech.jts.geom.Geometry import geotrellis.proj4.CRS import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import geotrellis.raster.{CellType, Tile} diff --git a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala index 52def8620..0580e5ba1 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala @@ -19,7 +19,7 @@ package astraea.spark.rasterframes -import com.vividsolutions.jts.geom._ +import org.locationtech.jts.geom._ import geotrellis.proj4.{LatLng, Sinusoidal, WebMercator} import geotrellis.vector.{Point ⇒ GTPoint} diff --git a/core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala index 39ea3b1c1..b1b5b8862 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes -import com.vividsolutions.jts.geom._ +import org.locationtech.jts.geom._ import geotrellis.proj4.{CRS, LatLng, Sinusoidal, WebMercator} import org.apache.spark.sql.Encoders import org.scalatest.{FunSpec, Matchers} diff --git a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala b/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala index 065e9a5ed..900ad1bb4 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala @@ -19,7 +19,7 @@ package astraea.spark.rasterframes -import com.vividsolutions.jts.geom.Polygon +import org.locationtech.jts.geom.Polygon import geotrellis.proj4.LatLng import geotrellis.vector.Point import org.locationtech.geomesa.curve.Z2SFC diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala index db59dfb58..2502857b2 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala @@ -26,7 +26,7 @@ import astraea.spark.rasterframes.expressions.tilestats.NoDataCells import astraea.spark.rasterframes.model.TileContext import astraea.spark.rasterframes.tiles.ProjectedRasterTile import astraea.spark.rasterframes.{functions => F} -import com.vividsolutions.jts.geom.{Coordinate, GeometryFactory} +import org.locationtech.jts.geom.{Coordinate, GeometryFactory} import geotrellis.proj4.{CRS, LatLng} import geotrellis.raster import geotrellis.raster._ diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala b/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala index aaf173014..c8d244be9 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala @@ -23,9 +23,9 @@ import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.st import astraea.spark.rasterframes.ref.RasterSource import astraea.spark.rasterframes.ref.RasterSource.ReadCallback import astraea.spark.rasterframes.util.toParquetFriendlyColumnName -import com.vividsolutions.jts.geom.Geometry +import com.typesafe.scalalogging.LazyLogging +import org.locationtech.jts.geom.Geometry import geotrellis.spark.testkit.{TestEnvironment => GeoTrellisTestEnvironment} -import geotrellis.util.LazyLogging import org.apache.spark.SparkContext import org.apache.spark.sql._ import org.apache.spark.sql.functions.col diff --git a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala index c489b8d7b..934e7687c 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala @@ -29,7 +29,7 @@ import astraea.spark.rasterframes.{TestData, TestEnvironment} import geotrellis.proj4._ import geotrellis.raster.{CellSize, CellType, TileLayout, UShortUserDefinedNoDataCellType} import geotrellis.spark.tiling.LayoutDefinition -import geotrellis.spark.{Bounds, KeyBounds, SpaceTimeKey, SpatialKey, TileLayerMetadata} +import geotrellis.spark.{KeyBounds, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.scalatest.Assertion diff --git a/core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala index a0c0bad0e..4875005ae 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala @@ -26,7 +26,7 @@ import java.net.URI import astraea.spark.rasterframes._ import astraea.spark.rasterframes.tiles.ProjectedRasterTile -import com.vividsolutions.jts.geom.Envelope +import org.locationtech.jts.geom.Envelope import geotrellis.proj4._ import geotrellis.raster.{CellType, Tile, TileFeature} import geotrellis.spark.{SpaceTimeKey, SpatialKey, TemporalProjectedExtent, TileLayerMetadata} diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala index 8503171c8..9deafe69d 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala @@ -24,6 +24,7 @@ import java.net.URI import astraea.spark.rasterframes._ import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.util._ +import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.spark._ import geotrellis.spark.io._ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala index 918f43015..5f5cb6de5 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala @@ -28,18 +28,19 @@ import astraea.spark.rasterframes._ import astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisRelation.{C, TileFeatureData} import astraea.spark.rasterframes.datasource.geotrellis.TileFeatureSupport._ import astraea.spark.rasterframes.rules.splitFilters -import astraea.spark.rasterframes.rules.SpatialFilters.{Contains ⇒ sfContains, Intersects ⇒ sfIntersects} +import astraea.spark.rasterframes.rules.SpatialFilters.{Contains => sfContains, Intersects => sfIntersects} import astraea.spark.rasterframes.rules.SpatialRelationReceiver import astraea.spark.rasterframes.rules.TemporalFilters.{BetweenDates, BetweenTimes} import astraea.spark.rasterframes.util.SubdivideSupport._ import astraea.spark.rasterframes.util._ -import com.vividsolutions.jts.geom +import com.typesafe.scalalogging.LazyLogging +import org.locationtech.jts.geom import geotrellis.raster.{CellGrid, MultibandTile, Tile, TileFeature} import geotrellis.spark.io._ import geotrellis.spark.io.avro.AvroRecordCodec import geotrellis.spark.util.KryoWrapper import geotrellis.spark.{LayerId, Metadata, SpatialKey, TileLayerMetadata, _} -import geotrellis.util.{LazyLogging, _} +import geotrellis.util._ import geotrellis.vector._ import org.apache.avro.Schema import org.apache.avro.generic.GenericRecord diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index c043ac772..4b8738fb1 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -4,12 +4,17 @@ ### 0.8.0 +<<<<<<< HEAD * Added new tile functions `round`, `log`, `log10`, `log2`, `log1p`, `exp`, `exp10`, `exp2`, `expm1`, `resample`, `resample`. +======= +* Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.2.0, GeoMesa 2.2.1, JTS 1.16.0. +* _Breaking_: With the upgrade to JTS 1.16.0, all imports of `com.vividsolutions.jts` need to be changed to `org.locationtech.jts`. +>>>>>>> Upgraded multiple base libraries: * Introduced at the source level the concept of a `RasterSource` and `RasterRef`, enabling lazy/delayed read of sub-scene tiles. * _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. * _Breaking_: In Scala and SQL, `..._scalar` functions (e.g. `local_add_scalar`) have been removed. Non-scalar forms now dynamically detect type of right hand side. -* _Breaking_: `tileToArray` has been replaced with `tile_to_array_double` and `tile_to_array_int`. +* _Breaking_: `tileToArray` has been replaced with `tile_to_array_double` and `tile_to_array_int`. * Added `render_matrix` debugging function. * _Breaking_: renamed `agg_histogram` to `agg_approx_histogram`, `local_agg_stats` to `agg_local_stats`, `local_agg_max` to `agg_local_max`, `local_agg_min` to `agg_local_min`, `local_agg_mean` to `agg_local_mean`, `local_agg_data_cells` to `agg_local_data_cells`, `local_agg_no_data_cells` to `agg_local_no_data_cells`. * _Breaking_: `CellHistogram` no longer carries along approximate statistics, due to confusing behavior. Use `agg_stats` instead. diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala index 1d00be0d5..ac13e4b20 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -146,7 +146,7 @@ case class ReadTilesExpression(children: Seq[Expression]) extends Expression rowMajor.map(row ⇒ { val serializedTiles = row.map { case null ⇒ null - case t ⇒ TileType.serialize(t) + case t ⇒ TileType.serialize(t.tile) } val firstBandExt = row diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala index f5d3796b4..556d47cc4 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.experimental.datasource.awspds import com.typesafe.scalalogging.LazyLogging -import com.vividsolutions.jts.geom.Envelope +import org.locationtech.jts.geom.Envelope import org.apache.hadoop.fs.{Path ⇒ HadoopPath} import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources.{BaseRelation, TableScan} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala index 2dbcb7f0c..c0551c797 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala @@ -20,8 +20,8 @@ package astraea.spark.rasterframes.experimental.datasource.geojson -import com.vividsolutions.jts.geom.{Envelope, Geometry} -import com.vividsolutions.jts.io.geojson.{GeoJsonReader, GeoJsonWriter} +import org.locationtech.jts.geom.{Envelope, Geometry} +import org.locationtech.jts.io.geojson.{GeoJsonReader, GeoJsonWriter} import geotrellis.vector.Extent import spray.json._ import spray.json.DefaultJsonProtocol._ diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala index f042fbd1c..418034147 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.experimental.datasource.geojson import astraea.spark.rasterframes.experimental.datasource.geojson.DOM._ -import com.vividsolutions.jts.geom.Geometry +import org.locationtech.jts.geom.Geometry import org.apache.spark.annotation.Experimental import org.apache.spark.rdd.RDD import org.apache.spark.sql.jts.JTSTypes diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExport.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExport.scala deleted file mode 100644 index 0af839ffa..000000000 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExport.scala +++ /dev/null @@ -1,157 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea. Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * - */ - -package astraea.spark.rasterframes.experimental.slippy - -import java.io.PrintStream -import java.net.URI - -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.util._ -import geotrellis.proj4.{LatLng, WebMercator} -import geotrellis.raster._ -import geotrellis.raster.io.geotiff._ -import geotrellis.raster.io.geotiff.tags.codes.ColorSpace -import geotrellis.raster.resample.Bilinear -import geotrellis.spark._ -import geotrellis.spark.io.slippy.HadoopSlippyTileWriter -import geotrellis.spark.pyramid.Pyramid -import geotrellis.spark.tiling.ZoomedLayoutScheme -import geotrellis.util.MethodExtensions -import org.apache.commons.lang3.text.StrSubstitutor -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.{FileSystem, Path} -import org.apache.spark.annotation.Experimental - -import scala.io.Source - -/** - * Experimental support for exporting a RasterFrame into Slippy map format. - * - * @since 4/10/18 - */ -@Experimental -trait SlippyExport extends MethodExtensions[RasterFrame]{ - /** - * Export GeoTiff tiles in a slippy map directory structure; for debugging purposes only. - * NB: Temporal components are ignored blindly. - */ - @Experimental - def exportGeoTiffTiles(dest: URI): Unit = { - val spark = self.sparkSession - implicit val sc = spark.sparkContext - - val tlm = self.tileLayerMetadata.merge - val crs = tlm.crs - val mapTransform = tlm.mapTransform - - val writer = new HadoopSlippyTileWriter[MultibandTile](dest.toASCIIString, "tiff")({ (key, tile) => - val extent = mapTransform(key) - // If we have exactly 3 columns, we assume RGB color space. - val opts = GeoTiffOptions.DEFAULT - .mapWhen(_ ⇒ tile.bands.lengthCompare(3) == 0, - _.copy(colorSpace = ColorSpace.RGB) - ) - MultibandGeoTiff(tile, extent, crs, opts).toByteArray - }) - - val tlrdd: MultibandTileLayerRDD[SpatialKey] = self.toMultibandTileLayerRDD(self.tileColumns: _*) match { - case Left(spatial) ⇒ spatial - case Right(origRDD) ⇒ - val newBounds = origRDD.metadata.bounds.flatMap[SpatialKey] { - bounds => KeyBounds(bounds.minKey.spatialKey, bounds.maxKey.spatialKey) - } - val newMD = origRDD.metadata.copy(bounds = newBounds) - val rdd = origRDD.map { case (k, v) ⇒ (k.spatialKey, v)} - ContextRDD(rdd, newMD) - } - - writer.write(0, tlrdd) - } - - /** - * Export tiles as a slippy map. For debugging purposes only. - * NB: Temporal components are ignored blindly. - * @param dest URI for Hadoop supported storage endpoint (e.g. 'file://', 'hdfs://', etc.). - * @param colorMap Optional color map to use for rendering tiles in non-RGB RasterFrames. - */ - @Experimental - def exportSlippyMap(dest: URI, renderer: MultibandRender.Profile = MultibandRender.Default): Unit = { - val spark = self.sparkSession - implicit val sc = spark.sparkContext - - val tileDirName = "rf-tiles" - - - val inputRDD: MultibandTileLayerRDD[SpatialKey] = self.toMultibandTileLayerRDD(self.tileColumns: _*) match { - case Left(spatial) ⇒ spatial - case Right(origRDD) ⇒ - val newBounds = origRDD.metadata.bounds.flatMap[SpatialKey] { - bounds => KeyBounds(bounds.minKey.spatialKey, bounds.maxKey.spatialKey) - } - val newMD = origRDD.metadata.copy(bounds = newBounds) - val rdd = origRDD.map { case (k, v) ⇒ (k.spatialKey, v)} - ContextRDD(rdd, newMD) - } - - val layoutScheme = ZoomedLayoutScheme(WebMercator, tileSize = 256) - - val (zoom, reprojected) = inputRDD.reproject(WebMercator, layoutScheme, Bilinear) - val writer = new HadoopSlippyTileWriter[MultibandTile](dest.toASCIIString + "/" + tileDirName, "png")({ (_, tile) => - //require(tile.bandCount >= 3 || renderer.isInstanceOf[ColorRampProfile], - // "Single-band and dual-band RasterFrames require a ColorRampProfile for rendering") - val png = renderer.render(tile) - png.bytes - }) - - val center = reprojected.metadata.extent.center - - SlippyExport.writeHtml(dest, sc.hadoopConfiguration, Map( - "maxZoom" -> zoom.toString, - "id" -> tileDirName, - "viewLat" -> center.y.toString, - "viewLon" -> center.x.toString - )) - - // Pyramiding up the zoom levels, write our tiles out to the local file system. - Pyramid.upLevels(reprojected, layoutScheme, zoom, Bilinear) { (rdd, z) => - writer.write(z, rdd) - } - } -} - -object SlippyExport { - import scala.collection.JavaConverters._ - implicit class RasterFrameHasSlippy(val self: RasterFrame) extends SlippyExport - private def writeHtml(dest: URI, conf: Configuration, subs: Map[String, String]): Unit = { - val rawLines = Source.fromInputStream(getClass.getResourceAsStream("/slippy.html")).getLines() - - val subst = new StrSubstitutor(subs.asJava) - - val fs = FileSystem.get(dest, conf) - withResource(fs.create(new Path(new Path(dest), "index.html"), true)) { hout ⇒ - val out = new PrintStream(hout, true ,"UTF-8") - for(line ← rawLines) { - out.println(subst.replace(line)) - } - } - } -} - diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 5388e5518..71694980d 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -24,7 +24,6 @@ object RFProjectPlugin extends AutoPlugin { val scalaTest = "org.scalatest" %% "scalatest" % "3.0.3" % Test } - import autoImport._ override def projectSettings = Seq( organization := "org.locationtech.rasterframes", @@ -36,9 +35,6 @@ object RFProjectPlugin extends AutoPlugin { description := "RasterFrames brings the power of Spark DataFrames to geospatial raster data, empowered by the map algebra and tile layer operations of GeoTrellis", licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html")), scalaVersion := "2.11.12", - rfSparkVersion in ThisBuild := "2.3.2" , - rfGeoTrellisVersion in ThisBuild := "2.1.0", - rfGeoMesaVersion in ThisBuild := "2.1.1", scalacOptions ++= Seq("-feature", "-deprecation"), scalacOptions in (Compile, doc) ++= Seq("-no-link-warnings"), javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), @@ -48,7 +44,6 @@ object RFProjectPlugin extends AutoPlugin { "boundless-releases" at "https://repo.boundlessgeo.com/main/", "Open Source Geospatial Foundation Repository" at "http://download.osgeo.org/webdav/geotools/" ), - // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py publishTo := sonatypePublishTo.value, publishMavenStyle := true, publishArtifact in (Compile, packageDoc) := true, diff --git a/project/plugins.sbt b/project/plugins.sbt index 5aa78c4dc..1ac9bcfa4 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,7 +1,7 @@ logLevel := sbt.Level.Error resolvers += Resolver.bintrayIvyRepo("s22s", "sbt-plugins") -//addSbtCoursier +addSbtCoursier addSbtPlugin("com.servicerocket" % "sbt-git-flow" % "0.1.3-astraea.1") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0") diff --git a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala index b80a8a3f8..d4a8967c0 100644 --- a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala @@ -20,7 +20,7 @@ package astraea.spark.rasterframes.py import astraea.spark.rasterframes._ import astraea.spark.rasterframes.util.CRSParser -import com.vividsolutions.jts.geom.Geometry +import org.locationtech.jts.geom.Geometry import geotrellis.raster.{ArrayTile, CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} @@ -171,11 +171,11 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions // return toRaster, get just the tile, and make an array out of it def toIntRaster(df: DataFrame, colname: String, cols: Int, rows: Int): Array[Int] = { - df.asRF.toRaster(df.col(colname), cols, rows).toArray() + df.asRF.toRaster(df.col(colname), cols, rows).tile.toArray() } def toDoubleRaster(df: DataFrame, colname: String, cols: Int, rows: Int): Array[Double] = { - df.asRF.toRaster(df.col(colname), cols, rows).toArrayDouble() + df.asRF.toRaster(df.col(colname), cols, rows).tile.toArrayDouble() } def tileLayerMetadata(df: DataFrame): String = From 711642043ce710584746ac59b3ae94a20cee13cc Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 14 Mar 2019 15:24:08 -0400 Subject: [PATCH 013/380] Added ability to control use of GDAL bindings via config/command line. Instrumented test against RasterSourceIT. --- .../rasterframes/ref/RasterSourceIT.scala | 39 ++++++---- core/src/main/resources/reference.conf | 12 ++++ .../astraea/spark/rasterframes/package.scala | 9 ++- .../spark/rasterframes/ref/RasterSource.scala | 15 ++-- .../spark/rasterframes/util/package.scala | 11 +-- .../slippy/SlippyExportDriver.scala | 72 ------------------- 6 files changed, 56 insertions(+), 102 deletions(-) delete mode 100644 experimental/src/it/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExportDriver.scala diff --git a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala index 6f9069183..f01f333f7 100644 --- a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala @@ -23,12 +23,10 @@ package astraea.spark.rasterframes.ref import java.net.URI -import astraea.spark.rasterframes.TestEnvironment.ReadMonitor -import astraea.spark.rasterframes.ref.RasterSource.FileGeoTiffRasterSource +import astraea.spark.rasterframes +import astraea.spark.rasterframes.util.time import astraea.spark.rasterframes.{TestData, TestEnvironment} -import geotrellis.raster.io.geotiff.GeoTiff import geotrellis.vector.Extent -import org.apache.spark.sql.rf.RasterSourceUDT /** * @@ -45,17 +43,28 @@ class RasterSourceIT extends TestEnvironment with TestData { describe("RasterSource.readAll") { it("should return consistently ordered tiles across bands for a given scene") { - // These specific scenes exhibit the problem where we see different subtile segment ordering across the bands of a given scene. - val rURI = new URI("https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/016/034/LC08_L1TP_016034_20181003_20181003_01_RT/LC08_L1TP_016034_20181003_20181003_01_RT_B4.TIF") - val bURI = new URI("https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/016/034/LC08_L1TP_016034_20181003_20181003_01_RT/LC08_L1TP_016034_20181003_20181003_01_RT_B2.TIF") - - val red = RasterSource(rURI).readAll().left.get - val blue = RasterSource(bURI).readAll().left.get - - red should not be empty - red.size should equal(blue.size) - - red.map(_.dimensions) should contain theSameElementsAs blue.map(_.dimensions) + time(s"two band comparison prefer-gdal=${ rasterframes.rfConfig.getBoolean("prefer-gdal")}") { + // These specific scenes exhibit the problem where we see different subtile segment ordering across the bands of a given scene. + val rURI = new URI( + "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/016/034/LC08_L1TP_016034_20181003_20181003_01_RT/LC08_L1TP_016034_20181003_20181003_01_RT_B4.TIF") + val bURI = new URI( + "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/016/034/LC08_L1TP_016034_20181003_20181003_01_RT/LC08_L1TP_016034_20181003_20181003_01_RT_B2.TIF") + val red = time("read B4") { + RasterSource(rURI).readAll().left.get + } + val blue = time("read B2") { + RasterSource(bURI).readAll().left.get + } + time("test empty") { + red should not be empty + } + time("compare sizes") { + red.size should equal(blue.size) + } + time("compare dimensions") { + red.map(_.dimensions) should contain theSameElementsAs blue.map(_.dimensions) + } + } } } } diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index 980088e28..f082a02ef 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -1,3 +1,15 @@ rasterframes { nominal-tile-size: 256 + prefer-gdal: true +} + +gdal { + settings { + options { + // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options + CPL_DEBUG = "OFF" + } + // set this to `false` if CPL_DEBUG is `ON` + useExceptions: true + } } \ No newline at end of file diff --git a/core/src/main/scala/astraea/spark/rasterframes/package.scala b/core/src/main/scala/astraea/spark/rasterframes/package.scala index 7b360ed25..7bb56d402 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/package.scala @@ -32,7 +32,7 @@ import scala.reflect.runtime.universe._ /** * Module providing support for RasterFrames. - * `import astraea.spark.rasterframes._`., and then call `rfInit(SQLContext)`. + * `import astraea.spark.rasterframes._`. * * @since 7/18/17 */ @@ -45,9 +45,13 @@ package object rasterframes extends StandardColumns with DataFrameFunctions.Library with LazyLogging { + @transient + private[rasterframes] + val rfConfig = ConfigFactory.load().getConfig("rasterframes") + /** The generally expected tile size, as defined by configuration property `rasterframes.nominal-tile-size`.*/ @transient - final val NOMINAL_TILE_SIZE: Int = ConfigFactory.load().getInt("rasterframes.nominal-tile-size") + final val NOMINAL_TILE_SIZE: Int = rfConfig.getInt("nominal-tile-size") /** * Initialization injection point. Must be called before any RasterFrame @@ -123,5 +127,4 @@ package object rasterframes extends StandardColumns override val selfType: TypeTag[SpaceTimeKey] = implicitly } } - } diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 3f1f662c8..50dd70cd0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -223,7 +223,6 @@ object RasterSource extends LazyLogging { case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) extends RasterSource with URIRasterSource { - import GDALRasterSource.MAX_SIZE import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} @transient @@ -276,7 +275,7 @@ object RasterSource extends LazyLogging { cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) } - val tiled = grid.split(MAX_SIZE, MAX_SIZE).toTraversable + val tiled = grid.split(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE).toTraversable if (bandCount == 1) Left(gdal.readBounds(tiled, Seq(0)).map(_.mapTile(_.band(0))).toSeq) @@ -287,16 +286,16 @@ object RasterSource extends LazyLogging { override def nativeLayout: Option[TileLayout] = { Some( TileLayout( - cols / MAX_SIZE + 1, - rows / MAX_SIZE + 1, - math.min(cols, MAX_SIZE), - math.min(rows, MAX_SIZE))) + cols / NOMINAL_TILE_SIZE + 1, + rows / NOMINAL_TILE_SIZE + 1, + math.min(cols, NOMINAL_TILE_SIZE), + math.min(rows, NOMINAL_TILE_SIZE))) } override def tags: Option[Tags] = Some(Tags(metadata, List.empty)) } object GDALRasterSource { - final val MAX_SIZE = 256 + private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") @transient lazy val hasGDAL: Boolean = try { org.gdal.gdal.gdal.AllRegister() @@ -307,7 +306,7 @@ object RasterSource extends LazyLogging { logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader.") false } - def unapply(scheme: String): Boolean = scheme.startsWith("gdal+") && hasGDAL + def unapply(scheme: String): Boolean = (preferGdal || scheme.startsWith("gdal+")) && hasGDAL } trait RangeReaderRasterSource extends RasterSource with GeoTiffInfoSupport with LazyLogging { diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala b/core/src/main/scala/astraea/spark/rasterframes/util/package.scala index 0581342e1..b0e50825b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/package.scala @@ -19,16 +19,15 @@ package astraea.spark.rasterframes -import com.typesafe.scalalogging.LazyLogging +import com.typesafe.scalalogging.Logger import geotrellis.proj4.CRS -import geotrellis.raster -import geotrellis.raster.{CellGrid, Tile, isNoData} import geotrellis.raster.crop.TileCropMethods import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import geotrellis.raster.mask.TileMaskMethods import geotrellis.raster.merge.TileMergeMethods import geotrellis.raster.prototype.TilePrototypeMethods +import geotrellis.raster.{CellGrid, Tile, isNoData} import geotrellis.spark.Bounds import geotrellis.spark.tiling.TilerKeyMethods import geotrellis.util.{ByteReader, GetComponent} @@ -38,6 +37,7 @@ import org.apache.spark.sql.catalyst.rules.Rule import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.StringType import org.apache.spark.sql.{Column, DataFrame, SQLContext} +import org.slf4j.LoggerFactory import spire.syntax.cfor._ import scala.Boolean.box @@ -47,7 +47,10 @@ import scala.Boolean.box * * @since 12/18/17 */ -package object util extends LazyLogging { +package object util { + @transient + protected lazy val logger: Logger = + Logger(LoggerFactory.getLogger("astraea.spark.rasterframes")) import reflect.ClassTag import reflect.runtime.universe._ diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExportDriver.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExportDriver.scala deleted file mode 100644 index 64e3c43f4..000000000 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/slippy/SlippyExportDriver.scala +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea. Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * - */ - -package astraea.spark.rasterframes.experimental.slippy - -import java.io.File - -import astraea.spark.rasterframes._ -import geotrellis.raster._ -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import org.apache.spark.sql.SparkSession -import SlippyExport._ -import astraea.spark.rasterframes.util.MultibandRender - -object SlippyExportDriver { - def main(args: Array[String]): Unit = { - - implicit val spark = SparkSession - .builder() - .master("local[*]") - .appName("RasterFrames") - .getOrCreate() - .withRasterFrames - - def mergeBands = { - val bands: Seq[SinglebandGeoTiff] = for (i ← 1 to 3) yield { - TestData.l8Sample(i) - } - - val mtile = MultibandTile(bands.map(_.tile)) - - val pr = ProjectedRaster(mtile, bands.head.extent, bands.head.crs) - - implicit val bandCount = PairRDDConverter.forSpatialMultiband(bands.length) - - val rf = pr.toRF(64, 64) - - //rf.exportGeoTiffTiles(new File("target/slippy-tiff").toURI) - - rf.exportSlippyMap(new File("target/slippy-1/").toURI) - } - - def multiband = { - implicit val bandCount = PairRDDConverter.forSpatialMultiband(3) - val rf = TestData.rgbCogSample.projectedRaster.toRF(256, 256) - import astraea.spark.rasterframes.datasource.geotiff._ - //val rf = spark.read.geotiff.loadRF(getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI) - println(rf.tileLayerMetadata.merge.toString) - rf.exportSlippyMap(new File("target/slippy-2/").toURI, MultibandRender.Landsat8NaturalColor) - } - - multiband - //mergeBands - } -} From b3050e9d426e195472fdc88595f7e6f4cbf1f3e7 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 27 Mar 2019 13:48:52 -0400 Subject: [PATCH 014/380] Support for GeoMesa shapely UDT in pyrasterframes --- .../python/geomesa_pyspark/types.py | 62 ++++++++++++----- pyrasterframes/python/setup.py | 5 +- .../python/tests/PyRasterFramesTests.py | 69 +++++++++++++++---- 3 files changed, 104 insertions(+), 32 deletions(-) diff --git a/pyrasterframes/python/geomesa_pyspark/types.py b/pyrasterframes/python/geomesa_pyspark/types.py index f70f010c7..5f1d0a110 100644 --- a/pyrasterframes/python/geomesa_pyspark/types.py +++ b/pyrasterframes/python/geomesa_pyspark/types.py @@ -9,15 +9,17 @@ http://www.opensource.org/licenses/apache2.0.php. + ***********************************************************************/""" -from pyspark.sql.types import UserDefinedType -from pyspark.sql import Row -from pyspark.sql.types import * -from pyrasterframes.context import RFContext +from pyspark.sql.types import UserDefinedType, StructField, BinaryType, StructType +from shapely import wkb +from shapely.geometry import LineString, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon +from shapely.geometry.base import BaseGeometry +from shapely.geometry.collection import GeometryCollection + + +class ShapelyGeometryUDT(UserDefinedType): -class GeometryUDT(UserDefinedType): @classmethod - def sqlType(self): - # return StructField("wkb", BinaryType(), False) + def sqlType(cls): return StructType([StructField("wkb", BinaryType(), True)]) @classmethod @@ -29,40 +31,64 @@ def scalaUDT(cls): return 'org.apache.spark.sql.jts.' + cls.__name__ def serialize(self, obj): - if (obj is None): return None - return Row(obj.toBytes) + return [_serialize_to_wkb(obj)] def deserialize(self, datum): - return RFContext._jvm_mirror().generate_geometry(datum[0]) + return _deserialize_from_wkb(datum[0]) -class PointUDT(GeometryUDT): +class PointUDT(ShapelyGeometryUDT): pass -class LineStringUDT(GeometryUDT): +class LineStringUDT(ShapelyGeometryUDT): pass -class PolygonUDT(GeometryUDT): +class PolygonUDT(ShapelyGeometryUDT): pass -class MultiPointUDT(GeometryUDT): +class MultiPointUDT(ShapelyGeometryUDT): pass -class MultiLineStringUDT(GeometryUDT): +class MultiLineStringUDT(ShapelyGeometryUDT): pass -class MultiPolygonUDT(GeometryUDT): +class MultiPolygonUDT(ShapelyGeometryUDT): pass -class GeometryUDT(GeometryUDT): +class GeometryUDT(ShapelyGeometryUDT): pass -class GeometryCollectionUDT(GeometryUDT): +class GeometryCollectionUDT(ShapelyGeometryUDT): pass + + +def _serialize_to_wkb(data): + if isinstance(data, BaseGeometry): + return bytearray(data.wkb) # bytearray(...) needed for Python 2 compat. + return None + + +def _deserialize_from_wkb(data): + if data is None: + return None + return wkb.loads(bytes(data)) # bytes(...) needed for Python 2 compat. + + +_deserialize_from_wkb.__safe_for_unpickling__ = True + +# inject some PySpark constructs into Shapely's geometry types +Point.__UDT__ = PointUDT() +MultiPoint.__UDT__ = MultiPointUDT() +LineString.__UDT__ = LineStringUDT() +MultiLineString.__UDT__ = MultiLineStringUDT() +Polygon.__UDT__ = PolygonUDT() +MultiPolygon.__UDT__ = MultiPolygonUDT() +BaseGeometry.__UDT__ = GeometryUDT() +GeometryCollection.__UDT__ = GeometryCollectionUDT() diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index b24dfa3ad..4119ce757 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -118,6 +118,8 @@ def run(self): license='Apache 2', setup_requires=['pytest-runner', pyspark_ver, 'pathlib'], install_requires=[ + 'pytz', 'shapely', + # 'geomesa-pyspark' # pyspark_ver, # 'pathlib' ], @@ -125,7 +127,8 @@ def run(self): pyspark_ver, 'pytest==3.4.2', 'pypandoc', - 'numpy>=1.7' + 'numpy>=1.7', + 'pandas', ], test_suite="pytest-runner", packages=find_packages(exclude=['tests', 'examples']), diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index b47e25577..984943ae4 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -216,19 +216,62 @@ def test_resample(self): self.assertTrue(result == 1) # short hand for all values are true -def suite(): - functionTests = unittest.TestSuite() - functionTests.addTest(RasterFunctionsTest('test_identify_columns')) - functionTests.addTest(RasterFunctionsTest('test_tile_operations')) - functionTests.addTest(RasterFunctionsTest('test_general')) - functionTests.addTest(RasterFunctionsTest('test_rasterize')) - functionTests.addTest(RasterFunctionsTest('test_reproject')) - functionTests.addTest(RasterFunctionsTest('test_aggregations')) - functionTests.addTest(RasterFunctionsTest('test_explode')) - functionTests.addTest(RasterFunctionsTest('test_sql')) - functionTests.addTest(RasterFunctionsTest('test_maskByValue')) - functionTests.addTest(RasterFunctionsTest('test_resample')) - return functionTests + def test_geomesa_pyspark(self): + from pyspark.sql.functions import lit, udf + import shapely + import pandas as pd + import numpy.testing + + pandas_df = pd.DataFrame({ + 'eye': ['a', 'b', 'c', 'd'], + 'x': [0.0, 1.0, 2.0, 3.0], + 'y': [-4.0, -3.0, -2.0, -1.0], + }) + df = self.spark.createDataFrame(pandas_df) + df = df.withColumn("point_geom", + st_point(df.x, df.y) + ) + df = df.withColumn("poly_geom", st_bufferPoint(df.point_geom, lit(1250.0))) + + # Use python shapely UDT in a UDF + @udf("double") + def area_fn(g): + return g.area + + @udf("double") + def length_fn(g): + return g.length + + df = df.withColumn("poly_area", area_fn(df.poly_geom)) + df = df.withColumn("poly_len", length_fn(df.poly_geom)) + + + # Collect to python driver in shapely UDT + pandas_df_out = df.toPandas() + + # Confirm we get a shapely type back from st_* function + assert(type(pandas_df_out.poly_geom.iloc[0]) is shapely.geometry.Polygon) + + # And our spark-side manipulations were correct + xs_correct = pandas_df_out.point_geom.apply(lambda g: g.coords[0][0]) == pandas_df.x + self.assertTrue(all(xs_correct)) + centroid_ys = pandas_df_out.poly_geom.apply(lambda g: + g.centroid.coords[0][1]).tolist() + numpy.testing.assert_almost_equal(centroid_ys, pandas_df.y.tolist()) + + # Including from UDF's + numpy.testing.assert_almost_equal( + pandas_df_out.poly_geom.apply(lambda g: g.area).values, + pandas_df_out.poly_area.values + ) + numpy.testing.assert_almost_equal( + pandas_df_out.poly_geom.apply(lambda g: g.length).values, + pandas_df_out.poly_len.values + ) +def suite(): + function_tests = unittest.TestSuite() + return function_tests + unittest.TextTestRunner().run(suite()) From 1f37070f2f3d6af842c6f4b7ee0bdb20cc1d5997 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 27 Mar 2019 17:21:32 -0400 Subject: [PATCH 015/380] Clean up some geomesa_pyspark tests; expand to test UDF returning geometry UDT --- pyrasterframes/python/setup.py | 1 - .../python/tests/PyRasterFramesTests.py | 22 ++++++++++++++++--- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index 4119ce757..a0f318008 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -119,7 +119,6 @@ def run(self): setup_requires=['pytest-runner', pyspark_ver, 'pathlib'], install_requires=[ 'pytz', 'shapely', - # 'geomesa-pyspark' # pyspark_ver, # 'pathlib' ], diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 984943ae4..07dc008f9 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -3,6 +3,7 @@ from pyspark.sql.functions import * from pyrasterframes import * from pyrasterframes.rasterfunctions import * +from geomesa_pyspark.types import * from pathlib import Path import os import unittest @@ -217,7 +218,7 @@ def test_resample(self): def test_geomesa_pyspark(self): - from pyspark.sql.functions import lit, udf + from pyspark.sql.functions import lit, udf, sum import shapely import pandas as pd import numpy.testing @@ -245,16 +246,31 @@ def length_fn(g): df = df.withColumn("poly_area", area_fn(df.poly_geom)) df = df.withColumn("poly_len", length_fn(df.poly_geom)) + # Return UDT in a UDF! + def some_point(g): + return g.representative_point() + + some_point_udf = udf(some_point, PointUDT()) + + df = df.withColumn("any_point", some_point_udf(df.poly_geom)) + # spark-side UDF/UDT are correct + intersect_total = df.agg(sum( + st_intersects(df.poly_geom, df.any_point).astype('double') + ).alias('s')).collect()[0].s + self.assertTrue(intersect_total == df.count()) + # Collect to python driver in shapely UDT pandas_df_out = df.toPandas() - # Confirm we get a shapely type back from st_* function - assert(type(pandas_df_out.poly_geom.iloc[0]) is shapely.geometry.Polygon) + # Confirm we get a shapely type back from st_* function and UDF + self.assertIsInstance(pandas_df_out.poly_geom.iloc[0], shapely.geometry.Polygon) + self.assertIsInstance(pandas_df_out.any_point.iloc[0], shapely.geometry.Point) # And our spark-side manipulations were correct xs_correct = pandas_df_out.point_geom.apply(lambda g: g.coords[0][0]) == pandas_df.x self.assertTrue(all(xs_correct)) + centroid_ys = pandas_df_out.poly_geom.apply(lambda g: g.centroid.coords[0][1]).tolist() numpy.testing.assert_almost_equal(centroid_ys, pandas_df.y.tolist()) From acda27a105efb7a6edf913fa09f756b8c3f9a449 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 28 Mar 2019 11:16:04 -0400 Subject: [PATCH 016/380] Update release notes for recently merged work Signed-off-by: Jason T. Brown --- docs/src/main/tut/release-notes.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index c043ac772..174f02aee 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -4,7 +4,9 @@ ### 0.8.0 -* Added new tile functions `round`, `log`, `log10`, `log2`, `log1p`, `exp`, `exp10`, `exp2`, `expm1`, `resample`, `resample`. +* Added new tile functions `round`, `log`, `log10`, `log2`, `log1p`, `exp`, `exp10`, `exp2`, `expm1`, `resample`. +* Support python-side `shapely` geometry User-Defined Type. +* SQL API support for: `rf_assemble_tile`, `rf_array_to_tile`. * Introduced at the source level the concept of a `RasterSource` and `RasterRef`, enabling lazy/delayed read of sub-scene tiles. * _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. From 7283c3c31caee539104faff57c4abc49d6e77f44 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 14 Mar 2019 16:06:38 -0400 Subject: [PATCH 017/380] Removed use of Either in RasterSource and always return MBT. (+1 squashed commit) Build and test tweaks. --- .gitignore | 2 + build.sbt | 6 +- .../rasterframes/ref/RasterSourceIT.scala | 4 +- .../transformers/RasterSourceToTiles.scala | 8 +- .../spark/rasterframes/ref/RasterRef.scala | 2 +- .../spark/rasterframes/ref/RasterSource.scala | 130 +++++------------- core/src/test/resources/application.conf | 10 ++ .../astraea/spark/rasterframes/TestData.scala | 6 +- .../rasterframes/TileAssemblerSpec.scala | 4 +- .../rasterframes/ref/RasterSourceSpec.scala | 23 ++-- docs/src/main/tut/getting-started.md | 7 + project/RFProjectPlugin.scala | 2 +- 12 files changed, 81 insertions(+), 123 deletions(-) create mode 100644 core/src/test/resources/application.conf diff --git a/.gitignore b/.gitignore index ca41e7212..ff43c9712 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ metastore_db tour/jars tour/*.tiff scoverage-report* + +zz-* diff --git a/build.sbt b/build.sbt index 09e9d4dae..91db148a1 100644 --- a/build.sbt +++ b/build.sbt @@ -3,9 +3,9 @@ addCommandAlias("makeSite", "docs/makeSite") addCommandAlias("console", "datasource/console") // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py -rfSparkVersion in ThisBuild := "2.3.2" -rfGeoTrellisVersion in ThisBuild := "2.2.0" -rfGeoMesaVersion in ThisBuild := "2.2.1" +ThisBuild / rfSparkVersion := "2.3.2" +ThisBuild / rfGeoTrellisVersion := "2.2.0" +ThisBuild / rfGeoMesaVersion := "2.2.1" lazy val root = project .in(file(".")) diff --git a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala index f01f333f7..d5283ae2d 100644 --- a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala @@ -50,10 +50,10 @@ class RasterSourceIT extends TestEnvironment with TestData { val bURI = new URI( "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/016/034/LC08_L1TP_016034_20181003_20181003_01_RT/LC08_L1TP_016034_20181003_20181003_01_RT_B2.TIF") val red = time("read B4") { - RasterSource(rURI).readAll().left.get + RasterSource(rURI).readAll() } val blue = time("read B2") { - RasterSource(bURI).readAll().left.get + RasterSource(bURI).readAll() } time("test empty") { red should not be empty diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala index 2b1caa3ba..b26c0f944 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala @@ -59,12 +59,14 @@ case class RasterSourceToTiles(children: Seq[Expression], applyTiling: Boolean) val refs = children.map { child ⇒ val src = RasterSourceType.deserialize(child.eval(input)) val tiles = if (applyTiling) src.readAll() else { - src.read(src.extent).right.map(Seq(_)).left.map(Seq(_)) + Seq(src.read(src.extent)) } - require(tiles.isLeft, "Multiband tiles are not yet supported") + tiles.headOption.foreach(r => { + require(r.tile.bandCount <= 1, "Multiband tiles are not yet supported") + }) - tiles.left.get + tiles.map(_.mapTile(_.band(0))) } refs.transpose.map(ts ⇒ InternalRow(ts.map(r ⇒ r.tile.toInternalRow): _*)) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala index ff176765c..ff6564807 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala @@ -54,7 +54,7 @@ case class RasterRef(source: RasterSource, subextent: Option[Extent]) protected lazy val realizedTile: Tile = { require(source.bandCount == 1, "Expected singleband tile") RasterRef.log.trace(s"Fetching $srcExtent from $source") - source.read(srcExtent).left.get.tile + source.read(srcExtent).tile.band(0) } /** Splits this tile into smaller tiles based on the reported diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 50dd70cd0..3337e081b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -26,14 +26,13 @@ import java.time.format.DateTimeFormatter import astraea.spark.rasterframes.NOMINAL_TILE_SIZE import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile import astraea.spark.rasterframes.tiles.ProjectedRasterTile import astraea.spark.rasterframes.util.GeoTiffInfoSupport import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.raster.io.geotiff.{GeoTiffSegmentLayout, MultibandGeoTiff, SinglebandGeoTiff, Tags} +import geotrellis.raster.io.geotiff.{GeoTiffSegmentLayout, MultibandGeoTiff, Tags} import geotrellis.raster.split.Split import geotrellis.spark.io.hadoop.HdfsRangeReader import geotrellis.spark.io.s3.S3Client @@ -46,6 +45,7 @@ import org.apache.hadoop.fs.Path import org.apache.spark.annotation.Experimental import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT + import scala.collection.JavaConverters._ import scala.util.Try @@ -68,40 +68,9 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def tags: Option[Tags] - def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] - - /** Reads the given extent as a single multiband raster. */ - def readMultiband(extent: Extent): Raster[MultibandTile] = - read(extent).fold(r => { - r.copy(tile = MultibandTile(r.tile)) - }, identity) - - def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] - def readAllMultiband(): Seq[Raster[MultibandTile]] = - readAll().fold(_.map(r => { - r.copy(tile = MultibandTile(r.tile)) - }), identity) - - def readAllLazy(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { - val extents = nativeTiling - if (bandCount == 1) { - val rasters = for { - extent <- extents - rr = RasterRef(this, Some(extent)) - tile: Tile = RasterRefTile(rr) - } yield Raster(tile, extent) - Left(rasters) - } else { - // Need to figure this out. - RasterSource._logger.warn( - "Lazy reading is not available for multiband images. Performing eager read.") - val rasters = for { - extent <- extents - raster = this.read(extent).right.get - } yield raster - Right(rasters) - } - } + def read(extent: Extent): Raster[MultibandTile] + + def readAll(): Seq[Raster[MultibandTile]] def nativeLayout: Option[TileLayout] @@ -204,9 +173,8 @@ object RasterSource extends LazyLogging { override def tags: Option[Tags] = None - override def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = Left( - Raster(tile.crop(rasterExtent.gridBoundsFor(extent, false)), extent) - ) + override def read(extent: Extent): Raster[MultibandTile] = + Raster(MultibandTile(tile.crop(rasterExtent.gridBoundsFor(extent, false))), extent) override def nativeLayout: Option[TileLayout] = Some( TileLayout( @@ -216,9 +184,8 @@ object RasterSource extends LazyLogging { tileRows = NOMINAL_TILE_SIZE) ) - def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { - Left(Raster(tile, extent).split(nativeLayout.get, Split.Options(false, false)).toSeq) - } + def readAll(): Seq[Raster[MultibandTile]] = + Raster(MultibandTile(tile), extent).split(nativeLayout.get, Split.Options(false, false)).toSeq } case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) @@ -255,20 +222,15 @@ object RasterSource extends LazyLogging { override def rows: Int = gdal.rows - override def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = { - + override def read(extent: Extent): Raster[MultibandTile] = { callback.foreach { cb => val grid = rasterExtent.gridBoundsFor(extent, clamp = false) cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) } - - if (bandCount == 1) - Left(gdal.read(extent, Seq(0)).get.mapTile(_.band(0))) - else - Right(gdal.read(extent).get) + gdal.read(extent).get } - override def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { + override def readAll(): Seq[Raster[MultibandTile]] = { val grid = gdal.gridBounds callback.foreach { cb => @@ -277,10 +239,7 @@ object RasterSource extends LazyLogging { val tiled = grid.split(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE).toTraversable - if (bandCount == 1) - Left(gdal.readBounds(tiled, Seq(0)).map(_.mapTile(_.band(0))).toSeq) - else - Right(gdal.readBounds(tiled).toSeq) + gdal.readBounds(tiled).toSeq } override def nativeLayout: Option[TileLayout] = { @@ -339,61 +298,36 @@ object RasterSource extends LazyLogging { else None } - def read(extent: Extent): Either[Raster[Tile], Raster[MultibandTile]] = { + def read(extent: Extent): Raster[MultibandTile] = { val info = realInfo - if (bandCount == 1) { - val geoTiffTile = GeoTiffReader.geoTiffSinglebandTile(info) - val gt = new SinglebandGeoTiff( - geoTiffTile, - info.extent, - info.crs, - info.tags, - info.options, - List.empty - ) - Left(gt.crop(extent).raster) - } else { - val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) - val gt = new MultibandGeoTiff( - geoTiffTile, - info.extent, - info.crs, - info.tags, - info.options, - List.empty - ) - Right(gt.crop(extent).raster) - } + val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) + val gt = new MultibandGeoTiff( + geoTiffTile, + info.extent, + info.crs, + info.tags, + info.options, + List.empty + ) + gt.crop(extent).raster } - def readAll(): Either[Seq[Raster[Tile]], Seq[Raster[MultibandTile]]] = { + def readAll(): Seq[Raster[MultibandTile]] = { val info = realInfo // Thanks to @pomadchin for showing us how to do this :-) val windows = info.segmentLayout.listWindows(NOMINAL_TILE_SIZE) val re = info.rasterExtent - if (info.bandCount == 1) { - val geotile = GeoTiffReader.geoTiffSinglebandTile(info) + val geotile = GeoTiffReader.geoTiffMultibandTile(info) - val rows = windows.map(gb => { - val tile = geotile.crop(gb) - val extent = re.extentFor(gb, clamp = false) - Raster(tile, extent) - }) + val rows = windows.map(gb => { + val tile = geotile.crop(gb) + val extent = re.extentFor(gb, clamp = false) + Raster(tile, extent) + }) - Left(rows.toSeq) - } else { - val geotile = GeoTiffReader.geoTiffMultibandTile(info) - - val rows = windows.map(gb => { - val tile = geotile.crop(gb) - val extent = re.extentFor(gb, clamp = false) - Raster(tile, extent) - }) - - Right(rows.toSeq) - } + rows.toSeq } } diff --git a/core/src/test/resources/application.conf b/core/src/test/resources/application.conf new file mode 100644 index 000000000..d2283141c --- /dev/null +++ b/core/src/test/resources/application.conf @@ -0,0 +1,10 @@ +gdal { + settings { + options { + // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options + CPL_DEBUG = "ON" + } + // set this to `false` if CPL_DEBUG is `ON` + useExceptions: false + } +} \ No newline at end of file diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala index 2502857b2..b6e7da48b 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala @@ -123,13 +123,13 @@ trait TestData { rf.toTileLayerRDD(rf.tileColumns.head).left.get } - private val baseCOG = "gdal+https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_%s.TIF" + private val baseCOG = "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_%s.TIF" lazy val remoteCOGSingleband1 = URI.create(baseCOG.format("B1")) lazy val remoteCOGSingleband2 = URI.create(baseCOG.format("B2")) - lazy val remoteCOGMultiband = URI.create("gdal+https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/2014/02/14/IP0201402141023382027S03100E/IP0201402141023382027S03100E-COG.tif") + lazy val remoteCOGMultiband = URI.create("https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/2014/02/14/IP0201402141023382027S03100E/IP0201402141023382027S03100E-COG.tif") - lazy val remoteMODIS = URI.create("gdal+https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") + lazy val remoteMODIS = URI.create("https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") object JTS { val fact = new GeometryFactory() diff --git a/core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala index 29eff421f..15ee82860 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala @@ -134,9 +134,9 @@ object TileAssemblerSpec extends LazyLogging { implicit class WithToDF(val rs: RasterSource) { def toDF(implicit spark: SparkSession): DataFrame = { import spark.implicits._ - rs.readAll().left.get + rs.readAll() .zipWithIndex - .map { case (r, i) ⇒ (i, r.extent, r.tile) } + .map { case (r, i) ⇒ (i, r.extent, r.tile.band(0)) } .toDF("spatial_index", "extent", "tile") .repartition($"spatial_index") .forceCache diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 987f253f3..993c1381d 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -22,12 +22,14 @@ package astraea.spark.rasterframes.ref import astraea.spark.rasterframes.TestEnvironment.ReadMonitor -import astraea.spark.rasterframes.ref.RasterSource.FileGeoTiffRasterSource +import astraea.spark.rasterframes.ref.RasterSource.{FileGeoTiffRasterSource, GDALRasterSource} import astraea.spark.rasterframes.{TestData, TestEnvironment} import geotrellis.raster.io.geotiff.GeoTiff import geotrellis.vector.Extent import org.apache.spark.sql.rf.RasterSourceUDT +import scala.language.reflectiveCalls + /** * * @@ -61,13 +63,13 @@ class RasterSourceSpec extends TestEnvironment with TestData { it("should read sub-tile") { withClue("remoteCOGSingleband") { val src = RasterSource(remoteCOGSingleband1) - val Left(raster) = src.read(sub(src.extent)) + val raster = src.read(sub(src.extent)) assert(raster.size > 0 && raster.size < src.size) } withClue("remoteCOGMultiband") { val src = RasterSource(remoteCOGMultiband) //println("CoG size", src.size, src.dimensions) - val Right(raster) = src.read(sub(src.extent)) + val raster = src.read(sub(src.extent)) //println("Subtile size", raster.size, raster.dimensions) assert(raster.size > 0 && raster.size < src.size) } @@ -104,22 +106,21 @@ class RasterSourceSpec extends TestEnvironment with TestData { it("should cache headers")(new Fixture { val e = src.extent - assert(counter.reads === 1) + val startReads = counter.reads val c = src.crs val e2 = src.extent val ct = src.cellType - assert(counter.reads === 1) + counter.reads should be(startReads) }) it("should Spark serialize caching")(new Fixture { import spark.implicits._ - assert(src.isInstanceOf[FileGeoTiffRasterSource]) + val origType = src.getClass val e = src.extent - assert(counter.reads === 1) val df = Seq(src, src, src).toDS.repartition(3) val src2 = df.collect()(1) @@ -128,8 +129,10 @@ class RasterSourceSpec extends TestEnvironment with TestData { val ct = src2.cellType src2 match { - case fs: FileGeoTiffRasterSource ⇒ - fs.callback match { + case _: GDALRasterSource => () + case s if s.getClass == origType ⇒ + val t = s.asInstanceOf[RasterSource { def callback: Option[ReadMonitor] }] + t.callback match { case Some(cb: ReadMonitor) ⇒ assert(cb.reads === 1) case o ⇒ fail(s"Expected '$o' to be a ReadMonitor") } @@ -142,7 +145,7 @@ class RasterSourceSpec extends TestEnvironment with TestData { it("should read all tiles") { val src = RasterSource(remoteMODIS) - val subrasters = src.readAll().left.get + val subrasters = src.readAll() val collected = subrasters.map(_.extent).reduceLeft(_.combine(_)) diff --git a/docs/src/main/tut/getting-started.md b/docs/src/main/tut/getting-started.md index 413131e84..b16dac563 100644 --- a/docs/src/main/tut/getting-started.md +++ b/docs/src/main/tut/getting-started.md @@ -44,6 +44,13 @@ It assumes that SparkSQL 2.3.x is available in the runtime classpath. Here's how version="2.3.2" } + +Until GeoTrellis 3.0 is released, the following artifact resolver needs to be added to your build. + +```scala +resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis" +``` + @@@ note Most of the following examples are shown using the Spark DataFrames API. However, many could also be rewritten to use the Spark SQL API instead. We hope to add more examples in that form in the future. @@@ diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 71694980d..716d70fdd 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -44,7 +44,7 @@ object RFProjectPlugin extends AutoPlugin { "boundless-releases" at "https://repo.boundlessgeo.com/main/", "Open Source Geospatial Foundation Repository" at "http://download.osgeo.org/webdav/geotools/" ), - publishTo := sonatypePublishTo.value, + publishTo in ThisBuild := sonatypePublishTo.value, publishMavenStyle := true, publishArtifact in (Compile, packageDoc) := true, publishArtifact in Test := false, From 801ca0a3ee4f3328c26247cd01233e6c092c0303 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 27 Mar 2019 11:54:09 -0400 Subject: [PATCH 018/380] Removed `timestamp` from `RasterSource`. --- .../astraea/spark/rasterframes/ref/RasterSource.scala | 10 ---------- .../spark/rasterframes/ref/RasterSourceSpec.scala | 2 +- 2 files changed, 1 insertion(+), 11 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 3337e081b..be27197b5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -60,8 +60,6 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def extent: Extent - def timestamp: Option[ZonedDateTime] - def cellType: CellType def bandCount: Int @@ -165,8 +163,6 @@ object RasterSource extends LazyLogging { override def cols: Int = tile.cols - override def timestamp: Option[ZonedDateTime] = None - override def cellType: CellType = tile.cellType override def bandCount: Int = 1 @@ -208,12 +204,6 @@ object RasterSource extends LazyLogging { .asScala .toMap - // TODO: See if dates are available in gdal. - // Maybe useful: gdal.dataset.getMetadata_Dict - override def timestamp: Option[ZonedDateTime] = { - dateFromMetadata(metadata) - } - override def cellType: CellType = gdal.cellType override def bandCount: Int = gdal.bandCount diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 993c1381d..1559c3c67 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -22,7 +22,7 @@ package astraea.spark.rasterframes.ref import astraea.spark.rasterframes.TestEnvironment.ReadMonitor -import astraea.spark.rasterframes.ref.RasterSource.{FileGeoTiffRasterSource, GDALRasterSource} +import astraea.spark.rasterframes.ref.RasterSource.GDALRasterSource import astraea.spark.rasterframes.{TestData, TestEnvironment} import geotrellis.raster.io.geotiff.GeoTiff import geotrellis.vector.Extent From 3bf334597264ff75a4706e0c90d7f18c68c29eaa Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 28 Mar 2019 11:31:20 -0400 Subject: [PATCH 019/380] Incremental reimplementation of RasterSource reading to depend on geotrellis-contrib version. Linting fixes/cleanup. --- .../bench/MultibandRenderBench.scala | 2 +- .../spark/rasterframes/PairRDDConverter.scala | 2 +- .../spark/rasterframes/RasterFunctions.scala | 3 +- .../spark/rasterframes/StandardColumns.scala | 11 +- .../TemporalProjectedExtentEncoder.scala | 6 +- .../expressions/DynamicExtractors.scala | 2 +- .../expressions/TileAssembler.scala | 2 +- .../aggstats/LocalTileOpAggregate.scala | 5 +- .../expressions/localops/Add.scala | 3 +- .../expressions/localops/Resample.scala | 3 +- .../expressions/tilestats/TileMean.scala | 1 - .../RasterSourceToRasterRefs.scala | 6 +- .../transformers/RasterSourceToTiles.scala | 5 - .../extensions/ContextRDDMethods.scala | 4 +- .../rasterframes/extensions/Implicits.scala | 1 - .../extensions/SQLContextMethods.scala | 2 +- .../rasterframes/functions/package.scala | 4 +- .../rasterframes/model/TileDimensions.scala | 6 +- .../astraea/spark/rasterframes/package.scala | 3 +- .../spark/rasterframes/ref/RasterRef.scala | 20 +- .../spark/rasterframes/ref/RasterSource.scala | 195 ++++++++++-------- .../rasterframes/stats/CellHistogram.scala | 4 +- .../tiles/ProjectedRasterTile.scala | 3 +- .../util/GeoTiffInfoSupport.scala | 2 +- .../rasterframes/util/ReadAccumulator.scala | 2 +- .../org/apache/spark/sql/rf/TileUDT.scala | 1 - .../apache/spark/sql/rf/VersionShims.scala | 8 +- .../rasterframes/RasterFunctionsSpec.scala | 6 +- .../astraea/spark/rasterframes/TestData.scala | 4 +- .../spark/rasterframes/TileStatsSpec.scala | 8 +- .../rasterframes/ref/RasterRefSpec.scala | 4 +- .../rasterframes/ref/RasterSourceSpec.scala | 26 ++- .../scala/examples/CreatingRasterFrames.scala | 6 +- core/src/test/scala/examples/Exporting.scala | 6 +- core/src/test/scala/examples/Masking.scala | 5 +- core/src/test/scala/examples/MeanValue.scala | 1 - .../examples/NaturalColorComposite.scala | 5 +- core/src/test/scala/examples/Scratch.scala | 9 +- .../geotiff/GeoTiffCollectionRelation.scala | 1 - .../geotrellis/GeoTrellisCatalog.scala | 4 +- .../datasource/geotrellis/package.scala | 4 +- .../rasterframes/datasource/package.scala | 2 - .../geotrellis/GeoTrellisCatalogSpec.scala | 2 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 2 +- .../geotrellis/TileFeatureSupportSpec.scala | 2 - .../src/test/scala/examples/Creating.scala | 3 - .../datasource/awspds/L8RelationTest.scala | 1 - .../datasource/awspds/L8Relation.scala | 1 - project/RFProjectPlugin.scala | 7 +- project/RFReleasePlugin.scala | 42 +++- project/plugins.sbt | 1 - 51 files changed, 237 insertions(+), 221 deletions(-) diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala b/bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala index 383710205..4156af6a7 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala +++ b/bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala @@ -24,7 +24,7 @@ import java.util.concurrent.TimeUnit import astraea.spark.rasterframes.util.MultibandRender.Landsat8NaturalColor import geotrellis.raster._ -import geotrellis.raster.io.geotiff.{GeoTiff, MultibandGeoTiff} +import geotrellis.raster.io.geotiff.MultibandGeoTiff import org.apache.commons.io.IOUtils import org.openjdk.jmh.annotations._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala b/core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala index 83686dbfd..6f7f5574c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala @@ -2,7 +2,7 @@ package astraea.spark.rasterframes import astraea.spark.rasterframes.util._ import geotrellis.raster.{MultibandTile, Tile, TileFeature} -import geotrellis.spark.{SpaceTimeKey, SpatialKey, TemporalKey} +import geotrellis.spark.{SpaceTimeKey, SpatialKey} import org.apache.spark.rdd.RDD import org.apache.spark.sql._ import org.apache.spark.sql.rf.TileUDT diff --git a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala index 906f2a38d..db22791bb 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala @@ -28,13 +28,13 @@ import astraea.spark.rasterframes.expressions.tilestats._ import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics} import astraea.spark.rasterframes.{functions => F} -import org.locationtech.jts.geom.{Envelope, Geometry} import geotrellis.proj4.CRS import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import geotrellis.raster.{CellType, Tile} import org.apache.spark.annotation.Experimental import org.apache.spark.sql._ import org.apache.spark.sql.functions._ +import org.locationtech.jts.geom.{Envelope, Geometry} /** * UDFs for working with Tiles in Spark DataFrames. @@ -43,7 +43,6 @@ import org.apache.spark.sql.functions._ */ trait RasterFunctions { import util._ - import PrimitiveEncoders._ // format: off /** Create a row for each cell in Tile. */ diff --git a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala index d08df5d3c..fe63b092b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala @@ -2,13 +2,13 @@ package astraea.spark.rasterframes import java.sql.Timestamp -import geotrellis.raster.{Tile, TileFeature} +import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import geotrellis.proj4.CRS +import geotrellis.raster.Tile import geotrellis.spark.{SpatialKey, TemporalKey} +import geotrellis.vector.Extent import org.apache.spark.sql.functions.col import org.locationtech.jts.geom.{Point => jtsPoint, Polygon => jtsPolygon} -import geotrellis.proj4.CRS -import geotrellis.vector.Extent -import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ /** * Constants identifying column in most RasterFrames. @@ -25,7 +25,6 @@ trait StandardColumns { /** Default RasterFrame timestamp column name */ val TIMESTAMP_COLUMN = col("timestamp").as[Timestamp] - /** Default RasterFrame column name for an tile bounds value. */ // This is a `def` because `PolygonUDT` needs to be initialized first. def BOUNDS_COLUMN = col("bounds").as[jtsPolygon] @@ -47,7 +46,7 @@ trait StandardColumns { // This is a `def` because `TileUDT` needs to be initialized first. def TILE_COLUMN = col("tile").as[Tile] - /** Default RasterFrame [[TileFeature.data]] column name. */ + /** Default RasterFrame `TileFeature.data` column name. */ val TILE_FEATURE_DATA_COLUMN = col("tile_data") /** Default GeoTiff tags column. */ diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala index 5e44bd7fe..310ba8971 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala @@ -19,16 +19,14 @@ package astraea.spark.rasterframes.encoders -import java.time.ZonedDateTime - import astraea.spark.rasterframes._ import geotrellis.spark.TemporalProjectedExtent -import geotrellis.vector.ProjectedExtent import org.apache.spark.sql.Encoders import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder /** - * Custom encoder for [[ProjectedExtent]]. Necessary because [[geotrellis.proj4.CRS]] within [[ProjectedExtent]] isn't a case class, and [[ZonedDateTime]] doesn't have a natural encoder. + * Custom encoder for `TemporalProjectedExtent`. Necessary because `geotrellis.proj4.CRS` within + * `ProjectedExtent` isn't a case class, and `ZonedDateTime` doesn't have a natural encoder. * * @since 8/2/17 */ diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala index 1dabc8201..b551df4c5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala @@ -106,7 +106,7 @@ object DynamicExtractors { lazy val intArgExtractor: PartialFunction[DataType, Any => IntegerArg] = { case _: IntegerType | _: ByteType | _: ShortType => { case i: Int => IntegerArg(i) - case b: Byte => IntegerArg(b) + case b: Byte => IntegerArg(b.toInt) case s: Short => IntegerArg(s.toInt) case c: Char => IntegerArg(c.toInt) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala index c3a32267f..df633fe2c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala @@ -118,7 +118,7 @@ case class TileAssembler( val cells = Array.ofDim[Double](length) result.get(cells) val (tileCols, tileRows) = buffer.tileSize - val tile = ArrayTile(cells, tileCols, tileRows) + val tile = ArrayTile(cells, tileCols.toInt, tileRows.toInt) TileType.serialize(tile) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala index 7a5032176..d3247e964 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala @@ -25,15 +25,14 @@ import astraea.spark.rasterframes.expressions.accessors.ExtractTile import astraea.spark.rasterframes.functions.safeBinaryOp import astraea.spark.rasterframes.util.DataBiasedOp.{BiasedMax, BiasedMin} import geotrellis.raster.Tile -import geotrellis.raster.mapalgebra.local import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp -import org.apache.spark.sql.{Column, Row, TypedColumn} -import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, AggregateFunction, AggregateMode, Complete} +import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types._ +import org.apache.spark.sql.{Column, Row, TypedColumn} /** * Aggregation function for applying a [[LocalTileBinaryOp]] pairwise across all tiles. Assumes Monoid algebra. diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala index d7f1a7867..d516a6723 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala @@ -22,11 +22,10 @@ package astraea.spark.rasterframes.expressions.localops import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor -import astraea.spark.rasterframes.expressions.{BinaryLocalRasterOp, DynamicExtractors} import astraea.spark.rasterframes.util.DataBiasedOp.BiasedAdd import geotrellis.raster.Tile -import org.apache.spark.sql.rf._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala index fd2ae2f29..7925f24a8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala @@ -22,11 +22,10 @@ package astraea.spark.rasterframes.expressions.localops import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor import geotrellis.raster.Tile import geotrellis.raster.resample.NearestNeighbor -import org.apache.spark.sql.rf._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala index e23e68c08..30d6bc9cd 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala @@ -22,7 +22,6 @@ package astraea.spark.rasterframes.expressions.tilestats import astraea.spark.rasterframes.expressions.{NullToValue, UnaryRasterOp} -import astraea.spark.rasterframes.functions.safeEval import astraea.spark.rasterframes.model.TileContext import geotrellis.raster.{Tile, isData} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index 2581f8be5..fe8e2b5ee 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -21,6 +21,7 @@ package astraea.spark.rasterframes.expressions.transformers +import astraea.spark.rasterframes.NOMINAL_TILE_DIMS import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.ref.RasterRef @@ -58,7 +59,10 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], applyTiling: Bool try { val refs = children.map { child ⇒ val src = RasterSourceType.deserialize(child.eval(input)) - if (applyTiling) src.nativeTiling.map(e ⇒ RasterRef(src, Some(e))) else Seq(RasterRef(src)) + if (applyTiling) src + .layoutExtents(NOMINAL_TILE_DIMS) + .map(e ⇒ RasterRef(src, Some(e))) + else Seq(RasterRef(src)) } refs.transpose.map(ts ⇒ InternalRow(ts.map(_.toInternalRow): _*)) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala index b26c0f944..64b1c9f6e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala @@ -61,11 +61,6 @@ case class RasterSourceToTiles(children: Seq[Expression], applyTiling: Boolean) val tiles = if (applyTiling) src.readAll() else { Seq(src.read(src.extent)) } - - tiles.headOption.foreach(r => { - require(r.tile.bandCount <= 1, "Multiband tiles are not yet supported") - }) - tiles.map(_.mapTile(_.band(0))) } refs.transpose.map(ts ⇒ InternalRow(ts.map(r ⇒ r.tile.toInternalRow): _*)) diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala index ef0c901f8..d291ae9d4 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala @@ -21,7 +21,7 @@ import astraea.spark.rasterframes.StandardColumns._ import astraea.spark.rasterframes.extensions.Implicits._ import astraea.spark.rasterframes.util._ import astraea.spark.rasterframes.{PairRDDConverter, RasterFrame} -import geotrellis.raster.{CellGrid, Tile} +import geotrellis.raster.{CellGrid} import geotrellis.spark._ import geotrellis.spark.io._ import geotrellis.util.MethodExtensions @@ -47,7 +47,7 @@ abstract class SpatialContextRDDMethods[T <: CellGrid](implicit spark: SparkSess } /** - * Extension method on `ContextRDD`-shaped [[Tile]] RDDs keyed with [[SpaceTimeKey]], with appropriate context bounds to create a RasterFrame. + * Extension method on `ContextRDD`-shaped `Tile` RDDs keyed with [[SpaceTimeKey]], with appropriate context bounds to create a RasterFrame. * @since 9/11/17 */ abstract class SpatioTemporalContextRDDMethods[T <: CellGrid]( diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala index 8fdda51a0..bd8bb6d1c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala @@ -24,7 +24,6 @@ import astraea.spark.rasterframes.util.{WithMergeMethods, WithPrototypeMethods} import geotrellis.raster._ import geotrellis.spark.{Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.util.MethodExtensions -import org.apache.hadoop.conf.{Configuration => HadoopConfiguration} import org.apache.spark.SparkConf import org.apache.spark.rdd.RDD import org.apache.spark.sql._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala index bcd2b31c4..f46f7f0e7 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala @@ -20,7 +20,7 @@ package astraea.spark.rasterframes.extensions import geotrellis.util.MethodExtensions -import org.apache.spark.sql.{SQLContext, rf} +import org.apache.spark.sql.SQLContext /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala index 2594a6590..0ff2be2ee 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala @@ -15,14 +15,12 @@ */ package astraea.spark.rasterframes -import astraea.spark.rasterframes.expressions.aggstats._ import astraea.spark.rasterframes.jts.ReprojectionTransformer import astraea.spark.rasterframes.util.CRSParser -import org.locationtech.jts.geom.Geometry -import geotrellis.raster.mapalgebra.local._ import geotrellis.raster.{Tile, _} import geotrellis.vector.Extent import org.apache.spark.sql.SQLContext +import org.locationtech.jts.geom.Geometry /** * Module utils. diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala b/core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala index 2f7f579ba..0e0e56e51 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala @@ -21,8 +21,8 @@ package astraea.spark.rasterframes.model +import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import geotrellis.raster.Grid import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{ShortType, StructField, StructType} @@ -49,8 +49,8 @@ object TileDimensions { ) override protected def from[R](t: R, io: CatalystIO[R]): TileDimensions = TileDimensions( - io.getShort(t, 0), - io.getShort(t, 1) + io.getShort(t, 0).toInt, + io.getShort(t, 1).toInt ) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/package.scala b/core/src/main/scala/astraea/spark/rasterframes/package.scala index 7bb56d402..dafba71be 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/package.scala @@ -17,6 +17,7 @@ package astraea.spark import astraea.spark.rasterframes.encoders.StandardEncoders +import astraea.spark.rasterframes.model.TileDimensions import astraea.spark.rasterframes.util.ZeroSevenCompatibilityKit import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging @@ -27,7 +28,6 @@ import org.apache.spark.sql._ import org.locationtech.geomesa.spark.jts.DataFrameFunctions import shapeless.tag.@@ -import scala.language.higherKinds import scala.reflect.runtime.universe._ /** @@ -52,6 +52,7 @@ package object rasterframes extends StandardColumns /** The generally expected tile size, as defined by configuration property `rasterframes.nominal-tile-size`.*/ @transient final val NOMINAL_TILE_SIZE: Int = rfConfig.getInt("nominal-tile-size") + final val NOMINAL_TILE_DIMS: TileDimensions = TileDimensions(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE) /** * Initialization injection point. Must be called before any RasterFrame diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala index ff6564807..aec6b3b86 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala @@ -21,13 +21,12 @@ package astraea.spark.rasterframes.ref -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO +import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import astraea.spark.rasterframes.tiles.ProjectedRasterTile import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS -import geotrellis.raster.{CellType, GridBounds, Tile, TileLayout} -import geotrellis.spark.tiling.LayoutDefinition +import geotrellis.raster.{CellType, GridBounds, Tile} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT @@ -56,15 +55,6 @@ case class RasterRef(source: RasterSource, subextent: Option[Extent]) RasterRef.log.trace(s"Fetching $srcExtent from $source") source.read(srcExtent).tile.band(0) } - - /** Splits this tile into smaller tiles based on the reported - * internal structure of the backing format. May return a single item.*/ - def tileToNative: Seq[RasterRef] = { - val ex = this.extent - this.source.nativeTiling - .filter(_ intersects ex) - .map(e ⇒ RasterRef(this.source, Option(e))) - } } object RasterRef extends LazyLogging { @@ -74,12 +64,6 @@ object RasterRef extends LazyLogging { /** Constructor for when data extent cover whole raster. */ def apply(source: RasterSource): RasterRef = RasterRef(source, None) - private[rasterframes] - def defaultLayout(rr: RasterRef): LayoutDefinition = - LayoutDefinition(rr.extent, rr.source.nativeLayout - .getOrElse(TileLayout(1, 1, rr.cols, rr.rows)) - ) - case class RasterRefTile(rr: RasterRef) extends ProjectedRasterTile { val extent: Extent = rr.extent val crs: CRS = rr.crs diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index be27197b5..3e5657f0c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -24,16 +24,16 @@ import java.net.URI import java.time.ZonedDateTime import java.time.format.DateTimeFormatter -import astraea.spark.rasterframes.NOMINAL_TILE_SIZE -import astraea.spark.rasterframes.model.TileContext +import astraea.spark.rasterframes.NOMINAL_TILE_DIMS +import astraea.spark.rasterframes.model.{TileContext, TileDimensions} +import astraea.spark.rasterframes.ref.RasterSource.SINGLEBAND import astraea.spark.rasterframes.tiles.ProjectedRasterTile import astraea.spark.rasterframes.util.GeoTiffInfoSupport import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.raster.io.geotiff.{GeoTiffSegmentLayout, MultibandGeoTiff, Tags} -import geotrellis.raster.split.Split +import geotrellis.raster.io.geotiff.{GeoTiffSegmentLayout, Tags} import geotrellis.spark.io.hadoop.HdfsRangeReader import geotrellis.spark.io.s3.S3Client import geotrellis.spark.io.s3.util.S3RangeReader @@ -66,11 +66,17 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def tags: Option[Tags] - def read(extent: Extent): Raster[MultibandTile] + def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = + readBounds(Seq(bounds), bands).next() - def readAll(): Seq[Raster[MultibandTile]] + def read(extent: Extent, bands: Seq[Int] = SINGLEBAND): Raster[MultibandTile] = + read(rasterExtent.gridBoundsFor(extent, clamp = true), bands) - def nativeLayout: Option[TileLayout] + def readAll( + dims: TileDimensions = NOMINAL_TILE_DIMS, + bands: Seq[Int] = SINGLEBAND): Seq[Raster[MultibandTile]] = layoutBounds(dims).map(read(_, bands)) + + protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] def rasterExtent = RasterExtent(extent, cols, rows) @@ -80,28 +86,47 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def tileContext: TileContext = TileContext(extent, crs) - def nativeTiling: Seq[Extent] = { - nativeLayout - .map { tileLayout => - val layout = LayoutDefinition(extent, tileLayout) - val transform = layout.mapTransform - for { - col <- 0 until tileLayout.layoutCols - row <- 0 until tileLayout.layoutRows - } yield transform(col, row) - } - .getOrElse(Seq(extent)) + def tileLayout(dims: TileDimensions): TileLayout = { + require(dims.cols > 0 && dims.rows > 0, "Non-zero tile sizes") + TileLayout( + layoutCols = math.ceil(this.cols.toDouble / dims.cols).toInt, + layoutRows = math.ceil(this.rows.toDouble / dims.rows).toInt, + tileCols = dims.cols, + tileRows = dims.rows + ) + } + + def layoutExtents(dims: TileDimensions): Seq[Extent] = { + val tl = tileLayout(dims) + val layout = LayoutDefinition(extent, tl) + val transform = layout.mapTransform + for { + col <- 0 until tl.layoutCols + row <- 0 until tl.layoutRows + } yield transform(col, row) + } + + def layoutBounds(dims: TileDimensions): Seq[GridBounds] = { + gridBounds.split(dims.cols, dims.rows).toSeq +// val tl = tileLayout(dims) +// for { +// col <- 0 until tl.layoutCols +// row <- 0 until tl.layoutRows +// cmin = math.min(col * tl.tileCols, cols) +// cmax = math.min((col + 1) * tl.tileCols, cols) +// rmin = math.min(row * tl.tileRows, cols) +// rmax = math.min((row + 1) * tl.tileRows, rows) +// } yield GridBounds(cmin, rmin, cmax, rmax) } } object RasterSource extends LazyLogging { + final val SINGLEBAND = Seq(0) implicit def rsEncoder: ExpressionEncoder[RasterSource] = { RasterSourceUDT // Makes sure UDT is registered first ExpressionEncoder() } - private def _logger = logger - def apply(source: URI, callback: Option[ReadCallback] = None): RasterSource = source.getScheme match { case GDALRasterSource() => GDALRasterSource(source, callback) @@ -169,19 +194,12 @@ object RasterSource extends LazyLogging { override def tags: Option[Tags] = None - override def read(extent: Extent): Raster[MultibandTile] = - Raster(MultibandTile(tile.crop(rasterExtent.gridBoundsFor(extent, false))), extent) - - override def nativeLayout: Option[TileLayout] = Some( - TileLayout( - layoutCols = math.ceil(this.cols.toDouble / NOMINAL_TILE_SIZE).toInt, - layoutRows = math.ceil(this.rows.toDouble / NOMINAL_TILE_SIZE).toInt, - tileCols = NOMINAL_TILE_SIZE, - tileRows = NOMINAL_TILE_SIZE) - ) - - def readAll(): Seq[Raster[MultibandTile]] = - Raster(MultibandTile(tile), extent).split(nativeLayout.get, Split.Options(false, false)).toSeq + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + bounds.map(b => { + val subext = rasterExtent.extentFor(b) + Raster(MultibandTile(tile.crop(b)), subext) + }).toIterator + } } case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) @@ -212,35 +230,29 @@ object RasterSource extends LazyLogging { override def rows: Int = gdal.rows - override def read(extent: Extent): Raster[MultibandTile] = { - callback.foreach { cb => - val grid = rasterExtent.gridBoundsFor(extent, clamp = false) - cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) - } - gdal.read(extent).get - } - - override def readAll(): Seq[Raster[MultibandTile]] = { - val grid = gdal.gridBounds +// override def read(extent: Extent): Raster[MultibandTile] = { +// callback.foreach { cb => +// val grid = rasterExtent.gridBoundsFor(extent, clamp = false) +// cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) +// } +// gdal.read(extent).get +// } +// +// override def readAll(): Seq[Raster[MultibandTile]] = { +// val grid = gdal.gridBounds +// +// callback.foreach { cb => +// cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) +// } +// +// val tiled = grid.split(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE).toTraversable +// +// gdal.readBounds(tiled).toSeq +// } - callback.foreach { cb => - cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) - } - - val tiled = grid.split(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE).toTraversable - - gdal.readBounds(tiled).toSeq - } - - override def nativeLayout: Option[TileLayout] = { - Some( - TileLayout( - cols / NOMINAL_TILE_SIZE + 1, - rows / NOMINAL_TILE_SIZE + 1, - math.min(cols, NOMINAL_TILE_SIZE), - math.min(rows, NOMINAL_TILE_SIZE))) - } override def tags: Option[Tags] = Some(Tags(metadata, List.empty)) + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = + gdal.readBounds(bounds, bands) } object GDALRasterSource { @@ -288,37 +300,48 @@ object RasterSource extends LazyLogging { else None } - def read(extent: Extent): Raster[MultibandTile] = { + override protected def readBounds(bounds: Traversable[GridBounds], + bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { val info = realInfo val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) - val gt = new MultibandGeoTiff( - geoTiffTile, - info.extent, - info.crs, - info.tags, - info.options, - List.empty - ) - gt.crop(extent).raster + val intersectingBounds = bounds.flatMap(_.intersection(this)).toSeq + geoTiffTile.crop(intersectingBounds, bands.toArray).map { case (gb, tile) => + Raster(tile, rasterExtent.extentFor(gb, clamp = true)) + } } - def readAll(): Seq[Raster[MultibandTile]] = { - val info = realInfo - - // Thanks to @pomadchin for showing us how to do this :-) - val windows = info.segmentLayout.listWindows(NOMINAL_TILE_SIZE) - val re = info.rasterExtent +// def read(extent: Extent): Raster[MultibandTile] = { +// val info = realInfo +// val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) +// val gt = new MultibandGeoTiff( +// geoTiffTile, +// info.extent, +// info.crs, +// info.tags, +// info.options, +// List.empty +// ) +// gt.crop(extent).raster +// } +// +// def readAll(): Seq[Raster[MultibandTile]] = { +// val info = realInfo +// +// // Thanks to @pomadchin for showing us how to do this :-) +// val windows = info.segmentLayout.listWindows(NOMINAL_TILE_SIZE) +// val re = info.rasterExtent +// +// val geotile = GeoTiffReader.geoTiffMultibandTile(info) +// +// val rows = windows.map(gb => { +// val tile = geotile.crop(gb) +// val extent = re.extentFor(gb, clamp = false) +// Raster(tile, extent) +// }) +// +// rows.toSeq +// } - val geotile = GeoTiffReader.geoTiffMultibandTile(info) - - val rows = windows.map(gb => { - val tile = geotile.crop(gb) - val extent = re.extentFor(gb, clamp = false) - Raster(tile, extent) - }) - - rows.toSeq - } } case class FileGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) diff --git a/core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala b/core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala index efc4908db..c32d6100f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala @@ -160,13 +160,13 @@ object CellHistogram { } else { val h = tile.histogram - h.binCounts().map(p ⇒ Bin(p._1, p._2)) + h.binCounts().map(p ⇒ Bin(p._1.toDouble, p._2)) } CellHistogram(bins) } def apply(hist: GTHistogram[Int]): CellHistogram = { - CellHistogram(hist.binCounts().map(p ⇒ Bin(p._1, p._2))) + CellHistogram(hist.binCounts().map(p ⇒ Bin(p._1.toDouble, p._2))) } def apply(hist: GTHistogram[Double])(implicit ev: DummyImplicit): CellHistogram = { CellHistogram(hist.binCounts().map(p ⇒ Bin(p._1, p._2))) diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala index a9551dd13..539f46fd2 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala @@ -21,8 +21,8 @@ package astraea.spark.rasterframes.tiles -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO +import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import astraea.spark.rasterframes.model.TileContext import astraea.spark.rasterframes.ref.ProjectedRasterLike import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile @@ -30,7 +30,6 @@ import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.raster.{CellType, ProjectedRaster, Tile} import geotrellis.vector.{Extent, ProjectedExtent} -import org.apache.spark.sql.Encoder import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{StructField, StructType} diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala b/core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala index 724d7eaeb..add36a914 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala @@ -37,7 +37,7 @@ trait GeoTiffInfoSupport { val MAX_SIZE = 256 private def defaultLayout(cols: Int, rows: Int): TileLayout = { def divs(cells: Int) = { - val layoutDivs = math.ceil(cells / MAX_SIZE.toFloat) + val layoutDivs = math.ceil(cells / MAX_SIZE.toDouble) val tileDivs = math.ceil(cells / layoutDivs) (layoutDivs.toInt, tileDivs.toInt) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala b/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala index f9cdfb48e..e83339f2c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala @@ -35,7 +35,7 @@ import org.apache.spark.util.LongAccumulator case class ReadAccumulator(reads: () ⇒ LongAccumulator, bytes: () ⇒ LongAccumulator) extends ReadCallback { override def readRange(source: RasterSource, start: Long, length: Int): Unit = { reads().add(1) - bytes().add(length) + bytes().add(length.toLong) } override def toString: String = s"${productPrefix}(reads=${reads().value}, bytes=${bytes().value})" diff --git a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala index 75ac0f7cf..643950445 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala @@ -74,7 +74,6 @@ case object TileUDT { final val typeName: String = "tile" implicit def tileSerializer: CatalystSerializer[Tile] = new CatalystSerializer[Tile] { - import scala.language.reflectiveCalls override def schema: StructType = StructType(Seq( StructField("cell_context", CatalystSerializer[TileDataContext].schema, false), diff --git a/core/src/main/scala/org/apache/spark/sql/rf/VersionShims.scala b/core/src/main/scala/org/apache/spark/sql/rf/VersionShims.scala index b9eb96981..81418d466 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/VersionShims.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/VersionShims.scala @@ -1,18 +1,18 @@ package org.apache.spark.sql.rf -import java.lang.reflect.{Constructor, Method} +import java.lang.reflect.Constructor import org.apache.spark.sql.catalyst.FunctionIdentifier import org.apache.spark.sql.catalyst.analysis.FunctionRegistry -import org.apache.spark.sql.catalyst.analysis.FunctionRegistry.{FunctionBuilder, expressionInfo} +import org.apache.spark.sql.catalyst.analysis.FunctionRegistry.FunctionBuilder import org.apache.spark.sql.catalyst.catalog.CatalogTable -import org.apache.spark.sql.{AnalysisException, DataFrame, Dataset, SQLContext} -import org.apache.spark.sql.catalyst.expressions.{AttributeReference, BinaryExpression, Expression, ExpressionDescription, ExpressionInfo, RuntimeReplaceable, ScalaUDF} import org.apache.spark.sql.catalyst.expressions.objects.{Invoke, InvokeLike} +import org.apache.spark.sql.catalyst.expressions.{AttributeReference, Expression, ExpressionDescription, ExpressionInfo} import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.execution.datasources.LogicalRelation import org.apache.spark.sql.sources.BaseRelation import org.apache.spark.sql.types.DataType +import org.apache.spark.sql.{AnalysisException, DataFrame, Dataset, SQLContext} import scala.reflect._ import scala.util.{Failure, Success, Try} diff --git a/core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala index da2ab9c56..3e0aa841e 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala @@ -27,9 +27,9 @@ import astraea.spark.rasterframes.tiles.ProjectedRasterTile import geotrellis.proj4.LatLng import geotrellis.raster import geotrellis.raster.testkit.RasterMatchers -import geotrellis.raster.{ArrayTile, BitCellType, ByteUserDefinedNoDataCellType, DoubleConstantNoDataCellType, ShortConstantNoDataCellType, Tile, UByteConstantNoDataCellType} +import geotrellis.raster.{ArrayTile, ByteUserDefinedNoDataCellType, DoubleConstantNoDataCellType, ShortConstantNoDataCellType, Tile, UByteConstantNoDataCellType} import geotrellis.vector.Extent -import org.apache.spark.sql.{AnalysisException, Encoders} +import org.apache.spark.sql.Encoders import org.apache.spark.sql.functions._ import org.scalatest.{FunSpec, Matchers} @@ -58,7 +58,7 @@ class RasterFunctionsSpec extends FunSpec lazy val randDoubleNDTile = TestData.injectND(numND)(randDoubleTile) lazy val randPositiveDoubleTile = TestData.projectedRasterTile(cols, rows, scala.util.Random.nextDouble() + 1e-6, extent, crs, DoubleConstantNoDataCellType) - val expectedRandNoData: Long = numND * tileCount + val expectedRandNoData: Long = numND * tileCount.toLong val expectedRandData: Long = cols * rows * tileCount - expectedRandNoData lazy val randNDTilesWithNull = Seq.fill[Tile](tileCount)(injectND(numND)( TestData.randomTile(cols, rows, UByteConstantNoDataCellType) diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala index b6e7da48b..0c4045f8a 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala @@ -23,10 +23,7 @@ import java.nio.file.Paths import java.time.ZonedDateTime import astraea.spark.rasterframes.expressions.tilestats.NoDataCells -import astraea.spark.rasterframes.model.TileContext import astraea.spark.rasterframes.tiles.ProjectedRasterTile -import astraea.spark.rasterframes.{functions => F} -import org.locationtech.jts.geom.{Coordinate, GeometryFactory} import geotrellis.proj4.{CRS, LatLng} import geotrellis.raster import geotrellis.raster._ @@ -38,6 +35,7 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.commons.io.IOUtils import org.apache.spark.SparkContext import org.apache.spark.sql.SparkSession +import org.locationtech.jts.geom.{Coordinate, GeometryFactory} import scala.reflect.ClassTag diff --git a/core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala index 781b8290d..939ae1a46 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala @@ -19,13 +19,11 @@ package astraea.spark.rasterframes -import astraea.spark.rasterframes.TestData.randomTile -import astraea.spark.rasterframes.TestData.fracTile -import astraea.spark.rasterframes.expressions.aggstats.LocalMeanAggregate +import astraea.spark.rasterframes.TestData.{fracTile, randomTile} import astraea.spark.rasterframes.stats.CellHistogram import geotrellis.raster._ -import geotrellis.spark._ import geotrellis.raster.mapalgebra.local.{Max, Min} +import geotrellis.spark._ import org.apache.spark.sql.functions._ /** @@ -35,8 +33,8 @@ import org.apache.spark.sql.functions._ * @since 9/18/17 */ class TileStatsSpec extends TestEnvironment with TestData { - import sqlContext.implicits._ import TestData.injectND + import sqlContext.implicits._ describe("computing statistics over tiles") { //import org.apache.spark.sql.execution.debug._ diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala index ad29e0e0e..839ae1792 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala @@ -23,10 +23,10 @@ package astraea.spark.rasterframes.ref import astraea.spark.rasterframes.TestEnvironment.ReadMonitor import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.expressions.accessors._ +import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile -import geotrellis.raster.{GridBounds, Tile} +import geotrellis.raster.Tile import geotrellis.vector.Extent /** diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 1559c3c67..86bd29251 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -22,9 +22,9 @@ package astraea.spark.rasterframes.ref import astraea.spark.rasterframes.TestEnvironment.ReadMonitor +import astraea.spark.rasterframes.model.TileDimensions import astraea.spark.rasterframes.ref.RasterSource.GDALRasterSource import astraea.spark.rasterframes.{TestData, TestEnvironment} -import geotrellis.raster.io.geotiff.GeoTiff import geotrellis.vector.Extent import org.apache.spark.sql.rf.RasterSourceUDT @@ -47,6 +47,22 @@ class RasterSourceSpec extends TestEnvironment with TestData { it("should identify as UDT") { assert(new RasterSourceUDT() === new RasterSourceUDT()) } + val rs = RasterSource(getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI) + it("should provide a tile layout") { + val layout = rs.tileLayout(TileDimensions(64, 64)) + layout.totalCols shouldBe >= (rs.cols.toLong) + layout.totalRows shouldBe >= (rs.rows.toLong) + } + it("should compute nominal tile layout bounds") { + val bounds = rs.layoutBounds(TileDimensions(64, 64)) + val agg = bounds.reduce(_ combine _) + agg should be (rs.gridBounds) + } + it("should compute nominal tile layout extents") { + val extents = rs.layoutExtents(TileDimensions(64, 64)) + val agg = extents.reduce(_ combine _) + agg should be (rs.extent) + } } describe("HTTP RasterSource") { @@ -158,10 +174,10 @@ class RasterSourceSpec extends TestEnvironment with TestData { assert(totalCells === src.size) - subrasters.zipWithIndex.foreach{case (r, i) ⇒ - // TODO: how to test? - GeoTiff(r, src.crs).write(s"target/$i.tiff") - } +// subrasters.zipWithIndex.foreach{case (r, i) ⇒ +// // TODO: how to test? +// GeoTiff(r, src.crs).write(s"target/$i.tiff") +// } } } } diff --git a/core/src/test/scala/examples/CreatingRasterFrames.scala b/core/src/test/scala/examples/CreatingRasterFrames.scala index f7a69043a..311de3dbc 100644 --- a/core/src/test/scala/examples/CreatingRasterFrames.scala +++ b/core/src/test/scala/examples/CreatingRasterFrames.scala @@ -35,11 +35,9 @@ object CreatingRasterFrames extends App { import astraea.spark.rasterframes._ import geotrellis.raster._ - import geotrellis.raster.render._ - import geotrellis.spark.io._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff + import geotrellis.spark.io._ import org.apache.spark.sql._ - import org.apache.spark.sql.functions._ // Next, initialize the `SparkSession`, and call the `withRasterFrames` method on it: @@ -47,8 +45,6 @@ object CreatingRasterFrames extends App { master("local[*]").appName("RasterFrames"). getOrCreate(). withRasterFrames - - import spark.implicits._ spark.sparkContext.setLogLevel("ERROR") // ## From `ProjectedExtent` diff --git a/core/src/test/scala/examples/Exporting.scala b/core/src/test/scala/examples/Exporting.scala index 247e93944..79af79fd0 100644 --- a/core/src/test/scala/examples/Exporting.scala +++ b/core/src/test/scala/examples/Exporting.scala @@ -22,11 +22,9 @@ import java.nio.file.Files import astraea.spark.rasterframes._ import geotrellis.raster._ +import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.raster.render._ -import geotrellis.raster.io.geotiff.{GeoTiff, SinglebandGeoTiff} import geotrellis.spark.{LayerId, SpatialKey} -import geotrellis.spark.io.LayerWriter -import geotrellis.spark.io.file.{FileAttributeStore, FileLayerWriter} import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import spray.json.JsValue @@ -76,8 +74,6 @@ object Exporting extends App { // // // Let's assume we have a RasterFrame we've done some fancy processing on: - - import geotrellis.raster.equalization._ val equalizer = udf((t: Tile) => t.equalize()) val equalized = rf.withColumn("equalized", equalizer($"tile")).asRF diff --git a/core/src/test/scala/examples/Masking.scala b/core/src/test/scala/examples/Masking.scala index bc9c59213..00169b622 100644 --- a/core/src/test/scala/examples/Masking.scala +++ b/core/src/test/scala/examples/Masking.scala @@ -2,11 +2,10 @@ package examples import astraea.spark.rasterframes._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import org.apache.spark.sql._ -import geotrellis.raster.{mask => _, _} import geotrellis.raster.render._ +import geotrellis.raster.{mask => _, _} +import org.apache.spark.sql._ import org.apache.spark.sql.functions._ -import astraea.spark.rasterframes.stats.{CellHistogram=>CH} object Masking extends App { diff --git a/core/src/test/scala/examples/MeanValue.scala b/core/src/test/scala/examples/MeanValue.scala index d2190a241..ca0576e02 100644 --- a/core/src/test/scala/examples/MeanValue.scala +++ b/core/src/test/scala/examples/MeanValue.scala @@ -22,7 +22,6 @@ package examples import astraea.spark.rasterframes._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff import org.apache.spark.sql.SparkSession -import org.apache.spark.sql.functions._ /** * Compute the cell mean value of an image. diff --git a/core/src/test/scala/examples/NaturalColorComposite.scala b/core/src/test/scala/examples/NaturalColorComposite.scala index 3dee4092c..1a3e212ac 100644 --- a/core/src/test/scala/examples/NaturalColorComposite.scala +++ b/core/src/test/scala/examples/NaturalColorComposite.scala @@ -20,11 +20,8 @@ package examples -import java.nio.file.{CopyOption, StandardCopyOption} - +import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.raster.{MultibandTile, UByteConstantNoDataCellType} -import geotrellis.raster.io.geotiff.{GeoTiff, SinglebandGeoTiff} -import geotrellis.raster.render._ /** * diff --git a/core/src/test/scala/examples/Scratch.scala b/core/src/test/scala/examples/Scratch.scala index fca8c4785..565b4c31c 100644 --- a/core/src/test/scala/examples/Scratch.scala +++ b/core/src/test/scala/examples/Scratch.scala @@ -20,8 +20,6 @@ package examples import astraea.spark.rasterframes._ -import geotrellis.spark.io.kryo.KryoRegistrator -import org.apache.spark.serializer.KryoSerializer import org.apache.spark.sql._ /** @@ -33,14 +31,11 @@ object Scratch extends App { implicit val spark = SparkSession.builder() .master("local[*]") .appName(getClass.getName) - .config("spark.serializer", classOf[KryoSerializer].getName) - .config("spark.kryoserializer.buffer.max", "500m") - .config("spark.kryo.registrationRequired", "false") - .config("spark.kryo.registrator", classOf[KryoRegistrator].getName) + .withKryoSerialization .getOrCreate() .withRasterFrames - import spark.implicits._ + // import spark.implicits._ // Your Spark code here..... diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index 2f69d4425..d9f6e5e05 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -31,7 +31,6 @@ import geotrellis.spark.io.hadoop.HadoopGeoTiffRDD import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.hadoop.fs.Path import org.apache.spark.rdd.RDD -import org.apache.spark.sql.jts.JTSTypes import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.sources.{BaseRelation, PrunedScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala index 5af7f1e3f..36edf16a7 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala @@ -21,16 +21,14 @@ package astraea.spark.rasterframes.datasource.geotrellis import java.net.URI -import astraea.spark.rasterframes import astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisCatalog.GeoTrellisCatalogRelation -import astraea.spark.rasterframes.util.time import geotrellis.spark.io.AttributeStore import org.apache.spark.annotation.Experimental import org.apache.spark.rdd.RDD import org.apache.spark.sql._ +import org.apache.spark.sql.functions._ import org.apache.spark.sql.rf.VersionShims import org.apache.spark.sql.sources._ -import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.StructType import spray.json.DefaultJsonProtocol._ import spray.json._ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala index 545c1f236..5f3304d05 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala @@ -79,12 +79,12 @@ package object geotrellis extends DataSourceOptions { implicit class GeoTrellisReaderWithRF(val reader: GeoTrellisRasterFrameReader) { def withTileSubdivisions(divs: Int): GeoTrellisRasterFrameReader = tag[GeoTrellisRasterFrameReaderTag][DataFrameReader]( - reader.option(TILE_SUBDIVISIONS_PARAM, divs) + reader.option(TILE_SUBDIVISIONS_PARAM, divs.toLong) ) def withNumPartitions(partitions: Int): GeoTrellisRasterFrameReader = tag[GeoTrellisRasterFrameReaderTag][DataFrameReader]( - reader.option(NUM_PARTITIONS_PARAM, partitions) + reader.option(NUM_PARTITIONS_PARAM, partitions.toLong) ) def loadRF(uri: URI, id: LayerId): RasterFrame = diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala index 6962e9a11..970244883 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala @@ -21,8 +21,6 @@ package astraea.spark.rasterframes import java.net.URI -import org.apache.spark.sql.sources.{And, Filter} - import scala.util.Try /** diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala index e69a5414a..02e86086e 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.datasource.geotrellis import java.io.File import astraea.spark.rasterframes._ -import geotrellis.proj4.{CRS, LatLng, Sinusoidal} +import geotrellis.proj4.LatLng import geotrellis.spark._ import geotrellis.spark.io._ import geotrellis.spark.io.index.ZCurveKeyIndexMethod diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 009382639..68225cc3a 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -40,7 +40,7 @@ import geotrellis.vector._ import org.apache.avro.generic._ import org.apache.avro.{Schema, SchemaBuilder} import org.apache.hadoop.fs.FileUtil -import org.apache.spark.sql.functions.{udf ⇒ sparkUdf} +import org.apache.spark.sql.functions.{udf => sparkUdf} import org.apache.spark.sql.{DataFrame, Row} import org.apache.spark.storage.StorageLevel import org.scalatest.{BeforeAndAfterAll, Inspectors} diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala index 5d475f263..dbff2225a 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala @@ -151,8 +151,6 @@ class TileFeatureSupportSpec extends TestEnvironment object TileFeatureSupportSpec { - import scala.language.implicitConversions - implicit class RichRandom(val rnd: scala.util.Random) extends AnyVal { def nextDouble(max: Double): Double = (rnd.nextInt * max) / Int.MaxValue.toDouble def nextOrderedPair(max:Double): (Double,Double) = (nextDouble(max),nextDouble(max)) match { diff --git a/datasource/src/test/scala/examples/Creating.scala b/datasource/src/test/scala/examples/Creating.scala index 174bbaa3f..a6e691ac1 100644 --- a/datasource/src/test/scala/examples/Creating.scala +++ b/datasource/src/test/scala/examples/Creating.scala @@ -22,8 +22,6 @@ package examples import java.io.File import java.nio.file.Files -import geotrellis.raster.{Raster, Tile} - /** * Examples of creating RasterFrames * @@ -58,7 +56,6 @@ And, ss is standard Spark SQL practice, we import additional DataFrame support: */ // tut:silent -import spark.implicits._ // tut:invisible spark.sparkContext.setLogLevel("ERROR") diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala index 688866a93..d37a7fd42 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala +++ b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.experimental.datasource.awspds import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.util.ReadAccumulator import org.apache.spark.sql.DataFrame import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala index 845f5aad3..aa2d33353 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -22,7 +22,6 @@ package astraea.spark.rasterframes.experimental.datasource.awspds import astraea.spark.rasterframes._ import astraea.spark.rasterframes.encoders.CatalystSerializer -import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.experimental.datasource.awspds.L8Relation.Bands import astraea.spark.rasterframes.expressions.transformers.{RasterSourceToRasterRefs, URIToRasterSource} import astraea.spark.rasterframes.ref.RasterRef diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 716d70fdd..455629a67 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -35,7 +35,12 @@ object RFProjectPlugin extends AutoPlugin { description := "RasterFrames brings the power of Spark DataFrames to geospatial raster data, empowered by the map algebra and tile layer operations of GeoTrellis", licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html")), scalaVersion := "2.11.12", - scalacOptions ++= Seq("-feature", "-deprecation"), + scalacOptions ++= Seq( + "-feature", + "-deprecation", + "-Ywarn-dead-code", + "-Ywarn-unused-import" + ), scalacOptions in (Compile, doc) ++= Seq("-no-link-warnings"), javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), cancelable in Global := true, diff --git a/project/RFReleasePlugin.scala b/project/RFReleasePlugin.scala index 8d439927b..7eef23231 100644 --- a/project/RFReleasePlugin.scala +++ b/project/RFReleasePlugin.scala @@ -24,11 +24,13 @@ import sbt.Keys._ import sbt._ import sbtrelease.ReleasePlugin.autoImport.ReleaseTransformations._ import sbtrelease.ReleasePlugin.autoImport._ -import com.servicerocket.sbt.release.git.flow.Steps._ import com.typesafe.sbt.sbtghpages.GhpagesPlugin import com.typesafe.sbt.sbtghpages.GhpagesPlugin.autoImport.ghpagesPushSite import com.typesafe.sbt.site.SitePlugin import com.typesafe.sbt.site.SitePlugin.autoImport.makeSite +import scala.sys.process.{Process => SProcess} + +/** Release process support. */ object RFReleasePlugin extends AutoPlugin { override def trigger: PluginTrigger = noTrigger override def requires = RFProjectPlugin && SitePlugin && GhpagesPlugin @@ -42,18 +44,20 @@ object RFReleasePlugin extends AutoPlugin { checkSnapshotDependencies, checkGitFlowExists, inquireVersions, + runClean, runTest, gitFlowReleaseStart, setReleaseVersion, buildSite, - publishSite, commitReleaseVersion, tagRelease, releaseStepCommand("publishSigned"), releaseStepCommand("sonatypeReleaseAll"), + publishSite, gitFlowReleaseFinish, setNextVersion, - commitNextVersion + commitNextVersion, + remindMeToPush ), commands += Command.command("bumpVersion"){ st ⇒ val extracted = Project.extract(st) @@ -68,4 +72,36 @@ object RFReleasePlugin extends AutoPlugin { } ) } + + def releaseVersion(state: State): String = + state.get(ReleaseKeys.versions).map(_._1).getOrElse { + sys.error("No versions are set! Was this release part executed before inquireVersions?") + } + + val gitFlowReleaseStart = ReleaseStep(state ⇒ { + val version = releaseVersion(state) + SProcess(Seq("git", "flow", "release", "start", version)).! + state + }) + + val gitFlowReleaseFinish = ReleaseStep(state ⇒ { + val version = releaseVersion(state) + SProcess(Seq("git", "flow", "release", "finish", "-n", s"$version")).! + state + }) + + val remindMeToPush = ReleaseStep(state ⇒ { + state.log.warn("Don't forget to git push master AND develop!") + state + }) + + val checkGitFlowExists = ReleaseStep(state => { + SProcess(Seq("command", "-v", "git-flow")).!! match { + case "" => sys.error("git-flow is required for release. See https://github.com/nvie/gitflow for installation instructions.") + case _ => SProcess(Seq("git", "flow", "init", "-d")).! match { + case 0 => state + case e => sys.error(s"git-flow init failed with error code $e") + } + } + }) } diff --git a/project/plugins.sbt b/project/plugins.sbt index 1ac9bcfa4..75617f14d 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -2,7 +2,6 @@ logLevel := sbt.Level.Error resolvers += Resolver.bintrayIvyRepo("s22s", "sbt-plugins") addSbtCoursier -addSbtPlugin("com.servicerocket" % "sbt-git-flow" % "0.1.3-astraea.1") addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0") addSbtPlugin("de.heikoseeberger" % "sbt-header" % "3.0.2") From e84de49ab13419f92e3d8f8e6443184890467ce6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 28 Mar 2019 13:46:40 -0400 Subject: [PATCH 020/380] Remove read callbacks due to incompatibility with GeoTrellis RasterSource. --- .../rasterframes/bench/RasterRefBench.scala | 46 +---- .../transformers/URIToRasterSource.scala | 11 +- .../spark/rasterframes/ref/RasterSource.scala | 174 +++--------------- .../rasterframes/util/RFKryoRegistrator.scala | 1 - .../rasterframes/util/ReadAccumulator.scala | 50 ----- core/src/test/resources/application.conf | 6 +- .../spark/rasterframes/TestEnvironment.scala | 13 -- .../rasterframes/ref/RasterRefSpec.scala | 9 +- .../rasterframes/ref/RasterSourceSpec.scala | 49 ----- .../datasource/awspds/L8RelationTest.scala | 2 - .../datasource/awspds/L8DataSource.scala | 8 +- .../datasource/awspds/L8Relation.scala | 7 +- project/plugins.sbt | 1 + 13 files changed, 40 insertions(+), 337 deletions(-) delete mode 100644 core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala index c68c826e8..a2a9104bf 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala @@ -24,11 +24,9 @@ package astraea.spark.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes import astraea.spark.rasterframes._ import astraea.spark.rasterframes.expressions.transformers.RasterSourceToTiles import astraea.spark.rasterframes.ref.RasterSource -import astraea.spark.rasterframes.ref.RasterSource.ReadCallback import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ import org.openjdk.jmh.annotations._ @@ -48,18 +46,8 @@ class RasterRefBench extends SparkEnv with LazyLogging { @Setup(Level.Trial) def setupData(): Unit = { - val watcher = new ReadCallback { - var count: Long = 0 - var calls: Int = 0 - override def readRange(source: RasterSource, start: Long, length: Int): Unit = { - calls += 1 - count += length - logger.debug("%4d -- %,d bytes".format(calls, count)) - } - } - - val r1 = RasterSource(remoteCOGSingleband1, Some(watcher)) - val r2 = RasterSource(remoteCOGSingleband2, Some(watcher)) + val r1 = RasterSource(remoteCOGSingleband1) + val r2 = RasterSource(remoteCOGSingleband2) singleDF = Seq((r1, r2)).toDF("B1", "B2") .select(RasterSourceToTiles(false, $"B1", $"B2")) @@ -98,32 +86,4 @@ class RasterRefBench extends SparkEnv with LazyLogging { singleDF.select(agg_stats(normalized_difference($"B1", $"B2"))).collect() } -} - -object RasterRefBench { - -// import org.openjdk.jmh.runner.RunnerException -// import org.openjdk.jmh.runner.options.OptionsBuilder -// -// @throws[RunnerException] - def main(args: Array[String]): Unit = { - - val thing = new RasterRefBench() - thing.setupData() - rasterframes.util.time("compute stats expanded") { - thing.computeStatsSingle() - } - - rasterframes.util.time("compute stats single") { - thing.computeStatsExpanded() - } - - // val opt = new OptionsBuilder() -// .include(classOf[RasterRefBench].getSimpleName) -// .threads(4) -// .forks(5) -// .build() -// -// new Runner(opt).run() - } -} +} \ No newline at end of file diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala index 0821e43db..a10a6db7f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -23,7 +23,6 @@ package astraea.spark.rasterframes.expressions.transformers import java.net.URI -import astraea.spark.rasterframes.ref.RasterSource.ReadCallback import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback @@ -40,7 +39,7 @@ import org.apache.spark.unsafe.types.UTF8String * * @since 5/4/18 */ -case class URIToRasterSource(override val child: Expression, accumulator: Option[ReadCallback]) +case class URIToRasterSource(override val child: Expression) extends UnaryExpression with ExpectsInputTypes with CodegenFallback with LazyLogging { override def nodeName: String = "uri_to_raster_source" @@ -52,16 +51,12 @@ case class URIToRasterSource(override val child: Expression, accumulator: Option override protected def nullSafeEval(input: Any): Any = { val uriString = input.asInstanceOf[UTF8String].toString val uri = URI.create(uriString) - val ref = RasterSource(uri, accumulator) + val ref = RasterSource(uri) RasterSourceUDT.serialize(ref) } } object URIToRasterSource { def apply(rasterURI: Column): TypedColumn[Any, RasterRef] = - new Column(new URIToRasterSource(rasterURI.expr, None)).as[RasterRef] - def apply(rasterURI: Column, accumulator: ReadCallback): TypedColumn[Any, RasterRef] = - new Column(new URIToRasterSource(rasterURI.expr, Option(accumulator))).as[RasterRef] - def apply(rasterURI: Column, accumulator: Option[ReadCallback]): TypedColumn[Any, RasterRef] = - new Column(new URIToRasterSource(rasterURI.expr, accumulator)).as[RasterRef] + new Column(new URIToRasterSource(rasterURI.expr)).as[RasterRef] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 3e5657f0c..4c9d0a0fd 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -21,8 +21,6 @@ package astraea.spark.rasterframes.ref import java.net.URI -import java.time.ZonedDateTime -import java.time.format.DateTimeFormatter import astraea.spark.rasterframes.NOMINAL_TILE_DIMS import astraea.spark.rasterframes.model.{TileContext, TileDimensions} @@ -47,7 +45,6 @@ import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT import scala.collection.JavaConverters._ -import scala.util.Try /** * Abstraction over fetching geospatial raster data. @@ -108,15 +105,6 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def layoutBounds(dims: TileDimensions): Seq[GridBounds] = { gridBounds.split(dims.cols, dims.rows).toSeq -// val tl = tileLayout(dims) -// for { -// col <- 0 until tl.layoutCols -// row <- 0 until tl.layoutRows -// cmin = math.min(col * tl.tileCols, cols) -// cmax = math.min((col + 1) * tl.tileCols, cols) -// rmin = math.min(row * tl.tileRows, cols) -// rmax = math.min((row + 1) * tl.tileRows, rows) -// } yield GridBounds(cmin, rmin, cmax, rmax) } } @@ -127,22 +115,22 @@ object RasterSource extends LazyLogging { ExpressionEncoder() } - def apply(source: URI, callback: Option[ReadCallback] = None): RasterSource = + def apply(source: URI): RasterSource = source.getScheme match { - case GDALRasterSource() => GDALRasterSource(source, callback) - case "http" | "https" => HttpGeoTiffRasterSource(source, callback) - case "file" => FileGeoTiffRasterSource(source, callback) + case GDALRasterSource() => GDALRasterSource(source) + case "http" | "https" => HttpGeoTiffRasterSource(source) + case "file" => FileGeoTiffRasterSource(source) case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" => // TODO: How can we get the active hadoop configuration // TODO: without having to pass it through? val config = () => new Configuration() - HadoopGeoTiffRasterSource(source, config, callback) + HadoopGeoTiffRasterSource(source, config) case "s3" => val client = () => S3Client.DEFAULT - S3GeoTiffRasterSource(source, client, callback) + S3GeoTiffRasterSource(source, client) case s if s.startsWith("gdal+") => val cleaned = new URI(source.toASCIIString.replace("gdal+", "")) - apply(cleaned, callback) + apply(cleaned) case s => throw new UnsupportedOperationException(s"Scheme '$s' not supported") } @@ -170,9 +158,6 @@ object RasterSource extends LazyLogging { info.noDataValue) } - // According to https://goo.gl/2z8xx9 the GeoTIFF date format is 'YYYY:MM:DD HH:MM:SS' - private val dateFormat = DateTimeFormatter.ofPattern("yyyy:MM:dd HH:mm:ss") - trait URIRasterSource { _: RasterSource => def source: URI @@ -202,14 +187,19 @@ object RasterSource extends LazyLogging { } } - case class GDALRasterSource(source: URI, callback: Option[ReadCallback]) + case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSource { import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} @transient private lazy val gdal = { val cleaned = source.toASCIIString.replace("gdal+", "") - VLMRasterSource(cleaned) + // VSIPath doesn't like "file:/path..." + val tweaked = if (cleaned.matches("^file:/[^/].*")) + cleaned.replace("file:", "") + else cleaned + + VLMRasterSource(tweaked) } override def crs: CRS = gdal.crs @@ -230,29 +220,10 @@ object RasterSource extends LazyLogging { override def rows: Int = gdal.rows -// override def read(extent: Extent): Raster[MultibandTile] = { -// callback.foreach { cb => -// val grid = rasterExtent.gridBoundsFor(extent, clamp = false) -// cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) -// } -// gdal.read(extent).get -// } -// -// override def readAll(): Seq[Raster[MultibandTile]] = { -// val grid = gdal.gridBounds -// -// callback.foreach { cb => -// cb.readRange(this, 0, grid.size.toInt * cellType.bytes * bandCount) -// } -// -// val tiled = grid.split(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE).toTraversable -// -// gdal.readBounds(tiled).toSeq -// } - override def tags: Option[Tags] = Some(Tags(metadata, List.empty)) - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { gdal.readBounds(bounds, bands) + } } object GDALRasterSource { @@ -282,8 +253,6 @@ object RasterSource extends LazyLogging { def extent: Extent = tiffInfo.extent - def timestamp: Option[ZonedDateTime] = dateFromMetadata(tiffInfo.tags.headTags) - override def cols: Int = tiffInfo.rasterExtent.cols override def rows: Int = tiffInfo.rasterExtent.rows @@ -309,126 +278,33 @@ object RasterSource extends LazyLogging { Raster(tile, rasterExtent.extentFor(gb, clamp = true)) } } - -// def read(extent: Extent): Raster[MultibandTile] = { -// val info = realInfo -// val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) -// val gt = new MultibandGeoTiff( -// geoTiffTile, -// info.extent, -// info.crs, -// info.tags, -// info.options, -// List.empty -// ) -// gt.crop(extent).raster -// } -// -// def readAll(): Seq[Raster[MultibandTile]] = { -// val info = realInfo -// -// // Thanks to @pomadchin for showing us how to do this :-) -// val windows = info.segmentLayout.listWindows(NOMINAL_TILE_SIZE) -// val re = info.rasterExtent -// -// val geotile = GeoTiffReader.geoTiffMultibandTile(info) -// -// val rows = windows.map(gb => { -// val tile = geotile.crop(gb) -// val extent = re.extentFor(gb, clamp = false) -// Raster(tile, extent) -// }) -// -// rows.toSeq -// } - } - case class FileGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) + case class FileGeoTiffRasterSource(source: URI) extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient - protected lazy val rangeReader = { - val base = FileRangeReader(source.getPath) - // TODO: DRY - callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) - } + protected lazy val rangeReader = FileRangeReader(source.getPath) } case class HadoopGeoTiffRasterSource( - source: URI, - config: () => Configuration, - callback: Option[ReadCallback]) + source: URI, config: () => Configuration) extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient - protected lazy val rangeReader = { - val base = HdfsRangeReader(new Path(source.getPath), config()) - callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) - } + protected lazy val rangeReader = HdfsRangeReader(new Path(source.getPath), config()) } case class S3GeoTiffRasterSource( - source: URI, - client: () => S3Client, - callback: Option[ReadCallback]) + source: URI, client: () => S3Client) extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient - protected lazy val rangeReader = { - val base = S3RangeReader(source, client()) - callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) - } + protected lazy val rangeReader = S3RangeReader(source, client()) } - case class HttpGeoTiffRasterSource(source: URI, callback: Option[ReadCallback]) + case class HttpGeoTiffRasterSource(source: URI) extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient - protected lazy val rangeReader = { - val base = HttpRangeReader(source) - callback.map(cb => ReportingRangeReader(base, cb, self)).getOrElse(base) - } - - override def timestamp: Option[ZonedDateTime] = - dateFromMetadata(tiffInfo.tags.headTags) - .orElse { - val hrr = rangeReader match { - case h: HttpRangeReader => h - case ReportingRangeReader(h: HttpRangeReader, _, _) => h - } - hrr.response.headers - .get("Last-Modified") - .flatMap(_.headOption) - .flatMap(s => - Try(ZonedDateTime.parse(s, DateTimeFormatter.RFC_1123_DATE_TIME)).toOption) - } - } - - private[ref] def dateFromMetadata(meta: Map[String, String]): Option[ZonedDateTime] = - meta - .get(Tags.TIFFTAG_DATETIME) - .flatMap(ds => - Try({ - logger.debug("Parsing header date: " + ds) - ZonedDateTime.parse(ds, dateFormat) - }).toOption) - - /** Trait for registering a callback for logging or monitoring range reads. - * NB: the callback will be invoked from within a Spark task, and therefore - * is serialized along with its closure to executors. */ - trait ReadCallback extends Serializable { - def readRange(source: RasterSource, start: Long, length: Int): Unit - } - - private case class ReportingRangeReader( - delegate: RangeReader, - callback: ReadCallback, - parent: RasterSource) - extends RangeReader { - override def totalLength: Long = delegate.totalLength - - override protected def readClippedRange(start: Long, length: Int): Array[Byte] = { - callback.readRange(parent, start, length) - delegate.readRange(start, length) - } + protected lazy val rangeReader = HttpRangeReader(source) } trait URIRasterSourceDebugString { _: RangeReaderRasterSource with URIRasterSource with Product => @@ -446,8 +322,6 @@ object RasterSource extends LazyLogging { buf.append(crs) buf.append(", extent=") buf.append(extent) - buf.append(", timestamp=") - buf.append(timestamp) buf.append(")") buf.toString } diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala b/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala index 58fb62121..ae8bf03f9 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala @@ -36,7 +36,6 @@ import com.esotericsoftware.kryo.Kryo class RFKryoRegistrator extends geotrellis.spark.io.kryo.KryoRegistrator { override def registerClasses(kryo: Kryo): Unit = { super.registerClasses(kryo) - kryo.register(classOf[ReadCallback]) kryo.register(classOf[RasterSource]) kryo.register(classOf[RasterRef]) kryo.register(classOf[RasterRefTile]) diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala b/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala deleted file mode 100644 index e83339f2c..000000000 --- a/core/src/main/scala/astraea/spark/rasterframes/util/ReadAccumulator.scala +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package astraea.spark.rasterframes.util - -import astraea.spark.rasterframes.ref.RasterSource -import astraea.spark.rasterframes.ref.RasterSource.ReadCallback -import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.SparkContext -import org.apache.spark.util.LongAccumulator - -/** - * Support for keeping counts of read operations from RasterSource-s - * - * @since 9/3/18 - */ -case class ReadAccumulator(reads: () ⇒ LongAccumulator, bytes: () ⇒ LongAccumulator) extends ReadCallback { - override def readRange(source: RasterSource, start: Long, length: Int): Unit = { - reads().add(1) - bytes().add(length.toLong) - } - override def toString: String = - s"${productPrefix}(reads=${reads().value}, bytes=${bytes().value})" -} - -object ReadAccumulator extends LazyLogging { - def apply(sc: SparkContext, prefix: String): ReadAccumulator = this.synchronized { - val reads = sc.longAccumulator(prefix + ".reads") - val bytes = sc.longAccumulator(prefix + ".bytes") - new ReadAccumulator(() ⇒ reads, () ⇒ bytes) - } -} \ No newline at end of file diff --git a/core/src/test/resources/application.conf b/core/src/test/resources/application.conf index d2283141c..b274441dd 100644 --- a/core/src/test/resources/application.conf +++ b/core/src/test/resources/application.conf @@ -2,9 +2,11 @@ gdal { settings { options { // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options - CPL_DEBUG = "ON" + CPL_DEBUG = "OFF" + // TIFF_USE_OVR = "NO" + // GDAL_TIFF_INTERNAL_MASK = "YES" } // set this to `false` if CPL_DEBUG is `ON` - useExceptions: false + useExceptions: true } } \ No newline at end of file diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala b/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala index c8d244be9..84d2e3fe2 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala @@ -20,8 +20,6 @@ package astraea.spark.rasterframes import java.nio.file.{Files, Paths} import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.stringEnc -import astraea.spark.rasterframes.ref.RasterSource -import astraea.spark.rasterframes.ref.RasterSource.ReadCallback import astraea.spark.rasterframes.util.toParquetFriendlyColumnName import com.typesafe.scalalogging.LazyLogging import org.locationtech.jts.geom.Geometry @@ -95,16 +93,5 @@ trait TestEnvironment extends FunSpec with GeoTrellisTestEnvironment } object TestEnvironment { - case class ReadMonitor(ignoreHeader: Boolean = true) extends ReadCallback with LazyLogging { - var reads: Int = 0 - var total: Long = 0 - override def readRange(source: RasterSource, start: Long, length: Int): Unit = { - logger.trace(s"Reading $length at $start from $source") - // Ignore header reads - if(!ignoreHeader || start > 0) reads += 1 - total += length - } - override def toString: String = s"$productPrefix(reads=$reads, total=$total)" - } } \ No newline at end of file diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala index 839ae1792..4f7b77563 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.ref -import astraea.spark.rasterframes.TestEnvironment.ReadMonitor import astraea.spark.rasterframes._ import astraea.spark.rasterframes.expressions.accessors._ import astraea.spark.rasterframes.expressions.transformers._ @@ -45,8 +44,7 @@ class RasterRefSpec extends TestEnvironment with TestData { } trait Fixture { - val counter = new ReadMonitor(false) - val src = RasterSource(remoteCOGSingleband1, Some(counter)) + val src = RasterSource(remoteCOGSingleband1) val fullRaster = RasterRef(src) val subExtent = sub(src.extent) val subRaster = RasterRef(src, Option(subExtent)) @@ -134,22 +132,18 @@ class RasterRefSpec extends TestEnvironment with TestData { it("should delay reading") { new Fixture { assert(subRaster.cellType === src.cellType) - assert(counter.reads === 0) } } it("should support subextents") { new Fixture { assert(subRaster.cols.toDouble === src.cols * 0.01 +- 2.0) assert(subRaster.rows.toDouble === src.rows * 0.01 +- 2.0) - assert(counter.reads === 0) //subRaster.tile.rescale(0, 255).renderPng().write("target/foo1.png") } } it("should be realizable") { new Fixture { - assert(counter.reads === 0) assert(subRaster.tile.statistics.map(_.dataCells) === Some(subRaster.cols * subRaster.rows)) - assert(counter.reads > 0) } } @@ -187,6 +181,5 @@ class RasterRefSpec extends TestEnvironment with TestData { assert(refs.count() > 1) } } - } } diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 86bd29251..18f89dbf4 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -21,15 +21,11 @@ package astraea.spark.rasterframes.ref -import astraea.spark.rasterframes.TestEnvironment.ReadMonitor import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.ref.RasterSource.GDALRasterSource import astraea.spark.rasterframes.{TestData, TestEnvironment} import geotrellis.vector.Extent import org.apache.spark.sql.rf.RasterSourceUDT -import scala.language.reflectiveCalls - /** * * @@ -112,51 +108,6 @@ class RasterSourceSpec extends TestEnvironment with TestData { } } - describe("Caching") { - val localSrc = geotiffDir.resolve("LC08_B7_Memphis_COG.tiff").toUri - - trait Fixture { - val counter = ReadMonitor(false) - val src = RasterSource(localSrc, Some(counter)) - } - - it("should cache headers")(new Fixture { - val e = src.extent - val startReads = counter.reads - - val c = src.crs - val e2 = src.extent - val ct = src.cellType - counter.reads should be(startReads) - }) - - it("should Spark serialize caching")(new Fixture { - - import spark.implicits._ - - val origType = src.getClass - - val e = src.extent - - val df = Seq(src, src, src).toDS.repartition(3) - val src2 = df.collect()(1) - - val e2 = src2.extent - val ct = src2.cellType - - src2 match { - case _: GDALRasterSource => () - case s if s.getClass == origType ⇒ - val t = s.asInstanceOf[RasterSource { def callback: Option[ReadMonitor] }] - t.callback match { - case Some(cb: ReadMonitor) ⇒ assert(cb.reads === 1) - case o ⇒ fail(s"Expected '$o' to be a ReadMonitor") - } - case o ⇒ fail(s"Expected '$o' to be FileGeoTiffRasterSource") - } - }) - } - describe("RasterSourceToTiles Expression") { it("should read all tiles") { val src = RasterSource(remoteMODIS) diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala index d37a7fd42..6f7d7e17d 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala +++ b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala @@ -43,7 +43,6 @@ class L8RelationTest extends TestEnvironment with BeforeAndAfterAll with BeforeA override protected def beforeAll(): Unit = { val l8 = spark.read .format(L8DataSource.SHORT_NAME) - .option(L8DataSource.ACCUMULATORS, true) .load() l8.createOrReplaceTempView("l8") scenes = sql(query).cache() @@ -58,7 +57,6 @@ class L8RelationTest extends TestEnvironment with BeforeAndAfterAll with BeforeA it("should count tiles") { val l8 = spark.read .format(L8DataSource.SHORT_NAME) - .option(L8DataSource.ACCUMULATORS, true) .option(L8DataSource.USE_TILING, true) .load() l8.createOrReplaceTempView("l82") diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala index 9933ec256..9a7e4aab7 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala @@ -20,7 +20,6 @@ package astraea.spark.rasterframes.experimental.datasource.awspds -import astraea.spark.rasterframes.util.ReadAccumulator import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} @@ -34,16 +33,11 @@ class L8DataSource extends DataSourceRegister with RelationProvider { override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { val useTiling = parameters.get(L8DataSource.USE_TILING).exists(_.toBoolean) - val accumulators = parameters - .get(L8DataSource.ACCUMULATORS) - .filter(_.toBoolean) - .map(_ ⇒ ReadAccumulator(sqlContext.sparkContext, L8DataSource.SHORT_NAME)) - L8Relation(sqlContext, useTiling, accumulators) + L8Relation(sqlContext, useTiling) } } object L8DataSource { final val SHORT_NAME = "awsl8" final val USE_TILING = "useTiling" - final val ACCUMULATORS = "accumulators" } diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala index aa2d33353..0672a52d9 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -23,9 +23,8 @@ package astraea.spark.rasterframes.experimental.datasource.awspds import astraea.spark.rasterframes._ import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.experimental.datasource.awspds.L8Relation.Bands -import astraea.spark.rasterframes.expressions.transformers.{RasterSourceToRasterRefs, URIToRasterSource} +import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.ref.RasterRef -import astraea.spark.rasterframes.ref.RasterSource.ReadCallback import astraea.spark.rasterframes.rules.SpatialFilters.{Contains, Intersects} import astraea.spark.rasterframes.rules._ import astraea.spark.rasterframes.util._ @@ -41,7 +40,7 @@ import org.apache.spark.sql.{Column, Row, SQLContext} * * @since 8/21/18 */ -case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, accumulator: Option[ReadCallback], filters: Seq[Filter] = Seq.empty) +case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[Filter] = Seq.empty) extends BaseRelation with PrunedFilteredScan with SpatialRelationReceiver[L8Relation] with LazyLogging { override def schema: StructType = L8Relation.schema @@ -101,7 +100,7 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, accumulator: O val df = { // NB: We assume that `nativeTiling` preserves the band names. - val expanded = RasterSourceToRasterRefs(useTiling, bands.map(b ⇒ URIToRasterSource(l8_band_url(b), accumulator).as(b)): _*) + val expanded = RasterSourceToRasterRefs(useTiling, bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)): _*) filtered.select(nonTile :+ expanded: _*) } diff --git a/project/plugins.sbt b/project/plugins.sbt index 75617f14d..88fade4bd 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -15,5 +15,6 @@ addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") addSbtPlugin("org.spark-packages" % "sbt-spark-package" % "0.2.7-astraea.1") addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.1") addSbtPlugin("net.vonbuchholtz" % "sbt-dependency-check" % "0.2.10") +addSbtPlugin("com.github.gseitz" %% "sbt-release" % "1.0.9") From 99d8e9d372167201c380415b92c85d6a75347769 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 28 Mar 2019 14:33:35 -0400 Subject: [PATCH 021/380] Replaced all but HDFS RasterSource with geotrellis-contrib versions. --- .../spark/rasterframes/ref/RasterSource.scala | 161 +++++++++--------- .../rasterframes/util/RFKryoRegistrator.scala | 7 +- 2 files changed, 84 insertions(+), 84 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 4c9d0a0fd..516b6f719 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -28,15 +28,16 @@ import astraea.spark.rasterframes.ref.RasterSource.SINGLEBAND import astraea.spark.rasterframes.tiles.ProjectedRasterTile import astraea.spark.rasterframes.util.GeoTiffInfoSupport import com.typesafe.scalalogging.LazyLogging +import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} +import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource +import geotrellis.contrib.vlm.{RasterSource => GTRasterSource} import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.io.geotiff.{GeoTiffSegmentLayout, Tags} import geotrellis.spark.io.hadoop.HdfsRangeReader -import geotrellis.spark.io.s3.S3Client -import geotrellis.spark.io.s3.util.S3RangeReader import geotrellis.spark.tiling.LayoutDefinition -import geotrellis.util.{FileRangeReader, RangeReader} +import geotrellis.util.RangeReader import geotrellis.vector.Extent import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.Path @@ -61,7 +62,7 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def bandCount: Int - def tags: Option[Tags] + def tags: Tags def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = readBounds(Seq(bounds), bands).next() @@ -69,9 +70,8 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def read(extent: Extent, bands: Seq[Int] = SINGLEBAND): Raster[MultibandTile] = read(rasterExtent.gridBoundsFor(extent, clamp = true), bands) - def readAll( - dims: TileDimensions = NOMINAL_TILE_DIMS, - bands: Seq[Int] = SINGLEBAND): Seq[Raster[MultibandTile]] = layoutBounds(dims).map(read(_, bands)) + def readAll(dims: TileDimensions = NOMINAL_TILE_DIMS, bands: Seq[Int] = SINGLEBAND): Seq[Raster[MultibandTile]] = + layoutBounds(dims).map(read(_, bands)) protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] @@ -110,29 +110,27 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { object RasterSource extends LazyLogging { final val SINGLEBAND = Seq(0) + final val EMPTY_TAGS = Tags(Map.empty, List.empty) + implicit def rsEncoder: ExpressionEncoder[RasterSource] = { RasterSourceUDT // Makes sure UDT is registered first ExpressionEncoder() } - def apply(source: URI): RasterSource = - source.getScheme match { - case GDALRasterSource() => GDALRasterSource(source) - case "http" | "https" => HttpGeoTiffRasterSource(source) - case "file" => FileGeoTiffRasterSource(source) - case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" => - // TODO: How can we get the active hadoop configuration - // TODO: without having to pass it through? - val config = () => new Configuration() - HadoopGeoTiffRasterSource(source, config) - case "s3" => - val client = () => S3Client.DEFAULT - S3GeoTiffRasterSource(source, client) - case s if s.startsWith("gdal+") => - val cleaned = new URI(source.toASCIIString.replace("gdal+", "")) - apply(cleaned) - case s => throw new UnsupportedOperationException(s"Scheme '$s' not supported") - } + def apply(source: URI): RasterSource = source.getScheme match { + case GDALRasterSource() => GDALRasterSource(source) + case "file" | "http" | "https" | "s3" => + DelegatingRasterSource(source, GeoTiffRasterSource(source.toASCIIString)) + case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" => + // TODO: How can we get the active hadoop configuration + // TODO: without having to pass it through? + val config = () => new Configuration() + HadoopGeoTiffRasterSource(source, config) + case s if s.startsWith("gdal+") => + val cleaned = new URI(source.toASCIIString.replace("gdal+", "")) + apply(cleaned) + case s => throw new UnsupportedOperationException(s"Scheme '$s' not supported") + } case class SimpleGeoTiffInfo( cellType: CellType, @@ -166,6 +164,28 @@ object RasterSource extends LazyLogging { } } + /** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ + case class DelegatingRasterSource(source: URI, delegate: GTRasterSource) extends RasterSource with URIRasterSource { + override def cols: Int = delegate.cols + override def rows: Int = delegate.rows + override def crs: CRS = delegate.crs + override def extent: Extent = delegate.extent + override def cellType: CellType = delegate.cellType + override def bandCount: Int = delegate.bandCount + override def tags: Tags = delegate match { + case rs: GeoTiffRasterSource => rs.tiff.tags + case _ => EMPTY_TAGS + } + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = + delegate.readBounds(bounds, bands) + override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = + delegate.read(bounds, bands) + .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) + override def read(extent: Extent, bands: Seq[Int]): Raster[MultibandTile] = + delegate.read(extent, bands) + .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) + } + case class InMemoryRasterSource(tile: Tile, extent: Extent, crs: CRS) extends RasterSource { def this(prt: ProjectedRasterTile) = this(prt, prt.extent, prt.crs) @@ -177,27 +197,29 @@ object RasterSource extends LazyLogging { override def bandCount: Int = 1 - override def tags: Option[Tags] = None + override def tags: Tags = EMPTY_TAGS - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { - bounds.map(b => { - val subext = rasterExtent.extentFor(b) - Raster(MultibandTile(tile.crop(b)), subext) - }).toIterator + override protected def readBounds( + bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + bounds + .map(b => { + val subext = rasterExtent.extentFor(b) + Raster(MultibandTile(tile.crop(b)), subext) + }) + .toIterator } } - case class GDALRasterSource(source: URI) - extends RasterSource with URIRasterSource { - import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} + case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSource { @transient private lazy val gdal = { val cleaned = source.toASCIIString.replace("gdal+", "") - // VSIPath doesn't like "file:/path..." - val tweaked = if (cleaned.matches("^file:/[^/].*")) - cleaned.replace("file:", "") - else cleaned + // VSIPath doesn't like single slash "file:/path..." + val tweaked = + if (cleaned.matches("^file:/[^/].*")) + cleaned.replace("file:", "") + else cleaned VLMRasterSource(tweaked) } @@ -206,11 +228,12 @@ object RasterSource extends LazyLogging { override def extent: Extent = gdal.extent - private def metadata = gdal.dataset - .GetMetadata_Dict() - .asInstanceOf[java.util.Dictionary[String, String]] - .asScala - .toMap + private def metadata = + gdal.dataset + .GetMetadata_Dict() + .asInstanceOf[java.util.Dictionary[String, String]] + .asScala + .toMap override def cellType: CellType = gdal.cellType @@ -220,24 +243,27 @@ object RasterSource extends LazyLogging { override def rows: Int = gdal.rows - override def tags: Option[Tags] = Some(Tags(metadata, List.empty)) - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + override def tags: Tags = Tags(metadata, List.empty) + + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = gdal.readBounds(bounds, bands) - } } object GDALRasterSource { + + /** Determine if we should prefer GDAL for all types. */ private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") @transient lazy val hasGDAL: Boolean = try { org.gdal.gdal.gdal.AllRegister() true - } - catch { + } catch { case _: UnsatisfiedLinkError => logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader.") false } + + /** Extractor for determining if a scheme indicates GDAL preference. */ def unapply(scheme: String): Boolean = (preferGdal || scheme.startsWith("gdal+")) && hasGDAL } @@ -261,52 +287,25 @@ object RasterSource extends LazyLogging { def bandCount: Int = tiffInfo.bandCount - override def tags: Option[Tags] = Option(tiffInfo.tags) - - def nativeLayout: Option[TileLayout] = { - if (tiffInfo.segmentLayout.isTiled) - Some(tiffInfo.segmentLayout.tileLayout) - else None - } + override def tags: Tags = tiffInfo.tags - override protected def readBounds(bounds: Traversable[GridBounds], - bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { val info = realInfo val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) val intersectingBounds = bounds.flatMap(_.intersection(this)).toSeq - geoTiffTile.crop(intersectingBounds, bands.toArray).map { case (gb, tile) => - Raster(tile, rasterExtent.extentFor(gb, clamp = true)) + geoTiffTile.crop(intersectingBounds, bands.toArray).map { + case (gb, tile) => + Raster(tile, rasterExtent.extentFor(gb, clamp = true)) } } } - case class FileGeoTiffRasterSource(source: URI) - extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => - @transient - protected lazy val rangeReader = FileRangeReader(source.getPath) - } - - case class HadoopGeoTiffRasterSource( - source: URI, config: () => Configuration) + case class HadoopGeoTiffRasterSource(source: URI, config: () => Configuration) extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => @transient protected lazy val rangeReader = HdfsRangeReader(new Path(source.getPath), config()) } - case class S3GeoTiffRasterSource( - source: URI, client: () => S3Client) - extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => - @transient - protected lazy val rangeReader = S3RangeReader(source, client()) - } - - case class HttpGeoTiffRasterSource(source: URI) - extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => - - @transient - protected lazy val rangeReader = HttpRangeReader(source) - } - trait URIRasterSourceDebugString { _: RangeReaderRasterSource with URIRasterSource with Product => def toDebugString: String = { val buf = new StringBuilder() diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala b/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala index ae8bf03f9..5f64d9954 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala @@ -39,10 +39,11 @@ class RFKryoRegistrator extends geotrellis.spark.io.kryo.KryoRegistrator { kryo.register(classOf[RasterSource]) kryo.register(classOf[RasterRef]) kryo.register(classOf[RasterRefTile]) - kryo.register(classOf[FileGeoTiffRasterSource]) + kryo.register(classOf[DelegatingRasterSource]) + kryo.register(classOf[InMemoryRasterSource]) kryo.register(classOf[HadoopGeoTiffRasterSource]) - kryo.register(classOf[S3GeoTiffRasterSource]) - kryo.register(classOf[HttpGeoTiffRasterSource]) + kryo.register(classOf[GDALRasterSource]) + kryo.register(classOf[SimpleGeoTiffInfo]) kryo.register(classOf[geotrellis.raster.io.geotiff.reader.GeoTiffReader.GeoTiffInfo]) } } From bda1a066248a35955ea6c7e2e57204a0df1e2627 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 1 Apr 2019 11:23:35 -0400 Subject: [PATCH 022/380] Misc refinements and addition of JP2 test. --- build.sbt | 2 +- .../spark/rasterframes/ref/RasterSource.scala | 72 +++++++++++------- core/src/test/resources/B01.jp2 | Bin 0 -> 3759959 bytes .../astraea/spark/rasterframes/TestData.scala | 11 +-- .../rasterframes/ref/RasterSourceSpec.scala | 7 ++ 5 files changed, 59 insertions(+), 33 deletions(-) create mode 100644 core/src/test/resources/B01.jp2 diff --git a/build.sbt b/build.sbt index 91db148a1..1b28e9604 100644 --- a/build.sbt +++ b/build.sbt @@ -34,7 +34,7 @@ lazy val core = project "org.locationtech.jts" % "jts-core" % "1.16.0", "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.9.0", + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.10.0", spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 516b6f719..6083473d1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -117,19 +117,55 @@ object RasterSource extends LazyLogging { ExpressionEncoder() } - def apply(source: URI): RasterSource = source.getScheme match { - case GDALRasterSource() => GDALRasterSource(source) - case "file" | "http" | "https" | "s3" => - DelegatingRasterSource(source, GeoTiffRasterSource(source.toASCIIString)) - case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" => + def apply(source: URI): RasterSource = source match { + case IsGDAL() => GDALRasterSource(source) + case IsHadoopGeoTiff() => // TODO: How can we get the active hadoop configuration // TODO: without having to pass it through? val config = () => new Configuration() HadoopGeoTiffRasterSource(source, config) - case s if s.startsWith("gdal+") => - val cleaned = new URI(source.toASCIIString.replace("gdal+", "")) - apply(cleaned) - case s => throw new UnsupportedOperationException(s"Scheme '$s' not supported") + case IsDefaultGeoTiff() => + DelegatingRasterSource(source, GeoTiffRasterSource(source.toASCIIString)) + case s => throw new UnsupportedOperationException(s"Reading '$s' not supported") + } + + object IsGDAL { + /** Determine if we should prefer GDAL for all types. */ + private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") + @transient + lazy val hasGDAL: Boolean = try { + org.gdal.gdal.gdal.AllRegister() + true + } catch { + case _: UnsatisfiedLinkError => + logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader.") + false + } + + val gdalOnlyExtensions = Seq(".jp2") + def gdalOnly(source: URI): Boolean = + if(gdalOnlyExtensions.exists(source.getPath.endsWith)) { + require(hasGDAL, s"Can only read $source if GDAL is available") + true + } else false + + /** Extractor for determining if a scheme indicates GDAL preference. */ + def unapply(source: URI): Boolean = + gdalOnly(source) || ((preferGdal || source.getScheme.startsWith("gdal+")) && hasGDAL) + } + + object IsDefaultGeoTiff { + def unapply(source: URI): Boolean = source.getScheme match { + case "file" | "http" | "https" | "s3" => true + case _ => false + } + } + + object IsHadoopGeoTiff { + def unapply(source: URI): Boolean = source.getScheme match { + case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" => true + case _ => false + } } case class SimpleGeoTiffInfo( @@ -249,24 +285,6 @@ object RasterSource extends LazyLogging { gdal.readBounds(bounds, bands) } - object GDALRasterSource { - - /** Determine if we should prefer GDAL for all types. */ - private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") - @transient - lazy val hasGDAL: Boolean = try { - org.gdal.gdal.gdal.AllRegister() - true - } catch { - case _: UnsatisfiedLinkError => - logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader.") - false - } - - /** Extractor for determining if a scheme indicates GDAL preference. */ - def unapply(scheme: String): Boolean = (preferGdal || scheme.startsWith("gdal+")) && hasGDAL - } - trait RangeReaderRasterSource extends RasterSource with GeoTiffInfoSupport with LazyLogging { protected def rangeReader: RangeReader diff --git a/core/src/test/resources/B01.jp2 b/core/src/test/resources/B01.jp2 new file mode 100644 index 0000000000000000000000000000000000000000..18de22f542597e6ef8a3d4d8581d50587012b32b GIT binary patch literal 3759959 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

`X*W8s&LmSnm9;> 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%0DnBuQ~n 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

qd#X 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

2Ejr1E;^ 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%0Aj+D+{4>T{y;~*!i1F^S8ts+esCy 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�XJ9r&A;bli(N?3g8l;E~;`9lSh)k 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

4ydsTzFIP5LLz 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%0AnWaqs8xN-kP#Nb$yL-9njpX9GsKg0e&Vd0Ej{h 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

    6za%9|iq9 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ⅇs)iklON0k5Tss28pf%sWjWQD?biedI3;zA2 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

  1. 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

    sbtG~hRUD5^QIJl%AQa@i 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

    OM-v9?_?*sO^*_mrzjWX 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 z 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ન{>)`{+*f&?`_UXI7|jR(&NHBW-^l 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ÏZ7jmC!tS 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
    %un~~ z8qcI2Y(tJ1Jn35lbOY!r`_{|Ax_nk56F4Jz@&Vvztu%yCwXIE7gAYhZX~Qi61$xnM zskQ~N`M5;bRBL-D{){n@rNwNg;kvyyOM}wR_jk5gu@W~EWTi^%;>GT7++-gsKTYB; z7ei^8Q|PY7Lv7Uj9QjE@n0DNWy$as@A$Mul!(6reStuMl6OP>kwYYjgmLybC7A)MEk1d+I`B5A`4@F7yW7JI zG>;X3nyDaaaEYV$BeI6R+Cygf6H72P&VaT8PU{C?a1`Ng~kp3(yl7A(FJI2WGxk!0-&x7)2Gp$^fLxe`rPz{ohBxP!A9_a{r@Z zFr>pPIDsCa{cP`8*C;Q(L2bN(Mo1CTX<)Co{>0k?1yjKoka z^v6KA@EHb-0q+6GwE#Y%ZUsE@isYh@xf<7?-ptQ3=@LV(ZB>2K>FD0@)IO1L;2BnV02fuahd2=HGV-#YNn_Is}V} zzCgw9uo#K;NXIVFq^_wSm(kO~&k0|+4H&WEv9r9^s+Vl=vnR7+Ob+WOjz9kqsFp|K zKwT|9JR<{HLO==i3fWBsO(*^t*nBjgD@qN=?_QfTZSuzZ=5rxt3x8z!U2YImq`{KQ zSG7Avy%rR;qV(s?gS&%uAb>Uz@U3KW;)RszoZ@8Zy9y$4`@J{rd>qp#)_3bBC?qXt zsFZPwV9Ti+zgo6#V9#fD1sxsT5fm8{KelJp;A49R0z9<7(9OnkYuGnD+773Q$RXGA zYQ*M!vrnvwq=8eDQ=weB+#4Y=th8qgu2)Py?V=wvAO7u{rYhe~hg?;eTT{M0%@-zo zMpO_MO0eW13JLl{qF8n_)yWV|y*{@>yK!W;Eacs-;BtV%sb`li@Cr^D7upzl4N(t( zvY1&IKZ1jrb$3KrfGtvb$wU21IpWOE#GrY@W4fa3@{3_lcn)V6vz9S(;HStX3I(@? z&w2b!L1?$QGHfSHDv)WdX-lmzX)&x8$s`yxI(&bZ`T2x;FD+006v<8{YK2G1ClMmJ zC#oNI$9%&DOBurYww%~!93iQ{{B zaJshX4L6dHZXwl77umYX)QFH4_wI7I_-HS7r~OEu7Z0HXP5XvZ9yRfSs{G$bL$WNe z%)5Az%hg!a&%x3WgoiNf2OcR$9*yCSCSoD2ZfzaiMJkyZg)Ky&BvnM@)tASp#6TM~+Xs5nTx&_}{ZW)oxBlx~vXi&C+4t~rYzqi&wR^CS zkZO+B^@F^A!CV8VbDoFGMsqVpweb|U*e>Mw}<9%^Bh9YNbN%&h+k7EW_U(x@woc(e34QkIBAFJA^}TyH9#mm>>3ir~7((TiLyEpBEk$yjbC3SHjTn zT9Hy7iRh1FrM{}nSEh+Q{rQM zQ~THEDFIUMpO;Imk>+bEZIh-^xy8N6YJQ7ysVxaL-O=bdkCgmi8nM^Q<`G zZ@fH3c>1U#m7GP~NnPylk1{LR9Ys6ixzp;aKZf;Von&GC($612NhUkEugNzm(N8qm zT96Gi8$P(TPgXrDz+bat=7bF?=tSN+CS{;3+CBCo)Ks3Fv@*DdAA}vKEo5B!vSB4t zQ*_>=)DapaplZ-C*oxOjHyRUcYgj*CyT*;Htb9sbI!EKXa)*M!VQ9LRh?me@^h+&1w3?|J4DHItR=KO()^(8r^yACFfU=$r6ciOJ~YpE`zi zy?jV9%s-FYG595Nu*L(N=R^LKB@m`f#uUlM8My}jz0fIu#yaN_v{U@}{tn?LcE158 z@m>be|7U(rF~Z_^s%s5{dpvSpY0*n}n~71>WR{7kL>r8A@-XRZeu(ENC>)8#&tG~S zrSAOvDdQWTrhXji7*j;mTD+?+ucJ@@D2vkUrGIRD?3Y*8C}zN2=Vevo3I zLM`Fi3jUkUxfxKAk;Q9QQi2}=7ENXs1e znAjEKk|D`XuHl71iA!27{(?;6LM*z9R^?nqAIA{e)nf&6ysa@8TNc6jwL+j~jHZ~v znj$JS+!aQWx!@nqNv4|!+raTdWB;8zYLcA!&V7YT7b0XnKF@TRbDaN;+WR&<@O$sh zv_U4Ng#0%?iY~m!T#5(q`0aU4J-T#f@iohBW;x>1*nBP7QrTF!$ySu`y<8$uqK%RU zX*%Zn{IvAk;{x5>!Fftw2&Nu7JP{t=Rez`u2|I(qz;xOUTw%`Og}2?f@puxsUR!6b z@fFMBr#nXSt? z{api71ep@&tq4P?BsQ&n_lo%Y34g+-vaj7#V6!8Q0Pisp-aW3#VCK1PbtwHtmMC&F z7AyV_$I|}^wiZe0J8IikWQl+pSq}14mH*uHbtkmgOLG|01_lVpNoLu7i z<1CEozkASj?O0gT;Z44YPQ!eNA$k)QEJezLL>Kx=v;(>$T`7H(9t@w5;I_*0V#1om;Wi4fZ-Os|KHI4 zk`b6{^MOEgZon=$06JU%0!seup6K~Mht!6;zl{6rx zqQ|f!!D5&NKjvEicJMv#xjh789*-0xtQVz6&U6 zmB#dP0fYlq8W2CF0NkS=`T|2H$o)?t1(+zNF%IfmfUy8>7B~_!*oR}%@WL^VK>0tU z0ALeo48~|pJj2A_-F9$G1IF<9K8z{734@D(BjdLKX&C@nFvtY}HK&9adkAA1Ksv}D zT!h_GrHIKDC(qw+RCMmC@=;KfluP0?nd7Cu!9$I^U^_Sis6^@;@FhkbZ%;b$aVeO zFLihRGkXcYjQSDAn%x_6qm&4-x|)71!(|X3fjyS*@%Vg1xQ-rvOx$)I`C^nM+w+?=jJLrP`n_T@oYTBs00 z7xe9H_mP8Sp&u&L&JeQCGWFo`8x3cBj(>}tnwpGc*j({WRZhzq`n-E{oL+>|gkCn> z-@S{TLPxYZk_QO&1gX+NKXx?_V2GeDPI2Nt?>uP?ecb5MYgmSB?vGj>SUVjtCguq~ zp)@JAR;0p?+x=#6`J|`yv2~f}H;I&S_#{B35^(fyOO@S~dUOTZJeek4; znVo>5BMup(eK>=@q({JT+suoN}J%F#14~E}Ut)Jz;pxC$D8kd8x_H-T4d|>92b)62aguRw$7M~&1TB_%Bc)5c zTvU>%L%L%yw_rT`V7*@ww~v6iihfH!;(ZgTye$dc?&<85QT8vaGGWMtQLmPu88S`= z?`MPhIIK%^5O$#%@MO)pep76O3mYXXpP^2g(~1434yVF1wMY`Y7;YRw{))dXvN+|t zd&*O(=hWCbefx>xMaUjvTvw8fRt-ug-%GRdQ3TjF-O9~{`huON!>e3w<>S9>0W222 ztT*p2W0J^&5V{D>@E7H{^}8ttNuv96#lZcIN(3ScgthLr{cga{zGCK#q74dSkFGYZz@J9ppG2d{LQ2bzU^s+`CZvkkA@Ueoc z*eVkAdcBvLRISO@ZnjrQsZBJ2_=L>-#?Pu^Sze~2QH%*enE9|Hy8P_dL+K76QHJ?4 zb6M0x6y8uGBg=69I7x88n2|3?2U^BRSI{J;!6N;-cIIRIz1*+`LS*w~|7ferhj$|> zvB*4UkdnpDytoCEt@m-yy|Xx^A;&A3k9Hjn`~}@S2GGZN!M`T%<2xU(bgc@Gp`qsaRO}D5`xXPl!l(GaN6a#sBP08`;1#U9rr&^H2Gs zEoTe`@(8uVzQ1dcidgc-=7rl99egKx2URK5`Wu(J8V!~(4O461oQT0 zHIey(ATVL^DK?Oy*Lr-8i+170VtLPbEd1dy!FAq#PcZdQ*Trs zD4$`t|4kDY-3hCCy88SvQlz0UtL#~9?}+Q<9TH-cuWTWqLMFk4Euc1Q58-qEK9b}& zs9;HL@mBYw7JS|ES|p}Q?pFBzuJZ9*w*);@bn_3+T7AdPw?@{{817_dbomXNz|8iF zAqR7s!6VlXmKEswymEyKQYy0epKqF#L}1e_4Q5)aJwJ}xn2FS#zAO)UJ@4KY=To;u zXm!0)5{{>{`HN+`tkbnuzi3m4Fz$agu+Nj z{EP&=u{%*^a*-u@xXwrD!-@`gmn^<&C#((CfSo> z4!2qv14Ckh`(ox|bFJ!8?|waS>n*|h;4kHf>1!6X(yh zuhjq4EKD41OD)jQiV15f^dcfT!xZj9`>=md z^L2Xo_=?CI*<1GM=CYNu*32bxd!A~0E1|wP%TyTloo=F#SS*vp$HT~Q2W^b4t;<-! z`E=lx+RJ;8E}F{gF}cw5zd>RLA}F4J9rp$aGhxl1YLwDCY5VUe6w?f0n^>@N{0M7V zr<071Wdbst);K(urP@o6)1~{kI0e1Ph5dyO0ddBOCPD_?o16Sb!VXyFl5%1>F} zNA~Dih^k}tUlVsQgUb{{?q@wYQG0?EjN$ry$}~#tI?gPWZhp*T{Tz!7cZF;#1N52% z=;d_b2!_B@u9Ol+qAyH8#PoiFjb0WLCwLSZR>QQ91RyH~**_k&hgAv7zm!dvg*_$m zcl`I)K0KTC=K(Z6fGVxGYb>4l;VUnWXJpeAi8Ly{Q@9N4k+Jl% z#G5e`12zn&3)ZSZFwJN>yQJXJMg(H<{vF85xm!>OoX^jY%=^%o??~!r*gX|W0d3D` z4%e648F*(>sn2jaJU^cHe71Q0hEVJ_@2kFHuxe!xk=)Rtiqj2S$=vTqn$5H1Y=H}g zOM%%u1da)uHgK@-9x^!E`iZ!(m~STD_8V1TmUC<;2wHae=v|Q$atGK74fh+ZfOR?Djns z8#d1}d)9E0485?F5}>DKL`rol{AycPKT~J1p-+zS*WomGi6>c!JOR!KEi=w-p=S;XtVau)%lq1G<#Z)0p{xe*)O813&_x6#!8aV88}+J(!<6 zVzQnvVNOZ^zv+*?K^Lq5#^*DP*#f{A|Jh3tZ%r@>NjZua$MO3B!brSx$3!mynMve8 zE;h#h0c2zR7j$QQ z??1GHfgRpC(6I?|jBi|F2}rjh{I8x0gSaUEGm2o$E_e1A-^|4m6U9-$1g`kk55ue6 ztUzWM0X3N()BlVwz*i2B$m7$k1L5br{y~|TOei1VnPN;X3C1Wfkc~0jV;u>2LJ}JQ zry5l+o5N-jID*%(gmUy-fNpheA2eeWe0T?Sh@Cq?EHqh$FZ}>8?lT6vHWsKf)QcC$ku{j(@gcaRS*ZIRcRPDBhOP>-76gs~UW((=v&jZzjr zV`%eIpA<)Yxa}^%W%v};jML&6tZ3DZKQ^B^HoQ6I1!^c!O5UbDw#omrmD)wI1T(5E zOG>%KE&lbT-qnOz4m6ON%?NuRHCcc)Sn5eY{^p-3!C%C3ZqTVW&KKN>R)K@T#1p@H zIP77NQG8BR6eBzS$k4)9r-J$x~y;aUo6f=KKe|lWHzf- z>u~!t@9h!HM}fY#slvkjPrt48wYdDb>m!)+Bv)%#?LGV^cHIt0v%9E{)5mO%dmOl{ z$<*F8PdaRz%^JF?gFUzC3Bv4WjA8q7z97L*Tzwc%=j6+OFJ?{H#)G84UlkBw@ZWQNVobaG;- z4=4@`U&3a~NRPAYQ@(GMsA~@stb1?2KRRXp(vX+3@Q<=ibq`wnDECp;ziUaX-`^SG zJ#S&!3%Z>xnJD580lDu&oBjT|#Pg7UwTE2}p1t}| z7HtQ3R-S|$WBa@MD>T-k-I%)JUV@xi6nP|+2UsuLOr<3ZZgqu-H>ELIYeCjV~)`utHai+ZR;7BVk&5 zCaXme?0H6SX_J~%h32H*(=$&{W^Jj)qa8xj5FREIw~*~#E}3B%#v zCY{t9)riaLdBtRG`?TJ{Erij*VL2~eu>!xf@=FfHSn1h*S7RqNezCYxv3&3zCxgu0i5<8E1r?MzPzVdi== zzo=03f_~PuZ$-sv$R1DlqQ*&j z=Y%wpL2AU-&{KISQ(>0lff%XTI?;Q++{wM~v>eepZ)!ZCG~{=$qaFpi&xNU3H-{5A zu{fkL+Y9?iVpW~IdBCVIAy(KoMsx3#9A^eMi#bWxeT5M6!Rvie8BV$5TV}gE)Mw>a z)R!FLcptB*#05x%Z0nL412bCO!s+(wirJvWWPQ!5@l_9kQkfc6KB3eyBcpAjS)M#@ z(rtP4_)83#g%r4xqrwGAu**|aoQQ2yFn&y@r$rFU(gVuFky8H|uE;ozwYK@nCcO7+ zywr~)M1`-}7V>L@#pvLEFfhYXE<5QqP{PU|I(zVheWZT}88ygL;B^vW={LUuv*@Wx^YT3sv<6oVB#z4e-UU_OdaiYBVmxj51}e z%MubuS@tNg4la%I)S_18X|_gM-ZFyH-CNr#IS3zj*$N6We>|kx*|N%IL!(piT@!u} z=QpePWRVy#Shk8XX;X`}7v4c&V&}K6iA{NFn>&3JJBfO+D&8)tuSJOEz}T?V-(@Lt z(an;oWAu%}Iw7JU1o>_lY`mmUGhk)qY3`8xEtA88V! zZtL*J=$0SCZOD1wk{7(*tbwW zs6?N5+=&rJl;4byl81=Bv~)aK9ByV1dt*XAIN#lsf_~-cNFk%se-(e*Ht7Dn4>xA( zIw==-B%Ur(Zgyhy+Ax_n4Uvl{8{8t8f#6OTq0eR{csNbjKVX)@f?rXi#?s=jBJ($D zjeX?p2qFXTl%7&ViA>%ieN>Qmi|Gk?qor|=hL76En}WpL!4}C`3={Jxy`9?(rMkd^ z#!Fdujh728s;z~?dQ0aaNo9o*8cDy9U8q@s!`hS*(I(C0UC8Sc_+C{~#2!0SU># zBMV}aG?~%kUpwz9?p@4Ivn1(|mvn*+6T!Dt zaA$o|29XRR+|Y|09HoG=c@1w;UedEz@z!bQeWCJ!O(erV$%KpYID(p<*n@eM2v5){ zI3ZGRl(*v@eniPPSh{fd4 zR@Nn0`&h4BC>A8Phjtw(QEW;~pX?rzddHuPM0U=P&}ePg+2rP}K$#dkvw~0&Xx_}6Zee4De5FNg9!4~djf$)WBieCAc zb!b;{q%kvwQCEGbPkYRJklEbG!l$h&pE=g^;*oMFw+-A^XX5Um`DOoE$uB{;f9qIf zNed_3^5W8Lg9xVc3|_i9p@%N`cx8Rr;B0`jnJdS&9ExW4%nvzQnxbZTbj*LQM5kLH zsd6&o(hnYb7vL*aX;L2hhd`4S?<2{!w}I&HT()Ew81cNzXl?V%XL?7@WnFOW9=5jU za)-^>^GnT!RRek`ZujnllGf{B!2V&)UPtgXZ0`Y+?}N@d6j>a&vqP*eSw($RhWo@w z!5$@Gy1xhizTC|r`F;4UEfb=%4P}mXn_^chCQpx7o1?zPVokRGc>!{T4JNVN)~tN zlgVC?&Sva{jbEAk8xjvIbHU@Ymk5375c?J{J}5ziEOl%l_*ytQ5e3E8`bps)hoIjF11@c4GWc13CGQ}qAQ&c^t6aeUFu3UM#`P0k?|~MNx=?S0$ItDXVz#Xxg+S13cz;GIHSD04MBKVyPl}vP)DMA~H zJgEL{5*X3sf7DRLSmAyxiUbq({jFika(&KKgdF$MkrOZxFyFFC8R_^y1P-jy9DVH_?_YXd_T`Wb6sc7Is2T+z4pD< zdfhTu_)@OuA~BwDI!RP;xak|bbg34GKFT{Kc39+0hAs8ezL_z+6-4TPHv>!Y z05v+6jSDnap|{kk8?@hziTK0vpXALZfUt{mw^Dil8-=(u`A_lR{!kiRn%?B>5c zv$UloXgDNj%r+G4!=0OTKrqmh8q={8L7a~t zW|Aq>ZQ2D6tCz|#G{ehWuBGLJYVu9`;LWiFv^BvSXZB)@`TaM2hD7*_rJlGS7!|ps zMzrB5s84VVF*c1-5pna?DOe~=PZnBlR70Q9`6G+HNBYV zg$%TyWv@vV`V|;I8LQER(zrqJ^c!o8uoN-an5y@ak(v!<3We(TKcVs}7*_&@W1v7f zDTXIKBrmN)*}DoAxFi4B#eJF{fLxw%N&bt}PmmW>p8#9ao{!DqYh}eSz1+m!iTM5o z9Is-g^;xaI0ps@yENt~XDt+ngO5{m})AN=Ljlq5nm^Xf=8Q8sw=J~wBsm z?u0{DHH!e66(ft779qmJ3O1D|Z|PM}pHMka1M^BhXZiN9E#g;%Q}#fUH+e;5E4Zf2 zTR~n#PoYEr5;+aYHRczoMPKmeMSb(n=1xUwkC4h8qppU^GMbZDB|!I3cV0u);zW$( zMPxy^+Fz>b!O&loc$twRsO`fJE z(<2$`=kP1SoBd4f-DqUdCKjT})HAVAW@G{QL>UiY|Sg~Z5YPM2WuP1Ixx>y>pJ!+D;y=sd040Y00X&yDs zsvN1K%vha|Gk&0=_Sv|8LTs-*al2L*Sjc9>J&(p)f4{5Rw;YBkno0-?>Oy12$|=}| zQ~4A85gK2#IhbSYsfZxO_1;boL~O9xvd6f)2oW@r>+tQ|Wg1|-eNx)XrNSYz742F} z16IZ2kvAQpYhU~lnkRp&kRAi-O-6_G2HZ=zXR?) zfAkb@gGxp+mc@MNcb+t6QA&BngzyYmW`x&Kp?WMvcxl*Ou3Tq3!B$PNw%jDH50qXI zvx5?X>;lP#U5SW~M@hKc+W4q4ywEA@E1G-@xTCSg*2!S_La(&IhQE)uwVpiAeN_R8 zh0K3EQn&glol}SgzV3`rU=_!$4WgvtkMnx6w?44-djREnjalR7we-n_FhY=zCz_l( zD)4%>Sdfx-MAoL?Lg_H4B&VPB&gCF9`={k2MI#Z`#$3WL{AZ%&CsY_O+GyNzgD$#4 z<=6U&sGnpf)O;mBB6SMJ>z!bnv;gZj>Upv)V^+5Q8YFP;LZ{fURka;j|Kvab)n(;e zOG+cxWc=}+k;s0VMzyC>Q%S$|+Mc zSRopo?2>|-B9Tg#ESmP~zy@S-q9ggsSTTZ}M3v$a1u?$kv z2$5cHt@e(^b{l0H*hjlK{YLkOOx&{17V&@ke7@G=k02;s9JUB_f7SK9tK+Qvzg^zJ zJx^~5+k)<82-Vl#&t<+PUTXi}zL3qS7nu6Ak!6m}I6iUvw6~w=|FSLdToNu6|aDm^#H@D*hJu-@XtbY%WgMJk(*8cAh9JYuAYS z|9{tx3UjJli6`#lv{LTWO9fzs|9|_wv7S6ly?xX_c)*=tU@mMrGh~_b7Yk{U4Y+tB zO+A5%D%IOnz*_t6hzm8#1TfKdMS`m0flNgk(4r3P^*Q1~X>lt&1Op~~4`zYu8~_9B zkZh?@4P~d>0X|{5XrhzvZM)Pv%=zTFVNitLN5OTKNR+7S zkLvX=5a$_raFGknw!NvqN23DVj}hmxhqG&-)$wFgC@fZ;`f4=*^XXxnrncThbZ zO|@#E^3Y_gC+6eRJG@UWnA?n01Kn60JsbMzcbZJ%Y)!zZx9TDr?V4V^V!O65Is6mTxnhqc4*G5~wC6|d zcJ+$odYoWXgcKigVfli&4a#VT-mmt)fg!_b2Ma6$<1$f#4u|fzw61*= zm?13#RG22%nbpH$chYgcTbdpq7ibY;ve!eb6uwe^zvQ8CXX@+t;#J;>CE2#W;TwpBYJswK4 z^(7)r$|amKx;@s5Zsk(%gvcysxyb5wv<_r>)H2c`vHcht!ePjs_-jsk%?@yP0cdKf z$V?Us0AoX1T&n!n+z(i+bL^AeivbxgU!-lj1k!Y!7HQO8j?9Aj0#1{--hh*$+h?S4 zJjdKV82J7zGW`qkb^FhseUW9E99dEqjZE~hoB)}*BZ+AiARC7~bIC3FnC#(N5B9Yp z|M|Tm?c$MFXaR;GJp}wESB(MF_ti|~6_{>-6lC-v*~7QoJHQB~r4f0j$ir`MIwg?b z?Az5Wq#r!e9+U0v$oN0QTZSdKgd2=|F<{3M(mDQ4dTNmku*ke!^#V?hDO_^PItKVG z+(_HXtX?g^wWd*tUK01b%A+<)gXj5r*vmySjtvavpEBENa#Vp&^QHfI^A!~fLQ#!5 zGp#H>Hi;F6zHl6bgCXCO(~kU!5SW z2zN)4pXlIqTEBSq*@L7CB2`kZJ3n)5G1=7jSUP{VrUX6Rk7_dM5vFcUt|P= zOPBASQV1vp25OIC+W9v9LR0+JL4X~UZBz59byz!3>raPCB#R(kA=T5foMJA$9-7Ua zU8t_5)^aB$#nFT#*T!$qJ|eW8Wj-R1wtXj9;VE z?uyQbdbEsVq4`fl}vijGN%W)p6$ zf8~EJ6P>fu7%)SPCqMr!(ZyyX)~5CvhhKrV8UBQrCO>;|voXCSp<`|YagZhu&!;ugwdKTQs77UMOXpYCSzl6N*11`{+q!BE7o_=+O*rB&?iH~w!$ z#st(rA?woy`QP&i&KC>$fkVTmK5_v7_WBnbI8w=Tm}J6U52?5lz=5 z9Ze}Wh6;GY#b}?BK=q%iJ^l;5<})8hV{y|w_E$<4cBlMqvh!EXTr_KKgMXR2RjD9| z=7j0wt>>ff?uXwk6m=P2=tCH>3A3dfra9UWtAEE}Y&Q!7WU!98Fd_-E@oLqt>^^aJ zy`uqU;Dl1u6r%jUYF`?XF}HREZ&5|h@kK;3P7{Zm*yYG@46N#| zf-VvZL2toAhJ7HYTn@nHqW*?`{IfL?5n?}BH97B5}#NuaT>+ybQp3^vStsOhb@@H?v4T;2UQo)dPp zQ{TcaU@EYNRftviijmmDg1ewp>=oyw4tJNST`6=6DIe7O!38oh;7& zQ%b#%kJ-YT21*$pYo@(EkQM3_+M7{{76--DU=MfZNcp~}31M&gHCQKyB5Jrrt(v5H zC;%H)_G_^-*@By-2yr`i7|5=W6H{~y7q>>rcKgix;)OBR=c8g9tVYK_`Rvs9S*5T) zC~e6{iP-ja)BzT|{ngVjhZr#)R|uTO^%oD{mZ-K+!|}WC4T>Ws0l4eEW9W6i(W<+< za=&|{B&9RM`XWC^KN-_K^9MZ<10xzM-V6>y1zq*PQ2D&!vC`$9osB*Ad;Uc?FU!fR$QFfBK7>`1D0Qb&jlr8Iea81R+L z^M>=@yqHl7+#k?dvhF1U&~)1zDis^7RrcJO;X^*+RF1hKvtT2dyAO?K z7c&B&APNfX5K5K2jC#G{Z-Rf5PY|rF+jmOB|BgYrN5hDHbk zMux_l8XOQY{_LwqZClZ;B3bGd7G!x;-EGJ5%zv4c(I0ixu`6$67n{fv~zYpM`X^`rJo{nCD3z(;a~Uj8(CNaK_r@Ej{{k!QO7GCWABkMyha+RqoAG)J5GPD!MoSgHpC&^Twna;JH+?Qu% zhpbQ3%ktedP08ZcbSe2ZNg-|e*(4CEXPh)wWZx_{sPGdDxW+SikG+k45dgT^PILY~ z30RAP+#bK47L7JpS)>R{m_zXU>;U-;%QTPOv@Du?w*C233c?>G;{%nvqj5UELR6zK zJ-eYQ4q5_Dj()1|b9+??z5)D`jhRwhG89hYw%swd_#|(B;3)$4jiD=GaoSWJWs6@4l0tR!Bf&!mf$$@!z1Qsn+p0f$}E_uFTuO=g-C?7O0;CYWCZuc||y_2w`vff*RX2kV? zbcm24Y#=HBtC;yt*iTZ%&U-1Ya~g_SK6hB94PJ-l~ftp+sI(VbQ2B1Nsnf_#cw_&F?LK$eF zUPT7M0Luu7W%!X*KP@J~4<$%TfG-@te$}1^8X9~X_pXf_Fo*ySQQQJJO>NY-0mc;y z-T}tFK%4U&a#Ny0(HME44{#trt_NasKcR<4Xk@!~ON9i`1C2yC0e5lJ=?O$n6*v1p z1O~)Mz#zyt?GC9Lof zI^TnbX$8sYYY+urDD#XyAL;`0t{N{hzK&@|q@cThOQlhO{7EVL`>(>wH8b4s_Fruj zCn(6Ywoq&0HFwSV?w7E4_)d6~7%#Qf^}3o*CO?3*&T|>v9;wmeh%ML<5pHO|^cdAa zrxLFESmLdt97aNy{?3s{Pzkg){$|6f#twU#@;!&`ul*Dp7lsz!MfnnKR5~}liX>=> z+G~c6?LaSM0DMA3kfJuB75s>qa`n2+qU^UPDASu|+p{HDgUptl$$ zMe#(*n=@$$3lx#7d*@L+fo_1d6R(K|}q6hEQ&Z6P^^s`wooC)h}$bjMn8GXET)mCv;W`(3XT0Sq@OSI~9 z+t*8<6o*6)SP#QW1|-#ap)DTHsG3!0BnlYwLbaY%HP1+o8oc}S#bq~7zr7?_Jqm+# zp$|;ZS0BO{JZgfXs!mISA3^2K&@TVLQ;$8KF(-_py)t-K)1=(nVE42V0=dddlO|%QbTuWgejoMovWevUY7*T=gXn74n1fE- zZ<*W;ckS1KU**3ejV`q{DdJ;?5#<5~x6|KSW@dU;P^ zAA9>4v(k9-1?0?-kF~6%W$7j%YVd?{hoXk|mwr%qk$*mFpGKnC`3I!b*J_fuMmk}Cgv{fVZK-&W+hN~ zu?S^$h`{E%{HCPJP)Kwcgjk@m(aEp?;h+9e*~?#`kRR7dz*lVS3q_cL-6*?IeUi8| zCBk-xID+p@R8EkEA(;`D5}3`@^-Z@P*gf^0wbSJzaS>eLbmH#4b)Q$!bc?i62PHb2 zdLQ^(9ZI@IeXjoUZt{8`&MK;hb_iEw;4hT19Np*kA(B)skK(ziPa=61p6h%KRpCtI zCP7^F^Fpm=v!kSpKU`c>)F=ADhWKGGs!p9-NhVznq7s-y;=fX4xWs!j`Su7D5dC(r z82|n^YK0BGSox!KMids?iu=;t6K6s+xU9(ZNzHRmrN_i6Zz+|pkStZ2w2dmYw3t8R zSk@cZDK^z=r+njUjr>)r_f7gUm6Y0Xa%eSZoQL&9W%gz^hOf3R668r0PP4r#NDe5! zvFa#)tnsHVT~hcr5_lDWyGo~^HFS(ceQTj>su$8IE6tbMrhwNy+=)AAJW<8Ghnhk@kOuPpc0C792N5yv5{&!(_DY{XX%r!H`#7zp$b7^Um#7tOIX z0|7(Y6Hs=dznckZ8z$MFADV(FxtP(wGzBF!xuEF7FPWm~!H**>t1mH;zDuCP3Ym+L ziwDICi9}BZ`0WAOK$Bq{ZQ}zY9hdDHgK&pD+xIYL6z>IiU0nDi_Zi&ErdGw%h z!5`*dWS3#g333wUM9!)5$Qcy24~kB)M-DB4^oq4d&Vaz2nf3etn8p`b0F*g$zK;fG zQKXXKy=vV1>Ol_hdyH&Y6n&V4k%P0`9VsFkCGT};ABZN%t4JVakp|?cT*xV2vAK=y zH2Plb*$w)G24ZXyjJ$I|KX}kBkY&T52gBNX*HB}Vq=!2~o(J64NQ&(_HqaFbj1~73 zDEl=5nh&*+6~w`S3!BF!DLuH}J`<>3|qiX*bFIq(MK3y_*eq8@>w=)6xzRfwU*Ed!`;Mpi$I?gQcr;5qeh zp8!dc5qL9@?_vnCy`1E{Lg!2Bnm@Ajw1ZT6q$)nE3E|oY#Z@$EoBwvw7ccA_A^rd%5gYY@tO3JV@7CY`^ zvLFxX+e}{Y44Z7cSF+IO;?tio3eqqx#ISR_&1*EPv_>20>)9)%a@scS^h||*vADGX z)EGn`!3N~~-$Alik6zeXIz|+Jfk}B8MQ+A{RzS1(8?~W#kaLfhS$LSQmm2Yzx=i3K z`w``!KXBFsk#);8kAbM-4b7$+jvwcwn1A`!Cwamx2x@()6tM?sM(5ok5_7p$FrFT? zObVrf5qoyrdVU5?%1!pZld-=(YfwAvs*-40`EY<}$}i#g`8?#8kbKbq`pp13OsT|< zKN2_ea`kUCwo6`{@#}aDwvL*IZ1RvEz5ZZXseiWQ@RrqJ_LVE<>t^Zz7a$vay znA|ppM3fkrF~2Q?2tEEmrz75!RM;pGAaXE`oC54A48SRQQp&x3MoxS`yPID-xs^c)b!fst&d+zs2S)Si^ih9cs8J8`oEr2xY!uMJi7i*w^Ey3)%{Pza*oGg1ZwPMpQZzQ1znW&U)^Sx8d}PxQ#nohgF9z`5u4Uoa1#8H@E<=v?#Y znWh*g=sZR@iU4YRJ4&xlD&cI{drO zk}{*M!95;AeIONE`mCA6C)W&R_ixP%b`Isjxtsz9Bg#(%=3ohRqB7oAJ2|A~(1$8} zApfW91$zM#kA!$yG?PXyEgG2YxsC=J=G0x2Y2cN`CYBP{F-N!$bv#|A#S90Zr#Wqw z(s~MXsm`0X$KCfgY!n0;Ql<|{OB0lGQm}(+V4M1JZo(59Uyf(GIp5fEccPH6A4#Oi ziqWl7Kb`L~#3M|I@KFC{MP6srF6WY@7#U~@?Ra_*E78H?bRHw>nk0@x}>Lp zwOrI3$ta$Q^%2X+=tBT@uR#$KIP?^Mcy8ZZngxx`i(NNp^hoTyc=CR_VCv-^&HWznH`Tl8_dtN zq^#+tAsxxetfn%*=qWKUqu#W+iK_>ohBjZX_ljb^wYf)tyVO|K(1B0tk!v*SrGMU`p+c#3%ZnE8RpIs)6mv)JkK9O zbkl?h83LGD78}aw*hDO+cZoq4#g%JNmdvAFm#X6FV$6+A-JsGihI|JmCr9xvNb{W*2;pA|^bPnbc!ghvcBmA6q^m7N<5eYvGDl zOG$7<$HghT+d(nG|0BOT4Ag8dgs1S#k|)h z#icnhCuwA|)}u_`AT6xjJdwRz#uXZK^dA_yj$GGmo%n{RdgKSSq3)XB0}Alv>o3gL zTaKuFCupQtsQA0=-j-u(*+K_swD1#fJXxLzNOBeCCpv>RX?i{8o-Q#o1IY!tN?+7? z>3dIf=lUb5a#XAhnirZ5H}$X1DkDAiK49|=dRh&Bs=n&`;jJ2G>+`+6LoTQz>^lcntW}(y-=mS4}^g|dzS?1LF zfBs7tXQMwM#}4X9C-?9K+0Jyc6B;VpfdaGh!i>o9)R^GMSE?w)jPxSk5{EwtizJU3 zs5FA*%E3$^4}qE~qi=Z^X^Db6a~Tt~6d3qaBhO5}H?r(w+T*ZQpM2`X0L>ih|D~SO zd_=;3z;kbK?zc!s09hfb99IpNm3j}=VDt-$)dZG-&5su`J3LBy4X%>EI9ZW0JSkg< z%U@p?IVepz3;a{a=E#U~&ooPfH?JS&!JFhRio{XoTGF}^ ze=3p^-Fkirl}c<{?Ht(Kiqf4WB|DJyST)U>uVUS|^Awvp&KvIlK5km$81^AGEB&Qc zdM*ajlM4Lky^!eIc5^o}M_$K64=bA@&`8SDvxdx;pCEU%?M{SX2>LGqQY%h%)0~@6 zOV~~Hud|qDqQpj@kf`8Vyj@d4ozR6wsS=MZ57|s}-8hbY8ZM%FOh?I9Db0re#)!N= z=4ZvCZxLCRvvhud>wAy1*9K5{gTCmx2X>&0fb7Q%<(7oH9JcdV^wi+aZg)@aXTZk`(QbF2m21;}&5V{7Ocx2qoMp zV?$<=bFrj+PqhzmOe?8w3Z)_p=75vGOTk~ z>)y6Py0L^_62yOm#A4{x)kggKIRJ`7JfZOqOBuBK_I>y89yNWu2$v482NQECH=wi3X1pG11ilUJF8v@q(ejFoQC%wLDgKJrp;x}&Ed%T37C=|qVYMwFoL9i zFYj^<-;A=6l$2G&+fRO1@yc2#?Pe-=wdr3+dCUp+fLi<|v2yNe@a|8M6WUKoxOTs>y8utBFUs ziI1+G`7Uy|7lnxs(-9chuKB2EufMN{siqK`AxkTO;s~Uy3oMMvk!D`NvJJVZ`2PvT zLP%BiUQE$X29)g?ONWg5G^O*6DH&7KJUA45ndN=|`RTc8+^Sy;gfGV-? zZxuSawFuOwqLNt8s<2Vx#45{tB89Obsy8)dt}vC^=zbxc&zAdc;Lq<$5^!gKx2N|{ zqfw0Ui={&5!}LEWExvpdRfZ-{q?w&V{~D%eAE)4r4k8%#3mc21pmDS1h^ZWh#uP&^ zy962->N$7>hc{YnKfg59_)Owu3LEj5AQlWxxtmkY{3-bjj}nz3=%)G2J>p+I>2h%9 z)Q4_*0*G>TZ>S4KzYX+Xd|WKbnlS@pS>#uOxQZ9E_cBaFDLx&0Yn6%rAmcb)aFn^| zoA)RcX^BTSQ zl*4qf&^k#Gn0hPD1p(-PWu2K-FE>)PK#6$7)5AR_ZE3S~0iShiU=2jHsd9T4L(`0lRLy%0$P16Jf8pfApPu>89CncO5L~H(u#TWnAhTRevNIk=q*CUYhqmO z37^MiP@2qZq3sd%iOg*fIeFr8+)H>AW*0n7vPtiTNsImdtGrG)*acOaAh6Gwy2U>pF3J zLXz<-vhGSe(q>}<_vcjC&oY?tWE)eOoAR)wq02;FG%_!mnuvlhoc73ictO#$S-y;A zKJ@Ju^18H5S`<4eDWvY*xvga9tR+r5q8>x`vcwFd)jdlcSAl;9^Zxh{57YjJ;10gi zjG`JX`<#Yt%1P^jA)rQg+ra(zwHU|PX1?nAm4vxq0kMrSQ;Pk{unIJ5=E&&{$rX%z z_DOrYd!}~ZKi(KaVaqQLw5_1eC&6FLF5l+m`~KMDdRB^9VSP+!+v{>>WB-&UjE`-H z9J6%4ZtTYw_&RmVO)WJX%K`_xC;3Zpo1~J@b$mdbqFu-%%TMbG}VM{Bq)z8KBp^4IdC>kaZy!7hw-S zxd+(-DU3YOs2+qS)r%0oE)b|R0rU*FWaQ6SzPa_@9*|i8H3wNn^^kda_{pobJ}6bR zNQH*>VerEWpb!Q5CxKL0kaa5MNI3;a&@?0KWsoH;Y)FX*{Gew6{{e@HeJv2*~HgI1cMx1E4rOIJVwT~3^#Z+3Btc4bq(%~@} zpn^bor4*0Jk7HSscn@hP(-2$UCEO$GUv%QO`#XVC}Z8{QYOv4l4_LC^yJvWiD|O2YSyJR zEjh?#>W0=BUPAbsg`64Fh!Cht-U>rc6eM9|-swY?RI$Vsvl4a@lD#`Lhm$_vo~H() zv9vKf##ktki2Ok;pRLboSW*W&iLzVUD6FFe%+9TW;H|aKsDe1W{dZ6cb||CW9D11+ z4YW1{<*7dLzi>a|7kmo_{atC%_1lu{S5ChEZ+WY5{}MP^8;>%IC43d5IqNINL1QMU zl10>iOXWGM%yhE=Wk36=jdHZyfMQXRXTRrHe)>b_DIE6cMDi|Ihac)Yptbi;k(Qtx z+xu_Fq-fgTpf|D=qZk;{b@kIuJR8|tC<1Ovfz~H4%lvZB5nfD1OGij2=vpuU1r`&{$Z>YJAq!M8igm71F}q%Bl-=;FwAgh&gPl@>k_u)P}&B9 z*&9{J6~h*~=bTE{0f+t8-MjK1YBr4hGzdS(7`<+f^2P;}eu-D#2tF%T{}cnBR@iHjuCd1ydq|3k}&4v$s15Wf#S2O?OEOo z7FNZAO4q2#XQOc zKu|rkmU&$bOHFi(Oo4$S37N^~RL&Fq^d!cu@@S&F2AYW!&~W+O0c8VNM|$phP;P5U zD9))LMcUtC971_}7SjmDe)7j!XqOi<%_Pg31uUZ`BW+%;CfM2$JWw?u+&_Dj=?o0Q zzcPrzXb#0zltezk@lrRuqV*badLdWZ<&TaV%BMCDWfo~UpPl|7d4^WCusFDMg9O_y?h>){x+J5);6E_Vk4tUeGRjMrIv7 zyUn<9bW8+BF=I!hzyH;n&U-Rnb{LME#^nA>NxGCbkT-l|j-M4;iK7a`J6Hh%dtZ4y zwe4<<5mQaD9-l7(-JZxoH@J)v%R!|0)SZPi_%cCiU#@XUN*uq@KXjg!8k9@uXcTU? zF4-}c2~V?Br*4KUC1vf=)wZKLDG?C4MpL%UXn;bPWiE>%n``Hs%^Dl0Cg~i>ZU6D0 zwlTDHQhE7&CQ(qv_Grm2={wu<5mXewEkw_JwH*nk;u-)gL`Ki|PGN#P@T4NdOjhOI z%RMdEvOBz_NueZbb()iPJDZiz?A_hs88p8R0Y{>&#r?4E$0HpP*yIRv@q*0DseI?_ z8C`y)@U$aCU`dwt9cXcu{X6le3wA}0pM?5~xy)EJhkc&K|3dPc6VP;zbBUA-SDKwO#hPL$Rz(z~pGP}B$`z2A9DmXIHI3e9pP0FaKbDfTtMO<4)&s#sPUj)7 zot(^?hDxAA5R=MKq;K8b8q8sJlfZr;tVH!;c6NKCci^%(2YrxlgP1hCSr>1;`rRG@ zY0lde8QJ#w+YT>;_w(TZzxz)n&7npkpnK)tiRP$UH2WHLMrmbX9VoKYU&hX0eXy^7 z73|AnZUW`si`EkC!JK3Z*8_^tU)|C(W{Zjnj;K=m+zI5EDVav~nSR=H6(g81Zb%ly zyc{)#8b9FO9_;|dr$|tJ7SG`{!`uUDejAQ-lX?eq4FWE~EZ#^=B@zTrrqjsihzCLp(wi6HL;|?Q9bk_1xMes@u}5-OqLCiJpX{fBM#p1L=yY%AwdMd_5nvOH*_RE-`AVLKF<|!?E0_O z64@RKj0QM>0ax9GUOzYHS@7!cef|d+k7wx|M>WOnf9;__6Dsn0<#|XWFLYqe_G$eC zaPeOdH^)K7MUk%?nB}>Vl$Bcmz4BmP?0kwpH7I%-gX{{8J_JrAJOtdp0Lx&2PJ?`l zS^$7@iC15rNLb5G^zEI#*NsbH(0;5t6Y*5lU z_9<})U>&@?cU@KhtEn}D+1V*GLNLI(*lB9LHdPe!??lySiqf5^*_FV!6yz;~1=%D` zc;Lz!-wujQ3QTu|s8_fJs3`IAotKDJG931?;xD*s-N{X%&)3EoLV0cWgTZG&N(GI| zV44Tak81MH@1Af@mB$Bj61@v9S0VrBjO=9l6JD7CwViBz#uuvm!-!%Hx=+1{seMzG zRw|j$!De{zWjlpv7oA0RXu&;uf%++f4t1d+{!(a3wd5gt2V+k-wu-Jr&{<)-Rx#VT zr~~c}K?G5*#?HS5ju+s^UJRb)d91k;k?w6eRO^a#)MgGr$u!oN`QJ@MFyrs?E<0pG zJ>k7*5Vsg?M^J|@u^?~?p{y;JKbzv`G7 zO{|<3;PG0QN#ICZ|4o-ozN&P&&>bVKBXaAh zULXXXb|pYKU6YtL*jiajQ=R|1jxKbkm+VwP;V;8o{SfU?yLwAclj6#fK~cImv_*?3 zdLPY>dc$Z-`2}HyQ)*ftoyw`-Jz4RQs5eStL@$(3X*(o14fxO%5gX;?laLX71lqk> zPz?T8ePS5~U!0R>T&eC?<|Ust5S@cb6*aG#tMDolGf+0ouD0#N_d}hc|9Lz0>f&xx zhP$}c_?#e`&}($#New8X%$su19fmOX(DqJk+Gkl%6hC(3#4&NsT7MECDgwBs>B#$RxR-$L#Yn!uqD)}RjhZG2GxjT@?U(yY z-emMK`rKCiZd9|<9+CXK^P}&ywt8IPKi*VMOhrE@w9e`kl0^2N2F?8u^B1XF^08P& z*{FYFvl`-6-xG|&mrVZr4flnUSK|*Mlfhdm#>daXsxPu##Fba=vA_OK=OBn{Cw_n2 zJro?J`3HkL4Sw*W3V~YKUDPP{92VU~N_!RiR-=e9P)VA z*Owv=<@t+8+wKy?({5hle&K;fH2bzWu!52P7M@m$nhy$C5Qnq(;fK$++YnRvqkgn^ zHsOwJ=P)}HrgBb5Vahj^!?s&9NdnqXhobCfo}Z}p$5!fO#E%bFm zm~b_N?G`1%kaNeJo3UeHlQNs^QMBSSt|09ioRXaa}?*3$}ev7@&{T!c1%y; zC?c^pZDpTSUt2X3^EYfU+ORTHE*e`px>P6EAD+CPU$Y;_?i2=2)C*EDP-xn74!2g1 z#=y>n^asT$GQKHI{&WR-g&UACO zcn18Gmzv*s%2U?0S>O&OBvhHynfXQ$m?7Ha;>3Z)Xf3~p>SP))HlF>PddXrB7QXzG z9*4>|R7hT~2T>e*0yV8R_A`NlKWaKqBcR zKc#hCNiLAmj+mqKY;B01lg_5CJ#GJ*7N8Ne27~U}Nj`HfoPKd^2#ui9UQ|sJ`0}n! zkDTGPG8bDaQ=z0Y=o1O6P3wCHw^HlhFu0_`v3NHf42u#v1w9Qajt8a}7Sq*`=d@TG@eXoPS^t8eH`5vsq#&|&=qc{hdzr{Q!t;sX- zfaPG*ob~t?S2s{K*FiqH;4v&8(CDHQBpb#R@qD~?)2u0=EQn4g5p*MoE3>7?a@G0@ z9&}|;P<>1t_I?oW2HKEGz%(D}yD8D#G;rJPh!>!e0%fjWy4gp#=UFbrWQk8sJmI&>*rPt$Lw^mcKms- zS6VF8LzuiN!#sHUQcaQ!%-E^#3Dm!&WH+4~Yig6w87GNvGjGIaqkCRr+{K=(L6J1` zU}GeQ@PX6P3}6R+k+DAVd2c`p3!nyqNuI?k0JIKZR{#V&fEgT@K=Mm~(q=0pa{i$b zsf`wiZG_(ay+P6%0glQ7@bEAeuu!M~f>)ppnxq+^HOe5X(MSNk`jwn3axL({cRxfz zCm&!j$jWOnfJ4tHhIR)KREVYq`A?(Ikl4rtWTjT1ml=R_0B#Fdk^psPSaMXQ(+5wm7^99r=$8^FX^?0>b|X8b94KrjNRBgenm7OD?tm z6nRmkukK+t$5A-2?&#;c#Qg^lVgL|*xnFq4ML)+W;bDZ~5fH8exRrlqhk?=kTvyLj zAL91pZtkTN<89!h82bx490V9ITixtlIRNb*u(P84iNw74ro7n$XfmEB#Lc|Az{*Em zA4$se1-O)S5-G+2vmS8XO$KoI&r~A}Pl%}PUpE-SKX`De^tTeQOX7zPd|(8y=bZx_STmwp?7Cvo)xmUDkyrmf5@xBS&BXZbaM}E9uf32BAtq8}bDcA$a z5KWc24A~A$rQqtaM2bwxLeKiU`aObHLD{SdODf3apXzCMpHr21=l*CyL&W~eVMm*p z51X4G;K#UVlrfif&}BZdoHJVKaLBy(a@rjKhrAk+KKUvNQaF{I<9EAT@c6o2S8@j- z9PKx2t({q1?7-zKh|*71O0%0Gy~S&lC!{0H_TJbgm&S+-Dj~xp&(}1yJXE`$UsqB6 zeK5WpRZe+W(I37i1^?PI6a5|#yF8?%GG>A@HzmR?tb@{7QRP5MzdEy@UFmHzwxQ&s z7E}y=;TTKtE@~n8?!v9Qi@rmTE05l3)`jJ{$KL{+k^2w!wxdXe=p&{yKKToyx+>CU zwaI3BauO9d`1>Erc1YVzYC#v`z-}vif7LK5LhkRza}ENE{3B0DF)D6E`6=PoORFD( zfd8$(ZBlHQXFB?A&v&0XD_G~3GVMptP8$QCRQTii5ugo=B<6K|7~0G6#-NdUxm2@4 zQ?HF?9IlH%j0>(u?R*~TcI>s_(_AHJPNd>=gz1^f&IpHaQZnj(3`$|pVm&TF-Snh; z(LYc*tIks#|ZYx|EI6oI7+k*oiY zq^pjHvw`E9<2Z5W?i{D5r+d1G8D?TLF*!YLVrrO<>1Gp~W}$1C&M`5jyG`>xxA&j> z@VUo5&vWYc{eA1CpTBF2X!hOcD<&n=lwVTdOt9TwMwLZ4BbZj(rY+@(ZkWTS!Nn8j z#Zn@&;ksV3R<7sfxE;QH1dHU8Im-*Sv;$$|*`ke(>Kuqt9>TU@uc!50M3o+i=el%q z`4!CmkZ&&7qNJU_;NI6xPb?|E^YTbatTIz^&amYOgA!|45rxpxzo5Tm>jGDIYWWm@ z{^i_hqXq|rjTp788&wmDe8CGuN@e7gJZB1MRv4h1TTyxn+fsO4Tz04DrPFNx%YIjO z#-Wt^->&~cyik%b_dYsWbwY3aci+MA?`n{TXN|MG&pK(?b5|)c-XV1gyx;wjbA9|Y z|0uAEDVw&2ELVi}D;Kzq#GP6y4VK;8LRYrRq zVkt-h_r|XM(*?}-H@-WMi|m5KV((*v6OM`kV?kA}?GnL7>W(0YV#IU@k@>ry(^bt7 z-viKb+4BoDFVt5uP|T1ThxJRGc_1;0&B&&xpV~N{)@zk@?uEa-6HKkE+-@GDbj3*P>qM9n z9OINQ|EK&TtIj+)cIV9+Uxp}nA8r;6AzxT{ms&91lOSGR{e>TEGx2K+H||HBat_ks}G@6e&4hz;Y#=hrE9$7ETG)+{Y5xU_w@cggN-VBNdhh#Y(Ru|efyqN z+P4gm?89CWwj9$Z&*<{)Fqe?FrSxb7XZX@pGaHeI2li~X-p-3~nfe8$brQK4yX)Cr z@gt$R_aSyq1(Df)OE#`vt`v#M1tiS(N|%e${v*vPHHpxthbk$#K57hM;3 zYGS5IaCb=sg)dvX_&y9W6!PaW$tBQ^s~0&xry|fIRP1A(8ZY1F!{>@T2|;yVX0_iK z#x1;KUFIBQb;W@^cNrYR%^&Pb?NPV?s|tNL^{~25^E=^O&nZsA3iY2!i9WZuSF|;M zAT9{|qC&Q3e_kAt5dke>uOpDX;m|**V50VNHAa0adVDxz&|34Gg#r@Ar2f3nOtIzBFi$T6nx zMm}+l5uF&bdKjfvcAd_q32~I?v-JohpeN*OESjT@jV;_i(gBW5sjq~hbKVOdB5i0(O?SNiLur~=kC#?K_fxd@~q0|@@Xd_OY#M)S= zQ+lOcXXf-2(p=w8$42=$0-YvH_&}P*Ni=i=YpW*vC!4X{VEp>`AJPcsWG^WW{?8x4 zuzlgC-CYmm=>kc-x39Sr)1Mf$}thBU~rr!Ju*$fe7Y2bIwWx$#58TdOhAc z$MDtNM`|#F`XN7kZJi7T5$5+cTS*3&KJ>XGeYzDPVp5AOB&J}bGg4@Kdq5x1WM}zr$p@^uJ zqoNzCLz)t`ck0=?Rg1_Coz|KcrNOC{L?C|~Dkie20Gu+z)yZFgbi3?SyQJ`BESio;E-eBww7-u8nh4M{2CVUYX z%;zzwiY981>%hrT(dNLEQOWtjFaQetvqrG+0&DY_>%bNa!T@p}fxLNO(DwWn-;QC{ z!!B_#YkAUZVAT(F)dG|OFnMG4`mJ2RYXgP2vDeJkek=i|z_ML*ROCF&KmHV0h+@JX z?J;wDr2>X9P{BON{8I`1Z{WZLP_Gg%|3)3*ncn>&2q3J2iA1|uLd+5;>zfG$87!&(3k2{;Il76Bq7KqQ38f!xF5 zT}Aok2aJlGb@`lqztJ`Va1uL!MSSswqVx_UG2OF!m?v*FfTjJdhUhWbEw}UqfzznO zS(gbg)q|QD=~JJcbpd5l7yuKnfs{7Gyioj&KM)A%c#U(5umDJcaIJOVG%biBAlp4E z2hjw4jNv$dN~>)$AeXWkdoRjliNaUjDO~dqKpsF2{JF9}zbtwU(jP)q<<|cZaYelF zfWe^n(m`#n@e#J6hf@Y4GF9AQLE}8Far3}WigH?pc~K(v=cKf39ZGhS63L5`VUYCO z5`+`X195&b8%E_k3#WRXe1G*R!804bR#6Jsg_eE|$1}!yhKRZ=_=n!=gw$^0*C6ya zHp_FgP=jDYQS%k|^bi5EP5i{c>8yM_4Kigxf^K#^k6&pq;d=7mshAf`eQD->C2jRi zNNw<98v_Gtz)x`(=2OI8vtV2^Rwg?NS6x)<_W;X+o=o$k9=O`r%vSoz)+>{uywpOX zme;HDcwRd6AwQuTm)YS|X>X)F^dxp|oD^q6Ryr411jL58k9E?CA_8IgdO6G*y>!CiU?9Om?nyQcvEYLhjO?3Gb zeIq||%e+1#w0z;)TS68`wl#MV!qLJPbH~KF)WxD*Nu+liI^yc|%DHlhncKVDLh!&c zVlXPZUmvg@ovD8bOT?|Z4mFOV$6`p~3Hv-G!rEO$hsaPr>hcm@eBs^ss2|&Hi1JzY zux4tE`;nITa~HV!$^=JY$qXJoyBkHkGEe2%-P5`E2ESj#1X82A-ZOkC>{i~Aa@5Um zD!hlKdLDB=VY(|s9#rm(yH7$9$`+BlqgFvMAX%abcaz1M+@UqOuw+%Vvf%u+z0;?@| z)7oQV+{VIzA12&y;}Ucg$8hNhXmIpp%(ZK2MoO*baFpMm;CV&JwGq^JBNxaYIREm27st$p|In2nfoy*! zsv=`==HA`>$##QgG6BZa*^$~>p{yCN#O!_)L%X83S4KzVkE`E2HgCsahIgI%ATm#( zwjVq!h_G?t*65%ox+^mZuT;3SV0Sd?d|RpftvZ`lwl%#-Q<*z!9{sZ2pnlqQH*kX@ z;O9%~_7n=)5pQjrwu${{z;(R4!9!(=_91_7Z+F(xIeyV<4%jY_&5QadNMhhXNs zjWflrg0%DDfG`NT(2usIj3$~u;{p$sNNm%=)m(iyOBer+HG+ff~#GY|^ve8)!KI2HE5`zMc+qjG%T3<^_59^k%C?x(|#5HdQ zE^`@}E$-RF7Fwm=JNerxBE-by5@ywZP<4upj4^ zC_Eh@#pQ*db`ZW6J{dY>H1XpkwSeedsHMtMTz)k6wBo{MOsR`D3Qb$2q|61rhoGA< zrdMPB>Lv}D{QEfZ=s-66%g&K}i$MC0!x9APfrNVt0;Y3;6VdOU(q&^kF9F$5D2uwXFs9`(y6J7(+B0j}Me&(?;_QV*h5@6F3AkIyR}y?CpR%355?=DX?eJ&lUxz47m;?;+lzkJGON96oO++7i_^ur%{t z%=;W>gfbKTa&qA)1WC1!!X-%@7mZJL1q2QH1(zwxW$Vzl_7>-mCOY%fvYC}&m?S0o zF%!pe+b2`A!bS3u!}z}3^2+y*^pYT~pPN^vueoL3W(JWa32bZs_P1KZnboEZ>{Vlp z0JDU1{uP^vD(qPv;-^0LswUct#>I{SJSEAwg(s2% zVXrW=g$DPwgq=n}C1Wz4YQOv9{5gq`k(W+T&dP|Ng-1C5Fx~G6z4yn=J?=^AuUK_T zBMSlSN(Cx7f=?upCcwg7n97{h+1&+)DI$C?`y90l%6>8iXk~_zVWTBF1JU7JQH2v=|6Nj4>*w>KeHmo=gJO$UhcW5?gJryLH5Mm>HK4PQID*H2wenIa z-v0Wf@3+aL&iqv(q}YB!TzEd@IU|7))~vTMU#p=w+>)J+t&C}Ef|Sl0_W)>)MW`e3 z%;(Ym4hq(Z^>ywKN^fw}w;~l*(!eL_Ne~tEy6vjY)r)GzVrdoaqN(cIUbVk$523oC zYkx`v*7$~{DFGkD;+sFkZk|0K+4O9ijkjK%kZCiLrmfF^~aRPy?I*-B4i&pc(>f(kz%R)%a;lr1?BX zpASs`n03G43I!lrQQeaP0@Nio{cE?z_0l5#b>Gul) zx?FD(fF=Du{m>1dyJZBro^%v2HBkT%_?HlaH3m=uKx7Qi5he8x=wMd&K>zI?#`ulV z`P>IE%s+|&(_-a`aSZ^(LbDl$xcFaKrc@qre_-84+N|Mgx0XyN-jIS|ecoDK+%mjJ*(U`i+bHM4cUD4=QT7xf3C-$k4Gflz$k4z@1A zV^Tn0g!uS}?Krww+ZaPX%pa2hT*1F0DF48eF2N(r5kL^X%yINJE^pGmTHJZSoQ~_1 z3RFk&Mp*$JxJlNFR2VJQ|Kal5EkIip4g7MH(4Ay(qqpHJ=t-_{F+^v+-u!iFPfjXgvhuCllp?jatX6AL_dZKy2o~8uC+lJ0P;jzW28l*Rv$QZT+SHa# z)hSOHGNq7+sICdx++IXJMrW8+b`Wg=72M*Lcj$%_lwa)2zwl)^ernM+k%$ zUfXxJ!a1l5i>PD%>NRb?G~C&>qqb#wxf?0N{OyPR$9odn9F(N2zaKrN{*dwYSsl{E zx-H^J(Fx})+FHq-$qwXve~CK%t7CGXPup5may1Hv0-5y6nD6zMB>sEbx!pNnyWZT@ zV3%<43l)dAp<<6AYWND?45u8MvWF8AGgu#RZbG#ihfAU*3q4q!4~2u>8SYerw3%%O z=?xYM%I~fFs@YXV268fYw7~0Z1tLFNvwZCerv6}V;kj?rZuD+w-=~d$nNWQC##pPX zqG7z?yK^HU!Z%88?}%5hg59N@c!rEN^j8?4xMeIN|2L;B9UuWWqO4g_V1*@%@y*p%! z_Qa&)MSsR^L-Tmyj{6Oo;g{Zc-ehw)n47s3@@uy!k%m$ zd)to`o^a}(@T-?_>GD{9EkhIMf-6h^ro-omEOGt;hN|$x<|*7xt6`xr z>z{AU+#alWHp9WrJ{sh1Tf(y92unKZm&j4qw{!=7Qwz!q1n9OQ#*=r3gl5cCY$b*Z zidWmPzgI8lh@dReKV#In6G`b%z6{*EaNRFc-#ws<6%T3R4DswoC_NR+s+6JH_X7NA z_1@=3(dR0pOI)2)Fw32fDw9a0OqK7Oc1#l?_{Yg%2k$_b zdaXI_wcX+!WG{6xqb`}rN`XCYtTj|^Grvo#(WcMV-WK`FVmi8k{!^Xrs8W^!GiVu= zN9a$ycuo_@ozO_u!2;K-WLeWpAyt;Otk%F9i~~eZNfZ zD7nZwgy1WcQlfEM^y`qbkjJ{~*%A#kh!42~&rThuzEGNA+ilaS1*V;q>lMOB62Aw_ zC~py32G!v?yqLy$(dL)@ndu>%<+!K&+q>=imwjy6*D5nq*hlUT6TTx}JbtdT%>-ex zNSx{WH(NHbTIy_u(fm}Gx(FQ6_3?%JL4L^gnmo;;6#2MHZx1GGMf~i6KVv4#^Lxr&u;5uku9#qO zX-d4h%P})#hQHq1>+JV~?cED#N*Ow0s^ZrGzdy$tQ^l+C;EmF|@md527mi<~ci-e)ELS(ucQQ&H< z-WG2lZqnL=gWoN`{b=8!Z|sp|l-0C97nhh}f^vDLoIJDvFm6}s=A4Wn)SXvXv$ zy7|Su@ztfx54|rF!zmw;PaLCfK;y}4utCrRQU+l!oM8$k#__v6RC5-eKG24n{ibcZ ze(}pK>u^c-gj|%qEwTTAj3fY}!6ePoKT9u5%a7X~ZP3Gp6aVrSyA&6k{_ykJz3EKU z#{Z?dJEvbit96uE!7tL8p@F*>5XwQBI^1!=S;PRH3(;UJ#K z8i;!|NVmzYF1#fVyGAQQFtqf(jv)BvK{P-}Vxle1_!gSJE zZd$YC`H(iklN@$YBRhx`_t_NA1-ofrRq8rR(;y|@=)@n>i>=%(dV+SmW@Z2l1b4|X z*E8PPmU>1RsVwV6L3w6L&Nw&XAtD#0pbn-cp(ayeyjkWp8)Ec|V5ncmd(b~a)x;b& zo&YJ7WNCrwY_v$SRKe=C#qVcF>#-DCMX-b1MBL*YYXW^c&o z$03IkN0TZrE+CG4hGzo3xp|<0=%d>y(_X}C)gK@dO~B+>)i;x;mnc6MfHSE z+DN@3?Ov69sZG56D4L^DqUPwK3pnm10@tbt_W4IlwWcOne@nR7D-K1v@&>0!__`*v z3nHFtMG}7f3jKtR&h(jdf7ny&U(P_(6<`#=w92vs3>EtQC3^l(C8K(41Na&IfuySk ze#`;Dx?M0fTz{JaQ1u_jOk&Ii&jDP*?>P)~Lj6x#U}QmOD$V>)=P|SMKN*t~fEplu zOUQF2U=jzw4WKLf@{b5G%ZakaSPp>hsT)A_1ON~KKme8kVCKfClu`lv04B!@03KI3 zH?3Php)IB?>Ig$8ATeLJg>e`<0hbbcy{LUef;kz$jsScGh9~jx2dIZPzyuG_3LXC& z5Q69dE`kn_LAC0e6j~mE_X^$4!#pr{4JT={Dxk`V82}*|ry>S3{Zm}YV1SAw=0OH9 zG_C?VFW{V*_e17?aOH%NH(dvzu`-rW7X$&h4u_Fv=gJBTZ166DvygedzC|kE0vSZk zEIlM#b02c9blSyr9DU1TdGHqSHu!e9oOPOD)2CXmzyZk>@a9M!hG)_2&ta5H#FJf| z=SoMweIlCgDejLg!7hMqudP*j-~3xBh9n8{2INxl^%&ZtWgY1&FS!al1OWCBl&|?- zsslz#)skwxia>iUJc3TQl4QbhYjn(LZ;nhvN(mSrbj_3Ruu{TQQ;Vetw1Ftir@8zZ z?kGKrmC%((e99>YeVXB(jA!FMq<>S*MzK8}>ZM7b{gz#Xxn>tA@sj?Iy!j9Z&5$ur zW5PBXukvc4qZyP{goNa4sg{712rcl_+$A=wUqT7;MX>B?e+w&@LX*?Ho#)O)8sU7_ zi>Y(OgYtrPT$1l28{wV@k|?ngLa`iI4u;l}T10~D5H^<9Bc))sCJGfIH)8UE=n17Ti!pDaHT_}vx%YS3hG?wwTlLVcCl+bm_jxjk zJw}NU;mj4T0|NxRT;^^_3LolvRsyUl1+OB_TzJef>l%GPl~z(eGZ|aR+cpwyJkE)a zpm;CcXkXGnFTeX4D9L8b13Hui0X6!d>76JD%}F>;@moR{!kM}V4V!SRjQZz@B>;w1B2l<*(@(- zr6|*N7l4>mCcf#79>_mTA|aq9+ETLLDmL7BNnA&tb$5NKOBEDpNkG_Ac@dgU|i2E@l3M&YNZ#vcQ) zllZuTj}t^!gxCFE7kZoMIf{mIlWZn<^zk-$5rqwvan zgHO?BN5xe)c3%gPApW5TOiU6k@o|T&42=jcizTVtin{2`GK^Y}R3qE}am4AP_Na>9 ztr>eh1pek*mo0iV*%)74>nSH}Do^8w&2mTCN8;*|h(#7h5od;ycC41TxaOm;9@t_R zk~Ka~{P!hqZHs&So=_L0t+V`+kl3Xvw-kIW&T@aMYnYtJ?c|8}ZekV9tI8mGktQu- zo-aN&JBZ>@;S{QbMya!FVo`-DH|ml+?kee|;w^=$2bcSX5UL5~*DH5YEn*X>Vz8gf?SN1$@R|B8xOU5q zZ+DM^pq{F45TRz{Yz&e2w;~{oQl$=tF0S8-?Y@@hz2C2b{P`%`tIou$7+)`p_U*dx z7sZ9FduWvcBnP>dI=&fq@}eTXOML|{%HVj&^rqOOL6NGqC?L-WEOd-|Q>>NUr z)UKaQ6s?UHOE`V+*?l>pIgg7FX!s^KGHHNx_u7AiJ_?=5c)~;F0RYq~YcwLGs=b?O z!N<5UF7@rb&oGj%Hw#Gzoo5{2AFh=U4J9p>x9$X*IS&^$W@ZS*N-}ztL<7ADC?sGV z^yGYHyE(rbbj;|=tyfeh7zjtdbv)+KkewEgv#qIwW?kewKvvgJB$2FHT4HTj$1s22 zz>^&d;aB2|2h-TJl+@-Ae?A;7nBya9B61#gHhH{YjBnn3WoA<6wG7s7UGp%f&F58T zQNE~l!Ot_fFHd4v*h>Ym{gG{}2SADVSHdehhZC1RRQHWi`I9ledR8XfOI zwM6a7YCJ`$smA_iO5lpmtON+!SVClXpV0^p7;E#)PNG!>%Uj~G%LRo+MP>VgZ~CS! zg^Up9c<*a9o?c1ghFvisthHO$++iU>XqPJM?x!2LahH@n6CqQm?)}e| zQOVBPIwAU`Nvl2#WG?t^;CHTrFdV*+~efo@9MFGtSbm+wIRo+@Q}1Wq!|3^dEkAokiwCNrKe+oyp3JWS{OxNtnp zU84AiWf-F#)kaitv7|grjP95Eq+aUL@6hbfekfl zeGz8E`(!pZJ*M&kFB2XdG~#kB?i;D=T$U=PWkm(Tlp6J957Q z^5HR>o`16`X0Z-gT0&w*S&S0_7^dAY!k_aaK==Z95v;p-G24DY%(fmgNCTy&W;vA@ z2~#V;AzXC)a~vOIM$0+is{?PP;{h`PW(=0cth;XwfNWZfLm&q5^s12oBdY4{E6m(| zi3>0UfFQ^epb46R!+=rRDb*6=EWoIe=mEwe@EUl%Aeny}CTX+NQ4x$UA_{Ow$o?ZP zZutN`6s7}K8Hlg-`@iP(9K(EIybRG8+<=L0#YnF%@c=bafNAU{Zi{Ky4RFYCNhW|cD9j(Q59C!lE5P@#H!KO*8p8E4N97~| zTZnl?^I7LSc`V>-4)Kpa?c~Hz7%jQL0FUbQv-pCqEJcy2`eFw+V1i&nV9BOy@5`HX zkd~*UV+#4gBj8_JGPRcoBtC?vzW~^-^Cl_@fz8S)oJ0}S4+t&vD0^JO$SoqdLV?yM zrWZb`l=`Im-7N-<{b#NOnV^p-*7W!6&K)nATLjWN5DCc@(AK#HXo?rTzVhdW^vK}J zo1h&2JV$VL0$tZkhCoOb{q4(5hR;ZlQFvREIL^FG3U6mVGiWh}nqc3@7XN2W&4MIy zOZuGp59IHRKPNdU`q|X0Pj=Ej8YyiekK28axRj0VdfV2N%)GOXGC!l72=?mI&w_txhhIfH@wp-El3T zvdMG565SDB*54<8H%2J%()E`2)vVH~@M}Kz2}+ifi-+m+nO--XnN7rrAgt0`Jt^g< zq4O((ET+l~zva$q6C$%7Kj*i>BcE-y=sE9v?)!zlc#irbgn4)SO>MQzTX=IS)C|Y0 zLzWHa?wt^C7i<$@&fxom77yLDwqx})Av?^a>#@xwvt}v8T?dRcyb{04D{DBM@3w&A zJ{}4u?av1D{yFyk<%C=GbED?(vdY9WwWh+Abq1&MUh-{PiJ=FEe)B#GTF0?`ns&_J$OX zK2leYVG$~h>(uUb_^2gmYTgAGnLFRsJd!nd5cnwqJ@N?rYFei4q1AXtH2G;2mMBbw+h_YvWSQNM`F7}jU}MQxTXp0QB-7_T;#A()F~3wF4@ z=u=02+t8F2g3h~Rh=^SH!a3-onzB<-Ox!Q@d-sJX>g56?Ddvf(PdH+~o^^dAN@&#sB~Be|{}5Z9 zi(qq9XSgMI4XMyedF$qAVy6E1na@LGS*cA4`C}C#jBRji!5=o1UQGh(?jfmiltdF* zvjLTQj_l{gBLqa~EPQ3Uvu`+ejK9vPv*%1=;lrXf1M7B@)hizSy-<*2MRvYdCe!rU zt?{a2ISw(7EtP$uPT14R&9Ro0Jaifntd`IrUcveEh%1@q(t z+^8@Gdbv%jt+j7-0Zf#SUccr%JPKrOo~w_x47YTGk*V7gEh`aT(1 z+V5=F?T6uy%KTq{sRyqFiW3Z@loDt7?$2o9CRivUN=v_@u*H83;NhsKeX19Fle<#( zZ56*3xo+pCFg?v27cP@{Wb^P2EOGLtk$$8^ABJ%(;uvFf3(*aE~9B~!R@Qg-=?P>!?)3Ne@J;A zzHRWnSf7&fX=V3M(l5~W4j*!poedXiZEQ?YzX9&OwSr5vy@xf*byx5c2|sbC{|TD_ zU1-A74>ECQ&=wtRlO6EbP^NLIIQ(;HJq%qzq|tY$%(lH)^=G)8`#j}Y*&|xV2$Z0y zP~xKGYc1FUI;vrDww*IayoPglj81rs(ubcQBq=t%f(plypRX!QH#SJ!-;CFfwS~Gs zu~i?c{zY`C-5KYrEL^>>aAmYXsCns*gWCH-Y8gMluE}M7x9%u`csu82ygSGF<{xshZ3?+u`V(YOb8T!+lT4D7FqRZ7xqz z&yNwMy|D#%zq`15vVS&5i+gL=*hp2Y$xbJAa*sH=uvJ2(J`?^MKG(Y@5bAFUz9R;X zzDwb;VZOEUmt(IJN15Eguk=TvH4RUC9!%o9z<$l@kiZw3!u)xQzdY&%p?VD6JY}q+ z1nAx7Evx)ntNz#ewj5G05~_r6zczmgjK$Cib55W7A}s>z=OCo8&!BJ?Tf?-+-9@z8 z#qGN|Q*7Vc?YAiCX=Ale%aq}U1l06DeBQq`BOliYrZ1xw$P$VFLD$A&H|nZbP)NRe z&4XS29eQY!@#0o?F#Q!-PjjF5A%Dre1v4De7RpiizwBlUWkyL)NA`rPs{djEJ zJ#-bn-xq79tPB<>>JTQXoA~jK0s(h;E~x8ofl8O;CgazELGPAQ zF(EVg0qV!}FlZuQZ62x{wtH7Wkmuh1ByJEMGS0T=XzyURql`kFB>wR!ejn9DXo#6M z<+GF-U7b&NJDMKO+Ojm7%}qph669=U{wO09J8#rx{Hdcs{(*%^9e?Hl%v@v$FExx9 zr^W8qU0Mp0IKE`jY=>H_V|`{fhRO3ARC&V<2U#>8IJTCT zvUomCUx|r*!AQ?{z0Gy#9Gg*u#!rIfJRAG^T^+nekdVQkdNnt|3cge&y)Og3^|(J+ z7Q3G|jv7c5H@6DuL1jxCG3h43(FbwelOeS7($F|2lDDRW@_31HO7rVflQ&qR{cp`ZS@q&ZpRT zoZClF^xrX}2b)8=5-dYzh((g-O~aF^JqYl^DoQ?a3jP6AOTo=Lx5zQ zBT^vA=RyV3AOSQc08xJ?dw^XSqW}Ud34o0l$Qz>P+c=KRQN00%?tZ|y@MTo=-%9^q zz|jpRaR^W{1)c)aI_Q5M;Gf(nfj-yz-*VlLMFub{kpFKE01V4ArogJdIsOK_0<+9t z8IwG-ZGW3e|rc0%phuU`FgV)h(Yo#t6;o2M`aUfX!KT zC#7kWAF7eAN!bHT|zT!l-|M z)%#kj=E2+fRAWr)ktb&I2V50^3<TPhTlB z*~NQAG6Z;^zXM@Jot!|otj#D<3&t7rRUm3vZS;)>4P@85MfPx;bt^-#PP{KnLy`&_J(> z2=1R&+79L)-HDWt9}@j(?}4Qn*o?j3TlmO!%hqjA9zP`_zIubr_Yco9c-GyQmnK^& zs2!4dv~cCfRZsa43G!=u@UO_qey%*c2P zJ_{e!`LFR^nwAg~$pdD@shJ_cetC>^Z-YV*VGg>Cn703N=-NpGi9Y1SA(v+HVwna_ z8~^@%tl+C>#ElAdJj>0DW-4Kg-JGqgz6V!FiF0k1`9Ie+5umYtTn?}LqFhdL%2r60 zH*y>lIzcPIdUQ7LyQeBMMe&w1J&RLo?4fuzKCmuZDS8*hmh!^f^AFwQX&SlWfXuJC z{A>jT#?!X(wC*$ICFGrIxa)3BHmi0FVxKzpg?oJ>L{5Udf5T4WI^QVw-}Ye;fQ(C}^3g4&9yUrQSQJ??3-4H@3;K zH0_Myu9$WX#p_*Osc5LHcn$ME1ck7?8t*sWeUpa5wMi^=I;V{hnp2ddhuD)uIPe%$ zPzDH15~dK)N7nIgeAmWW)4>gvTD(+^C^3mS5CfXshD~o43qJCba*A zZYHVO6nE1l-7{Ly&~|%ar%QKzYjnSFNAf>ff0G8X$q@^5Bo03kSk}y5zIu^XZtn_uef`jAsoU6vocM6Oy`yFQlC6!R_!o1S<)LjmME4 z$N~3FZ5&f$3`)FIvlJYY3S*sKtLt(MB;+P5V5^4vC*C@r+uFW=&fN!Z!?y;- zOWm{G7x+SaE?H=3b)qE!hEy{VSzTo?h4?FdvNG-A-L7vqsj9T!w+`VC5 zgo@@Q5cyt9Gn3#~R>Lou>L^z{AD90PaB?hnM|>Ph_xAYg>M7|Z-m-K}NwnkpCvOD` zt(i!mPY!6KulKvVB>wJ|P9j<67}CT`EBG$2!-hbtfBN&r)Ve8RDz$VnJX((RKdC6f{^E}Sa{~cxmDN1Y}_X#c8?R zx%uSQeh#J2f1DOQfxn?Jcdz_eI`@(gw5~TsVl%EnyHyQy@RmWEu=Z?uPwNO zm7kGW!3TVO{~hsNLmYpS*s>aIr#O9i-t0o(RkwO2=)!#{v$YlHr#GPd|60cEIfZ9r~VuAo`+Cw zweVY|il#Xehgb!z(~S6A!9P&0#MEa;ZZ@>O0oh%zUv7O?eukAg5e%mP)sypcPFE0RBNsv035<^eZ*lk?K1+GcLkEGq6LBVHg) z7In)ZP|B4#BAakL_NW4 zFg(BRt@-(lh%~FCy6k6eTS({7)jfvwMVG~q6y?q8s$>h!W9mYaL@;zq;{F#&Qcz@U zVl<0`85Y+MUS>fbV%f47)_a7e{8vppl0rK<%8zI@-I!5mCxo-Jv2tnfk4&ZZK%~xy z!!%#?`pc)OSRnia1RWy1!mf~-B}zF+vz{i~LX!h1rI*ZoyYZ8u`vjN%)`^Ne;PQ(w zg8I#iqUWSZ{!D0k^69f(Jt=&1lsGK>@AT~}h{LG?(y(vyL89<;t%*H5(lPYC^OzDY zN}>DVk3H3z=uq=Kq(jZ~SM!17q8GTlkyrk9Gbh!wf$fMWXtkk-KuiDdouaVHUXIdZk5q4z^gaEA&Qv-xkI&v0K~>gMefU90y4TeJaod6{^i zt|3Sy^2FP=q!Y%GLtp)NfcTyc!?giwz&+Bw0(KOAmN6H$ROEl&l1V6lLwROoXh6vw zranX)(Kpj)fj+u(QcKYEyj}Jf+#isnZ-9+Wv$AULr;&C4LJ=7H9J7#PlXfN^@W_R{ z!P4DeNh=D4MUcz%kZN|MUZ=SO!x|q?aQG-i-caO8NQ%nP0JNDE0|aF8gu$?MI#-6$8D_fovl;a8HGhYl>00%(EmhD)hREk3wf~jTv8&#d(q|JDnxj!V(Qb+ev$1$R&birs4Sy9 zKjI!}4=ytD({oBnVj(|~FKQtEu$Oxs9=pP3ga16V+6iYY_1SSK z^LytvE9e&mc6Z<~;)%yTvW?!fiqt3?x`lgGYMjL49H{ma*M}~{LZhbvs9oIMuLzZvO$D4s}M5*1y&OSq#$&{SBIu`NT|fT!{0%p@^_4Pr05>h>GkE z1MQ7wZYYg7!QuU~$E7ExOz7d9o9C$aOXqN2Fs|FEJV8T! zxn3&m`P)^`zRucNsmq3-5IDWLZ)YNf8aPPUKj=0~hkfbeWH-kfT991jrJ{iS0iB}2~0f!0_$BWK$39)?Bdkah?@gQ9uUER zs{j!}@*vHBKzM@o@Vb73bQRjRNjiHLb&ndbK`?KhK6kue@7wz33 z|5+4*lYn(8?r)HE@vKe>o?`zkJPud;MGD;Rpw)Z;ip&C325$gBUlevAe5XVucqXR= z0D<%C<|zSRX#g4R;{yXvEV;f#+<@OJAdlewhnuSN?Eu?UAiY-aU`(&*nPsE?KvAM_eZL9A zqhM+_tnF~FX6PPu*4K_|qfBD=h!5=)BzwPg`0S~jTiDzi!xlD@2=bdYv?hsv5iS|L zyp3lJ4!7>$ zEKCA6i`}l6HD={WxXyr8?*i;bS_*0n)XR8hsmiT*8qVsmmCXG^K*4}v;nz07+5^Ymo`*U*E79!++Y zMeG%G3d*zQw)|&F>nPWjQ! zip1m_sXn#FhQV9#1^=Nf(t}~HP1<3Ne4ka(i{DK4M+8ipWml>K{(F-2)#Am}MkX(l*MUXCkm(c^!Vpz_*jfoDQ$b9 zxHTng4wz?OPy~9(-5Q`z-=+JDO&`rC15>skfh+Xm07L zbD5onn<4Mxk0a-{u*d3M(0gwvHIj6z80z~XA@OfGg$^GQrZIPVZWmc72L33$kLSoe zCGPk${`4dOk4~bNVyIILQ`FG4;*yBeT!KJ)14l$ovm7I`vp=AWY%9Ue^nEb80nIgZ zeuqJkY>*~gnXc_K@``A!?SNlye?1?K1QE%L`1sf)!LG%GYT<*NQW4%pV^xtnMj}k!e-Wr%|MOn7bq~ z`Uq4yfeMkzaq$TG?;TaD7GRFXjLyW_gQOFKrQp5zP5;IHF(f1BKi^ zm&p1gjVV)U6~Ejn%NSZf%+N|*VbtOoLpk_{u+~2kd+S*L&GG)I=`rhGF5G>7(3_NU zhg+9qOqK%kfm{AWvb@uNq`!P*o41cp^R=mm5jX!~&Awsz*Ch!mc4R*{s@GG`2JZ)F zlii7aKQAJnJ8&zWxnCtoo}ec%d-JYNl=2<}?udMxNhU=7eL#J3Hqrg#bkYkXm^%@V z<=b%8V?n*X>Mw9#)Sl0qPFwl99gR3UxlTlzx0hR&C3Fz z#YEQK#AH_)poyQB_4dX&CavAPRxjb+DB3J3xAJ`yF8gXx;!Ec0D1yj3T29yc3l=@#)4BI`Kw63D;&2#FMuxua2Oc{74 za5f^_j9Te|06)DxU8h7;EE;ocKWQcc==>>lS(^3B%!`<_JZJRSXrUKXV()G{T?F0h zXtG}7W_|%RQ$xl|WBjowJ0KRLk%FxhH;&n;D_bN=Ek*R|TIyGF#2C5@o<1FQY&~Sam zsAO|mg=ZH-!h3BPiPDW<;%jSEh=A^1E3eyb%z7H3LA`m?M=Amfu?abMS_DyM9VOBe+|G?imn+!6A45 z{5v~Q1Di6fGt9>kj`78@=tHLyp5Ubys8l6?(r1Rr3F5F{r=%knK8x;iN$?8+0SD`~??mV=t%^eQ>eVQ8XtVwv<{ zY4^g@OOz8kB%^Sle#7DZedH@K+~lOp-=F)Gvr+tcFo{*ROKQi6B>w!x-{QrjHjB>n zJe5Y7DNsx`8{ZKis@!_RL+?pyZHbx`c;Q;rD(w53Ldj zKaSd!IIlo5h2C~~$G37ijfn_lFlvesJ=mfWlM;{#P)}lb4@XbNzq*;)0TTtDXazIu zSrJTX34w{iJgS~;?$A30Qie65iI{uG=GokNpg`u3E$)L{S=q{m=CecJ4Z=MKoz6?l z1BH`3vl8J%hxz#Mt92uk`coaIHvAX*T!))9KUYvJmJ7`6qFGrduve*C8+rdIU(LKm z;#sTt_$fhk_t6480x=}lw>x}>db)E(`eJ8I&P61x_yTRo5GRK&tusroj;5uG(RPm? ziNI{`bwp;ixl-^x{nH--tO1FrQjkVl7V`Ml->=b!*LBx58Acn4UFhX}j@Qt>2UzLR zB%6oGX_Mbth3OqIXt1AgMpwEb+qvcl*D<^py;e^Aiz6jxvIhnQAuC-L=tWR%iY5?l z{1pm<_3~IFn@Om_)`!0!+?#;mqz9nlC%#7X`~RC%LKNo+o7Ml+2Y|B@AP@*RAV&N{ z@W=yb9S|<2zV$lB` zKy3VrK>$7k_#yoRM*kB`0P{-#XpjezwEMYCzr)4Ui8t^5OtTp@2YE0J2#F zi33E2XlD>WTQrXVrcKxV2pRQ1$66|J07w8{vU$jYfaW>@@NP2U`LPYmIC+c-0w9Lw z4Io_T<3>OiU$aMCHH2I4)$Mz=aGg#R323zm&+Z8+FbX!t1&o;m0S%N*5`g^S`Emw$ zxppBW+W~;x(||2-L(MKvu{)(8|Lm+-+I~R*S0`Q*KDQgq&nTZxqx<@Ivg`=$R1--;Dv2AD+~@9MEXj0r-RJZO=PE2Fh>AqqVADD z{e|lQP0=JTLS}|M0h9*qKE4O#=NwCdi{LiXzkZ-fy2{TN8}7$BoxT)(8BXNW!VCj^ zD7t>-^Ous8Oynr$lfF{rOD(!b1s7z6<5IQvjO-mSk&c=(M~_kn&sdefNB71CLj{Ls zpZmAOjB|?XWjQ=zWU3lDOrL7o7k6*1gu?muoRuk4|^r_!%g*hqlB zE~aSL{C$xVjB9_D)-_V1=pMaVmo>CfJ>#!FDu)zq>b==F-~Rf`?7BGy z9Gt}7Dzan=){-=h_OOx9ZgRZDxQ$_aN!IlJ*$X1;K?GZLqG%KWrwtkV?euz7@!~AV z!i>+;*}ipP#aq(c8DEfuWs%vOfUH<-$KYFzhYj@RcfNe1mo=?v!Nsp!xa0BsC=IBU za_pmaM+e6CP8-3v64+s`TtpHeca$)Fa7p00^6e~d7NvKAmMXm>S?Q?@ct8oZ*94L8 z`}$xc2Jyr;KGvmw!|p4rlbHzV^kO@h2-DcDS8q6)p~hGzoZ&h{UFH3xb@{{7;++!R zT{fincUzJ^qv1f-^!+i`MpQ;{sFJf=m55v;$YNbC^U;(44aA-{vm13$<%M!uUpQ5sjS>QW8$Q zD}9<)Sif-v{$gZhZ7Ra8-u5Qi`u9gt`ISvf!Y{(eXQS9#D?%#AMNBD30il5yqjK*j zMq7E@xgt^{7vY58US}+X?*XKugd~iI^r{|b zfl6wZ%rbtge<2mdfPon!x%-oZq2-e`w7xH}4Vyz2FP@LS?2M+2j5E7G?~eo7Ssf-D zNK8UWvDxK{{jZ5K-|})4##&b+jJK#v{ggr|s(_7@v=X_MQ>@WqIVWnkbTMn4fzQi~ zTz%NLk5yl=0fo|!^1|JW*gRVQ@*0EZv*R_;Srr*&o%A^smHX5InoE%JG}Mq zjcJIlsOmm8Q@Qg06v_}DasxTBx;Y69?lZpesPBZh;a2r9=|copN^M@FTHsr$euRXE zGiuU!Rgwj|RYZwIP>cksQU^B6Z`f?2x%F!;o5GQ?X(Z@uDxR(76k6&~_q`d4=*bLs z?%SBQuZkqw;_I_16Qr+oN3D?HTp|WfxP6%kSFes4FUoqNk%Eek=YAF=_*PsRo%=&R z5t9pEbjA)mH+pXGR5$oK2)}_s>DgOm?rDd$6%5 zM=jg9^1ev7e1`Bi!%{ukxhpDCFJA;@y~NrWC#X1R7uZp_A*h{=h<}EjPiB_wdRDpV zMCxIKj;UAQE1$iM@yezC^$Uj2e7s*JG^So3oWN=~?uLgTn7BLM@3Nq%r5!JcocIL| z(Du9_Pe`&!_V`;Y60gid3`h5okizYK+a5leWEbiXQ~D8*8yqfq<$^3(h`k8f7zXAB z_Ns8h+-CUJrk{YAx6DeEnH2P|zj!)lqI5`c%l{2#gY^jzlUn}y}qV!&t}cJK@i%_Poh!(<)Nx+R!uNy9H^ zEa5===Pqfx#f&R~5^T!3`B6mc=%dRg=J#OO7*@OdSH>_p40c1y)Fz}^XpaNq9@4^* z9$at_erEM#LOs8kOCz?syOcpIqy+OV8GdB`J~p!HNFpA(A)7gjv;!5cb875xKIbg* zL_$ZgV1G~(=~UKeiOmr%4RstZp>ETqQEzy*ruqCNq);qKt_^j}R;vzut0CzxFY?9V zEViSi1$Z6kAI7Y%$W|Vx9 z@*Ih<;Np@ntSS>zomaN;X76gMBxy^Zq&CP2Ov5iG;BSN4i9GE|Tr26*E0vzJkS(d= zb>bhcp%XQ0PYGDZUszF^DOy!lC=qIBhUuu0Yw3kwXJ4oX9POg4QCU3g`%|dyF_22g zek@N-UH0dUO!TyMRBcL@IspHhS*^v_(w6alGYIjUX1mDL^~LjuI_iqouk%c!EwLPn zc>9x)P|;!plqN=o38Xf+P2n>wM2y|qKL|Z1bRF_HJ>M)5tq)VOV()%GDiHhStH5qg z*ahZ)9!%rx8A)>O7qdld(ygiZ*`SfI#iN*dM1hbw*^hKeBN5jh&)xgn(pe8Pyu|>d z7^=hf^91rSN&%+XDQ4*fHz(~3cm+|X&uX!Gwu|a4hT6l}H=MuUgjd#p1_?LT>eHzj zc^hQ}Oadt(XTaNX6&9PnSH_ErsgexKxdx1ywAGR_B^s)jT?AY(o3B3ZaYdXHb zMApEfhBe{hy|%C)-p^pj#AX$BxNIOnlh0)Nzhu8|#i^&tRxPvBv65Wq>tUw5gj$0R zJG`*A^V&J-dt{YhlirfF3z;`Ig!9xbKRg-u7Q4n9NY7X!hBRI11gR_AZ`2Gtq$|zi zrExng?YVNpaET%f>FDk^Lu(dp@m%Ra6s}9}G)|UFq=kf(_Y?{FQ4fh8DHsy^JQ0+O7bh1-`oSpODBU1KDqS^Q zHRD+ZW4c5J&12H}qiIOMUqY8hN2#s{OyU3EE5S!kngt?tt#IkJ?gqbxmh?Y3E_0-d zVPy)Tbm<2y-~M-~!rwN?J&P{Z!f<5J(}#GT`V3xJ`u|P~H;`$cdoPe=yzz?%(%DVP zU;lrHg76=<=jlJnd_^s~+ZUoGj7@XH_`hTM`{t+tQNE$^FS#+Ab+r8jn3MnSke?$9 zW5=*Cd+gpW)pv#SVqboh=>Izw86n>9l2|CyXQ$FYcT@#b;41%j$Zt{t{9uhG!lOr;#kAZ2ajevGUBbK!?KmsJ--eQ{o;j<)Or?KOyo?*>v1cWcj^ey}u`lwD6i;cNg-$y-@kHRa ztAqwknHDNji1kq-vK9{>J=q2)cL$1@zmYaKlIRC(C@HUzp*v@all9stnic`?>|7!P z>J@c)lj{|2_s(p^m-FHg^9GR0>0hDArA>%X(l4xTh{oy$2lmrW_;U+f)_xQ2&P6KD zpaYm@e?diw=wjOt!OgVF=R=WpG3dmFoeJ_tx}bw*8q^B)ylW&$vQMg;xl3&upVg`} z&4ai#Yj~`26d+ciT2bNINIR}IbR^h1Zbxfp9r#1_Tk>+k(a4J*_V4_?&pO?Q4C?0 zb{+n3s)9%~PXnYuKr%Ao!CC>*ivx~;ny z2Rx7wsp&xY@~UYLK-ZbZ9fMDB{DMu|)esM=S~DU>{kR4={s26Iz-LX`U*2zcEHJN{ zrU6f?*h|EdEDBhuAwrxxfoMkNM+ue?4JK(pHr?Q9=)(v zJ##yIBvx3jSD62XaRZAT0211dNjri6B_sr?>8zfR_jLPxw&tAX!8T78R2(GQ|4OWlj@=Q2n$>1vH1pr~kN(h$L8S#|C)D`o~&NOp6o7s{@Z2v0aI26>0QYW3~&{JveNtE z$N|v_(fg>GH)sVI~pB znZTfrXn$(b?QkLQ(Kyg;4ni?($_TltfIi)27b&pKuz0jz1~Yaxo0GfCG|&98P^ffk zpLaLa7X{}VHycF8p54t6rYgMpz5a!^&^x4iXw&e~eF{mU0g+McQt>5|;<9vcH z6Xq^PBiTeLQP65!h7XYG{q7!wwRyeQ_?-kc?UqA89*8wGaQdCRGWicJZ5sIVWm4R< zO_@DhkRq&6A!mTzL?7#&@3@bW(O9-r^$XB(Ca+64J!FBXA~@Q#()DlQ9X)X;9$7d6 zd-gLDUum?s4-#cBQ|yfZvjlZz^QWBoEPQCv4oaAeewM_!HJ>n12FU;x`@{OQ(8qZi z0e&5%XPx=D3YZBGB-fAZCY@9>H*a;LjyZF?My*RZljohzC^5R6mb4x6{*r2+>4Fs( zJDoeYo}S<6j@s_Zl`OfE0XC{WM;Bb@C--e~2Rs|1>;*Wo$%5N^H@Ww?CHroIu@R zI|)^CTU_Y0GxZOhbEJ0}o~I_(j&G%^=wd*G#1CiJjq65=pF*0)8YxUvAuVtgO}b3^CH|zX+lj-;T+|mHYrq1YL(Q-p|V$fkYmSY>L0Cl1cIF(41B(BX`&YApN*`MqXI=#WvURtr?Rk z1L;I3%*WhCs$RvW?fXs)N}m3N6c(i`vy#|PlBP5M`ooVa7SxcyNar#AHzeapU0niR zbPFL!NQ4`uH(o?UYL}tUoo&@h&}qHk2k&ndw-qYq=VbU6LbeTO zFNTOZhqW%zKb+(ddARjrpQ2t$alB+7BeY+2`+LF{@(M*G;l79uGE{w6i~7sgRnn_s z2=b@G<)@;va<=HbRoIW^qCG=FtkIkbYS|G}FvoV#JIfO})a)dR5p*%?Y+lf{r!tUl?&BUvq;y)fW#MIk2MEhAJQYI%{o=)N9;{&RiI*r#To!&}X z(XS6of|5iGGC(5HiY%KZ=@b6293oS6<=|;oWpbL+k*pU45`7`3OKe0|shz=hx%Iu$ zU6rIu3Zx4xl(QAHHIBERMM};0w1U5oM{zP4eERguPZMv+|4$(_q5Nscx;t5p@oi|e z6pbodU`)AjkF8HH{I;FMeDArS_drM*E}l$^iU$o@BD$z_*~~uw3#k8ZF-N4Rzmk+3 z5qGa<$iX9H1=c)a-^$%WdS>P0l&2?ys@z+FbI1E^sKS|IR%f0hUbL%pV&DkiPOoh^>PP9sMJ@KbswCA|MDeoN9OCdt8 zlSto0!rW$S@}2IMc6k@j%LOcCHx#yAG!IW+t||a zJR9Od|EMpB9r)=MAJGC_#8;4C%;b4xY{2o~+%Frms^r^>Zcab}2#yxa& zEo%I~w3K{);j0kz*}rF`RM{p)SH|rs(-e;JFS_J=hg6wOi+h9N-vdl5it81|zo9_Yk!Sk;-$%Yq%L8={VEYuze?Xk~Uu5&k z1EL3MiNB#c3-psU%6`Gm?l*K77!gxaSZX!$cLNgf6^Ls9WzxS|s0aw73pPL$PN~4` zmL4!p6^E#BOb`aPU7nwSng}p=1#o1+zpJq$-t$0YO#G+pxQ_5YxgT_>bMc*9{Ya<9iw=nAP||6$d3@6v?25|c>o+qxCcr~B?83i;}DAgsz0EfoR&bG zNO3@X2h@FZB8a<{_pbQE{{l0rfjcuGfmjiuWJF|iw5ypQ?yfE3WRqjUJjHw96d<_| zj94wbU$8DB`Qx9v6$W9U8_$x?jLr(W-NGyhF-janrN07jYF3>KBz9;?+su-Qpy)K1 z7$eWvI?YtS@f>x+B#>S#v)H5l9U6C|XzOyXOqTbX%i$eB7Bt2BgRDnDzVx--lxf^FA6^L!!`T z7JE_l+hAB@-LusS4M72j{s%UGYNdhvO2+4Pw9o&3#HGepx+y8fukw%Xd4VTBO%`|K z^sM`bDZ`6957{A*H>FD(qfDt`t%cbp2HK-*ew8(}vI)Nw{f?Ws0^#Hi!Dzgl|8kuMb1*Cqj37l#?GKr^zpCmI>^S@NQYs zQ2?E7kglMDVD0KOgZ+hg{mm3wI?g3ZQMKV@FI-xg^mbHp%Lfn#PJ~bWifnsDL5)`Y zVEJ0TK#cLT=MF2jf*{6Jf9zz6lN%mJ;}^X&(I5yvLvFQ@|Bz?qB4eSzIN1PfMt-9w z!7GZ~{^)669QNM5w;Rl-fi$#kIDrz3%PIiR6jH?!1B)5Bv}LS3(~zO0@etC)wu1^a zHTh$LT#XzUjXZEu#a5!pZ7QCGG90g+V=AXje987!2EBL^t{mB3ifeFn>}#Snu*Z3P$VuQ|edPi%4GWqMs-;%>%(dr-YUN3O45r5JEoS;;U|u)ue(n zMWV2vD;0?aRgdu zHY6H+ISLA^MeML@;YShr`5M8aEAFz&udjSQ6NY+Ky(J2*nMrxmVeC=#YmsdBy_|_I z03(%w05bBO=Z z5t<^ZM={m-$UoHjMu6B|T*Y%OnaqqR#PB}sN6QMM;2tdTQcJi>9*aDQB`7=2?pBm& zpUoT@%UPQO=8s1Dkw)!6l(@Aypu(*r$`HiPx*NLam?y?oR-Okf(37Aq-@N=dpkvCNXY@cwX^Oz^urbfyC7j3TD{&BfV}_B)i`8amPO#BNm9rc5zcHeoGOC zX2`Jx(9Q2?=ZW%@UP~7?jTFoDyWZ;zB5$t{gVS)STT>q2HpOp9h4zOcSs1@Uasl(+ z(QVuHy5vbgO)d0CaJ$}I^W(F=cljXBlY2c4{WLN7>OIZxk`Jz=W;z~m?NsJ}ld%HX zk|nfFa+Rx#bn)$sKfqm+d<4YxRAjd^HnY@=;JF8=ACsaS#pW!6Ww6&#w<54$7RQ_%XptSuwk)=|S!w z{^%;s0YV;4Qm`#IvSn0-AVix5oX8_m@B?k#7s`jPjV7Y!*nM%$gfmY2?7Rl4j;%Z&h@B78P_TD6SuT_ z46G))Od+mx)Ld|2&WLOef{?XI)esX2m&a*u?P)qU3Lvv?Pb8yJ-K(6G;TB#wG- zVAH=;wk7>`gZK|Nb(34w4FC#B?a% zKhVq?3&?!`8P1(aS!MD%=Z06|E_OqwSRZFlH4wK|*U#Q>UcZ}_p-o3nHkK*>Ed|Gi zxUzKIeCgSNlF8taLl5F#%!_=T1KU?E_ZVOEj>*U-C@2pwO8Xd>Hvj0)Hy%CJ7Ndn8 zrvzVV_7aZlpI0nbbcGfV8N#9&2k=KTuJo9v?L0(#e$s#}TW#lsH<*e(J}J-3dqbA= z9QVTcai)qe&@v*m9$fWRICPy&SpA1WYlaI(sF+2USQgJJ{I~ z`UwwGDvn9&7GUvg&Umo(2w25Qu+YN^M!TK_4&>)V?C(XzUg-B&GlqNdqw~AgTH3SCV*$*mIRvd`S3_mA?*YGakNp8au zt}hxn37~6bx{`a%Nl$X)4mLBeK^wTd1SxdAwEVJeF{eSu!%=VTDDC2UwuVsb#FT=R zyVQnY-);55kb6V7cdwCeXfk$AmOltL&XW^eH3u$aL5`F|vo5@gJ$}N^r-UU_Aonvd z7i`A8;!PbGEpK30#V z@B7%r==;&hTU04wnLn@LoMP^og+$wJmdCiEj^mwwY!L`o)gpwhW}!ierKuQ zX&z1`(4brPY+5dWcOj03$)3s zrSOHqbHux$HOi*a9n0g>7Whk*qT1gvOldI^y>1}9Nm%n*@pT3)$v!yfVOFG_kn zl{OkSxu}}=TiJj(XDx`RkE{|E(h)=Xlqv$T!TYC!s%%jdv<8l*9f6|y)OWR0 zgD1NljVu^u%nAIn4N6^X`B^I@}Ug{}FFm0{?N=wk(AhOnvHo*$UsoWna= zitfg>;1HG-220^{!?&th9>VO%wzg$;qXMvg8r`JlXyZsYgI@;fjc~~+IjHBjOZ>-q zt@A5yU%k_Dqr$os!B*uqnQvdzW}K~0J(9#Cnff9?>=+gQw6OUk?r8xfJE{GO^ohxu z{ms#uF-}qL$3kb5(p2Rxeng z-5=EnHTt)4el=dh6GIBi2JY1DA7t5%y)zD|_YeNgvTr{*zrOip-c7)3tyFX8w;Aml zNnyq2;O!orxl8_G;?Z3#{b{bv*qg%JYT^c*b*pVP_l2;66|X$%uP|s=R9e-lW`lWx zlBm3_B$PGGgyORiJ6+N8F0Jn;W@mPFluz>FAKDnFjJ~jYu;B|&IeN>|^(HiJHbDbl%rW~R%5uu@ z(Nqt$-q#FTn#M9P*mmNp{kGGtR_@a+rAGH(oZz9N%^}>L-DzT+oCb;!BKh7a@H2h5 zjE8Ku=%y7J)g(d3O&uLQBTgSxQuoL07pU;;sA0l3{iY~|QCXiypY`;Q$U;<4l8GD> z{llFWP+x%ZYEt`B{A>0zOPJOTRqE6Y+>I6b{f4!Sa=rE{7T(vdzHkB@jL&BXa_3R&_LFP zt9lX?KXz}Hx!aNb`i61!Ip@_vwc8Kjm<+$~4iNr2Zfj|}r*1ZV(jipFlSBcplS)Oo zp)2t2Ju;K;2u=X#zyHIlCWvPKKUUzlMg@SK#{atb0K5ZGCD68i2M`0)i1_lbD=ZV> z9ROVdWWoK05dua6R04ur0J{0qNI?4^X!#=!0Z14@1OV9f?mr9&yjQ=Az-S8qLX_~^ zkQf4(Dgf3Yn)+Zwhn^XMZvk2hIHekZ&wwcb@Jj$2xBmyK|A9^bPPVH6bBX`)4JyD8 z9sp7a062)a8gKx>o(L8|?SFu{8h8(}N(43(ybfPA4adz%AwXvDbh}-Q)I8g9s-+l& zSLm3DGkVXraU(5UlWR2%4;bKsmv_r zsb~SSeiddq(eJT9TAp;~F;3zI@nfvsK1WqB!-}OYe&Ud1+rbP@lD>s}FZv0hn1S5C z_+W=s;OIf*qr8E+Sn!}%deU(M8W+RH#o!GuCoE73P>=Pe2|t^d4l9|hLf;x&dPsuGFf{`m^3`$Nf`z*7Io?zIAcsSbWOo9?PDl#Z3YYlt~a zg0E^)pFQb}(16s3Hgj8cx{y4g(8Ji~sbG$U)3OE4EwXj~sF{&6O^%f9!PU1aCI$zP zJr7+HmmtgdZ5bwz~9dvv!1m0NmE_Ql8 zkOW=9ViD_&o{S0c(<@@MpUPi}nU^VtUGG21$Ic|*7sX(_FvYs>l168FD*7}O{(+jb z4~v4^mq2cbSmAv9Gm6|Xb&L|)*T(naXhb+i7e(^5xdzX^o4P3}Nn+5tSu$ofNp@IE zs)_`a?2nm=P|aN5@8*?F#22O~I_qlP$|uooLsltP+lOTiwq-VNEhSz6X22kEVLvMy zWk`gAE$Skn1DwhY>hbW2+m5F2zGf$FT0Cc#5uE+E|8O>W&OmXbD_k}vfB>ANvpEMbs3%{@2GR|1KY+KR*5P1V+@YQ!Z2qjdWR%SqHRPp zFvQ+MwxMxxvwz6j101PRkJgAnyR!~Pt!RsMjP3U7m$ARg#u9YyoJhwRRk>XYvszdx zNT1-ZVxZP$JU9F~Zkaby!wzgIa^+H#?244?6O zjnE`#wx zR4nn*`chIL@2bI$17$(9o$L=N-F_~ECF!#wrc}>mZ}Gm%Rc^tE!kwfzJg}nd*0`G1 z+XthM@|Q`k%@0U;TcemBELNg+zvGWqp)+t=)+Jy6;OG}LU||sxP>Vu#hQ{yjSlpr~ z1zDOjjI}M4gg?opGxd_^c{TxBIBdV+Z19M9Y7bduok$NfZ}<>iRQruq=Dg%NfsBd@ z$1ie@6Lzd4m5~FzEK(+iiD`$DH+}L3BH>^6KM%s5yo;Jr!NfZ)2m3Zf>&>z>VUwEQ zuDqiP@erQ9_^dEQ>36P%O;TR8BbL$;JGaBrO`pNc*NRK4874-fC0tH&k)~?!D*1*R z?3|TnS+5-Y%yVY8dX8dLe-dfy8+}r4(229N(G2*iG~2jQpRCY!T^7$5_Qb)BvKP!v zbpoCWqQ^|0jFL1}bRVr(dAbq(V-l5j`96lKmq6=9v@1F?m{a2F!5k!fRPY6v?PS{r zwBwm!HQC5VeDu3=am`^veuCDr>k_*H|KxJJ+E8dF@JqAXT;&II@z`OkLox#bW>qk= z&*k~+usIwePj3Qx!z?r3vyzSFY*BX!YUD)?{gaRuwB`v57>WwPdRntOl^hF#xF0}s%2TAQjseZ6L|?z3G}koA5V#}s3^uukI$x79G|S!emu9Gi$2(| zhWu8VB+vFXN7H>j>@%dOX^RSxw}8^2^d7q|ixAM#2r)@QTMR)}yaO*^F6=t96Yn4L z^jWn$)#_V_JSCtqVf&BR2g1bEuCN|G5ZzTo&ll(oo0xt=v`m4vD55J2G)@0CNKO7V zkP+KD;L}fypy^i;JpaG0DzF>x0!BZ+s1MS*EA)sSIp!szKl}lh3;;U7!MZ@-87;sx z50SJcf!L*i$&$_<&j0pZpeqe@zJdK4v0VeZJiz!Pn$#}eiz_+*YD$UJV^Hk9jhOMu=tuK<#$lx}x`i9swfKk)Ha1AUwoUfdns^O+oI zqhh!3>)R(iWhOC|KNsG&qf!xy;3H3;;|Ppr%OWr`*Y9@-0QBy&rC2` zld2=}38v~k(q^buy1CTCI(&eTP3bGK2DzWp4l6C%bQX`Sji%kFgJ1Z=SuY=C9KQPf zv2+&?L3*JS^BaHuB}vF`f&$#b;l|Lc&txBsslSqs?1C&i`CBT*vJ7XuAq5b7>#nIU zILEc88F#ZPY2uF2s%bNcXNtK9$7Zfew{lphfqf_IlbT5!{Gp2Uw`<7Zo*Dm0>UxPu zrg^rm!3Nu#s$a*3tdz+9V(WqZ5Yo;qboxo8EsES`Qt$36`zF4E`fH!xj4>H`20vV@ zafIAb>jg#@jp91NUnH!b)%4#d$Y`8;M(Q5qD!Pe*$$I`JKH1fr!$kP-=Rzo`%D-Y+ zvq_kNb8guT<#4!1k&{k1!d=6MZ#6*UCrR8UO)n>#B-Ys3tP_UtG4>JvOCPq(n{jA? zU6h^BR2&D#%@p$2)~oNUWO*4lM~_aWkas`)zcOps(yJ4N<;ihd+1AabSQxzdOW^R( zKt+WU&iS<|B^SMtLd991lM`QlgX4O18Sn@qOBT+qX00%EN@) zRe${I%i7e(I{4rB5xlblKdD9%`xWxAJ1Z}hV&w5&|9wj7%7~=cw_W3hB}O>7AeIl} z>-r-_KhO6)1*;GH-P1HYveKV_n^VhBty_r{j{1#cfIzto>K~d6>}jxmf-SUG+zi(F z5b8P-?e!J`bSu)HZuDT7wlkT?jha%unp?2E`x7B|YU|BX7=6)!Ihx+>;6R*oR3tSth!vWgU*7HB36n5S&f-b4()5Ti{D6l1IQ1BnLO~8^+~k=_l!55)1n$de2%9 zcqj%?R?m4E!?O#EmA9WKbW`4k!a0kclS>s9($X{JW_e;iy^{VxJaodH@mp*&DkYRd zigfYBExOzh^C^SI1HPeO3_}Fuew0a+2X6*^NOD?Xf6^+rfrP|iy6vRG4@4;eR;HvKQr0&uR@$?JLEXQ=co1}I6a#Vq6Kt9F!D!p8WopjJ+_ZE zAEoBQ?cpbIYw7Sq?h@JxO&-ym<4+8bt3S}!?_O{f34Ek2p{PZD*CGqQBz^S(+s5}x zr&;k6*P>XDWGiIl7ZuR~j}9;w-=f!&zQa7^xJj$%=9IGae?w&y8N!?Cv><%%ZWaoS zg{eaP3Egf!sl{R@5S@K9{EiEf+{7t~s5KofKX>&Z&%NE_ryxp=8mNssFFfTu%>fIp zETLiLM+qyPm#MxjDzhUlLTUDGSMwh|{#Mh}BCbenL!QG7TSuySMrWGqpNY4r{0vVL z+forj^-_V8+4>fyp%%vtvE(6&&%E&Yn;>SqVi=?_?SMMf(NPtUz*~isOm3mLDo%z2 ztuUcBY^Nyoj!8hvF#k+HF8&*TIEmKSmjZ&EfY$n(A{?;M&MlKa!+P` zzwm?6gs7FgB4}%SMJ||C{?4tI~Gw&e! zt7TBY>+&J#pBz1ASU*equs`NwlYF;)mq43#S5jWJS)bV+NEsf?sI5DGP03)giTk;& ziR#(i)0YHokzQE4pz}3hVp`HO1@)K!(3EVvc@VPn>07F@_Tbtd?~o!hBygf^HByN~ zHNdo)Z3Mc|xo0hz!b@mbDHJR{QYLxlc` z*mO5&B=I=u5D0`#bfG41Gn!ca?;Sb#oyjjy3T$jQmfQt zl}XqxOcZFjXf2zN%&1uZ;eho%0M?@^qjG7#Qm@tF#LIIn=>Fma8^L6z{*RQTZU?|D z@Dj1v5g-4X+B5|y&dyVuW0Eye#LoC0LF%$1_DcZq0{GewG2K>;z|Nl*=m8p94A`en zumKnE3Q+|52H4J*fRYWMMsxqo+;yIEZ?TF4QoVl^wK{d;yUeA|duTwTlK_u2HzR}^ z6b|zlai{b9-|rwzsukFWpxcyE3MP`;$W)sZgZe0=$H2TD%Z>i5Rs7H;!8 z)30qV0`A$&LsuV}B%Ye_mh}Il=`4VvYTPbP=hEBD(g@NeEg;<`AV^4qw2B}|NJyg~ z-JMd>h;$>}h=dY?NQ0EXcbE77%{Zv{UUu&?&iI^r&U1bd+vc&1weoXpn~;J#&7%g7d%)cxhzqJ+gC z-_04nD%ywf6)VC0eCm3zYufA;3SESxr)Ptj;I{J(X+EGERNt%*H*K=3(+ z38&j9y~pI*xq@x_arr+Gqg!VE-`2BoX)`G*tl#A!_ORzdv{MY%dR}9NJZ$z*YC@Ji z;-}6}>FbYoW(tTM+a?w^s))}!l~g$gzr*nwO7MBavL5&l(I*pp;nbQ_cGCU1+KJ5F z`e;*2enbz~Nt>+P%Mef1qnufpb$0%@_PbRZ zF;I&u|0*m#PSP)Uo$(s5b^lo`1qPlk+_q;9+Pz|w-EZttd<4f~iynHy9bEBEc;8Cp ztrr>)Gw%sM-IHUE$$X$z7;T*@3awXy@T(B!{(50{Y>0^Z7!Qf^mu^73M?7C<`}vi8 z@o??fOFEC^zdZ;@p`Q&vv}J0DENB{0(sTy~rXdY;K&h1x z`=2EmjG&FFA6?rv{<;qIR{CBj zE%Pk_L#^@+@XLwvSFZr3v?l96mKF@dAinOndjz^IAqC#^BotF5O0+j2f~ncLeJ8(m z%*HCf^YY)KUjbNP*RhvCW}<@}vwjOy`~dwum}956_lbdbVNTNdG8c`BNCTxn61N`( z*iO|2(inh%xa}zF;KYEKZ&*D2fm%`O+p!#YO@JD3iDw1Wf#TlqNnxk~K!p${mlEY; zb*mjDFj(Z1BTy^m29|+O11#-g>V%X=0hlu&8$>4L+R1%n?SRrw%8#qCZD4iPN@5)X z^cESuJR-dUV8YHvWI$n3w(A!CXq280-ZsEV3vnF-)?C;3F>GO=h6n{T^u#~fKuh89 zhH0%M7J#+lx2Kqv(USvWfIx5z%7Tw#_F|s^zlq#Z+suQ{di;SsW7IOd60?T89A$e2 zw1;{E5Q7ll&@F=iKp1PSf}tIq?`M4OVfpTv4nHYItsRp^a9HPd$g1P6%t{nzb zW{^xf-!H?$pu^z%jA%&$$Q+4~_bXy!Ht8_4E)jMS1{wYS+)6@&k-OO6JQA36nQZBk zSThfnFBM7p%}XK!}8K3bV{U`Wb$bfEB@%+ z$9;ylx$}ZIIUE;Z%#%nWH9$WBt`b*(2`1bq_h&i&i>z;kU4BXiHDGnNQ-PW?2j4Lf zO5cx8R+S|ADcXlkd@22<;@;oW7KCo$v(LDHRbiT+o7UoL?xmI7BS#PXeII&AWT=m( z57jfMoK}o5|CZ;1&-8ST;v&AKC_3=Ny@w&yRGVaVKB>q_C7Jm!2u@G$yK~X^NWEHI zhD{t?DF)`1Orhy}q6NQRrKOhdke^mpr(dn|E!*_sjT>_@ohj`W?vqYwER8Vpuu2pW zRfR>wsn7B8>$mzNr_@xA57pU7r;$vVaC&T%rPArocXosylfJOTyeVgiA9*%8{-}Qc zIkA!joKR-(eIWM_4v9yg_yk*-@H9~Fd$XO#n0w&6TgIUHw6`yF6m-auI;4gBdO`z&3D zSi${{T>1_UZLO_oW$7T~>vW~}`y0V3s@H;SOKRf1COB6`KW(DOS?cKe;M=DC*7u+A z$74@qkx)e0pUGOPsbo<#zXr=oP)VeGG2$?OaQ-eFT>n!>Vyv!?ypZA|P2q7n(m#Oi z#`RhF-TL0Wce%mjH6$@YPYSrCegPG2|doBzuENV z>{Hb0BAu^Q@}Wh-zO}GtX7`uB?aXEWR`&TaDy>7!`y*Ysq#^dPo1{b0sc-0Xltv*G zSOwAZ4LptRA?R?%s==C@%zTe-;{&(!5*}IutvM6PuY}8 z*ty}J+L1^qFOs7kud(mnTa0-^rneZGa>u$DrPGj4Dg9cU#Ayn9*vq66dcflQjV@Y-e^ zkP)}Rn%$sD0oM?6aK$12!MjM}q40a6?^$shv_P>xil#LglftU7&=oI5G>0pS1+R-| z8=-4!7h_(#Pt%{CSLwYXpZX=BUfj;)m+~s-&U6r!H^azq5p@m?39Hx1Z)CTZ=c$VzvzJHT z`ei(inuU*jFqS>9q4k)t43`?taD?p!dlla34w41*tC*MLyzmYK?FP(HVHJJsnx5yk zN0LFd$jyt)iFFnDga`Tf{bEQnW3fNmfwj(_WRoT&n>8IJ0`<4y*c66?^1P z|Bhri>Q(N=f_hb=FCQ^Jow4S`$zs~-Ln#(~4Nn|GCeb#kzV_qeb*|?8QdT2hzJ}cfj7bs6Hqo=gOw+ zmJhS1)TCqk;w!GpnT0RwCjCN~aC#=%maOveLt2`d-Yz2-CsC} z494bX+?{CureGP6d61pFqnxh!_{nHD1W%se!Y*@;=XrPT>djln0Wo|fvY5Z7WS6KD zYqj`ks<6NGodj)knVfTsFph37jVZXkDZ4!nuBgm9F=8@6ih;8v^QXETaWdnkO-wjOf zYRfoOWBJ}=BuShF=3L161EXO$j}Kx~rTas}G!}4Tlh9quNg`1af|r~92R*tb2hQ)y z7lhi=nLQ(zQf^ijBZ>R*tqGpF4^lZ1^;+*=!5PY(S$Q=VGQW(rhGstUdIX(*{Kt-E z_SY^a$Co(VMz2ZP1m=R3MuXYQd)Ei9GWMCEds(Et=W05XgL$-x*6v4+gPn;wcDorM zA$`uhlIv?dMYq?}kau#C=MA3cb*ZJE7jSU)H?z;OvPzw-@h&`$Jm~KxD!AHj{d#qs zMR}O+l7huOyu#cJ#EC`F!VpH0M9NV<@x>PEG20&YoJZT66oAXU5EQdQc9)I@`u&^I zQB}p;`L_gjAg9MTH>A?q2r0+!WI38{sF2U74$c|S+SAU_TJ?mp#?k?}R23d>K|Sl~<*} zp^d|&J5b}~XXE061aM)&*Kt??4g@W0-RE2YTG**3`qWfr>bhD*2)2kArhIPZ4OM@E zz|z~L5_YCBbNBrzg9Zw(YV(t(79@wN5VL_A3b{+FRVWd8P*CN&Qt4=_{wV$#CKwp-)&Em8xUQGX$1c|Eh#F ztljI+JyDP34>r?J!wKv)3xgr2Wv0BMno0P|^NY=D__kM*m&D}U3TmqcOzg`!jc&P* z?sT^Busp#>zOGjL_(>&uM=U$Ax)!mRtogj>VL^K;5<3gBFY+NMO6Su%yj~kg+*sOk zwl9=v&Wz-P|M*}|hSleUI|J_*$EkgT+`yzqK9mD#)?dbPqzL5l;B@_(-a^e?|Md_-; zbmSm>y4sW%fpdIvK!zQlh)H1-#li*xQwJLQ1P}%2%H)?v$vS}jwkHO5u*_Z#6z&A1pW{DK-a7(iVN0(=q;OoL)B#=rKwW-`VM0IZ z7n>2GwfqFQ{;NU1I!=5cYq`#t)4yP6A2 zEsgFco>9>s)nl{bxR>~+<}a|V8W0^0+HHa@us!R%nRJ|VYGiPk%E0b(tblt`;iaEB zC`WNZ>9(9@2bP0Ue0F?UI2)Yl6qlbB5ho@1qCg)#!@RrZI2n|n953y`J=LtAo-AcE zI*kkl!R50faN9oda234Baow{2oNOm&LQ_Q6W8nMMNZNf)mRp4rVXo*m|9j|08Z4D_ z9#Y{w3Ql?(FPUFVY3Dt6<4wZDv=RkE6$d%YWVjEcNJpN(rwPH|-v8}ARL)tbJZk7l z@WYrBzj8}BkuRk7P8~Z70M2>K%I5CGQ-H94fPnm%m_Dh#_-$~#`0dp?i0-mrX`ncH z=He|?J*2KM1~{GXIQ9}$)^L?p;|Eg@D2G!&oX)R;i6zraMN*USD)zEP7#AxF&%o5& zVW=j1P35N-kVyzK8gPonWxZ-r7 z3xg1<`LKIvx#D@VtDxho_3CB*GbAFNQF!$aJKnnQz0Y818TS=s64*!X?tulvNc*%= z)Wf>_^YmSWPf$fHXu0;^A08yx=0n?e0w}k>5A;xBmHN1o@mlG~!n1=`Rr$>z|MXKS zW3xzue!(>T)b^C*{If#Vsj&Jutc!g7swHzwxY$u}fd=!)0j7-tH^ahSBF*%x%Er2G zB?Bc@3Qa`(AZKG*H+JZs=){8+Qu@eVJCdsywi!uy69bxGt`X^Q&$w*MIUon;%I$|g zh0$(W$dq{|_MVpi|5Bu_DeKRtJN$Kt}v zrB1gozF_*0ttm?dOI=-%=qsJaiWTDrHk5G9(vCLVu~Y&gx=4MYM;&Y_AX|~dKRVvK z3;X+bG_eJ6xK*j$grkQ4GWzvxa#3&={e4*Xt>fJ!H23RJVczC+V_OyM`sC9GIVXrR z2wCewRq;K@q4CR|6@=l0hWB7&TWba#Gc<@fhlzKS8-n|h2+{uvcXP~(#>n*RMK3B~ zOm7>aN-%t~%m254CN&G0ky$?R0F-{$Dkn{kOqBl7!ulKT`%Vh7es3V(H1S0!9T^vg z61gAA1Y@1`g?-(N_&$g?b>q4$2*x&KqgXHsV@i*nKERy~|!gWb3!>a+P1 z=!xJ)u1-<10rLJ2WZ?F4Kl#|GSvK8PMy=@?cHJup9m9`ZsuAO_+w0#x0VC zECjKle%GY@N#fE)!`XF?%Bj@<&Fdy?t<_ReQ@pQqEN8acqlJZ9=7W$AW_cRk5?PO1 zTVKGT!6~gwGla@`;{|@-m6%L~sIfNGgKl74Mlu8CLI(%cz(d5Pq=#KNAM3VTa*RZv zKkwV!N9hiXg`4(rQ+h1K<96@l_(TZKzbbi8=_CU8qEMjtZHu3mV;b0?LdVP`@rW_? zb^C&P@Jmrq7kyB{=z;Lq3#T2SER|pMxMPu6_?~7~ucGXh)*y;o!y=h`J}A0pB@LI6 zNW)Mum7;fy2DIfL*oMWf%0A!iw!r7~vFWMKt9+r0M-_LEi)(UyEtd*%6sZkE>gr9rV;JfS9X z%LaTWQG#Zj-=s}_pP9-vWqFCH`67LdLi!FGzk@JAZ8PVF$-(Js*i5qn*ln0GzmK>P z=Szm2K`32p042xMd3XkOc0?Uxq}zSQG*Q>z@jz|BG_hGOHHCV6Mx(hQqr>;-c29?K zevse@g^Ha8)Sb*1(^xfo`QV#N%JkH>{6^lt0_7AXI0O^=-uG^K-G%)&QK8^63@onJ z*&O#*j@LTJ(CncfJWZQD_d?pn$pyuuX%~+e$4h%F%liq%Q~M!5Yz;m5TD0KL-j^Mn zq~|=fV3&=Oul{$%JtVW|hcv8zKSCLLSd!g{1h4x{+RPKpQsKUZpA8I&<(m>-;(3`- z*iV5om|l?(r)iiA`MxK<#`15eUvPO5e>}a;_<_PhG67g_S!4qL*@9T!P4u^1j#d7k z3w!VBBZT{7# zn?tLD)4(uMuU;JRnHgl_pKOhSHIyP=30*yo@`(5y>VPvgq%m9TgIsUQSw#0k(?9ex z^%^|B8(K=2TFrE$-1wr)7AjtNaBN2ULRN(62an)9S$LSe%MG^+r!;)bk5V)|SsiWA zIn|~JNb7H^XG}c5{6TEljVx_{#oQ=g1u{HCEVhWw276Zf9M9=-W7CMrzg*kdyzgiW z;d?^5MOCaJkv5vFU;P$$kjHbu#a{G;lQwKP32#P{YI)Egk(4a%V!wD>E0&v zDxUkrG(!+^B;BjKGM=YBKNtdx-;xqB7?b)0(!3-^YmdgON=_WoDkTCZ$ z>Hyb1=*U~?J|?oDE$7YT+Km1ZI+Az+bD^Fu+%9B#qB7~Z24S$I@G+P=Uu!C$kj_4c z$bS3_?#N7)_mD|BYQ>+f%yL-qwVhX53z0H3!QqNBflyODJcWGm9!l2E(#u6ylDe#( z%KNWiIw=(AcnuUshhR!njkvtyH$(AYzx@oj~_BD+WYfDDWD|E_EBpO{Y zpj}C4FRpE|hK!7uFMCk8#BgyakFMOfGG(M2`^+19O1E?WV4*+pYkD2=Suf5xWwQ4f z`d-lF=D3STMKxn738W7>Cm<8U_w^lIE<9uLUUJy+#6o^Z75H%gO-ki479DLb2g<0J zvEa;6ASfO=On_>O)HjuXW#%Kz+>qWAxKwj4&J2x+<$&fTe!e@t8mNnd!bQ^_JjyK1 za7+-O>*My~vlCXkbf!DJ*N9MEe5II02@KikJf0s%B?>sQ%Vv0gBm-zy9n@+&g zeT5Mq(wN!){eOo6ZrT5M$Vr&^5isBb&)f5F8#F_Gnf=W@0BynIiLn?kSOR8DvnEgg zdZBoRf7>;RQ6qpP0B~#mw-f>lb^xOYfM^ir6yT-&&rkuXM?Ept$nDtg2Pho!FxPJQWHIwm`tg3h4Xy`v7<+zRa%q z{yts2fM8<2P`(BZ0o|cjflsPreLDYPHT3cxL;$zGfxuuF6kNvy0Wkx#dkSC}00 zAOxuPT;aTx9Dv}lXaUz91CW7$q+Y>HlyFAc$|El9-zzgoJ(YS;@g7eAr1-#WucD5FP_)XkSGPUh^2j|} zBFu<#Hi$Txr&f{dhS2MMxcePqaL>bx(xs7(puMWRd;i4FkYE9wTA{QBmvEo*dspQj zQn2Q^N4H3|m5OaEQX?t}sL%d<#a(EV7`352!1h2Ry51j<>d!bl^LV^9t;x_2DbynP zYwde%V|R+^bHFz6)R0XyFJF`zzk_WkiQj1An(KKA8)?K8OOZG;@6f-A@mmBMH_6e$6K)LVhRC$94f0M8j2~xw zo2A>GHMQ(XTo(}DkbDQz(HqBxdUluo9(rKP`m?zg7ow!(aD7Q-&$jRwJIZww13nkQE+EKgytei=W}3C*-TZyDdwD<{SEE0Xg;jiir8C z^*-==uq(v@+)}Nmj}VkBpPM`dvRCY)CYVfH3DT zl5jYd1UH@S(||;>eSq^n$vkx7zZD;=p&zY21_`ngjs*1MUh2DdBh-E?v!4-_C zp7!kx_uiK*-F+;$tC)VsRV-9bt%l2BGn;61do}S4x6wrTnW)P!4U@x^$MA=7N<%W_ zi}s?{!V;>r?`5AjtGwRPT@UmW6J0m4M5JS7)WxX2`7ZOljty_d7&rCClyj|cpUN~c z3aYb;MuF0qHh-uz2IR09m&9@6!NaAFju%}K@n=tl#q7ml!LEBe@8Vd?nrmVor%Gc{ zeVA`W{C4iWUrydD!0bdE!AwK-j)Guuieu33&hkR_cjDd6rSDO-6yD8DkUI55JRL_0 z^8!H_-1>#J}B}45D8!B+dyJ4tL>S!?9oTD&GIWbzZlF^Qn(CPy=Sn z;}?2&{5|>IjBRHEG`1jWFf1KhKz^67;>BtYSiAmFT)&3Ey8%(WhI1z{!;;TQJIeX@ zmCPQa<&W=jRQ3W%8*BxpB91`^aJs$Lj&PQI`GmVzI){_Mf8TSp&x?u9OZl) zuz#=P3;Cd$^X5g#M>D??+51B%ruiA~D6Fc={5W0YZ}P!d_bLZBMXW^Rjf=(or_hR= z8=I?W|K}9LooV;kVE@)#rZ0*5QyUI`2Qkh+fSnhe#HWa5UwhHnkbyp`fszzV6;?I2 z5lJ>2`|O5upRp;Y1yUT6ULO@mU7w5LhCe3y6}GxKUziq10P%~aE}l@Ksd-4a#}Z~- zw}92fG@1|Badjst_oP~9RX9u`|N8zeBs1zY#JA5=d$W=qJmrB9Ri?z#Eu47gro!!q z8$oZ2Z$i2Jst9*ba*`|;UX;hN*&mbd)0Ih?=_8*+g`!HnQ^x_jD}>dOd_C;Ojdkf( zOP-ueJ9-`7`gKcnYKYdyn!Q~4yI1^@M63eAqFy-^2Dzn~ zm1)@Sz6qf0b^S1^^+y4OkruVn+FQxnind)TNdrgMYr*;J#WZ13ic4o}LC77F>n#(1z6` z@F3ON)u}p6wL9F(-?~7FOJ2i2-1GiwCf0tB0X=<YCd_t)dvqTpEvXtr>{xMV$feA9Aau5 zgwsF4u%iFV3m*jTiSdJ~G;yH{xuW~jYHWAk{GB8pgks?-lSk4OFDT#Gp_3g; zUB7uxa%~x_5_{M=QFfRp>EqdttASAnufCEj~iL2{~2h+eA6u`HfR4iFN z$6HW;)I&;*2xqOvb$e!c>BV zI3>o~S*~IQ%4&+9;)*`aeJU62@&0+0hdu=j@$nOEOR+mT&SqZHwutJo6aGJA1s_RD zG)ik5QG?N(E!D5*Wbq=>Ag3DGv8K`VCq4APGF{O`zE4HObNOBdn8@txtQ!5(#!tx2 z$L(--J01T~(_cFiV}-`PN+K~IbEVK*FuP%g0Wj zl^sX%pc%BIn~C!YWXxDx`-w@_N`k)vLJC7Ii3f>G*HXu1Ne82-Dhx_Ts1Lrl zKL|m%N-I+9-8lapoHc{xsmjy%nl`8JWGGV2Wd4NAl^*Lgi+?>|z!4Ippd}FAq`CJN zhZ^^gQU^W6&ovomq+d&yO+poMZ#|c-#;EMQ0g(v=w^Y`BuTXj>ih|@ufAUq?Sa~vi z-yaA(XXIa2MPN>W7F76(T(#O;v@1vKOOP>SQHNmqG4#en1j1j7t{kAsU_E{vY8vH< zpX1dlLR;^j6l6@IY3pkDL(^F$nAtlm{{Kv5S!pU`a z?4SKe_JO2RhvU?Kex|3v9*j*ylV1tLQ$RVog?TD}K>D%$KB&7*G z+toz~ClNhkY zhxBiKjnX=$e2nyMQ8nqyogU}�X@qmN#E04@Ew7t+dM->_z=Nfg}C787~q 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 z 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

    X3J#V=m2hyNNvOht=vpq-!6W>oJKklr?v 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

    Kr?0#8prBU8886Z0wACw6*?)`Qt_M#5-Gja9yo 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 y4~2zhM8)2U%= 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

    n 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 +WDX|`qKd~0QAG(WnuOX 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νWUdVHWp6PWH96NUDz^yM!!NRm1o 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

    m_i zlltlqEcy=+$CvI)W-BZ`tzCNe(U}nWU5?UrG^j`$PiH>>49&?M(*8iXnh%?>M}sP8 z+tyC(nr}?oE(NH-L`rg-YUnoPLxD>!IKlQ6z8Oc+pRKvORU9y{2K5!*1Y)2*7=98& zjwqp&lRJnc%lkRHObE^6d9N~PO%;f6@=>GI!++#{5?=6JP|8^DWh(x0>s{u~I_q#_ zJc>#PLzp{8K#P@sC-pTPd3mgAh4pweaL1l6qgW08(~)ZM+nxlmf;45RG>F4zDwy)y z;!vM3<4a{yaNJ^2IGZV#{E9)y5RKU4;pW%Zt79eNBaX-Itdg$3r3)V+TBF)lAap*D z?wq_aj9u>PSKuXpGug~m8DUm`z*8cp0Z)S=LIw58lm-Q+z4FiYvYp31L5V(4a>(B| zw0cA<);%Qp->)!wuXx7RBjy!za!Uq?;7c?#aJPi-3)0T*$=<105;)oWiuzFB*@c96 zQ*NA6ZxDA?2WcBju4XllznuP|^SwX+N+{SOa=0=Pi)J}s?K3D^eqz1ghlW;|VvHl} zi}$>)v%|z6Q&4J2M|vPW7{$e3k5l^6orw-}EG-6unmPz*s427=#TU3C(9calPoaA} z-wTOwl*LFF;c^f4+nzv$~chrX@kY=N_8)6iyLNXH?h5Y?WK| zhT^l!I@=sfneQTPI5G8I`c<{wpl1}+Gana|T&zk$$+G|gY`8@E z_z?q%vm@e7IewK3jBhokVt2M)ozolT!jnp=Y$Mx1|9SadIsu0x2?TBhjVGq5tqgBP zLfzLMSA%rT^v2}XptGOY>${WCa9>0u0 z{Hw8rKCKdN*hGjgmS*mT5lgc%J~h9!fq*x$&R(M~$D7LF?)Tn4{wb?pK%!gRNTS-} zOnpMt$hXj-v=~-TO0zC3Nn_})htTB2e_8!?#hZa_PA z?lrY`dwNZ+7Tr0XK&QkAmUGAP(I)8*wd;+v3vIG^F@@nYkLN3~TPVX*NJmB^pc2vm z1nGbNn_<$*!w(T9f@%=35*)=XdAw`^?aqI*4{mh? zG?xMToe4nl{>PRwZB*cjWk1)P^S>FaK^T}`AphYDY;ma6RiKQJYYWSLbcjexcHM(r zu?ge?bJ`W_@@fBggEUUaj~UPP{G0L#SG4g7c>!pKa6mfma_>DDZthY8$}N%YwpsEU z$ZLC%HR?|Q65Kv~kNhgK15~h%Iww3C5IBPVIa9L*(*Z-fv1?R-@Ca~#1ZJoksEHh& z;~I5+yzT)tZuv-`15DRy4nB-HNA*DOF9JuTz{Z|?ufon$eJ*>v$vQzd3i1LYoQLr@ zXx%>v*#6>4v)Wv<5T^2KByA{ta#FcIV*sl|C^-d~tDG>J@V0rbwL=XSn}`r;D6fp* zcxrSufLeZZ6~Jz3(@s)3#$^x1Xi5hKuQ|F4-ZH1lo^HuJNlt&#(s6kp_Y@`EJT|nk zxe%$DU!L>(A&p$)syF@Ab%W8P2+v=YCb^i!sO@BhSxL~tV4Vn}Ap#+oc4CTxy!nsN z*LA->P81NE%HM$QiAyRDIK`lE3FaM;>>eAosUh+?!{I-^{9Et?bGX!BRI9__Y=dup zN@e-JEH;>7()>bv=^IhFnjbqbBuDIQDPSu%5kH+Ir}7X}Zojt{fuY~q98$y%$og~C zI*h2~`q0Y2CoZznP5hvD1Jr`Z9;DP9nCA-lQp9+5Qb97v4jck=opj&JE5BgtV`Py7 zIq&rz8lvof)|!1Vb8}!UU<8VN z-w1mMF(27}Mgw%JSik#~;U8B*uA$AIxAmCwh+R95#U4g0IR&sdGPtYyID06Y+8hRS zmiiHEDsR$I_=p}}2A=%}JQZK*v@_R=Nb(L+pd%cpmY}pDw;22=G$R<7kU4HhFFOkM z5OLc3x>L}YKUhAd5{D|}Nh6F&kBaH`^1O|NHii0J?eqOLcFA4>A!otOyg;lgwf7Uc z+)G{ZS?}!fml&fj-27!dE(^IO#TjEQd8DXF?*t|M&}QXxiNEq|FqH1I#dl-W#wYB9 zHNq52?`FPq#1(zm*>AKyqZrBDq4JLy#@eE21Hjo!Bk5*r{?kZeX_p(9QWO|FL%UIQfByB!>pR#zQml!F>v|^ojX$8?%J^C%e{LhD2QeNRz zRwZ6O4@yjpUrQLUceG4C;i|K>%H!QB9HRRO88+xN>G5m$R33o38YwVdeQ%`qaqd7w zrGnWX%{wYFP%T-mOczFHZ#7LxC_K@Yb0+}Ag|AlAV_~2c7vJi{&FId0+VA+ZF-W0M zg*FsJzw+SZL_h6ott~zOFY}u5%ljc04ezOu*6D+HdNm8^+f1f^6ESwHD6`w{TK$;X zg;vEgIY+`AoOg$zLQT|OjQ9!MANXTk=Uic++7t?A21|%&k3UAjGEBdoS@|* z1xAYrCt5nz&T!aZ_=1J$>_);C>1Ge@6Ni_L25!$jaNn0@E~lga8*5m0@wfNt9X;!O z=&lr>Sbb@upAJuC>PxD?C=>s8cbv&+$z@S)P>X*`_Ieb}qf!FM0gLzpmM8Eb-^ID? z@ro=_)u=H`m3j7+8vuc{L;c56xDgm6ptXEQAP-?-aHnV)^(k7vfq zl62fRAjEHHp-rH@@!sls&91@ zAbdqV_&>M&E+aWZqcYzwrEk|Pr{{?i6xJ&`OOe~&dt+Cgk zm1$(vAgWA0(Stj9Y-RG_?FT4BTbG$&2k%RJ-s6S9*JPXM7C5|#kxVaH8<*gGGZ%4q z(0ua;-b^SyzmK%^Qxd}z00=xu5&QC^DOh^hm|s`j`7{Vhv?*OYIe_ z71e{E8sr?$_s9Oj$K3^i3|0Tb$FYGTc_Ov$NBc*5MA<}&q{_sR#{0#{=gMaXW(TDP zq+CzM&R|+CW!D0Uw6BobH zdo&YIc;(u|`0B`2XG$>^%SFMg!c1e5L8En659Mn*Ik2Cv*q)^W@W=L?-U< zrtSDG*8hu(6D#~?URDf^Izqg$eZgP;zpsjOuwHbMb-k=AaZp^^ScWZfhDM=gv7wPI z08lC%Kn6jsA|=5Weftes7kJ(cY-mD!@8$QIjXKhtabo5HyQ86o3}MQ0zsOWV_jDsq zzbL$zq{)6<>c%d-q^1&U)aGq9ebJ{v@J9pGaiI3jmxZ6YW(Zq~!-v{TFi&r- zCKzP7Ouo3XAE&PowWG4B6X<7DB?=}~=}-8hP<XGeg;*C!e;<+RTIVlPmC94^z8 zyQFH$Yw9;9Jb0i}UKI;wuZ2Uu5@^_m-Lt%4P_U%B+dW|Q4R?~Qw#Vcw!FQ8#i;*I5^~a?cdm`%^Nbslyh% z)lz9>6@T9IN|miBIoHB;=Y(3Shb)W;7D;u#t$_F#(W49EhhC{&h->A)?LKO;LNXlY zRa$vEB4r~fxfNlaI5yb6lsg&th8Jgm2bHl&GnSWwMK3HaFMbOE)Q%(tz z>7V~U<`18c>>_D8@mS^V*ws6V7UEd1G+Ux028;e*D_@l_PRm6*$Cu`(H0f0{S^Aak zmzPtCQ{8I&zEtwYZJ8JdH~$CF1N>-Ma z8}ZcN#Ww%P;M9E9!&hbQ-=l@u+D@MrH@*#jqdQ1r-D~%SXm*6QIITLwC;Okh{ALOV zo%`@XAjBPYb>#}k6}{Q0vhMaLP+byJ8ufn{TOCrBDMgdjG#?P-?o_!8g8c@yP-cM! z>`An(odC$TLHiiu3-FNo!tEsXh&sCN>=7*kLv8JHa92V5Bs%QCdyzaeq6;}&ETw-k z!7JvdJ}-h1$mn$|q-Tri9WO~a{jo1QjiBmzF7eofRBW38d<$;Jc`NPBhkjXMgTI9+ zJ@9xC=;Xw}`!e`*M2B$`<*nH#cms2YQZRXJspr26SS;;=AuKoeT5>;7La;$F#(`Hv zJU@YAB=&Q}F*O58mGP2|p%zfmq7LQ%=Ks{w@T@vL*lMW${+EJ=2b}2S zyCpe<4$X?CB$OdS6ahv=YfV3Spd?J=3Ar#$c+%R*8T2pIVI)(^HS$P<()9U;C<8nFkm-E7~|4o%}+io77&e(KAuP*Fp&gAih$ z1W24Uc|$amK8JXFmGrl)1z7>Wri5RuGPctKJU_@WB%E357;n4*3kqk}|9R^&^5rZk zv9Ngo)n*L7-Qo)O%Gkr0gs+(CN$@b)I$mav%b2h}<3CDan(sN*K!xVVzaToZJn|SS zZowF_^Sy!`y@=Pj1dQL}gaSy-dGFGae``D}SB;~AL?_)n#(NtjDe#BQt8cT)=th2l zVElXWRIHEJnz0%s?&VCndc^HvcK{Wz2rNeu-V- z1;K}_D2WMq+?q@+G>RGk$^kq{I1a*~jiYDL;U0VHwsrt-GQ2?xC`ru%C z_bded2bx0wy&T9F2hIvTh5(Pm|3FnsxX;)EWI*bUZXO)o!L~sS_bAQ&?^k!VYCg;Q z9}3SK*H6+3OjK~(IM~&yZ99&~r3nK)nvg$9{O3ic^6ATq`dwGrrp)_=A}vde)b27XM_y?HxT-^)hHGz{r_ zeMd0Z)u?;Lfi)~km!5GbdR1Gk<(_#Io7~qzrZ2!9JMuSyCoWvsx0Pr}5k50}7K6F` zL;Hkb!#U*r5QCee$V;b$sLy+gXaHHid55*P<4>!%kX~H+PFHTEG##E!XNA+b^g4=V zEpTmvT{tq1p^WLS$P;-|R`&I7xiv64k_S!LQyjwyrX$qX)Wd&~$|{IK+-Od0db1vpDC(!ow!$+0cl4;_aYiQVTxn)xR70dNPJf$ohw$rQ%xkQl$0sYkJGnkPPPZ0dWm^ zA#O^4Y@Zwb=YYOzvqwTJK`oD9W-j>7GarVHS2c8{5?Wfowj=A$p{hA~FtaYz2@yvu zK0|!bB$cnm*dD8;#6x_dR_+Orkku5wmu41+8#m?#P|Pul*2mGdBIU2u8|!YUiaak< zQcW>p1xs9;1Hz=iQKhjx!+g8kM6CHpBm;b$STsJ2zPbW@d; z3sKWov}PWd8EtymPpdHo{?cgUsN6DZUmsXFC(pF11pLNj6c78_KGv28b+38%T6x493@g|zO~;0Q|x z;revG8=(y2ogNY5CkJRctzOiZyMwEKC-wj0ys<1)iBc7KxtL*v=iBkr+ZNC~aXuzD z8_5C>q?D_R>eo6%e*rC%$DMl@MNhO=(xg4@h8g32yt9`kwlqkAHYM9zT9M3|xSE*B zxp63dDuv`DR@5gj>US8^TkEUKz~8i$CT0u z8zVgU`xTmVvo8oQ3pEiWgq!tX0!p`9sa0`U?383&+JY_?l|dyJ=@gE|ifSe^ASoX< zwB=sLIUZV2+O);=E#}BepsDx2ng#Jh(ktaZi@S7iEZm?>HuzN8;!jv^`AHcMwpVA1 zr5`7E%OTKHx2h`Cq%kZP!%UY2d#Q6=&dKfMwY`<;fk1sCPJ8(rHSMlwq{b*rTeF}+ z+2s$0=WGiM%H!x_gbPfob108Rg*+#F`-&jlAKv^;qZk8i({h59tYm_p%g7Wu_S18` zguEWoFZFT$&9N&XWIzcw=iKy04_}rFDSyYTSl2hRR2_CNq~%>oFMJlRWGHz5`*c4c zQQcaRfrJ>VaW7zI&x~|1ei2kzF)(<`8b7N!(aG2iM)Dy(@Y5QzIZF6XY+=?B_-r~R z&>5?0j()!KVwSgsJdc(4lWEe|`9)%vPfyaoxfxIMzv-Cl|4YUUSSy~Gw8Vd1VfW)w zNiWTZY^=@~F0bglksNka-feHc$JX^Y;FjAHW^>_)tkR?-jP8p*a{+d`f($eEDxoQ3 za}GTFF2)h{teO9Q?rSIlIGugvlLbb&9b_dSWyAzOb z!%F~NG@#zDFHZw`Hz)zh^gYV7TwpWTf209l^VJ|6cIgVY7RdpUo%SU-ZN<$MPOB&6J zDuu$(_buaBOQljF?lA<8c>OFo%TndHF4A}|f=-L~-*7@UcJe}ERMqZs^8Y@FEE~I+ zMg3(8SpS)^%47G46iBji(= zy^eR{(6&AzFc+4dDkbYwxul^>YFQBmHTRO?~GDce&bWRHI;n1jegc9tt z$9?$9YKJY~gSLig^R~i3>nnG7gPli-tqgpR@ME&taBQZg;(k}W9T9%2(jKnyY@s5C zCjT+fM@%q50LUTx5Kz z*Sbo5OwTZ4=C9tRN5Rgqb1%Og^5l%5yANpHZYfFvS1BUiJqK@z<~H#yAIB+va6Rzg3%*_fUWxr{g99CXzRHe_)lxmsCAk5k z5&+E%l&`?p0c*4H*(SIS`F0_Hlazf5*34uGO6n=$4Ut`B14yxZ@O)MBfAF+2fbs*B zscFF6Vny_yJ45Bx1qRg5+xXpl{-?M%mR+adpk56b%bpTWLJ65)1nX0?$OY#8?L@ox z#E{YzgNhUnV7au$UZr`9KrP*8Z@-GThaT}+JlMt?Q2xF_2;s~kVQU`?Yzw#f3a$MP zdOP5rh@M@r!kZxICd*eEf-<@!68>`c(XGv-m2hM3$b7ZU5`MwnXhe{M40?I2Q|4W@ zcCTmSkt78n#}S<`it!ynLjT}J97}iix6j{#Mo5B~hf7Z(f4mvszOaRT47uyWh3sHrs;1~)#ooeY zT|Y%awJcfj?&1IG(&zkBOyKW46T{&Sd(Uf;mW|)$qxsw~(rULJS`OKCJtlSi6%N_5 zdtkitN`-V%PJycjN_1LAer#kOhm5Z zULDDqJV$KS`dK3%bNyGh4U%K_Bw~4Hw(J~-2G|-isFd-ArfYh2TemHyHhe-WhZalOhOe%SP@m+}#4+ng~mXd8P-0)w4@dL(o_`1w%&3ibJ zjb?-5>u@o0%1mO|+yCy3NxVQ4U4q0~j_d@B+6tOJvM@irV$iAFMw z;zMdR28OmBn*YA~e0mV7qVVw^?8#l!!o#=GRsk++|G|fUyL5l14Q7A-SsCj1LtjiK zn_ooqEdeu`5ld>;uGB~904uwA%Yix_dM|lJppnd_p=a}i&6)w(&4s5#o z40H=@0fvoAO!xGiN_lyo>O-K^WR<<(Ju32-d36@#2d#Tw$?6d&^rTSDXhxEKTc<=) zUK1;PAanscRRvNyfc_ZpjRBo)K5$6m23s0p|HrU|$aVrNq1LHjAaQJ`*7I&= zfjDJa7WG}AbCYJLjw#cLH3;?Xe#9^>JpZq?-&#K*)m6WjTt&&O?yNs5B2>3^ID%?T zyNN|HW=w<&{+x|LUrv$fCw^L93p9`Zs=m)QdWuFN>Btop@Kx23P%9O2IIVw`f3k@l zqc~Fx@Qx5n7UW7XsJd{0b^5$$u^J?!Bj?AzMddDr%}(R1e(eA4wTCzYLpbOM;xB3j zS->eCR(x-|J)+-n=>^@y#6woxK6gkzU+c?BJ(o_Z$eGWD;9O9T-9nP8$&DkDLl~}T zLF_SAnYPCikxpWdMWFF1th6G9^byti9bVBm$obp=JkqFgo|18;=|}8glm3#AEX!T- ztC#Ql0O4Ze_Jp&oXznZ$0$F{EOg>Sju+7FHRyMpHO(s6v(biK`6$t-m_{fMHpHSJ8 zrD?ytB>ei0en+VWZ2c_k756GC*NADXR@jX=-1|~b=w}i=!MOvoxp5IFR{NW%-wNJm zB)o7K5BJCSlan7QWFNUV7^R!t{MOmW%zh_3NksE8iG->2zMGI7xT`#$PnRh&3UMax zGAbpB3A@Jg^DBDRgu%J1)0bSwVPze|^Mc)+v;%;rQ&@EIV8|#K%D7rcY3(b|0Qpvr zCE)RswM?wTVlb90UtHzo@>j4yAAj>~G`E^(@_Pdu<7V9#DH_=NffG6+>D>)Mc zJdppOdr83A3`8OTA~me^+DFE!1<-K=?np@sm90(siINCl)P$Wf{ZqRE!=~h0b2gde zMUdMk-ov=tyAl@!=fIETw*Ur4xa)%)zzB+_Y7GtGJgfi#+;PIhnB)<3sQ_?)0$jg? zxUWM3SW<{#uO^n(7Zlnu$PEBY`me66g8>;s(JhTVz|aGzc-n?z0$wIRxq(Z?y@lEX z+VRLG&RiKF@|8QE?;D_m1FVlQ;8lPx62OV10%$!YK=C)oeGKik3Zc{Uubz#A+K8Gb zX?=P`m&JV`@)l%`Oo)V#Fs=B?qwPqyQgJW3pm+@ zM39#UtC_<49cHs#* z^+dS@{1SR$s{UIE1qJPqAC2-MJ5Zg)qjH>_gjA!GLW0aM{q1vgoL;zrFwWe}Gio)K z=ZC%48^h%kzi}(a{pivp-`s6Dqr;IgCR<|0qxsPfx+ONX_(p2Q>fzhJF238X-LkAL zEk1?(yZf4npaFFBH6o&`?zLlW5iCa5;5%Z;#R0T$^2J@$5&$VD3zfj%%BIrja!}i2X><>%6=@_%sCCRtc&Ad`)f9l5e%E^CG?d1U zsETSN1o$no5aPo_7`J}VT z0Y@AQk+@bbnP6H~U*xhfH`d_JS8^s#D>`r@Qog#zew_SJ<@K2X`Mm1L29S|o3|@Rh zTdym5Ik8isq3O#fwi1hKYjSV9v;&>2sB6+iSa>bldNb)2;uvX4xsF3uv*7Pfn<&Re z`@o3q@j}*0)#m7@okO|yUNk%131EY3tL=W?6)tr~P;Yn5H~1UZ^y2xMSD%qu=f*(? z9e>xmXRKu)hU5{mrm`L8Q~`ovvWAbIxWfW_g*M();BVr_9wb&SNmBha7GG$vO z-;M2TqPtc6n9S|)yXy36oh}-jxgP(W67>HN0C~+Mhux*k`-^14>VutIK&DD_G$uI{1W`>Rb0d4@2=7@2e~Q z0$+-A508l#>}#fZ6Jw^W_uy2mjHfh;S7YJC=~j$6zd4JhC#BwW>QOhZ;?T1T%HaPX zq+L{c;#k2n3>7`sa3p#D+&&7&XiE_KW>cT`J@PzK9zlv3rxv*$ULG^J_3U&k#U(x! z!4|bdiH*yy*v99=dt~l~Uy<4|NiPqONYRWA2z_Czgc6*dW$*qkcH3-?x)+Ft=lGtGrWJiizt@+ z?1Z;`SW?Q$s`I&oIA@bC`II-)GyBH-4j~=4lS5!0aoTa9AiX21-^$O5z1TmiQYNV& z7v%i_kI47-j^}afB%M|n9oGiyciI=2Wr%{vkLEt=(&{f5B^y-cdCpRRm{=>pvPL&$ zfE(vShC2al$!o3Dc+$o4c0;UsQSLTF$#RGJzZ@x8diJOdmuT66#JiG9$XSiw*%A6xA@Zn`Pnh~=H1xI7M9H}GHpyy4H96uDVTVJZJ&C{SnK=G8 zB^KoJ*sz9?&z#x&LSt?eRGaTUspG<~Nw4)L-P55lW1GJ2g4mZYzomoV@>6q=l>Ui{ zdA}}AVT9q_Q-#3cU-5pu`#;-YC;Bt4qISaBWP`cnHB4W8Y9|=dKhn!A!%OLj1i*7z zViInOTaB@m$wQ4ykN?bZ)>3DS7lr5$8JZa)#>1J@4I14-EAh5a^Pfx03wCv2f08Ji zN{}QBbCZcvf@VL{<7LDglx#^~ha@~-B6eTXGPU6#t#$*1VbO_9w^~p^yCDiqLbf_NlA)l3&DINA1E?FwcuD@4~rUyc6?3< zKWWMIIw7%kq9SO|;h?jWLc(a+?g`TVc+%~_dn3U?#$ri`)K$PFvmr2lfAjQTv3VN+vJjpQ`@|&bhmYWtj_EzO_ zuaafFI5UPhsgKk;>3+k80rVsg{q?$Q1PW z-ICd1S2BS}cr$7)RNz5-MSJXm_ztZ|m9^H}-^B(zL|=O8mB=eG62?CzYN>X4?3>cw z^0{x)><%5$G&DRk^9Vq?z$>B?;^^4nsz&JP1oOu73sjLw}tpFv)UQ_ zj(NIy_2EXi&equsfiJmH!RUqcGp5}bL5w0L9S2SSYBrJ9Gv2>e%THUVTUafv+$#O( zuTVnJcvzdr@PD@&x=^Iucde`z(<#=1X|i8cwhp?YpxR{5*DUm7v|`%{};UkpJlx1-2xg6 zAU_hAivcM`*y%F>9sEbW#>R??o)Y?Fdx(X6nzn0$(BVd37>v9RQ@)_dpWdydk$(PvPBM?ht zx%@}aw*1#+lmRt2U~mCwD91^+d_d3e7icRU{CoJ9bLIvR5dm@wFdYBi@M#N`TUox2 zH56d(TtgoLeFyj-Yj6n=1p}VWAfRKAkm1k3`aS=Bk1&=n_;(W}!~X`WDz?MESq9+P zjGTx!!#?GfX&8b8J^=fyzyk1muqtCfOMF3a6WWvM^PB2i=_a%h@QD&Eadu-{gj(zApISRj}3P<9OL=M=wHuAu5Q!-4Pb;j?;&gIZZM z`We6HG?CV_RP2_>7RcWC%Q`JQ?Py^U&qO%NEvtx{nc;66eA7~U7sY&iD8-XCru`%M?*2!-|r((p(1+s`lXhs^*x1-Pt_3 zbYCr;bw;peOXV6i={#TRl|!|>>L_jZKoK-TD&SII$e4>-zUU}TdBOkfNxB$q?v&)| zCv*eUUm}S6aS@?dd^<*bBAJ{ppd}2&g-M$a`Pv;!a`ROR&rp-nbNtww6Nv;j;Qb#+ggH$KZH1p zn2~4b`~Aoa;mp_K(W4bhfB3=ZE?%Am0Y55Zu&`mMs1F|Jcq?S z9qW@$e>j=(l@>j^`oRx{A~7H)O~JnEuH@en2MIJ|Fb2kQq+pRjLx=PDJVxZL&bHB; z&`({k$Uyc(uN9BLWL2UMXmXL>;+VfhS0frO`e{@GwC7zjpHEq|1%h`=qP>Y3j+Ch$ zQ(FFKJKU#fb^{;b;Q=q-VD7m75V!KW|=^?|GlXI zoa@mw`aL0qzR?$6VX}!sH0r+(Y{O%Wi1a~_EVyWT%ib$J@>zWr7cru$TK;aO z<7l(v@liV>ZJdkvk=Bz%51yJ(JB(-M61OGfmjR7UOx73}w)q*MXl1iru2ABM9@w&s z)z9jX+!dj98VdTBNAE*>h*O4#n_Ni4(1d5YA_6Ru+X@OkDTO6osbQ(5p3n(lDi zW@ehS&krH?d;{vVMY!>jPC6q#is1Z|Sf+``@Y9{J-5i-ntj%9A{V+r1$9 zz!M093Q9pdKqdFIUv2Y0=B6tm0pvp94xfZ2qP?AhZ?O}(4W=8i^Wb z=Rmyvw!su-en4ENQz%<4XAXZ?VnoSITh@bm|M5xtqwc!p{O+azJd| zHcZ!z)3yw#_27C6SkIB`TV0g?>uFhEuzb4*vJX9q+?OuB=WjD7iUTmuW2Db1!UyRu z@0}A-iQ@%L1hlpNyoiqGgWto~{yF^YhLq|9&fjR1#glUFemg77Y2TbXo!`4Z8aQ|t zkFH1umj<4~Cqp6;42)F0zaa67YqVk{nSn+Uh3$v+RdwKm2KpOy`iPl%%p0<)c(YnP zPf+R8!xbLzfVK!lgIGfnJ;Srj0ce&=4Bu~~+D2OLM3xtE-O3XQ?e3n{?!}}SrVrYD zE)bg`PwHVI)?z<#9yaNN5Bxb=OC|z941LcL6t^e2eGhaH*nU3)mBJ$tBO(3NSNr{g z#3`DJ^cVC@amt323#51&Qg8?)^q&0<%tmGOE)69uozmMh#qYnH{xTZwYVp-2C|LT zSnCeH^{f=|(3DcZ{v5rubE4%JDt=1!Hxu5l^chFSaj!TuQP z;V7j-y4Ac@q`i?mn(|}TFY+W)!eNhE8BYe5ragSeR>s>0OzV&3?D5g#!F}RMj}qk) z?k?hB0NS9s+C5(<6k82H)m-(fH<#=$Ve$YeiHWi4Rf*9H=)=%l=2mJbro1)uYMdU` zJMC{>JiG%)cu$o<3&an~c~bC9OG=rs)DZ%2OV<295`->rCr{eI&qQ|rF~RX&mOVx#AR zbc8jETs)~qgx?*N>|Anb1ILe(w-@?y(weA<$p1{wtk$rRjgGY`A#Dd@NlJXR@RA`k z`FDQPqe=}2OsO;zSKpcq48LuNdJu`>L37`}z>ha2;)fSmx(Ri$St!7K6_s1Rboewk z#L$I7U&OTw3ulav`?oPBIVxv0XiP;|+apBRODkfn1#;k zj%Te*>{V15k zq*G~ot=-u@U5K(LA$)a*^-T?3;-Eosi&4Qv#)VLQjK5<_wsaSX= zze`;NWGg@+{l9_3C;u$vfWWf;VcoRCapE2jW1M)6yO-&5{&E8Fn$u%L!qA({ABO}2 z22KEUwpBKEzAp~kkTBQ*aB+Xf1hHL2K7b|!u!r3s(N)T`4?dsnohw}*#^y0vfNm8T zv8e4}zMipv({u~KP7av(QUTZ?P4)^UmN+Qb4HVXPKwJ)3_J8mxyzv&;WFNn?h$WgX zY!8tCZ+L$}7!=y`+HRj5;HX#u-uokxs{vWQ-2nU`4++4qZhiX%U>f!SVL2ZrqBS>A zXM;i7+WW~^grVJG9OPh=|lBLuc=G2LY#3gHG_djg*pZ=bI+DT$h^EbeLkVe z4^h}E+|Edws!rpEw2=Uwz1S;(ue%*UjGjRzu~eks@*T)0njj4&AV=4f?rQu3z6MN~ z3ET+{0p~X>`U0?6&6Cj3G-NyRlfN|>G>$Xry3K@;+DD#hZTdTyg31MWrf^Yk{v>*V zRx-Ekn>hU@ia#s40E|!m(X*W^6-LwIcGCg z(fj{b!x+Fc&*J>%Be|=O+=_q||Ya zYvWOlkEvcqa4l9p9GjZ!D6y-!`;*yoNJuNJxTOd$rg|_FcKywZ2LyYB$6igt79b9u zC1ScEN8$7{KYzV&ak}E1pdr7#BR1`0D#V6h6n0L)S zZ>{qoW6x`XY$&quAU}LrDi_~P5j@McGM9Zz!#a4XCKg3Gx|~(9MHW_x`z7t~%YNHS zS95h6t>Yj#L2k2}gMVV0V>;r%OfLxF6raz#5}13ikRotcC{@TZndNO8hKD0~jjhrV zqWJYM8lCYvzDVJL71{1r5SCFE9)QxqDZ<}VHH^`Boh+VbrGakkoZacbU#` zC<(G?r1WXsluEhTY-~N`?F_Xv^qxefFl+ClSAS@2h6-MJDB$5!_y+&nwT)caTw(SJ z=qP5pKMYdOiPRu`c075wLC76A41~sb9KP1bzgwqJt|M50<5vDm?rZ$_Ldnh@9t9i7 zWi*!={rO+r{@B`=EQTGH8qD!HC!!f3*L~xsL$BG|Xb5rPi=AI$x8l(}$#H&cTt|z;sKXstN z+Y4zPOvQIVpQgb!$YA+XkxirXJfux>65p+$f5;M&XCu{K232#3BJ~BNx-QmMA_*T4 zz(INEU1Yu-FHq^6B240$Py?+sI(ok3I#dcFH0@RI@B@8!_sY}8KRndsVxm70psAaW zO+3{bBsq0Jw`6v!QdPd*lyNjDfS!2f`Eby=4O>J?`| z>-FDu{Esh&uinwGl7Qk}X=4O93~H2uwEu%H8LA^p#~f(z8~0azpW_#dCx#MxRX&~0 zr)ol;PFcqnAa%)y%cHkgn$v&Y%1X(qWRetT(Mo(s(;+8IS1a$R-jVsqs4&HHhKzo! z)*goY=4Ip!#SJAh8RUpHqG?f$Nt98GwHp@E_7>5?*)#R$J`Z<#WBof49a8aceH1Uk zUzBKGu2d0Ob+4UNSh@7(NkVgT!6oaR`g%j$;ruW^3jY|pwi!`-qrPbqb;Nt^0r>`n zGUF4l;oQ)*@g|LE&x1+Z)buWJY64PV9`~`T zPu)3~=qUs6N1!&~FE{M)P8R{G)NViu^^EcO-h+A!o?ws`l5%lpL?%J3>p!lz4$k45evkgI*aeXfV_4)$gbIn};KJx9SL#%gnSQw ziIRv?!P45K$~{WvQ6eFXR+;WDt@|>yTx1UjsTL-5a*k$I6P1+f@P{BygoLiMMg`w8 z6iHvRn4GQc<}>onM$=@eg_BR+EH@FZ!OxZ0QU#q-k63%*Pk6ufodvTrrh_VbgK@jR z{MW~lbZAeA^b2eO7tF_#HDK=C4-YxC=-Z3;w}*Tol0!D7K_*deBp5-%fzXU+4nsb; z^x*g>)Tf2?>_un|YLOLb%Eg1{ZsP`mwEKj7P?c=s_MpXBi+(j&*zkR^SJNEtz`vg| z?3VX_x~m5+zo~xs;;fr#jMI=QXfQW=MFlCa*Jwvr=}LaKO5=vG^NikSSJaXX2%%}f zh214_BJFaxvx({t8~C*H=GiQ?Vczr{ZqPnc8)g)Sp#=Boa9Q?-&Vyi~YN}-q-Se2NJp0=|;8MKL(gE*Q+y_~Ij zhf7;SwVNR7|48rkBzjw(SS%p91gtN3tuoZ6E;1Ke(X0c`$#3n-+s>B+*0(?ao z-}|I2>pA7%?s!1i{_fIw;Fp2`;$pg*A{RcL0hX)}Hh)IA?W}5kOB|4wg*{ zVk=fgERG_WSrw3B9f)IR%0Sqx8#Zv}BepuV$7-vPKnRTrP#XeD8|MFwHlEl9z}D>m zfiF3rN2O<4@H(_*n!A@5keH;PfeM!8)_;&=T0t|@3z+$0!QtK5Y@EL_nm|+cw!!iNz-B`zGoVEV_xhQ1-Pb`Nqw>0`k5Sn*gV?o3l1(r#M%@v1z z+t0wbuPNLtR&p=mA>-V?Imj9tX2>319DBLQJ4!Le^}&+Ux@g5)U0X|8vM9eiL2OZ9 zJX583N6r0(4dwqgl(_i)-*w`$Ut8AHRs2n)NN2LDD*X1mio2!!FbsbgC_hiCk~E8MPB@6Yk=%viV+p~C)A%s`GM$+;X~Ot7jjA( z`mwrYKL7pa)*9OAh`a1CD!GWS?aD!ha=Ft@!g?1dI_X(XzQ0wCZo6wGLe$8`$oaHb zV&Ba4h+16z=K3gnBy0qaM7J$LE*UG-{e}F zA7f&KjUw3bC+gCkQzPFgGkm3ZkC#SPu29?Zv_t(`PH}8>8dSV(LoOk!O95^P{YUNpB0Il{A7@-NeRI>b|WuMOg<9=Ycr1?okTl>Q{yJJzN$j{lhx}_hT>e?;sPW0>^4<=Y%T_#NT3dvo4xTOdQ|N*DA@y zw`_BoN&3bU_F||E!<l7nC@(wFSF}w(CiJJL3{Of9twU_ZF4*Wm>$2L+)NL>N(tO>Du zH!N<`ruEyrAziSIVm7%|*{=9V2IF6KF3%}MMg8wt?M*i+66rUi*{C;(fnr~eSltqi z2pnp(4oyyEhh4w=!P}~7wJUO9y<|ZhwDD4g)ToG>`1A>t!t~Te^zj~$P!4zJy8Eh9#Wf7Z82rJ_p}Ocb z%H+9g{H|-q3Lg4`w7ev0a{3;p*L#*Guv75W`Q=@Oxv-oUq zp4XJIVdk`bBLT;bBCu*LnprL*oqFrDl*;I-kW<~WRoc{pl=1skM0el$lQ4-C)R3?V zjKr;yD;*s^o{U_82izs(M}KP~X}a{{*ZaoMr7ogmVp#kivsVCvsm=AyrMG4PG3OzMPS!tbk z}P;Yb8mGRu!zoa@*&1gm6M2=pI zH6Yl*?BBu^*ewHGTHbiG10Y)hpxy!}QKnlUK*JRU^pQtUY^oiwLB`IfumVr)h8mcE zxlr7?0EceyCMpnfi3Q;H9LHX>1mG+IGb+4d~*1#li~12Z*Xzl;st2m&aI0>CT` zI2wHb^(a;y`@d^!;6Mh}uGk?HU{}U!Rmrh7tQ#zc_m)o(3orx-Q-6=K`EHx2fB`Ac z`Vdz@Q3F7>!j;I8{Y~|c^>hgaE*i*=8(hKx_O`%wR|!bCI2*#sJ(ZnTr~>f*eiFcL zxO)H&6xCT|5VHj^b^?y$)3dM}D}Xc=(BFaO8|EKFuKMNBrGlNy0Y^rw zbK=8(rceG8t0gdho^VOOGfLDYqW*+m3{J^701rQpGPkmEq;vJ+*|NzN=T)poMNA3W zN-*Rnq<{F0T&m1N{xojWc+hP6w$1+Ku^ubRwkR6Y^PpxQrq7|ix zq0=L%y(r>Bb?T~@d#4e!QXgH&Ylre{%J^^CMowNp#X>P=hH1+(F%`~DRFiuYgrGDZBX>mT zK8*;DTz9sAL=qeVJr&gc0dM0YS)`MpVG3Jsi|Ey-&otKVJ#7{k(4{1@)tk?rD+$~0 zB_$!aZ%9`kUvy$!g7{LqVdJfEsvrG4|{yZwnGXvTW09OChQ-Bnk4U&00F>AgA~eCE}i4dhwj2iix& z0_R~Vq_2P8_v090o|DkDh8Tl|hqtV39 zId_C-7B7UISbzr2(vg3cF8GtNRf+jhj2XD+_c!}(`QL7jr797e0e53ODt1Pk?@u!v zyIPmwEsPc^Y~L^(dx?3kPwQE^dSW7YiQzh8C%AbpJ%&p|nu)aEfPAHd$QnE19p{}( zVK9z!CBwV=J&3jG!)uNR0$L zf+?q0nE9=|X+>M~|7>jUVE840QGLj3Q}WFf{eGgk#Z$TD3Q^;p6g zl9ZULSnx9ALTU<|+z5W7g>b$ppwUoc!1~gq}{|X1?rl=xzI$Pb2DusC-M;Ws|yb zNmre9F86}UJSK-2I$Gqk1u37jWFw}6^1V)J&l$7qj{c(oo0ZlNGgFwWOF6C~36Se` z4$T~Yc*qV$>E3P1*vBXM0qAFyk77ldh0a!~kS1z)`PSArRLuOux-(3kW)NnIs0!%Y7b}Eh5N{d5V8`abEZ_7KhA#PT%WkJD1EsTM6O^Pobu?E_ zIPq5_h?iNQRx(jg|1%XubRT5&6LvYjN>cuDXKfsqAst=S+xecEeRYR&?98hb8{9=pANf{PQ0HAc(Lm6 zQwA(ttkxJZG0SgzM3eXH7Y!vh0l~WuI`EJM^J?x-JLeg#HoWBbyBgPC{H{tH0ezl?>7E&|C+!r%7uA{MY$ZaIYF`B&(^rETk`J?YYRXbT@U~YO zVt0`@Ux4F|re|6bP)6y9?iB!8N?1-VU`_ZRj3Ll!l3<~ROMF;A1~!8U@LgcLNm48Y zaTKslVBH*>XaE`muy=t?Nbn^X=>IO1gL?O_LotG`*wsyU^1(se=QVU73t$D#S7iWBwmzwD{`}YKz`CjT5^zJT{PPpt zSY-_HPD~3P$KUb^T!JMpfxV33C2o%;fRYDdN(HY5IC>u}F~zN-fbKF=ADeHQF(wFH z8h<_zDjV0WZ2=r&*1?lpXG6i*kl3&NQU{`di-GhS+yihB0d>`lmEj=wEvv;EL zIqA0b%NGq2{Wy9-oxRpRl*%W}PC?15c4PdQggwRWF#8<}Fv*@A^RM$UPn>z&$*3<&MMqNDV2V*cFyw_9wO0 zVnniZJsxtd8Jg9+LLBgC2C6FBuS2K~Q*f^seiG;+*#$xtSqY;isMQk`zx=@M#+`8Y}8(}VmBypxaM&a8o0CG#bpQogU_&kcjskv6> zSE|fiIkY%kecBOH0xA0|I>gWf3v+1-MjE{FCNk4>7DAOh6g3ka=kH|A-08Em%5ta; zU(nCU-Ve5J7TpY|SFu4X`yRxWXRIr%3oEyexcr_*MWRvi_q~yi+-z}l8MbTF9s4Nf znVE=xZO&Bo`Uf>EGWRlUJXh&vYXIY|%64f)kv{@CpiDCH)cZ*v^@VyARdZ$|TKRi| zW0|6jWX7JnpkyRekjm-gXf!u(J|sozfp+N2%_c?&r}|^EWYJ?;)YBFuep$ul&HNSa z7{$&XQA~K1T`n&F-OAO>FcAN_&&;$C_wrS0E9ZW+J6%8sLl5o!o|&+4obT=L;TSr% zKUvDJ3y8=xxJuU!NGMcgh{?ykq@MW&()qKL(eL*f{e9@I(ng!sM*o-pi&@|HG$)FW zF}G=MF`c>o+GoQg-PfrSAsQjG+&BE2TDv)GP1OjelajODUD2Y-l}%K_$0E`j!@QI8 zSB#X9kMzlp4r><+ZIeA>k>ulAoeIUrb!PtSI}TYeEr_{hsiCjBRO*HQ%C5!yK&$1^Y&sJ>B*9e&R^6 z>*{=W9ut~Jp49i#+oBYUyeH}4l;lFFLQU~)Jk2^rdQ?TfLBzYVFad(BKP0y8{&P_Y zrG|I&k&kD$Q7_r?Vnmr%O{Of@6So+Dktw?l^5V4+_ut3yWFDqit&DpkhMK!J?xy3n zliu;?!I9_v`1nN>qw_wYGgY`%7}eMMB&NC1?XhL~Kvc38$(>Pl=-04^GAP52I10V) zCG!G_4q!6*%Omy=&CqMsz<0kUvq(#cAMnE;%5g4;wHb{Z)^{Sf)t-Qwvh{WK@D4Dn zA)V%%A&qa*Dq4__x1_}oyZ2Yp$!65WBcLDD)5Fk&El_y{p?YT)I^NXi zvKP%P%_DToNo6}fK&RHCn3$92!(FaUpubVq>6_0;MNmQx7X`2FCzL*3v-6Oe_8R1ZA8vyE}xCMYiKmkS$^3b45s(2Vhk1pz_zgmPu2qRE01rjA9BxCMog0dcE;U-unq7$tDho2by|Klh2{D1g~ zHJnGb_>o6}yag*KGEfP~Fq=YhaDxKqqu`1a9-%Ce0 zL(i>k5`LvB#)Dh;2>^4iF91KQtCs-Ia9h;tpJ-qm~241*X#U>LN4V&=xHE??rkvgdWbPxp0U48PTU#>duH76i?j$ zX?YgpINZqt$1AeehIvstb1Uf59(YpZT-_HqIdR1F6Sv0G$j=h`#flAS1!e@cXh3U4 zb*s8TzvMSd3l;mEzwA;+nz0OAMiNouUQL{ClO3DS?oIq}pJh{1=6O z0;#;rOQsinIzh(~R@9R#BtP7=n_+&tO5ayyHu&Ve-h%QH1I*f8{*XBxD(t>6&HiOZ zY^}#=QctdS833y9tH2A#9mJYdcm=6Hz8pPgH020Qy$nlfp@`J2z8TO%W$rpf=^@xTBA}Mb4%7%f!D*6eZXVo3?WmO;y&KRutfE9oFJJ65rM;RhdS3(IT)A9saG-VidpAKb;$hAk=m&RL zaAB1fdhQv4-!MyY)vi0qQXj|v!_!$uMe)9EoL(AsS=e26>28qjk`e*wQd&v`X+%Ph zkPr!#6r@|aySw?4(v2t}4Fd11zjNMymcyK7=9zPtXYRP}&-M5ZCGwuyCD?-&EV$j< zmv{gPR3~#dvnO$l_X@hx8SjivT^_EB_s^u?BEt9Lp)x!x2pY~{+d`(XmmRp}C z6y6%h>YbYzwRb%5)E<-Kmo4ESXXbvaFxX{A6{fRn>->G3bfufp*v#5#-qquaHO$ej z9`(_@m#$GTGDl?k%zzM4c0a8TyZyC3LGlk^InG3|4ec|u)w{Q&9)#QSv3`amN)&YP+?vB+D!2ejG3EKqz3@+s`G9P9rd z6WL{se~-ywIn@njSq|SJE*ip!dxUqp9@wmPr%<=dv9ipCeoTn`-&O&L#-kSiML_il zwa6>PVMEo9Cu(`Yg(-unG=mqrE2aK|PUk4khQfqc&!n9jt|8rfDtXtPu7<~ap+b8V zquP@Uxq0!8??czoEE_R)F}#&G4zB~QbF5rmuUd~eJuC-KATZ^nL4sDC-Qf_{omW*0 z#?=r<8VzQw>K!|>)W-^rgoiInBuGutnN@JfA{wH`$jKtt4n^Tk5wf1L*%teCm=}JU zW+}U7aKe)YHka_w_XIyLE#BR9Kl(5LmBhe3x0>Vrpt8fV7ip4ySk9xR%v^Fx23CejI?HY z@{EWt__+`>>GQcVT3m)aIc9Q;XT~%n2U6EfNW)Exj^>~RP5+dDZiY0Oca4^KTA5x4 zMq=NtDuqIA4k}Fi$$5}%Pi$=63b8t?ROYmW=6ws!CLUE|4IpG#%)PJ?%EWJLZ~hRE z?MjD}bG?*#Z*%otNEnYay0hfvRpso71?fOh@}{Mi4<{Es0nWZjcF2E`I7GSE6WDE# z)^3ttDez~LE zztG41y)DR=B>Z)i8&&#JUay)^ATDnDXWOUUpE7D>aOW?i>={zvc_%lwEGI9_f15Dk z)>8ipDMI~d2;iOH-%KlHDh?oO567e#xbd)~-sk>YY_u&QyRgLt!Zg_)O%c|VH}Eb|KuQYmE_|r z!f2luaFb{RGZ!5;0ng8|FUJQ22Wc()Mgj4`OQh+OA1tdIiIXTFFiIDSe?&@CitUkC zKPGdz=%iIL5pLp%_DBjI^wQsCxE#&%zgoTFdA?J>*TGwe`tiAe`YM$6w{TH~mE`&h zCPaPRD~5^<+FqX*+4`|kdGs8kSSNCzha4&hL+}q}mP`}(_ zw%cS7T#wg#G9g(YOyjKYPY5Y}H~DR>gm`OKQ7&NIr-+ z;nX(c_>+-#`Pjrk_BR_;3=Tfm=i9t6{SoJFs>`(EL^G_*2Uywq6#gYd{2daI@Sdw4 zc;NyYjeseKVA!nP+t`=#xe((@3KD2F+f$v=HU5xnC^nx&MR@rbi?{sLAJKkW#Vn>? zip=(a_**~F;0+<)7xut`GEf_D_;I<5VA16!)yah<^@5D64c0xmW}352g%zy)V3Yij z8fDlx&LXprRz->{qGA0My;TE&$=$IQdaDM4l_sD}(}6sIqCbG31qsLufV~<3Mg=Yd z{NQIm^WvEAB4WiN1I>QZL_dgH7ZJd*f81z*sT=8o+u8vjU;r@OMZ_Dlupj^(-vGY^ z0A!edX9PX~Boz=z{X_Bo3zpC!6zF1^bFyK_Oy z819bwk@Ftfh#{ZS7aW%BL8;@fkKt98LHhkS5AGP0it8v}5KYn6!LHuReh2+>82gi%OMN3gwHcTx~pPJ^~SB|VkAF(O))`-K9Cd^ zCCcE5TDy8VDEfhq?K$2y!`(OYBk(tIEgjP6zjYV76$~v?zNica_Z@kHW<$fb>5gn& z@G3b*13{)F;{*Xle8;7^BUQ@tj}F1V3xuXxim68MQwD5luM_gprY$TaRSe;ia6C*R z$Wcesj%uDseO`=xKI9ndG=wUEN~GhV=Xaj?9R)Rk%MWi}FFb`fg<#SZlTv_m zCsQLfKSGs_OuY&7)|?2T&%_^%vD+5kBl{SX!PalcUFi1}E@~?LSnHMOsJM4T>&J)? zJ*W64xT6H8)Zhex(US(^&80M~DMP$IhQgw&x{5D!QwP;vs(Q>SW3L|6ifv1AN!$9& z4#QB`4+tyzA7V{uBLd~8JR4@Q+8LGp$XYZo#LO&(gpOOe`BY`mrSVfPs)nF8JZ|^m zA9UUEeZx{m@m}M}>ty=-V)W#8AgXTDu(qei$c>ga-e}5Lf9c?$#7=g(jpcY+-5{i|3fngtHm>W^xH<; z*rSEF4@dCOiu>N` zu7re+gp2oKTvT-_m041$Zc-w!zihLglH6_nGvb|~@DRkrIITUx*t9N^i=c^^BxM6# z;hPw63>IpUBPv%;SRr8KR-|54YFnym1EjDe+-&ukfYsMeRXN2uw0jW`C{a$2e@wp- z@#i6QTKG?~nyrwoim67+k6775--WD|MJkJRt%0Q6=@}u{v*g1LoJyW5Wllk2>JX`W z?Jdb~he6&i3dd9u{@X_^&QBFSD%0NR+3^pSSaAMaL8I&v%{TMoav(je%x`y3%`fN) zNv`d0#|S;v1#nsLEgzN0!CD5bpl9Toc&I1UbyWiBh+lcHN)v~P^~d(8h_1!UF(C(X z-M3e}uXSqbxE^dQ;@aJ$BHqNOx{(!keSAZc>sj5Jr3uDbT5=aq-+9_CtzY{GSJxB# z=5Ob7H+CxQ{Vw5**-~@IP|BO`6-GmjL6YdCG+!q(TKFr$Afdsv=O30rZ+ga7zK|Z9 z&=k4cBd=zqsh>f2CmN=`R0yFQ6&)g=^S}`b-a=tFUxi`p0PKYQK5>HK*E>W0;o$hy z?}i=OR2D}D3Qy8c1P>4HyuVmISvR`LUQP@P%0jyUN$xQ^THdvCya?zUQh^ zab>~MgR^K9DF^bOf1Gdt)6jWrB%aPv@bqVSgKw7qJ?pVlMs{(T1oV&qd>hL7*tZwF!tbl+D-;^}#wE$xQzgltxb zJ@YtwbcPMSX^?#ZQqR}6ynQHqoR2k-Je!u?3`kVikiSj(bd<>mV zhL~hyFLT&(_0T87V`ho<_3HJ2v&c+E4m*ncNiGYKD@UKE;;P9$4svz3BJ0Dc+p*C_!Engpj_lmlYE`+^hrjsd8roOiZGPDKA~u36Nk?+BCdxbiy87GVFWJ%QWyJjBkOs2- zyY4!*l*CGfnQ^)gdU`4y>!t3-?c>a+Tnhwa$kDX^#W$1D8W=B&I%7|n0)35@Ir{Hr zWyMRS=30zUZtflVn>!CbS%!U|9H^-!{y_TU3Dm8K8Bd91-Q7e;NsSLQMQmO8mF)SD zGCA8j0MkQcUuEh{s)SNP5#0yg&V&#XJ5)WPet~Dd{4mFKf`T01OphW8YYGGI-gig$ z+qKQifU>hh?1c6+FY4Z=L5uDKuM+oVhz|66lr>pQTzIL{O7KKVn;Xeg8t3IZc1v;j z<}S2fT6`Q^-^TeACps&zL$2OPw4bqz?9scASudUiHPkoSJSw#$cJCJ#aDP#IOkgzk zz7QL7T968&#Rh-F4M!bH;I(#3<)ec>5hKa}+n7O@Q0VnhXX&VY|V(0aCX0Ky*l@4z%si5hB`B0f_Rr{y$`_ zISsvi+jNe#qWbujAy8G?pF!4w@2%(_kn-KTpySH_#eM+)_g^>%M3cbD&=IEW91EH% zNOIHh`Z(lvwGlv*wwt4i3+y!aZ_9rcUD5b-iH^HulZ8BlN?8_JI#1u|=lY=5PX%6%DjcJ%rdYj`GUc3>NNwZ$-Pw6eqSsXnnup-*PAkzi_u5 zSy+lmsm5oVOr<8M{Hj9vMcu|qZm%D|q*x-0ok>c? zd{2D9!A_}FQ?o8by<3Luo8}!%=@aJ8_d8+$w z&9qyw)00=GM_$6P$)CRBUUhj?yn+kU)sopGnxB7V#^$6|7FQA$0xdV${}SX%F{FHt zF7L{rRAs&mv}7&0xb;zu`f&HSRQHPRz`EhBGg=^L#G^538m1ki5yoqLguFc&;S|LG zts;DT}%q1B?_{2XmK4tTk!)BGogU9V%*6VB`}AI<~GU*n4;%BMfYg@y6OR` zUi;oqxhiDzd&ajN1wIo^=5s2Po(GvgwP4eF#+~5SDZ}JzgBmfVi3h3!ufz<=c zL`wl>fqRCJ0XGK%MpV%}P4vJlTAH{B2nf}X=sN{&3GILEgx1@mD{V}FFU4@}z%n7`NBqVQ7y6q6^!8JMtcCV&kS{Q8)% zRUmL1CL{3mIO1ft$NoWhZ-i#h%_T9fwbeDxa0n*Mt{^omp#cg1mwz8RPw+@0MYNOi z0vt-?yO_m;$t{#tI(E-UqlL$@M1KOqN=xDI+lI@Ku-1UWf+PK0q%S5LU2Ct1ov+c8(9>Q?i zYU)}PF@7 z=}+&!ugfc9?AT@UvQhl}Q=(%lSM?=|e+~lm)W6s?fP@c*@00K`ZX7I87Fcrgxw;K! zV5mha87>>^6_m2A%e?PigcB!~){@1TET!TlA9z?lrUCNhRPbdJo8}4D$8q&gmKgBf zFmw4{4lm&DI&zr&ytskyq;;pQgauZKE!&{yHkX7QQ+(o z-8{j6)IpbCe@~_SRBY%_Sj{-}xK5czN-2wBi|`fBX5wk$!*_i<<-d($Ac+SLUQaxi zs-|T~u;4x3vr*td3b!v|(^)B4rt^E*8-*E-{vrvBYC!D_sLv!M&>k9))Z(`AJ?n1@ z`AjcVGIXO|%9>!A<7cxC;BJ}|#$df>3GBx1&nTs7-3L}jBcL37b~VT4uc>nGoJLyO z_F^VN%tF_QqLe0iVc(u9D2?{h_qQGgh`%^nHkyn0KJfs1&~?8O8etnNWc>6oq>ddX zl$5lFXQ@*ArX%QR3&n2nX6p*y)$-GmXLSHDNFUeEeQj)pHaAp0n;023FL`PO5*WBR zb01;Bv{;32^T5VVH5YTqH`mFNS>v9lLp3Q=sp$8VBhNvl;jqUF_DzZiqmU1#AoUWQ zeIp^e>M2B2d`1yT`x7-TQ(YxP1+pin7D7Pcir1sSyTGuV-ZRMob zedGtamcbSD(9hcK7JGq-x+CeeovD=+%wO+t4c&(%WmpucvR8k(S$vhLIOA5G(V3!7 z?Dre26g3Ep=FPx(_e1F!<>id0SKPiI<=aQ+#HJw+kv}O?#6>axQXWZiMA)yM->boH zdj)T}DZ92?JWl7Xy$_5iE$xY1zQ9PdJ!(FjxqYXGV}1NJh49^carKKB`e7dlhu7w< zy6wj68`=yG+N{8#5Bp~o47_myxuu8ag}w^FF{K+6TRH;a-53FQ_MF6X0`-gG0nF*%xt-m4l2T% zKMS9^blMGJB6_VW!&LV~M4XNH#2UMVo(^0yS8NyVgvG*%$)!ziKI;EBFTQ_oxHqq7WE2!y-|DB`;Av}gsOV#p zqrk#;8ektWLA7ZMNTpjPvO<$4R>OJX{i_Wa6EiUhq5OJ(T&6uWm}hb>3Mr>j)H?95 zD@gKw)$)A0ef=J`e5U)~s}0)=>|;OoYLHk}Fxw>Pr~cH(A-s-Hg69gCl&xhn!t_(i z7!iNz(^cyTpqxno`Q6{T84iDlR@)QaqeN#|owyY<`lM)jg9D_={9Z?0UASgJwCM9P zd8Dl}EX+&j3^|X%?Q%DH`!duYBm|a?r`f_A*0k#!iG>QcM7FGWY00xd+!G+FU<}Y= zxi{_E=V+zOF7M~ZashBk?-y-U#3TNd2N-Zpwu)WmkiXqDD3v6zWHu)a-gFnnQyPI8 z1o?~E|5{vp$XyaS$w#J7OAWM;wED~Bu@Oa*H()NOc8DkKQs{_c{`8yZMsh;!oom$2k9#P3K_x zh&8WXo5~tzY#MXufo_%!zMK@X)!Jm*oS0G)xDcx8RHM`kec2jo?)(Ia58f4YEY0rJ zWLww!Mti9F>}BrSIVawEwtb=Dsa25xOz22DyJoR2{AmZhXQ$3l*rQ`MpFJqYuermF zP*@L!)fpz~@i@t8m>@Uh+}nWW0*L(6Cd!-57U|c~;aN)<_{3jJMm-wX2D(Xq^kHy= z*l4bta*_Q%PBe!m%zx)@VJAVZIC{>G3iNylIyQbyAFzFr9z!zJv%U*DBeD4q2y>L( zeY?D~bAXBeI2s}0tVQ}pp$6p`S`_0J34Rl=>Q}76Wt4h}`;VE}CI`g5Xk@!8;6DUZ zw$ObXG*4Xwh?dm=H4f04LXYIgqD96F=m`3su@HJphsgyPZH+;v3Ba^YKnH1AlJ_pn z9Uyt8`-hWkL${;(lI+m2dRY!oEc<8QcN&A1NCQ(jKLOSxfVN=(0(~bidh+K3`Z7Sg zj*hZ{VW1--biW#i!)GUfbVBwV{~uxoNGH%UJhJ7$fxCaD6`cPW3!=N-P3TMA03T>Q zHF|+<=sBVP0q`NGfHoOz^H)|b37A>RSOR0XXn8gb@MW~qUjTX%7@fQP1Md7oS;nrE zEBkf1qq7xRAd3O?*XShxc?Tfz_UmfKSV?+*96bxjqe;%tk+R3AgzJzm4k`%sv zc>Z>Z{Irr;G8l_~`g=LDwE`?(q%FE{#?E@(U8RHZQ~WK_3yM+dSf3>0D}yXDqr~lI z|Gw4=ig5O1CMIeKCfF*Id7*EphkW@DrS#?}Mq9e?*5vn=aRPss9~e-xpqv+9hfVj1 zrgpG3?qXx_W5=oTT0Q-CTlh5YLYbTPI9zRrNXfYRa$g%CRdr%9Qg>PyrZgre!AriG>YuKWPFW~|?~e7q=s00r4ak(9Gpdg8O@FK&;w0&K zL7YZCzt(iH#Zn+UDfF?Wjv=;ML8Wl!E4@L{FE&U6a)%-xAG)t|&{z~UWJYPagmQzn zZ2xvyB+R=p{64K%!5mE{ltpW^svcEL?C85m74|S-AC?~Opw6D{D-nmcI(_yniQlMJ zRZ2bwORk2QQI4=xB)tx7tbF*K;piI}{h`>PUccA<_ofG@AcJ zKwZ35OnzGbvomWw2xO$e%suzP(7|3sXla9a%3ZyU04qT4j;c~=0 zBu?M(AQr)uc}4opYv>m12Pyv@wY9jKakAKVB`7hjdj&JNBhH?pvdES_8iQ8iT!W&J znqi;3fM>~)9urE5I<{S(JU%tj=V?qY<<`4L@*m*ga! zgIwb~EUGYSS7e#faraMomI~8`U*niCFG8YO*Gcus_$%?RTAf5lv&v_UL;J_)C4a0I zx2vJ8y$&|KZ94YJ-w{8rsHal!Um8ooYB0`@G}-I(Kthl0wCJoSzCd^N`~AbGgO~~@ zBAG;%-NQuPCF|w)4XI-dC-@q*OHaNO_c2bqp!-gp6KBtexxDl^rR|`b7Y5I7P;z3U z_e$tdEf`pM3_g|I%u%ae9*$Ymx#0FY)J09#hKSQ&bZQL`tJ#7pQxLjs$Ct2bU$^Ub zZlkQiCmOJ&S1)n4HKZ1x)>xqcnv{U*tLERP2+B>LOOC;!xwC`!RW*{oNUP zi3eqmX=Ytf(kc3G#eqVYaE?xezF2KMx^W6ot30x%9lG+YB2`;_DQ!;Iqu<3S(Gnid z_q0bYt@zab(gn*M-lXuO2LCna;anwHlS+dhL2z#d9pivc2~`e{(Te?-2><>-Bpqvy zWD;7i2B}oQpr1)?W^pOwzXGTs3}atVr6G}3a3|Atq!IsOo<0e2yJz+21JW@1D?i30 zm0}T;%b|uv89@kkanE~jlEW{~Uifm@ACy{aXBW6HDLdJ$3VxLMv_K6c)5SKGdD^87 z|$bdG?yuSp-UxP`2x>Z1wh;6m_a$A+o3!ue`UEL z^2Nqysn*0>C1lB!@Fu^oKV%fs3|pQ_Btq4zA&lZueQvtpc_>C>Twh98r|2ZuJsU-Z zT5JA5w=T2yXJ|<-qB+01`#q&Va5aYNtu>Urk(NlI_1&jm=0#vUDH;|z`RJu+`XwTo z>^{2JWpo58PM-_2pghqj=Si|o_!xhv-EKu!DmDUDAJoTTM=d?Uyn}vo6~9&7m>=?i zX<+`a4D5518u1yAnj-yDj-2G+ZLrXfcr_Lwyev!Pz|{Aykm@n12gWEy2L8N!KP3_Ua|c07YR zzEH8EQMFwt3$HK5`dE#2+Ewe*^Q??{Pve?s!`<;Mjn|pOjL(z*1EyT`JBx2)vC z3kzD2cuow<4mYDHXA;J@Bk$4dwVN6SQ^s8T%;Bw>%`=Br>>jj0b6(C zk-57|ttq{7R(U&v=={LiAvGfu$4$=WU4wyeOe|lGRm=C?Sj8rjyHdlO=sK`Lzypk^ zF%AP&wu*lmSI!*?KBo?>&4i^KYrZmkS4{#nLPdldi99tojpvz$GkvkVw!4DikDD`x z83*I&lYGA3dD^q+@-2Q3n^GI&>-D+nV=|d1wy0Y|H>!FuyA+zvqlzwGV+o0_m%R0i zHu?e_k!;$`Uut(DZe4s(tr2azr0PqFdg4fWvju#E{`~JUP*r!h$Z@ZkemM&to2c*=2-(L* zggmlOCTF0HpDQXKxw71b$ffAa5!1#SPE1H%f|)UmdqqG30<=e1Pe92qE(FP^hd&|_ znaqokDNRgSd3lcIVC8)=aeXFYX;$fT!}kWqObLo47{oRY{KVypY(#io!N}G2*zk9^ z_M?2~-w`8p-qY}IOQj7k$(z6qR)%Ec``_S3f;f{J^M?jMZ9{q%nZi!X>kXJ++MF{4 zrVIwxWo+rX89#E_yH3rplE-CBMCG^vG19^cM)iOJ;0zucPD_{#s%$gbj3Bn`9C8qz&jN{UoHYZtT^6i_z!@(2P*y-?^ldGuHFL#PM|>o zBnrR?CIGyg1TJ_u2V^t%PUJwI0vNgeyDIwZ=;Q(*=c98Z;OlpoV>y1;DqCn4!Yz71 zfG4>upxt|acT5K?h!|~~4kR1-fR`286!u@f1mtBW#K6b@FWp>?4E-BAS@JeVL-zl1 z5Dw9)4`3-N1Kfn?2^o;3=m3CzpyzP_1~B{oqzp2az~X>D2jDgfv_$~%FATj_VAT%5 z#OOUg&>}%2hK4pMf!@QoAiy}-qiN$`83(!w0hU0o0vP-Reux5ji#E_>Xw~*dXBjC# z=YhQx=%xV9UO*B9q>R1)Xq<*XUP5w%b{7x@KCGpIehGk7VDRg*1I)If0U#%P*|^AM zuQ`9y9$g!I*{~q+m)%?dlz&(heHGxE=KMd`!2k&rUJTe|;jYNF6H^D{O;U&@OL7N3 z5{bkM9didMyhE~H-$*n&pqZaqJp ztP{tMl*f0~8gmryt&w9Ks@5!a%5l#|LK%CgUd-IcdmI^+$A-Tr`HC!6X&87V zVIe85LWZ+SKVnP$H?EW^ICf<~Q1)Y`OFhBi(3*5A1QK8raZA|eLvZ-<2Vs8P_KB41 zP;#8v6Xr?VvOll+VPN;R1D zwyV_$x(<1j`V2dwmY@6VJ@w6>aDUef<_1Y?WnPY4!|sNj&qZc{g9r4>drPD=3WwuGHZY4YUI|19fw=SP{jueY^b+%=Fts+iIh_~=aNO?p90xL_J zyRRlCDS38ex`~Q_y)G++da z<_{4gwX^8bSP1I6Fbce~^#=F@+nNN8r3<#f8~LMc+EB(&z!x zIAQr+Lkm5os<}K!iDP!|zetXq#q2zzxZ<@7P{hbch|~UUU`O;^+Qz7$Ac}d$a!A9rI)&Rb^`;Vp5^D;bM2XzJj)J`QTeoVVakk-d^n2P1NyF%r9PCj))>n_G^w}h zUq7^_(vPG{Tzu`D(4YVF=d)O>NE+M`69)JSH`(Azi;;*N=_X`9@+lsiXjSj74Du&aiob?t5Wlf$Oxyg?C7H;;gfQPTrqpr%u~!AIIQKoG{ae(YL1Wyk82v ze4bHrMkm!W6q@{mWa|`%fpC+0$J+2sJ^$1sYIFJz5bq*050{+U?O5I3r9Q!bB1QL< zV{1hBKh9K%a|3Wlnd4{gMb|8D&>43J85{iM^>w*6ZWZ42x?+PKfhWSQpm?!hma`_eM)YX!!B%_x7DW8sv`0D4Fbx_B#D_N%1;j`_ZW6vRZ;M z(zKvLlFsBaMa+WFt4@WV17gyYOraWBEf+Ttspf;mGDL%CI5-0CUjvwbq%UxEJq+Ar zKn{uw_h1nvSG+a#{vvC8w6KCbw5j)dFh35;LCW=K0YczPbyKCVSs9kXZGDIOalK z6pf9ZKv-=WvhZ4gGoBii_R3{1WJhi4g`OI(-5Um|N&N2V(mgWdrCpO31tZG^Dy1N$ zuvBl!sQ%jl?L8OKuZbUd>}mqxi4@jg_;>b=Z37S2!l{BTtB=~^Uuod1Z(w%umprcUMzUWa!T zWT$1mhrOiyEjpq166eW81jOZL!JucnKi~%O_lfn%H=t^a{@`dL&<$r zAWoFj`s-&A4r}d|r$!cYq69QS1et4r>U0SEpDuNIW=!?$a>8MJ!S_2vIe%=Z(%$mI0|m2_-y&Z5%hPkc z|LFR$@y)AR1#W6$q18$1+H3 zq$l}fQF?}2YdOv)<(v3oOzr0{tZ*rKB}2suC|CSgHFZeNmfUlDrs!yRXke8ksUP^o zC-Z|O$;dZgsIGWwT^>feiZG|;=YX4A|(}=lo{ssjxnJoaL~cwNY&C0rdjRfk&R6GJ1pt;%!@hZyikA6 zEY6vy!PLc%lISy6oB;!%zc|oZ4&%bes8kS_7R<_Egtp!&N_b!eONu6<|^F}nx5Ryx_H zyzXqq0-$EQh!r430geK+QtwGXmIY)bGeEl1W`T~(Ei=%1Wi-z;1|8a~29^MLQ*R*k z0o|c#XXgNY6s=#vMkhtFCqPKfc<(}*p*nikJ~oE{F1Jm&iq{GlQt@SwCm%X(dv$MBzy4_!wm zbda@5`vfA=2aSgiBHwWJR2e+EA_8ViyYP5=Hm;DxUQn!TH5hq5JobEaPoA}mm>ez( z)5_y6`RL$djX-U%hu;nT0id9boK1rSH*B zf+d1Zt;lI5v2P#KjntgE`(-7m161uK~alByW`N<1~T}iL`n-6MtL4_-xBp$G=>c-rS$@_P}!!UK<_!~ z96DCvi#?IY`&(bv2`PVoagtab`x#$6f#157FfOWQEZF@A%blFdTuzO6Bu?(UNYNE3 zO%}jNRW$kK;E2Hxg}iD08A<;Z(^QD$KWD%zIjK~T|)gBpWLGxOS6f#W6j7~h`yo3k<7eHu<%O#Xp1$0+8O>H zd80_!g#&)ArbQH;#zsvGdbxc~GE08ub1erDE#YT7pVeznJW_qsH`G^g&k_v%9(>YX zF~EITF0aOl*qbFfse#;+H4*(WFeE2;e1@ zPg8lRc&w_CiTVt1tu|E-V^yFc7_`Vm=WNR7*y#*ola!(zW*30j9?BRia?CO_;;27| zQeL@(0^b9Oh7!iDN;I_IsQ2CxBVsmax;fP)@Xnonbz&;v)3S@iAf9;3;?kht&;BS9 zdptZn$aDHoR6qF93NAQUjF`OKB^3N6TJwS6{OpYoL`XBGTD2*JS(qXbU?X}4-wsmu ze00CAyMN7=KqGYSmkh4u{5%)xaZW(F==G}JCaF!(_(wix3U%UM?@wRGFcB$1O_)@G zwxnOv%mC6(dDi>|%r&(7eXcB!(zFBS1C;PP3L-bX_#uD0@BcQza++V%S3Qm62 zx#LE>4C+PFQ1b_sb?W012S(tghDPwVZ1f=6D$BE(PchhveuvJ40x-?Q=^3pKrIeE z1A(4gMb`rVp~2BUm`W~_fYIZ{Ii9)d*g0-M`xwR!dc4&et#-IYR}^Ji1q_D; z&DonaU>VWo8!*7chu#HvzgpeHJpjZgnhAbaUc6125v{ciTN&rP3OyX=Iw7DA+=dODSdhn=qTHLvOXp&U(NIs@&*4VGJ}=R;=&;r)JRslHolkmzxQQ(4 zK5Mk6x(x%9It$;Ja!oGG_lcmq2M!t$HlbpTMSXfm7$1uoIHg$*J0ihBR)dl-|sx{6m>ZxP8 zDPCm`!HJ02$&tJ}dS7-ubMZYJ4;G5b{A6Cmrn$y)waJAYD?YkU$$eahhhK07&C;nH!X?f9jvd>ktxJ^SwYBBHvvl`ljEXB2;vX{7sIOd)Ms zx*A|}3Q&e=M}%Pb@~9vkr%{+MS{LoRK~dsjQq4Zo2QP6g-1B)G1tt4p%xl`wUW;U6 z-S(hzN0w4ghxmNAO-M=m?jOfMTBbD+>(uW}xVA~w7avgl{+^4ECZsvAk2e-tUeG;a z)4~8F67R**aNUih9MC>G*HqlQGgxC^@UoH-GN5P?|Abwd@Nt)vVdK3a0m1)3b8T)x%t_2!s zCHCz2`AuB8i(0@WrqW&_nKtf{Bpeifzn64;Q|d^rgfR$>d~`M*^c?CcjtjPUaHdNQ z#4}=w7VALSAx|Tzvyl(9rE&ZA$yrB!u2UMDD;B3Xt=_Es^Q{fukLRZA3hhTh{C|H{X>4P2 z?^^k4xz5&;6IZ3Gh3DXbE8lYoV&ksPi4;<;t38UgdyP33TIHwrtY8gFMuOvr+9=n^ z*AUr2cI2&e2p9dTuE^BA*u#XbhS<7h`c#PV9p!WguV$oZx7+9f51wB^T5!7ecvXgm zSs=O_ z1@)al>^B$wiuVXgh2<&uS9wFqAaM1di9A)_XUpCd!q+4FOG)^P3&%u-Ty9bYw(dal z4cQP=M9!+RfK@1f5zzk8l2-tk$v~$`93Y+o*>Qyb^6vgYOV^c__h^xoB)p6F;T3XX zF7ZH?$$+g#+Jd$uXpee*5pdl219599CZ@bV)<#nHiz5O6RsmRYlaRxsfEWxU&^rO} z#;^hhlLl-+$UYtr?EzSM0I2x?b@%=W_HKZ=AE?9w&Ql6`*8z%7x;{UQ6Pk`@7oZM2JEV&K50|?ZzIkRv50)QMo!?^LCspKC+DtW+v7|I8r5Mg zB}L`eQ@3!D5}Z3*vHiJQZZmg^rG4)pb9lcv|7+@CaQ&OWw_aaSa1IWfm|pT;Y4vVZ zrVvuk{``fYj1$OAne~=4EWS( zI!#tx{p{oFLY^wQ=DSL4L?P3dX$k&N(A~F?q13*$j)f_OL`)u zW4*e~i|pY{g0>5+uB+>((R6nB2JEfM=z}Pj?DpR&o9AAo)T<3?Swc%Cmga?KChRw@ zT+@h;iNfKtE@ZwH4s)uSXz#?1WGg{?0W)NfluucH13{`h`kGKF zWbX4vbC#^27?8Re_0=o0_>lO#LGOx6?=Vhd@TXBQDRxIQClbWuuCBP^;6%s zLRzXR$>1wV%$6K?Y)L^U4UNod6prV^Yq`6T_xFx?<k|TSSGN2QLE!_03HG z0yO-bIPYl2(jCIM^Xy~2axj!@fnA%ynwnI3VMC^+LgQIs86_7+c$l9i8*`msEH zDDlhUFW%uNIA9usaIH7@>x-!fY|T-1pH;~r-vIx=(=Fse;=_Ce6$rO@w*FBf*ob%g72Xnn0A|aDL}y|v&Q`6O z@FAQsjbR9?$(DsFEy`(EkIc7XE+1sd1|QLD&?#%J`->>Dj5D?&jl2rv67q4Wd~p z|B-fQ^+kB&(lvm@BTC6p`hV|bu4HZBVr@q@K?ES(o4@JaFmhJ?4~O~&dN6A6ai>Ma zEq>yN`oF*Ok+}#nSGWbpGp?D5%pCmRP%ggV$u6vf$gc`puL~!T2&D&F{d8zkYa znOE})c422jOSx*YirKW!DGbx~)7@~U_-nMABQ8z&Lb{SsLE~X|k)o|MwvQZQHdbmu zkaEzjAI0{BP;28q1cu{7Tp1l9exhVDfRIiVaO4508djTqqLwa0ZxemEFH%1P;TF^xI4K$61CY65IYW0)6j`?1hj!!A-ANVTEoO1YU zZbmO{`er^5QvuQoQkdBNa_k5Nf84;5dhK) z0HXr1Q%L|Dc7Fm0f&xNK+cmmnw%KmOFOe+NAn6_s0GE2gv;A+F;$J*d?@z%JN081F zj-v4*N~%09*4Qbe)7h z*)vmcK<5V?JWH*Rq^|sHb5-g#jW`fdbOSNAz2CB-Ig-Wa#*B?Uu1Tngi*>7g%E(RS zAVK7Hv6m7Zi5N#URyqBB&q;DMCUJANm1m#j_^K7FtfQ&i9d>_a*M3+k+8<7U=gI&1 zX<W_5ml5Z!{UyyyTq7O@#@p-bmI!tX%9$))!YKYjP{|4H z@wLO{wa(a6gqMR!`#bprtQ3G7t=bE<85)Eu#*LjvzspS;KAtIc4D^Xs-V%XpFE+*L zq9|%{=roDjWosp+lwk|ufF?B}hSJj~5nBPfftDpW&%pt&BKCalU{wCBz7+N*ps-Z63LypfTf~Fz9QHTcWUCqZ5g@1ju^< zp#uB(H$6y*YUus3{(1N@0q`rYQS3Yc?uH}ejRCwbo!qpDe;d-}Ep&nIjsB0HIt4)Z z2BeYC9d#r^74!bl+%EQQ$Wc24B3OCf2|A)Q`kmgF!#6^6&+;`CRXaF{9 zc7sJ{$Z%ymh6Pn(fHcUmIlXsiI84%@i)e+2yPqIb!21(cTj@X!zKw=|I)>w9=mz>; zF$rufF_&o||0!Pr_(A1F@awlOPy|-98H;ukbGmcmqNIiS%BUlQeMPS<)+O(t9ibFM zITtQV2Az^ks(rAIfC$@?;xzBTe9jXdiV(Y98$q5E@3H0z{eGc2drDsl#=3#;ZfM~gdRQ0~{Pdb8r#T^mKy$GvhF4pAeMtx8 zGD~ySqAC2y>CPVt^4f?fa1PD5}LA(NDq-bX@GLd z0_^F=nj#U0fdHV9B_NcxT`PdG0ZBYe3fRnAV*>s^BKe2o;Q@Gy(Ni^we}VTBfT+fj zhzneA;3t;#pPCZj^a8|1+J8ZhfTj}ICI+w*0HqrFL{$$!_#v}5kPyWaZX}dC^A2D` z0XQBRB$g3Lwg$#^AwP2rNAeU^kY2PHPvn#PMWIgWxm{H4Jo+1{%25^$2I8wa2K{ftaoT{jO|RGRg0lqnfHvwE36@{qY8+ z5LmJhp?t_}Q=Ze^2N<0=T&rTbT96g@ds#;oaRAW-{}s4`T2xBcSh8K8?3;+8^r?}d zB|7>0-WUe~FTpiPcVDV~QmZHrR?Fu0t>=$hKXD3;YiqOIg1Sx}%1I4Fyh6ewT8B@t z+sSYA1lLUD*Wk^NuY8S)uFn%R)P%Gsu+jX)`(V>so6K}yB?y;IqAM`SE*OTMM#o=( zzicsn_(dU}kE$boj3Ojx{rU{SAGSZ*K~v!5FK9*Ly7D3c4%zw=Ee60=&r#=!STsWX z%ig=%O)TKJNN?eq?x--aX)FAn1*KHtt~?ccGMY_E57$Xl5m|L3 z#TWZ6IVDawa0bf$^yHSd&scBhIUfGV^C(j{$YbrriX;*@Tk&D|cWV0;v}Kf|54ZYh zRyPl!caJE7AZ?T*)5Qc+x9JR69rAtce6VWRSFWmH0V}88P7dRuZ<{H)w4bY{XR9T~ z98J`7hf(K6Tbn%~1r3AYaSFaKEv^lS!bPh%C;`gt`z^xPRbo&fQOUi^XH<7{VYt*C z+f@Be!ZXEPeaRi@TSf%tn7$oLAKDu?Jt&94r?(=OWIY)tJC)C_XBA$z#C z@%O=EDcG=x7QT6y&YbSsa2(qa9Su5hf9G`#qL&m&;)o=kbY|NmS4aK(OIg?-g>nDE z=ki|ptV5J(a-?V;gmDmE!c@&Tl$ZxG-M`@)pS9!rEtU8oIk}GZ5%l8q zhA8#bv{8S)%YgLuANvz_#$u6rqeXQkK~?ccyytQfi7)rbzi%5z`73g(q!T%1jH;%7 zZ_T^w9j{e?_3YPOHYJ=8%`Jy(yxZ2Jg*iXo%j&r(LBlcLdU@R~hy?OP-RHG{14rkVnlZy3s`KG2cTQ7MuV_y@9ow;86ysEVmdls$; zk6NU0e{g$uVfZDpsnLHkDC6j95{2jZ_es`hI&X#6gvQ=z+Cq1NcB0iXLsF<*x?#WD z1P?jpPiEq6`^<@%(ydz0S6?KA$noy79@!nZ0vqi?&pK7d%LQrMKk9}um&ILTQ{l<_ z4EwQAh>5L5F`aZDP#m|1&53aF|q1w=aSHvzbXF=yA+If8!6nqHyYiE zx`k^8C*kPYzbj*AT0DJkL;};ngi~OVl;|0|@Iv?{O;Lk`FUG5Nk=aLNZ`#e?>73XSnRXLMN#b=zF1& zBE9BpIzP2p%Rii~Iiw!ip}DqkwaV$PA4`JHbn12aL2 z_`boyY+$7lDlQj(D|2nAHKOYAoBGg{ix1vz%j*`hh0incsLfC~wBk1Wz+Wmh_Erbt zYlzrG7_spPCL~4$$OAFR6W3`OOLIyM&g@yM?{IIv9MC(P;Lh{v zZ9?tvkx}IdH2X(yd?DjSE~q~e=Z8j~<^?LMyDm1Fx^SC^La>|>Et*Ir6}RJ;jwFp3 zLenJD4-KZbknu~w@bTUB&lhM=E+U>Kb9^#h(>Xs4o zdW;FdkU?3FE>d&wt^}2jA=0Ri@sZAJjlZ~4NT_k(iT(wysdvG@V&-3fLnkn={TJ}i zO^d{o-yrG60AQ~ZAn5@i5VS`CDGvab|C^ZC&9aUF^qmpf9RST!F*Pd$py$Z3$jP5^ z-8<_Pm@R>sw+zre0RyxzV^Am&?~P}aVa4~HwAE3|xx7=EjR_EIfB#s?V^x8EZHkQMv}wH)8#Xs}u?G&vDGej~JRvN2JZTB2)SXu7 z?d*%mYRFrfI*rlEca}VsXOYjIa!@XJ&5;vj5qIx!OTHZ0cFQo=jF)>n4Q4_=KuJv9 z;Y^G03cH+>uM1+Le4)xDKu*RT=+`6kSzWE^dsGPFN=<9^Jo-lh533^a7c)0AsHUT= z{4gyIA4igMOX92w{abFR`2)o+Ij_1=w^gIi1F0WI#;h)`;|Yh`q=+}39zvfRm;T8J zDcPd>Mfsb!#e#HA`Jqy=Z_8Z`;O))5oP!r$1ZuO%j1>+X){r5-kk8J(Ayc3w1#rGF zPihj3PR!nby0E~5nXg6Been*e1kFlPMOcdhtx~J-5O4u$Q?Cdl50g%9)udlVVe>#i zU#?Co5JZo;FtW`PCuK*2IyteGxJO>mp*;Fwp!xOK5ZyD43^u`fwAxfYGN$VIZx9~C z@{w88nI0-?;#(c(PX1xvlD6eh94hibA=qM{k6-DNCQBknWhRZ$; z@;M+<-a6=Fap)0gP+Jd1OPbN5#ZE}}$tA~ut6T$O_iTJhX3xA%HE8ZFn zcr%whO44ZL-1<4=31OSgU3v@$neFqOsshn0<5WB z_iN@M(UKBbm%WWhTdImPp5}uk3c8xC&!Nh<2Ek4@0h_tkwjTQaF zBgH2Kk|_o#RDm~Sm_8xFPeMYEYtjLF}>W97RGc!t-rf8sctU4IMV+hg(S zfhMhtvNr_}bxF@yCgSc+O-jZrn&r_AThKT5Qxj%I+M{|0%$IX$3jCecqznluC&_qD z?HN5_tICAvGI8yb5-=f1o6q(N);lgd9W(jWF~drSYPR>j9WgLZb#&OKvW5-17DEMP z2AAV(e#yaqnlsZy&Auh(1)Rk4X{9?8~thDa@Mnfl2P&gd$w) z9&{S~E~L;PL6ImCw;>G|(md6~vM2Xvu(OnhAn{64u*a2(T;>_|S$L;f5M>|#tFQ$_ zAH*OJb~;fVrbNYCVbvURpT`Zq`*R2zX^hm&47=e5hrKpz98EoPl)?P~ z&njQ4DV>2!jH>q6Rq(vZU@zy2kkEdF`$O6@G^K&)n0qOZ?1x zF_hfUWh9j(7JPdK&yDROloKwA_m=*7zk%urvkh`4#PhX=j9LLPtao-_$`(C^tr{cpC8^88kcyyhY?7n>mRVu z*!e>x*lU^Yx^ajVKQy_9cL%>}j%UtDf2EG&KS8!p)ryxyJEvnv=?7v@f{(h1u!^wq zU}2~T>(J6&xtiL74J!=h1`>r%K0c`BkKN8Tn-NaMh!L|iq&*X>dBtV}!}FvvT0Yb#Nkz~k z-`TB>->dCatqPQ@pWi>m#KL~D0ROGfG$bM|_dOO3V*I>jkH`-^f#;;9;m6TV81!{hPR~JT4HLA-*vRDwP_qBq z0&qq?Dn8XH-hCHYB<(U&JCEKV__tMntl5FA1Px$M04UI9F2e$obCF106O?tc!UGZ@ ztP{C7`In)I5-Sq=ZbgvsjdoWQRkp9FdI@DI z&B~-6l<8cIgQEYoLEif}Wbot1Rk~67&p#~=x!AUS&}2Jn8(L{A>rt^^wCv#zYG`|m zh3dC7yw`>B9j<4v$-kY0hdAKafR;z8$#cwY8ZW9cSV}QA|$?a-_{_0?VtgA z6p2a!jxU(pk2(L|IBcqr92p(sWl7~m5fn{HE`u8}eTXI4^+$_Kbx|lfDl5?oIVD*4 z4=c-iG#^1_iNEBHo|O8dJlGsXCLInOG&9H#-nyK7FR5~^q_S|uMJYake8Q<#-gvO^ zVHruK{5UsHUf19EM`*8VfeM0MJ3cyQc|bhDn^)+ir=avgrx}B8M|Z z_5NkHoIyIY@(b;?K5xnTU_u2~>k40fH5%TVQ|Ibj{E!?5JSEOGPC}ZU6nEkU2ErUq zR5pRlr73=V7MGn5WndrH$*(G;Kdj!$O-e#yhDFg^i9dgM)IU4CmJ(QAuAgq z&((CK`AzI{c$fu8MZwcfuj4w*vYV&s$XAE9gF9$hDXinvqyHKcIuMtoI!Ag9;?WYb zV|t7Bujq5f*|zo2H90$RgB|bip6eNET2Bkxykms#Vs)08o?}vl-#@{>7zo6CfL&kV z0lr*4dZY@Xj{Y82tR#X<)T>``jNl5nqAWmpPN)K=T080C1;J2f64-A%6 z0rrY|Z~;jHpnXIN_|4M&`~Ln@C*A=_RM|14B=HO>><8ozfWsKbhXurlfi=rW(c?eR zDiX023J12m#zmsWg#&=NTG{_ZkbrU#5Gr0qKM-dHo6Z8?jr2ofUjpBy1Z37CZ3X}! z32+J^NvvnPfX9HRBnYXY3<6FIfHNVFjKu&}JCc8zl?LM0LkhEIBuQxp{x>QJ zX=J`PU(dGLg9A{dXvKY6|6&EZ`haX%yV{$vm0>XiU7zK%#r(ea#Y} zRbe~=&Wlqi-wOq0(3usD_Y<))4AE<=b{UU2V#?U7Hs!+`fw+rLR zF!j?(D2!z+mqV>~esqv$aCiN~3Y8`h!$K$Tpu|yNd_@OC06qsDBX!~%;ZUCHODbfz z_dAt+P@z0A@p;v?A@c+kM+g-3wfx7m2IwRHBTn0d25qXV)A9{jKj$o z*k#QRh~iBk-FVUGAgT6om_~#z(;RuoVJ7cW??i-_f1Qged+EnZ3bf}!M*QD#3gKa1 z>?4Vs2hwe`B)Ig=aofJXNN4L&it2K~CmxXw9JOGb*{gx;c$DQL$qJ_e=oe5Y?v`3R zYz+m<7}?VxXkdQ#@p=kxfWQkoX3Ho%)tuV*YyMp`uptp&5hDlv)4QknH>>T{2?+zD z^NYb0r^e6V=OimbGhjl{``xzgi5GL%E-)=$MfCUDtm-DT%ylhtgyOI(Av=GgS!L6P zb(R=?bsgG{VhWYtO&bF$zh}>{R48XWammry9NkYiRqDo4)nT=obaS_Uj*5xL4}m$@ zIDy%u+oo@2{+L)Vk(yIFN7BR7_=nAhFgk|%)4EEF{NdWZUh-fW6~p&RgR<3k3`{Z- zc4Cq{kLoJySfO`}rE-&gv0geIY8cFrxO%JC0i3 z%TCp5arxP}C}tc{J5CeY$jd$v44hkt31f9QThIieE>F|&ddyZ`)pIa^GqJCkRE!`N z*O-80?E%4VN%vFC2?Yva^xKTxEkELKv_?lu-w>SbkQ9@g6P1^m*Zimo*LM4rtYMRs z5~^R<*!~uX=LJ1xzazS`HLm*!b1fBM*z6b}f~9#4MYAaP(U9b9+$SH_`2=Aij59AK z=~h4yn3cb=!m zU$(HELag`di2l)-7Qt1p1A6vd4@Km;ZJmYwjdAfkmG1k4MG5LD^_4P<%S>|o(m&U4 z>)*~sd+m|H)skV_zZtL>L^UxnEHSyN9B4xD%$aux`s5nvAbX+(s$XbGpiy1(H~Zp# zVKtiZ>l9O^5|s1o`>l!QT>EIkjO0;ZT#sA**sq~pPd`M_Q%=~sjwZh=ddt82_NCKj zQ@Eng41G-r5g%ci3AU313wNhLdYN1gI{Qi*h+9vNc~{dQuxx3xagqpi3aaAbSj)7(uvN z84=2{6zvS=i&-i9iEc8Q07VuwU*7iBU_%lo1JNnQPv$?-gswS!j$9Fu^-L;pOgKV? z&G*CXxHknp@lY8yZeB+0h^->pu?lB1GcmL8n$$Gdeo8NchEu%zP&|I5ctV9XBU}^< zRrr5uj>B;euA_WF&wK5n2rO|lFbkQuNY1n$xK8R1Q#nJYetB6^!acU$6zHyb_Jza> zEtT+pg1rc33FhFF+E8E4MF)xivx7_nb6k7v(Lb{}O9e-b@Z8)PU z@96fuj(i-aaHUlQ7rFBJOp$o}OPYsBCW}v;n)xAseVX>kmd52c?d~qNh*HGs6swkI z2V)ehn^!_w@WuW$nh)xYh8_ljBzR>RhKABKzjkkx@%rMAJ; z^G&s+XGoVAuQcPsRu&o4gOXFX9C*r;gV!`})VVFi;ZFrqepYl6uu%j!pG7T$YHtmC z%V4~}QXvuOK3}AkrOW5lSFFj)>03;lcBspts`eeD1MV1 ztj3xdqdiR%Cnf_sT}pM5>fT)vy_|qX`KuDB`f!|-J*Tcn=AbeyvJXkft^5W{b}w!N z2W2F=q>9siq#UwIG;!~NMi!D?4q4DFBy2?Xc#n}WMRsEssJ;Dq{HG7yP@L6U@OvD0 zH^&PIt$|g5kbSK9dof_?f`E?2?QM-7D5FF(xRh#>%>7>9wj5RzB%ERSBL=%nZE}C| zQY(~N2=d*iXd3bon)JwhDTthVID6)}FZ(?MB2IUcyP)5%AuF?o#Cxp$9WhmNlJ0;q zfk*rt_9MBdUGG|O@Czk∈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 z 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]xgt4oHO^x@QuYlh!#bnA|oa^QqIgd(<{#QA)g- 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 Date: Mon, 1 Apr 2019 17:21:59 -0400 Subject: [PATCH 023/380] CircleCI build configuration (+5 squashed commits) Squashed commits: [1dd3d111] remove circleci files [cc2a261e] circleci fixes [9b5bcaef] add dockerhub auth for circlci container [87161ea0] add s22s to circleci container name [c73780c5] add gdal to circleci container --- .../scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index ace7df349..0f7738fb9 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -133,7 +133,7 @@ class RasterSourceSpec extends TestEnvironment with TestData { } describe("GDAL support") { - it("should read JPG2000 scene") { + it("should read JPEG2000 scene") { val src = RasterSource(localSentinel.toURI) src.readAll().flatMap(_.tile.statisticsDouble).size should be (64) } From c6c922791432baedc7844908341867b6e85c798a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Apr 2019 11:28:07 -0400 Subject: [PATCH 024/380] Added better caching of header info in RasterSource. --- .../spark/rasterframes/ref/RasterSource.scala | 36 ++++++++++++++----- 1 file changed, 27 insertions(+), 9 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 6083473d1..2671876f2 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -169,12 +169,13 @@ object RasterSource extends LazyLogging { } case class SimpleGeoTiffInfo( + cols: Int, + rows: Int, cellType: CellType, extent: Extent, rasterExtent: RasterExtent, crs: CRS, tags: Tags, - segmentLayout: GeoTiffSegmentLayout, bandCount: Int, noDataValue: Option[Double] ) @@ -182,12 +183,13 @@ object RasterSource extends LazyLogging { object SimpleGeoTiffInfo { def apply(info: GeoTiffReader.GeoTiffInfo): SimpleGeoTiffInfo = SimpleGeoTiffInfo( + info.segmentLayout.totalCols, + info.segmentLayout.totalRows, info.cellType, info.extent, info.rasterExtent, info.crs, info.tags, - info.segmentLayout, info.bandCount, info.noDataValue) } @@ -202,16 +204,32 @@ object RasterSource extends LazyLogging { /** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ case class DelegatingRasterSource(source: URI, delegate: GTRasterSource) extends RasterSource with URIRasterSource { - override def cols: Int = delegate.cols - override def rows: Int = delegate.rows - override def crs: CRS = delegate.crs - override def extent: Extent = delegate.extent - override def cellType: CellType = delegate.cellType - override def bandCount: Int = delegate.bandCount - override def tags: Tags = delegate match { + // This helps reduce header reads between serializations + lazy val info: SimpleGeoTiffInfo = { + SimpleGeoTiffInfo( + delegate.cols, + delegate.rows, + delegate.cellType, + delegate.extent, + delegate.rasterExtent, + delegate.crs, + fetchTags, + delegate.bandCount, + None + ) + } + + override def cols: Int = info.cols + override def rows: Int = info.rows + override def crs: CRS = info.crs + override def extent: Extent = info.extent + override def cellType: CellType = info.cellType + override def bandCount: Int = info.bandCount + private def fetchTags: Tags = delegate match { case rs: GeoTiffRasterSource => rs.tiff.tags case _ => EMPTY_TAGS } + override def tags: Tags = info.tags override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = delegate.readBounds(bounds, bands) override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = From 94c968be4fa2473e4b940979908d567cd9daea9a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Apr 2019 13:03:37 -0400 Subject: [PATCH 025/380] Experiment in delayed evaluation/parsing of CRS specification. --- .../rasterframes/encoders/CRSEncoder.scala | 4 +- .../encoders/StandardSerializers.scala | 4 +- .../rasterframes/functions/package.scala | 6 +-- .../spark/rasterframes/model/LazyCRS.scala | 52 +++++++++++++++++++ .../spark/rasterframes/ref/RasterSource.scala | 2 +- .../spark/rasterframes/util/package.scala | 12 +---- .../spark/rasterframes/py/PyRFContext.scala | 6 +-- 7 files changed, 64 insertions(+), 22 deletions(-) create mode 100644 core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala index b6a188d71..d043188cd 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala @@ -19,7 +19,7 @@ package astraea.spark.rasterframes.encoders -import astraea.spark.rasterframes.util.CRSParser +import astraea.spark.rasterframes.model.LazyCRS import geotrellis.proj4.CRS import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder @@ -33,5 +33,5 @@ object CRSEncoder { "crsProj4", "toProj4String", (CRSEncoder.getClass, "fromString") ) // Not sure why this delegate is necessary, but doGenCode fails without it. - def fromString(str: String): CRS = CRSParser(str) + def fromString(str: String): CRS = LazyCRS(str) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala index 11a236b10..2d7aee8ad 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.encoders import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO -import astraea.spark.rasterframes.util.CRSParser +import astraea.spark.rasterframes.model.LazyCRS import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS import geotrellis.raster._ @@ -77,7 +77,7 @@ trait StandardSerializers { ) ) override def from[R](row: R, io: CatalystIO[R]): CRS = - CRSParser(io.getString(row, 0)) + LazyCRS(io.getString(row, 0)) } implicit val cellTypeSerializer: CatalystSerializer[CellType] = new CatalystSerializer[CellType] { diff --git a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala index 0ff2be2ee..a5c4547d7 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala @@ -16,7 +16,7 @@ package astraea.spark.rasterframes import astraea.spark.rasterframes.jts.ReprojectionTransformer -import astraea.spark.rasterframes.util.CRSParser +import astraea.spark.rasterframes.model.LazyCRS import geotrellis.raster.{Tile, _} import geotrellis.vector.Extent import org.apache.spark.sql.SQLContext @@ -126,8 +126,8 @@ package object functions { /** Reporjects a geometry column from one CRS to another, where CRS are defined in Proj4 format. */ private[rasterframes] val reprojectGeometryCRSName: (Geometry, String, String) ⇒ Geometry = (sourceGeom, srcName, dstName) ⇒ { - val src = CRSParser(srcName) - val dst = CRSParser(dstName) + val src = LazyCRS(srcName) + val dst = LazyCRS(dstName) val trans = new ReprojectionTransformer(src, dst) trans.transform(sourceGeom) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala b/core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala new file mode 100644 index 000000000..5ff441d09 --- /dev/null +++ b/core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala @@ -0,0 +1,52 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package astraea.spark.rasterframes.model +import astraea.spark.rasterframes.model.LazyCRS.EncodedCRS +import geotrellis.proj4.CRS +import org.locationtech.proj4j.CoordinateReferenceSystem + +class LazyCRS(encoded: EncodedCRS) extends CRS { + private lazy val delegate = LazyCRS.mapper(encoded) + override def proj4jCrs: CoordinateReferenceSystem = delegate.proj4jCrs + override def toProj4String: String = + if (encoded.startsWith("+proj")) encoded + else delegate.toProj4String +} + +object LazyCRS { + trait ValidatedCRS + type EncodedCRS = String with ValidatedCRS + + private val mapper: PartialFunction[String, CRS] = { + case e if e.toUpperCase().startsWith("EPSG") => CRS.fromName(e) //not case-sensitive + case p if p.startsWith("+proj") => CRS.fromString(p) // case sensitive + case w if w.toUpperCase().startsWith("GEOGCS") => CRS.fromWKT(w) //only case-sensitive inside double quotes + } + + def apply(value: String): CRS = { + if (mapper.isDefinedAt(value)) { + new LazyCRS(value.asInstanceOf[EncodedCRS]) + } + else throw new IllegalArgumentException( + "crs string must be either EPSG code, +proj string, or OGC WKT") + } +} diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 2671876f2..841bcffe7 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -33,8 +33,8 @@ import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource import geotrellis.contrib.vlm.{RasterSource => GTRasterSource} import geotrellis.proj4.CRS import geotrellis.raster._ +import geotrellis.raster.io.geotiff.Tags import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.raster.io.geotiff.{GeoTiffSegmentLayout, Tags} import geotrellis.spark.io.hadoop.HdfsRangeReader import geotrellis.spark.tiling.LayoutDefinition import geotrellis.util.RangeReader diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala b/core/src/main/scala/astraea/spark/rasterframes/util/package.scala index b0e50825b..eef449c76 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/package.scala @@ -20,7 +20,6 @@ package astraea.spark.rasterframes import com.typesafe.scalalogging.Logger -import geotrellis.proj4.CRS import geotrellis.raster.crop.TileCropMethods import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp @@ -92,16 +91,7 @@ package object util { def opName(op: LocalTileBinaryOp) = op.getClass.getSimpleName.replace("$", "").toLowerCase - object CRSParser { - def apply(value: String): CRS = { - value match { - case e if e.toUpperCase().startsWith("EPSG") => CRS.fromName(e) //not case-sensitive - case p if p.startsWith("+proj") => CRS.fromString(p) // case sensitive - case w if w.toUpperCase().startsWith("GEOGCS") => CRS.fromWKT(w) //only case-sensitive inside double quotes - case _ ⇒ throw new IllegalArgumentException("crs string must be either EPSG code, +proj string, or OGC WKT") - } - } - } + implicit class WithCombine[T](left: Option[T]) { def combine[A, R >: A](a: A)(f: (T, A) ⇒ R): R = left.map(f(_, a)).getOrElse(a) diff --git a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala index d4a8967c0..2d37ec215 100644 --- a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala @@ -19,7 +19,7 @@ package astraea.spark.rasterframes.py import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.util.CRSParser +import astraea.spark.rasterframes.model.LazyCRS import org.locationtech.jts.geom.Geometry import geotrellis.raster.{ArrayTile, CellType, MultibandTile} import geotrellis.spark.io._ @@ -193,8 +193,8 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def withSpatialIndex(df: DataFrame): RasterFrame = df.asRF.withSpatialIndex() def reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { - val src = CRSParser(srcName) - val dst = CRSParser(dstName) + val src = LazyCRS(srcName) + val dst = LazyCRS(dstName) reproject_geometry(geometryCol, src, dst) } From 2cc3570f27035cefcfe376e400794a6ed6b42a66 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 3 Apr 2019 16:24:12 -0400 Subject: [PATCH 026/380] Upgraded to latest geotrellis-contrib-gdal. --- build.sbt | 3 +- .../spark/rasterframes/ref/RasterSource.scala | 30 +++++++++++-------- .../astraea/spark/rasterframes/TestData.scala | 1 + .../rasterframes/ref/RasterSourceSpec.scala | 6 ++-- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/build.sbt b/build.sbt index 1b28e9604..5f195bbca 100644 --- a/build.sbt +++ b/build.sbt @@ -34,7 +34,8 @@ lazy val core = project "org.locationtech.jts" % "jts-core" % "1.16.0", "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.10.0", + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.10.2", + "com.azavea.geotrellis" %% "geotrellis-contrib-gdal" % "0.10.2", spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 841bcffe7..b85dadcc9 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -27,6 +27,7 @@ import astraea.spark.rasterframes.model.{TileContext, TileDimensions} import astraea.spark.rasterframes.ref.RasterSource.SINGLEBAND import astraea.spark.rasterframes.tiles.ProjectedRasterTile import astraea.spark.rasterframes.util.GeoTiffInfoSupport +import com.azavea.gdal.GDALWarp import com.typesafe.scalalogging.LazyLogging import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource @@ -45,8 +46,6 @@ import org.apache.spark.annotation.Experimental import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT -import scala.collection.JavaConverters._ - /** * Abstraction over fetching geospatial raster data. * @@ -125,7 +124,7 @@ object RasterSource extends LazyLogging { val config = () => new Configuration() HadoopGeoTiffRasterSource(source, config) case IsDefaultGeoTiff() => - DelegatingRasterSource(source, GeoTiffRasterSource(source.toASCIIString)) + DelegatingRasterSource(source, () => GeoTiffRasterSource(source.toASCIIString)) case s => throw new UnsupportedOperationException(s"Reading '$s' not supported") } @@ -134,7 +133,7 @@ object RasterSource extends LazyLogging { private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") @transient lazy val hasGDAL: Boolean = try { - org.gdal.gdal.gdal.AllRegister() + val _ = new GDALWarp() true } catch { case _: UnsatisfiedLinkError => @@ -142,9 +141,9 @@ object RasterSource extends LazyLogging { false } - val gdalOnlyExtensions = Seq(".jp2") + val gdalOnlyExtensions = Seq(".jp2", ".mrf", ".hdf") def gdalOnly(source: URI): Boolean = - if(gdalOnlyExtensions.exists(source.getPath.endsWith)) { + if(gdalOnlyExtensions.exists(source.getPath.toLowerCase.endsWith)) { require(hasGDAL, s"Can only read $source if GDAL is available") true } else false @@ -203,7 +202,17 @@ object RasterSource extends LazyLogging { } /** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ - case class DelegatingRasterSource(source: URI, delegate: GTRasterSource) extends RasterSource with URIRasterSource { + case class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRasterSource) extends RasterSource with URIRasterSource { + @transient + lazy val delegate = delegateBuilder() + + // Bad, bad, bad? + override def equals(obj: Any): Boolean = obj match { + case drs: DelegatingRasterSource => drs.source == source + case _ => false + } + override def hashCode(): Int = source.hashCode() + // This helps reduce header reads between serializations lazy val info: SimpleGeoTiffInfo = { SimpleGeoTiffInfo( @@ -282,12 +291,7 @@ object RasterSource extends LazyLogging { override def extent: Extent = gdal.extent - private def metadata = - gdal.dataset - .GetMetadata_Dict() - .asInstanceOf[java.util.Dictionary[String, String]] - .asScala - .toMap + private def metadata = Map.empty[String, String] override def cellType: CellType = gdal.cellType diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala index 01911d884..8a208c374 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala @@ -128,6 +128,7 @@ trait TestData { lazy val remoteCOGMultiband: URI = URI.create("https://s3-us-west-2.amazonaws.com/radiant-nasa-iserv/2014/02/14/IP0201402141023382027S03100E/IP0201402141023382027S03100E-COG.tif") lazy val remoteMODIS: URI = URI.create("https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") + lazy val remoteL8: URI = URI.create("https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/017/033/LC08_L1TP_017033_20181010_20181030_01_T1/LC08_L1TP_017033_20181010_20181030_01_T1_B4.TIF") lazy val localSentinel: URL = getClass.getResource("/B01.jp2") object JTS { diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 0f7738fb9..83eb4f729 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -45,17 +45,17 @@ class RasterSourceSpec extends TestEnvironment with TestData { } val rs = RasterSource(getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI) it("should provide a tile layout") { - val layout = rs.tileLayout(TileDimensions(64, 64)) + val layout = rs.tileLayout(TileDimensions(62, 61)) layout.totalCols shouldBe >= (rs.cols.toLong) layout.totalRows shouldBe >= (rs.rows.toLong) } it("should compute nominal tile layout bounds") { - val bounds = rs.layoutBounds(TileDimensions(64, 64)) + val bounds = rs.layoutBounds(TileDimensions(65, 60)) val agg = bounds.reduce(_ combine _) agg should be (rs.gridBounds) } it("should compute nominal tile layout extents") { - val extents = rs.layoutExtents(TileDimensions(64, 64)) + val extents = rs.layoutExtents(TileDimensions(63, 63)) val agg = extents.reduce(_ combine _) agg should be (rs.extent) } From 98bfe915904f8c9a776ea3ee02d3050528316348 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 4 Apr 2019 11:41:58 -0400 Subject: [PATCH 027/380] Moved JP2 test to integration test configuration. --- .../astraea/spark/rasterframes/ref/RasterSourceIT.scala | 7 +++++++ .../astraea/spark/rasterframes/ref/RasterSourceSpec.scala | 7 ------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala index d5283ae2d..e32a8caa7 100644 --- a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala @@ -67,4 +67,11 @@ class RasterSourceIT extends TestEnvironment with TestData { } } } + + describe("GDAL support") { + it("should read JPEG2000 scene") { + val src = RasterSource(localSentinel.toURI) + src.readAll().flatMap(_.tile.statisticsDouble).size should be (64) + } + } } diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 83eb4f729..141eac48f 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -131,11 +131,4 @@ class RasterSourceSpec extends TestEnvironment with TestData { // } } } - - describe("GDAL support") { - it("should read JPEG2000 scene") { - val src = RasterSource(localSentinel.toURI) - src.readAll().flatMap(_.tile.statisticsDouble).size should be (64) - } - } } From c68748e4321bc0b0cc06489196fe77c855685292 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 5 Apr 2019 15:14:27 -0400 Subject: [PATCH 028/380] Renamed `withBounds` to `withGeometry`. Added `withExtent`. --- .../spark/rasterframes/StandardColumns.scala | 5 ++-- .../extensions/RFSpatialColumnMethods.scala | 30 +++++++++++++------ .../rasterframes/util/debug/package.scala | 2 +- .../rasterframes/GeometryOperationsSpec.scala | 2 +- .../astraea/spark/rasterframes/JTSSpec.scala | 30 +++++++++---------- .../spark/rasterframes/SpatialKeySpec.scala | 2 +- .../geotiff/GeoTiffCollectionRelation.scala | 2 +- .../geotrellis/GeoTrellisRelation.scala | 2 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 26 ++++++++-------- docs/src/main/tut/release-notes.md | 2 ++ .../datasource/awspds/PDSFields.scala | 2 +- .../spark/rasterframes/py/PyRFContext.scala | 2 +- 12 files changed, 60 insertions(+), 47 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala index d08df5d3c..32c380c05 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala @@ -25,10 +25,9 @@ trait StandardColumns { /** Default RasterFrame timestamp column name */ val TIMESTAMP_COLUMN = col("timestamp").as[Timestamp] - - /** Default RasterFrame column name for an tile bounds value. */ + /** Default RasterFrame column name for an tile extent as geometry value. */ // This is a `def` because `PolygonUDT` needs to be initialized first. - def BOUNDS_COLUMN = col("bounds").as[jtsPolygon] + def GEOMETRY_COLUMN = col("geometry").as[jtsPolygon] /** Default RasterFrame column name for the center coordinates of the tile's bounds. */ // This is a `def` because `PointUDT` needs to be initialized first. diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala index 71204c8ec..46ee83205 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala @@ -21,13 +21,14 @@ package astraea.spark.rasterframes.extensions import astraea.spark.rasterframes.util._ import astraea.spark.rasterframes.{RasterFrame, StandardColumns} -import org.locationtech.jts.geom.{Point, Polygon} +import org.locationtech.jts.geom.Point import geotrellis.proj4.LatLng import geotrellis.spark.SpatialKey import geotrellis.spark.tiling.MapKeyTransform import geotrellis.util.MethodExtensions +import geotrellis.vector.Extent import org.apache.spark.sql.Row -import org.apache.spark.sql.functions.{asc, udf ⇒ sparkUdf} +import org.apache.spark.sql.functions.{asc, udf => sparkUdf} import org.apache.spark.sql.types.{DoubleType, StructField, StructType} import org.locationtech.geomesa.curve.Z2SFC @@ -43,28 +44,39 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard /** Returns the key-space to map-space coordinate transform. */ def mapTransform: MapKeyTransform = self.tileLayerMetadata.merge.mapTransform - private def keyCol2Bounds: Row ⇒ Polygon = { + private def keyCol2Extent: Row ⇒ Extent = { val transform = self.sparkSession.sparkContext.broadcast(mapTransform) - (r: Row) ⇒ transform.value.keyToExtent(SpatialKey(r.getInt(0), r.getInt(1))).jtsGeom + r ⇒ transform.value.keyToExtent(SpatialKey(r.getInt(0), r.getInt(1))) } private def keyCol2LatLng: Row ⇒ (Double, Double) = { val transform = self.sparkSession.sparkContext.broadcast(mapTransform) val crs = self.tileLayerMetadata.merge.crs - (r: Row) ⇒ { + r ⇒ { val center = transform.value.keyToExtent(SpatialKey(r.getInt(0), r.getInt(1))).center.reproject(crs, LatLng) (center.x, center.y) } } + /** + * Append a column containing the extent of the row's spatial key. + * Coordinates are in native CRS. + * @param colName name of column to append. Defaults to "extent" + * @return updated RasterFrame + */ + def withExtent(colName: String = EXTENT_COLUMN.columnName): RasterFrame = { + val key2Extent = sparkUdf(keyCol2Extent) + self.withColumn(colName, key2Extent(self.spatialKeyColumn)).certify + } + /** * Append a column containing the bounds of the row's spatial key. * Coordinates are in native CRS. - * @param colName name of column to append. Defaults to "bounds" + * @param colName name of column to append. Defaults to "geometry" * @return updated RasterFrame */ - def withBounds(colName: String = BOUNDS_COLUMN.columnName): RasterFrame = { - val key2Bounds = sparkUdf(keyCol2Bounds) + def withGeometry(colName: String = GEOMETRY_COLUMN.columnName): RasterFrame = { + val key2Bounds = sparkUdf(keyCol2Extent andThen (_.jtsGeom)) self.withColumn(colName, key2Bounds(self.spatialKeyColumn)).certify } @@ -75,7 +87,7 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard * @return updated RasterFrame */ def withCenter(colName: String = CENTER_COLUMN.columnName): RasterFrame = { - val key2Center = sparkUdf(keyCol2Bounds andThen (_.getCentroid)) + val key2Center = sparkUdf(keyCol2Extent andThen (_.center.jtsGeom)) self.withColumn(colName, key2Center(self.spatialKeyColumn).as[Point]).certify } diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala b/core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala index 53b4b6aee..a7703449a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala @@ -46,7 +46,7 @@ package object debug { import spray.json.DefaultJsonProtocol._ val features = self - .select(BOUNDS_COLUMN, SPATIAL_KEY_COLUMN) + .select(GEOMETRY_COLUMN, SPATIAL_KEY_COLUMN) .collect() .map{ case (p, s) ⇒ Feature(Geometry(p).reproject(self.crs, LatLng), Map("col" -> s.col, "row" -> s.row)) } diff --git a/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala index 28d0bcb94..d885009aa 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala @@ -44,7 +44,7 @@ class GeometryOperationsSpec extends TestEnvironment with TestData { describe("Geometery operations") { import spark.implicits._ it("should rasterize geometry") { - val rf = l8Sample(1).projectedRaster.toRF.withBounds() + val rf = l8Sample(1).projectedRaster.toRF.withGeometry() val features = geoJson.parseGeoJson[JsonFeatureCollection].getAllPolygonFeatures[JsObject]() val df = features.map(f ⇒ ( diff --git a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala index 0580e5ba1..15fac8010 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala @@ -30,7 +30,7 @@ import geotrellis.vector.{Point ⇒ GTPoint} */ class JTSSpec extends TestEnvironment with TestData with StandardColumns { describe("JTS interop") { - val rf = l8Sample(1).projectedRaster.toRF(10, 10).withBounds() + val rf = l8Sample(1).projectedRaster.toRF(10, 10).withGeometry() it("should allow joining and filtering of tiles based on points") { import spark.implicits._ @@ -43,27 +43,27 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { val locs = coords.toDF("id", "point") withClue("join with point column") { - assert(rf.join(locs, st_contains(BOUNDS_COLUMN, $"point")).count === coords.length) - assert(rf.join(locs, st_intersects(BOUNDS_COLUMN, $"point")).count === coords.length) + assert(rf.join(locs, st_contains(GEOMETRY_COLUMN, $"point")).count === coords.length) + assert(rf.join(locs, st_intersects(GEOMETRY_COLUMN, $"point")).count === coords.length) } withClue("point literal") { val point = coords.head._2 - assert(rf.filter(st_contains(BOUNDS_COLUMN, geomLit(point))).count === 1) - assert(rf.filter(st_intersects(BOUNDS_COLUMN, geomLit(point))).count === 1) - assert(rf.filter(BOUNDS_COLUMN intersects point).count === 1) - assert(rf.filter(BOUNDS_COLUMN intersects GTPoint(point)).count === 1) - assert(rf.filter(BOUNDS_COLUMN containsGeom point).count === 1) + assert(rf.filter(st_contains(GEOMETRY_COLUMN, geomLit(point))).count === 1) + assert(rf.filter(st_intersects(GEOMETRY_COLUMN, geomLit(point))).count === 1) + assert(rf.filter(GEOMETRY_COLUMN intersects point).count === 1) + assert(rf.filter(GEOMETRY_COLUMN intersects GTPoint(point)).count === 1) + assert(rf.filter(GEOMETRY_COLUMN containsGeom point).count === 1) } withClue("exercise predicates") { val point = geomLit(coords.head._2) - assert(rf.filter(st_covers(BOUNDS_COLUMN, point)).count === 1) - assert(rf.filter(st_crosses(BOUNDS_COLUMN, point)).count === 0) - assert(rf.filter(st_disjoint(BOUNDS_COLUMN, point)).count === rf.count - 1) - assert(rf.filter(st_overlaps(BOUNDS_COLUMN, point)).count === 0) - assert(rf.filter(st_touches(BOUNDS_COLUMN, point)).count === 0) - assert(rf.filter(st_within(BOUNDS_COLUMN, point)).count === 0) + assert(rf.filter(st_covers(GEOMETRY_COLUMN, point)).count === 1) + assert(rf.filter(st_crosses(GEOMETRY_COLUMN, point)).count === 0) + assert(rf.filter(st_disjoint(GEOMETRY_COLUMN, point)).count === rf.count - 1) + assert(rf.filter(st_overlaps(GEOMETRY_COLUMN, point)).count === 0) + assert(rf.filter(st_touches(GEOMETRY_COLUMN, point)).count === 0) + assert(rf.filter(st_within(GEOMETRY_COLUMN, point)).count === 0) } } @@ -80,7 +80,7 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { it("should provide a means of getting a bounding box") { import spark.implicits._ - val boxed = rf.select(BOUNDS_COLUMN, envelope(BOUNDS_COLUMN) as "env") + val boxed = rf.select(GEOMETRY_COLUMN, envelope(GEOMETRY_COLUMN) as "env") assert(boxed.select($"env".as[Envelope]).first.getArea > 0) assert(boxed.toDF("bounds", "bbox").select("bbox.*").schema.length === 4) } diff --git a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala b/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala index 900ad1bb4..14b55db90 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala @@ -41,7 +41,7 @@ class SpatialKeySpec extends TestEnvironment with TestData { it("should add an extent column") { val expected = raster.extent.jtsGeom - val result = rf.withBounds().select($"bounds".as[Polygon]).first + val result = rf.withGeometry().select($"bounds".as[Polygon]).first assert(result === expected) } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index 2f69d4425..e0215f5f7 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -86,7 +86,7 @@ object GeoTiffCollectionRelation { object Cols { lazy val PATH = "path" lazy val CRS = "crs" - lazy val EX = BOUNDS_COLUMN.columnName + lazy val EX = GEOMETRY_COLUMN.columnName lazy val TL = TILE_COLUMN.columnName } } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala index 5f5cb6de5..8a171af4e 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala @@ -349,6 +349,6 @@ object GeoTrellisRelation { lazy val TS = TIMESTAMP_COLUMN.columnName lazy val TL = TILE_COLUMN.columnName lazy val TF = TILE_FEATURE_DATA_COLUMN.columnName - lazy val EX = BOUNDS_COLUMN.columnName + lazy val EX = GEOMETRY_COLUMN.columnName } } diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 009382639..f788d0a8a 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -151,7 +151,7 @@ class GeoTrellisDataSourceSpec } it("should invoke Encoder[Extent]") { - val df = layerReader.loadRF(layer).withBounds() + val df = layerReader.loadRF(layer).withGeometry() assert(df.count > 0) assert(df.first.length === 5) assert(df.first.getAs[Extent](2) !== null) @@ -285,7 +285,7 @@ class GeoTrellisDataSourceSpec it("should support extent against a geometry literal") { val df: DataFrame = layerReader .loadRF(layer) - .where(BOUNDS_COLUMN intersects pt1) + .where(GEOMETRY_COLUMN intersects pt1) assert(numFilters(df) === 1) @@ -296,7 +296,7 @@ class GeoTrellisDataSourceSpec it("should support query with multiple geometry types") { // Mostly just testing that these evaluate without catalyst type errors. forEvery(JTS.all) { g ⇒ - val query = layerReader.loadRF(layer).where(BOUNDS_COLUMN.intersects(g)) + val query = layerReader.loadRF(layer).where(GEOMETRY_COLUMN.intersects(g)) .persist(StorageLevel.OFF_HEAP) assert(query.count() === 0) } @@ -309,7 +309,7 @@ class GeoTrellisDataSourceSpec val df = layerReader .loadRF(layer) - .where(st_intersects(BOUNDS_COLUMN, mkPtFcn(SPATIAL_KEY_COLUMN))) + .where(st_intersects(GEOMETRY_COLUMN, mkPtFcn(SPATIAL_KEY_COLUMN))) assert(numFilters(df) === 0) @@ -360,8 +360,8 @@ class GeoTrellisDataSourceSpec val df = layerReader .loadRF(layer) .where( - ((BOUNDS_COLUMN intersects pt1) || - (BOUNDS_COLUMN intersects pt2)) && + ((GEOMETRY_COLUMN intersects pt1) || + (GEOMETRY_COLUMN intersects pt2)) && (TIMESTAMP_COLUMN === Timestamp.valueOf(now.toLocalDateTime)) ) @@ -374,7 +374,7 @@ class GeoTrellisDataSourceSpec withClue("partially nested") { val df = layerReader .loadRF(layer) - .where((BOUNDS_COLUMN intersects pt1) || (BOUNDS_COLUMN intersects pt2)) + .where((GEOMETRY_COLUMN intersects pt1) || (GEOMETRY_COLUMN intersects pt2)) .where(TIMESTAMP_COLUMN === Timestamp.valueOf(now.toLocalDateTime)) assert(numFilters(df) === 1) @@ -388,7 +388,7 @@ class GeoTrellisDataSourceSpec withClue("intersects first") { val df = layerReader .loadRF(layer) - .where(BOUNDS_COLUMN intersects pt1) + .where(GEOMETRY_COLUMN intersects pt1) .where(TIMESTAMP_COLUMN betweenTimes(now.minusDays(1), now.plusDays(1))) assert(numFilters(df) == 1) @@ -397,7 +397,7 @@ class GeoTrellisDataSourceSpec val df = layerReader .loadRF(layer) .where(TIMESTAMP_COLUMN betweenTimes(now.minusDays(1), now.plusDays(1))) - .where(BOUNDS_COLUMN intersects pt1) + .where(GEOMETRY_COLUMN intersects pt1) assert(numFilters(df) == 1) } @@ -418,8 +418,8 @@ class GeoTrellisDataSourceSpec it("should handle renamed spatial filter columns") { val df = layerReader .loadRF(layer) - .where(BOUNDS_COLUMN intersects region.jtsGeom) - .withColumnRenamed(BOUNDS_COLUMN.columnName, "foobar") + .where(GEOMETRY_COLUMN intersects region.jtsGeom) + .withColumnRenamed(GEOMETRY_COLUMN.columnName, "foobar") assert(numFilters(df) === 1) assert(df.count > 0, df.printSchema) @@ -428,8 +428,8 @@ class GeoTrellisDataSourceSpec it("should handle dropped spatial filter columns") { val df = layerReader .loadRF(layer) - .where(BOUNDS_COLUMN intersects region.jtsGeom) - .drop(BOUNDS_COLUMN) + .where(GEOMETRY_COLUMN intersects region.jtsGeom) + .drop(GEOMETRY_COLUMN) assert(numFilters(df) === 1) } diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index e32a02e82..bf51f640b 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -19,6 +19,8 @@ * _Breaking_: `CellHistogram` no longer carries along approximate statistics, due to confusing behavior. Use `agg_stats` instead. * Introduced `LocalCellStatistics` class to wrap together results from `LocalStatsAggregate`. * _Breaking_: `TileDimensions` moved from `astraea.spark.rasterframes` to `astraea.spark.rasterframes.model`. +* _Breaking_: Renamed `RasterFrame.withBounds` to `RasterFrame.withGeometry` for consistency with DataSource schemas. +* Added `RasterFrame.withExtent` extension method. ## 0.7.x diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala index 96eb55a7e..c0e531651 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala @@ -43,7 +43,7 @@ trait PDSFields { final val PROC_LEVEL = StructField("processing_level", StringType, false) final val PATH = StructField("path", ShortType, false) final val ROW = StructField("row", ShortType, false) - final val BOUNDS = StructField(BOUNDS_COLUMN.columnName, JTSTypes.GeometryTypeInstance, false) + final val BOUNDS = StructField(GEOMETRY_COLUMN.columnName, JTSTypes.GeometryTypeInstance, false) final val ASSETS = StructField("assets", DataTypes.createMapType(StringType, StringType)) final def BOUNDS_WGS84 = StructField( "bounds_wgs84", StandardEncoders.envelopeEncoder.schema, false diff --git a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala index d4a8967c0..173d00527 100644 --- a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala @@ -184,7 +184,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def spatialJoin(df: DataFrame, right: DataFrame): RasterFrame = df.asRF.spatialJoin(right.asRF) - def withBounds(df: DataFrame): RasterFrame = df.asRF.withBounds() + def withBounds(df: DataFrame): RasterFrame = df.asRF.withGeometry() def withCenter(df: DataFrame): RasterFrame = df.asRF.withCenter() From 6abd0010db035cced7d6944f5927e7f638d7a30f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 8 Apr 2019 16:50:11 -0400 Subject: [PATCH 029/380] Test fixes associated with changing `bounds` to `geometry`. --- .../spark/rasterframes/GeometryOperationsSpec.scala | 6 +++--- .../astraea/spark/rasterframes/SpatialKeySpec.scala | 5 +---- .../datasource/geotrellis/GeoTrellisDataSourceSpec.scala | 2 +- .../experimental/datasource/awspds/L8RelationTest.scala | 4 ++-- pyrasterframes/build.sbt | 9 +++++++++ pyrasterframes/python/tests/PyRasterFramesTests.py | 4 ++-- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala index d885009aa..51cd6c20a 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala @@ -50,7 +50,7 @@ class GeometryOperationsSpec extends TestEnvironment with TestData { val df = features.map(f ⇒ ( f.geom.reproject(LatLng, rf.crs).jtsGeom, f.data.fields("id").asInstanceOf[JsNumber].value.intValue() - )).toDF("geom", "id") + )).toDF("geom", "__fid__") val toRasterize = rf.crossJoin(df) @@ -58,7 +58,7 @@ class GeometryOperationsSpec extends TestEnvironment with TestData { val (cols, rows) = tlm.layout.tileLayout.tileDimensions - val rasterized = toRasterize.withColumn("rasterized", rasterize($"geom", $"bounds", $"id", cols, rows)) + val rasterized = toRasterize.withColumn("rasterized", rasterize($"geom", GEOMETRY_COLUMN, $"__fid__", cols, rows)) assert(rasterized.count() === df.count() * rf.count()) assert(rasterized.select(tile_dimensions($"rasterized")).distinct().count() === 1) @@ -67,7 +67,7 @@ class GeometryOperationsSpec extends TestEnvironment with TestData { toRasterize.createOrReplaceTempView("stuff") - val viaSQL = sql(s"select rf_rasterize(geom, bounds, id, $cols, $rows) as rasterized from stuff") + val viaSQL = sql(s"select rf_rasterize(geom, geometry, __fid__, $cols, $rows) as rasterized from stuff") assert(viaSQL.select(agg_data_cells($"rasterized")).first === pixelCount) //rasterized.select($"rasterized".as[Tile]).foreach(t ⇒ t.renderPng(ColorMaps.IGBP).write("target/" + t.hashCode() + ".png")) diff --git a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala b/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala index 14b55db90..01af2b4d2 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala @@ -19,7 +19,6 @@ package astraea.spark.rasterframes -import org.locationtech.jts.geom.Polygon import geotrellis.proj4.LatLng import geotrellis.vector.Point import org.locationtech.geomesa.curve.Z2SFC @@ -41,7 +40,7 @@ class SpatialKeySpec extends TestEnvironment with TestData { it("should add an extent column") { val expected = raster.extent.jtsGeom - val result = rf.withGeometry().select($"bounds".as[Polygon]).first + val result = rf.withGeometry().select(GEOMETRY_COLUMN).first assert(result === expected) } @@ -64,6 +63,4 @@ class SpatialKeySpec extends TestEnvironment with TestData { assert(result === expected) } } - // This is to avoid an IntelliJ error - protected def withFixture(test: Any) = ??? } diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 07de32c53..14a54cf6f 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -408,7 +408,7 @@ class GeoTrellisDataSourceSpec .loadRF(layer) .where($"timestamp" >= Timestamp.valueOf(now.minusDays(1).toLocalDateTime)) .where($"timestamp" <= Timestamp.valueOf(now.plusDays(1).toLocalDateTime)) - .where(st_intersects($"bounds", geomLit(pt1.jtsGeom))) + .where(st_intersects(GEOMETRY_COLUMN, geomLit(pt1.jtsGeom))) assert(numFilters(df) == 1) } diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala index 6f7d7e17d..b014dae7a 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala +++ b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala @@ -32,10 +32,10 @@ class L8RelationTest extends TestEnvironment with BeforeAndAfterAll with BeforeA private var scenes: DataFrame = _ val query = """ - |SELECT bounds, timestamp, B1, B2 + |SELECT geometry, timestamp, B1, B2 |FROM l8 |WHERE - | st_intersects(bounds, st_geomFromText('LINESTRING (-39.551 -7.1881, -72.2461 -45.7062)')) AND + | st_intersects(geometry, st_geomFromText('LINESTRING (-39.551 -7.1881, -72.2461 -45.7062)')) AND | timestamp > to_timestamp('2017-11-01') AND | timestamp <= to_timestamp('2017-11-03') """.stripMargin diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index c4284836e..f2bacfaad 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -110,6 +110,8 @@ val pysparkCmd = taskKey[Unit]("Builds pyspark package and emits command string lazy val pyTest = taskKey[Int]("Run pyrasterframes tests. Return result code.") +lazy val pyTestQuick = taskKey[Int]("Run pyrasterframes tests, skipping build and assembly. Return result code.") + lazy val pyExamples = taskKey[Unit]("Run pyrasterframes examples.") lazy val pyWheel = taskKey[Unit]("Creates a Python .whl file") @@ -158,6 +160,13 @@ pyTest := { Process("python setup.py test", wd).! } +pyTestQuick := { + val s = streams.value + s.log.info("Running python tests...") + val wd = pythonSource.value + Process("python setup.py test", wd).! +} + Test / executeTests := { val standard = (Test / executeTests).value standard.overall match { diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 07dc008f9..10513f7d4 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -98,7 +98,7 @@ def test_general(self): .withColumn('mean', tile_mean(self.tileCol)) \ .withColumn('sum', tile_sum(self.tileCol)) \ .withColumn('stats', tile_stats(self.tileCol)) \ - .withColumn('envelope', envelope('bounds')) \ + .withColumn('envelope', envelope('geometry')) \ .withColumn('ascii', render_ascii(self.tileCol)) \ .withColumn('log', log(self.tileCol)) \ .withColumn('exp', exp(self.tileCol)) \ @@ -109,7 +109,7 @@ def test_general(self): def test_rasterize(self): # NB: This test just makes sure rasterize runs, not that the results are correct. - withRaster = self.rf.withColumn('rasterize', rasterize('bounds', 'bounds', lit(42), 10, 10)) + withRaster = self.rf.withColumn('rasterize', rasterize('geometry', 'geometry', lit(42), 10, 10)) withRaster.show() def test_reproject(self): From e09d1db34e0dadbc13ec51da85aa2b6d817b78af Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 9 Apr 2019 11:19:22 -0400 Subject: [PATCH 030/380] Renamed `GeometryToBounds` to `GeometryToExtent`. --- .../rasterframes/expressions/accessors/GetEnvelope.scala | 2 +- .../{GeometryToBounds.scala => GeometryToExtent.scala} | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) rename core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/{GeometryToBounds.scala => GeometryToExtent.scala} (93%) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala index b082f14b0..ce6ef4504 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala @@ -36,7 +36,7 @@ import org.apache.spark.sql.{Column, TypedColumn} * * @since 2/22/18 */ -@deprecated("Replace usages of this with GeometryToBounds", "11/4/2018") +@deprecated("Replace usages of this with GeometryToExtent", "11/4/2018") case class GetEnvelope(child: Expression) extends UnaryExpression with CodegenFallback { override def nodeName: String = "envelope" diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToBounds.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToBounds.scala rename to core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala index 4e08ad9ea..69cd3f7cb 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToBounds.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala @@ -37,7 +37,7 @@ import org.apache.spark.sql.{Column, TypedColumn} * * @since 8/24/18 */ -case class GeometryToBounds(child: Expression) extends UnaryExpression with CodegenFallback { +case class GeometryToExtent(child: Expression) extends UnaryExpression with CodegenFallback { override def nodeName: String = "geometry_bounds" override def dataType: DataType = CatalystSerializer[Extent].schema @@ -58,9 +58,9 @@ case class GeometryToBounds(child: Expression) extends UnaryExpression with Code } } -object GeometryToBounds { +object GeometryToExtent { import astraea.spark.rasterframes.encoders.StandardEncoders._ def apply(bounds: Column): TypedColumn[Any, Extent] = - new Column(new GeometryToBounds(bounds.expr)).as[Extent] + new Column(new GeometryToExtent(bounds.expr)).as[Extent] } \ No newline at end of file From 5794587572f49e2d29bdc411336d8378f5507783 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 9 Apr 2019 10:32:13 -0400 Subject: [PATCH 031/380] Initial attempt converting pyrasterframes TileUDT to numpy; only works for float64 type Signed-off-by: Jason T. Brown --- .../python/pyrasterframes/context.py | 7 +- .../python/pyrasterframes/rasterfunctions.py | 10 +-- pyrasterframes/python/pyrasterframes/types.py | 90 ++++++++++++++----- .../python/tests/PyRasterFramesTests.py | 49 +++++++++- .../spark/rasterframes/py/PyRFContext.scala | 15 +++- 5 files changed, 139 insertions(+), 32 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/context.py b/pyrasterframes/python/pyrasterframes/context.py index 9f238c225..13ed223a8 100644 --- a/pyrasterframes/python/pyrasterframes/context.py +++ b/pyrasterframes/python/pyrasterframes/context.py @@ -28,7 +28,7 @@ def lookup(self, function_name): @staticmethod def active(): """ - Get the active Pythono RFContext and throw an error if it is not enabled for RasterFrames. + Get the active Python RFContext and throw an error if it is not enabled for RasterFrames. """ sc = SparkContext._active_spark_context if not hasattr(sc, '_rf_context'): @@ -36,6 +36,11 @@ def active(): "RasterFrames have not been enabled for the active session. Call 'SparkSession.withRasterFrames()'.") return sc._rf_context + @staticmethod + def call(name, *args): + f = RFContext.active().lookup(name) + return f(*args) + @staticmethod def _jvm_mirror(): """ diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 589b256d8..f63637321 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -14,14 +14,9 @@ THIS_MODULE = 'pyrasterframes' -def _context_call(name, *args): - f = RFContext.active().lookup(name) - return f(*args) - - def _celltype(cellTypeStr): """ Convert the string cell type to the expected CellType object.""" - return _context_call('cell_type', cellTypeStr) + return RFContext.call('cell_type', cellTypeStr) def _create_assembleTile(): @@ -154,7 +149,7 @@ def _(data_tile, mask_tile, mask_value): _rf_unique_functions = { 'array_to_tile': _create_arrayToTile(), 'assemble_tile': _create_assembleTile(), - 'cell_types': lambda: _context_call('cell_types'), + 'cell_types': lambda: RFContext.call('cell_types'), 'convert_cell_type': _create_convertCellType(), 'explode_tiles': _create_explode_tiles(), 'explode_tiles_sample': _create_explode_tiles_sample(), @@ -235,6 +230,7 @@ def _(data_tile, mask_tile, mask_value): 'local_greater_equal': 'Cellwise greater than or equal to comparison between two tiles', 'local_equal': 'Cellwise equality comparison between two tiles', 'local_unequal': 'Cellwise inequality comparison between two tiles', + 'render_matrix': 'Render matrix as a formatted string', 'round': 'Round cell values to the nearest integer without changing the cell type', 'log': 'Performs cell-wise natural logarithm', 'log10': 'Performs cell-wise logartithm with base 10', diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index b82cfb70c..693752db7 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -12,13 +12,14 @@ class here provides the PyRasterFrames entry point. from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable from .context import RFContext +import numpy __all__ = ['RasterFrame', 'TileUDT', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] class RasterFrame(DataFrame): def __init__(self, jdf, spark_session): - DataFrame.__init__(self, jdf, spark_session) + DataFrame.__init__(self, jdf, spark_session._wrapped) self._jrfctx = spark_session.rasterframes._jrfctx def tileColumns(self): @@ -130,27 +131,44 @@ def scalaUDT(cls): return 'org.apache.spark.sql.rf.RasterSourceUDT' def serialize(self, obj): - if (obj is None): return None + # Not yet implemented. Kryo serialized bytes? return None def deserialize(self, datum): - return None + bytes(datum[0]) + class TileUDT(UserDefinedType): @classmethod - def sqlType(self): + def sqlType(cls): + """ + Mirrors `schema` in scala companion object org.apache.spark.sql.rf.TileUDT + """ return StructType([ - StructField("cell_type", StringType(), False), - StructField("cols", ShortType(), False), - StructField("rows", ShortType(), False), - StructField("cells", BinaryType(), True), - StructField("ref", StructType([ - StructField("source", RasterSourceUDT(), False), - StructField("subextent", StructType([ - StructField("xmin", DoubleType(), False), - StructField("ymin", DoubleType(), False), - StructField("xmax", DoubleType(), False), - StructField("ymax", DoubleType(), False)]), True)]), True)]) + StructField("cell_context", StructType([ + StructField("cell_type", StructType([ + StructField("cellTypeName", StringType(), False) + ]), False), + # ], False), # life wood be ez if string dough + StructField("dimensions", StructType([ + StructField("cols", ShortType(), False), + StructField("rows", ShortType(), False) + ]), False), + ]), False), + StructField("cell_data", StructType([ + StructField("cells", BinaryType(), True), + StructField("ref", StructType([ + StructField("source", RasterSourceUDT(), False), + StructField("subextent", StructType([ + StructField("xmin", DoubleType(), False), + StructField("ymin", DoubleType(), False), + StructField("xmax", DoubleType(), False), + StructField("ymax", DoubleType(), False) + + ]), True) + ]), True) + ]), False) + ]) @classmethod def module(cls): @@ -160,16 +178,46 @@ def module(cls): def scalaUDT(cls): return 'org.apache.spark.sql.rf.TileUDT' - # NB: These will need implementations if UDFs are to be supported, - # preferably in numpy arrays. - def serialize(self, obj): - if (obj is None): return None - return None + def serialize(self, masked_array): + return_val = [ + # cell_context + [ + [masked_array.dtype.name], + [masked_array.shape[1], masked_array.shape[0]] + ], + # cell_data + [ + # cells + RFContext.call('list_to_bytearray', masked_array.flatten().tolist(), masked_array.shape[1], masked_array.shape[0]), + # ref -- TODO implement + None + ] + ] + return return_val def deserialize(self, datum): - return None + """ + + :param datum: + :return: A Tile object from row data. + """ + cell_type = datum.cell_context.cell_type.cellTypeName + cols = datum.cell_context.dimensions.cols + rows = datum.cell_context.dimensions.rows + cell_data_bytes = bytes(datum.cell_data.cells) + cell_value_list = list(RFContext.call('bytearray_to_list', cell_data_bytes, cell_type, cols, rows)) + + ma = MaskedArray( + numpy.reshape(cell_value_list, (rows, cols), order='C').astype(cell_type), + numpy.zeros((rows, cols)) + ) + return ma + + deserialize.__safe_for_unpickling__ = True +from numpy.ma import MaskedArray +MaskedArray.__UDT__ = TileUDT() class TileExploder(JavaTransformer, JavaMLReadable, JavaMLWritable): """ diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 07dc008f9..9951fb10a 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -1,5 +1,5 @@ -from pyspark.sql import SparkSession, Column +from pyspark.sql import SparkSession, Column, SQLContext from pyspark.sql.functions import * from pyrasterframes import * from pyrasterframes.rasterfunctions import * @@ -138,7 +138,7 @@ def test_sql(self): self.rf.createOrReplaceTempView("rf") - dims = self.rf.withColumn('dims', tile_dimensions(self.tileCol)).first().dims + dims = self.rf.withColumn('dims', tile_dimensions(self.tileCol)).first().dims dims_str = """{}, {}""".format(dims.cols, dims.rows) self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, @@ -285,9 +285,54 @@ def some_point(g): pandas_df_out.poly_len.values ) + def test_tile_udt(self): + import pandas as pd + import numpy as np + from numpy.ma import MaskedArray + self.assertIsInstance(self.rf.sql_ctx, SQLContext) + + # Try to create a tile from numpy.ma.MaskedArray + to_spark = pd.DataFrame({ + 't': [MaskedArray(np.random.randn(10, 10), np.zeros((10, 10))) for _ in range(3)], + 'b': ['a', 'b', 'c'], + 'c': [1, 2, 4], + }) + rf_maybe = self.spark.createDataFrame(to_spark) + print("Type of dataframe: ", type(rf_maybe)) + rf_maybe.printSchema() + print(rf_maybe.toPandas()) + + # Try to do something with it. + sums = to_spark.t.apply(lambda a: a.sum()).tolist() + maybe_sums = rf_maybe.select(tile_sum(rf_maybe.t).alias('tsum')) + print("Schema of tile sum") + maybe_sums.printSchema() + + maybe_sums = [r.tsum for r in maybe_sums.collect()] + np.testing.assert_almost_equal(maybe_sums, sums, 12) + + + # Test round trip for an array + simple_array = MaskedArray(np.array([[1, 2], [3, 4]]).astype('float64'), np.zeros((2, 2))) + to_spark_2 = pd.DataFrame({ + 't': [simple_array] + }) + + rf_maybe_2 = self.spark.createDataFrame(to_spark_2) + print("RasterFrame `show`:") + rf_maybe_2.select(render_matrix(rf_maybe_2.t).alias('t')).show(truncate=False) + + pd_2 = rf_maybe_2.toPandas() + array_back_2 = pd_2.iloc[0].t + print("Array collected from toPandas output", array_back_2, sep='\n') + + self.assertIsInstance(array_back_2, MaskedArray) + np.testing.assert_equal(array_back_2, simple_array) + def suite(): function_tests = unittest.TestSuite() return function_tests + unittest.TextTestRunner().run(suite()) diff --git a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala index b80a8a3f8..32b0eb46c 100644 --- a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.py import astraea.spark.rasterframes._ import astraea.spark.rasterframes.util.CRSParser import com.vividsolutions.jts.geom.Geometry -import geotrellis.raster.{ArrayTile, CellType, MultibandTile} +import geotrellis.raster.{ArrayTile, CellType, MultibandTile, Tile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ @@ -102,6 +102,19 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions astraea.spark.rasterframes.functions.cellTypes().asJava } + def list_to_bytearray(l: java.util.ArrayList[Double], c: Int, r: Int): Array[Byte] = { + geotrellis.raster.ArrayTile(l.asScala.toArray, c, r).toBytes() + } + + def bytearray_to_list(bytes: Array[Byte], cell_type_name: String, cols: Int, rows: Int): java.util.List[Double] = { + geotrellis.raster.ArrayTile.fromBytes( + bytes, + geotrellis.raster.CellType.fromName(cell_type_name), + cols, + rows + ).toListDouble.asJava + } + /** DESERIALIZATION **/ def generate_tile(cellType: String, cols: Int, rows: Int, bytes: Array[Byte]): ArrayTile = { From f3d4b5a242febb81314cbf592bfb9715ad8273ad Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 9 Apr 2019 13:02:13 -0400 Subject: [PATCH 032/380] Python 2 compat in test print Signed-off-by: Jason T. Brown --- pyrasterframes/python/tests/PyRasterFramesTests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 9951fb10a..edaa6550a 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -324,7 +324,7 @@ def test_tile_udt(self): pd_2 = rf_maybe_2.toPandas() array_back_2 = pd_2.iloc[0].t - print("Array collected from toPandas output", array_back_2, sep='\n') + print("Array collected from toPandas output\n", array_back_2) self.assertIsInstance(array_back_2, MaskedArray) np.testing.assert_equal(array_back_2, simple_array) From ff6d289d9e0bd22f903ef1527fbad9c0b36382e8 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 9 Apr 2019 13:43:56 -0400 Subject: [PATCH 033/380] Tweaks for python 2 compatibility Signed-off-by: Jason T. Brown --- pyrasterframes/python/pyrasterframes/types.py | 4 ++-- pyrasterframes/python/setup.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index 693752db7..69968bb55 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -188,7 +188,7 @@ def serialize(self, masked_array): # cell_data [ # cells - RFContext.call('list_to_bytearray', masked_array.flatten().tolist(), masked_array.shape[1], masked_array.shape[0]), + bytearray(RFContext.call('list_to_bytearray', masked_array.flatten().tolist(), masked_array.shape[1], masked_array.shape[0])), # ref -- TODO implement None ] @@ -204,7 +204,7 @@ def deserialize(self, datum): cell_type = datum.cell_context.cell_type.cellTypeName cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows - cell_data_bytes = bytes(datum.cell_data.cells) + cell_data_bytes = datum.cell_data.cells cell_value_list = list(RFContext.call('bytearray_to_list', cell_data_bytes, cell_type, cols, rows)) ma = MaskedArray( diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index a0f318008..cf7a35f6d 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -118,16 +118,16 @@ def run(self): license='Apache 2', setup_requires=['pytest-runner', pyspark_ver, 'pathlib'], install_requires=[ - 'pytz', 'shapely', - # pyspark_ver, - # 'pathlib' + 'pytz', + 'shapely', + 'numpy>=1.7', ], tests_require=[ pyspark_ver, 'pytest==3.4.2', 'pypandoc', - 'numpy>=1.7', 'pandas', + # 'numpy>=1.7', ], test_suite="pytest-runner", packages=find_packages(exclude=['tests', 'examples']), From bda1fffa0fa0375b560b9fbc6272b57e93e684bd Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 9 Apr 2019 14:33:00 -0400 Subject: [PATCH 034/380] Added `st_extent`. --- .../scala/astraea/spark/rasterframes/RasterFunctions.scala | 5 +++++ .../spark/rasterframes/expressions/SpatialRelation.scala | 7 +++++++ .../astraea/spark/rasterframes/expressions/package.scala | 1 + .../astraea/spark/rasterframes/functions/package.scala | 1 - .../test/scala/astraea/spark/rasterframes/JTSSpec.scala | 7 ++++--- docs/src/main/tut/release-notes.md | 1 + pyrasterframes/python/pyrasterframes/rasterfunctions.py | 1 + 7 files changed, 19 insertions(+), 4 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala index db22791bb..cc4708cc0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala @@ -31,6 +31,7 @@ import astraea.spark.rasterframes.{functions => F} import geotrellis.proj4.CRS import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import geotrellis.raster.{CellType, Tile} +import geotrellis.vector.Extent import org.apache.spark.annotation.Experimental import org.apache.spark.sql._ import org.apache.spark.sql.functions._ @@ -60,8 +61,12 @@ trait RasterFunctions { def tile_dimensions(col: Column): Column = GetDimensions(col) /** Extracts the bounding box of a geometry as a JTS envelope. */ + @deprecated("Replace usages of this with `st_extent`", "11/4/2018") def envelope(col: Column): TypedColumn[Any, Envelope] = GetEnvelope(col) + /** Extracts the bounding box of a geometry as an Extent */ + def st_extent(col: Column): TypedColumn[Any, Extent] = GeometryToExtent(col) + /** Flattens Tile into a double array. */ def tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala index 18f93dd87..637fab10a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala @@ -19,13 +19,17 @@ package astraea.spark.rasterframes.expressions +import astraea.spark.rasterframes.encoders.CatalystSerializer +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.SpatialRelation.RelationPredicate +import geotrellis.vector.Extent import org.locationtech.jts.geom._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ScalaUDF, _} import org.apache.spark.sql.jts.AbstractGeometryUDT +import org.apache.spark.sql.rf.WithTypeConformity import org.apache.spark.sql.types._ import org.locationtech.geomesa.spark.jts.udf.SpatialRelationFunctions._ @@ -43,6 +47,9 @@ abstract class SpatialRelation extends BinaryExpression case r: InternalRow ⇒ expr.dataType match { case udt: AbstractGeometryUDT[_] ⇒ udt.deserialize(r) + case dt if dt.conformsTo(CatalystSerializer[Extent].schema) => + val extent = r.to[Extent] + extent.jtsGeom } } } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala index e4c0bcc00..52510d3ef 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala @@ -66,6 +66,7 @@ package object expressions { registry.registerExpression[SetCellType]("rf_convert_cell_type") registry.registerExpression[GetDimensions]("rf_tile_dimensions") registry.registerExpression[BoundsToGeometry]("rf_bounds_geometry") + registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala index a5c4547d7..6805a99d1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala @@ -133,7 +133,6 @@ package object functions { } def register(sqlContext: SQLContext): Unit = { - sqlContext.udf.register("rf_make_constant_tile", makeConstantTile) sqlContext.udf.register("rf_tile_zeros", tileZeros) sqlContext.udf.register("rf_tile_ones", tileOnes) diff --git a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala index 15fac8010..a017e9a2e 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala @@ -21,7 +21,8 @@ package astraea.spark.rasterframes import org.locationtech.jts.geom._ import geotrellis.proj4.{LatLng, Sinusoidal, WebMercator} -import geotrellis.vector.{Point ⇒ GTPoint} +import geotrellis.vector.{Extent, Point => GTPoint} +import org.apache.spark.sql.Column /** * Test rig for operations providing interop with JTS types. @@ -80,8 +81,8 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { it("should provide a means of getting a bounding box") { import spark.implicits._ - val boxed = rf.select(GEOMETRY_COLUMN, envelope(GEOMETRY_COLUMN) as "env") - assert(boxed.select($"env".as[Envelope]).first.getArea > 0) + val boxed = rf.select(GEOMETRY_COLUMN, st_extent(GEOMETRY_COLUMN) as "extent") + assert(boxed.select($"extent".as[Extent]).first.area > 0) assert(boxed.toDF("bounds", "bbox").select("bbox.*").schema.length === 4) } diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index bf51f640b..a448ffa60 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -21,6 +21,7 @@ * _Breaking_: `TileDimensions` moved from `astraea.spark.rasterframes` to `astraea.spark.rasterframes.model`. * _Breaking_: Renamed `RasterFrame.withBounds` to `RasterFrame.withGeometry` for consistency with DataSource schemas. * Added `RasterFrame.withExtent` extension method. +* Added `st_extent` and deprecated `envelope`. ## 0.7.x diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 589b256d8..7c015b8d9 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -245,6 +245,7 @@ def _(data_tile, mask_tile, mask_value): 'exp10': 'Compute 10 to the power of cell values', 'expm1': 'Performs cell-wise exponential, then subtract one', 'resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', + 'st_extent': 'Compute the extent/bbox of a Geometry', # ------- JTS functions ------- # spatial constructors From c1cce3d73d26d6df926534f445bb19510b91205b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 9 Apr 2019 16:32:18 -0400 Subject: [PATCH 035/380] Renamed `bounds_geometry` to `extent_geometry`. --- .../astraea/spark/rasterframes/RasterFunctions.scala | 2 +- .../astraea/spark/rasterframes/expressions/package.scala | 2 +- .../{BoundsToGeometry.scala => ExtentToGeometry.scala} | 8 ++++---- .../rasterframes/util/ZeroSevenCompatibilityKit.scala | 4 ++-- docs/src/main/tut/release-notes.md | 2 +- .../experimental/datasource/awspds/L8Relation.scala | 2 +- pyrasterframes/python/pyrasterframes/rasterfunctions.py | 1 + 7 files changed, 11 insertions(+), 10 deletions(-) rename core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/{BoundsToGeometry.scala => ExtentToGeometry.scala} (91%) diff --git a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala index cc4708cc0..622d68f14 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala @@ -101,7 +101,7 @@ trait RasterFunctions { SetCellType(col, cellTypeName) /** Convert a bounding box structure to a Geometry type. Intented to support multiple schemas. */ - def bounds_geometry(bounds: Column): TypedColumn[Any, Geometry] = BoundsToGeometry(bounds) + def extent_geometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) /** Assign a `NoData` value to the Tiles. */ def with_no_data(col: Column, nodata: Double): TypedColumn[Any, Tile] = withAlias("with_no_data", col)( diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala index 52510d3ef..b2a44cdd6 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala @@ -65,7 +65,7 @@ package object expressions { registry.registerExpression[GetCellType]("rf_cell_type") registry.registerExpression[SetCellType]("rf_convert_cell_type") registry.registerExpression[GetDimensions]("rf_tile_dimensions") - registry.registerExpression[BoundsToGeometry]("rf_bounds_geometry") + registry.registerExpression[ExtentToGeometry]("rf_extent_geometry") registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala rename to core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala index b928e9971..422ba821f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/BoundsToGeometry.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala @@ -40,8 +40,8 @@ import org.locationtech.geomesa.spark.jts.encoders.SpatialEncoders * * @since 8/24/18 */ -case class BoundsToGeometry(child: Expression) extends UnaryExpression with CodegenFallback { - override def nodeName: String = "bounds_geometry" +case class ExtentToGeometry(child: Expression) extends UnaryExpression with CodegenFallback { + override def nodeName: String = "extent_geometry" override def dataType: DataType = JTSTypes.GeometryTypeInstance @@ -71,7 +71,7 @@ case class BoundsToGeometry(child: Expression) extends UnaryExpression with Code } } -object BoundsToGeometry extends SpatialEncoders { +object ExtentToGeometry extends SpatialEncoders { def apply(bounds: Column): TypedColumn[Any, Geometry] = - new Column(new BoundsToGeometry(bounds.expr)).as[Geometry] + new Column(new ExtentToGeometry(bounds.expr)).as[Geometry] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala index 16d3ba271..098c7ea3f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -101,7 +101,7 @@ object ZeroSevenCompatibilityKit { /** Convert a bounding box structure to a Geometry type. Intented to support multiple schemas. */ @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def boundsGeometry(bounds: Column): TypedColumn[Any, Geometry] = BoundsToGeometry(bounds) + def boundsGeometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) /** Assign a `NoData` value to the Tiles. */ @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") @@ -331,7 +331,7 @@ object ZeroSevenCompatibilityKit { registry.registerFunc("rf_cellType", ub(GetCellType.apply)) registry.registerFunc("rf_convertCellType", bb(SetCellType.apply)) registry.registerFunc("rf_tileDimensions", ub(GetDimensions.apply)) - registry.registerFunc("rf_boundsGeometry", ub(BoundsToGeometry.apply)) + registry.registerFunc("rf_boundsGeometry", ub(ExtentToGeometry.apply)) registry.registerFunc("rf_localAdd", bb(Add.apply)) registry.registerFunc("rf_localSubtract", bb(Subtract.apply)) registry.registerFunc("rf_localMultiply", bb(Multiply.apply)) diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index a448ffa60..9fff73799 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -21,7 +21,7 @@ * _Breaking_: `TileDimensions` moved from `astraea.spark.rasterframes` to `astraea.spark.rasterframes.model`. * _Breaking_: Renamed `RasterFrame.withBounds` to `RasterFrame.withGeometry` for consistency with DataSource schemas. * Added `RasterFrame.withExtent` extension method. -* Added `st_extent` and deprecated `envelope`. +* Added `st_extent` and deprecated `envelope`. Renamed `bounds_geometry` to `extent_geometry`. ## 0.7.x diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala index 0672a52d9..23075dc86 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -88,7 +88,7 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[F .format(L8CatalogDataSource.SHORT_NAME) .load() .withColumnRenamed(PDSFields.ACQUISITION_DATE.name, PDSFields.TIMESTAMP.name) - .withColumn(PDSFields.BOUNDS.name, bounds_geometry(col(PDSFields.BOUNDS_WGS84.name))) + .withColumn(PDSFields.BOUNDS.name, extent_geometry(col(PDSFields.BOUNDS_WGS84.name))) .drop(PDSFields.BOUNDS_WGS84.name) val filtered = aggFilters diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 7c015b8d9..ddc8c19f0 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -246,6 +246,7 @@ def _(data_tile, mask_tile, mask_value): 'expm1': 'Performs cell-wise exponential, then subtract one', 'resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', 'st_extent': 'Compute the extent/bbox of a Geometry', + 'extent_geometry': 'Convert the given extent/bbox to a polygon', # ------- JTS functions ------- # spatial constructors From 8ef4c7288d3c049390521eb2de7e4758c9c4cc22 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 8 Apr 2019 15:31:44 -0400 Subject: [PATCH 036/380] Initial skeleton of RasterSourceRelation. --- .../spark/rasterframes/StandardColumns.scala | 3 + .../expressions/TileAssembler.scala | 4 +- .../aggstats/CellStatsAggregate.scala | 4 +- .../aggstats/HistogramAggregate.scala | 3 +- .../aggstats/LocalCountAggregate.scala | 4 +- .../aggstats/LocalMeanAggregate.scala | 3 +- .../aggstats/LocalStatsAggregate.scala | 3 +- .../aggstats/LocalTileOpAggregate.scala | 4 +- .../transformers/RasterSourceToTiles.scala | 3 +- .../astraea/spark/rasterframes/package.scala | 4 + .../tiles/ProjectedRasterTile.scala | 2 +- .../astraea/spark/rasterframes/TestData.scala | 3 + .../spark/rasterframes/TileUDTSpec.scala | 1 - ...pache.spark.sql.sources.DataSourceRegister | 5 +- .../geotiff/GeoTiffCollectionRelation.scala | 11 --- ...ltSource.scala => GeoTiffDataSource.scala} | 14 ++-- .../datasource/geotiff/package.scala | 4 +- ....scala => GeoTrellisLayerDataSource.scala} | 6 +- .../datasource/geotrellis/package.scala | 2 +- .../rastersource/RasterSourceDataSource.scala | 58 +++++++++++++ .../rastersource/RasterSourceRelation.scala | 67 +++++++++++++++ .../datasource/rastersource/package.scala | 55 +++++++++++++ .../geotiff/GeoTiffDataSourceSpec.scala | 4 - .../RasterSourceDataSourceSpec.scala | 82 +++++++++++++++++++ .../datasource/ReadTilesExpression.scala | 3 +- 25 files changed, 298 insertions(+), 54 deletions(-) rename datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/{DefaultSource.scala => GeoTiffDataSource.scala} (90%) rename datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/{DefaultSource.scala => GeoTrellisLayerDataSource.scala} (96%) create mode 100644 datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala create mode 100644 datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala create mode 100644 datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala create mode 100644 datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala diff --git a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala index 50a516753..dd488ce6f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala @@ -57,6 +57,9 @@ trait StandardColumns { /** Default teil column index column for the cells of exploded tiles. */ val ROW_INDEX_COLUMN = col("row_index").as[Int] + + /** URI/URL/S3 path to raster. */ + val PATH_COLUMN = col("path").as[String] } object StandardColumns extends StandardColumns diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala index df633fe2c..1f4ef5b0e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala @@ -29,10 +29,10 @@ import geotrellis.raster.{DataType => _, _} import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.aggregate.{ImperativeAggregate, TypedImperativeAggregate} import org.apache.spark.sql.catalyst.expressions.{Expression, ImplicitCastInputTypes} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} import spire.syntax.cfor._ +import astraea.spark.rasterframes.TileType /** * Aggregator for reassembling tiles from from exploded form @@ -53,8 +53,6 @@ case class TileAssembler( override def inputTypes = Seq(ShortType, ShortType, DoubleType, ShortType, ShortType) - private val TileType = new TileUDT() - override def prettyName: String = "assemble_tiles" override def withNewMutableAggBufferOffset(newMutableAggBufferOffset: Int): ImperativeAggregate = diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala index cfcde38a5..86e2822b2 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala @@ -23,12 +23,12 @@ package astraea.spark.rasterframes.expressions.aggstats import astraea.spark.rasterframes.expressions.accessors.ExtractTile import astraea.spark.rasterframes.stats.CellStatistics +import astraea.spark.rasterframes.TileType import geotrellis.raster.{Tile, _} import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, AggregateFunction, AggregateMode, Complete} import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{DataType, _} import org.apache.spark.sql.{Column, Row, TypedColumn} @@ -40,8 +40,6 @@ import org.apache.spark.sql.{Column, Row, TypedColumn} case class CellStatsAggregate() extends UserDefinedAggregateFunction { import CellStatsAggregate.C // TODO: rewrite as a DeclarativeAggregate - private val TileType = new TileUDT() - override def inputSchema: StructType = StructType(StructField("value", TileType) :: Nil) override def dataType: DataType = StructType(Seq( diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala index 7920415da..8e74a8eae 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala @@ -33,9 +33,9 @@ import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, TypedColumn} +import astraea.spark.rasterframes.TileType /** * Histogram aggregation function for a full column of tiles. @@ -45,7 +45,6 @@ import org.apache.spark.sql.{Column, Row, TypedColumn} case class HistogramAggregate(numBuckets: Int) extends UserDefinedAggregateFunction { def this() = this(StreamingHistogram.DEFAULT_NUM_BUCKETS) // TODO: rewrite as TypedAggregateExpression or similar. - private val TileType = new TileUDT() override def inputSchema: StructType = StructType(StructField("value", TileType) :: Nil) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala index f427d9ee3..332895b5f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala @@ -29,9 +29,9 @@ import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, Row, TypedColumn} +import astraea.spark.rasterframes.TileType /** * Catalyst aggregate function that counts `NoData` values in a cell-wise fashion. @@ -47,8 +47,6 @@ class LocalCountAggregate(isData: Boolean) extends UserDefinedAggregateFunction private val add = safeBinaryOp(Add.apply(_: Tile, _: Tile)) - private val TileType = new TileUDT() - override def dataType: DataType = TileType override def inputSchema: StructType = StructType(Seq( diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala index bab1eba20..be0722e32 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala @@ -27,16 +27,15 @@ import astraea.spark.rasterframes.expressions.transformers.SetCellType import geotrellis.raster.Tile import geotrellis.raster.mapalgebra.local import org.apache.spark.sql.catalyst.expressions.{AttributeReference, Expression, ExpressionDescription, If, IsNull, Literal} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import astraea.spark.rasterframes.TileType @ExpressionDescription( usage = "_FUNC_(tile) - Computes a new tile contining the mean cell values across all tiles in column.", note = "All tiles in the column must be the same size." ) case class LocalMeanAggregate(child: Expression) extends UnaryRasterAggregate { - private val TileType = new TileUDT() override def dataType: DataType = TileType override def nodeName: String = "agg_local_mean" diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala index 8df684a25..c5bdb47e0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala @@ -34,6 +34,7 @@ import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAg import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, TypedColumn} +import astraea.spark.rasterframes.TileType /** @@ -44,8 +45,6 @@ import org.apache.spark.sql.{Column, Row, TypedColumn} class LocalStatsAggregate() extends UserDefinedAggregateFunction { import LocalStatsAggregate.C - private val TileType = new TileUDT() - override def inputSchema: StructType = StructType(Seq( StructField("value", TileType, true) )) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala index d3247e964..a6a2de5a0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala @@ -21,6 +21,7 @@ package astraea.spark.rasterframes.expressions.aggstats +import astraea.spark.rasterframes.TileType import astraea.spark.rasterframes.expressions.accessors.ExtractTile import astraea.spark.rasterframes.functions.safeBinaryOp import astraea.spark.rasterframes.util.DataBiasedOp.{BiasedMax, BiasedMin} @@ -30,7 +31,6 @@ import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, TypedColumn} @@ -43,8 +43,6 @@ class LocalTileOpAggregate(op: LocalTileBinaryOp) extends UserDefinedAggregateFu private val safeOp = safeBinaryOp(op.apply(_: Tile, _: Tile)) - private val TileType = new TileUDT() - override def inputSchema: StructType = StructType(Seq( StructField("value", TileType, true) )) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala index 64b1c9f6e..75aa0942f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala @@ -32,6 +32,7 @@ import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StructField, StructType} import scala.util.control.NonFatal +import astraea.spark.rasterframes.TileType /** * Accepts RasterRef and generates one or more RasterRef instances representing the @@ -43,8 +44,6 @@ case class RasterSourceToTiles(children: Seq[Expression], applyTiling: Boolean) with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { private val RasterSourceType = new RasterSourceUDT() - private val TileType = new TileUDT() - override def inputTypes: Seq[DataType] = Seq.fill(children.size)(RasterSourceType) override def nodeName: String = "raster_source_to_tile" diff --git a/core/src/main/scala/astraea/spark/rasterframes/package.scala b/core/src/main/scala/astraea/spark/rasterframes/package.scala index dafba71be..34ae94624 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/package.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/package.scala @@ -25,6 +25,7 @@ import geotrellis.raster.{Tile, TileFeature} import geotrellis.spark.{ContextRDD, Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.rdd.RDD import org.apache.spark.sql._ +import org.apache.spark.sql.rf.TileUDT import org.locationtech.geomesa.spark.jts.DataFrameFunctions import shapeless.tag.@@ @@ -84,6 +85,9 @@ package object rasterframes extends StandardColumns rasterframes.rules.register(sqlContext) } + /** TileUDT type reference. */ + def TileType = new TileUDT() + /** * A RasterFrame is just a DataFrame with certain invariants, enforced via the methods that create and transform them: * 1. One column is a [[geotrellis.spark.SpatialKey]] or [[geotrellis.spark.SpaceTimeKey]] diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala index 539f46fd2..34003fb31 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala @@ -33,6 +33,7 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{StructField, StructType} +import astraea.spark.rasterframes.TileType /** * A Tile that's also like a ProjectedRaster, with delayed evaluation support. @@ -62,7 +63,6 @@ object ProjectedRasterTile { } implicit val serializer: CatalystSerializer[ProjectedRasterTile] = new CatalystSerializer[ProjectedRasterTile] { - val TileType = new TileUDT() override def schema: StructType = StructType(Seq( StructField("tile_context", CatalystSerializer[TileContext].schema, false), StructField("tile", TileType, false)) diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala index 8a208c374..c5097b53b 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TestData.scala @@ -130,6 +130,9 @@ trait TestData { lazy val remoteMODIS: URI = URI.create("https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") lazy val remoteL8: URI = URI.create("https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/017/033/LC08_L1TP_017033_20181010_20181030_01_T1/LC08_L1TP_017033_20181010_20181030_01_T1_B4.TIF") lazy val localSentinel: URL = getClass.getResource("/B01.jp2") + lazy val cogPath: URI = getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI + lazy val nonCogPath: URI = getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI + lazy val l8samplePath: URI = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI object JTS { val fact = new GeometryFactory() diff --git a/core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala index b83b94486..548aaf192 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala @@ -38,7 +38,6 @@ class TileUDTSpec extends TestEnvironment with TestData with Inspectors { spark.version val tileEncoder: ExpressionEncoder[Tile] = ExpressionEncoder() - val TileType = new TileUDT() implicit val ser = TileUDT.tileSerializer describe("TileUDT") { diff --git a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index 26a271f13..051aad71c 100644 --- a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -1,3 +1,4 @@ -astraea.spark.rasterframes.datasource.geotiff.DefaultSource -astraea.spark.rasterframes.datasource.geotrellis.DefaultSource +astraea.spark.rasterframes.datasource.geotiff.GeoTiffDataSource +astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisCatalog +astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index c23ed579d..76868d055 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -36,20 +36,12 @@ import org.apache.spark.sql.sources.{BaseRelation, PrunedScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{Row, SQLContext} -/** - * - * - * @since 7/31/18 - */ case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount: Int) extends BaseRelation with PrunedScan { override def schema: StructType = StructType(Seq( StructField(Cols.PATH, StringType, false), StructField(EXTENT_COLUMN.columnName, CatalystSerializer[Extent].schema, nullable = true), StructField(CRS_COLUMN.columnName, CatalystSerializer[CRS].schema, false) -// StructField(METADATA_COLUMN.columnName, -// DataTypes.createMapType(StringType, StringType, false) -// ) ) ++ ( if(bandCount == 1) Seq(StructField(Cols.TL, new TileUDT, false)) else for(b ← 1 to bandCount) yield StructField(Cols.TL + "_" + b, new TileUDT, nullable = true) @@ -62,8 +54,6 @@ case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount val columnIndexes = requiredColumns.map(schema.fieldIndex) - - HadoopGeoTiffRDD.multiband(new Path(uri.toASCIIString), keyer, HadoopGeoTiffRDD.Options.DEFAULT) .map { case ((path, pe), mbt) ⇒ val entries = columnIndexes.map { @@ -77,7 +67,6 @@ case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount } Row(entries: _*) } - } } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/DefaultSource.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSource.scala similarity index 90% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/DefaultSource.scala rename to datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 74acbbc98..ae6477adc 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/DefaultSource.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -34,10 +34,10 @@ import _root_.geotrellis.raster.io.geotiff.tags.codes.ColorSpace * Spark SQL data source over GeoTIFF files. * @since 1/14/18 */ -class DefaultSource extends DataSourceRegister +class GeoTiffDataSource extends DataSourceRegister with RelationProvider with CreatableRelationProvider with DataSourceOptions with LazyLogging { - def shortName() = DefaultSource.SHORT_NAME + def shortName() = GeoTiffDataSource.SHORT_NAME def path(parameters: Map[String, String]) = uriParam(PATH_PARAM, parameters) @@ -50,7 +50,7 @@ class DefaultSource extends DataSourceRegister val p = pathO.get if(p.getPath.contains("*")) { - val bandCount = parameters.get(DefaultSource.BAND_COUNT_PARAM).map(_.toInt).getOrElse(1) + val bandCount = parameters.get(GeoTiffDataSource.BAND_COUNT_PARAM).map(_.toInt).getOrElse(1) GeoTiffCollectionRelation(sqlContext, p, bandCount) } else GeoTiffRelation(sqlContext, p) @@ -90,8 +90,8 @@ class DefaultSource extends DataSourceRegister (c, r) } - val cols = numParam(DefaultSource.IMAGE_WIDTH_PARAM, parameters).getOrElse(fullResCols) - val rows = numParam(DefaultSource.IMAGE_HEIGHT_PARAM, parameters).getOrElse(fullResRows) + val cols = numParam(GeoTiffDataSource.IMAGE_WIDTH_PARAM, parameters).getOrElse(fullResCols) + val rows = numParam(GeoTiffDataSource.IMAGE_HEIGHT_PARAM, parameters).getOrElse(fullResRows) require(cols <= Int.MaxValue && rows <= Int.MaxValue, s"Can't construct a GeoTIFF of size $cols x $rows. (Too big!)") @@ -108,7 +108,7 @@ class DefaultSource extends DataSourceRegister case _ ⇒ ColorSpace.BlackIsZero } - val compress = parameters.get(DefaultSource.COMPRESS_PARAM).map(_.toBoolean).getOrElse(false) + val compress = parameters.get(GeoTiffDataSource.COMPRESS_PARAM).map(_.toBoolean).getOrElse(false) val options = GeoTiffOptions(Tiled, if (compress) DeflateCompression else NoCompression, colorSpace) val tags = Tags( RFBuildInfo.toMap.filter(_._1.startsWith("rf")).mapValues(_.toString), @@ -122,7 +122,7 @@ class DefaultSource extends DataSourceRegister } } -object DefaultSource { +object GeoTiffDataSource { final val SHORT_NAME = "geotiff" final val PATH_PARAM = "path" final val IMAGE_WIDTH_PARAM = "imageWidth" diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala index 6e607c3b4..ab5a0073b 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala @@ -40,11 +40,11 @@ package object geotiff { /** Adds `geotiff` format specifier to `DataFrameReader`. */ implicit class DataFrameReaderHasGeoTiffFormat(val reader: DataFrameReader) { def geotiff: GeoTiffRasterFrameReader = - tag[GeoTiffRasterFrameReaderTag][DataFrameReader](reader.format(DefaultSource.SHORT_NAME)) + tag[GeoTiffRasterFrameReaderTag][DataFrameReader](reader.format(GeoTiffDataSource.SHORT_NAME)) } implicit class DataFrameWriterHasGeoTiffFormat[T](val writer: DataFrameWriter[T]) { - def geotiff: DataFrameWriter[T] = writer.format(DefaultSource.SHORT_NAME) + def geotiff: DataFrameWriter[T] = writer.format(GeoTiffDataSource.SHORT_NAME) } /** Adds `loadRF` to appropriately tagged `DataFrameReader` */ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/DefaultSource.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala similarity index 96% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/DefaultSource.scala rename to datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala index 63e88e25a..d26cc8e41 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/DefaultSource.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala @@ -37,9 +37,9 @@ import scala.util.Try * DataSource over a GeoTrellis layer store. */ @Experimental -class DefaultSource extends DataSourceRegister +class GeoTrellisLayerDataSource extends DataSourceRegister with RelationProvider with CreatableRelationProvider with DataSourceOptions { - def shortName(): String = DefaultSource.SHORT_NAME + def shortName(): String = GeoTrellisLayerDataSource.SHORT_NAME /** * Create a GeoTrellis data source. @@ -110,6 +110,6 @@ class DefaultSource extends DataSourceRegister } } -object DefaultSource { +object GeoTrellisLayerDataSource { final val SHORT_NAME = "geotrellis" } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala index 5f3304d05..15e54ff44 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.datasource import java.net.URI import _root_.geotrellis.spark.LayerId -import astraea.spark.rasterframes.datasource.geotrellis.DefaultSource._ +import astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource._ import astraea.spark.rasterframes.{RasterFrame, _} import org.apache.spark.sql._ import org.apache.spark.sql.functions.col diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala new file mode 100644 index 000000000..e942ac100 --- /dev/null +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -0,0 +1,58 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package astraea.spark.rasterframes.datasource.rastersource +import org.apache.spark.sql.SQLContext +import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} + +class RasterSourceDataSource extends DataSourceRegister with RelationProvider { + override def shortName(): String = RasterSourceDataSource.SHORT_NAME + override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { + val bandCount = parameters + .get(RasterSourceDataSource.BAND_COUNT_PARAM) + .map(_.toInt) + .getOrElse(1) + + val files = RasterSourceDataSource.filePaths(parameters) + + RasterSourceRelation(sqlContext, files, bandCount) + } +} +object RasterSourceDataSource { + final val SHORT_NAME = "rastersource" + final val PATH_PARAM = "path" + final val PATHS_PARAM = "paths" + final val BAND_COUNT_PARAM = "bandCount" + + private[rastersource] + def filePaths(parameters: Map[String, String]): Seq[String] = + ( + parameters + .get(RasterSourceDataSource.PATHS_PARAM) + .toSeq + .flatMap(_.split(Array('\n','\r'))) ++ + parameters + .get(RasterSourceDataSource.PATH_PARAM) + .toSeq + ) + .filter(_.nonEmpty) + +} diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala new file mode 100644 index 000000000..384685554 --- /dev/null +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -0,0 +1,67 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package astraea.spark.rasterframes.datasource.rastersource + +import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.encoders.CatalystSerializer +import astraea.spark.rasterframes.expressions.accessors.{GetCRS, GetExtent} +import astraea.spark.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} +import astraea.spark.rasterframes.util._ +import geotrellis.proj4.CRS +import geotrellis.vector.Extent +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.sources.{BaseRelation, TableScan} +import org.apache.spark.sql.types.{StringType, StructField, StructType} +import org.apache.spark.sql.{Row, SQLContext} + +case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], bandCount: Int) extends BaseRelation with TableScan { + override def schema: StructType = if (bandCount == 1) RasterSourceRelation.schema + else { + val fields = RasterSourceRelation.schema.fields + StructType( + fields.dropRight(1) ++ { + val base = fields.last + for (b <- 1 to bandCount) yield base.copy(name = base.name + "_" + b) + } + ) + } + override def buildScan(): RDD[Row] = { + import sqlContext.implicits._ + paths.toDF("path") + .withColumn("__rr", RasterSourceToRasterRefs(URIToRasterSource($"path"))) + .select( + PATH_COLUMN, + GetExtent($"__rr") as EXTENT_COLUMN.columnName, + GetCRS($"__rr") as CRS_COLUMN.columnName, + RasterRefToTile($"__rr") as TILE_COLUMN.columnName + ) + .rdd + } +} +object RasterSourceRelation { + def schema: StructType = StructType(Seq( + StructField(PATH_COLUMN.columnName, StringType, false), + StructField(EXTENT_COLUMN.columnName, CatalystSerializer[Extent].schema, nullable = true), + StructField(CRS_COLUMN.columnName, CatalystSerializer[CRS].schema, false), + StructField(TILE_COLUMN.columnName, TileType, true) + )) +} diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala new file mode 100644 index 000000000..ccb556c42 --- /dev/null +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala @@ -0,0 +1,55 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package astraea.spark.rasterframes.datasource +import java.net.URI + +import org.apache.spark.sql.DataFrameReader +import shapeless.tag +import shapeless.tag.@@ +package object rastersource { + + trait RasterSourceDataFrameReaderTag + type RasterSourceDataFrameReader = DataFrameReader @@ RasterSourceDataFrameReaderTag + + /** Adds `rastersource` format specifier to `DataFrameReader`. */ + implicit class DataFrameReaderHasRasterSourceFormat(val reader: DataFrameReader) { + def rastersource: RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.format(RasterSourceDataSource.SHORT_NAME)) + } + + /** Adds option methods relevant to RasterSourceDataSource. */ + implicit class RasterSourceDataFrameReaderHasOptions(val reader: RasterSourceDataFrameReader) { + /** Set the number of bands to provide columns for. */ + def withBandCount(bandCount: Int): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.option(RasterSourceDataSource.BAND_COUNT_PARAM, bandCount)) + + def from(paths: Seq[String]): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.option(RasterSourceDataSource.PATHS_PARAM, paths.mkString("\n")) + ) + + def from(uris: Seq[URI])(implicit d: DummyImplicit): RasterSourceDataFrameReader = + from(uris.map(_.toASCIIString)) + } +} diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 3bdeecd81..54ee09412 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -29,10 +29,6 @@ import org.apache.spark.sql.functions._ class GeoTiffDataSourceSpec extends TestEnvironment with TestData { - val cogPath = getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI - val nonCogPath = getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI - val l8samplePath = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI - describe("GeoTiff reading") { it("should read sample GeoTiff") { diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala new file mode 100644 index 000000000..cc7570680 --- /dev/null +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -0,0 +1,82 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package astraea.spark.rasterframes.datasource.rastersource +import astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource.{PATHS_PARAM, PATH_PARAM} +import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.util._ + +class RasterSourceDataSourceSpec extends TestEnvironment with TestData { + describe("DataSource parameter processing") { + it("should handle single `path`") { + val p = Map(PATH_PARAM -> "/usr/local/foo/bar.tif") + RasterSourceDataSource.filePaths(p) should be (p.values.toSeq) + } + it("should handle single `paths`") { + val p = Map(PATHS_PARAM -> "/usr/local/foo/bar.tif") + RasterSourceDataSource.filePaths(p) should be (p.values.toSeq) + } + it("should handle multiple `paths`") { + val expected = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") + val p = Map(PATHS_PARAM -> expected.mkString("\n\r", "\n\n", "\r")) + RasterSourceDataSource.filePaths(p) should be (expected) + } + it("should handle both `path` and `paths`") { + val expected1 = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") + val expected2 = "/usr/local/barf/baz.tif" + val p = Map(PATHS_PARAM -> expected1.mkString("\n"), PATH_PARAM -> expected2) + RasterSourceDataSource.filePaths(p) should be (expected1 :+ expected2) + } + } + + describe("RasterSource as relation reading") { + it("should default to a single band schema") { + val df = spark.read.rastersource.load(l8samplePath.toASCIIString) + val tcols = df.tileColumns + tcols.length should be(1) + tcols.map(_.columnName) should contain("tile") + } + it("should support a multiband schema") { + val df = spark.read + .rastersource + .withBandCount(3) + .load(cogPath.toASCIIString) + val tcols = df.tileColumns + tcols.length should be(3) + tcols.map(_.columnName) should contain allElementsOf Seq("tile_1", "tile_2", "tile_3") + } + it("should read a single file") { + val df = spark.read.rastersource.load(l8samplePath.toASCIIString) + df.printSchema() + df.show(false) + fail() + } + it("should read a multiple files with one band") { + val df = spark.read.rastersource + .from(Seq(cogPath, l8samplePath, nonCogPath)) + .load() + df.printSchema() + df.show(false) + fail() + } + + } +} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala index ac13e4b20..b5b5fdf5e 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -42,6 +42,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, Generator, Literal} import org.apache.spark.sql.rf._ import org.apache.spark.sql.types._ +import astraea.spark.rasterframes.TileType /** * Catalyst generator to convert a geotiff download URL into a series of rows containing the internal @@ -52,8 +53,6 @@ import org.apache.spark.sql.types._ case class ReadTilesExpression(children: Seq[Expression]) extends Expression with Generator with CodegenFallback with DownloadSupport with LazyLogging { - private val TileType = new TileUDT() - override def nodeName: String = "download_tiles" def inputTypes = Seq.fill(children.length)(StringType) From 598f74ee0e47aaede35adabb5ce32bc17ace5516 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 10 Apr 2019 16:29:38 -0400 Subject: [PATCH 037/380] Created a less verbose way of getting a schema from an implicit CatalystSerializer. --- .../encoders/CatalystSerializer.scala | 2 ++ .../encoders/CellTypeEncoder.scala | 4 +-- .../encoders/EnvelopeEncoder.scala | 4 +-- .../encoders/StandardSerializers.scala | 26 +++++++++---------- .../expressions/DynamicExtractors.scala | 15 ++++++----- .../expressions/SpatialRelation.scala | 3 +-- .../expressions/accessors/GetCRS.scala | 3 +-- .../expressions/accessors/GetCellType.scala | 3 +-- .../expressions/accessors/GetDimensions.scala | 6 ++--- .../expressions/accessors/GetExtent.scala | 3 +-- .../accessors/GetTileContext.scala | 3 +-- .../transformers/ExtentToGeometry.scala | 5 ++-- .../transformers/GeometryToExtent.scala | 5 ++-- .../RasterSourceToRasterRefs.scala | 23 ++++++++-------- .../transformers/SetCellType.scala | 3 +-- .../rasterframes/model/CellContext.scala | 5 ++-- .../spark/rasterframes/model/Cells.scala | 3 ++- .../rasterframes/model/TileContext.scala | 5 ++-- .../rasterframes/model/TileDataContext.scala | 4 +-- .../spark/rasterframes/ref/RasterRef.scala | 3 ++- .../tiles/ProjectedRasterTile.scala | 6 ++--- .../apache/spark/sql/rf/RasterSourceUDT.scala | 2 +- .../org/apache/spark/sql/rf/TileUDT.scala | 6 ++--- .../astraea/spark/rasterframes/JTSSpec.scala | 1 - .../geotiff/GeoTiffCollectionRelation.scala | 10 +++---- .../datasource/geotiff/GeoTiffRelation.scala | 14 +++++----- .../datasource/ReadTilesExpression.scala | 10 +++---- .../datasource/awspds/L8Relation.scala | 8 +++--- 28 files changed, 90 insertions(+), 95 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala index 3f09e1f38..39e933cfc 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala @@ -50,6 +50,8 @@ trait CatalystSerializer[T] extends Serializable { object CatalystSerializer extends StandardSerializers { def apply[T: CatalystSerializer]: CatalystSerializer[T] = implicitly + def schemaOf[T: CatalystSerializer]: StructType = apply[T].schema + /** * For some reason `Row` and `InternalRow` share no common base type. Instead of using * structural types (which use reflection), this typeclass is used to normalize access diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala index 953c2ed65..41d9a6ec5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala @@ -26,7 +26,7 @@ import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.VersionShims.InvokeSafely import org.apache.spark.sql.types.{ObjectType, StringType} import org.apache.spark.unsafe.types.UTF8String - +import CatalystSerializer._ import scala.reflect.classTag /** @@ -41,7 +41,7 @@ object CellTypeEncoder { import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.objects._ val ctType = ScalaReflection.dataTypeFor[DataType] - val schema = CatalystSerializer[CellType].schema + val schema = schemaOf[CellType] val inputObject = BoundReference(0, ctType, nullable = false) val intermediateType = ObjectType(classOf[String]) diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala index e8f168db5..9cc947e49 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala @@ -8,7 +8,7 @@ import org.apache.spark.sql.catalyst.expressions.objects.NewInstance import org.apache.spark.sql.catalyst.expressions.{BoundReference, CreateNamedStruct, Literal} import org.apache.spark.sql.rf.VersionShims.InvokeSafely import org.apache.spark.sql.types._ - +import CatalystSerializer._ import scala.reflect.classTag /** @@ -18,7 +18,7 @@ import scala.reflect.classTag */ object EnvelopeEncoder { - val schema = CatalystSerializer[Envelope].schema + val schema = schemaOf[Envelope] val dataType: DataType = ScalaReflection.dataTypeFor[Envelope] diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala index 2d7aee8ad..a35e14c9e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala @@ -20,15 +20,15 @@ */ package astraea.spark.rasterframes.encoders -import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.model.LazyCRS -import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.spark._ import geotrellis.spark.tiling.LayoutDefinition import geotrellis.vector._ import org.apache.spark.sql.types._ +import org.locationtech.jts.geom.Envelope /** Collection of CatalystSerializers for third-party types. */ trait StandardSerializers { @@ -93,8 +93,8 @@ trait StandardSerializers { implicit val projectedExtentSerializer: CatalystSerializer[ProjectedExtent] = new CatalystSerializer[ProjectedExtent] { override def schema: StructType = StructType(Seq( - StructField("extent", CatalystSerializer[Extent].schema, false), - StructField("crs", CatalystSerializer[CRS].schema, false) + StructField("extent", schemaOf[Extent], false), + StructField("crs", schemaOf[CRS], false) )) override protected def to[R](t: ProjectedExtent, io: CatalystSerializer.CatalystIO[R]): R = io.create( @@ -187,8 +187,8 @@ trait StandardSerializers { implicit val layoutDefinitionSerializer = new CatalystSerializer[LayoutDefinition] { override def schema: StructType = StructType(Seq( - StructField("extent", CatalystSerializer[Extent].schema, true), - StructField("tileLayout", CatalystSerializer[TileLayout].schema, true) + StructField("extent", schemaOf[Extent], true), + StructField("tileLayout", schemaOf[TileLayout], true) )) override protected def to[R](t: LayoutDefinition, io: CatalystIO[R]): R = io.create( @@ -204,8 +204,8 @@ trait StandardSerializers { implicit def boundsSerializer[T: CatalystSerializer]: CatalystSerializer[KeyBounds[T]] = new CatalystSerializer[KeyBounds[T]] { override def schema: StructType = StructType(Seq( - StructField("minKey", CatalystSerializer[T].schema, true), - StructField("maxKey", CatalystSerializer[T].schema, true) + StructField("minKey", schemaOf[T], true), + StructField("maxKey", schemaOf[T], true) )) override protected def to[R](t: KeyBounds[T], io: CatalystIO[R]): R = io.create( @@ -221,11 +221,11 @@ trait StandardSerializers { def tileLayerMetadataSerializer[T: CatalystSerializer]: CatalystSerializer[TileLayerMetadata[T]] = new CatalystSerializer[TileLayerMetadata[T]] { override def schema: StructType = StructType(Seq( - StructField("cellType", CatalystSerializer[CellType].schema, false), - StructField("layout", CatalystSerializer[LayoutDefinition].schema, false), - StructField("extent", CatalystSerializer[Extent].schema, false), - StructField("crs", CatalystSerializer[CRS].schema, false), - StructField("bounds", CatalystSerializer[KeyBounds[T]].schema, false) + StructField("cellType", schemaOf[CellType], false), + StructField("layout", schemaOf[LayoutDefinition], false), + StructField("extent", schemaOf[Extent], false), + StructField("crs", schemaOf[CRS], false), + StructField("bounds", schemaOf[KeyBounds[T]], false) )) override protected def to[R](t: TileLayerMetadata[T], io: CatalystIO[R]): R = io.create( diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala index b551df4c5..f8a41054c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala @@ -20,7 +20,6 @@ */ package astraea.spark.rasterframes.expressions -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.model.TileContext import astraea.spark.rasterframes.ref.{ProjectedRasterLike, RasterRef, RasterSource} @@ -31,14 +30,14 @@ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.rf.{TileUDT, _} import org.apache.spark.sql.types._ -private[expressions] +private[rasterframes] object DynamicExtractors { /** Partial function for pulling a tile and its contesxt from an input row. */ lazy val tileExtractor: PartialFunction[DataType, InternalRow => (Tile, Option[TileContext])] = { case _: TileUDT => (row: InternalRow) => (row.to[Tile](TileUDT.tileSerializer), None) - case t if t.conformsTo(CatalystSerializer[ProjectedRasterTile].schema) => + case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => (row: InternalRow) => { val prt = row.to[ProjectedRasterTile] (prt, Some(TileContext(prt))) @@ -48,7 +47,7 @@ object DynamicExtractors { lazy val rowTileExtractor: PartialFunction[DataType, Row => (Tile, Option[TileContext])] = { case _: TileUDT => (row: Row) => (row.to[Tile](TileUDT.tileSerializer), None) - case t if t.conformsTo(CatalystSerializer[ProjectedRasterTile].schema) => + case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => (row: Row) => { val prt = row.to[ProjectedRasterTile] (prt, Some(TileContext(prt))) @@ -59,9 +58,9 @@ object DynamicExtractors { lazy val projectedRasterLikeExtractor: PartialFunction[DataType, InternalRow ⇒ ProjectedRasterLike] = { case _: RasterSourceUDT ⇒ (row: InternalRow) ⇒ row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) - case t if t.conformsTo(CatalystSerializer[ProjectedRasterTile].schema) => + case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => (row: InternalRow) => row.to[ProjectedRasterTile] - case t if t.conformsTo(CatalystSerializer[RasterRef].schema) => + case t if t.conformsTo(schemaOf[RasterRef]) => (row: InternalRow) ⇒ row.to[RasterRef] } @@ -71,8 +70,10 @@ object DynamicExtractors { (row: InternalRow) ⇒ row.to[Tile](TileUDT.tileSerializer) case _: RasterSourceUDT ⇒ (row: InternalRow) ⇒ row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) - case t if t.conformsTo(CatalystSerializer[RasterRef].schema) ⇒ + case t if t.conformsTo(schemaOf[RasterRef]) ⇒ (row: InternalRow) ⇒ row.to[RasterRef] + case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => + (row: InternalRow) => row.to[ProjectedRasterTile] } sealed trait TileOrNumberArg diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala index 637fab10a..db40c8cab 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala @@ -19,7 +19,6 @@ package astraea.spark.rasterframes.expressions -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.SpatialRelation.RelationPredicate import geotrellis.vector.Extent @@ -47,7 +46,7 @@ abstract class SpatialRelation extends BinaryExpression case r: InternalRow ⇒ expr.dataType match { case udt: AbstractGeometryUDT[_] ⇒ udt.deserialize(r) - case dt if dt.conformsTo(CatalystSerializer[Extent].schema) => + case dt if dt.conformsTo(schemaOf[Extent]) => val extent = r.to[Extent] extent.jtsGeom } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala index 1a6d29df0..9f3e0bfff 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.encoders.StandardEncoders.crsEncoder import astraea.spark.rasterframes.expressions.OnTileContextExpression @@ -39,7 +38,7 @@ import org.apache.spark.sql.{Column, TypedColumn} * @since 9/9/18 */ case class GetCRS(child: Expression) extends OnTileContextExpression with CodegenFallback { - override def dataType: DataType = CatalystSerializer[CRS].schema + override def dataType: DataType = schemaOf[CRS] override def nodeName: String = "crs" override def eval(ctx: TileContext): InternalRow = ctx.crs.toInternalRow } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala index eeb521e4b..35f35e7ed 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.OnCellGridExpression import geotrellis.raster.{CellGrid, CellType} @@ -38,7 +37,7 @@ case class GetCellType(child: Expression) extends OnCellGridExpression with Code override def nodeName: String = "cell_type" - def dataType: DataType = CatalystSerializer[CellType].schema + def dataType: DataType = schemaOf[CellType] /** Implemented by subtypes to process incoming ProjectedRasterLike entity. */ override def eval(cg: CellGrid): Any = cg.cellType.toInternalRow } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala index 3589dbc1b..099e74834 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.OnCellGridExpression import astraea.spark.rasterframes.model.TileDimensions @@ -34,11 +33,10 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback * Extract a Tile's dimensions * @since 12/21/17 */ -case class GetDimensions(child: Expression) extends OnCellGridExpression - with CodegenFallback { +case class GetDimensions(child: Expression) extends OnCellGridExpression with CodegenFallback { override def nodeName: String = "tile_dimensions" - def dataType = CatalystSerializer[TileDimensions].schema + def dataType = schemaOf[TileDimensions] override def eval(grid: CellGrid): Any = TileDimensions(grid.cols, grid.rows).toInternalRow } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala index c3e664887..653cf06a8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.encoders.StandardEncoders.extentEncoder import astraea.spark.rasterframes.expressions.OnTileContextExpression @@ -39,7 +38,7 @@ import org.apache.spark.sql.{Column, TypedColumn} * @since 9/10/18 */ case class GetExtent(child: Expression) extends OnTileContextExpression with CodegenFallback { - override def dataType: DataType = CatalystSerializer[Extent].schema + override def dataType: DataType = schemaOf[Extent] override def nodeName: String = "extent" override def eval(ctx: TileContext): InternalRow = ctx.extent.toInternalRow } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala index 98b7eb401..d169a1b93 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala @@ -20,7 +20,6 @@ */ package astraea.spark.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.UnaryRasterOp import astraea.spark.rasterframes.model.TileContext @@ -31,7 +30,7 @@ import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} case class GetTileContext(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def dataType: DataType = CatalystSerializer[TileContext].schema + override def dataType: DataType = schemaOf[TileContext] override def nodeName: String = "get_tile_context" override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala index 422ba821f..d57d0c0fd 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.row import org.locationtech.jts.geom.{Envelope, Geometry} @@ -45,8 +44,8 @@ case class ExtentToGeometry(child: Expression) extends UnaryExpression with Code override def dataType: DataType = JTSTypes.GeometryTypeInstance - private val envSchema = CatalystSerializer[Envelope].schema - private val extSchema = CatalystSerializer[Extent].schema + private val envSchema = schemaOf[Envelope] + private val extSchema = schemaOf[Extent] override def checkInputDataTypes(): TypeCheckResult = { child.dataType match { diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala index 69cd3f7cb..be1f5296b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.analysis.TypeCheckResult @@ -40,7 +39,7 @@ import org.apache.spark.sql.{Column, TypedColumn} case class GeometryToExtent(child: Expression) extends UnaryExpression with CodegenFallback { override def nodeName: String = "geometry_bounds" - override def dataType: DataType = CatalystSerializer[Extent].schema + override def dataType: DataType = schemaOf[Extent] override def checkInputDataTypes(): TypeCheckResult = { child.dataType match { @@ -54,7 +53,7 @@ case class GeometryToExtent(child: Expression) extends UnaryExpression with Code override protected def nullSafeEval(input: Any): Any = { val geom = JTSTypes.GeometryTypeInstance.deserialize(input) val extent = Extent(geom.getEnvelopeInternal) - CatalystSerializer[Extent].toInternalRow(extent) + extent.toInternalRow } } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index fe8e2b5ee..8ef4f6cb4 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -21,9 +21,8 @@ package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.NOMINAL_TILE_DIMS -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ +import astraea.spark.rasterframes.model.TileDimensions import astraea.spark.rasterframes.ref.RasterRef import astraea.spark.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging @@ -42,11 +41,11 @@ import scala.util.control.NonFatal * * @since 9/6/18 */ -case class RasterSourceToRasterRefs(children: Seq[Expression], applyTiling: Boolean) extends Expression +case class RasterSourceToRasterRefs(children: Seq[Expression], subtileDims: Option[TileDimensions] = None) extends Expression with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { private val RasterSourceType = new RasterSourceUDT() - private val rasterRefSchema = CatalystSerializer[RasterRef].schema + private val rasterRefSchema = schemaOf[RasterRef] override def inputTypes: Seq[DataType] = Seq.fill(children.size)(RasterSourceType) override def nodeName: String = "raster_source_to_raster_ref" @@ -59,10 +58,12 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], applyTiling: Bool try { val refs = children.map { child ⇒ val src = RasterSourceType.deserialize(child.eval(input)) - if (applyTiling) src - .layoutExtents(NOMINAL_TILE_DIMS) - .map(e ⇒ RasterRef(src, Some(e))) - else Seq(RasterRef(src)) + subtileDims.map(dims => + src + .layoutExtents(dims) + .map(e ⇒ RasterRef(src, Some(e))) + ) + .getOrElse( Seq(RasterRef(src))) } refs.transpose.map(ts ⇒ InternalRow(ts.map(_.toInternalRow): _*)) } @@ -75,7 +76,7 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], applyTiling: Bool } object RasterSourceToRasterRefs { - def apply(rrs: Column*): TypedColumn[Any, RasterRef] = apply(true, rrs: _*) - def apply(applyTiling: Boolean, rrs: Column*): TypedColumn[Any, RasterRef] = - new Column(new RasterSourceToRasterRefs(rrs.map(_.expr), applyTiling)).as[RasterRef] + def apply(rrs: Column*): TypedColumn[Any, RasterRef] = apply(None, rrs: _*) + def apply(subtileDims: Option[TileDimensions], rrs: Column*): TypedColumn[Any, RasterRef] = + new Column(new RasterSourceToRasterRefs(rrs.map(_.expr), subtileDims)).as[RasterRef] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala index 96fcd4288..d335746eb 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala @@ -21,7 +21,6 @@ package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.encoders.StandardEncoders._ import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor @@ -50,7 +49,7 @@ case class SetCellType(tile: Expression, cellType: Expression) override def nodeName: String = "set_cell_type" override def dataType: DataType = left.dataType - private val ctSchema = CatalystSerializer[CellType].schema + private val ctSchema = schemaOf[CellType] override def checkInputDataTypes(): TypeCheckResult = { if (!tileExtractor.isDefinedAt(left.dataType)) diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala b/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala index cac2903dd..efc632c0b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala @@ -23,13 +23,14 @@ package astraea.spark.rasterframes.model import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{ShortType, StructField, StructType} +import CatalystSerializer._ case class CellContext(tile_context: TileContext, tile_data_context: TileDataContext, col_index: Short, row_index: Short) object CellContext { implicit val serializer: CatalystSerializer[CellContext] = new CatalystSerializer[CellContext] { override def schema: StructType = StructType(Seq( - StructField("tile_context", CatalystSerializer[TileContext].schema, false), - StructField("tile_data_context", CatalystSerializer[TileDataContext].schema, false), + StructField("tile_context", schemaOf[TileContext], false), + StructField("tile_data_context", schemaOf[TileDataContext], false), StructField("col_index", ShortType, false), StructField("row_index", ShortType, false) )) diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala b/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala index acf847e45..03500c483 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala @@ -26,6 +26,7 @@ import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile import geotrellis.raster.{ArrayTile, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{BinaryType, StructField, StructType} +import CatalystSerializer._ /** Represents the union of binary cell datas or a reference to the data.*/ case class Cells(data: Either[Array[Byte], RasterRef]) { @@ -53,7 +54,7 @@ object Cells { implicit def cellsSerializer: CatalystSerializer[Cells] = new CatalystSerializer[Cells] { override def schema: StructType = StructType(Seq( StructField("cells", BinaryType, true), - StructField("ref", CatalystSerializer[RasterRef].schema, true) + StructField("ref", schemaOf[RasterRef], true) )) override protected def to[R](t: Cells, io: CatalystSerializer.CatalystIO[R]): R = io.create( t.data.left.getOrElse(null), diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala b/core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala index f5d49524c..e6d6a5565 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala @@ -27,6 +27,7 @@ import geotrellis.raster.Tile import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{StructField, StructType} +import CatalystSerializer._ case class TileContext(extent: Extent, crs: CRS) { def toProjectRasterTile(t: Tile): ProjectedRasterTile = ProjectedRasterTile(t, extent, crs) @@ -39,8 +40,8 @@ object TileContext { } implicit val serializer: CatalystSerializer[TileContext] = new CatalystSerializer[TileContext] { override def schema: StructType = StructType(Seq( - StructField("extent", CatalystSerializer[Extent].schema, false), - StructField("crs", CatalystSerializer[CRS].schema, false) + StructField("extent", schemaOf[Extent], false), + StructField("crs", schemaOf[CRS], false) )) override protected def to[R](t: TileContext, io: CatalystSerializer.CatalystIO[R]): R = io.create( io.to(t.extent), diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala b/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala index 121f8b845..dcba073f6 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala @@ -41,8 +41,8 @@ object TileDataContext { implicit val serializer: CatalystSerializer[TileDataContext] = new CatalystSerializer[TileDataContext] { override def schema: StructType = StructType(Seq( - StructField("cell_type", CatalystSerializer[CellType].schema, false), - StructField("dimensions", CatalystSerializer[TileDimensions].schema, false) + StructField("cell_type", schemaOf[CellType], false), + StructField("dimensions", schemaOf[TileDimensions], false) )) override protected def to[R](t: TileDataContext, io: CatalystIO[R]): R = io.create( diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala index aec6b3b86..6a1206722 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala @@ -31,6 +31,7 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT import org.apache.spark.sql.types.{StructField, StructType} +import CatalystSerializer._ /** * A delayed-read projected raster implementation. @@ -82,7 +83,7 @@ object RasterRef extends LazyLogging { val rsType = new RasterSourceUDT() override def schema: StructType = StructType(Seq( StructField("source", rsType, false), - StructField("subextent", CatalystSerializer[Extent].schema, true) + StructField("subextent", schemaOf[Extent], true) )) override def to[R](t: RasterRef, io: CatalystIO[R]): R = io.create( diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala index 34003fb31..35ee3a387 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala @@ -21,7 +21,8 @@ package astraea.spark.rasterframes.tiles -import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO +import astraea.spark.rasterframes.TileType +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import astraea.spark.rasterframes.model.TileContext import astraea.spark.rasterframes.ref.ProjectedRasterLike @@ -33,7 +34,6 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{StructField, StructType} -import astraea.spark.rasterframes.TileType /** * A Tile that's also like a ProjectedRaster, with delayed evaluation support. @@ -64,7 +64,7 @@ object ProjectedRasterTile { implicit val serializer: CatalystSerializer[ProjectedRasterTile] = new CatalystSerializer[ProjectedRasterTile] { override def schema: StructType = StructType(Seq( - StructField("tile_context", CatalystSerializer[TileContext].schema, false), + StructField("tile_context", schemaOf[TileContext], false), StructField("tile", TileType, false)) ) diff --git a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala index 2dee38a6e..be61615ce 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala @@ -44,7 +44,7 @@ class RasterSourceUDT extends UserDefinedType[RasterSource] { def userClass: Class[RasterSource] = classOf[RasterSource] - override def sqlType: DataType = CatalystSerializer[RasterSource].schema + override def sqlType: DataType = schemaOf[RasterSource] override def serialize(obj: RasterSource): InternalRow = Option(obj) diff --git a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala index 643950445..aa2b24779 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala @@ -44,7 +44,7 @@ class TileUDT extends UserDefinedType[Tile] { def userClass: Class[Tile] = classOf[Tile] - def sqlType: StructType = CatalystSerializer[Tile].schema + def sqlType: StructType = schemaOf[Tile] override def serialize(obj: Tile): InternalRow = Option(obj) @@ -76,8 +76,8 @@ case object TileUDT { implicit def tileSerializer: CatalystSerializer[Tile] = new CatalystSerializer[Tile] { override def schema: StructType = StructType(Seq( - StructField("cell_context", CatalystSerializer[TileDataContext].schema, false), - StructField("cell_data", CatalystSerializer[Cells].schema, false) + StructField("cell_context", schemaOf[TileDataContext], false), + StructField("cell_data", schemaOf[Cells], false) )) override def to[R](t: Tile, io: CatalystIO[R]): R = io.create( diff --git a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala index a017e9a2e..df8027a3a 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala @@ -22,7 +22,6 @@ package astraea.spark.rasterframes import org.locationtech.jts.geom._ import geotrellis.proj4.{LatLng, Sinusoidal, WebMercator} import geotrellis.vector.{Extent, Point => GTPoint} -import org.apache.spark.sql.Column /** * Test rig for operations providing interop with JTS types. diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index 76868d055..910874e06 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -24,7 +24,7 @@ import java.net.URI import astraea.spark.rasterframes._ import astraea.spark.rasterframes.datasource.geotiff.GeoTiffCollectionRelation.Cols -import astraea.spark.rasterframes.encoders.CatalystSerializer +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.util._ import geotrellis.proj4.CRS import geotrellis.spark.io.hadoop.HadoopGeoTiffRDD @@ -40,8 +40,8 @@ case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount override def schema: StructType = StructType(Seq( StructField(Cols.PATH, StringType, false), - StructField(EXTENT_COLUMN.columnName, CatalystSerializer[Extent].schema, nullable = true), - StructField(CRS_COLUMN.columnName, CatalystSerializer[CRS].schema, false) + StructField(EXTENT_COLUMN.columnName, schemaOf[Extent], nullable = true), + StructField(CRS_COLUMN.columnName, schemaOf[CRS], false) ) ++ ( if(bandCount == 1) Seq(StructField(Cols.TL, new TileUDT, false)) else for(b ← 1 to bandCount) yield StructField(Cols.TL + "_" + b, new TileUDT, nullable = true) @@ -58,8 +58,8 @@ case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount .map { case ((path, pe), mbt) ⇒ val entries = columnIndexes.map { case 0 ⇒ path - case 1 ⇒ CatalystSerializer[Extent].toRow(pe.extent) - case 2 ⇒ CatalystSerializer[CRS].toRow(pe.crs) + case 1 ⇒ pe.extent.toRow + case 2 ⇒ pe.crs.toRow case i if i > 2 ⇒ { if(bandCount == 1 && mbt.bandCount > 2) mbt.color() else mbt.band(i - 3) diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala index 9deafe69d..2bc42893c 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala @@ -22,7 +22,7 @@ package astraea.spark.rasterframes.datasource.geotiff import java.net.URI import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS @@ -67,8 +67,8 @@ case class GeoTiffRelation(sqlContext: SQLContext, uri: URI) extends BaseRelatio StructType(Seq( StructField(SPATIAL_KEY_COLUMN.columnName, skSchema, nullable = false, skMetadata), - StructField(EXTENT_COLUMN.columnName, CatalystSerializer[Extent].schema, nullable = true), - StructField(CRS_COLUMN.columnName, CatalystSerializer[CRS].schema, nullable = true), + StructField(EXTENT_COLUMN.columnName, schemaOf[Extent], nullable = true), + StructField(CRS_COLUMN.columnName, schemaOf[CRS], nullable = true), StructField(METADATA_COLUMN.columnName, DataTypes.createMapType(StringType, StringType, false) ) @@ -86,8 +86,7 @@ case class GeoTiffRelation(sqlContext: SQLContext, uri: URI) extends BaseRelatio val trans = tlm.mapTransform val metadata = info.tags.headTags - val extSer = CatalystSerializer[Extent] - val encodedCRS = CatalystSerializer[CRS].toRow(tlm.crs) + val encodedCRS = tlm.crs.toRow if(info.segmentLayout.isTiled) { // TODO: Figure out how to do tile filtering via the range reader. @@ -99,7 +98,7 @@ case class GeoTiffRelation(sqlContext: SQLContext, uri: URI) extends BaseRelatio val gb = trans.extentToBounds(pe.extent) val entries = columnIndexes.map { case 0 => SpatialKey(gb.colMin, gb.rowMin) - case 1 => extSer.toRow(pe.extent) + case 1 => pe.extent.toRow case 2 => encodedCRS case 3 => metadata case n => tiles.band(n - 4) @@ -112,12 +111,11 @@ case class GeoTiffRelation(sqlContext: SQLContext, uri: URI) extends BaseRelatio val geotiff = HadoopGeoTiffReader.readMultiband(new Path(uri)) val rdd = sqlContext.sparkContext.makeRDD(Seq((geotiff.projectedExtent, Shims.toArrayTile(geotiff.tile)))) - rdd.tileToLayout(tlm) .map { case (sk, tiles) ⇒ val entries = columnIndexes.map { case 0 => sk - case 1 => extSer.toRow(trans.keyToExtent(sk)) + case 1 => trans.keyToExtent(sk).toRow case 2 => encodedCRS case 3 => metadata case n => tiles.band(n - 4) diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala index b5b5fdf5e..24025e23c 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -22,13 +22,13 @@ package astraea.spark.rasterframes.experimental.datasource import java.net.URI -import astraea.spark.rasterframes.encoders.CatalystSerializer +import astraea.spark.rasterframes.TileType import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.ref.HttpRangeReader import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS -import geotrellis.raster.{ProjectedRaster, Tile} import geotrellis.raster.io.geotiff.reader.GeoTiffReader +import geotrellis.raster.{ProjectedRaster, Tile} import geotrellis.spark.io.hadoop.HdfsRangeReader import geotrellis.spark.io.s3.S3Client import geotrellis.spark.io.s3.util.S3RangeReader @@ -40,9 +40,7 @@ import org.apache.spark.sql.Column import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, Generator, Literal} -import org.apache.spark.sql.rf._ import org.apache.spark.sql.types._ -import astraea.spark.rasterframes.TileType /** * Catalyst generator to convert a geotiff download URL into a series of rows containing the internal @@ -58,8 +56,8 @@ case class ReadTilesExpression(children: Seq[Expression]) extends Expression def inputTypes = Seq.fill(children.length)(StringType) override def elementSchema: StructType = StructType(Seq( - StructField("crs", CatalystSerializer[CRS].schema, true), - StructField("extent", CatalystSerializer[Extent].schema, true) + StructField("crs", schemaOf[CRS], true), + StructField("extent", schemaOf[Extent], true) ) ++ children .zipWithIndex diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala index 23075dc86..245b560c9 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -21,7 +21,7 @@ package astraea.spark.rasterframes.experimental.datasource.awspds import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.experimental.datasource.awspds.L8Relation.Bands import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.ref.RasterRef @@ -100,7 +100,9 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[F val df = { // NB: We assume that `nativeTiling` preserves the band names. - val expanded = RasterSourceToRasterRefs(useTiling, bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)): _*) + val expanded = RasterSourceToRasterRefs( + if (useTiling) Some(NOMINAL_TILE_DIMS) else None, + bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)): _*) filtered.select(nonTile :+ expanded: _*) } @@ -126,7 +128,7 @@ object L8Relation extends PDSFields { case ACQUISITION_DATE ⇒ ACQUISITION_DATE.copy(name = StandardColumns.TIMESTAMP_COLUMN.columnName) case s if s.name == BOUNDS_WGS84.name ⇒ BOUNDS case s if s != DOWNLOAD_URL ⇒ s - } ++ L8Relation.Bands.values.toSeq.map(b ⇒ StructField(b.toString, CatalystSerializer[RasterRef].schema, true)) + } ++ L8Relation.Bands.values.toSeq.map(b ⇒ StructField(b.toString, schemaOf[RasterRef], true)) ) } } From be706aedf53f614adae6173983c39b96ed65de6c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 10 Apr 2019 16:30:29 -0400 Subject: [PATCH 038/380] Provided means of specifying tile size via RasterSourceDataSource. --- .../spark/rasterframes/StandardColumns.scala | 5 ++- .../transformers/RasterRefToTile.scala | 14 ++++---- .../extensions/DataFrameMethods.scala | 33 +++---------------- .../spark/rasterframes/ref/RasterSource.scala | 20 ++--------- .../rasterframes/ref/RasterRefSpec.scala | 2 +- .../rasterframes/ref/RasterSourceSpec.scala | 11 ++++--- .../rastersource/RasterSourceDataSource.scala | 33 ++++++++++++------- .../rastersource/RasterSourceRelation.scala | 17 ++++------ .../datasource/rastersource/package.scala | 12 +++++-- .../RasterSourceDataSourceSpec.scala | 31 ++++++++++------- 10 files changed, 81 insertions(+), 97 deletions(-) diff --git a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala index dd488ce6f..e327e871a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala @@ -6,7 +6,7 @@ import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ import geotrellis.proj4.CRS import geotrellis.raster.Tile import geotrellis.spark.{SpatialKey, TemporalKey} -import geotrellis.vector.Extent +import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.functions.col import org.locationtech.jts.geom.{Point => jtsPoint, Polygon => jtsPolygon} @@ -36,6 +36,9 @@ trait StandardColumns { /** Default Extent column name. */ def EXTENT_COLUMN = col("extent").as[Extent] + /** Default ProjectedExtent column name. */ + def PROJECTED_EXTENT_COLUMN = col("proj_extent").as[ProjectedExtent] + /** Default CRS column name. */ def CRS_COLUMN = col("crs").as[CRS] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala index c3aa3f337..4a510fb37 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala @@ -21,12 +21,11 @@ package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.row import astraea.spark.rasterframes.ref.RasterRef +import astraea.spark.rasterframes.tiles.ProjectedRasterTile import com.typesafe.scalalogging.LazyLogging -import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ExpectsInputTypes, Expression, UnaryExpression} import org.apache.spark.sql.rf._ @@ -43,19 +42,18 @@ case class RasterRefToTile(child: Expression) extends UnaryExpression override def nodeName: String = "raster_ref_to_tile" - override def inputTypes = Seq(CatalystSerializer[RasterRef].schema) + override def inputTypes = Seq(schemaOf[RasterRef]) - override def dataType: DataType = new TileUDT + override def dataType: DataType = schemaOf[ProjectedRasterTile] override protected def nullSafeEval(input: Any): Any = { implicit val ser = TileUDT.tileSerializer val ref = row(input).to[RasterRef] - (ref.tile: Tile).toInternalRow + ref.tile.toInternalRow } } object RasterRefToTile { - import astraea.spark.rasterframes.encoders.StandardEncoders._ - def apply(rr: Column): TypedColumn[Any, Tile] = - new Column(RasterRefToTile(rr.expr)).as[Tile] + def apply(rr: Column): TypedColumn[Any, ProjectedRasterTile] = + new Column(RasterRefToTile(rr.expr)).as[ProjectedRasterTile] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala index ca38322ac..b8bad84ea 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala @@ -25,11 +25,12 @@ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey import geotrellis.util.MethodExtensions import org.apache.spark.sql.catalyst.expressions.Attribute import org.apache.spark.sql.functions._ -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} import spray.json.JsonFormat import astraea.spark.rasterframes.encoders.StandardEncoders._ +import astraea.spark.rasterframes.expressions.DynamicExtractors + import scala.util.Try /** @@ -82,15 +83,15 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada fetchMetadataValue(column, _.metadata.getString(SPATIAL_ROLE_KEY)) /** Get the columns that are of type `Tile` */ - def tileColumns: Seq[TypedColumn[Any, Tile]] = + def tileColumns: Seq[Column] = self.schema.fields - .filter(_.dataType.typeName.equalsIgnoreCase(TileUDT.typeName)) + .filter(f => DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) .map(f ⇒ col(f.name).as[Tile]) /** Get the columns that are not of type `Tile` */ def notTileColumns: Seq[Column] = self.schema.fields - .filterNot(_.dataType.typeName.equalsIgnoreCase(TileUDT.typeName)) + .filter(f => DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) .map(f ⇒ col(f.name)) /** Get the spatial column. */ @@ -190,30 +191,6 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada .setTemporalColumnRole(temporalKey) .asRF -// @throws[IllegalArgumentException] -// def asRF(space: LayerSpace): RasterFrame = { -// require(tileColumns.isEmpty, "This method doesn't yet support existing tile columns") -// // We have two use cases to consider: This is already a rasterframe and we need to -// // reproject it. If we have RasterRefs then we reproject those -// val (refFields, otherFields) = self.schema.fields -// .partition(_.dataType.typeName.equalsIgnoreCase(RasterRefUDT.typeName)) -// -// val refCols = refFields.map(f ⇒ self(f.name).as[RasterRef]) -// val otherCols = otherFields.map(f ⇒ self(f.name)) -// -// // Reproject tile into layer space -// val projected = self.select(otherCols :+ ProjectIntoLayer(refCols, space): _*) -// -// // Lastly, convert cell type as desired -// val tileCols = projected.tileColumns.map(c ⇒ convert_cell_type(c, space.cell_type).as(c.columnName)) -// val remCols = projected.notTileColumns -// -// val layer = projected.select(remCols ++ tileCols: _*) -// -// val tlm = space.asTileLayerMetadata -// layer.setSpatialColumnRole(SPATIAL_KEY_COLUMN, tlm).asRF -// } - /** * Converts [[DataFrame]] to a RasterFrame if the following constraints are fulfilled: * diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index b85dadcc9..45e708206 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -37,7 +37,6 @@ import geotrellis.raster._ import geotrellis.raster.io.geotiff.Tags import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.spark.io.hadoop.HdfsRangeReader -import geotrellis.spark.tiling.LayoutDefinition import geotrellis.util.RangeReader import geotrellis.vector.Extent import org.apache.hadoop.conf.Configuration @@ -82,24 +81,9 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { def tileContext: TileContext = TileContext(extent, crs) - def tileLayout(dims: TileDimensions): TileLayout = { - require(dims.cols > 0 && dims.rows > 0, "Non-zero tile sizes") - TileLayout( - layoutCols = math.ceil(this.cols.toDouble / dims.cols).toInt, - layoutRows = math.ceil(this.rows.toDouble / dims.rows).toInt, - tileCols = dims.cols, - tileRows = dims.rows - ) - } - def layoutExtents(dims: TileDimensions): Seq[Extent] = { - val tl = tileLayout(dims) - val layout = LayoutDefinition(extent, tl) - val transform = layout.mapTransform - for { - col <- 0 until tl.layoutCols - row <- 0 until tl.layoutRows - } yield transform(col, row) + val re = rasterExtent + layoutBounds(dims).map(re.rasterExtentFor).map(_.extent) } def layoutBounds(dims: TileDimensions): Seq[GridBounds] = { diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala index 4f7b77563..f1af549fe 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala @@ -177,7 +177,7 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { import spark.implicits._ val df = Seq(src).toDF("src") - val refs = df.select(RasterSourceToRasterRefs(true, $"src")) + val refs = df.select(RasterSourceToRasterRefs(Some(NOMINAL_TILE_DIMS), $"src")) assert(refs.count() > 1) } } diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 141eac48f..60fac1206 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -44,11 +44,6 @@ class RasterSourceSpec extends TestEnvironment with TestData { assert(new RasterSourceUDT() === new RasterSourceUDT()) } val rs = RasterSource(getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI) - it("should provide a tile layout") { - val layout = rs.tileLayout(TileDimensions(62, 61)) - layout.totalCols shouldBe >= (rs.cols.toLong) - layout.totalRows shouldBe >= (rs.rows.toLong) - } it("should compute nominal tile layout bounds") { val bounds = rs.layoutBounds(TileDimensions(65, 60)) val agg = bounds.reduce(_ combine _) @@ -59,6 +54,12 @@ class RasterSourceSpec extends TestEnvironment with TestData { val agg = extents.reduce(_ combine _) agg should be (rs.extent) } + it("should reassemble correct grid from extents") { + val dims = TileDimensions(63, 63) + val ext = rs.layoutExtents(dims).head + val bounds = rs.layoutBounds(dims).head + rs.rasterExtent.gridBoundsFor(ext, false) should be (bounds) + } } describe("HTTP RasterSource") { diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index e942ac100..7e05ffa6f 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -20,20 +20,18 @@ */ package astraea.spark.rasterframes.datasource.rastersource +import astraea.spark.rasterframes.model.TileDimensions import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} class RasterSourceDataSource extends DataSourceRegister with RelationProvider { - override def shortName(): String = RasterSourceDataSource.SHORT_NAME + import RasterSourceDataSource._ + override def shortName(): String = SHORT_NAME override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { - val bandCount = parameters - .get(RasterSourceDataSource.BAND_COUNT_PARAM) - .map(_.toInt) - .getOrElse(1) - - val files = RasterSourceDataSource.filePaths(parameters) - - RasterSourceRelation(sqlContext, files, bandCount) + val bandCount = parameters.bandCount + val files = parameters.filePaths + val tiling = parameters.tileDims + RasterSourceRelation(sqlContext, files, bandCount, tiling) } } object RasterSourceDataSource { @@ -41,12 +39,13 @@ object RasterSourceDataSource { final val PATH_PARAM = "path" final val PATHS_PARAM = "paths" final val BAND_COUNT_PARAM = "bandCount" + final val TILE_DIMS_PARAM = "tileDimensions" private[rastersource] - def filePaths(parameters: Map[String, String]): Seq[String] = - ( + implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { + def filePaths: Seq[String] = ( parameters - .get(RasterSourceDataSource.PATHS_PARAM) + .get(PATHS_PARAM) .toSeq .flatMap(_.split(Array('\n','\r'))) ++ parameters @@ -55,4 +54,14 @@ object RasterSourceDataSource { ) .filter(_.nonEmpty) + def tileDims: Option[TileDimensions] = + parameters.get(TILE_DIMS_PARAM) + .map(_.split(',').map(_.trim.toInt)) + .map { case Array(cols, rows) => TileDimensions(cols, rows)} + + def bandCount: Int = parameters + .get(BAND_COUNT_PARAM) + .map(_.toInt) + .getOrElse(1) + } } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala index 384685554..ec6980500 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -22,18 +22,17 @@ package astraea.spark.rasterframes.datasource.rastersource import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer -import astraea.spark.rasterframes.expressions.accessors.{GetCRS, GetExtent} +import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} +import astraea.spark.rasterframes.model.TileDimensions +import astraea.spark.rasterframes.tiles.ProjectedRasterTile import astraea.spark.rasterframes.util._ -import geotrellis.proj4.CRS -import geotrellis.vector.Extent import org.apache.spark.rdd.RDD import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{Row, SQLContext} -case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], bandCount: Int) extends BaseRelation with TableScan { +case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], bandCount: Int, subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { override def schema: StructType = if (bandCount == 1) RasterSourceRelation.schema else { val fields = RasterSourceRelation.schema.fields @@ -47,11 +46,9 @@ case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], band override def buildScan(): RDD[Row] = { import sqlContext.implicits._ paths.toDF("path") - .withColumn("__rr", RasterSourceToRasterRefs(URIToRasterSource($"path"))) + .withColumn("__rr", RasterSourceToRasterRefs(subtileDims, URIToRasterSource($"path"))) .select( PATH_COLUMN, - GetExtent($"__rr") as EXTENT_COLUMN.columnName, - GetCRS($"__rr") as CRS_COLUMN.columnName, RasterRefToTile($"__rr") as TILE_COLUMN.columnName ) .rdd @@ -60,8 +57,6 @@ case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], band object RasterSourceRelation { def schema: StructType = StructType(Seq( StructField(PATH_COLUMN.columnName, StringType, false), - StructField(EXTENT_COLUMN.columnName, CatalystSerializer[Extent].schema, nullable = true), - StructField(CRS_COLUMN.columnName, CatalystSerializer[CRS].schema, false), - StructField(TILE_COLUMN.columnName, TileType, true) + StructField(TILE_COLUMN.columnName, schemaOf[ProjectedRasterTile], true) )) } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala index ccb556c42..421d241cf 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala @@ -44,11 +44,19 @@ package object rastersource { tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.option(RasterSourceDataSource.BAND_COUNT_PARAM, bandCount)) - def from(paths: Seq[String]): RasterSourceDataFrameReader = + def withTileDimensions(cols: Int, rows: Int): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.option(RasterSourceDataSource.TILE_DIMS_PARAM, s"$cols,$rows") + ) + + def from(newlineDelimPaths: String): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( - reader.option(RasterSourceDataSource.PATHS_PARAM, paths.mkString("\n")) + reader.option(RasterSourceDataSource.PATHS_PARAM, newlineDelimPaths) ) + def from(paths: Seq[String]): RasterSourceDataFrameReader = + from(paths.mkString("\n")) + def from(uris: Seq[URI])(implicit d: DummyImplicit): RasterSourceDataFrameReader = from(uris.map(_.toASCIIString)) } diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index cc7570680..099c501ee 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -20,30 +20,38 @@ */ package astraea.spark.rasterframes.datasource.rastersource -import astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource.{PATHS_PARAM, PATH_PARAM} +import astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource._ import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.model.TileDimensions import astraea.spark.rasterframes.util._ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { + import spark.implicits._ + describe("DataSource parameter processing") { it("should handle single `path`") { val p = Map(PATH_PARAM -> "/usr/local/foo/bar.tif") - RasterSourceDataSource.filePaths(p) should be (p.values.toSeq) + p.filePaths should be (p.values.toSeq) } + it("should handle single `paths`") { val p = Map(PATHS_PARAM -> "/usr/local/foo/bar.tif") - RasterSourceDataSource.filePaths(p) should be (p.values.toSeq) + p.filePaths should be (p.values.toSeq) } it("should handle multiple `paths`") { val expected = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") val p = Map(PATHS_PARAM -> expected.mkString("\n\r", "\n\n", "\r")) - RasterSourceDataSource.filePaths(p) should be (expected) + p.filePaths should be (expected) } it("should handle both `path` and `paths`") { val expected1 = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") val expected2 = "/usr/local/barf/baz.tif" val p = Map(PATHS_PARAM -> expected1.mkString("\n"), PATH_PARAM -> expected2) - RasterSourceDataSource.filePaths(p) should be (expected1 :+ expected2) + p.filePaths should be (expected1 :+ expected2) + } + it("should parse tile dimensions") { + val p = Map(TILE_DIMS_PARAM -> "4, 5") + p.tileDims should be (Some(TileDimensions(4, 5))) } } @@ -64,19 +72,20 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { tcols.map(_.columnName) should contain allElementsOf Seq("tile_1", "tile_2", "tile_3") } it("should read a single file") { - val df = spark.read.rastersource.load(l8samplePath.toASCIIString) - df.printSchema() - df.show(false) - fail() + val df = spark.read.rastersource + .withTileDimensions(128, 128) + .load(l8samplePath.toASCIIString) + df.count() should be(4) + df.select(tile_dimensions($"tile")).show(false) + df.select("path").distinct().count() should be(1) } it("should read a multiple files with one band") { val df = spark.read.rastersource .from(Seq(cogPath, l8samplePath, nonCogPath)) + .withTileDimensions(128, 128) .load() df.printSchema() df.show(false) - fail() } - } } From e4de5c112897602b26f5bb12fc199dfcf53040c9 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 15 Apr 2019 09:56:01 -0400 Subject: [PATCH 039/380] Added multiband support to RasterSourceRelation. --- bench/src/main/resources/log4j.properties | 2 +- .../rasterframes/bench/TileEncodeBench.scala | 2 +- core/src/it/resources/log4j.properties | 2 +- .../encoders/CatalystSerializer.scala | 20 +-- .../encoders/StandardSerializers.scala | 4 +- .../expressions/DynamicExtractors.scala | 14 +- .../aggstats/LocalStatsAggregate.scala | 1 - .../RasterSourceToRasterRefs.scala | 30 +++-- .../spark/rasterframes/ref/RasterRef.scala | 20 ++- .../util/ZeroSevenCompatibilityKit.scala | 122 +++++++++--------- .../encoders/CatalystSerializerSpec.scala | 2 +- .../rasterframes/ref/RasterRefSpec.scala | 10 +- .../rastersource/RasterSourceDataSource.scala | 14 +- .../rastersource/RasterSourceRelation.scala | 56 ++++---- .../datasource/rastersource/package.scala | 6 +- .../RasterSourceDataSourceSpec.scala | 42 +++++- .../datasource/awspds/L8Relation.scala | 6 +- 17 files changed, 202 insertions(+), 151 deletions(-) diff --git a/bench/src/main/resources/log4j.properties b/bench/src/main/resources/log4j.properties index f8cb2c5b9..c6ede28bb 100644 --- a/bench/src/main/resources/log4j.properties +++ b/bench/src/main/resources/log4j.properties @@ -18,7 +18,7 @@ # # Set everything to be logged to the console -log4j.rootCategory=TRACE, FILE +log4j.rootCategory=INFO, FILE log4j.appender.FILE=org.apache.log4j.FileAppender log4j.appender.FILE.File=target/jmh-log.out diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala b/bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala index 7f25235ae..5887aafc5 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala +++ b/bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala @@ -52,7 +52,7 @@ class TileEncodeBench extends SparkEnv { cellTypeName match { case "rasterRef" ⇒ val baseCOG = "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_B1.TIF" - tile = RasterRefTile(RasterRef(RasterSource(URI.create(baseCOG)), Some(Extent(253785.0, 3235185.0, 485115.0, 3471015.0)))) + tile = RasterRefTile(RasterRef(RasterSource(URI.create(baseCOG)), 0, Some(Extent(253785.0, 3235185.0, 485115.0, 3471015.0)))) case _ ⇒ tile = randomTile(tileSize, tileSize, cellTypeName) } diff --git a/core/src/it/resources/log4j.properties b/core/src/it/resources/log4j.properties index 378ae8e61..4a0646435 100644 --- a/core/src/it/resources/log4j.properties +++ b/core/src/it/resources/log4j.properties @@ -38,7 +38,7 @@ log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO log4j.logger.astraea.spark.rasterframes=DEBUG -log4j.logger.astraea.spark.rasterframes.ref=TRACE +log4j.logger.astraea.spark.rasterframes.ref=INFO log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala index 39e933cfc..1e94ebfed 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala @@ -63,8 +63,8 @@ object CatalystSerializer extends StandardSerializers { def create(values: Any*): R def to[T: CatalystSerializer](t: T): R = CatalystSerializer[T].to(t, this) def toSeq[T: CatalystSerializer](t: Seq[T]): AnyRef - def get[T: CatalystSerializer](d: R, ordinal: Int): T - def getSeq[T: CatalystSerializer](d: R, ordinal: Int): Seq[T] + def get[T >: Null: CatalystSerializer](d: R, ordinal: Int): T + def getSeq[T >: Null: CatalystSerializer](d: R, ordinal: Int): Seq[T] def isNullAt(d: R, ordinal: Int): Boolean def getBoolean(d: R, ordinal: Int): Boolean def getByte(d: R, ordinal: Int): Byte @@ -93,14 +93,14 @@ object CatalystSerializer extends StandardSerializers { override def getString(d: R, ordinal: Int): String = d.getString(ordinal) override def getByteArray(d: R, ordinal: Int): Array[Byte] = d.get(ordinal).asInstanceOf[Array[Byte]] - override def get[T: CatalystSerializer](d: R, ordinal: Int): T = { + override def get[T >: Null: CatalystSerializer](d: R, ordinal: Int): T = { d.getAs[Any](ordinal) match { case r: Row => r.to[T] case o => o.asInstanceOf[T] } } override def toSeq[T: CatalystSerializer](t: Seq[T]): AnyRef = t.map(_.toRow) - override def getSeq[T: CatalystSerializer](d: R, ordinal: Int): Seq[T] = + override def getSeq[T >: Null: CatalystSerializer](d: R, ordinal: Int): Seq[T] = d.getSeq[Row](ordinal).map(_.to[T]) override def encode(str: String): String = str } @@ -120,7 +120,7 @@ object CatalystSerializer extends StandardSerializers { override def getDouble(d: InternalRow, ordinal: Int): Double = d.getDouble(ordinal) override def getString(d: InternalRow, ordinal: Int): String = d.getString(ordinal) override def getByteArray(d: InternalRow, ordinal: Int): Array[Byte] = d.getBinary(ordinal) - override def get[T: CatalystSerializer](d: InternalRow, ordinal: Int): T = { + override def get[T >: Null: CatalystSerializer](d: InternalRow, ordinal: Int): T = { val ser = CatalystSerializer[T] val struct = d.getStruct(ordinal, ser.schema.size) struct.to[T] @@ -129,7 +129,7 @@ object CatalystSerializer extends StandardSerializers { override def toSeq[T: CatalystSerializer](t: Seq[T]): ArrayData = ArrayData.toArrayData(t.map(_.toInternalRow).toArray) - override def getSeq[T: CatalystSerializer](d: InternalRow, ordinal: Int): Seq[T] = { + override def getSeq[T >: Null: CatalystSerializer](d: InternalRow, ordinal: Int): Seq[T] = { val ad = d.getArray(ordinal) val result = Array.ofDim[Any](ad.numElements()).asInstanceOf[Array[T]] ad.foreach( @@ -143,15 +143,15 @@ object CatalystSerializer extends StandardSerializers { } implicit class WithToRow[T: CatalystSerializer](t: T) { - def toInternalRow: InternalRow = CatalystSerializer[T].toInternalRow(t) - def toRow: Row = CatalystSerializer[T].toRow(t) + def toInternalRow: InternalRow = if (t == null) null else CatalystSerializer[T].toInternalRow(t) + def toRow: Row = if (t == null) null else CatalystSerializer[T].toRow(t) } implicit class WithFromInternalRow(val r: InternalRow) extends AnyVal { - def to[T: CatalystSerializer]: T = CatalystSerializer[T].fromInternalRow(r) + def to[T >: Null: CatalystSerializer]: T = if (r == null) null else CatalystSerializer[T].fromInternalRow(r) } implicit class WithFromRow(val r: Row) extends AnyVal { - def to[T: CatalystSerializer]: T = CatalystSerializer[T].fromRow(r) + def to[T >: Null: CatalystSerializer]: T = CatalystSerializer[T].fromRow(r) } } diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala index a35e14c9e..5d63f1db5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala @@ -202,7 +202,7 @@ trait StandardSerializers { ) } - implicit def boundsSerializer[T: CatalystSerializer]: CatalystSerializer[KeyBounds[T]] = new CatalystSerializer[KeyBounds[T]] { + implicit def boundsSerializer[T >: Null: CatalystSerializer]: CatalystSerializer[KeyBounds[T]] = new CatalystSerializer[KeyBounds[T]] { override def schema: StructType = StructType(Seq( StructField("minKey", schemaOf[T], true), StructField("maxKey", schemaOf[T], true) @@ -219,7 +219,7 @@ trait StandardSerializers { ) } - def tileLayerMetadataSerializer[T: CatalystSerializer]: CatalystSerializer[TileLayerMetadata[T]] = new CatalystSerializer[TileLayerMetadata[T]] { + def tileLayerMetadataSerializer[T >: Null: CatalystSerializer]: CatalystSerializer[TileLayerMetadata[T]] = new CatalystSerializer[TileLayerMetadata[T]] { override def schema: StructType = StructType(Seq( StructField("cellType", schemaOf[CellType], false), StructField("layout", schemaOf[LayoutDefinition], false), diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala index f8a41054c..8c5a8991d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala @@ -57,21 +57,21 @@ object DynamicExtractors { /** Partial function for pulling a ProjectedRasterLike an input row. */ lazy val projectedRasterLikeExtractor: PartialFunction[DataType, InternalRow ⇒ ProjectedRasterLike] = { case _: RasterSourceUDT ⇒ - (row: InternalRow) ⇒ row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) + (row: InternalRow) => row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => (row: InternalRow) => row.to[ProjectedRasterTile] case t if t.conformsTo(schemaOf[RasterRef]) => - (row: InternalRow) ⇒ row.to[RasterRef] + (row: InternalRow) => row.to[RasterRef] } /** Partial function for pulling a CellGrid from an input row. */ lazy val gridExtractor: PartialFunction[DataType, InternalRow ⇒ CellGrid] = { - case _: TileUDT ⇒ - (row: InternalRow) ⇒ row.to[Tile](TileUDT.tileSerializer) - case _: RasterSourceUDT ⇒ - (row: InternalRow) ⇒ row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) + case _: TileUDT => + (row: InternalRow) => row.to[Tile](TileUDT.tileSerializer) + case _: RasterSourceUDT => + (row: InternalRow) => row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) case t if t.conformsTo(schemaOf[RasterRef]) ⇒ - (row: InternalRow) ⇒ row.to[RasterRef] + (row: InternalRow) => row.to[RasterRef] case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => (row: InternalRow) => row.to[ProjectedRasterTile] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala index c5bdb47e0..dbe8a5b3f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala @@ -31,7 +31,6 @@ import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} -import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, TypedColumn} import astraea.spark.rasterframes.TileType diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index 8ef4f6cb4..c0a9c31c8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -23,9 +23,10 @@ package astraea.spark.rasterframes.expressions.transformers import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.ref.RasterRef +import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} import astraea.spark.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging +import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback @@ -41,7 +42,7 @@ import scala.util.control.NonFatal * * @since 9/6/18 */ -case class RasterSourceToRasterRefs(children: Seq[Expression], subtileDims: Option[TileDimensions] = None) extends Expression +case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions] = None) extends Expression with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { private val RasterSourceType = new RasterSourceUDT() @@ -50,9 +51,16 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], subtileDims: Opti override def inputTypes: Seq[DataType] = Seq.fill(children.size)(RasterSourceType) override def nodeName: String = "raster_source_to_raster_ref" - override def elementSchema: StructType = StructType( - children.map(e ⇒ StructField(e.name, rasterRefSchema, false)) - ) + override def elementSchema: StructType = StructType(for { + child <- children + band <- bandIndexes + name = child.name + (if (bandIndexes.length > 1) "_b" + band else "") + } yield StructField(name, rasterRefSchema, true)) + + private def band2ref(src: RasterSource, e: Option[Extent])(b: Int): RasterRef = + if (b < src.bandCount) + RasterRef(src, b, e) + else null override def eval(input: InternalRow): TraversableOnce[InternalRow] = { try { @@ -61,11 +69,11 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], subtileDims: Opti subtileDims.map(dims => src .layoutExtents(dims) - .map(e ⇒ RasterRef(src, Some(e))) + .map(e ⇒ bandIndexes.map(band2ref(src, Some(e)))) ) - .getOrElse( Seq(RasterRef(src))) + .getOrElse(Seq(bandIndexes.map(band2ref(src, None)))) } - refs.transpose.map(ts ⇒ InternalRow(ts.map(_.toInternalRow): _*)) + refs.transpose.map(ts ⇒ InternalRow(ts.flatMap(_.map(_.toInternalRow)): _*)) } catch { case NonFatal(ex) ⇒ @@ -76,7 +84,7 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], subtileDims: Opti } object RasterSourceToRasterRefs { - def apply(rrs: Column*): TypedColumn[Any, RasterRef] = apply(None, rrs: _*) - def apply(subtileDims: Option[TileDimensions], rrs: Column*): TypedColumn[Any, RasterRef] = - new Column(new RasterSourceToRasterRefs(rrs.map(_.expr), subtileDims)).as[RasterRef] + def apply(rrs: Column*): TypedColumn[Any, RasterRef] = apply(None, Seq(0), rrs: _*) + def apply(subtileDims: Option[TileDimensions], bandIndexes: Seq[Int], rrs: Column*): TypedColumn[Any, RasterRef] = + new Column(new RasterSourceToRasterRefs(rrs.map(_.expr), bandIndexes, subtileDims)).as[RasterRef] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala index 6a1206722..888f09274 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala @@ -30,7 +30,7 @@ import geotrellis.raster.{CellType, GridBounds, Tile} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT -import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.types.{IntegerType, StructField, StructType} import CatalystSerializer._ /** @@ -38,7 +38,7 @@ import CatalystSerializer._ * * @since 8/21/18 */ -case class RasterRef(source: RasterSource, subextent: Option[Extent]) +case class RasterRef(source: RasterSource, bandIndex: Int, subextent: Option[Extent]) extends ProjectedRasterLike { def crs: CRS = source.crs def extent: Extent = subextent.getOrElse(source.extent) @@ -52,19 +52,14 @@ case class RasterRef(source: RasterSource, subextent: Option[Extent]) protected def srcExtent: Extent = extent protected lazy val realizedTile: Tile = { - require(source.bandCount == 1, "Expected singleband tile") - RasterRef.log.trace(s"Fetching $srcExtent from $source") - source.read(srcExtent).tile.band(0) + RasterRef.log.trace(s"Fetching $srcExtent from band $bandIndex of $source") + source.read(srcExtent, Seq(bandIndex)).tile.band(0) } } object RasterRef extends LazyLogging { private val log = logger - - /** Constructor for when data extent cover whole raster. */ - def apply(source: RasterSource): RasterRef = RasterRef(source, None) - case class RasterRefTile(rr: RasterRef) extends ProjectedRasterTile { val extent: Extent = rr.extent val crs: CRS = rr.crs @@ -83,18 +78,21 @@ object RasterRef extends LazyLogging { val rsType = new RasterSourceUDT() override def schema: StructType = StructType(Seq( StructField("source", rsType, false), + StructField("band_index", IntegerType, false), StructField("subextent", schemaOf[Extent], true) )) override def to[R](t: RasterRef, io: CatalystIO[R]): R = io.create( io.to(t.source)(RasterSourceUDT.rasterSourceSerializer), + t.bandIndex, t.subextent.map(io.to[Extent]).orNull ) override def from[R](row: R, io: CatalystIO[R]): RasterRef = RasterRef( io.get[RasterSource](row, 0)(RasterSourceUDT.rasterSourceSerializer), - if (io.isNullAt(row, 1)) None - else Option(io.get[Extent](row, 1)) + io.getInt(row, 1), + if (io.isNullAt(row, 2)) None + else Option(io.get[Extent](row, 2)) ) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala index 098c7ea3f..fb0c14946 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -51,175 +51,175 @@ object ZeroSevenCompatibilityKit { private val delegate = new astraea.spark.rasterframes.RasterFunctions {} // format: off /** Create a row for each cell in Tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def explodeTiles(cols: Column*): Column = delegate.explode_tiles(cols: _*) /** Create a row for each cell in Tile with random sampling and optional seed. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def explodeTilesSample(sampleFraction: Double, seed: Option[Long], cols: Column*): Column = ExplodeTiles(sampleFraction, seed, cols) /** Create a row for each cell in Tile with random sampling (no seed). */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def explodeTilesSample(sampleFraction: Double, cols: Column*): Column = ExplodeTiles(sampleFraction, None, cols) /** Query the number of (cols, rows) in a Tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileDimensions(col: Column): Column = GetDimensions(col) @Experimental /** Convert array in `arrayCol` into a Tile of dimensions `cols` and `rows`*/ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def arrayToTile(arrayCol: Column, cols: Int, rows: Int) = withAlias("array_to_tile", arrayCol)( udf[Tile, AnyRef](F.arrayToTile(cols, rows)).apply(arrayCol) ) /** Create a Tile from a column of cell data with location indexes and preform cell conversion. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def assembleTile(columnIndex: Column, rowIndex: Column, cellData: Column, tileCols: Int, tileRows: Int, ct: CellType): TypedColumn[Any, Tile] = convertCellType(TileAssembler(columnIndex, rowIndex, cellData, lit(tileCols), lit(tileRows)), ct).as(cellData.columnName).as[Tile] /** Create a Tile from a column of cell data with location indexes. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def assembleTile(columnIndex: Column, rowIndex: Column, cellData: Column, tileCols: Column, tileRows: Column): TypedColumn[Any, Tile] = TileAssembler(columnIndex, rowIndex, cellData, tileCols, tileRows) /** Extract the Tile's cell type */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def cellType(col: Column): TypedColumn[Any, CellType] = GetCellType(col) /** Change the Tile's cell type */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def convertCellType(col: Column, cellType: CellType): TypedColumn[Any, Tile] = SetCellType(col, cellType) /** Change the Tile's cell type */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def convertCellType(col: Column, cellTypeName: String): TypedColumn[Any, Tile] = SetCellType(col, cellTypeName) /** Convert a bounding box structure to a Geometry type. Intented to support multiple schemas. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def boundsGeometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) /** Assign a `NoData` value to the Tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def withNoData(col: Column, nodata: Double) = withAlias("withNoData", col)( udf[Tile, Tile](F.withNoData(nodata)).apply(col) ).as[Tile] /** Compute the full column aggregate floating point histogram. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def aggHistogram(col: Column): TypedColumn[Any, CellHistogram] = delegate.agg_approx_histogram(col) /** Compute the full column aggregate floating point statistics. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def aggStats(col: Column): TypedColumn[Any, CellStatistics] = delegate.agg_stats(col) /** Computes the column aggregate mean. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def aggMean(col: Column) = CellMeanAggregate(col) /** Computes the number of non-NoData cells in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def aggDataCells(col: Column): TypedColumn[Any, Long] = delegate.agg_data_cells(col) /** Computes the number of NoData cells in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def aggNoDataCells(col: Column): TypedColumn[Any, Long] = delegate.agg_no_data_cells(col) /** Compute the Tile-wise mean */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileMean(col: Column): TypedColumn[Any, Double] = delegate.tile_mean(col) /** Compute the Tile-wise sum */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileSum(col: Column): TypedColumn[Any, Double] = delegate.tile_sum(col) /** Compute the minimum cell value in tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileMin(col: Column): TypedColumn[Any, Double] = delegate.tile_min(col) /** Compute the maximum cell value in tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileMax(col: Column): TypedColumn[Any, Double] = delegate.tile_max(col) /** Compute TileHistogram of Tile values. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileHistogram(col: Column): TypedColumn[Any, CellHistogram] = delegate.tile_histogram(col) /** Compute statistics of Tile values. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileStats(col: Column): TypedColumn[Any, CellStatistics] = delegate.tile_stats(col) /** Counts the number of non-NoData cells per Tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def dataCells(tile: Column): TypedColumn[Any, Long] = delegate.data_cells(tile) /** Counts the number of NoData cells per Tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def noDataCells(tile: Column): TypedColumn[Any, Long] = delegate.no_data_cells(tile) - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def isNoDataTile(tile: Column): TypedColumn[Any, Boolean] = delegate.is_no_data_tile(tile) /** Compute cell-local aggregate descriptive statistics for a column of Tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAggStats(col: Column): Column = delegate.agg_local_stats(col) /** Compute the cell-wise/local max operation between Tiles in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAggMax(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_max(col) /** Compute the cellwise/local min operation between Tiles in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAggMin(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_min(col) /** Compute the cellwise/local mean operation between Tiles in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAggMean(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_mean(col) /** Compute the cellwise/local count of non-NoData cells for all Tiles in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAggDataCells(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_data_cells(col) /** Compute the cellwise/local count of NoData cells for all Tiles in a column. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAggNoDataCells(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_no_data_cells(col) /** Cellwise addition between two Tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAdd(left: Column, right: Column): Column = delegate.local_add(left, right) /** Cellwise addition of a scalar to a tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAddScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_add(tileCol, value) /** Cellwise subtraction between two Tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localSubtract(left: Column, right: Column): Column = delegate.local_subtract(left, right) /** Cellwise subtraction of a scalar from a tile. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localSubtractScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_subtract(tileCol, value) /** Cellwise multiplication between two Tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localMultiply(left: Column, right: Column): Column = delegate.local_multiply(left, right) /** Cellwise multiplication of a tile by a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localMultiplyScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_multiply(tileCol, value) /** Cellwise division between two Tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localDivide(left: Column, right: Column): Column = delegate.local_divide(left, right) /** Cellwise division of a tile by a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localDivideScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_divide(tileCol, value) /** Perform an arbitrary GeoTrellis `LocalTileBinaryOp` between two Tile columns. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAlgebra(op: LocalTileBinaryOp, left: Column, right: Column): TypedColumn[Any, Tile] = withAlias(opName(op), left, right)( @@ -227,93 +227,93 @@ object ZeroSevenCompatibilityKit { ).as[Tile] /** Compute the normalized difference of two tile columns */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def normalizedDifference(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.normalized_difference(left, right) /** Constructor for constant tile column */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def makeConstantTile(value: Number, cols: Int, rows: Int, cellType: String): TypedColumn[Any, Tile] = udf(() => F.makeConstantTile(value, cols, rows, cellType)).apply().as(s"constant_$cellType").as[Tile] /** Alias for column of constant tiles of zero */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileZeros(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = udf(() => F.tileZeros(cols, rows, cellType)).apply().as(s"zeros_$cellType").as[Tile] /** Alias for column of constant tiles of one */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def tileOnes(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = udf(() => F.tileOnes(cols, rows, cellType)).apply().as(s"ones_$cellType").as[Tile] /** Where the mask tile equals the mask value, replace values in the source tile with NODATA */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def maskByValue(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = delegate.mask_by_value(sourceTile, maskTile, maskValue) /** Where the mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def inverseMask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = delegate.inverse_mask(sourceTile, maskTile) /** Reproject a column of geometry from one CRS to another. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def reprojectGeometry(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = delegate.reproject_geometry(sourceGeom, srcCRS, dstCRS) /** Render Tile as ASCII string for debugging purposes. */ @Experimental - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def renderAscii(col: Column): TypedColumn[Any, String] = delegate.render_ascii(col) /** Cellwise less than value comparison between two tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localLess(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_less(left, right) /** Cellwise less than value comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localLessScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_less(tileCol, value) /** Cellwise less than or equal to value comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localLessEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_less_equal(left, right) /** Cellwise less than or equal to value comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localLessEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_less_equal(tileCol, value) /** Cellwise greater than value comparison between two tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localGreater(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_greater(left, right) /** Cellwise greater than value comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localGreaterScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_greater(tileCol, value) /** Cellwise greater than or equal to value comparison between two tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localGreaterEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_greater_equal(left, right) /** Cellwise greater than or equal to value comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localGreaterEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_greater_equal(tileCol, value) /** Cellwise equal to value comparison between two tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_equal(left, right) /** Cellwise equal to value comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_equal(tileCol, value) /** Cellwise inequality comparison between two tiles. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localUnequal(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_unequal(left, right) /** Cellwise inequality comparison between a tile and a scalar. */ - @deprecated("Part of 0.7.x compatility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") + @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localUnequalScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_unequal(tileCol, value) } diff --git a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala index 934e7687c..1bfaef3c1 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala @@ -103,7 +103,7 @@ class CatalystSerializerSpec extends TestEnvironment with TestData { it("should serialize RasterRef") { val src = RasterSource(remoteCOGSingleband1) - val value = RasterRef(src, Some(src.extent.buffer(-3.0))) + val value = RasterRef(src, 0, Some(src.extent.buffer(-3.0))) assertConsistent(value) assertInvertable(value) } diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala index f1af549fe..b50750fa6 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala @@ -27,6 +27,7 @@ import astraea.spark.rasterframes.expressions.transformers._ import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile import geotrellis.raster.Tile import geotrellis.vector.Extent +import org.apache.spark.sql.Encoders /** * @@ -45,13 +46,14 @@ class RasterRefSpec extends TestEnvironment with TestData { trait Fixture { val src = RasterSource(remoteCOGSingleband1) - val fullRaster = RasterRef(src) + val fullRaster = RasterRef(src, 0, None) val subExtent = sub(src.extent) - val subRaster = RasterRef(src, Option(subExtent)) + val subRaster = RasterRef(src, 0, Some(subExtent)) } import spark.implicits._ + implicit val enc = Encoders.tuple(Encoders.scalaInt, RasterRef.rrEncoder) describe("GetCRS Expression") { it("should read from RasterRef") { new Fixture { @@ -168,7 +170,7 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { import spark.implicits._ val df = Seq(src).toDF("src") - val refs = df.select(RasterSourceToRasterRefs($"src")) + val refs = df.select(RasterSourceToRasterRefs(Some(NOMINAL_TILE_DIMS), Seq(0), $"src")) assert(refs.count() > 1) } } @@ -177,7 +179,7 @@ class RasterRefSpec extends TestEnvironment with TestData { new Fixture { import spark.implicits._ val df = Seq(src).toDF("src") - val refs = df.select(RasterSourceToRasterRefs(Some(NOMINAL_TILE_DIMS), $"src")) + val refs = df.select(RasterSourceToRasterRefs(Some(NOMINAL_TILE_DIMS), Seq(0), $"src")) assert(refs.count() > 1) } } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index 7e05ffa6f..0829a2b48 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -28,17 +28,17 @@ class RasterSourceDataSource extends DataSourceRegister with RelationProvider { import RasterSourceDataSource._ override def shortName(): String = SHORT_NAME override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { - val bandCount = parameters.bandCount + val inexes = parameters.bandIndexes val files = parameters.filePaths val tiling = parameters.tileDims - RasterSourceRelation(sqlContext, files, bandCount, tiling) + RasterSourceRelation(sqlContext, files, inexes, tiling) } } object RasterSourceDataSource { final val SHORT_NAME = "rastersource" final val PATH_PARAM = "path" final val PATHS_PARAM = "paths" - final val BAND_COUNT_PARAM = "bandCount" + final val BAND_INDEXES_PARAM = "bandIndexes" final val TILE_DIMS_PARAM = "tileDimensions" private[rastersource] @@ -59,9 +59,9 @@ object RasterSourceDataSource { .map(_.split(',').map(_.trim.toInt)) .map { case Array(cols, rows) => TileDimensions(cols, rows)} - def bandCount: Int = parameters - .get(BAND_COUNT_PARAM) - .map(_.toInt) - .getOrElse(1) + def bandIndexes: Seq[Int] = parameters + .get(BAND_INDEXES_PARAM) + .map(_.split(',').map(_.trim.toInt).toSeq) + .getOrElse(Seq(0)) } } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala index ec6980500..6491d12fc 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -22,6 +22,7 @@ package astraea.spark.rasterframes.datasource.rastersource import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames import astraea.spark.rasterframes.encoders.CatalystSerializer._ import astraea.spark.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} import astraea.spark.rasterframes.model.TileDimensions @@ -32,31 +33,42 @@ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{Row, SQLContext} -case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], bandCount: Int, subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { - override def schema: StructType = if (bandCount == 1) RasterSourceRelation.schema - else { - val fields = RasterSourceRelation.schema.fields - StructType( - fields.dropRight(1) ++ { - val base = fields.last - for (b <- 1 to bandCount) yield base.copy(name = base.name + "_" + b) - } - ) - } +/** + * Constructs a Spark Relation over one or more RasterSource paths. + * @param sqlContext + * @param paths list of URIs to fetch rastefrom. + * @param bandIndexes band indexes to fetch + * @param subtileDims how big to tile/subdivide rasters info + */ +case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { + + override def schema: StructType = StructType(Seq( + StructField(PATH_COLUMN.columnName, StringType, false) + ) ++ { + val tileSchema = schemaOf[ProjectedRasterTile] + for { + name <- bandNames(bandIndexes) + } yield StructField(name, tileSchema, true) + }) + override def buildScan(): RDD[Row] = { import sqlContext.implicits._ - paths.toDF("path") - .withColumn("__rr", RasterSourceToRasterRefs(subtileDims, URIToRasterSource($"path"))) - .select( - PATH_COLUMN, - RasterRefToTile($"__rr") as TILE_COLUMN.columnName - ) - .rdd + val names = bandNames(bandIndexes) + val refs = RasterSourceToRasterRefs(subtileDims, bandIndexes, URIToRasterSource($"path")) + val refsToTiles = names.map(n => RasterRefToTile($"$n") as n) + + val df = paths.toDF("path") + .select(PATH_COLUMN, refs as names) + .select(PATH_COLUMN +: refsToTiles: _*) + df.rdd } } object RasterSourceRelation { - def schema: StructType = StructType(Seq( - StructField(PATH_COLUMN.columnName, StringType, false), - StructField(TILE_COLUMN.columnName, schemaOf[ProjectedRasterTile], true) - )) + private def bandNames(bandIndexes: Seq[Int]): Seq[String] = bandIndexes match { + case Seq() => Seq.empty + case Seq(0) => Seq(TILE_COLUMN.columnName) + case s => + val basename = TILE_COLUMN.columnName + s.map(n => basename + "_b" + n) + } } diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala index 421d241cf..8219b8f7c 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala @@ -39,10 +39,10 @@ package object rastersource { /** Adds option methods relevant to RasterSourceDataSource. */ implicit class RasterSourceDataFrameReaderHasOptions(val reader: RasterSourceDataFrameReader) { - /** Set the number of bands to provide columns for. */ - def withBandCount(bandCount: Int): RasterSourceDataFrameReader = + /** Set the zero-based band indexes to read. Defaults to Seq(0). */ + def withBandIndexes(bandIndexes: Int*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( - reader.option(RasterSourceDataSource.BAND_COUNT_PARAM, bandCount)) + reader.option(RasterSourceDataSource.BAND_INDEXES_PARAM, bandIndexes.mkString(","))) def withTileDimensions(cols: Int, rows: Int): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 099c501ee..dd4aec09c 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -65,18 +65,34 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { it("should support a multiband schema") { val df = spark.read .rastersource - .withBandCount(3) + .withBandIndexes(0, 1, 2) .load(cogPath.toASCIIString) val tcols = df.tileColumns tcols.length should be(3) - tcols.map(_.columnName) should contain allElementsOf Seq("tile_1", "tile_2", "tile_3") + tcols.map(_.columnName) should contain allElementsOf Seq("tile_b0", "tile_b1", "tile_b2") + } + it("should read a multiband file") { + val df = spark.read + .rastersource + .withBandIndexes(0, 1, 2) + .load(cogPath.toASCIIString) + .cache() + df.schema.size should be (4) + // Test (roughly) we have three distinct but compabible bands + val stats = df.agg(agg_stats($"tile_b0") as "s0", agg_stats($"tile_b1") as "s1", agg_stats($"tile_b2") as "s2") + stats.select($"s0.data_cells" === $"s1.data_cells").as[Boolean].first() should be(true) + stats.select($"s0.data_cells" === $"s2.data_cells").as[Boolean].first() should be(true) + stats.select($"s0.mean" =!= $"s1.mean").as[Boolean].first() should be(true) + stats.select($"s0.mean" =!= $"s2.mean").as[Boolean].first() should be(true) } it("should read a single file") { val df = spark.read.rastersource .withTileDimensions(128, 128) .load(l8samplePath.toASCIIString) df.count() should be(4) - df.select(tile_dimensions($"tile")).show(false) + df.select(tile_dimensions($"tile").as[TileDimensions]).collect() should contain allElementsOf + Seq(TileDimensions(128, 128), TileDimensions(59, 128), TileDimensions(128, 42), TileDimensions(59, 42)) + df.select("path").distinct().count() should be(1) } it("should read a multiple files with one band") { @@ -84,8 +100,24 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { .from(Seq(cogPath, l8samplePath, nonCogPath)) .withTileDimensions(128, 128) .load() - df.printSchema() - df.show(false) + df.select("path").distinct().count() should be(3) + df.schema.size should be(2) + } + + it("should read a multiple files with heterogeneous bands") { + val df = spark.read.rastersource + .from(Seq(cogPath, l8samplePath, nonCogPath)) + .withTileDimensions(128, 128) + .withBandIndexes(0, 1, 2, 3) + .load() + .cache() + df.select("path").distinct().count() should be(3) + df.schema.size should be(5) + + df.select($"tile_b0").count() should be (df.select($"tile_b0").na.drop.count()) + df.select($"tile_b1").na.drop.count() shouldBe <(df.count()) + df.select($"tile_b1").na.drop.count() should be (df.select($"tile_b2").na.drop.count()) + df.select($"tile_b3").na.drop.count() should be (0) } } } diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala index 245b560c9..8ad088075 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -99,10 +99,10 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[F val nonTile = other.map(col) val df = { + val dims = if (useTiling) Some(NOMINAL_TILE_DIMS) else None + val sources = bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)) // NB: We assume that `nativeTiling` preserves the band names. - val expanded = RasterSourceToRasterRefs( - if (useTiling) Some(NOMINAL_TILE_DIMS) else None, - bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)): _*) + val expanded = RasterSourceToRasterRefs(dims, Seq(0), sources: _*) filtered.select(nonTile :+ expanded: _*) } From 23107da950b57746bd4c45a771218b8b4216129a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 16 Apr 2019 16:50:04 -0400 Subject: [PATCH 040/380] Fixed bug in selecting "notTileColumns". --- core/src/main/resources/reference.conf | 6 +++--- .../spark/rasterframes/extensions/DataFrameMethods.scala | 2 +- .../scala/astraea/spark/rasterframes/RasterFrameSpec.scala | 5 ++++- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index 896bbc435..a73c761ee 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -1,6 +1,6 @@ rasterframes { - nominal-tile-size: 256 - prefer-gdal: false + nominal-tile-size = 256 + prefer-gdal = false } gdal { @@ -10,6 +10,6 @@ gdal { CPL_DEBUG = "OFF" } // set this to `false` if CPL_DEBUG is `ON` - useExceptions: true + useExceptions = true } } \ No newline at end of file diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala index b8bad84ea..ae514396b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala @@ -91,7 +91,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada /** Get the columns that are not of type `Tile` */ def notTileColumns: Seq[Column] = self.schema.fields - .filter(f => DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) + .filter(f => !DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) .map(f ⇒ col(f.name)) /** Get the spatial column. */ diff --git a/core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala index 984da98e7..dcdb7b6e5 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala @@ -180,7 +180,10 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys // Should use left's key column names assert(joined.spatialKeyColumn.columnName === left.spatialKeyColumn.columnName) assert(joined.temporalKeyColumn.map(_.columnName) === left.temporalKeyColumn.map(_.columnName)) - + assert(joined.tileColumns.size === 2) + assert(joined.notTileColumns.size === 2) + assert(joined.tileColumns.toSet === joined.tileColumns.toSet) + assert(joined.tileColumns.toSet !== joined.notTileColumns.toSet) } it("should convert a GeoTiff to RasterFrame") { From 03a39e4d960103a35d3d8743102a15ee28aab946 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 17 Apr 2019 09:48:46 -0400 Subject: [PATCH 041/380] Enabled gdal by default. --- core/src/main/resources/reference.conf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index a73c761ee..bf5ef40ee 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -1,6 +1,6 @@ rasterframes { nominal-tile-size = 256 - prefer-gdal = false + prefer-gdal = true } gdal { From 930a49ee96d00840b6074fbebc5ff9bb0f023eec Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 18 Apr 2019 11:16:28 -0400 Subject: [PATCH 042/380] Switching the datamodel schema to use camel case, matching case class definition, due to the fact that `newMapEncoder` doesn't parameterize over key/value types in a way that allows the encoder to be passed in. Also added test that found extent discrepency between JVM and GDAL readers. --- .../RasterSourceToRasterRefs.scala | 4 +-- .../rasterframes/model/CellContext.scala | 18 +++++----- .../spark/rasterframes/model/Cells.scala | 2 +- .../rasterframes/model/TileDataContext.scala | 6 ++-- .../spark/rasterframes/ref/RasterRef.scala | 2 +- .../spark/rasterframes/ref/RasterSource.scala | 28 ++++++++------- .../rasterframes/tiles/InternalRowTile.scala | 2 +- .../tiles/ProjectedRasterTile.scala | 2 +- .../encoders/CatalystSerializerSpec.scala | 1 + .../rasterframes/ref/GDALvsJVMTest.scala | 36 +++++++++++++++++++ .../rasterframes/ref/RasterSourceSpec.scala | 19 ++++++++++ 11 files changed, 89 insertions(+), 31 deletions(-) create mode 100644 core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index c0a9c31c8..442a1fc23 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -58,9 +58,7 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[ } yield StructField(name, rasterRefSchema, true)) private def band2ref(src: RasterSource, e: Option[Extent])(b: Int): RasterRef = - if (b < src.bandCount) - RasterRef(src, b, e) - else null + if (b < src.bandCount) RasterRef(src, b, e) else null override def eval(input: InternalRow): TraversableOnce[InternalRow] = { try { diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala b/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala index efc632c0b..84a723686 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala @@ -25,20 +25,20 @@ import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{ShortType, StructField, StructType} import CatalystSerializer._ -case class CellContext(tile_context: TileContext, tile_data_context: TileDataContext, col_index: Short, row_index: Short) +case class CellContext(tileContext: TileContext, tileDataContext: TileDataContext, colIndex: Short, rowIndex: Short) object CellContext { implicit val serializer: CatalystSerializer[CellContext] = new CatalystSerializer[CellContext] { override def schema: StructType = StructType(Seq( - StructField("tile_context", schemaOf[TileContext], false), - StructField("tile_data_context", schemaOf[TileDataContext], false), - StructField("col_index", ShortType, false), - StructField("row_index", ShortType, false) + StructField("tileContext", schemaOf[TileContext], false), + StructField("tileDataContext", schemaOf[TileDataContext], false), + StructField("colIndex", ShortType, false), + StructField("rowIndex", ShortType, false) )) override protected def to[R](t: CellContext, io: CatalystSerializer.CatalystIO[R]): R = io.create( - io.to(t.tile_context), - io.to(t.tile_data_context), - t.col_index, - t.row_index + io.to(t.tileContext), + io.to(t.tileDataContext), + t.colIndex, + t.rowIndex ) override protected def from[R](t: R, io: CatalystSerializer.CatalystIO[R]): CellContext = CellContext( io.get[TileContext](t, 0), diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala b/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala index 03500c483..b4ce7509c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala @@ -34,7 +34,7 @@ case class Cells(data: Either[Array[Byte], RasterRef]) { /** Convert cells into either a RasterRefTile or an ArrayTile. */ def toTile(ctx: TileDataContext): Tile = { data.fold( - bytes => ArrayTile.fromBytes(bytes, ctx.cell_type, ctx.dimensions.cols, ctx.dimensions.rows), + bytes => ArrayTile.fromBytes(bytes, ctx.cellType, ctx.dimensions.cols, ctx.dimensions.rows), ref => RasterRefTile(ref) ) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala b/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala index dcba073f6..114b9f620 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala @@ -27,7 +27,7 @@ import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{StructField, StructType} /** Encapsulates all information about a tile aside from actual cell values. */ -case class TileDataContext(cell_type: CellType, dimensions: TileDimensions) +case class TileDataContext(cellType: CellType, dimensions: TileDimensions) object TileDataContext { /** Extracts the TileDataContext from a Tile. */ @@ -41,12 +41,12 @@ object TileDataContext { implicit val serializer: CatalystSerializer[TileDataContext] = new CatalystSerializer[TileDataContext] { override def schema: StructType = StructType(Seq( - StructField("cell_type", schemaOf[CellType], false), + StructField("cellType", schemaOf[CellType], false), StructField("dimensions", schemaOf[TileDimensions], false) )) override protected def to[R](t: TileDataContext, io: CatalystIO[R]): R = io.create( - io.to(t.cell_type), + io.to(t.cellType), io.to(t.dimensions) ) override protected def from[R](t: R, io: CatalystIO[R]): TileDataContext = TileDataContext( diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala index 888f09274..4423900e5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala @@ -78,7 +78,7 @@ object RasterRef extends LazyLogging { val rsType = new RasterSourceUDT() override def schema: StructType = StructType(Seq( StructField("source", rsType, false), - StructField("band_index", IntegerType, false), + StructField("bandIndex", IntegerType, false), StructField("subextent", schemaOf[Extent], true) )) diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala index 45e708206..0f70f7b38 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala @@ -101,18 +101,18 @@ object RasterSource extends LazyLogging { } def apply(source: URI): RasterSource = source match { - case IsGDAL() => GDALRasterSource(source) + case IsGDAL() => GDALRasterSource(source) case IsHadoopGeoTiff() => // TODO: How can we get the active hadoop configuration // TODO: without having to pass it through? val config = () => new Configuration() HadoopGeoTiffRasterSource(source, config) - case IsDefaultGeoTiff() => - DelegatingRasterSource(source, () => GeoTiffRasterSource(source.toASCIIString)) - case s => throw new UnsupportedOperationException(s"Reading '$s' not supported") + case IsDefaultGeoTiff() => JVMGeoTiffRasterSource(source) + case s => throw new UnsupportedOperationException(s"Reading '$s' not supported") } object IsGDAL { + /** Determine if we should prefer GDAL for all types. */ private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") @transient @@ -127,7 +127,7 @@ object RasterSource extends LazyLogging { val gdalOnlyExtensions = Seq(".jp2", ".mrf", ".hdf") def gdalOnly(source: URI): Boolean = - if(gdalOnlyExtensions.exists(source.getPath.toLowerCase.endsWith)) { + if (gdalOnlyExtensions.exists(source.getPath.toLowerCase.endsWith)) { require(hasGDAL, s"Can only read $source if GDAL is available") true } else false @@ -174,7 +174,8 @@ object RasterSource extends LazyLogging { info.crs, info.tags, info.bandCount, - info.noDataValue) + info.noDataValue + ) } trait URIRasterSource { _: RasterSource => @@ -186,14 +187,14 @@ object RasterSource extends LazyLogging { } /** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ - case class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRasterSource) extends RasterSource with URIRasterSource { + abstract class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRasterSource) extends RasterSource with URIRasterSource { @transient lazy val delegate = delegateBuilder() // Bad, bad, bad? override def equals(obj: Any): Boolean = obj match { case drs: DelegatingRasterSource => drs.source == source - case _ => false + case _ => false } override def hashCode(): Int = source.hashCode() @@ -226,13 +227,17 @@ object RasterSource extends LazyLogging { override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = delegate.readBounds(bounds, bands) override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = - delegate.read(bounds, bands) + delegate + .read(bounds, bands) .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) override def read(extent: Extent, bands: Seq[Int]): Raster[MultibandTile] = - delegate.read(extent, bands) + delegate + .read(extent, bands) .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) } + case class JVMGeoTiffRasterSource(source: URI) extends DelegatingRasterSource(source, () => GeoTiffRasterSource(source.toASCIIString)) + case class InMemoryRasterSource(tile: Tile, extent: Extent, crs: CRS) extends RasterSource { def this(prt: ProjectedRasterTile) = this(prt, prt.extent, prt.crs) @@ -246,8 +251,7 @@ object RasterSource extends LazyLogging { override def tags: Tags = EMPTY_TAGS - override protected def readBounds( - bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { bounds .map(b => { val subext = rasterExtent.extentFor(b) diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala b/core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala index 021f0946a..4dd5c9248 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala @@ -64,7 +64,7 @@ class InternalRowTile(val mem: InternalRow) extends DelegatingTile { /** Retrieve the cell type from the internal encoding. */ - override def cellType: CellType = cellContext.cell_type + override def cellType: CellType = cellContext.cellType /** Retrieve the number of columns from the internal encoding. */ override def cols: Int = cellContext.dimensions.cols diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala index 35ee3a387..4893f667f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala @@ -64,7 +64,7 @@ object ProjectedRasterTile { implicit val serializer: CatalystSerializer[ProjectedRasterTile] = new CatalystSerializer[ProjectedRasterTile] { override def schema: StructType = StructType(Seq( - StructField("tile_context", schemaOf[TileContext], false), + StructField("tileContext", schemaOf[TileContext], false), StructField("tile", TileType, false)) ) diff --git a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala index 1bfaef3c1..ad285b94a 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala @@ -102,6 +102,7 @@ class CatalystSerializerSpec extends TestEnvironment with TestData { } it("should serialize RasterRef") { + // TODO: Decide if RasterRef should be encoded 'flat', non-'flat', or depends val src = RasterSource(remoteCOGSingleband1) val value = RasterRef(src, 0, Some(src.extent.buffer(-3.0))) assertConsistent(value) diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala new file mode 100644 index 000000000..24ae1b896 --- /dev/null +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala @@ -0,0 +1,36 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package astraea.spark.rasterframes.ref +import astraea.spark.rasterframes.{TestData, TestEnvironment} +import geotrellis.contrib.vlm.gdal.GDALRasterSource +import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource + +class GDALvsJVMTest extends TestEnvironment with TestData { + describe("GDAL RasterSource vs JVM RasterSource") { + it("should compute the same extent") { + val imgPath = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI.getPath + val jvm = GeoTiffRasterSource(imgPath) + val gdal = GDALRasterSource(imgPath) + gdal.extent should be (jvm.extent) + } + } +} diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 60fac1206..0532894d7 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -22,6 +22,7 @@ package astraea.spark.rasterframes.ref import astraea.spark.rasterframes.model.TileDimensions +import astraea.spark.rasterframes.ref.RasterSource.{GDALRasterSource, JVMGeoTiffRasterSource} import astraea.spark.rasterframes.{TestData, TestEnvironment} import geotrellis.vector.Extent import org.apache.spark.sql.rf.RasterSourceUDT @@ -108,6 +109,24 @@ class RasterSourceSpec extends TestEnvironment with TestData { assert(!src.extent.isEmpty) } } + describe("GDAL Rastersource") { + val gdal = GDALRasterSource(l8samplePath) + val jvm = JVMGeoTiffRasterSource(l8samplePath) + it("should compute the same metadata as JVM RasterSource") { + + gdal.cellType should be (jvm.cellType) + + } + it("should compute the same dimensions as JVM RasterSource") { + val dims = TileDimensions(128, 128) + gdal.extent should be (jvm.extent) + gdal.rasterExtent should be (jvm.rasterExtent) + gdal.cellSize should be (jvm.cellSize) + gdal.layoutBounds(dims) should contain allElementsOf jvm.layoutBounds(dims) + gdal.layoutExtents(dims) should contain allElementsOf jvm.layoutExtents(dims) + + } + } describe("RasterSourceToTiles Expression") { it("should read all tiles") { From 38034c15d3c17102d326491e24cc215246d74fa7 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 22 Apr 2019 16:34:18 -0400 Subject: [PATCH 043/380] Tweaks to tests affected by https://github.com/OSGeo/gdal/issues/1468 --- build.sbt | 4 +-- .../encoders/CatalystSerializer.scala | 2 +- .../rasterframes/ref/GDALvsJVMTest.scala | 36 ------------------- .../rasterframes/ref/RasterSourceSpec.scala | 4 +-- .../RasterSourceDataSourceSpec.scala | 12 ++++--- 5 files changed, 13 insertions(+), 45 deletions(-) delete mode 100644 core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala diff --git a/build.sbt b/build.sbt index 5f195bbca..bcad782de 100644 --- a/build.sbt +++ b/build.sbt @@ -34,8 +34,8 @@ lazy val core = project "org.locationtech.jts" % "jts-core" % "1.16.0", "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "0.10.2", - "com.azavea.geotrellis" %% "geotrellis-contrib-gdal" % "0.10.2", + "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "2.11.0", + "com.azavea.geotrellis" %% "geotrellis-contrib-gdal" % "2.11.0", spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala b/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala index 1e94ebfed..9dae2a0f0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala +++ b/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala @@ -152,6 +152,6 @@ object CatalystSerializer extends StandardSerializers { } implicit class WithFromRow(val r: Row) extends AnyVal { - def to[T >: Null: CatalystSerializer]: T = CatalystSerializer[T].fromRow(r) + def to[T >: Null: CatalystSerializer]: T = if (r == null) null else CatalystSerializer[T].fromRow(r) } } diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala deleted file mode 100644 index 24ae1b896..000000000 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/GDALvsJVMTest.scala +++ /dev/null @@ -1,36 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2019 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package astraea.spark.rasterframes.ref -import astraea.spark.rasterframes.{TestData, TestEnvironment} -import geotrellis.contrib.vlm.gdal.GDALRasterSource -import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource - -class GDALvsJVMTest extends TestEnvironment with TestData { - describe("GDAL RasterSource vs JVM RasterSource") { - it("should compute the same extent") { - val imgPath = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI.getPath - val jvm = GeoTiffRasterSource(imgPath) - val gdal = GDALRasterSource(imgPath) - gdal.extent should be (jvm.extent) - } - } -} diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 0532894d7..127f55be8 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -110,8 +110,8 @@ class RasterSourceSpec extends TestEnvironment with TestData { } } describe("GDAL Rastersource") { - val gdal = GDALRasterSource(l8samplePath) - val jvm = JVMGeoTiffRasterSource(l8samplePath) + val gdal = GDALRasterSource(cogPath) + val jvm = JVMGeoTiffRasterSource(cogPath) it("should compute the same metadata as JVM RasterSource") { gdal.cellType should be (jvm.cellType) diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index dd4aec09c..fe035a84b 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -86,12 +86,16 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { stats.select($"s0.mean" =!= $"s2.mean").as[Boolean].first() should be(true) } it("should read a single file") { + // Image is 1028 x 989 -> 9 x 8 tiles val df = spark.read.rastersource .withTileDimensions(128, 128) - .load(l8samplePath.toASCIIString) - df.count() should be(4) - df.select(tile_dimensions($"tile").as[TileDimensions]).collect() should contain allElementsOf - Seq(TileDimensions(128, 128), TileDimensions(59, 128), TileDimensions(128, 42), TileDimensions(59, 42)) + .load(cogPath.toASCIIString) + + df.count() should be(math.ceil(1028.0 / 128).toInt * math.ceil(989.0 / 128).toInt) + + val dims = df.select(tile_dimensions($"tile").as[TileDimensions]).distinct().collect() + dims should contain allElementsOf + Seq(TileDimensions(4,128), TileDimensions(128,128), TileDimensions(128,93), TileDimensions(4,93)) df.select("path").distinct().count() should be(1) } From 27e348bef3807b3458a3299345b16bcbab931fed Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 22 Apr 2019 17:13:46 -0400 Subject: [PATCH 044/380] Separated out dependency management into separate plugin. --- build.sbt | 21 ++++------- project/RFDependenciesPlugin.scala | 58 ++++++++++++++++++++++++++++++ project/RFProjectPlugin.scala | 14 -------- 3 files changed, 65 insertions(+), 28 deletions(-) create mode 100644 project/RFDependenciesPlugin.scala diff --git a/build.sbt b/build.sbt index bcad782de..296370220 100644 --- a/build.sbt +++ b/build.sbt @@ -1,12 +1,6 @@ -import sbt.Keys.resolvers addCommandAlias("makeSite", "docs/makeSite") addCommandAlias("console", "datasource/console") -// NB: Make sure to update the Spark version in pyrasterframes/python/setup.py -ThisBuild / rfSparkVersion := "2.3.2" -ThisBuild / rfGeoTrellisVersion := "2.2.0" -ThisBuild / rfGeoMesaVersion := "2.2.1" - lazy val root = project .in(file(".")) .withId("RasterFrames") @@ -28,14 +22,13 @@ lazy val core = project .disablePlugins(SparkPackagePlugin) .settings( moduleName := "rasterframes", - resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis", libraryDependencies ++= Seq( - "com.chuusai" %% "shapeless" % "2.3.2", - "org.locationtech.jts" % "jts-core" % "1.16.0", - "org.locationtech.geomesa" %% "geomesa-z3" % rfGeoMesaVersion.value, - "org.locationtech.geomesa" %% "geomesa-spark-jts" % rfGeoMesaVersion.value exclude("jgridshift", "jgridshift"), - "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "2.11.0", - "com.azavea.geotrellis" %% "geotrellis-contrib-gdal" % "2.11.0", + shapeless, + `jts-core`, + geomesa("z3").value, + geomesa("spark-jts").value, + `geotrellis-contrib-vlm`, + `geotrellis-contrib-gdal`, spark("core").value % Provided, spark("mllib").value % Provided, spark("sql").value % Provided, @@ -46,7 +39,7 @@ lazy val core = project ExclusionRule(organization = "org.scalastic"), ExclusionRule(organization = "org.scalatest") ), - scalaTest + scalatest ), buildInfoKeys ++= Seq[BuildInfoKey]( name, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala new file mode 100644 index 000000000..4ad610cf1 --- /dev/null +++ b/project/RFDependenciesPlugin.scala @@ -0,0 +1,58 @@ + +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +import sbt.Keys.resolvers +import sbt._ + +object RFDependenciesPlugin extends AutoPlugin { + override def trigger: PluginTrigger = allRequirements + object autoImport { + val rfSparkVersion = settingKey[String]("Apache Spark version") + val rfGeoTrellisVersion = settingKey[String]("GeoTrellis version") + val rfGeoMesaVersion = settingKey[String]("GeoMesa version") + + def geotrellis(module: String) = Def.setting { + "org.locationtech.geotrellis" %% s"geotrellis-$module" % rfGeoTrellisVersion.value + } + def spark(module: String) = Def.setting { + "org.apache.spark" %% s"spark-$module" % rfSparkVersion.value + } + def geomesa(module: String) = Def.setting { + "org.locationtech.geomesa" %% s"geomesa-$module" % rfGeoMesaVersion.value + } + + val scalatest = "org.scalatest" %% "scalatest" % "3.0.3" % Test + val shapeless = "com.chuusai" %% "shapeless" % "2.3.2" + val `jts-core` = "org.locationtech.jts" % "jts-core" % "1.16.0" + val `geotrellis-contrib-vlm` = "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "2.11.0" + val `geotrellis-contrib-gdal` = "com.azavea.geotrellis" %% "geotrellis-contrib-gdal" % "2.11.0" + } + import autoImport._ + + override def projectSettings = Seq( + resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis", + // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py + rfSparkVersion := "2.3.2", + rfGeoTrellisVersion := "2.2.0", + rfGeoMesaVersion := "2.2.1" + ) +} diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 455629a67..7ca0e1985 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -10,20 +10,6 @@ import xerial.sbt.Sonatype.autoImport._ object RFProjectPlugin extends AutoPlugin { override def trigger: PluginTrigger = allRequirements override def requires = GitPlugin - object autoImport { - val rfSparkVersion = settingKey[String]("Apache Spark version") - val rfGeoTrellisVersion = settingKey[String]("GeoTrellis version") - val rfGeoMesaVersion = settingKey[String]("GeoMesa version") - - def geotrellis(module: String) = Def.setting { - "org.locationtech.geotrellis" %% s"geotrellis-$module" % rfGeoTrellisVersion.value - } - def spark(module: String) = Def.setting { - "org.apache.spark" %% s"spark-$module" % rfSparkVersion.value - } - - val scalaTest = "org.scalatest" %% "scalatest" % "3.0.3" % Test - } override def projectSettings = Seq( organization := "org.locationtech.rasterframes", From 1b6f23a8e2c7654d24638bf0725f53799d320004 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 23 Apr 2019 15:46:11 -0400 Subject: [PATCH 045/380] Added check to see if GDAL is available before running GDAL-dependent test. --- core/src/main/resources/reference.conf | 7 +++-- .../rasterframes/ref/RasterSourceSpec.scala | 30 +++++++++---------- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index bf5ef40ee..00473ae15 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -3,11 +3,14 @@ rasterframes { prefer-gdal = true } -gdal { +vlm.gdal { settings { options { // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options - CPL_DEBUG = "OFF" + //CPL_DEBUG = "OFF" + AWS_REQUEST_PAYER = "requester" + GDAL_DISABLE_READDIR_ON_OPEN = "YES" + CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.jp2" } // set this to `false` if CPL_DEBUG is `ON` useExceptions = true diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 127f55be8..883184ccd 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -109,22 +109,22 @@ class RasterSourceSpec extends TestEnvironment with TestData { assert(!src.extent.isEmpty) } } - describe("GDAL Rastersource") { - val gdal = GDALRasterSource(cogPath) - val jvm = JVMGeoTiffRasterSource(cogPath) - it("should compute the same metadata as JVM RasterSource") { - - gdal.cellType should be (jvm.cellType) - - } - it("should compute the same dimensions as JVM RasterSource") { - val dims = TileDimensions(128, 128) - gdal.extent should be (jvm.extent) - gdal.rasterExtent should be (jvm.rasterExtent) - gdal.cellSize should be (jvm.cellSize) - gdal.layoutBounds(dims) should contain allElementsOf jvm.layoutBounds(dims) - gdal.layoutExtents(dims) should contain allElementsOf jvm.layoutExtents(dims) + if(RasterSource.IsGDAL.hasGDAL) { + describe("GDAL Rastersource") { + val gdal = GDALRasterSource(cogPath) + val jvm = JVMGeoTiffRasterSource(cogPath) + it("should compute the same metadata as JVM RasterSource") { + gdal.cellType should be(jvm.cellType) + } + it("should compute the same dimensions as JVM RasterSource") { + val dims = TileDimensions(128, 128) + gdal.extent should be(jvm.extent) + gdal.rasterExtent should be(jvm.rasterExtent) + gdal.cellSize should be(jvm.cellSize) + gdal.layoutBounds(dims) should contain allElementsOf jvm.layoutBounds(dims) + gdal.layoutExtents(dims) should contain allElementsOf jvm.layoutExtents(dims) + } } } From 3db1cb12720bf2d6d5746af97d0fb99bf1740aa5 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 23 Apr 2019 20:19:24 -0400 Subject: [PATCH 046/380] Changed root package from `astraea.spark.rasterframes` to `org.locationtech.rasterframes`. --- README.md | 2 +- bench/src/main/resources/log4j.properties | 2 +- .../bench/BinaryTileOpBench.scala | 7 +- .../bench/CatalystSerializerBench.scala | 5 +- .../bench/MultibandRenderBench.scala | 5 +- .../rasterframes/bench/RasterRefBench.scala | 11 +- .../rasterframes/bench/SparkEnv.scala | 8 +- .../bench/StatsComputeBench.scala | 10 +- .../bench/TileAssembleBench.scala | 7 +- .../bench/TileCellScanBench.scala | 8 +- .../rasterframes/bench/TileEncodeBench.scala | 11 +- .../rasterframes/bench/TileExplodeBench.scala | 8 +- .../rasterframes/bench/package.scala | 6 +- build.sbt | 6 +- core/src/it/resources/log4j.properties | 4 +- .../rasterframes/ref/RasterSourceIT.scala | 9 +- .../spark/rasterframes/MetadataKeys.scala | 13 --- .../rules/SpatialUDFSubstitutionRules.scala | 21 ---- .../rasterframes/tiles/DelegatingTile.scala | 109 ------------------ .../spark/sql/rf/FilterTranslator.scala | 5 +- .../apache/spark/sql/rf/RasterSourceUDT.scala | 8 +- .../org/apache/spark/sql/rf/TileUDT.scala | 10 +- .../rasterframes/MetadataKeys.scala | 34 ++++++ .../rasterframes/PairRDDConverter.scala | 25 +++- .../rasterframes/RasterFunctions.scala | 29 ++--- .../rasterframes/StandardColumns.scala | 25 +++- .../rasterframes/encoders/CRSEncoder.scala | 9 +- .../encoders/CatalystSerializer.scala | 6 +- .../encoders/CatalystSerializerEncoder.scala | 3 +- .../encoders/CellTypeEncoder.scala | 6 +- .../encoders/DelegatingSubfieldEncoder.scala | 6 +- .../encoders/EnvelopeEncoder.scala | 23 +++- .../encoders/ProjectedExtentEncoder.scala | 8 +- .../encoders/SparkBasicEncoders.scala | 6 +- .../encoders/StandardEncoders.scala | 11 +- .../encoders/StandardSerializers.scala | 8 +- .../encoders/StringBackedEncoder.scala | 6 +- .../TemporalProjectedExtentEncoder.scala | 8 +- .../encoders/TileLayerMetadataEncoder.scala | 8 +- .../rasterframes/encoders/URIEncoder.scala | 6 +- .../rasterframes/encoders/package.scala | 6 +- .../expressions/BinaryLocalRasterOp.scala | 6 +- .../expressions/BinaryRasterOp.scala | 7 +- .../expressions/DynamicExtractors.scala | 12 +- .../expressions/NullToValue.scala | 3 +- .../expressions/OnCellGridExpression.scala | 6 +- .../expressions/OnTileContextExpression.scala | 8 +- .../expressions/SpatialRelation.scala | 10 +- .../expressions/TileAssembler.scala | 10 +- .../expressions/UnaryLocalRasterOp.scala | 6 +- .../expressions/UnaryRasterAggregate.scala | 5 +- .../expressions/UnaryRasterOp.scala | 7 +- .../expressions/accessors/ExtractTile.scala | 14 +-- .../expressions/accessors/GetCRS.scala | 10 +- .../expressions/accessors/GetCellType.scala | 8 +- .../expressions/accessors/GetDimensions.scala | 8 +- .../expressions/accessors/GetEnvelope.scala | 6 +- .../expressions/accessors/GetExtent.scala | 10 +- .../accessors/GetTileContext.scala | 12 +- .../aggstats/CellCountAggregate.scala | 8 +- .../aggstats/CellMeanAggregate.scala | 8 +- .../aggstats/CellStatsAggregate.scala | 10 +- .../aggstats/HistogramAggregate.scala | 12 +- .../aggstats/LocalCountAggregate.scala | 10 +- .../aggstats/LocalMeanAggregate.scala | 12 +- .../aggstats/LocalStatsAggregate.scala | 12 +- .../aggstats/LocalTileOpAggregate.scala | 12 +- .../expressions/generators/ExplodeTiles.scala | 8 +- .../expressions/localops/Add.scala | 11 +- .../expressions/localops/Divide.scala | 6 +- .../expressions/localops/Equal.scala | 6 +- .../expressions/localops/Exp.scala | 6 +- .../expressions/localops/Greater.scala | 6 +- .../expressions/localops/GreaterEqual.scala | 6 +- .../expressions/localops/Less.scala | 6 +- .../expressions/localops/LessEqual.scala | 6 +- .../expressions/localops/Log.scala | 6 +- .../expressions/localops/Multiply.scala | 6 +- .../localops/NormalizedDifference.scala | 9 +- .../expressions/localops/Resample.scala | 8 +- .../expressions/localops/Round.scala | 6 +- .../expressions/localops/Subtract.scala | 7 +- .../expressions/localops/Unequal.scala | 6 +- .../rasterframes/expressions/package.scala | 22 ++-- .../expressions/tilestats/DataCells.scala | 9 +- .../expressions/tilestats/IsNoDataTile.scala | 9 +- .../expressions/tilestats/NoDataCells.scala | 8 +- .../expressions/tilestats/Sum.scala | 9 +- .../expressions/tilestats/TileHistogram.scala | 9 +- .../expressions/tilestats/TileMax.scala | 8 +- .../expressions/tilestats/TileMean.scala | 8 +- .../expressions/tilestats/TileMin.scala | 8 +- .../expressions/tilestats/TileStats.scala | 9 +- .../transformers/DebugRender.scala | 11 +- .../transformers/ExtentToGeometry.scala | 6 +- .../transformers/GeometryToExtent.scala | 6 +- .../expressions/transformers/Mask.scala | 11 +- .../transformers/RasterRefToTile.scala | 10 +- .../RasterSourceToRasterRefs.scala | 11 +- .../transformers/RasterSourceToTiles.scala | 8 +- .../transformers/ReprojectGeometry.scala | 11 +- .../transformers/SetCellType.scala | 10 +- .../transformers/TileToArrayDouble.scala | 9 +- .../transformers/TileToArrayInt.scala | 9 +- .../transformers/URIToRasterSource.scala | 5 +- .../extensions/ContextRDDMethods.scala | 38 +++--- .../extensions/DataFrameMethods.scala | 50 ++++---- .../rasterframes/extensions/Implicits.scala | 16 +-- .../rasterframes/extensions/KryoMethods.scala | 4 +- .../extensions/MetadataBuilderMethods.scala | 12 +- .../extensions/MetadataMethods.scala | 26 +++-- .../extensions/ProjectedRasterMethods.scala | 28 ++++- .../extensions/RFSpatialColumnMethods.scala | 11 +- .../extensions/RasterFrameMethods.scala | 34 +++--- .../extensions/SQLContextMethods.scala | 8 +- .../extensions/SparkSessionMethods.scala | 8 +- .../rasterframes/functions/package.scala | 30 ++--- .../rasterframes/jts/Implicits.scala | 10 +- .../jts/ReprojectionTransformer.scala | 5 +- .../rasterframes/ml/NoDataFilter.scala | 11 +- .../rasterframes/ml/Parameters.scala | 6 +- .../rasterframes/ml/TileColumnSupport.scala | 5 +- .../rasterframes/ml/TileExploder.scala | 10 +- .../rasterframes/model/CellContext.scala | 5 +- .../rasterframes/model/Cells.scala | 11 +- .../rasterframes/model/LazyCRS.scala | 5 +- .../rasterframes/model/TileContext.scala | 9 +- .../rasterframes/model/TileDataContext.scala | 8 +- .../rasterframes/model/TileDimensions.scala | 6 +- .../rasterframes/rasterframes.scala} | 44 ++++--- .../rasterframes/ref/HttpRangeReader.scala | 26 +++-- .../ref/ProjectedRasterLike.scala | 4 +- .../rasterframes/ref/RasterRef.scala | 11 +- .../rasterframes/ref/RasterSource.scala | 18 +-- .../rules/SpatialFilterPushdownRules.scala | 5 +- .../rasterframes/rules/SpatialFilters.scala | 5 +- .../rules/SpatialRelationReceiver.scala | 5 +- .../rules/SpatialUDFSubstitutionRules.scala | 42 +++++++ .../rasterframes/rules/TemporalFilters.scala | 5 +- .../rasterframes/rules/package.scala | 23 +++- .../rasterframes/stats/CellHistogram.scala | 8 +- .../rasterframes/stats/CellStatistics.scala | 8 +- .../stats/LocalCellStatistics.scala | 3 +- .../rasterframes/tiles/InternalRowTile.scala | 11 +- .../tiles/ProjectedRasterTile.scala | 19 +-- .../rasterframes/util/DataBiasedOp.scala | 2 +- .../util/GeoTiffInfoSupport.scala | 5 +- .../rasterframes/util/KryoSupport.scala | 4 +- .../rasterframes/util/MultibandRender.scala | 5 +- .../rasterframes/util/RFKryoRegistrator.scala | 11 +- .../rasterframes/util/SubdivideSupport.scala | 5 +- .../util/ZeroSevenCompatibilityKit.scala | 25 ++-- .../rasterframes/util/debug/package.scala | 7 +- .../rasterframes/util/package.scala | 8 +- core/src/test/resources/log4j.properties | 4 +- .../rasterframes/ml/TileExploderSpec.scala | 26 ----- .../test/scala/examples/Classification.scala | 5 +- core/src/test/scala/examples/Clustering.scala | 4 +- .../scala/examples/CreatingRasterFrames.scala | 2 +- core/src/test/scala/examples/Exporting.scala | 2 +- .../test/scala/examples/LocalArithmetic.scala | 2 +- core/src/test/scala/examples/Masking.scala | 2 +- core/src/test/scala/examples/MeanValue.scala | 2 +- core/src/test/scala/examples/NDVI.scala | 2 +- core/src/test/scala/examples/Scratch.scala | 2 +- core/src/test/scala/examples/Tour.scala | 4 +- .../rasterframes/ExplodeSpec.scala | 6 +- .../rasterframes/ExtensionMethodSpec.scala | 13 ++- .../rasterframes/GeometryOperationsSpec.scala | 5 +- .../locationtech}/rasterframes/JTSSpec.scala | 8 +- .../rasterframes/MetadataSpec.scala | 23 +++- .../rasterframes/RasterFrameSpec.scala | 25 +++- .../rasterframes/RasterFunctionsSpec.scala | 12 +- .../rasterframes/ReprojectGeometrySpec.scala | 4 +- .../rasterframes/SpatialEncodingSpec.scala | 6 +- .../rasterframes/SpatialKeySpec.scala | 6 +- .../locationtech}/rasterframes/TestData.scala | 11 +- .../rasterframes/TestEnvironment.scala | 15 ++- .../rasterframes/TileAssemblerSpec.scala | 12 +- .../rasterframes/TileStatsSpec.scala | 12 +- .../rasterframes/TileUDTSpec.scala | 12 +- .../encoders/CatalystSerializerSpec.scala | 14 ++- .../rasterframes/encoders/EncodingSpec.scala | 7 +- .../rasterframes/ml/NoDataFilterSpec.scala | 9 +- .../rasterframes/ml/TileExploderSpec.scala | 48 ++++++++ .../rasterframes/ref/RasterRefSpec.scala | 13 ++- .../rasterframes/ref/RasterSourceSpec.scala | 11 +- ...pache.spark.sql.sources.DataSourceRegister | 8 +- .../datasource/DataSourceOptions.scala | 5 +- .../geotiff/GeoTiffCollectionRelation.scala | 13 ++- .../geotiff/GeoTiffDataSource.scala | 12 +- .../datasource/geotiff/GeoTiffRelation.scala | 12 +- .../datasource/geotiff/package.scala | 16 +-- .../geotrellis/GeoTrellisCatalog.scala | 8 +- .../GeoTrellisLayerDataSource.scala | 10 +- .../geotrellis/GeoTrellisRelation.scala | 24 ++-- .../datasource/geotrellis/Layer.scala | 10 +- .../datasource/geotrellis/MergeableData.scala | 6 +- .../geotrellis/TileFeatureSupport.scala | 8 +- .../datasource/geotrellis/package.scala | 24 ++-- .../rasterframes/datasource/package.scala | 6 +- .../rastersource/RasterSourceDataSource.scala | 5 +- .../rastersource/RasterSourceRelation.scala | 16 +-- .../datasource/rastersource/package.scala | 3 +- .../src/test/scala/examples/Creating.scala | 6 +- .../GeoTiffCollectionDataSourceSpec.scala | 8 +- .../geotiff/GeoTiffDataSourceSpec.scala | 9 +- .../geotrellis/GeoTrellisCatalogSpec.scala | 9 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 15 ++- .../geotrellis/TileFeatureSupportSpec.scala | 13 ++- .../RasterSourceDataSourceSpec.scala | 10 +- .../src/it/resources/log4j.properties | 2 +- .../awspds/L8CatalogRelationTest.scala | 6 +- .../datasource/awspds/L8RelationTest.scala | 5 +- .../awspds/MODISCatalogRelationTest.scala | 6 +- ...pache.spark.sql.sources.DataSourceRegister | 8 +- .../datasource/DownloadExpression.scala | 11 +- .../datasource/DownloadSupport.scala | 5 +- .../datasource/ReadTilesExpression.scala | 11 +- .../awspds/CachedDatasetRelation.scala | 6 +- .../awspds/L8CatalogDataSource.scala | 6 +- .../datasource/awspds/L8CatalogRelation.scala | 7 +- .../datasource/awspds/L8DataSource.scala | 5 +- .../datasource/awspds/L8Relation.scala | 21 ++-- .../awspds/MODISCatalogDataSource.scala | 11 +- .../awspds/MODISCatalogRelation.scala | 5 +- .../datasource/awspds/PDSFields.scala | 11 +- .../awspds/ResourceCacheSupport.scala | 9 +- .../datasource/awspds/package.scala | 8 +- .../experimental/datasource/geojson/DOM.scala | 5 +- .../geojson/GeoJsonDataSource.scala | 7 +- .../datasource/geojson/package.scala | 3 +- .../experimental/datasource/package.scala | 5 +- .../geojson/GeoJsonDataSourceTest.scala | 8 +- project/RFDependenciesPlugin.scala | 8 +- project/RFProjectPlugin.scala | 23 ++-- pyrasterframes/python/examples/__init__.py | 2 +- .../python/pyrasterframes/context.py | 2 +- pyrasterframes/python/pyrasterframes/types.py | 4 +- .../python/tests/PyRasterFramesTests.py | 2 +- .../rasterframes/py/PyRFContext.scala | 13 ++- 241 files changed, 1432 insertions(+), 1098 deletions(-) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/BinaryTileOpBench.scala (92%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/CatalystSerializerBench.scala (91%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/MultibandRenderBench.scala (91%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/RasterRefBench.scala (89%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/SparkEnv.scala (90%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/StatsComputeBench.scala (90%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/TileAssembleBench.scala (94%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/TileCellScanBench.scala (91%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/TileEncodeBench.scala (87%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/TileExplodeBench.scala (91%) rename bench/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/bench/package.scala (93%) rename core/src/it/scala/{astraea/spark => org/locationtech}/rasterframes/ref/RasterSourceIT.scala (91%) delete mode 100644 core/src/main/scala/astraea/spark/rasterframes/MetadataKeys.scala delete mode 100644 core/src/main/scala/astraea/spark/rasterframes/rules/SpatialUDFSubstitutionRules.scala delete mode 100644 core/src/main/scala/astraea/spark/rasterframes/tiles/DelegatingTile.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/PairRDDConverter.scala (87%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/RasterFunctions.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/StandardColumns.scala (73%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/CRSEncoder.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/CatalystSerializer.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/CatalystSerializerEncoder.scala (98%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/CellTypeEncoder.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/DelegatingSubfieldEncoder.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/EnvelopeEncoder.scala (64%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/ProjectedExtentEncoder.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/SparkBasicEncoders.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/StandardEncoders.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/StandardSerializers.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/StringBackedEncoder.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/TemporalProjectedExtentEncoder.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/TileLayerMetadataEncoder.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/URIEncoder.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/package.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/BinaryLocalRasterOp.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/BinaryRasterOp.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/DynamicExtractors.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/NullToValue.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/OnCellGridExpression.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/OnTileContextExpression.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/SpatialRelation.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/TileAssembler.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/UnaryLocalRasterOp.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/UnaryRasterAggregate.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/UnaryRasterOp.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/ExtractTile.scala (77%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/GetCRS.scala (82%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/GetCellType.scala (85%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/GetDimensions.scala (84%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/GetEnvelope.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/GetExtent.scala (82%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/accessors/GetTileContext.scala (78%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/CellCountAggregate.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/CellMeanAggregate.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/CellStatsAggregate.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/HistogramAggregate.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/LocalCountAggregate.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/LocalMeanAggregate.scala (85%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/LocalStatsAggregate.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/generators/ExplodeTiles.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Add.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Divide.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Equal.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Exp.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Greater.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/GreaterEqual.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Less.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/LessEqual.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Log.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Multiply.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/NormalizedDifference.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Resample.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Round.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Subtract.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/localops/Unequal.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/package.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/DataCells.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/IsNoDataTile.scala (85%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/NoDataCells.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/Sum.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/TileHistogram.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/TileMax.scala (87%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/TileMean.scala (87%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/TileMin.scala (87%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/tilestats/TileStats.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/DebugRender.scala (88%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/ExtentToGeometry.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/GeometryToExtent.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/Mask.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/RasterRefToTile.scala (85%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/RasterSourceToTiles.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/ReprojectGeometry.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/SetCellType.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/TileToArrayDouble.scala (86%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/TileToArrayInt.scala (83%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/expressions/transformers/URIToRasterSource.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/ContextRDDMethods.scala (70%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/DataFrameMethods.scala (84%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/Implicits.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/KryoMethods.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/MetadataBuilderMethods.scala (83%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/MetadataMethods.scala (57%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/ProjectedRasterMethods.scala (84%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/RFSpatialColumnMethods.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/RasterFrameMethods.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/SQLContextMethods.scala (85%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/extensions/SparkSessionMethods.scala (83%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/functions/package.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/jts/Implicits.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/jts/ReprojectionTransformer.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ml/NoDataFilter.scala (88%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ml/Parameters.scala (89%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ml/TileColumnSupport.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ml/TileExploder.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/model/CellContext.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/model/Cells.scala (88%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/model/LazyCRS.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/model/TileContext.scala (88%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/model/TileDataContext.scala (88%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/model/TileDimensions.scala (90%) rename core/src/main/scala/{astraea/spark/rasterframes/package.scala => org/locationtech/rasterframes/rasterframes.scala} (83%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ref/HttpRangeReader.scala (87%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ref/ProjectedRasterLike.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ref/RasterRef.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/ref/RasterSource.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/rules/SpatialFilterPushdownRules.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/rules/SpatialFilters.scala (90%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/rules/SpatialRelationReceiver.scala (92%) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/rules/TemporalFilters.scala (91%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/rules/package.scala (59%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/stats/CellHistogram.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/stats/CellStatistics.scala (93%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/stats/LocalCellStatistics.scala (94%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/tiles/InternalRowTile.scala (96%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/tiles/ProjectedRasterTile.scala (83%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/DataBiasedOp.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/GeoTiffInfoSupport.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/KryoSupport.scala (95%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/MultibandRender.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/RFKryoRegistrator.scala (81%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/SubdivideSupport.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/ZeroSevenCompatibilityKit.scala (97%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/debug/package.scala (92%) rename core/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/util/package.scala (97%) delete mode 100644 core/src/test/scala/astraea/spark/rasterframes/ml/TileExploderSpec.scala rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/ExplodeSpec.scala (98%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/ExtensionMethodSpec.scala (92%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/GeometryOperationsSpec.scala (95%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/JTSSpec.scala (97%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/MetadataSpec.scala (63%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/RasterFrameSpec.scala (94%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/RasterFunctionsSpec.scala (98%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/ReprojectGeometrySpec.scala (98%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/SpatialEncodingSpec.scala (90%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/SpatialKeySpec.scala (94%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/TestData.scala (97%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/TestEnvironment.scala (91%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/TileAssemblerSpec.scala (94%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/TileStatsSpec.scala (97%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/TileUDTSpec.scala (92%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/CatalystSerializerSpec.scala (90%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/encoders/EncodingSpec.scala (95%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/ml/NoDataFilterSpec.scala (86%) create mode 100644 core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/ref/RasterRefSpec.scala (94%) rename core/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/ref/RasterSourceSpec.scala (94%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/DataSourceOptions.scala (90%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala (87%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotiff/GeoTiffDataSource.scala (95%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotiff/GeoTiffRelation.scala (93%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotiff/package.scala (90%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala (93%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala (95%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala (94%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/Layer.scala (83%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/MergeableData.scala (93%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/TileFeatureSupport.scala (95%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/package.scala (89%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/package.scala (90%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/rastersource/RasterSourceDataSource.scala (94%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/rastersource/RasterSourceRelation.scala (80%) rename datasource/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/rastersource/package.scala (98%) rename datasource/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala (85%) rename datasource/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala (92%) rename datasource/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala (90%) rename datasource/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala (97%) rename datasource/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala (94%) rename datasource/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala (94%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/DownloadExpression.scala (87%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/DownloadSupport.scala (93%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/ReadTilesExpression.scala (94%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala (91%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala (93%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala (92%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/L8DataSource.scala (90%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/L8Relation.scala (88%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala (93%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala (96%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/PDSFields.scala (86%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala (92%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/package.scala (85%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/geojson/DOM.scala (96%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala (95%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/geojson/package.scala (94%) rename experimental/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/package.scala (95%) rename experimental/src/test/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala (90%) rename pyrasterframes/src/main/scala/{astraea/spark => org/locationtech}/rasterframes/py/PyRFContext.scala (95%) diff --git a/README.md b/README.md index f06072f02..f9572feb9 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ Please see the [Getting Started](http://rasterframes.io/getting-started.html) se * [Users' Manual](http://rasterframes.io/) * [API Documentation](http://rasterframes.io/latest/api/index.html) -* [List of available UDFs](http://rasterframes.io/latest/api/index.html#astraea.spark.rasterframes.RasterFunctions) +* [List of available UDFs](http://rasterframes.io/latest/api/index.html#org.locationtech.rasterframes.RasterFunctions) * [RasterFrames Jupyter Notebook Docker Image](https://hub.docker.com/r/s22s/rasterframes-notebooks/) ## Build instruction diff --git a/bench/src/main/resources/log4j.properties b/bench/src/main/resources/log4j.properties index c6ede28bb..9ed1d66ca 100644 --- a/bench/src/main/resources/log4j.properties +++ b/bench/src/main/resources/log4j.properties @@ -36,7 +36,7 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.astraea.spark=DEBUG +log4j.logger.org.locationtech=DEBUG # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support log4j.logger.org.apache.hadoop.hive.metastore.RetryingHMSHandler=FATAL diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/BinaryTileOpBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/BinaryTileOpBench.scala similarity index 92% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/BinaryTileOpBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/BinaryTileOpBench.scala index 133d93356..dce7a7715 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/BinaryTileOpBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/BinaryTileOpBench.scala @@ -19,11 +19,12 @@ * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench + import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes.expressions.localops._ -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes.expressions.localops._ +import org.locationtech.rasterframes._ import geotrellis.raster.Tile import geotrellis.raster.mapalgebra.{local => gt} import org.apache.spark.sql._ diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/CatalystSerializerBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala similarity index 91% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/CatalystSerializerBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala index b4abad9bf..aff447ac4 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/CatalystSerializerBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala @@ -19,15 +19,16 @@ * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes.encoders.{CatalystSerializer, StandardEncoders} +import org.locationtech.rasterframes.encoders.CatalystSerializer import geotrellis.proj4.{CRS, LatLng, Sinusoidal} import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder +import org.locationtech.rasterframes.encoders.{CatalystSerializer, StandardEncoders} import org.openjdk.jmh.annotations._ @BenchmarkMode(Array(Mode.AverageTime)) diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/MultibandRenderBench.scala similarity index 91% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/MultibandRenderBench.scala index 4156af6a7..8636a6a80 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/MultibandRenderBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/MultibandRenderBench.scala @@ -19,10 +19,11 @@ * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench + import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes.util.MultibandRender.Landsat8NaturalColor +import org.locationtech.rasterframes.util.MultibandRender.Landsat8NaturalColor import geotrellis.raster._ import geotrellis.raster.io.geotiff.MultibandGeoTiff import org.apache.commons.io.IOUtils diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala similarity index 89% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala index a2a9104bf..c16875adb 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,16 +19,15 @@ * */ -package astraea.spark.rasterframes.bench - +package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.transformers.RasterSourceToTiles -import astraea.spark.rasterframes.ref.RasterSource +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.transformers.RasterSourceToTiles import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ +import org.locationtech.rasterframes.ref.RasterSource import org.openjdk.jmh.annotations._ /** * diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/SparkEnv.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala similarity index 90% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/SparkEnv.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala index 8b718479a..817b01ef7 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/SparkEnv.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,11 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql.SparkSession import org.openjdk.jmh.annotations.{Level, TearDown} diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/StatsComputeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala similarity index 90% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/StatsComputeBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala index c9aa7eef4..718d19da4 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/StatsComputeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,14 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.stats.CellHistogram +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.stats.CellHistogram import org.apache.spark.sql._ import org.openjdk.jmh.annotations._ diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileAssembleBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala similarity index 94% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/TileAssembleBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala index 8fe31ef0d..66104420a 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileAssembleBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,10 +19,11 @@ * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench + import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster.ByteConstantNoDataCellType import org.apache.spark.sql._ import org.openjdk.jmh.annotations._ diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileCellScanBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala similarity index 91% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/TileCellScanBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala index 64ee8716e..73e7c8889 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileCellScanBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,15 +15,17 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes.tiles.InternalRowTile import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.rf.TileUDT +import org.locationtech.rasterframes.tiles.InternalRowTile import org.openjdk.jmh.annotations._ @BenchmarkMode(Array(Mode.AverageTime)) diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala similarity index 87% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala index 5887aafc5..d0ffd765c 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileEncodeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,19 +15,22 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench import java.net.URI import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile -import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes.ref.RasterRef import geotrellis.raster.Tile import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.openjdk.jmh.annotations._ @BenchmarkMode(Array(Mode.AverageTime)) diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileExplodeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala similarity index 91% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/TileExplodeBench.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala index ebd4f169c..4aba17771 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/TileExplodeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,12 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.bench +package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import org.openjdk.jmh.annotations._ diff --git a/bench/src/main/scala/astraea/spark/rasterframes/bench/package.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala similarity index 93% rename from bench/src/main/scala/astraea/spark/rasterframes/bench/package.scala rename to bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala index 525c86734..dfdc71e3b 100644 --- a/bench/src/main/scala/astraea/spark/rasterframes/bench/package.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import java.net.URI diff --git a/build.sbt b/build.sbt index 296370220..0e21c7f37 100644 --- a/build.sbt +++ b/build.sbt @@ -44,7 +44,7 @@ lazy val core = project buildInfoKeys ++= Seq[BuildInfoKey]( name, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion ), - buildInfoPackage := "astraea.spark.rasterframes", + buildInfoPackage := "org.locationtech.rasterframes", buildInfoObject := "RFBuildInfo", buildInfoOptions := Seq( BuildInfoOption.ToMap, @@ -69,8 +69,8 @@ lazy val datasource = project ), initialCommands in console := (initialCommands in console).value + """ - |import astraea.spark.rasterframes.datasource.geotrellis._ - |import astraea.spark.rasterframes.datasource.geotiff._ + |import org.locationtech.rasterframes.datasource.geotrellis._ + |import org.locationtech.rasterframes.datasource.geotiff._ |""".stripMargin ) diff --git a/core/src/it/resources/log4j.properties b/core/src/it/resources/log4j.properties index 4a0646435..8a20b7b7e 100644 --- a/core/src/it/resources/log4j.properties +++ b/core/src/it/resources/log4j.properties @@ -37,8 +37,8 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.astraea.spark.rasterframes=DEBUG -log4j.logger.astraea.spark.rasterframes.ref=INFO +log4j.logger.org.locationtech.rasterframes=DEBUG +log4j.logger.org.locationtech.rasterframes.ref=INFO log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala similarity index 91% rename from core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala rename to core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index e32a8caa7..591332a5f 100644 --- a/core/src/it/scala/astraea/spark/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -19,14 +19,15 @@ * */ -package astraea.spark.rasterframes.ref +package org.locationtech.rasterframes.ref import java.net.URI -import astraea.spark.rasterframes -import astraea.spark.rasterframes.util.time -import astraea.spark.rasterframes.{TestData, TestEnvironment} +import org.locationtech.rasterframes.util.time +import org.locationtech.rasterframes.TestData import geotrellis.vector.Extent +import org.locationtech.rasterframes +import org.locationtech.rasterframes.TestEnvironment /** * diff --git a/core/src/main/scala/astraea/spark/rasterframes/MetadataKeys.scala b/core/src/main/scala/astraea/spark/rasterframes/MetadataKeys.scala deleted file mode 100644 index 2b4948798..000000000 --- a/core/src/main/scala/astraea/spark/rasterframes/MetadataKeys.scala +++ /dev/null @@ -1,13 +0,0 @@ -package astraea.spark.rasterframes - -/** - * - * @since 2/19/18 - */ -trait MetadataKeys { - /** Key under which ContextRDD metadata is stored. */ - private[rasterframes] val CONTEXT_METADATA_KEY = "_context" - - /** Key under which RasterFrame role a column plays. */ - private[rasterframes] val SPATIAL_ROLE_KEY = "_stRole" -} diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialUDFSubstitutionRules.scala b/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialUDFSubstitutionRules.scala deleted file mode 100644 index c0f985b0b..000000000 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialUDFSubstitutionRules.scala +++ /dev/null @@ -1,21 +0,0 @@ -package astraea.spark.rasterframes.rules - -import astraea.spark.rasterframes.expressions.SpatialRelation -import org.apache.spark.sql.catalyst.expressions.ScalaUDF -import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan -import org.apache.spark.sql.catalyst.rules.Rule - -/** - * Swaps out spatial relation UDFs for expression forms. - * - * @since 2/19/18 - */ -object SpatialUDFSubstitutionRules extends Rule[LogicalPlan] { - def apply(plan: LogicalPlan): LogicalPlan = { - plan.transform { - case q: LogicalPlan ⇒ q.transformExpressions { - case s: ScalaUDF ⇒ SpatialRelation.fromUDF(s).getOrElse(s) - } - } - } -} diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/DelegatingTile.scala b/core/src/main/scala/astraea/spark/rasterframes/tiles/DelegatingTile.scala deleted file mode 100644 index 8f0a910c7..000000000 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/DelegatingTile.scala +++ /dev/null @@ -1,109 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package astraea.spark.rasterframes.tiles - -import geotrellis.raster._ - -/** - * A tile that wraps another tile. Originally intended for delayed reading, but useful in other special use cases. - * - * @since 8/22/18 - */ -trait DelegatingTile extends Tile { - protected def delegate: Tile - - def cellType: CellType = - delegate.cellType - - def cols: Int = - delegate.cols - - def rows: Int = - delegate.rows - - def mutable: MutableArrayTile = - delegate.mutable - - def convert(cellType: CellType): Tile = - delegate.convert(cellType) - - override def withNoData(noDataValue: Option[Double]): Tile = - delegate.withNoData(noDataValue) - - def interpretAs(newCellType: CellType): Tile = - delegate.interpretAs(newCellType) - - def get(col: Int, row: Int): Int = - delegate.get(col, row) - - def getDouble(col: Int, row: Int): Double = - delegate.getDouble(col, row) - - def toArrayTile(): ArrayTile = - delegate.toArrayTile() - - def toArray(): Array[Int] = - delegate.toArray() - - def toArrayDouble(): Array[Double] = - delegate.toArrayDouble() - - def toBytes(): Array[Byte] = - delegate.toBytes() - - def foreach(f: Int ⇒ Unit): Unit = - delegate.foreach(f) - - def foreachDouble(f: Double ⇒ Unit): Unit = - delegate.foreachDouble(f) - - def map(f: Int ⇒ Int): Tile = - delegate.map(f) - - def combine(r2: Tile)(f: (Int, Int) ⇒ Int): Tile = (delegate, r2) match { - // Hack until https://github.com/locationtech/geotrellis/issues/2792 - case (del: ArrayTile, r2: DelegatingTile) ⇒ del.combine(r2.toArrayTile())(f) - case _ ⇒ delegate.combine(r2)(f) - } - - def combineDouble(r2: Tile)(f: (Double, Double) ⇒ Double): Tile = (delegate, r2) match { - // Hack until https://github.com/locationtech/geotrellis/issues/2792 - case (del: ArrayTile, r2: DelegatingTile) ⇒ del.combineDouble(r2.toArrayTile())(f) - case _ ⇒ delegate.combineDouble(r2)(f) - } - - def mapDouble(f: Double ⇒ Double): Tile = - delegate.mapDouble(f) - - def foreachIntVisitor(visitor: IntTileVisitor): Unit = - delegate.foreachIntVisitor(visitor) - - def foreachDoubleVisitor(visitor: DoubleTileVisitor): Unit = - delegate.foreachDoubleVisitor(visitor) - - def mapIntMapper(mapper: IntTileMapper): Tile = - delegate.mapIntMapper(mapper) - - def mapDoubleMapper(mapper: DoubleTileMapper): Tile = - delegate.mapDoubleMapper(mapper) - -} diff --git a/core/src/main/scala/org/apache/spark/sql/rf/FilterTranslator.scala b/core/src/main/scala/org/apache/spark/sql/rf/FilterTranslator.scala index edecc44b5..6433ef8d3 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/FilterTranslator.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/FilterTranslator.scala @@ -19,8 +19,8 @@ package org.apache.spark.sql.rf import java.sql.{Date, Timestamp} -import astraea.spark.rasterframes.expressions.SpatialRelation.{Contains, Intersects} -import astraea.spark.rasterframes.rules._ +import org.locationtech.rasterframes.expressions.SpatialRelation.{Contains, Intersects} +import org.locationtech.rasterframes.rules._ import org.apache.spark.sql.catalyst.CatalystTypeConverters.{convertToScala, createToScalaConverter} import org.apache.spark.sql.catalyst.expressions import org.apache.spark.sql.catalyst.expressions.{Attribute, EmptyRow, Expression, Literal} @@ -30,6 +30,7 @@ import org.apache.spark.sql.sources.Filter import org.apache.spark.sql.types.{DateType, StringType, TimestampType} import org.apache.spark.unsafe.types.UTF8String import org.locationtech.geomesa.spark.jts.rules.GeometryLiteral +import org.locationtech.rasterframes.rules.{SpatialFilters, TemporalFilters} /** * This is a copy of [[org.apache.spark.sql.execution.datasources.DataSourceStrategy.translateFilter]], modified to add our spatial predicates. diff --git a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala index be61615ce..fba25bf83 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala @@ -23,12 +23,12 @@ package org.apache.spark.sql.rf import java.nio.ByteBuffer -import astraea.spark.rasterframes.encoders.CatalystSerializer -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.ref.RasterSource -import astraea.spark.rasterframes.util.KryoSupport +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.types.{DataType, UDTRegistration, UserDefinedType, _} +import org.locationtech.rasterframes.encoders.CatalystSerializer +import org.locationtech.rasterframes.ref.RasterSource +import org.locationtech.rasterframes.util.KryoSupport /** * Catalyst representation of a RasterSource. diff --git a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala index aa2b24779..64507d578 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala @@ -20,14 +20,14 @@ */ package org.apache.spark.sql.rf - -import astraea.spark.rasterframes.encoders.CatalystSerializer -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.model.{Cells, TileDataContext} -import astraea.spark.rasterframes.tiles.InternalRowTile +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.model.TileDataContext import geotrellis.raster._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.types.{DataType, _} +import org.locationtech.rasterframes.encoders.CatalystSerializer +import org.locationtech.rasterframes.model.{Cells, TileDataContext} +import org.locationtech.rasterframes.tiles.InternalRowTile /** diff --git a/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala b/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala new file mode 100644 index 000000000..c700c30d7 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala @@ -0,0 +1,34 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes + +/** + * + * @since 2/19/18 + */ +trait MetadataKeys { + /** Key under which ContextRDD metadata is stored. */ + private[rasterframes] val CONTEXT_METADATA_KEY = "_context" + + /** Key under which RasterFrame role a column plays. */ + private[rasterframes] val SPATIAL_ROLE_KEY = "_stRole" +} diff --git a/core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala b/core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala similarity index 87% rename from core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala rename to core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala index 6f7f5574c..0b3caf09e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/PairRDDConverter.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala @@ -1,6 +1,27 @@ -package astraea.spark.rasterframes +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ import geotrellis.raster.{MultibandTile, Tile, TileFeature} import geotrellis.spark.{SpaceTimeKey, SpatialKey} import org.apache.spark.rdd.RDD diff --git a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala rename to core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 622d68f14..acd660e95 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,27 +15,28 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes - -import astraea.spark.rasterframes.expressions.TileAssembler -import astraea.spark.rasterframes.expressions.accessors._ -import astraea.spark.rasterframes.expressions.aggstats._ -import astraea.spark.rasterframes.expressions.generators._ -import astraea.spark.rasterframes.expressions.localops._ -import astraea.spark.rasterframes.expressions.tilestats._ -import astraea.spark.rasterframes.expressions.transformers._ -import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics} -import astraea.spark.rasterframes.{functions => F} +package org.locationtech.rasterframes import geotrellis.proj4.CRS import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import geotrellis.raster.{CellType, Tile} import geotrellis.vector.Extent import org.apache.spark.annotation.Experimental -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ +import org.apache.spark.sql.functions.{lit, udf} +import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.jts.geom.{Envelope, Geometry} +import org.locationtech.rasterframes.expressions.TileAssembler +import org.locationtech.rasterframes.expressions.accessors._ +import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.generators._ +import org.locationtech.rasterframes.expressions.localops._ +import org.locationtech.rasterframes.expressions.tilestats._ +import org.locationtech.rasterframes.expressions.transformers._ +import org.locationtech.rasterframes.stats._ +import org.locationtech.rasterframes.{functions => F} /** * UDFs for working with Tiles in Spark DataFrames. diff --git a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala b/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala similarity index 73% rename from core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala rename to core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala index e327e871a..a53415f2a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala @@ -1,14 +1,35 @@ -package astraea.spark.rasterframes +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes import java.sql.Timestamp -import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ import geotrellis.proj4.CRS import geotrellis.raster.Tile import geotrellis.spark.{SpatialKey, TemporalKey} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.functions.col import org.locationtech.jts.geom.{Point => jtsPoint, Polygon => jtsPolygon} +import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ /** * Constants identifying column in most RasterFrames. diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala index d043188cd..235721753 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CRSEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders - -import astraea.spark.rasterframes.model.LazyCRS +package org.locationtech.rasterframes.encoders import geotrellis.proj4.CRS import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder +import org.locationtech.rasterframes.model.LazyCRS /** * Custom encoder for GT `CRS`. diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala index 9dae2a0f0..b9788327b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializer.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,9 +19,9 @@ * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders -import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO +import CatalystSerializer.CatalystIO import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.util.ArrayData diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializerEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializerEncoder.scala similarity index 98% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializerEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializerEncoder.scala index 27e452329..792b74165 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CatalystSerializerEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializerEncoder.scala @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders + import org.apache.spark.sql.catalyst.analysis.GetColumnByOrdinal import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.catalyst.expressions._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala index 41d9a6ec5..0c7a23ed4 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/CellTypeEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import geotrellis.raster.{CellType, DataType} import org.apache.spark.sql.catalyst.ScalaReflection diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/DelegatingSubfieldEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/DelegatingSubfieldEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala index 9b984b8ad..d728521c7 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/DelegatingSubfieldEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import org.apache.spark.sql.catalyst.ScalaReflection import org.apache.spark.sql.catalyst.analysis.{GetColumnByOrdinal, UnresolvedAttribute, UnresolvedExtractValue} diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/EnvelopeEncoder.scala similarity index 64% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/EnvelopeEncoder.scala index 9cc947e49..50d66f3e0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/EnvelopeEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/EnvelopeEncoder.scala @@ -1,4 +1,25 @@ -package astraea.spark.rasterframes.encoders +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.encoders import org.locationtech.jts.geom.Envelope import org.apache.spark.sql.catalyst.ScalaReflection diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/ProjectedExtentEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/ProjectedExtentEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala index 0599f9848..d3d1c7552 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/ProjectedExtentEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,11 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.vector.ProjectedExtent import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/SparkBasicEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/SparkBasicEncoders.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala index 670d2e217..6dbf8b447 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/SparkBasicEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import org.apache.spark.sql.{Encoder, Encoders} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala index d0a11ab78..83eb51c21 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,15 +15,17 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import java.net.URI import java.sql.Timestamp -import astraea.spark.rasterframes.model._ -import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics, LocalCellStatistics} +import org.locationtech.rasterframes.model._ +import org.locationtech.rasterframes.stats.{CellHistogram, CellStatistics, LocalCellStatistics} import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS import geotrellis.raster.{CellSize, CellType, Tile, TileLayout} @@ -32,6 +34,7 @@ import geotrellis.spark.{KeyBounds, SpaceTimeKey, SpatialKey, TemporalKey, Tempo import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.locationtech.geomesa.spark.jts.encoders.SpatialEncoders +import org.locationtech.rasterframes.model.{CellContext, Cells, TileContext, TileDataContext} import scala.reflect.runtime.universe._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala index 5d63f1db5..36830c4c0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala @@ -19,9 +19,9 @@ * */ -package astraea.spark.rasterframes.encoders -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.model.LazyCRS +package org.locationtech.rasterframes.encoders + +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.spark._ @@ -29,6 +29,8 @@ import geotrellis.spark.tiling.LayoutDefinition import geotrellis.vector._ import org.apache.spark.sql.types._ import org.locationtech.jts.geom.Envelope +import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO +import org.locationtech.rasterframes.model.LazyCRS /** Collection of CatalystSerializers for third-party types. */ trait StandardSerializers { diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/StringBackedEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/StringBackedEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala index 8dc950b4b..ebce11784 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/StringBackedEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import org.apache.spark.sql.catalyst.ScalaReflection import org.apache.spark.sql.catalyst.analysis.GetColumnByOrdinal diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala index 310ba8971..22ad3a95f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/TemporalProjectedExtentEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,11 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.spark.TemporalProjectedExtent import org.apache.spark.sql.Encoders import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/TileLayerMetadataEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/TileLayerMetadataEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala index c2ed1bbd4..39f7bce3e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/TileLayerMetadataEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import geotrellis.spark.{KeyBounds, TileLayerMetadata} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder @@ -31,7 +33,7 @@ import scala.reflect.runtime.universe._ * @since 7/21/17 */ object TileLayerMetadataEncoder { - import astraea.spark.rasterframes._ + import org.locationtech.rasterframes._ private def fieldEncoders = Seq[(String, ExpressionEncoder[_])]( "cellType" -> cellTypeEncoder, diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/URIEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/URIEncoder.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala index d50cd7803..0d603478e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/URIEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import java.net.URI diff --git a/core/src/main/scala/astraea/spark/rasterframes/encoders/package.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/encoders/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala index 678bbfcd1..3992667ef 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/encoders/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import org.apache.spark.sql.Column import org.apache.spark.sql.catalyst.expressions.Literal diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/BinaryLocalRasterOp.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/BinaryLocalRasterOp.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/BinaryLocalRasterOp.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/BinaryLocalRasterOp.scala index 3fac44c65..bd55345fa 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/BinaryLocalRasterOp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/BinaryLocalRasterOp.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.DynamicExtractors._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.DynamicExtractors._ import com.typesafe.scalalogging.LazyLogging import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.analysis.TypeCheckResult diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/BinaryRasterOp.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/BinaryRasterOp.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/BinaryRasterOp.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/BinaryRasterOp.scala index 02f8fc29e..690658064 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/BinaryRasterOp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/BinaryRasterOp.scala @@ -19,9 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions -import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor -import astraea.spark.rasterframes.encoders.CatalystSerializer._ +package org.locationtech.rasterframes.expressions + +import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import com.typesafe.scalalogging.LazyLogging import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.analysis.TypeCheckResult diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala index 8c5a8991d..1f263dcea 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala @@ -19,16 +19,18 @@ * */ -package astraea.spark.rasterframes.expressions -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.ref.{ProjectedRasterLike, RasterRef, RasterSource} -import astraea.spark.rasterframes.tiles.ProjectedRasterTile +package org.locationtech.rasterframes.expressions + +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.ref.{ProjectedRasterLike, RasterRef} import geotrellis.raster.{CellGrid, Tile} import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.rf.{TileUDT, _} import org.apache.spark.sql.types._ +import org.locationtech.rasterframes.model.TileContext +import org.locationtech.rasterframes.ref.{ProjectedRasterLike, RasterRef, RasterSource} +import org.locationtech.rasterframes.tiles.ProjectedRasterTile private[rasterframes] object DynamicExtractors { diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/NullToValue.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/NullToValue.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/NullToValue.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/NullToValue.scala index edc52fcf7..8bc98c1e2 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/NullToValue.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/NullToValue.scala @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions + import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.UnaryExpression diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/OnCellGridExpression.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/OnCellGridExpression.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala index b856ae2be..ec2489ed2 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/OnCellGridExpression.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,9 +19,9 @@ * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions -import astraea.spark.rasterframes.expressions.DynamicExtractors._ +import org.locationtech.rasterframes.expressions.DynamicExtractors._ import geotrellis.raster.CellGrid import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.analysis.TypeCheckResult diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/OnTileContextExpression.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/OnTileContextExpression.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala index a8797ae49..92044348a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/OnTileContextExpression.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,14 +19,14 @@ * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions -import astraea.spark.rasterframes.expressions.DynamicExtractors._ -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.expressions.DynamicExtractors._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.analysis.TypeCheckResult import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.{TypeCheckFailure, TypeCheckSuccess} import org.apache.spark.sql.catalyst.expressions.UnaryExpression +import org.locationtech.rasterframes.model.TileContext /** * Implements boilerplate for subtype expressions processing TileUDT (when ProjectedRasterTile), RasterSourceUDT, and diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala index db40c8cab..548651aca 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/SpatialRelation.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,12 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.SpatialRelation.RelationPredicate +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.SpatialRelation.RelationPredicate import geotrellis.vector.Extent import org.locationtech.jts.geom._ import org.apache.spark.sql.catalyst.InternalRow diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala index 1f4ef5b0e..fe284546a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/TileAssembler.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala @@ -19,12 +19,12 @@ * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions import java.nio.ByteBuffer -import astraea.spark.rasterframes.expressions.TileAssembler.TileBuffer -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.expressions.TileAssembler.TileBuffer +import org.locationtech.rasterframes.util._ import geotrellis.raster.{DataType => _, _} import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.aggregate.{ImperativeAggregate, TypedImperativeAggregate} @@ -32,7 +32,7 @@ import org.apache.spark.sql.catalyst.expressions.{Expression, ImplicitCastInputT import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} import spire.syntax.cfor._ -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.TileType /** * Aggregator for reassembling tiles from from exploded form @@ -125,7 +125,7 @@ case class TileAssembler( } object TileAssembler { - import astraea.spark.rasterframes.encoders.StandardEncoders._ + import org.locationtech.rasterframes.encoders.StandardEncoders._ def apply( columnIndex: Column, diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryLocalRasterOp.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryLocalRasterOp.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryLocalRasterOp.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryLocalRasterOp.scala index 049e6d9a1..46969c226 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryLocalRasterOp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryLocalRasterOp.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions +package org.locationtech.rasterframes.expressions -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.DynamicExtractors._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.DynamicExtractors._ import com.typesafe.scalalogging.LazyLogging import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.analysis.TypeCheckResult diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryRasterAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryRasterAggregate.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryRasterAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryRasterAggregate.scala index a28ae6753..cfea46ebe 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryRasterAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryRasterAggregate.scala @@ -19,8 +19,9 @@ * */ -package astraea.spark.rasterframes.expressions -import astraea.spark.rasterframes.expressions.DynamicExtractors.rowTileExtractor +package org.locationtech.rasterframes.expressions + +import org.locationtech.rasterframes.expressions.DynamicExtractors.rowTileExtractor import geotrellis.raster.Tile import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.expressions.{Expression, ScalaUDF} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryRasterOp.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryRasterOp.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryRasterOp.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryRasterOp.scala index f21dc4bb5..8d2b532c8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/UnaryRasterOp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/UnaryRasterOp.scala @@ -19,13 +19,14 @@ * */ -package astraea.spark.rasterframes.expressions -import astraea.spark.rasterframes.expressions.DynamicExtractors._ -import astraea.spark.rasterframes.model.TileContext +package org.locationtech.rasterframes.expressions + +import org.locationtech.rasterframes.expressions.DynamicExtractors._ import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.analysis.TypeCheckResult import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.{TypeCheckFailure, TypeCheckSuccess} import org.apache.spark.sql.catalyst.expressions.UnaryExpression +import org.locationtech.rasterframes.model.TileContext /** Boilerplate for expressions operating on a single Tile-like . */ trait UnaryRasterOp extends UnaryExpression { diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/ExtractTile.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala similarity index 77% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/ExtractTile.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala index 7cb7ba3b1..cc01b1f8f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/ExtractTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala @@ -19,19 +19,19 @@ * */ -package astraea.spark.rasterframes.expressions.accessors +package org.locationtech.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.tiles.InternalRowTile -import astraea.spark.rasterframes.tiles.ProjectedRasterTile.ConcreteProjectedRasterTile +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.tiles.ProjectedRasterTile.ConcreteProjectedRasterTile import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.Expression import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext +import org.locationtech.rasterframes.tiles.InternalRowTile /** Expression to extract at tile from several types that contain tiles.*/ case class ExtractTile(child: Expression) extends UnaryRasterOp with CodegenFallback { @@ -47,7 +47,7 @@ case class ExtractTile(child: Expression) extends UnaryRasterOp with CodegenFall } object ExtractTile { - import astraea.spark.rasterframes.encoders.StandardEncoders.singlebandTileEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.singlebandTileEncoder def apply(input: Column): TypedColumn[Any, Tile] = new Column(new ExtractTile(input.expr)).as[Tile] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala similarity index 82% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala index 9f3e0bfff..1f1a9d926 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala @@ -19,18 +19,18 @@ * */ -package astraea.spark.rasterframes.expressions.accessors +package org.locationtech.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.encoders.StandardEncoders.crsEncoder -import astraea.spark.rasterframes.expressions.OnTileContextExpression -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.StandardEncoders.crsEncoder +import org.locationtech.rasterframes.expressions.OnTileContextExpression import geotrellis.proj4.CRS import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext /** * Expression to extract the CRS out of a RasterRef or ProjectedRasterTile column. diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala similarity index 85% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala index 35f35e7ed..b3debf12d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetCellType.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.accessors +package org.locationtech.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.OnCellGridExpression +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.OnCellGridExpression import geotrellis.raster.{CellGrid, CellType} import org.apache.spark.sql.catalyst.expressions.Expression import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback @@ -43,7 +43,7 @@ case class GetCellType(child: Expression) extends OnCellGridExpression with Code } object GetCellType { - import astraea.spark.rasterframes.encoders.StandardEncoders._ + import org.locationtech.rasterframes.encoders.StandardEncoders._ def apply(col: Column): TypedColumn[Any, CellType] = new Column(new GetCellType(col.expr)).as[CellType] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala similarity index 84% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala index 099e74834..1ba0b5995 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetDimensions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala @@ -19,15 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.accessors +package org.locationtech.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.OnCellGridExpression -import astraea.spark.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.OnCellGridExpression import geotrellis.raster.CellGrid import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.expressions.Expression import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.locationtech.rasterframes.model.TileDimensions /** * Extract a Tile's dimensions diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetEnvelope.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetEnvelope.scala index ce6ef4504..d0c14491b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetEnvelope.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetEnvelope.scala @@ -19,9 +19,8 @@ * */ -package astraea.spark.rasterframes.expressions.accessors +package org.locationtech.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.EnvelopeEncoder import org.locationtech.jts.geom.{Envelope, Geometry} import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback @@ -30,6 +29,7 @@ import org.apache.spark.sql.jts.AbstractGeometryUDT import org.apache.spark.sql.rf._ import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.encoders.EnvelopeEncoder /** * Extracts the bounding box (envelope) of arbitrary JTS Geometry. @@ -60,7 +60,7 @@ case class GetEnvelope(child: Expression) extends UnaryExpression with CodegenFa } object GetEnvelope { - import astraea.spark.rasterframes.encoders.StandardEncoders._ + import org.locationtech.rasterframes.encoders.StandardEncoders._ def apply(col: Column): TypedColumn[Any, Envelope] = new GetEnvelope(col.expr).asColumn.as[Envelope] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala similarity index 82% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala index 653cf06a8..9cfdea016 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetExtent.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala @@ -19,18 +19,18 @@ * */ -package astraea.spark.rasterframes.expressions.accessors +package org.locationtech.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.encoders.StandardEncoders.extentEncoder -import astraea.spark.rasterframes.expressions.OnTileContextExpression -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.StandardEncoders.extentEncoder +import org.locationtech.rasterframes.expressions.OnTileContextExpression import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext /** * Expression to extract the Extent out of a RasterRef or ProjectedRasterTile column. diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetTileContext.scala similarity index 78% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetTileContext.scala index d169a1b93..6c9a3538a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/accessors/GetTileContext.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetTileContext.scala @@ -19,15 +19,17 @@ * */ -package astraea.spark.rasterframes.expressions.accessors -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext +package org.locationtech.rasterframes.expressions.accessors + +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.UnaryRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.Expression import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext case class GetTileContext(child: Expression) extends UnaryRasterOp with CodegenFallback { override def dataType: DataType = schemaOf[TileContext] @@ -38,7 +40,7 @@ case class GetTileContext(child: Expression) extends UnaryRasterOp with CodegenF } object GetTileContext { - import astraea.spark.rasterframes.encoders.StandardEncoders.tileContextEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.tileContextEncoder def apply(input: Column): TypedColumn[Any, TileContext] = new Column(new GetTileContext(input.expr)).as[TileContext] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellCountAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellCountAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala index 0a4424665..84d938973 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellCountAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.expressions.UnaryRasterAggregate -import astraea.spark.rasterframes.expressions.tilestats.{DataCells, NoDataCells} +import org.locationtech.rasterframes.expressions.UnaryRasterAggregate +import org.locationtech.rasterframes.expressions.tilestats.{DataCells, NoDataCells} import org.apache.spark.sql.catalyst.dsl.expressions._ import org.apache.spark.sql.catalyst.expressions.{AttributeReference, Expression, _} import org.apache.spark.sql.types.{LongType, Metadata} @@ -64,7 +64,7 @@ abstract class CellCountAggregate(isData: Boolean) extends UnaryRasterAggregate } object CellCountAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.longEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.longEnc @ExpressionDescription( usage = "_FUNC_(tile) - Count the total data (non-no-data) cells in a tile column.", diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellMeanAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala index 846f169cb..ff89e75ef 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.expressions.UnaryRasterAggregate -import astraea.spark.rasterframes.expressions.tilestats.{DataCells, Sum} +import org.locationtech.rasterframes.expressions.UnaryRasterAggregate +import org.locationtech.rasterframes.expressions.tilestats.{DataCells, Sum} import org.apache.spark.sql.catalyst.dsl.expressions._ import org.apache.spark.sql.catalyst.expressions.{AttributeReference, Expression, _} import org.apache.spark.sql.types.{DoubleType, LongType, Metadata} @@ -79,7 +79,7 @@ case class CellMeanAggregate(child: Expression) extends UnaryRasterAggregate { } object CellMeanAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc /** Computes the column aggregate mean. */ def apply(tile: Column): TypedColumn[Any, Double] = new Column(new CellMeanAggregate(tile.expr).toAggregateExpression()).as[Double] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala index 86e2822b2..96f7c6172 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/CellStatsAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala @@ -19,11 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.expressions.accessors.ExtractTile -import astraea.spark.rasterframes.stats.CellStatistics -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.stats.CellStatistics +import org.locationtech.rasterframes.TileType import geotrellis.raster.{Tile, _} import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, AggregateFunction, AggregateMode, Complete} import org.apache.spark.sql.catalyst.expressions.{ExprId, Expression, ExpressionDescription, NamedExpression} @@ -120,7 +120,7 @@ case class CellStatsAggregate() extends UserDefinedAggregateFunction { } object CellStatsAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.cellStatsEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.cellStatsEncoder def apply(col: Column): TypedColumn[Any, CellStatistics] = new Column(new CellStatsAggregateUDAF(col.expr)) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala index 8e74a8eae..f74c3bb54 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/HistogramAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala @@ -19,13 +19,13 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats import java.nio.ByteBuffer -import astraea.spark.rasterframes.expressions.accessors.ExtractTile -import astraea.spark.rasterframes.functions.safeEval -import astraea.spark.rasterframes.stats.CellHistogram +import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.functions.safeEval +import org.locationtech.rasterframes.stats.CellHistogram import geotrellis.raster.Tile import geotrellis.raster.histogram.{Histogram, StreamingHistogram} import geotrellis.spark.util.KryoSerializer @@ -35,7 +35,7 @@ import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, TypedColumn} -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.TileType /** * Histogram aggregation function for a full column of tiles. @@ -95,7 +95,7 @@ case class HistogramAggregate(numBuckets: Int) extends UserDefinedAggregateFunct } object HistogramAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.cellHistEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.cellHistEncoder def apply(col: Column): TypedColumn[Any, CellHistogram] = new Column(new HistogramAggregateUDAF(col.expr)) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala index 332895b5f..76c73c5a1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalCountAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.expressions.accessors.ExtractTile -import astraea.spark.rasterframes.functions.safeBinaryOp +import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.functions.safeBinaryOp import geotrellis.raster.mapalgebra.local.{Add, Defined, Undefined} import geotrellis.raster.{IntConstantNoDataCellType, Tile} import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, AggregateFunction, AggregateMode, Complete} @@ -31,7 +31,7 @@ import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, Row, TypedColumn} -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.TileType /** * Catalyst aggregate function that counts `NoData` values in a cell-wise fashion. @@ -81,7 +81,7 @@ class LocalCountAggregate(isData: Boolean) extends UserDefinedAggregateFunction override def evaluate(buffer: Row): Tile = buffer.getAs[Tile](0) } object LocalCountAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.singlebandTileEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.singlebandTileEncoder @ExpressionDescription( usage = "_FUNC_(tile) - Compute cell-wise count of non-no-data values." ) diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala similarity index 85% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala index be0722e32..9a127f22d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala @@ -19,17 +19,17 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.expressions.UnaryRasterAggregate -import astraea.spark.rasterframes.expressions.localops.{Add => AddTiles, Divide => DivideTiles} -import astraea.spark.rasterframes.expressions.transformers.SetCellType +import org.locationtech.rasterframes.expressions.UnaryRasterAggregate +import org.locationtech.rasterframes.expressions.localops.{Add => AddTiles, Divide => DivideTiles} +import org.locationtech.rasterframes.expressions.transformers.SetCellType import geotrellis.raster.Tile import geotrellis.raster.mapalgebra.local import org.apache.spark.sql.catalyst.expressions.{AttributeReference, Expression, ExpressionDescription, If, IsNull, Literal} import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.TileType @ExpressionDescription( usage = "_FUNC_(tile) - Computes a new tile contining the mean cell values across all tiles in column.", @@ -73,7 +73,7 @@ case class LocalMeanAggregate(child: Expression) extends UnaryRasterAggregate { override lazy val evaluateExpression: Expression = DivideTiles(sum, count) } object LocalMeanAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.singlebandTileEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.singlebandTileEncoder def apply(tile: Column): TypedColumn[Any, Tile] = new Column(new LocalMeanAggregate(tile.expr).toAggregateExpression()).as[Tile] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala index dbe8a5b3f..387250f55 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalStatsAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala @@ -19,12 +19,12 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.expressions.accessors.ExtractTile -import astraea.spark.rasterframes.functions.safeBinaryOp -import astraea.spark.rasterframes.stats.LocalCellStatistics -import astraea.spark.rasterframes.util.DataBiasedOp.{BiasedAdd, BiasedMax, BiasedMin} +import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.functions.safeBinaryOp +import org.locationtech.rasterframes.stats.LocalCellStatistics +import org.locationtech.rasterframes.util.DataBiasedOp.{BiasedAdd, BiasedMax, BiasedMin} import geotrellis.raster.mapalgebra.local._ import geotrellis.raster.{DoubleConstantNoDataCellType, IntConstantNoDataCellType, IntUserDefinedNoDataCellType, Tile} import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, AggregateFunction, AggregateMode, Complete} @@ -33,7 +33,7 @@ import org.apache.spark.sql.execution.aggregate.ScalaUDAF import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, TypedColumn} -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.TileType /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala index a6a2de5a0..dcfb51881 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala @@ -19,12 +19,12 @@ * */ -package astraea.spark.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggstats -import astraea.spark.rasterframes.TileType -import astraea.spark.rasterframes.expressions.accessors.ExtractTile -import astraea.spark.rasterframes.functions.safeBinaryOp -import astraea.spark.rasterframes.util.DataBiasedOp.{BiasedMax, BiasedMin} +import org.locationtech.rasterframes.TileType +import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.functions.safeBinaryOp +import org.locationtech.rasterframes.util.DataBiasedOp.{BiasedMax, BiasedMin} import geotrellis.raster.Tile import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp import org.apache.spark.sql.catalyst.expressions.aggregate.{AggregateExpression, AggregateFunction, AggregateMode, Complete} @@ -72,7 +72,7 @@ class LocalTileOpAggregate(op: LocalTileBinaryOp) extends UserDefinedAggregateFu } object LocalTileOpAggregate { - import astraea.spark.rasterframes.encoders.StandardEncoders.singlebandTileEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.singlebandTileEncoder @ExpressionDescription( usage = "_FUNC_(tile) - Compute cell-wise minimum value from a tile column." diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/generators/ExplodeTiles.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/generators/ExplodeTiles.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala index e39ca1814..7a5e6539a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/generators/ExplodeTiles.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala @@ -19,11 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.generators +package org.locationtech.rasterframes.expressions.generators -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.util._ import geotrellis.raster._ import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.InternalRow diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala index d516a6723..59bba32f6 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Add.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala @@ -19,18 +19,19 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp -import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor -import astraea.spark.rasterframes.util.DataBiasedOp.BiasedAdd +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor +import org.locationtech.rasterframes.util.DataBiasedOp.BiasedAdd import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.functions.lit import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp @ExpressionDescription( usage = "_FUNC_(tile, rhs) - Performs cell-wise addition between two tiles or a tile and a scalar.", diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Divide.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Divide.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala index 37aa4ab6c..27db49b5c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Divide.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Equal.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Equal.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala index 610b8beff..5d540db3a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Equal.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Exp.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Exp.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala index 40d34ee06..b6d5993fc 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Exp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.{UnaryLocalRasterOp, fpTile} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.{UnaryLocalRasterOp, fpTile} import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Greater.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Greater.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala index f78022972..a9cce3235 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Greater.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala @@ -18,10 +18,10 @@ * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/GreaterEqual.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/GreaterEqual.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala index bf43ceca5..8d363ca62 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/GreaterEqual.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Less.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Less.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala index 4f8d4ad7b..25e053ee8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Less.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala @@ -18,10 +18,10 @@ * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/LessEqual.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/LessEqual.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala index 983ac7c0d..51372c0ac 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/LessEqual.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Log.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Log.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala index e2da78ce1..1130e16a9 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Log.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.{UnaryLocalRasterOp, fpTile} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.{UnaryLocalRasterOp, fpTile} import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Multiply.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Multiply.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala index 7ed7c76b8..fabbcaa7a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Multiply.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/NormalizedDifference.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/NormalizedDifference.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala index 5760582d6..b6894f90d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/NormalizedDifference.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala @@ -19,10 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.localops -import astraea.spark.rasterframes.expressions.fpTile -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryRasterOp +package org.locationtech.rasterframes.expressions.localops + +import org.locationtech.rasterframes.expressions.fpTile +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala index 7925f24a8..2e813a1fa 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Resample.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala @@ -19,11 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp -import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor import geotrellis.raster.Tile import geotrellis.raster.resample.NearestNeighbor import org.apache.spark.sql.catalyst.InternalRow diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Round.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Round.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala index 010666e17..ed04647de 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Round.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.{NullToValue, UnaryLocalRasterOp} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryLocalRasterOp} import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Subtract.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Subtract.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala index 203bb578d..ef7925dd0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Subtract.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala @@ -19,9 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +package org.locationtech.rasterframes.expressions.localops + +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Unequal.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Unequal.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala index f3342b9c6..b21334861 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/localops/Unequal.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.localops +package org.locationtech.rasterframes.expressions.localops -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index b2a44cdd6..f0a7ad653 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,22 +15,26 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes -import astraea.spark.rasterframes.expressions.accessors._ -import astraea.spark.rasterframes.expressions.aggstats._ -import astraea.spark.rasterframes.expressions.generators._ -import astraea.spark.rasterframes.expressions.localops._ -import astraea.spark.rasterframes.expressions.tilestats._ -import astraea.spark.rasterframes.expressions.transformers._ +import org.locationtech.rasterframes.expressions.accessors._ +import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.generators._ +import org.locationtech.rasterframes.expressions.localops._ +import org.locationtech.rasterframes.expressions.tilestats._ +import org.locationtech.rasterframes.expressions.transformers._ import geotrellis.raster.{DoubleConstantNoDataCellType, Tile} import org.apache.spark.sql.catalyst.{InternalRow, ScalaReflection} import org.apache.spark.sql.catalyst.analysis.FunctionRegistry import org.apache.spark.sql.catalyst.expressions.{Expression, ScalaUDF} import org.apache.spark.sql.rf.VersionShims._ import org.apache.spark.sql.{SQLContext, rf} +import org.locationtech.rasterframes.expressions.aggstats.CellCountAggregate.DataCells +import org.locationtech.rasterframes.expressions.localops._ import scala.util.Try import scala.reflect.runtime.universe._ @@ -98,7 +102,7 @@ package object expressions { registry.registerExpression[TileMean]("rf_tile_mean") registry.registerExpression[TileStats]("rf_tile_stats") registry.registerExpression[TileHistogram]("rf_tile_histogram") - registry.registerExpression[CellCountAggregate.DataCells]("rf_agg_data_cells") + registry.registerExpression[DataCells]("rf_agg_data_cells") registry.registerExpression[CellCountAggregate.NoDataCells]("rf_agg_no_data_cells") registry.registerExpression[CellStatsAggregate.CellStatsAggregateUDAF]("rf_agg_stats") registry.registerExpression[HistogramAggregate.HistogramAggregateUDAF]("rf_agg_approx_histogram") diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/DataCells.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/DataCells.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala index a7d49c4ae..f62c88acc 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/DataCells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala @@ -19,14 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.{UnaryRasterOp, NullToValue} -import astraea.spark.rasterframes.model.TileContext +package org.locationtech.rasterframes.expressions.tilestats + +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryRasterOp} import geotrellis.raster._ import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.types.{DataType, LongType} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Counts the number of non-no-data cells in a tile", @@ -46,7 +47,7 @@ case class DataCells(child: Expression) extends UnaryRasterOp override def na: Any = 0L } object DataCells { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.longEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.longEnc def apply(tile: Column): TypedColumn[Any, Long] = new Column(DataCells(tile.expr)).as[Long] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/IsNoDataTile.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala similarity index 85% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/IsNoDataTile.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala index 7b360a07c..08eb0ec76 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/IsNoDataTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala @@ -19,14 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.{NullToValue, UnaryRasterOp} -import astraea.spark.rasterframes.model.TileContext +package org.locationtech.rasterframes.expressions.tilestats + +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryRasterOp} import geotrellis.raster._ import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types.{BooleanType, DataType} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Produces `true` if all the cells in a given tile are no-data", @@ -46,7 +47,7 @@ case class IsNoDataTile(child: Expression) extends UnaryRasterOp override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = tile.isNoDataTile } object IsNoDataTile { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.boolEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.boolEnc def apply(tile: Column): TypedColumn[Any, Boolean] = new Column(IsNoDataTile(tile.expr)).as[Boolean] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/NoDataCells.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/NoDataCells.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala index 89c2ae10b..379af473a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/NoDataCells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala @@ -19,15 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats +package org.locationtech.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.{UnaryRasterOp, NullToValue} -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryRasterOp} import geotrellis.raster._ import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.types.{DataType, LongType} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Counts the number of no-data cells in a tile", @@ -47,7 +47,7 @@ case class NoDataCells(child: Expression) extends UnaryRasterOp override def na: Any = 0L } object NoDataCells { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.longEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.longEnc def apply(tile: Column): TypedColumn[Any, Long] = new Column(NoDataCells(tile.expr)).as[Long] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/Sum.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/Sum.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala index cfa10666b..bac6af716 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/Sum.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala @@ -19,14 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext +package org.locationtech.rasterframes.expressions.tilestats + +import org.locationtech.rasterframes.expressions.UnaryRasterOp import geotrellis.raster._ import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.types.{DataType, DoubleType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Computes the sum of all the cells in a tile..", @@ -45,7 +46,7 @@ case class Sum(child: Expression) extends UnaryRasterOp with CodegenFallback { } object Sum { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc def apply(tile: Column): TypedColumn[Any, Double] = new Column(Sum(tile.expr)).as[Double] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileHistogram.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileHistogram.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala index d7fe7d0c1..4ca25f0c9 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileHistogram.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala @@ -19,17 +19,18 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats +package org.locationtech.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.stats.CellHistogram +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.stats.CellHistogram import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.CatalystTypeConverters import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Computes per-tile histogram.", diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMax.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala similarity index 87% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMax.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala index 0e2595b2a..5f387cb89 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMax.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala @@ -19,15 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats +package org.locationtech.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.{NullToValue, UnaryRasterOp} -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryRasterOp} import geotrellis.raster.{Tile, isData} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types.{DataType, DoubleType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Determines the maximum cell value.", @@ -47,7 +47,7 @@ case class TileMax(child: Expression) extends UnaryRasterOp override def na: Any = Double.MinValue } object TileMax { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc def apply(tile: Column): TypedColumn[Any, Double] = new Column(TileMax(tile.expr)).as[Double] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala similarity index 87% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala index 30d6bc9cd..4bd0ba611 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMean.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala @@ -19,15 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats +package org.locationtech.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.{NullToValue, UnaryRasterOp} -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryRasterOp} import geotrellis.raster.{Tile, isData} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types.{DataType, DoubleType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Computes the mean cell value of a tile.", @@ -47,7 +47,7 @@ case class TileMean(child: Expression) extends UnaryRasterOp override def na: Any = Double.NaN } object TileMean { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc def apply(tile: Column): TypedColumn[Any, Double] = new Column(TileMean(tile.expr)).as[Double] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMin.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala similarity index 87% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMin.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala index 4d2edc9b3..bbc691b4a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileMin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala @@ -19,15 +19,15 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats +package org.locationtech.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.{NullToValue, UnaryRasterOp} -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryRasterOp} import geotrellis.raster.{Tile, isData} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types.{DataType, DoubleType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Determines the minimum cell value.", @@ -47,7 +47,7 @@ case class TileMin(child: Expression) extends UnaryRasterOp override def na: Any = Double.MaxValue } object TileMin { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.doubleEnc def apply(tile: Column): TypedColumn[Any, Double] = new Column(TileMin(tile.expr)).as[Double] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileStats.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileStats.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala index 015f048e8..225fbfcb7 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/tilestats/TileStats.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala @@ -19,17 +19,18 @@ * */ -package astraea.spark.rasterframes.expressions.tilestats +package org.locationtech.rasterframes.expressions.tilestats -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.stats.CellStatistics +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.stats.CellStatistics import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.CatalystTypeConverters import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Computes per-tile descriptive statistics.", diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/DebugRender.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala similarity index 88% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/DebugRender.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala index c26cc6b51..f13551d7e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/DebugRender.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.util.TileAsMatrix +package org.locationtech.rasterframes.expressions.transformers + +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.util.TileAsMatrix import geotrellis.raster.Tile import geotrellis.raster.render.ascii.AsciiArtEncoder import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback @@ -30,6 +30,7 @@ import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescript import org.apache.spark.sql.types.{DataType, StringType} import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.unsafe.types.UTF8String +import org.locationtech.rasterframes.model.TileContext abstract class DebugRender(asciiArt: Boolean) extends UnaryRasterOp with CodegenFallback with Serializable { @@ -45,7 +46,7 @@ abstract class DebugRender(asciiArt: Boolean) extends UnaryRasterOp } object DebugRender { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.stringEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.stringEnc @ExpressionDescription( usage = "_FUNC_(tile) - Coverts the contents of the given tile an ASCII art string rendering", diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala index d57d0c0fd..b02a216ec 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ExtentToGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.row +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.row import org.locationtech.jts.geom.{Envelope, Geometry} import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.analysis.TypeCheckResult diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala index be1f5296b..cac726a8f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/GeometryToExtent.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala @@ -19,9 +19,9 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.analysis.TypeCheckResult import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.{TypeCheckFailure, TypeCheckSuccess} @@ -58,7 +58,7 @@ case class GeometryToExtent(child: Expression) extends UnaryExpression with Code } object GeometryToExtent { - import astraea.spark.rasterframes.encoders.StandardEncoders._ + import org.locationtech.rasterframes.encoders.StandardEncoders._ def apply(bounds: Column): TypedColumn[Any, Extent] = new Column(new GeometryToExtent(bounds.expr)).as[Extent] diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/Mask.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/Mask.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala index 03e81efc2..9fb333838 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/Mask.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala @@ -19,10 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.DynamicExtractors._ -import astraea.spark.rasterframes.expressions.row +package org.locationtech.rasterframes.expressions.transformers + +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.DynamicExtractors._ +import org.locationtech.rasterframes.expressions.row import com.typesafe.scalalogging.LazyLogging import geotrellis.raster import geotrellis.raster.Tile @@ -81,7 +82,7 @@ abstract class Mask(val left: Expression, val middle: Expression, val right: Exp } } object Mask { - import astraea.spark.rasterframes.encoders.StandardEncoders.singlebandTileEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.singlebandTileEncoder @ExpressionDescription( usage = "_FUNC_(target, mask) - Generate a tile with the values from the data tile, but where cells in the masking tile contain NODATA, replace the data value with NODATA.", diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterRefToTile.scala similarity index 85% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterRefToTile.scala index 4a510fb37..f0c82c6de 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterRefToTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterRefToTile.scala @@ -19,18 +19,18 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.row -import astraea.spark.rasterframes.ref.RasterRef -import astraea.spark.rasterframes.tiles.ProjectedRasterTile +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.row import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ExpectsInputTypes, Expression, UnaryExpression} import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Realizes a RasterRef into a Tile. diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index 442a1fc23..0bdfa1ee3 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -19,12 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.InternalRow @@ -33,6 +32,8 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import scala.util.control.NonFatal diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala index 75aa0942f..351c25783 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/RasterSourceToTiles.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala @@ -19,10 +19,10 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.Column import org.apache.spark.sql.catalyst.InternalRow @@ -32,7 +32,7 @@ import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StructField, StructType} import scala.util.control.NonFatal -import astraea.spark.rasterframes.TileType +import org.locationtech.rasterframes.TileType /** * Accepts RasterRef and generates one or more RasterRef instances representing the diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala index 6958d2ab8..42a304bb3 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -19,12 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.encoders.{CatalystSerializer, serialized_literal} -import astraea.spark.rasterframes.jts.ReprojectionTransformer +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.serialized_literal import org.locationtech.jts.geom.Geometry import geotrellis.proj4.CRS import org.apache.spark.sql.catalyst.InternalRow @@ -33,6 +32,8 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.jts.JTSTypes import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.encoders.CatalystSerializer +import org.locationtech.rasterframes.jts.ReprojectionTransformer /** * diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala index d335746eb..772432d1f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/SetCellType.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala @@ -19,12 +19,12 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.encoders.StandardEncoders._ -import astraea.spark.rasterframes.expressions.DynamicExtractors.tileExtractor -import astraea.spark.rasterframes.expressions.row +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.StandardEncoders._ +import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor +import org.locationtech.rasterframes.expressions.row import geotrellis.raster.{CellType, Tile} import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.analysis.TypeCheckResult diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/TileToArrayDouble.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala similarity index 86% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/TileToArrayDouble.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala index 02a4bc4e8..7e3ba0a82 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/TileToArrayDouble.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala @@ -19,15 +19,16 @@ * */ -package astraea.spark.rasterframes.expressions.transformers -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext +package org.locationtech.rasterframes.expressions.transformers + +import org.locationtech.rasterframes.expressions.UnaryRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.util.ArrayData import org.apache.spark.sql.types.{DataType, DataTypes, DoubleType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Coverts the contents of the given tile to an array of double floating-point values", @@ -43,7 +44,7 @@ case class TileToArrayDouble(child: Expression) extends UnaryRasterOp with Codeg } } object TileToArrayDouble { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc def apply(tile: Column): TypedColumn[Any, Array[Double]] = new Column(TileToArrayDouble(tile.expr)).as[Array[Double]] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/TileToArrayInt.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala similarity index 83% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/TileToArrayInt.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala index 31ad81516..3b1c697b3 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/TileToArrayInt.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala @@ -19,16 +19,17 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers -import astraea.spark.rasterframes.expressions.UnaryRasterOp -import astraea.spark.rasterframes.model.TileContext +import org.locationtech.rasterframes.expressions.UnaryRasterOp import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.util.ArrayData import org.apache.spark.sql.types.{DataType, DataTypes, IntegerType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( usage = "_FUNC_(tile) - Coverts the contents of the given tile to an array of integer values", @@ -44,7 +45,7 @@ case class TileToArrayInt(child: Expression) extends UnaryRasterOp with CodegenF } } object TileToArrayInt { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc def apply(tile: Column): TypedColumn[Any, Array[Int]] = new Column(TileToArrayInt(tile.expr)).as[Array[Int]] } diff --git a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala index a10a6db7f..e5bd7904b 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -19,11 +19,11 @@ * */ -package astraea.spark.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.transformers import java.net.URI -import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} +import org.locationtech.rasterframes.ref.RasterRef import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ExpectsInputTypes, Expression, UnaryExpression} @@ -31,6 +31,7 @@ import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StringType} import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.unsafe.types.UTF8String +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala similarity index 70% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala index d291ae9d4..975d26b6a 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/ContextRDDMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala @@ -1,32 +1,38 @@ /* - * Copyright 2017 Astraea, Inc. + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions -import astraea.spark.rasterframes.PairRDDConverter._ -import astraea.spark.rasterframes.StandardColumns._ -import astraea.spark.rasterframes.extensions.Implicits._ -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.{PairRDDConverter, RasterFrame} -import geotrellis.raster.{CellGrid} +import org.locationtech.rasterframes.PairRDDConverter._ +import org.locationtech.rasterframes.StandardColumns._ +import Implicits._ +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.{PairRDDConverter, RasterFrame} +import geotrellis.raster.CellGrid import geotrellis.spark._ import geotrellis.spark.io._ import geotrellis.util.MethodExtensions import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession +import org.locationtech.rasterframes.PairRDDConverter /** * Extension method on `ContextRDD`-shaped RDDs with appropriate context bounds to create a RasterFrame. diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala similarity index 84% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index ae514396b..ad9bc8bf1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -1,24 +1,29 @@ /* - * Copyright 2017 Astraea, Inc. + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions -import astraea.spark.rasterframes.StandardColumns._ -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.{MetadataKeys, RasterFrame} +import org.locationtech.rasterframes.StandardColumns._ +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.RasterFrame import geotrellis.raster.Tile import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} @@ -28,8 +33,9 @@ import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} import spray.json.JsonFormat -import astraea.spark.rasterframes.encoders.StandardEncoders._ -import astraea.spark.rasterframes.expressions.DynamicExtractors +import org.locationtech.rasterframes.encoders.StandardEncoders._ +import org.locationtech.rasterframes.expressions.DynamicExtractors +import org.locationtech.rasterframes.MetadataKeys import scala.util.Try @@ -45,7 +51,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada attr.name == column.columnName || attr.semanticEquals(column.expr) /** Map over the Attribute representation of Columns, modifying the one matching `column` with `op`. */ - private[astraea] def mapColumnAttribute(column: Column, op: Attribute ⇒ Attribute): DF = { + private[rasterframes] def mapColumnAttribute(column: Column, op: Attribute ⇒ Attribute): DF = { val analyzed = self.queryExecution.analyzed.output val selects = selector(column) val attrs = analyzed.map { attr ⇒ @@ -54,31 +60,31 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada self.select(attrs.map(a ⇒ new Column(a)): _*).asInstanceOf[DF] } - private[astraea] def addColumnMetadata(column: Column, op: MetadataBuilder ⇒ MetadataBuilder): DF = { + private[rasterframes] def addColumnMetadata(column: Column, op: MetadataBuilder ⇒ MetadataBuilder): DF = { mapColumnAttribute(column, attr ⇒ { val md = new MetadataBuilder().withMetadata(attr.metadata) attr.withMetadata(op(md).build) }) } - private[astraea] def fetchMetadataValue[D](column: Column, reader: (Attribute) ⇒ D): Option[D] = { + private[rasterframes] def fetchMetadataValue[D](column: Column, reader: (Attribute) ⇒ D): Option[D] = { val analyzed = self.queryExecution.analyzed.output analyzed.find(selector(column)).map(reader) } - private[astraea] + private[rasterframes] def setSpatialColumnRole[K: SpatialComponent: JsonFormat]( column: Column, md: TileLayerMetadata[K]): DF = addColumnMetadata(column, _.attachContext(md.asColumnMetadata).tagSpatialKey ) - private[astraea] + private[rasterframes] def setTemporalColumnRole(column: Column): DF = addColumnMetadata(column, _.tagTemporalKey) /** Get the role tag the column plays in the RasterFrame, if any. */ - private[astraea] + private[rasterframes] def getColumnRole(column: Column): Option[String] = fetchMetadataValue(column, _.metadata.getString(SPATIAL_ROLE_KEY)) @@ -219,5 +225,5 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada /** Internal method for slapping the RasterFreame seal of approval on a DataFrame. * Only call if if you are sure it has a spatial key and tile columns and TileLayerMetadata. */ - private[astraea] def certify = certifyRasterframe(self) + private[rasterframes] def certify = certifyRasterframe(self) } diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala index bd8bb6d1c..d4f3de292 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/Implicits.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,12 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions -import astraea.spark.rasterframes.RasterFrame -import astraea.spark.rasterframes.util.{WithMergeMethods, WithPrototypeMethods} +import org.locationtech.rasterframes.RasterFrame +import org.locationtech.rasterframes.util.{WithMergeMethods, WithPrototypeMethods} import geotrellis.raster._ import geotrellis.spark.{Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.util.MethodExtensions @@ -61,17 +63,17 @@ trait Implicits { val self: RDD[(SpaceTimeKey, T)] with Metadata[TileLayerMetadata[SpaceTimeKey]] )(implicit spark: SparkSession) extends SpatioTemporalContextRDDMethods[T] - private[astraea] + private[rasterframes] implicit class WithMetadataMethods[R: JsonFormat](val self: R) extends MetadataMethods[R] - private[astraea] + private[rasterframes] implicit class WithMetadataAppendMethods(val self: SMetadata) extends MethodExtensions[SMetadata] { def append = new MetadataBuilder().withMetadata(self) } - private[astraea] + private[rasterframes] implicit class WithMetadataBuilderMethods(val self: MetadataBuilder) extends MetadataBuilderMethods } diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/KryoMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/KryoMethods.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/KryoMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/KryoMethods.scala index 52ed69557..7b291d7d6 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/KryoMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/KryoMethods.scala @@ -19,12 +19,12 @@ * */ -package astraea.spark.rasterframes.extensions -import astraea.spark.rasterframes.util.RFKryoRegistrator +package org.locationtech.rasterframes.extensions import geotrellis.util.MethodExtensions import org.apache.spark.SparkConf import org.apache.spark.serializer.KryoSerializer import org.apache.spark.sql.SparkSession +import org.locationtech.rasterframes.util.RFKryoRegistrator object KryoMethods { val kryoProperties = Map("spark.serializer" -> classOf[KryoSerializer].getName, diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/MetadataBuilderMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala similarity index 83% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/MetadataBuilderMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala index 491c30b4d..ba0f78c28 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/MetadataBuilderMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,14 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions -import astraea.spark.rasterframes.{MetadataKeys, StandardColumns} import geotrellis.util.MethodExtensions import org.apache.spark.sql.types.{Metadata, MetadataBuilder} -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.{MetadataKeys, StandardColumns} /** * Convenience to deal with boilerplate associated with adding @@ -30,7 +32,7 @@ import astraea.spark.rasterframes.util._ * * @since 12/21/17 */ -private[astraea] +private[rasterframes] abstract class MetadataBuilderMethods extends MethodExtensions[MetadataBuilder] with MetadataKeys with StandardColumns { def attachContext(md: Metadata) = self.putMetadata(CONTEXT_METADATA_KEY, md) def tagSpatialKey = self.putString(SPATIAL_ROLE_KEY, SPATIAL_KEY_COLUMN.columnName) diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/MetadataMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala similarity index 57% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/MetadataMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala index e1a886e60..18374fade 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/MetadataMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala @@ -1,20 +1,26 @@ /* - * Copyright 2017 Astraea, Inc. + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions + import geotrellis.util.MethodExtensions import spray.json.{JsObject, JsonFormat} import org.apache.spark.sql.types.{Metadata ⇒ SQLMetadata} diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala similarity index 84% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala index df1f6a893..8edf30b14 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/ProjectedRasterMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala @@ -1,15 +1,37 @@ -package astraea.spark.rasterframes.extensions +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.extensions import java.time.ZonedDateTime -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.{PairRDDConverter, RasterFrame, StandardColumns} +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.{RasterFrame, StandardColumns} import geotrellis.raster.{CellGrid, ProjectedRaster} import geotrellis.spark._ import geotrellis.spark.tiling._ import geotrellis.util.MethodExtensions import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession +import org.locationtech.rasterframes.{PairRDDConverter, StandardColumns} import scala.reflect.runtime.universe._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala index 46ee83205..6cdc0cc62 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/RFSpatialColumnMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,12 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.{RasterFrame, StandardColumns} +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.RasterFrame import org.locationtech.jts.geom.Point import geotrellis.proj4.LatLng import geotrellis.spark.SpatialKey @@ -31,6 +33,7 @@ import org.apache.spark.sql.Row import org.apache.spark.sql.functions.{asc, udf => sparkUdf} import org.apache.spark.sql.types.{DoubleType, StructField, StructType} import org.locationtech.geomesa.curve.Z2SFC +import org.locationtech.rasterframes.StandardColumns /** * RasterFrame extension methods associated with adding spatially descriptive columns. diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala index 7e0130010..1338af7c3 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/RasterFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala @@ -1,25 +1,30 @@ /* - * Copyright 2017 Astraea, Inc. + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions import java.time.ZonedDateTime -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.{MetadataKeys, RasterFrame} +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.RasterFrame import geotrellis.proj4.CRS import geotrellis.raster.resample.{NearestNeighbor, ResampleMethod} import geotrellis.raster.{MultibandTile, ProjectedRaster, Tile, TileLayout} @@ -33,9 +38,10 @@ import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.{Metadata, TimestampType} import spray.json._ -import astraea.spark.rasterframes.encoders.StandardEncoders._ -import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import org.locationtech.rasterframes.encoders.StandardEncoders._ +import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ import com.typesafe.scalalogging.LazyLogging +import org.locationtech.rasterframes.MetadataKeys import scala.reflect.runtime.universe._ diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala similarity index 85% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala index f46f7f0e7..a9abb0d80 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/SQLContextMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions import geotrellis.util.MethodExtensions import org.apache.spark.sql.SQLContext @@ -30,7 +32,7 @@ import org.apache.spark.sql.SQLContext */ trait SQLContextMethods extends MethodExtensions[SQLContext] { def withRasterFrames: SQLContext = { - astraea.spark.rasterframes.initRF(self) + org.locationtech.rasterframes.initRF(self) self } } diff --git a/core/src/main/scala/astraea/spark/rasterframes/extensions/SparkSessionMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala similarity index 83% rename from core/src/main/scala/astraea/spark/rasterframes/extensions/SparkSessionMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala index 9447e812e..92bcfd871 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/extensions/SparkSessionMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.extensions +package org.locationtech.rasterframes.extensions import geotrellis.util.MethodExtensions import org.apache.spark.sql.SparkSession @@ -29,7 +31,7 @@ import org.apache.spark.sql.SparkSession */ trait SparkSessionMethods extends MethodExtensions[SparkSession] { def withRasterFrames: SparkSession = { - astraea.spark.rasterframes.initRF(self.sqlContext) + org.locationtech.rasterframes.initRF(self.sqlContext) self } } diff --git a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/functions/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index 6805a99d1..19b2d68c4 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -1,26 +1,30 @@ /* - * Copyright 2017 Astraea, Inc. + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes - -import astraea.spark.rasterframes.jts.ReprojectionTransformer -import astraea.spark.rasterframes.model.LazyCRS +package org.locationtech.rasterframes import geotrellis.raster.{Tile, _} import geotrellis.vector.Extent import org.apache.spark.sql.SQLContext import org.locationtech.jts.geom.Geometry +import org.locationtech.rasterframes.jts.ReprojectionTransformer +import org.locationtech.rasterframes.model.LazyCRS /** * Module utils. diff --git a/core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala b/core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala rename to core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala index 86d4dd73b..51cd4c390 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/jts/Implicits.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,21 +15,23 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.jts +package org.locationtech.rasterframes.jts import java.sql.{Date, Timestamp} import java.time.{LocalDate, ZonedDateTime} -import astraea.spark.rasterframes.expressions.SpatialRelation.{Contains, Intersects} +import org.locationtech.rasterframes.expressions.SpatialRelation.{Contains, Intersects} import org.locationtech.jts.geom._ import geotrellis.util.MethodExtensions import geotrellis.vector.{Point ⇒ gtPoint} import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.sql.functions._ import org.locationtech.geomesa.spark.jts.DataFrameFunctions.SpatialConstructors -import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ /** * Extension methods on typed columns allowing for DSL-like queries over JTS types. diff --git a/core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala b/core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala rename to core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala index 4946001c8..86f5e9345 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/jts/ReprojectionTransformer.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.jts +package org.locationtech.rasterframes.jts import org.locationtech.jts.geom.{CoordinateSequence, Geometry} import org.locationtech.jts.geom.util.GeometryTransformer diff --git a/core/src/main/scala/astraea/spark/rasterframes/ml/NoDataFilter.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala similarity index 88% rename from core/src/main/scala/astraea/spark/rasterframes/ml/NoDataFilter.scala rename to core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala index dfe9499a3..735b3964c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ml/NoDataFilter.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,17 +15,22 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.ml +package org.locationtech.rasterframes.ml -import astraea.spark.rasterframes.ml.Parameters.HasInputCols +import org.locationtech.rasterframes.ml.Parameters.HasInputCols import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} import org.apache.spark.sql.Dataset import org.apache.spark.sql.types.StructType import java.util.ArrayList + +import org.locationtech.rasterframes.ml.Parameters.HasInputCols + import scala.collection.JavaConversions._ /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/ml/Parameters.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala similarity index 89% rename from core/src/main/scala/astraea/spark/rasterframes/ml/Parameters.scala rename to core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala index 4bc2fd476..79e7ef1aa 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ml/Parameters.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.ml +package org.locationtech.rasterframes.ml import org.apache.spark.ml.param.{Params, StringArrayParam} diff --git a/core/src/main/scala/astraea/spark/rasterframes/ml/TileColumnSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/ml/TileColumnSupport.scala rename to core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala index eccc8f00e..1cdeaaa02 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ml/TileColumnSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.ml +package org.locationtech.rasterframes.ml import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{StructField, StructType} diff --git a/core/src/main/scala/astraea/spark/rasterframes/ml/TileExploder.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/ml/TileExploder.scala rename to core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala index d52b82d35..cf53407f1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ml/TileExploder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,18 +15,20 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.ml +package org.locationtech.rasterframes.ml -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.ml.Transformer import org.apache.spark.ml.param.ParamMap import org.apache.spark.ml.util.{DefaultParamsReadable, DefaultParamsWritable, Identifiable} import org.apache.spark.sql.Dataset import org.apache.spark.sql.functions.col import org.apache.spark.sql.types._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ /** * SparkML Transformer for expanding tiles into single cell rows with diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala b/core/src/main/scala/org/locationtech/rasterframes/model/CellContext.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala rename to core/src/main/scala/org/locationtech/rasterframes/model/CellContext.scala index 84a723686..95a2e1bf0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/CellContext.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/CellContext.scala @@ -19,10 +19,11 @@ * */ -package astraea.spark.rasterframes.model -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} +package org.locationtech.rasterframes.model + import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{ShortType, StructField, StructType} +import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import CatalystSerializer._ case class CellContext(tileContext: TileContext, tileDataContext: TileDataContext, colIndex: Short, rowIndex: Short) diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala similarity index 88% rename from core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala rename to core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala index b4ce7509c..1c7840511 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/Cells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala @@ -19,14 +19,15 @@ * */ -package astraea.spark.rasterframes.model -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} -import astraea.spark.rasterframes.ref.RasterRef -import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile +package org.locationtech.rasterframes.model + import geotrellis.raster.{ArrayTile, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{BinaryType, StructField, StructType} -import CatalystSerializer._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} +import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile /** Represents the union of binary cell datas or a reference to the data.*/ case class Cells(data: Either[Array[Byte], RasterRef]) { diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala rename to core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala index 5ff441d09..d01d49317 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/LazyCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala @@ -19,8 +19,9 @@ * */ -package astraea.spark.rasterframes.model -import astraea.spark.rasterframes.model.LazyCRS.EncodedCRS +package org.locationtech.rasterframes.model + +import LazyCRS.EncodedCRS import geotrellis.proj4.CRS import org.locationtech.proj4j.CoordinateReferenceSystem diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala b/core/src/main/scala/org/locationtech/rasterframes/model/TileContext.scala similarity index 88% rename from core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala rename to core/src/main/scala/org/locationtech/rasterframes/model/TileContext.scala index e6d6a5565..912e1d81e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileContext.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/TileContext.scala @@ -19,15 +19,16 @@ * */ -package astraea.spark.rasterframes.model -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} -import astraea.spark.rasterframes.tiles.ProjectedRasterTile +package org.locationtech.rasterframes.model + import geotrellis.proj4.CRS import geotrellis.raster.Tile import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{StructField, StructType} -import CatalystSerializer._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} +import org.locationtech.rasterframes.tiles.ProjectedRasterTile case class TileContext(extent: Extent, crs: CRS) { def toProjectRasterTile(t: Tile): ProjectedRasterTile = ProjectedRasterTile(t, extent, crs) diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala b/core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala similarity index 88% rename from core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala rename to core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala index 114b9f620..bbf49705d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileDataContext.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala @@ -19,12 +19,14 @@ * */ -package astraea.spark.rasterframes.model -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} -import astraea.spark.rasterframes.encoders.CatalystSerializer._ +package org.locationtech.rasterframes.model + +import org.locationtech.rasterframes.encoders.CatalystSerializerEncoder +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.raster.{CellType, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{StructField, StructType} +import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} /** Encapsulates all information about a tile aside from actual cell values. */ case class TileDataContext(cellType: CellType, dimensions: TileDimensions) diff --git a/core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala b/core/src/main/scala/org/locationtech/rasterframes/model/TileDimensions.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala rename to core/src/main/scala/org/locationtech/rasterframes/model/TileDimensions.scala index 0e0e56e51..e419ac668 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/model/TileDimensions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/TileDimensions.scala @@ -19,13 +19,13 @@ * */ -package astraea.spark.rasterframes.model +package org.locationtech.rasterframes.model -import astraea.spark.rasterframes.encoders.CatalystSerializer -import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO +import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO import geotrellis.raster.Grid import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{ShortType, StructField, StructType} +import org.locationtech.rasterframes.encoders.CatalystSerializer /** * Typed wrapper for tile size information. diff --git a/core/src/main/scala/astraea/spark/rasterframes/package.scala b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala similarity index 83% rename from core/src/main/scala/astraea/spark/rasterframes/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala index 34ae94624..83f4917a0 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala @@ -1,46 +1,44 @@ /* - * Copyright 2017 Astraea, Inc. + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark - -import astraea.spark.rasterframes.encoders.StandardEncoders -import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.util.ZeroSevenCompatibilityKit +package org.locationtech import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging import geotrellis.raster.{Tile, TileFeature} import geotrellis.spark.{ContextRDD, Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.rdd.RDD -import org.apache.spark.sql._ import org.apache.spark.sql.rf.TileUDT +import org.apache.spark.sql.{DataFrame, SQLContext, rf} import org.locationtech.geomesa.spark.jts.DataFrameFunctions +import org.locationtech.rasterframes.encoders.StandardEncoders +import org.locationtech.rasterframes.extensions.Implicits +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.util.ZeroSevenCompatibilityKit import shapeless.tag.@@ - import scala.reflect.runtime.universe._ -/** - * Module providing support for RasterFrames. - * `import astraea.spark.rasterframes._`. - * - * @since 7/18/17 - */ package object rasterframes extends StandardColumns with RasterFunctions with ZeroSevenCompatibilityKit.RasterFunctions - with rasterframes.extensions.Implicits + with Implicits with rasterframes.jts.Implicits with StandardEncoders with DataFrameFunctions.Library diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala similarity index 87% rename from core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala rename to core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala index f85f5b398..ed269f20f 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/HttpRangeReader.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala @@ -1,17 +1,22 @@ /* - * Copyright 2016 Azavea + * This software is licensed under the Apache 2 license, quoted below. * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at + * Copyright 2019 Astraea, Inc. * - * http://www.apache.org/licenses/LICENSE-2.0 + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] * * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ // NB: Copied from @@ -19,8 +24,7 @@ // TODO: Submit PR with changes/fixes. //package geotrellis.spark.io.http.util -package astraea.spark.rasterframes.ref - +package org.locationtech.rasterframes.ref import geotrellis.util.RangeReader import scalaj.http.{Http, HttpResponse} diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/ProjectedRasterLike.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/ref/ProjectedRasterLike.scala rename to core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala index 7c5b2729d..f716c2f19 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/ProjectedRasterLike.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,7 +19,7 @@ * */ -package astraea.spark.rasterframes.ref +package org.locationtech.rasterframes.ref import geotrellis.proj4.CRS import geotrellis.raster.CellGrid diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala rename to core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala index 4423900e5..6833b5bf8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,11 +19,8 @@ * */ -package astraea.spark.rasterframes.ref +package org.locationtech.rasterframes.ref -import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} -import astraea.spark.rasterframes.tiles.ProjectedRasterTile import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.raster.{CellType, GridBounds, Tile} @@ -31,7 +28,9 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT import org.apache.spark.sql.types.{IntegerType, StructField, StructType} -import CatalystSerializer._ +import org.locationtech.rasterframes.encoders.CatalystSerializer.{CatalystIO, _} +import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} +import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * A delayed-read projected raster implementation. diff --git a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala rename to core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 0f70f7b38..c266ab1d9 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,18 +15,17 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.ref +package org.locationtech.rasterframes.ref import java.net.URI -import astraea.spark.rasterframes.NOMINAL_TILE_DIMS -import astraea.spark.rasterframes.model.{TileContext, TileDimensions} -import astraea.spark.rasterframes.ref.RasterSource.SINGLEBAND -import astraea.spark.rasterframes.tiles.ProjectedRasterTile -import astraea.spark.rasterframes.util.GeoTiffInfoSupport +import org.locationtech.rasterframes.NOMINAL_TILE_DIMS +import org.locationtech.rasterframes.model.TileDimensions +import RasterSource.SINGLEBAND import com.azavea.gdal.GDALWarp import com.typesafe.scalalogging.LazyLogging import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} @@ -44,6 +43,9 @@ import org.apache.hadoop.fs.Path import org.apache.spark.annotation.Experimental import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT +import org.locationtech.rasterframes.model.{TileContext, TileDimensions} +import org.locationtech.rasterframes.tiles.ProjectedRasterTile +import org.locationtech.rasterframes.util.GeoTiffInfoSupport /** * Abstraction over fetching geospatial raster data. @@ -114,7 +116,7 @@ object RasterSource extends LazyLogging { object IsGDAL { /** Determine if we should prefer GDAL for all types. */ - private val preferGdal: Boolean = astraea.spark.rasterframes.rfConfig.getBoolean("prefer-gdal") + private val preferGdal: Boolean = org.locationtech.rasterframes.rfConfig.getBoolean("prefer-gdal") @transient lazy val hasGDAL: Boolean = try { val _ = new GDALWarp() diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilterPushdownRules.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilterPushdownRules.scala rename to core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala index d61640748..8d5f914bd 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilterPushdownRules.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.rules +package org.locationtech.rasterframes.rules import org.apache.spark.sql.catalyst.plans.logical.{Filter, LogicalPlan} import org.apache.spark.sql.catalyst.rules.Rule diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala similarity index 90% rename from core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala rename to core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala index e2cae5734..8b1c61395 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialFilters.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.rules +package org.locationtech.rasterframes.rules import org.locationtech.jts.geom.Geometry import org.apache.spark.sql.sources.Filter diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialRelationReceiver.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/rules/SpatialRelationReceiver.scala rename to core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala index 36c681d14..b5cc03f43 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/SpatialRelationReceiver.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.rules +package org.locationtech.rasterframes.rules import org.apache.spark.sql.execution.datasources.LogicalRelation import org.apache.spark.sql.sources.{BaseRelation, Filter} diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala new file mode 100644 index 000000000..0407a7a33 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala @@ -0,0 +1,42 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.rules + +import org.locationtech.rasterframes.expressions.SpatialRelation +import org.apache.spark.sql.catalyst.expressions.ScalaUDF +import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan +import org.apache.spark.sql.catalyst.rules.Rule + +/** + * Swaps out spatial relation UDFs for expression forms. + * + * @since 2/19/18 + */ +object SpatialUDFSubstitutionRules extends Rule[LogicalPlan] { + def apply(plan: LogicalPlan): LogicalPlan = { + plan.transform { + case q: LogicalPlan ⇒ q.transformExpressions { + case s: ScalaUDF ⇒ SpatialRelation.fromUDF(s).getOrElse(s) + } + } + } +} diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/TemporalFilters.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala similarity index 91% rename from core/src/main/scala/astraea/spark/rasterframes/rules/TemporalFilters.scala rename to core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala index 51ea9ddd7..cf41c9b54 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/TemporalFilters.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.rules +package org.locationtech.rasterframes.rules import java.sql.{Date, Timestamp} diff --git a/core/src/main/scala/astraea/spark/rasterframes/rules/package.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/package.scala similarity index 59% rename from core/src/main/scala/astraea/spark/rasterframes/rules/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/rules/package.scala index ff4755a86..0f028e14e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/rules/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/package.scala @@ -1,4 +1,25 @@ -package astraea.spark.rasterframes +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes import org.apache.spark.sql.SQLContext import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan diff --git a/core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala b/core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala rename to core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala index c32d6100f..861b3876d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/stats/CellHistogram.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,14 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.stats -import astraea.spark.rasterframes.encoders.StandardEncoders +package org.locationtech.rasterframes.stats + import geotrellis.raster.Tile import geotrellis.raster.histogram.{Histogram => GTHistogram} import org.apache.spark.sql.types._ +import org.locationtech.rasterframes.encoders.StandardEncoders import scala.collection.mutable.{ListBuffer => MutableListBuffer} diff --git a/core/src/main/scala/astraea/spark/rasterframes/stats/CellStatistics.scala b/core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala similarity index 93% rename from core/src/main/scala/astraea/spark/rasterframes/stats/CellStatistics.scala rename to core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala index e1ba03b60..06dec77a3 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/stats/CellStatistics.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.stats -import astraea.spark.rasterframes.encoders.StandardEncoders +package org.locationtech.rasterframes.stats + import geotrellis.raster.Tile import org.apache.spark.sql.types.StructType +import org.locationtech.rasterframes.encoders.StandardEncoders /** * Container for computed statistics over cells. diff --git a/core/src/main/scala/astraea/spark/rasterframes/stats/LocalCellStatistics.scala b/core/src/main/scala/org/locationtech/rasterframes/stats/LocalCellStatistics.scala similarity index 94% rename from core/src/main/scala/astraea/spark/rasterframes/stats/LocalCellStatistics.scala rename to core/src/main/scala/org/locationtech/rasterframes/stats/LocalCellStatistics.scala index 685722f62..39c0671f8 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/stats/LocalCellStatistics.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/stats/LocalCellStatistics.scala @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.stats +package org.locationtech.rasterframes.stats + import geotrellis.raster.Tile case class LocalCellStatistics(count: Tile, min: Tile, max: Tile, mean: Tile, variance: Tile) diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala similarity index 96% rename from core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala rename to core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala index 4dd5c9248..563aaf0e3 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/InternalRowTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,14 +19,15 @@ * */ -package astraea.spark.rasterframes.tiles +package org.locationtech.rasterframes.tiles import java.nio.ByteBuffer -import astraea.spark.rasterframes.encoders.CatalystSerializer.CatalystIO -import astraea.spark.rasterframes.model.{Cells, TileDataContext} -import geotrellis.raster._ +import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO +import org.locationtech.rasterframes.model.TileDataContext +import geotrellis.raster.{DelegatingTile, _} import org.apache.spark.sql.catalyst.InternalRow +import org.locationtech.rasterframes.model.{Cells, TileDataContext} /** * Wrapper around a `Tile` encoded in a Catalyst `InternalRow`, for the purpose diff --git a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala similarity index 83% rename from core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala rename to core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala index 4893f667f..5543038d5 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,21 +19,22 @@ * */ -package astraea.spark.rasterframes.tiles +package org.locationtech.rasterframes.tiles -import astraea.spark.rasterframes.TileType -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} -import astraea.spark.rasterframes.model.TileContext -import astraea.spark.rasterframes.ref.ProjectedRasterLike -import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes.TileType +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.encoders.CatalystSerializerEncoder +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.raster.{CellType, ProjectedRaster, Tile} +import geotrellis.raster.{CellType, DelegatingTile, ProjectedRaster, Tile} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{StructField, StructType} +import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} +import org.locationtech.rasterframes.model.TileContext +import org.locationtech.rasterframes.ref.ProjectedRasterLike /** * A Tile that's also like a ProjectedRaster, with delayed evaluation support. diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/DataBiasedOp.scala b/core/src/main/scala/org/locationtech/rasterframes/util/DataBiasedOp.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/util/DataBiasedOp.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/DataBiasedOp.scala index c2e2578a3..83e5fe76c 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/DataBiasedOp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/DataBiasedOp.scala @@ -19,7 +19,7 @@ * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util import geotrellis.raster import geotrellis.raster.isNoData diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala index add36a914..956d27cf1 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/GeoTiffInfoSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util + import geotrellis.raster.TileLayout import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.io.geotiff.reader.GeoTiffReader.GeoTiffInfo diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/KryoSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala similarity index 95% rename from core/src/main/scala/astraea/spark/rasterframes/util/KryoSupport.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala index b20aa7851..96f865bba 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/KryoSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,7 +19,7 @@ * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util import java.nio.ByteBuffer diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/MultibandRender.scala b/core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/util/MultibandRender.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala index 764d049ee..4493e4eb6 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/MultibandRender.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util import geotrellis.raster._ import geotrellis.raster.render.{ColorRamp, Png} diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala b/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala similarity index 81% rename from core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala index 5f64d9954..40a038b7d 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/RFKryoRegistrator.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,12 +19,13 @@ * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util -import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile -import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} -import astraea.spark.rasterframes.ref.RasterSource._ +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.ref.RasterSource._ import com.esotericsoftware.kryo.Kryo +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} /** diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/SubdivideSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/util/SubdivideSupport.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala index 162614651..3cefa640e 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/SubdivideSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util import geotrellis.raster.crop.Crop import geotrellis.raster.{CellGrid, TileLayout} diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala index fb0c14946..ac3842cfc 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -19,16 +19,17 @@ * */ -package astraea.spark.rasterframes.util -import astraea.spark.rasterframes.expressions.TileAssembler -import astraea.spark.rasterframes.expressions.accessors._ -import astraea.spark.rasterframes.expressions.aggstats._ -import astraea.spark.rasterframes.expressions.generators._ -import astraea.spark.rasterframes.expressions.localops._ -import astraea.spark.rasterframes.expressions.tilestats._ -import astraea.spark.rasterframes.expressions.transformers._ -import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics} -import astraea.spark.rasterframes.{functions => F} +package org.locationtech.rasterframes.util + +import org.locationtech.rasterframes.expressions.TileAssembler +import org.locationtech.rasterframes.expressions.accessors._ +import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.generators._ +import org.locationtech.rasterframes.expressions.localops._ +import org.locationtech.rasterframes.expressions.tilestats._ +import org.locationtech.rasterframes.expressions.transformers._ +import org.locationtech.rasterframes.stats._ +import org.locationtech.rasterframes.{functions => F} import org.locationtech.jts.geom.Geometry import geotrellis.proj4.CRS import geotrellis.raster.mapalgebra.local.LocalTileBinaryOp @@ -45,10 +46,10 @@ import org.apache.spark.sql.{Column, SQLContext, TypedColumn, rf} * @since 4/3/17 */ object ZeroSevenCompatibilityKit { - import astraea.spark.rasterframes.encoders.StandardEncoders._ + import org.locationtech.rasterframes.encoders.StandardEncoders._ trait RasterFunctions { - private val delegate = new astraea.spark.rasterframes.RasterFunctions {} + private val delegate = new org.locationtech.rasterframes.RasterFunctions {} // format: off /** Create a row for each cell in Tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala similarity index 92% rename from core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala index a7703449a..447c4d908 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/debug/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,12 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.util +package org.locationtech.rasterframes.util -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.proj4.LatLng import geotrellis.vector.{Feature, Geometry} import geotrellis.vector.io.json.JsonFeatureCollection diff --git a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala similarity index 97% rename from core/src/main/scala/astraea/spark/rasterframes/util/package.scala rename to core/src/main/scala/org/locationtech/rasterframes/util/package.scala index eef449c76..6b492d4b2 100644 --- a/core/src/main/scala/astraea/spark/rasterframes/util/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import com.typesafe.scalalogging.Logger import geotrellis.raster.crop.TileCropMethods @@ -49,7 +51,7 @@ import scala.Boolean.box package object util { @transient protected lazy val logger: Logger = - Logger(LoggerFactory.getLogger("astraea.spark.rasterframes")) + Logger(LoggerFactory.getLogger("org.locationtech.rasterframes")) import reflect.ClassTag import reflect.runtime.universe._ diff --git a/core/src/test/resources/log4j.properties b/core/src/test/resources/log4j.properties index 378ae8e61..4c714c094 100644 --- a/core/src/test/resources/log4j.properties +++ b/core/src/test/resources/log4j.properties @@ -37,8 +37,8 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.astraea.spark.rasterframes=DEBUG -log4j.logger.astraea.spark.rasterframes.ref=TRACE +log4j.logger.org.locationtech.rasterframes=DEBUG +log4j.logger.org.locationtech.rasterframes.ref=TRACE log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/core/src/test/scala/astraea/spark/rasterframes/ml/TileExploderSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ml/TileExploderSpec.scala deleted file mode 100644 index 8883045e1..000000000 --- a/core/src/test/scala/astraea/spark/rasterframes/ml/TileExploderSpec.scala +++ /dev/null @@ -1,26 +0,0 @@ -package astraea.spark.rasterframes.ml - -import astraea.spark.rasterframes.{TestData, TestEnvironment} -import geotrellis.raster.Tile -import org.apache.spark.sql.functions.lit -/** - * - * @since 2/16/18 - */ -class TileExploderSpec extends TestEnvironment with TestData { - describe("Tile explode transformer") { - it("should explode tiles") { - import spark.implicits._ - val df = Seq[(Tile, Tile)]((byteArrayTile, byteArrayTile)).toDF("tile1", "tile2").withColumn("other", lit("stuff")) - - val exploder = new TileExploder() - val newSchema = exploder.transformSchema(df.schema) - - val exploded = exploder.transform(df) - assert(newSchema === exploded.schema) - assert(exploded.columns.length === 5) - assert(exploded.count() === 9) - write(exploded) - } - } -} diff --git a/core/src/test/scala/examples/Classification.scala b/core/src/test/scala/examples/Classification.scala index 4aebcf742..4d6579518 100644 --- a/core/src/test/scala/examples/Classification.scala +++ b/core/src/test/scala/examples/Classification.scala @@ -19,8 +19,8 @@ package examples -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.ml.{NoDataFilter, TileExploder} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.ml.TileExploder import geotrellis.raster._ import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.render.{ColorRamps, IndexedColorMap} @@ -30,6 +30,7 @@ import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder} import org.apache.spark.sql._ +import org.locationtech.rasterframes.ml.{NoDataFilter, TileExploder} object Classification extends App { diff --git a/core/src/test/scala/examples/Clustering.scala b/core/src/test/scala/examples/Clustering.scala index 2f8d4ce1f..6fc64f0e7 100644 --- a/core/src/test/scala/examples/Clustering.scala +++ b/core/src/test/scala/examples/Clustering.scala @@ -19,8 +19,7 @@ package examples -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.ml.TileExploder +import org.locationtech.rasterframes._ import geotrellis.raster.ByteConstantNoDataCellType import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.render.{ColorRamps, IndexedColorMap} @@ -28,6 +27,7 @@ import org.apache.spark.ml.Pipeline import org.apache.spark.ml.clustering.{KMeans, KMeansModel} import org.apache.spark.ml.feature.VectorAssembler import org.apache.spark.sql._ +import org.locationtech.rasterframes.ml.TileExploder object Clustering extends App { diff --git a/core/src/test/scala/examples/CreatingRasterFrames.scala b/core/src/test/scala/examples/CreatingRasterFrames.scala index 311de3dbc..a1e7e0536 100644 --- a/core/src/test/scala/examples/CreatingRasterFrames.scala +++ b/core/src/test/scala/examples/CreatingRasterFrames.scala @@ -33,7 +33,7 @@ object CreatingRasterFrames extends App { // // First, some standard `import`s: - import astraea.spark.rasterframes._ + import org.locationtech.rasterframes._ import geotrellis.raster._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.spark.io._ diff --git a/core/src/test/scala/examples/Exporting.scala b/core/src/test/scala/examples/Exporting.scala index 79af79fd0..e78e7cd3f 100644 --- a/core/src/test/scala/examples/Exporting.scala +++ b/core/src/test/scala/examples/Exporting.scala @@ -20,7 +20,7 @@ package examples import java.nio.file.Files -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.raster.render._ diff --git a/core/src/test/scala/examples/LocalArithmetic.scala b/core/src/test/scala/examples/LocalArithmetic.scala index ddf666e96..99970f560 100644 --- a/core/src/test/scala/examples/LocalArithmetic.scala +++ b/core/src/test/scala/examples/LocalArithmetic.scala @@ -19,7 +19,7 @@ package examples -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.spark.io.kryo.KryoRegistrator import org.apache.spark.serializer.KryoSerializer diff --git a/core/src/test/scala/examples/Masking.scala b/core/src/test/scala/examples/Masking.scala index 00169b622..1d93b913c 100644 --- a/core/src/test/scala/examples/Masking.scala +++ b/core/src/test/scala/examples/Masking.scala @@ -1,6 +1,6 @@ package examples -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.raster.render._ import geotrellis.raster.{mask => _, _} diff --git a/core/src/test/scala/examples/MeanValue.scala b/core/src/test/scala/examples/MeanValue.scala index ca0576e02..192685b2d 100644 --- a/core/src/test/scala/examples/MeanValue.scala +++ b/core/src/test/scala/examples/MeanValue.scala @@ -19,7 +19,7 @@ package examples -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff import org.apache.spark.sql.SparkSession diff --git a/core/src/test/scala/examples/NDVI.scala b/core/src/test/scala/examples/NDVI.scala index 971dfd8d4..0173c7807 100644 --- a/core/src/test/scala/examples/NDVI.scala +++ b/core/src/test/scala/examples/NDVI.scala @@ -20,7 +20,7 @@ package examples import java.nio.file.{Files, Paths} -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster._ import geotrellis.raster.render._ import geotrellis.raster.io.geotiff.{GeoTiff, SinglebandGeoTiff} diff --git a/core/src/test/scala/examples/Scratch.scala b/core/src/test/scala/examples/Scratch.scala index 565b4c31c..151fc2b34 100644 --- a/core/src/test/scala/examples/Scratch.scala +++ b/core/src/test/scala/examples/Scratch.scala @@ -19,7 +19,7 @@ package examples -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql._ /** diff --git a/core/src/test/scala/examples/Tour.scala b/core/src/test/scala/examples/Tour.scala index d69cb5a1c..208e82564 100644 --- a/core/src/test/scala/examples/Tour.scala +++ b/core/src/test/scala/examples/Tour.scala @@ -23,12 +23,12 @@ import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import geotrellis.raster.io.geotiff._ import geotrellis.raster.{ByteConstantNoDataCellType, Tile} -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.ml.TileExploder +import org.locationtech.rasterframes._ import geotrellis.raster.render.{ColorRamps, IndexedColorMap} import org.apache.spark.ml.Pipeline import org.apache.spark.ml.clustering.KMeans import org.apache.spark.ml.feature.VectorAssembler +import org.locationtech.rasterframes.ml.TileExploder /** * Example tour of some general features in RasterFrames diff --git a/core/src/test/scala/astraea/spark/rasterframes/ExplodeSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala similarity index 98% rename from core/src/test/scala/astraea/spark/rasterframes/ExplodeSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala index a06b6444b..f703e58d6 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ExplodeSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import geotrellis.raster._ import geotrellis.raster.resample.NearestNeighbor diff --git a/core/src/test/scala/astraea/spark/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala similarity index 92% rename from core/src/test/scala/astraea/spark/rasterframes/ExtensionMethodSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index 81c2d9202..b9810b88e 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,16 +15,17 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes -import astraea.spark.rasterframes.util.SubdivideSupport._ +package org.locationtech.rasterframes + import geotrellis.proj4.LatLng import geotrellis.raster.{ByteCellType, GridBounds, TileLayout} +import geotrellis.spark.tiling.{CRSWorldExtent, LayoutDefinition} import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} -import geotrellis.spark.tiling.LayoutDefinition -import geotrellis.spark.tiling.CRSWorldExtent +import org.locationtech.rasterframes.util.SubdivideSupport /** * Tests miscellaneous extension methods. @@ -32,7 +33,7 @@ import geotrellis.spark.tiling.CRSWorldExtent * @since 3/20/18 */ //noinspection ScalaUnusedSymbol -class ExtensionMethodSpec extends TestEnvironment with TestData { +class ExtensionMethodSpec extends TestEnvironment with TestData with SubdivideSupport { lazy val rf = sampleTileLayerRDD.toRF describe("DataFrame exention methods") { diff --git a/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala similarity index 95% rename from core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala index 51cd6c20a..28bf5f3a2 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/GeometryOperationsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import java.nio.file.{Files, Paths} diff --git a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala similarity index 97% rename from core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala index df8027a3a..1d5442c51 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes -import org.locationtech.jts.geom._ import geotrellis.proj4.{LatLng, Sinusoidal, WebMercator} import geotrellis.vector.{Extent, Point => GTPoint} +import org.locationtech.jts.geom._ /** * Test rig for operations providing interop with JTS types. diff --git a/core/src/test/scala/astraea/spark/rasterframes/MetadataSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala similarity index 63% rename from core/src/test/scala/astraea/spark/rasterframes/MetadataSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala index 4960f7e65..2a6fedb3f 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/MetadataSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala @@ -1,4 +1,25 @@ -package astraea.spark.rasterframes +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes import org.apache.spark.sql.types.MetadataBuilder diff --git a/core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala similarity index 94% rename from core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala index dcdb7b6e5..f3e41bc9a 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/RasterFrameSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala @@ -1,11 +1,32 @@ -package astraea.spark.rasterframes +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes import java.sql.Timestamp import java.time.ZonedDateTime -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ import geotrellis.proj4.LatLng import geotrellis.raster.render.{ColorMap, ColorRamp} import geotrellis.raster.{ProjectedRaster, Tile, TileFeature, TileLayout, UByteCellType} diff --git a/core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala similarity index 98% rename from core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 3e0aa841e..6571d9c25 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -19,11 +19,8 @@ * */ -package astraea.spark.rasterframes -import astraea.spark.rasterframes.TestData.injectND -import astraea.spark.rasterframes.expressions.accessors.ExtractTile -import astraea.spark.rasterframes.stats.{CellHistogram, CellStatistics, LocalCellStatistics} -import astraea.spark.rasterframes.tiles.ProjectedRasterTile +package org.locationtech.rasterframes + import geotrellis.proj4.LatLng import geotrellis.raster import geotrellis.raster.testkit.RasterMatchers @@ -31,6 +28,9 @@ import geotrellis.raster.{ArrayTile, ByteUserDefinedNoDataCellType, DoubleConsta import geotrellis.vector.Extent import org.apache.spark.sql.Encoders import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.stats._ +import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.scalatest.{FunSpec, Matchers} class RasterFunctionsSpec extends FunSpec @@ -60,7 +60,7 @@ class RasterFunctionsSpec extends FunSpec val expectedRandNoData: Long = numND * tileCount.toLong val expectedRandData: Long = cols * rows * tileCount - expectedRandNoData - lazy val randNDTilesWithNull = Seq.fill[Tile](tileCount)(injectND(numND)( + lazy val randNDTilesWithNull = Seq.fill[Tile](tileCount)(TestData.injectND(numND)( TestData.randomTile(cols, rows, UByteConstantNoDataCellType) )).map(ProjectedRasterTile(_, extent, crs)) :+ null diff --git a/core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala similarity index 98% rename from core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index b1b5b8862..72bd5e960 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -19,11 +19,11 @@ * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes -import org.locationtech.jts.geom._ import geotrellis.proj4.{CRS, LatLng, Sinusoidal, WebMercator} import org.apache.spark.sql.Encoders +import org.locationtech.jts.geom._ import org.scalatest.{FunSpec, Matchers} /** diff --git a/core/src/test/scala/astraea/spark/rasterframes/SpatialEncodingSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala similarity index 90% rename from core/src/test/scala/astraea/spark/rasterframes/SpatialEncodingSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala index 137cd9058..5de668fc6 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/SpatialEncodingSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes /** * Tests type encoding for spatial types. diff --git a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala similarity index 94% rename from core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala index 01af2b4d2..0a3246e5c 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/SpatialKeySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import geotrellis.proj4.LatLng import geotrellis.vector.Point diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala similarity index 97% rename from core/src/test/scala/astraea/spark/rasterframes/TestData.scala rename to core/src/test/scala/org/locationtech/rasterframes/TestData.scala index c5097b53b..eb8b24c3e 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright (c) 2017. Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,16 +14,18 @@ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import java.net.{URI, URL} import java.nio.file.Paths import java.time.ZonedDateTime -import astraea.spark.rasterframes.expressions.tilestats.NoDataCells -import astraea.spark.rasterframes.tiles.ProjectedRasterTile +import org.locationtech.rasterframes.expressions.tilestats.NoDataCells import geotrellis.proj4.{CRS, LatLng} import geotrellis.raster import geotrellis.raster._ @@ -36,6 +38,7 @@ import org.apache.commons.io.IOUtils import org.apache.spark.SparkContext import org.apache.spark.sql.SparkSession import org.locationtech.jts.geom.{Coordinate, GeometryFactory} +import org.locationtech.rasterframes.tiles.ProjectedRasterTile import scala.reflect.ClassTag diff --git a/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala similarity index 91% rename from core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala rename to core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala index 84d2e3fe2..fb2ca5246 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TestEnvironment.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright (c) 2017. Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -14,23 +14,25 @@ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import java.nio.file.{Files, Paths} -import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.stringEnc -import astraea.spark.rasterframes.util.toParquetFriendlyColumnName import com.typesafe.scalalogging.LazyLogging -import org.locationtech.jts.geom.Geometry import geotrellis.spark.testkit.{TestEnvironment => GeoTrellisTestEnvironment} import org.apache.spark.SparkContext import org.apache.spark.sql._ import org.apache.spark.sql.functions.col import org.apache.spark.sql.types.StructType +import org.locationtech.jts.geom.Geometry import org.scalactic.Tolerance import org.scalatest._ import org.scalatest.matchers.{MatchResult, Matcher} +import org.locationtech.rasterframes.util._ trait TestEnvironment extends FunSpec with GeoTrellisTestEnvironment with Matchers with Inspectors with Tolerance with LazyLogging { @@ -42,7 +44,7 @@ trait TestEnvironment extends FunSpec with GeoTrellisTestEnvironment lazy val sqlContext: SQLContext = { val session = SparkSession.builder.config(_sc.getConf).getOrCreate() - astraea.spark.rasterframes.WithSQLContextMethods(session.sqlContext).withRasterFrames + org.locationtech.rasterframes.WithSQLContextMethods(session.sqlContext).withRasterFrames } lazy val sql: String ⇒ DataFrame = sqlContext.sql @@ -84,6 +86,7 @@ trait TestEnvironment extends FunSpec with GeoTrellisTestEnvironment def matchGeom(g: Geometry, tolerance: Double) = new GeometryMatcher(g, tolerance) def checkDocs(name: String): Unit = { + import spark.implicits._ val docs = sql(s"DESCRIBE FUNCTION EXTENDED $name").as[String].collect().mkString("\n") docs should include(name) docs shouldNot include("not found") diff --git a/core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala similarity index 94% rename from core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index 15ee82860..f2d285e67 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,16 +19,16 @@ * */ -package astraea.spark.rasterframes -import astraea.spark.rasterframes.ref.RasterSource -import astraea.spark.rasterframes.ref.RasterSource.InMemoryRasterSource +package org.locationtech.rasterframes + import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.LatLng import geotrellis.raster._ import geotrellis.raster.render.ColorRamps import geotrellis.vector.Extent -import org.apache.spark.sql._ -import org.apache.spark.sql.{functions => F} +import org.apache.spark.sql.{functions => F, _} +import org.locationtech.rasterframes.ref.RasterSource +import org.locationtech.rasterframes.ref.RasterSource.InMemoryRasterSource /** * diff --git a/core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala similarity index 97% rename from core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala index 939ae1a46..e57069d23 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,16 +15,18 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes -import astraea.spark.rasterframes.TestData.{fracTile, randomTile} -import astraea.spark.rasterframes.stats.CellHistogram import geotrellis.raster._ import geotrellis.raster.mapalgebra.local.{Max, Min} import geotrellis.spark._ import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes.TestData.randomTile +import org.locationtech.rasterframes.stats.CellHistogram /** * Test rig associated with computing statistics and other descriptive @@ -71,7 +73,7 @@ class TileStatsSpec extends TestEnvironment with TestData { } // tiles defined for the next few tests - val tile1 = fracTile(10, 10, 5) + val tile1 = TestData.fracTile(10, 10, 5) val tile2 = ArrayTile(Array(-5, -4, -3, -2, -1, 0, 1, 2, 3), 3, 3) val tile3 = randomTile(255, 255, IntCellType) diff --git a/core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala similarity index 92% rename from core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala index 548aaf192..35e0021b7 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/TileUDTSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala @@ -3,7 +3,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -17,15 +17,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes - -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.functions.cellTypes +package org.locationtech.rasterframes import geotrellis.raster.{CellType, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.scalatest.Inspectors /** @@ -42,7 +42,7 @@ class TileUDTSpec extends TestEnvironment with TestData with Inspectors { describe("TileUDT") { val tileSizes = Seq(2, 64, 128, 222, 511) - val ct = cellTypes().filter(_ != "bool") + val ct = functions.cellTypes().filter(_ != "bool") def forEveryConfig(test: Tile ⇒ Unit): Unit = { forEvery(tileSizes.combinations(2).toSeq) { case Seq(cols, rows) ⇒ diff --git a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala similarity index 90% rename from core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala index ad285b94a..39b998201 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/encoders/CatalystSerializerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala @@ -19,19 +19,23 @@ * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders + import java.time.ZonedDateTime -import astraea.spark.rasterframes.encoders.StandardEncoders._ -import astraea.spark.rasterframes.model.{CellContext, TileContext, TileDataContext, TileDimensions} -import astraea.spark.rasterframes.ref.{RasterRef, RasterSource} -import astraea.spark.rasterframes.{TestData, TestEnvironment} +import org.locationtech.rasterframes.encoders.StandardEncoders._ +import org.locationtech.rasterframes.model.{CellContext, TileDataContext, TileDimensions} +import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.TestData import geotrellis.proj4._ import geotrellis.raster.{CellSize, CellType, TileLayout, UShortUserDefinedNoDataCellType} import geotrellis.spark.tiling.LayoutDefinition import geotrellis.spark.{KeyBounds, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder +import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes.model.{CellContext, TileContext, TileDataContext, TileDimensions} +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.scalatest.Assertion class CatalystSerializerSpec extends TestEnvironment with TestData { diff --git a/core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/encoders/EncodingSpec.scala similarity index 95% rename from core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/encoders/EncodingSpec.scala index 4875005ae..3139df995 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/encoders/EncodingSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/encoders/EncodingSpec.scala @@ -19,13 +19,12 @@ * */ -package astraea.spark.rasterframes.encoders +package org.locationtech.rasterframes.encoders import java.io.File import java.net.URI -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.tiles.ProjectedRasterTile +import org.locationtech.rasterframes._ import org.locationtech.jts.geom.Envelope import geotrellis.proj4._ import geotrellis.raster.{CellType, Tile, TileFeature} @@ -34,6 +33,8 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.Row import org.apache.spark.sql.functions._ import org.apache.spark.sql.rf.TileUDT +import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Test rig for encoding GT types into Catalyst types. diff --git a/core/src/test/scala/astraea/spark/rasterframes/ml/NoDataFilterSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala similarity index 86% rename from core/src/test/scala/astraea/spark/rasterframes/ml/NoDataFilterSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala index 17a0f25d4..4270a5314 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ml/NoDataFilterSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.ml +package org.locationtech.rasterframes.ml import java.nio.file.Files -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.TestEnvironment import org.scalatest.BeforeAndAfter /** diff --git a/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala new file mode 100644 index 000000000..31e816d9a --- /dev/null +++ b/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala @@ -0,0 +1,48 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ml + +import org.locationtech.rasterframes.TestData +import geotrellis.raster.Tile +import org.apache.spark.sql.functions.lit +import org.locationtech.rasterframes.TestEnvironment +/** + * + * @since 2/16/18 + */ +class TileExploderSpec extends TestEnvironment with TestData { + describe("Tile explode transformer") { + it("should explode tiles") { + import spark.implicits._ + val df = Seq[(Tile, Tile)]((byteArrayTile, byteArrayTile)).toDF("tile1", "tile2").withColumn("other", lit("stuff")) + + val exploder = new TileExploder() + val newSchema = exploder.transformSchema(df.schema) + + val exploded = exploder.transform(df) + assert(newSchema === exploded.schema) + assert(exploded.columns.length === 5) + assert(exploded.count() === 9) + write(exploded) + } + } +} diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala similarity index 94% rename from core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala index b50750fa6..59e5c81f5 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,15 +19,16 @@ * */ -package astraea.spark.rasterframes.ref +package org.locationtech.rasterframes.ref -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.accessors._ -import astraea.spark.rasterframes.expressions.transformers._ -import astraea.spark.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.accessors._ +import org.locationtech.rasterframes.expressions.transformers._ +import RasterRef.RasterRefTile import geotrellis.raster.Tile import geotrellis.vector.Extent import org.apache.spark.sql.Encoders +import org.locationtech.rasterframes.TestEnvironment /** * diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala similarity index 94% rename from core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala index 883184ccd..18d158eeb 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,13 +19,14 @@ * */ -package astraea.spark.rasterframes.ref +package org.locationtech.rasterframes.ref -import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.ref.RasterSource.{GDALRasterSource, JVMGeoTiffRasterSource} -import astraea.spark.rasterframes.{TestData, TestEnvironment} +import RasterSource.{GDALRasterSource, JVMGeoTiffRasterSource} +import org.locationtech.rasterframes.TestData import geotrellis.vector.Extent import org.apache.spark.sql.rf.RasterSourceUDT +import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes.model.TileDimensions /** * diff --git a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index 051aad71c..d60fa152d 100644 --- a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -1,4 +1,4 @@ -astraea.spark.rasterframes.datasource.geotiff.GeoTiffDataSource -astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource -astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisCatalog -astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource +org.locationtech.rasterframes.datasource.geotiff.GeoTiffDataSource +org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource +org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisCatalog +org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/DataSourceOptions.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala similarity index 90% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/DataSourceOptions.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala index 5baa8d67f..99063c9d0 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/DataSourceOptions.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.datasource +package org.locationtech.rasterframes.datasource /** * Key constants associated with DataFrameReader options for certain DataSource implementations. diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala similarity index 87% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index 910874e06..876895d88 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,17 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.datasource.geotiff +package org.locationtech.rasterframes.datasource.geotiff import java.net.URI -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.geotiff.GeoTiffCollectionRelation.Cols -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.util._ import geotrellis.proj4.CRS import geotrellis.spark.io.hadoop.HadoopGeoTiffRDD import geotrellis.vector.{Extent, ProjectedExtent} @@ -35,6 +32,10 @@ import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.sources.{BaseRelation, PrunedScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{Row, SQLContext} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.geotiff.GeoTiffCollectionRelation.Cols +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.util._ case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount: Int) extends BaseRelation with PrunedScan { diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala similarity index 95% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSource.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index ae6477adc..885464df6 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotiff +package org.locationtech.rasterframes.datasource.geotiff -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.datasource._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.datasource._ import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} import org.apache.spark.sql.types.LongType diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala similarity index 93% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala index 2bc42893c..539bcb84d 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,15 +15,17 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotiff +package org.locationtech.rasterframes.datasource.geotiff import java.net.URI -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.spark._ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala similarity index 90% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala index ab5a0073b..1c6c2bd0d 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,22 +15,18 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource - +package org.locationtech.rasterframes.datasource import java.net.URI -import astraea.spark.rasterframes._ import org.apache.spark.sql.{DataFrameReader, DataFrameWriter} -import shapeless.tag +import org.locationtech.rasterframes._ import shapeless.tag.@@ +import shapeless.tag -/** - * Extension methods enabled by this module. - * - * @since 1/16/18 - */ package object geotiff { /** Tagged type construction for enabling type-safe extension methods for loading * a RasterFrame in expected form. */ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala similarity index 93% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala index 36edf16a7..ed4dfe099 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,14 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis import java.net.URI -import astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisCatalog.GeoTrellisCatalogRelation import geotrellis.spark.io.AttributeStore import org.apache.spark.annotation.Experimental import org.apache.spark.rdd.RDD @@ -30,6 +31,7 @@ import org.apache.spark.sql.functions._ import org.apache.spark.sql.rf.VersionShims import org.apache.spark.sql.sources._ import org.apache.spark.sql.types.StructType +import org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisCatalog.GeoTrellisCatalogRelation import spray.json.DefaultJsonProtocol._ import spray.json._ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala similarity index 95% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala index d26cc8e41..18f2248a4 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,14 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis import java.net.URI -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.DataSourceOptions +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.DataSourceOptions import geotrellis.spark._ import geotrellis.spark.io._ import geotrellis.spark.io.index.ZCurveKeyIndexMethod diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala similarity index 94% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala index 8a171af4e..ddf8a9c74 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017-2018 Azavea & Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,24 +15,25 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis import java.io.UnsupportedEncodingException import java.net.URI import java.sql.{Date, Timestamp} import java.time.{ZoneOffset, ZonedDateTime} -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisRelation.{C, TileFeatureData} -import astraea.spark.rasterframes.datasource.geotrellis.TileFeatureSupport._ -import astraea.spark.rasterframes.rules.splitFilters -import astraea.spark.rasterframes.rules.SpatialFilters.{Contains => sfContains, Intersects => sfIntersects} -import astraea.spark.rasterframes.rules.SpatialRelationReceiver -import astraea.spark.rasterframes.rules.TemporalFilters.{BetweenDates, BetweenTimes} -import astraea.spark.rasterframes.util.SubdivideSupport._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.geotrellis.TileFeatureSupport._ +import org.locationtech.rasterframes.rules.splitFilters +import org.locationtech.rasterframes.rules.SpatialFilters.{Contains => sfContains, Intersects => sfIntersects} +import org.locationtech.rasterframes.rules.SpatialRelationReceiver +import org.locationtech.rasterframes.rules.TemporalFilters.{BetweenDates, BetweenTimes} +import org.locationtech.rasterframes.util.SubdivideSupport._ +import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import org.locationtech.jts.geom import geotrellis.raster.{CellGrid, MultibandTile, Tile, TileFeature} @@ -50,6 +51,7 @@ import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.sources._ import org.apache.spark.sql.types._ import org.apache.spark.sql.{Row, SQLContext, sources} +import org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisRelation.{C, TileFeatureData} import scala.reflect.ClassTag import scala.reflect.runtime.universe._ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/Layer.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala similarity index 83% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/Layer.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala index a659de2ff..0fc7e28e6 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/Layer.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,16 +15,18 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis import java.net.URI -import astraea.spark.rasterframes -import astraea.spark.rasterframes.encoders.DelegatingSubfieldEncoder +import org.locationtech.rasterframes.encoders.DelegatingSubfieldEncoder import geotrellis.spark.LayerId import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder +import org.locationtech.rasterframes /** * /** Connector between a GT `LayerId` and the path in which it lives. */ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/MergeableData.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala similarity index 93% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/MergeableData.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala index 73d537866..71ff81796 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/MergeableData.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis trait MergeableData[D] { def merge(l:D, r:D): D diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupport.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala similarity index 95% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupport.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala index 6691d6d51..8ef009f26 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupport.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,11 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ import geotrellis.raster.crop.{Crop, TileCropMethods} import geotrellis.raster.mask.TileMaskMethods import geotrellis.raster.merge.TileMergeMethods diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala similarity index 89% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala index 15e54ff44..5288cbe39 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/geotrellis/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,24 +15,20 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource +package org.locationtech.rasterframes.datasource import java.net.URI -import _root_.geotrellis.spark.LayerId -import astraea.spark.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource._ -import astraea.spark.rasterframes.{RasterFrame, _} import org.apache.spark.sql._ -import org.apache.spark.sql.functions.col -import shapeless.tag +import org.apache.spark.sql.functions._ +import _root_.geotrellis.spark.LayerId +import org.locationtech.rasterframes._ import shapeless.tag.@@ +import shapeless.tag -/** - * Extension methods for literate and type-safe loading of geotrellis layers. - * - * @since 1/12/18 - */ package object geotrellis extends DataSourceOptions { implicit val layerEncoder = Layer.layerEncoder @@ -56,12 +52,12 @@ package object geotrellis extends DataSourceOptions { reader.format("geotrellis-catalog").load(base.toASCIIString) def geotrellis: GeoTrellisRasterFrameReader = - tag[GeoTrellisRasterFrameReaderTag][DataFrameReader](reader.format(SHORT_NAME)) + tag[GeoTrellisRasterFrameReaderTag][DataFrameReader](reader.format(GeoTrellisLayerDataSource.SHORT_NAME)) } implicit class DataFrameWriterHasGeotrellisFormat[T](val writer: DataFrameWriter[T]) { def geotrellis: GeoTrellisRasterFrameWriter[T] = - tag[GeoTrellisRasterFrameWriterTag][DataFrameWriter[T]](writer.format(SHORT_NAME)) + tag[GeoTrellisRasterFrameWriterTag][DataFrameWriter[T]](writer.format(GeoTrellisLayerDataSource.SHORT_NAME)) } implicit class GeoTrellisWriterAddLayer[T](val writer: GeoTrellisRasterFrameWriter[T]) { diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala similarity index 90% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala index 970244883..1af62bcd5 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,9 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes +package org.locationtech.rasterframes import java.net.URI diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala similarity index 94% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index 0829a2b48..41b1ef76f 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -19,10 +19,11 @@ * */ -package astraea.spark.rasterframes.datasource.rastersource -import astraea.spark.rasterframes.model.TileDimensions +package org.locationtech.rasterframes.datasource.rastersource + import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} +import org.locationtech.rasterframes.model.TileDimensions class RasterSourceDataSource extends DataSourceRegister with RelationProvider { import RasterSourceDataSource._ diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala similarity index 80% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index 6491d12fc..a063443dd 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -19,19 +19,19 @@ * */ -package astraea.spark.rasterframes.datasource.rastersource +package org.locationtech.rasterframes.datasource.rastersource -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} -import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.tiles.ProjectedRasterTile -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} +import org.locationtech.rasterframes.util._ import org.apache.spark.rdd.RDD import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{Row, SQLContext} +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Constructs a Spark Relation over one or more RasterSource paths. diff --git a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala similarity index 98% rename from datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala index 8219b8f7c..69720d6d9 100644 --- a/datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.datasource +package org.locationtech.rasterframes.datasource + import java.net.URI import org.apache.spark.sql.DataFrameReader diff --git a/datasource/src/test/scala/examples/Creating.scala b/datasource/src/test/scala/examples/Creating.scala index a6e691ac1..fed1fac4a 100644 --- a/datasource/src/test/scala/examples/Creating.scala +++ b/datasource/src/test/scala/examples/Creating.scala @@ -37,7 +37,7 @@ There are a couple of setup steps necessary anytime you want to work with Raster */ // tut:silent -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql._ @@ -72,7 +72,7 @@ designed for this purpose. First add the following import: */ -import astraea.spark.rasterframes.datasource.geotiff._ +import org.locationtech.rasterframes.datasource.geotiff._ /* (This is what adds the `.geotiff` method to `spark.read` below.) @@ -121,7 +121,7 @@ Before we show how all of this works we need to have a GeoTrellis layer to work constructed above. */ -import astraea.spark.rasterframes.datasource.geotrellis._ +import org.locationtech.rasterframes.datasource.geotrellis._ val base = Files.createTempDirectory("rf-").toUri val layer = Layer(base, "sample", 0) diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala similarity index 85% rename from datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala index 1d7237c5b..bbd173e01 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.datasource.geotiff +package org.locationtech.rasterframes.datasource.geotiff import java.io.{File, FilenameFilter} -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.TestEnvironment /** * @since 1/14/18 diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala similarity index 92% rename from datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 54ee09412..25e69c067 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotiff +package org.locationtech.rasterframes.datasource.geotiff import java.nio.file.Paths -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes.TestEnvironment /** * @since 1/14/18 diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala similarity index 90% rename from datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala index 02e86086e..70e55d9df 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,17 +15,20 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis import java.io.File -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.proj4.LatLng import geotrellis.spark._ import geotrellis.spark.io._ import geotrellis.spark.io.index.ZCurveKeyIndexMethod import org.apache.hadoop.fs.FileUtil +import org.locationtech.rasterframes.TestEnvironment import org.scalatest.BeforeAndAfter /** diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala similarity index 97% rename from datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 14a54cf6f..117886c9c 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017-2018 Azavea & Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,17 +15,19 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis import java.io.File import java.sql.Timestamp import java.time.ZonedDateTime -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.DataSourceOptions -import astraea.spark.rasterframes.rules._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.DataSourceOptions +import org.locationtech.rasterframes.rules._ +import org.locationtech.rasterframes.util._ import geotrellis.proj4.LatLng import geotrellis.raster._ import geotrellis.raster.resample.NearestNeighbor @@ -43,6 +45,7 @@ import org.apache.hadoop.fs.FileUtil import org.apache.spark.sql.functions.{udf => sparkUdf} import org.apache.spark.sql.{DataFrame, Row} import org.apache.spark.storage.StorageLevel +import org.locationtech.rasterframes.TestEnvironment import org.scalatest.{BeforeAndAfterAll, Inspectors} import scala.math.{max, min} diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala similarity index 94% rename from datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala index dbff2225a..c953d94c3 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.datasource.geotrellis +package org.locationtech.rasterframes.datasource.geotrellis -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.geotrellis.TileFeatureSupport._ -import astraea.spark.rasterframes.util.{WithCropMethods, WithMaskMethods, WithMergeMethods, WithPrototypeMethods} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.geotrellis.TileFeatureSupport._ +import org.locationtech.rasterframes.util.{WithCropMethods, WithMaskMethods, WithMergeMethods, WithPrototypeMethods} import geotrellis.proj4.LatLng import geotrellis.raster.crop.Crop import geotrellis.raster.rasterize.Rasterizer @@ -32,6 +34,7 @@ import geotrellis.spark.tiling._ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.SparkContext import org.apache.spark.rdd.RDD +import org.locationtech.rasterframes.TestEnvironment import org.scalatest.BeforeAndAfter import scala.reflect.ClassTag diff --git a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala similarity index 94% rename from datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index fe035a84b..42765f6e6 100644 --- a/datasource/src/test/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -19,11 +19,11 @@ * */ -package astraea.spark.rasterframes.datasource.rastersource -import astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource._ -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.util._ +package org.locationtech.rasterframes.datasource.rastersource +import org.locationtech.rasterframes.{TestEnvironment, _} +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource._ +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.util._ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { import spark.implicits._ diff --git a/experimental/src/it/resources/log4j.properties b/experimental/src/it/resources/log4j.properties index 6a7d4154e..5cc16f4db 100644 --- a/experimental/src/it/resources/log4j.properties +++ b/experimental/src/it/resources/log4j.properties @@ -35,7 +35,7 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.astraea.spark.rasterframes=DEBUG +log4j.logger.org.locationtech.rasterframes=DEBUG log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala index e86376246..448bacca8 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala +++ b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala @@ -18,13 +18,13 @@ * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import java.net.URL -import astraea.spark.rasterframes.TestEnvironment import org.apache.spark.sql.functions._ -import astraea.spark.rasterframes.experimental.datasource._ +import org.locationtech.rasterframes.experimental.datasource._ +import org.locationtech.rasterframes.TestEnvironment /** * Test rig for L8 catalog stuff. diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala index b014dae7a..780ea9195 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala +++ b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala @@ -18,10 +18,11 @@ * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql.DataFrame +import org.locationtech.rasterframes.TestEnvironment import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll} /** diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala index eb2771e6f..e882e4edf 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala +++ b/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala @@ -18,13 +18,13 @@ * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import java.net.URL import java.sql.Timestamp -import astraea.spark.rasterframes.TestEnvironment -import astraea.spark.rasterframes.experimental.datasource._ +import org.locationtech.rasterframes.experimental.datasource._ import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes.TestEnvironment /** * Test rig for MODIS catalog stuff. diff --git a/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index 99180fa88..3db32938c 100644 --- a/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -1,4 +1,4 @@ -astraea.spark.rasterframes.experimental.datasource.geojson.GeoJsonDataSource -astraea.spark.rasterframes.experimental.datasource.awspds.L8CatalogDataSource -astraea.spark.rasterframes.experimental.datasource.awspds.MODISCatalogDataSource -astraea.spark.rasterframes.experimental.datasource.awspds.L8DataSource +org.locationtech.rasterframes.experimental.datasource.geojson.GeoJsonDataSource +org.locationtech.rasterframes.experimental.datasource.awspds.L8CatalogDataSource +org.locationtech.rasterframes.experimental.datasource.awspds.MODISCatalogDataSource +org.locationtech.rasterframes.experimental.datasource.awspds.L8DataSource diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/DownloadExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala similarity index 87% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/DownloadExpression.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala index 32d55645b..4721a1fc8 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/DownloadExpression.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,14 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource +package org.locationtech.rasterframes.experimental.datasource import java.net.URI -import astraea.spark.rasterframes.util.GeoTiffInfoSupport +import org.locationtech.rasterframes.util.GeoTiffInfoSupport import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.sql.catalyst.InternalRow @@ -32,7 +33,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, Generator, GenericInternalRow, UnaryExpression} import org.apache.spark.sql.types._ import org.apache.spark.unsafe.types.UTF8String -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ /** * Downloads data from URL and stores it in a column. @@ -63,7 +64,7 @@ case class DownloadExpression(override val child: Expression, colPrefix: String) } object DownloadExpression { - import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc def apply(urlColumn: Column): TypedColumn[Any, Array[Byte]] = new Column( diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/DownloadSupport.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala similarity index 93% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/DownloadSupport.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala index 9d4e6e7f5..a8db278ea 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/DownloadSupport.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource +package org.locationtech.rasterframes.experimental.datasource import java.io._ import java.net diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala similarity index 94% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala index 24025e23c..b5d920c86 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,16 +15,16 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource +package org.locationtech.rasterframes.experimental.datasource import java.net.URI -import astraea.spark.rasterframes.TileType -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.ref.HttpRangeReader +import org.locationtech.rasterframes.TileType +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.reader.GeoTiffReader @@ -41,6 +41,7 @@ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, Generator, Literal} import org.apache.spark.sql.types._ +import org.locationtech.rasterframes.ref.HttpRangeReader /** * Catalyst generator to convert a geotiff download URL into a series of rows containing the internal diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala similarity index 91% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala index 46dc23feb..1ead777e1 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,14 +19,14 @@ * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import com.typesafe.scalalogging.LazyLogging import org.apache.hadoop.fs.{FileSystem, Path ⇒ HadoopPath} import org.apache.spark.rdd.RDD import org.apache.spark.sql.{Dataset, Row} import org.apache.spark.sql.sources.BaseRelation -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.util._ /** * Mix-in for a data source that is cached as a parquet file. diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala similarity index 93% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala index 7262c2d97..ee3d8c7e3 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,11 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds - +package org.locationtech.rasterframes.experimental.datasource.awspds import java.io.FileNotFoundException import java.net.URI diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala similarity index 92% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala index 556d47cc4..873198713 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import com.typesafe.scalalogging.LazyLogging import org.locationtech.jts.geom.Envelope @@ -42,7 +43,7 @@ case class L8CatalogRelation(sqlContext: SQLContext, sceneListPath: HadoopPath) protected def cacheFile: HadoopPath = sceneListPath.suffix(".parquet") protected def constructDataset: Dataset[Row] = { - import astraea.spark.rasterframes.encoders.StandardEncoders.envelopeEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.envelopeEncoder import sqlContext.implicits._ logger.debug("Parsing " + sceneListPath) sqlContext.read diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala similarity index 90% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala index 9a7e4aab7..c57d34d0a 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8DataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala similarity index 88% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala index 8ad088075..f92dc36f4 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,25 +15,26 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.experimental.datasource.awspds.L8Relation.Bands -import astraea.spark.rasterframes.expressions.transformers._ -import astraea.spark.rasterframes.ref.RasterRef -import astraea.spark.rasterframes.rules.SpatialFilters.{Contains, Intersects} -import astraea.spark.rasterframes.rules._ -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.experimental.datasource.awspds.L8Relation.Bands +import org.locationtech.rasterframes.expressions.transformers._ +import org.locationtech.rasterframes.rules.SpatialFilters.{Contains, Intersects} +import org.locationtech.rasterframes.rules._ +import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import org.apache.spark.rdd.RDD import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources._ import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, SQLContext} +import org.locationtech.rasterframes.ref.RasterRef /** * Spark relation over AWS PDS Landsat 8 collection. diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala similarity index 93% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala index 84d461ad8..ffdb84f03 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,17 +15,18 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import java.net.URI import java.time.LocalDate import java.time.temporal.ChronoUnit -import astraea.spark.rasterframes.util.withResource -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes.util.withResource +import org.locationtech.rasterframes._ import com.typesafe.scalalogging.LazyLogging import org.apache.hadoop.fs.{FileSystem, Path ⇒ HadoopPath} import org.apache.hadoop.io.IOUtils @@ -55,7 +56,7 @@ class MODISCatalogDataSource extends DataSourceRegister with RelationProvider wi require(parameters.get("path").isEmpty, "MODISCatalogDataSource doesn't support specifying a path. Please use `load()`.") sqlContext.withRasterFrames - astraea.spark.rasterframes.experimental.datasource.register(sqlContext) + org.locationtech.rasterframes.experimental.datasource.register(sqlContext) val start = parameters.get("start").map(LocalDate.parse).getOrElse(LocalDate.of(2013, 1, 1)) val end = parameters.get("end").map(LocalDate.parse).getOrElse(LocalDate.now().minusDays(7)) diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala similarity index 96% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala index bb1d8e70d..3419d9a81 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import com.typesafe.scalalogging.LazyLogging import org.apache.hadoop.fs.{Path ⇒ HadoopPath} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala similarity index 86% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala index c0e531651..35c3ede44 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/PDSFields.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,14 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds -import astraea.spark.rasterframes.StandardColumns._ -import astraea.spark.rasterframes.util._ -import astraea.spark.rasterframes.encoders.StandardEncoders +import org.locationtech.rasterframes.StandardColumns._ +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.encoders.StandardEncoders import org.apache.spark.sql.jts.JTSTypes import org.apache.spark.sql.types._ diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala similarity index 92% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala index 4e2e741d6..bfbecd013 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,16 +15,17 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource.awspds import java.net.URI import java.time.{Duration, Instant} -import astraea.spark.rasterframes.experimental.datasource.DownloadSupport -import astraea.spark.rasterframes.util._ +import org.locationtech.rasterframes.experimental.datasource.DownloadSupport +import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import org.apache.commons.io.FilenameUtils import org.apache.hadoop.fs.{FileSystem, Path ⇒ HadoopPath} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala similarity index 85% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/package.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala index 60b1169fc..0afc2ecc1 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,15 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource +package org.locationtech.rasterframes.experimental.datasource + import org.apache.spark.sql._ import org.apache.spark.sql.functions._ -import astraea.spark.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ /** * Module support. diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala similarity index 96% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala index c0551c797..9cac6e156 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/DOM.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,10 +15,11 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.geojson +package org.locationtech.rasterframes.experimental.datasource.geojson import org.locationtech.jts.geom.{Envelope, Geometry} import org.locationtech.jts.io.geojson.{GeoJsonReader, GeoJsonWriter} diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala similarity index 95% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala index 418034147..f84a18c5d 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,12 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.geojson +package org.locationtech.rasterframes.experimental.datasource.geojson -import astraea.spark.rasterframes.experimental.datasource.geojson.DOM._ +import org.locationtech.rasterframes.experimental.datasource.geojson.DOM._ import org.locationtech.jts.geom.Geometry import org.apache.spark.annotation.Experimental import org.apache.spark.rdd.RDD diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/package.scala similarity index 94% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/package.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/package.scala index 262c255d1..0ffda39a0 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/geojson/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/package.scala @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.experimental.datasource +package org.locationtech.rasterframes.experimental.datasource + import org.apache.spark.sql.DataFrameReader /** diff --git a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala similarity index 95% rename from experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/package.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala index 4e6129be4..137d7cc32 100644 --- a/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,7 +19,8 @@ * */ -package astraea.spark.rasterframes.experimental +package org.locationtech.rasterframes.experimental + import org.apache.spark.sql._ import org.apache.spark.sql.catalyst.analysis.FunctionRegistry import org.apache.spark.sql.rf.VersionShims._ diff --git a/experimental/src/test/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala b/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala similarity index 90% rename from experimental/src/test/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala rename to experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala index 425d91ab8..4ecf766d7 100644 --- a/experimental/src/test/scala/astraea/spark/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala +++ b/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea. Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,13 +15,13 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 * */ -package astraea.spark.rasterframes.experimental.datasource.geojson - -import astraea.spark.rasterframes.TestEnvironment +package org.locationtech.rasterframes.experimental.datasource.geojson import org.apache.spark.sql.types.{LongType, MapType} +import org.locationtech.rasterframes.TestEnvironment /** * Test rig for GeoJsonRelation. diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index 4ad610cf1..8beeafa2d 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -49,7 +49,13 @@ object RFDependenciesPlugin extends AutoPlugin { import autoImport._ override def projectSettings = Seq( - resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis", + resolvers ++= Seq( + "locationtech-releases" at "https://repo.locationtech.org/content/groups/releases", + "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis", + "boundless-releases" at "https://repo.boundlessgeo.com/main/", + "Open Source Geospatial Foundation Repository" at "http://download.osgeo.org/webdav/geotools/" + ), + // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py rfSparkVersion := "2.3.2", rfGeoTrellisVersion := "2.2.0", diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 7ca0e1985..d41451017 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -30,11 +30,6 @@ object RFProjectPlugin extends AutoPlugin { scalacOptions in (Compile, doc) ++= Seq("-no-link-warnings"), javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), cancelable in Global := true, - resolvers ++= Seq( - "locationtech-releases" at "https://repo.locationtech.org/content/groups/releases", - "boundless-releases" at "https://repo.boundlessgeo.com/main/", - "Open Source Geospatial Foundation Repository" at "http://download.osgeo.org/webdav/geotools/" - ), publishTo in ThisBuild := sonatypePublishTo.value, publishMavenStyle := true, publishArtifact in (Compile, packageDoc) := true, @@ -47,26 +42,26 @@ object RFProjectPlugin extends AutoPlugin { Developer( id = "metasim", name = "Simeon H.K. Fitch", - email = "fitch@astraea.io", - url = url("http://www.astraea.io") + email = "fitch@astraea.earth", + url = url("http://www.astraea.earth") ), Developer( id = "mteldridge", name = "Matt Eldridge", - email = "meldridge@astraea.io", - url = url("http://www.astraea.io") + email = "meldridge@astraea.earth", + url = url("http://www.astraea.earth") ), Developer( id = "bguseman", name = "Ben Guseman", - email = "bguseman@astraea.io", - url = url("http://www.astraea.io") + email = "bguseman@astraea.earth", + url = url("http://www.astraea.earth") ), Developer( id = "vpipkt", name = "Jason Brown", - email = "jbrown@astraea.io", - url = url("http://www.astraea.io") + email = "jbrown@astraea.earth", + url = url("http://www.astraea.earth") ) ), initialCommands in console := @@ -76,7 +71,7 @@ object RFProjectPlugin extends AutoPlugin { |import org.apache.spark.sql.functions._ |import geotrellis.raster._ |import geotrellis.spark._ - |import astraea.spark.rasterframes._ + |import org.locationtech.rasterframes._ |implicit val spark = SparkSession.builder() | .master("local[*]") | .withKryoSerialization diff --git a/pyrasterframes/python/examples/__init__.py b/pyrasterframes/python/examples/__init__.py index b084e150d..3a0b73092 100644 --- a/pyrasterframes/python/examples/__init__.py +++ b/pyrasterframes/python/examples/__init__.py @@ -15,7 +15,7 @@ def example_session(): .config('spark.executor.extraClassPath', pyJar) .config("spark.ui.enabled", "false") .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .config("spark.kryo.registrator", "astraea.spark.rasterframes.util.RFKryoRegistrator") + .config("spark.kryo.registrator", "org.locationtech.rasterframes.util.RFKryoRegistrator") .config("spark.kryoserializer.buffer.max", "500m") .getOrCreate()) diff --git a/pyrasterframes/python/pyrasterframes/context.py b/pyrasterframes/python/pyrasterframes/context.py index 9f238c225..80a2e120d 100644 --- a/pyrasterframes/python/pyrasterframes/context.py +++ b/pyrasterframes/python/pyrasterframes/context.py @@ -16,7 +16,7 @@ def __init__(self, spark_session): self._gateway = spark_session.sparkContext._gateway self._jvm = self._gateway.jvm jsess = self._spark_session._jsparkSession - self._jrfctx = self._jvm.astraea.spark.rasterframes.py.PyRFContext(jsess) + self._jrfctx = self._jvm.org.locationtech.rasterframes.py.PyRFContext(jsess) def list_to_seq(self, py_list): conv = self.lookup('listToSeq') diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index b82cfb70c..21056f39a 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -177,7 +177,7 @@ class TileExploder(JavaTransformer, JavaMLReadable, JavaMLWritable): """ def __init__(self): super(TileExploder, self).__init__() - self._java_obj = self._new_java_obj("astraea.spark.rasterframes.ml.TileExploder", self.uid) + self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.TileExploder", self.uid) class NoDataFilter(JavaTransformer, JavaMLReadable, JavaMLWritable): """ @@ -185,6 +185,6 @@ class NoDataFilter(JavaTransformer, JavaMLReadable, JavaMLWritable): """ def __init__(self): super(NoDataFilter, self).__init__() - self._java_obj = self._new_java_obj("astraea.spark.rasterframes.ml.NoDataFilter", self.uid) + self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.NoDataFilter", self.uid) def setInputCols(self, values): self._java_obj.setInputCols(values) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 10513f7d4..d0c531533 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -38,7 +38,7 @@ def setUpClass(cls): .config('spark.driver.extraClassPath', jarpath) .config('spark.executor.extraClassPath', jarpath) .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .config("spark.kryo.registrator", "astraea.spark.rasterframes.util.RFKryoRegistrator") + .config("spark.kryo.registrator", "org.locationtech.rasterframes.util.RFKryoRegistrator") .config("spark.kryoserializer.buffer.max", "500m") .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') diff --git a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala similarity index 95% rename from pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala rename to pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index cb28f87a7..7a3583672 100644 --- a/pyrasterframes/src/main/scala/astraea/spark/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2017-2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,17 +15,20 @@ * License for the specific language governing permissions and limitations under * the License. * + * SPDX-License-Identifier: Apache-2.0 + * */ -package astraea.spark.rasterframes.py +package org.locationtech.rasterframes.py -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.model.LazyCRS +import org.locationtech.rasterframes._ import org.locationtech.jts.geom.Geometry import geotrellis.raster.{ArrayTile, CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ import org.locationtech.geomesa.spark.jts.util.WKBUtils +import org.locationtech.rasterframes.RasterFunctions +import org.locationtech.rasterframes.model.LazyCRS import spray.json._ import scala.collection.JavaConverters._ @@ -99,7 +102,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions * @return Java List of String, which py4j can interpret as a python `list` */ def cell_types = { - astraea.spark.rasterframes.functions.cellTypes().asJava + org.locationtech.rasterframes.functions.cellTypes().asJava } /** DESERIALIZATION **/ From 4344e217ca154a08439ccd57cdcf28d7d85fe6bc Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 24 Apr 2019 10:35:14 -0400 Subject: [PATCH 047/380] Add check for hasGDAL to RasterSourceSpec Signed-off-by: Jason T. Brown --- .../rasterframes/ref/RasterSourceSpec.scala | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala index 127f55be8..883184ccd 100644 --- a/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/astraea/spark/rasterframes/ref/RasterSourceSpec.scala @@ -109,22 +109,22 @@ class RasterSourceSpec extends TestEnvironment with TestData { assert(!src.extent.isEmpty) } } - describe("GDAL Rastersource") { - val gdal = GDALRasterSource(cogPath) - val jvm = JVMGeoTiffRasterSource(cogPath) - it("should compute the same metadata as JVM RasterSource") { - - gdal.cellType should be (jvm.cellType) - - } - it("should compute the same dimensions as JVM RasterSource") { - val dims = TileDimensions(128, 128) - gdal.extent should be (jvm.extent) - gdal.rasterExtent should be (jvm.rasterExtent) - gdal.cellSize should be (jvm.cellSize) - gdal.layoutBounds(dims) should contain allElementsOf jvm.layoutBounds(dims) - gdal.layoutExtents(dims) should contain allElementsOf jvm.layoutExtents(dims) + if(RasterSource.IsGDAL.hasGDAL) { + describe("GDAL Rastersource") { + val gdal = GDALRasterSource(cogPath) + val jvm = JVMGeoTiffRasterSource(cogPath) + it("should compute the same metadata as JVM RasterSource") { + gdal.cellType should be(jvm.cellType) + } + it("should compute the same dimensions as JVM RasterSource") { + val dims = TileDimensions(128, 128) + gdal.extent should be(jvm.extent) + gdal.rasterExtent should be(jvm.rasterExtent) + gdal.cellSize should be(jvm.cellSize) + gdal.layoutBounds(dims) should contain allElementsOf jvm.layoutBounds(dims) + gdal.layoutExtents(dims) should contain allElementsOf jvm.layoutExtents(dims) + } } } From c8d49a136f1b6a12ca967781699bd977b85b4dbe Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 24 Apr 2019 11:36:27 -0400 Subject: [PATCH 048/380] Documentation updates. --- .../rasterframes/bench/RasterRefBench.scala | 11 +- .../rasterframes/bench/SparkEnv.scala | 2 +- .../bench/StatsComputeBench.scala | 2 +- .../bench/TileAssembleBench.scala | 2 +- .../bench/TileCellScanBench.scala | 2 +- .../rasterframes/bench/TileEncodeBench.scala | 2 +- .../rasterframes/bench/TileExplodeBench.scala | 2 +- .../rasterframes/bench/package.scala | 6 +- .../rasterframes/MetadataKeys.scala | 2 +- .../rasterframes/RasterFunctions.scala | 2 +- .../rasterframes/encoders/CRSEncoder.scala | 2 +- .../encoders/CatalystSerializer.scala | 2 +- .../encoders/CellTypeEncoder.scala | 2 +- .../encoders/DelegatingSubfieldEncoder.scala | 2 +- .../encoders/ProjectedExtentEncoder.scala | 2 +- .../encoders/SparkBasicEncoders.scala | 2 +- .../encoders/StandardEncoders.scala | 2 +- .../encoders/StringBackedEncoder.scala | 2 +- .../TemporalProjectedExtentEncoder.scala | 2 +- .../encoders/TileLayerMetadataEncoder.scala | 2 +- .../rasterframes/encoders/URIEncoder.scala | 2 +- .../rasterframes/encoders/package.scala | 2 +- .../expressions/OnCellGridExpression.scala | 2 +- .../expressions/OnTileContextExpression.scala | 2 +- .../expressions/SpatialRelation.scala | 2 +- .../expressions/localops/Add.scala | 7 +- .../rasterframes/expressions/package.scala | 2 +- .../extensions/ContextRDDMethods.scala | 2 +- .../extensions/DataFrameMethods.scala | 2 +- .../rasterframes/extensions/Implicits.scala | 2 +- .../extensions/MetadataBuilderMethods.scala | 2 +- .../extensions/MetadataMethods.scala | 2 +- .../extensions/RFSpatialColumnMethods.scala | 2 +- .../extensions/RasterFrameMethods.scala | 2 +- .../extensions/SQLContextMethods.scala | 2 +- .../extensions/SparkSessionMethods.scala | 2 +- .../rasterframes/functions/package.scala | 2 +- .../rasterframes/jts/Implicits.scala | 2 +- .../jts/ReprojectionTransformer.scala | 2 +- .../rasterframes/ml/NoDataFilter.scala | 2 +- .../rasterframes/ml/Parameters.scala | 2 +- .../rasterframes/ml/TileColumnSupport.scala | 2 +- .../rasterframes/ml/TileExploder.scala | 2 +- .../rasterframes/rasterframes.scala | 2 +- .../rasterframes/ref/HttpRangeReader.scala | 129 ------------------ .../ref/ProjectedRasterLike.scala | 2 +- .../rasterframes/ref/RasterRef.scala | 2 +- .../rasterframes/ref/RasterSource.scala | 2 +- .../rules/SpatialFilterPushdownRules.scala | 2 +- .../rasterframes/rules/SpatialFilters.scala | 2 +- .../rules/SpatialRelationReceiver.scala | 2 +- .../rules/SpatialUDFSubstitutionRules.scala | 2 +- .../rasterframes/rules/TemporalFilters.scala | 2 +- .../rasterframes/stats/CellHistogram.scala | 2 +- .../rasterframes/stats/CellStatistics.scala | 2 +- .../tiles/FixedDelegatingTile.scala | 40 ++++++ .../rasterframes/tiles/InternalRowTile.scala | 6 +- .../tiles/ProjectedRasterTile.scala | 13 +- .../util/GeoTiffInfoSupport.scala | 2 +- .../rasterframes/util/KryoSupport.scala | 2 +- .../rasterframes/util/MultibandRender.scala | 2 +- .../rasterframes/util/RFKryoRegistrator.scala | 2 +- .../rasterframes/util/SubdivideSupport.scala | 2 +- .../rasterframes/util/debug/package.scala | 2 +- .../rasterframes/util/package.scala | 2 +- core/src/test/resources/log4j.properties | 2 +- .../rasterframes/ExplodeSpec.scala | 2 +- .../rasterframes/ExtensionMethodSpec.scala | 2 +- .../rasterframes/GeometryOperationsSpec.scala | 2 +- .../locationtech/rasterframes/JTSSpec.scala | 2 +- .../rasterframes/MetadataSpec.scala | 2 +- .../rasterframes/SpatialEncodingSpec.scala | 2 +- .../rasterframes/SpatialKeySpec.scala | 2 +- .../locationtech/rasterframes/TestData.scala | 2 +- .../rasterframes/TestEnvironment.scala | 2 +- .../rasterframes/TileAssemblerSpec.scala | 2 +- .../rasterframes/TileStatsSpec.scala | 4 +- .../rasterframes/TileUDTSpec.scala | 4 +- .../rasterframes/ml/NoDataFilterSpec.scala | 2 +- .../rasterframes/ml/TileExploderSpec.scala | 2 +- .../rasterframes/ref/RasterRefSpec.scala | 2 +- .../rasterframes/ref/RasterSourceSpec.scala | 2 +- .../datasource/DataSourceOptions.scala | 2 +- .../geotiff/GeoTiffCollectionRelation.scala | 2 +- .../geotiff/GeoTiffDataSource.scala | 2 +- .../datasource/geotiff/GeoTiffRelation.scala | 2 +- .../datasource/geotiff/package.scala | 2 +- .../geotrellis/GeoTrellisCatalog.scala | 2 +- .../GeoTrellisLayerDataSource.scala | 2 +- .../geotrellis/GeoTrellisRelation.scala | 2 +- .../datasource/geotrellis/Layer.scala | 2 +- .../datasource/geotrellis/MergeableData.scala | 2 +- .../geotrellis/TileFeatureSupport.scala | 2 +- .../datasource/geotrellis/package.scala | 2 +- .../rasterframes/datasource/package.scala | 2 +- .../GeoTiffCollectionDataSourceSpec.scala | 2 +- .../geotiff/GeoTiffDataSourceSpec.scala | 2 +- .../geotrellis/GeoTrellisCatalogSpec.scala | 2 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 2 +- .../geotrellis/TileFeatureSupportSpec.scala | 2 +- docs/src/main/tut/apps/geotrellis-ops.md | 2 +- docs/src/main/tut/apps/ndvi.md | 2 +- docs/src/main/tut/creating-rasterframes.md | 6 +- docs/src/main/tut/exporting-rasterframes.md | 8 +- docs/src/main/tut/ml/classification.md | 4 +- docs/src/main/tut/ml/clustering.md | 4 +- docs/src/main/tut/ml/statistics.md | 2 +- docs/src/main/tut/reference.md | 2 +- docs/src/main/tut/release-notes.md | 9 +- .../datasource/DownloadExpression.scala | 2 +- .../datasource/DownloadSupport.scala | 2 +- .../datasource/ReadTilesExpression.scala | 2 +- .../awspds/CachedDatasetRelation.scala | 2 +- .../awspds/L8CatalogDataSource.scala | 2 +- .../datasource/awspds/L8CatalogRelation.scala | 2 +- .../datasource/awspds/L8DataSource.scala | 2 +- .../datasource/awspds/L8Relation.scala | 2 +- .../awspds/MODISCatalogDataSource.scala | 2 +- .../awspds/MODISCatalogRelation.scala | 2 +- .../datasource/awspds/PDSFields.scala | 2 +- .../awspds/ResourceCacheSupport.scala | 2 +- .../datasource/awspds/package.scala | 2 +- .../experimental/datasource/geojson/DOM.scala | 2 +- .../geojson/GeoJsonDataSource.scala | 2 +- .../experimental/datasource/package.scala | 2 +- .../geojson/GeoJsonDataSourceTest.scala | 2 +- pyrasterframes/python/.gitignore | 3 + .../rasterframes/py/PyRFContext.scala | 2 +- 128 files changed, 195 insertions(+), 285 deletions(-) delete mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/tiles/FixedDelegatingTile.scala create mode 100644 pyrasterframes/python/.gitignore diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala index c16875adb..a2a9104bf 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,15 +19,16 @@ * */ -package org.locationtech.rasterframes.bench +package astraea.spark.rasterframes.bench + import java.util.concurrent.TimeUnit -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.expressions.transformers.RasterSourceToTiles +import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.expressions.transformers.RasterSourceToTiles +import astraea.spark.rasterframes.ref.RasterSource import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ -import org.locationtech.rasterframes.ref.RasterSource import org.openjdk.jmh.annotations._ /** * diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala index 817b01ef7..d3691f800 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/SparkEnv.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala index 718d19da4..b686fd6fa 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala index 66104420a..bf50ed334 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala index 73e7c8889..350ac811a 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileCellScanBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala index d0ffd765c..a4b0a2595 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileEncodeBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala index 4aba17771..cd8004487 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala index dfdc71e3b..f047336e3 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -15,8 +15,6 @@ * License for the specific language governing permissions and limitations under * the License. * - * SPDX-License-Identifier: Apache-2.0 - * */ package org.locationtech.rasterframes @@ -31,7 +29,7 @@ import geotrellis.raster.{ArrayTile, CellType, NODATA, Tile, isNoData} * @author sfitch * @since 10/4/17 */ -package object bench { +package object rasterframes { val rnd = new scala.util.Random(42) /** Construct a tile of given size and cell type populated with random values. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala b/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala index c700c30d7..d3f90a502 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index acd660e95..220e89683 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala index 235721753..39ed8d6f3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CRSEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala index b9788327b..921d0bb67 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala index 0c7a23ed4..ea01d4143 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CellTypeEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala index d728521c7..cf4c2e5ac 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/DelegatingSubfieldEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala index d3d1c7552..f5b078159 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/ProjectedExtentEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala index 6dbf8b447..7ec8121b5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala index 83eb51c21..f9e8d428f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala index ebce11784..2ec265ccc 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StringBackedEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala index 22ad3a95f..f69f7f160 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/TemporalProjectedExtentEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala index 39f7bce3e..2f59ea451 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/TileLayerMetadataEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala index 0d603478e..bbbcf25ea 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/URIEncoder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala index 3992667ef..d2ebf0c84 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala index ec2489ed2..05d56f7d1 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnCellGridExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala index 92044348a..78ebd1f5b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/OnTileContextExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala index 548651aca..34e44b082 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala index 59bba32f6..2885f6816 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala @@ -21,17 +21,16 @@ package org.locationtech.rasterframes.expressions.localops -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp -import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor -import org.locationtech.rasterframes.util.DataBiasedOp.BiasedAdd import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.functions.lit import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes._ import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor +import org.locationtech.rasterframes.util.DataBiasedOp.BiasedAdd @ExpressionDescription( usage = "_FUNC_(tile, rhs) - Performs cell-wise addition between two tiles or a tile and a scalar.", diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index f0a7ad653..cc3110144 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala index 975d26b6a..d7aa0a665 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index ad9bc8bf1..58b1e7e56 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala index d4f3de292..f97a5dae0 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala index ba0f78c28..fc2401bb5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataBuilderMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala index 18374fade..5d96abdf4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/MetadataMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala index 6cdc0cc62..c7c46920b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala index 1338af7c3..d37404e85 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala index a9abb0d80..4a6df34cc 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SQLContextMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala index 92bcfd871..a726b4052 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SparkSessionMethods.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index 19b2d68c4..e404657c4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala b/core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala index 51cd4c390..358fdc258 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/jts/Implicits.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala b/core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala index 86f5e9345..c4751cb3c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/jts/ReprojectionTransformer.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala index 735b3964c..5cd9e780e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/NoDataFilter.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala index 79e7ef1aa..4d273a7f9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/Parameters.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala index 1cdeaaa02..d261f7e91 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/TileColumnSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala index cf53407f1..c3ff11583 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala index 83f4917a0..8a7ac0fc2 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala deleted file mode 100644 index ed269f20f..000000000 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/HttpRangeReader.scala +++ /dev/null @@ -1,129 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2019 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -// NB: Copied from -// https://github.com/locationtech/geotrellis/blob/835200c0a6031ddc09fca218ff082cefc9b116c6/spark/src/main/scala/geotrellis/spark/io/http/util/HttpRangeReader.scala -// TODO: Submit PR with changes/fixes. -//package geotrellis.spark.io.http.util - -package org.locationtech.rasterframes.ref - -import geotrellis.util.RangeReader -import scalaj.http.{Http, HttpResponse} -import java.net.{URI, URL} - -import com.typesafe.scalalogging.LazyLogging - -import scala.util.Try - - -/** - * This class extends [[RangeReader]] by reading chunks out of a GeoTiff at the - * specified HTTP location. - * - * @param url: A [[URL]] pointing to the desired GeoTiff. - */ -class HttpRangeReader(url: URL, useHeadRequest: Boolean) extends RangeReader with LazyLogging { - - val request = Http(url.toString) - - lazy val response: HttpResponse[String] = if(useHeadRequest) { - request.method("HEAD").asString - } - else { - request.method("GET").execute { is => "" } - } - - lazy val totalLength: Long = { - /** - * "The Accept-Ranges response HTTP header is a marker used by the server - * to advertise its support of partial requests. The value of this field - * indicates the unit that can be used to define a range." - * https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Ranges - */ - require(response.header("Accept-Ranges").contains("bytes"), "Server doesn't support ranged byte reads") - - val contentLength = response - .header("Content-Length") - .flatMap({ cl => Try(cl.toLong).toOption }) match { - case Some(num) => num - case None => -1L - } - - require(contentLength > 0, - "Server didn't provide (required) \"Content-Length\" headers, unable to do range-based read") - - contentLength - } - - def readClippedRange(start: Long, length: Int): Array[Byte] = { - //println("Range read", s"$start-${start + length} ($length bytes)") - - val res = request - .method("GET") - .header("Range", s"bytes=${start}-${start + length}") - .asBytes - - /** - * "If the byte-range-set is unsatisfiable, the server SHOULD return - * a response with a status of 416 (Requested range not satisfiable). - * Otherwise, the server SHOULD return a response with a status of 206 - * (Partial Content) containing the satisfiable ranges of the entity-body." - * https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html - */ - require(res.code != 416, - "Server unable to generate the byte range between ${start} and ${start + length}") - - if (res.code != 206) logger.info("Server responded to range request with HTTP code other than PARTIAL_RESPONSE (206)") - - res.body - } - -} - -/** The companion object of [[HttpRangeReader]] */ -object HttpRangeReader { - - def apply(address: String): HttpRangeReader = apply(new URL(address)) - - def apply(uri: URI): HttpRangeReader = apply(uri.toURL) - - /** - * Returns a new instance of HttpRangeReader. - * - * @param url: A [[URL]] pointing to the desired GeoTiff. - * @return A new instance of HttpRangeReader. - */ - def apply(url: URL): HttpRangeReader = new HttpRangeReader(url, true) - - /** - * Returns a new instance of HttpRangeReader which does not use HEAD - * to determine the totalLength. - * - * @param url: A [[URL]] pointing to the desired GeoTiff. - * @return A new instance of HttpRangeReader. - */ - def withoutHeadRequest(url: URL): HttpRangeReader = new HttpRangeReader(url, false) - - def withoutHeadRequest(address: String): HttpRangeReader = withoutHeadRequest(new URL(address)) - - def withoutHeadRequest(uri: URI): HttpRangeReader = withoutHeadRequest(uri.toURL) -} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala index f716c2f19..515c47d12 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/ProjectedRasterLike.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala index 6833b5bf8..634695595 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index c266ab1d9..7cba2a590 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala index 8d5f914bd..3b3e54d6f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilterPushdownRules.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala index 8b1c61395..cf731b658 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialFilters.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala index b5cc03f43..403d122ea 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialRelationReceiver.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala index 0407a7a33..e2ee23b1f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala index cf41c9b54..5315b63b7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/TemporalFilters.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala b/core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala index 861b3876d..be3d547a3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/stats/CellHistogram.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala b/core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala index 06dec77a3..ea371666d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/stats/CellStatistics.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/FixedDelegatingTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/FixedDelegatingTile.scala new file mode 100644 index 000000000..52bfa5c1d --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/FixedDelegatingTile.scala @@ -0,0 +1,40 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.tiles +import geotrellis.raster.{ArrayTile, DelegatingTile, Tile} + +/** + * Temporary workaroud for https://github.com/locationtech/geotrellis/issues/2907 + * + * @since 8/22/18 + */ +trait FixedDelegatingTile extends DelegatingTile { + override def combine(r2: Tile)(f: (Int, Int) ⇒ Int): Tile = (delegate, r2) match { + case (del: ArrayTile, r2: DelegatingTile) ⇒ del.combine(r2.toArrayTile())(f) + case _ ⇒ delegate.combine(r2)(f) + } + + override def combineDouble(r2: Tile)(f: (Double, Double) ⇒ Double): Tile = (delegate, r2) match { + case (del: ArrayTile, r2: DelegatingTile) ⇒ del.combineDouble(r2.toArrayTile())(f) + case _ ⇒ delegate.combineDouble(r2)(f) + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala index 563aaf0e3..9d18eb586 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -25,7 +25,7 @@ import java.nio.ByteBuffer import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO import org.locationtech.rasterframes.model.TileDataContext -import geotrellis.raster.{DelegatingTile, _} +import geotrellis.raster._ import org.apache.spark.sql.catalyst.InternalRow import org.locationtech.rasterframes.model.{Cells, TileDataContext} @@ -39,7 +39,7 @@ import org.locationtech.rasterframes.model.{Cells, TileDataContext} * * @since 11/29/17 */ -class InternalRowTile(val mem: InternalRow) extends DelegatingTile { +class InternalRowTile(val mem: InternalRow) extends FixedDelegatingTile { import InternalRowTile._ /** @group COPIES */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala index 5543038d5..59a9f24cb 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -21,27 +21,26 @@ package org.locationtech.rasterframes.tiles -import org.locationtech.rasterframes.TileType -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.encoders.CatalystSerializerEncoder -import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.raster.{CellType, DelegatingTile, ProjectedRaster, Tile} +import geotrellis.raster.{CellType, ProjectedRaster, Tile} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.TileUDT import org.apache.spark.sql.types.{StructField, StructType} +import org.locationtech.rasterframes.TileType +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import org.locationtech.rasterframes.model.TileContext import org.locationtech.rasterframes.ref.ProjectedRasterLike +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile /** * A Tile that's also like a ProjectedRaster, with delayed evaluation support. * * @since 9/5/18 */ -trait ProjectedRasterTile extends DelegatingTile with ProjectedRasterLike { +trait ProjectedRasterTile extends FixedDelegatingTile with ProjectedRasterLike { def extent: Extent def crs: CRS def projectedExtent: ProjectedExtent = ProjectedExtent(extent, crs) diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala index 956d27cf1..e24bb8175 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/GeoTiffInfoSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala index 96f865bba..26754b91d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/KryoSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala b/core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala index 4493e4eb6..b576f1e67 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/MultibandRender.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala b/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala index 40a038b7d..7fea0a93e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala b/core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala index 3cefa640e..24ee2ce2d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/SubdivideSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala index 447c4d908..2d0c8c780 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala index 6b492d4b2..f723224f9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/resources/log4j.properties b/core/src/test/resources/log4j.properties index 4c714c094..db5aa310a 100644 --- a/core/src/test/resources/log4j.properties +++ b/core/src/test/resources/log4j.properties @@ -38,7 +38,7 @@ log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO log4j.logger.org.locationtech.rasterframes=DEBUG -log4j.logger.org.locationtech.rasterframes.ref=TRACE +log4j.logger.org.locationtech.rasterframes.ref=DEBUG log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala index f703e58d6..ac09b86c9 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index b9810b88e..dd497d0fa 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala index 28bf5f3a2..8e50935de 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala index 1d5442c51..cce1eba64 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala index 2a6fedb3f..244b9ab3d 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala index 5de668fc6..fe48aa4b2 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala index 0a3246e5c..773c28877 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index eb8b24c3e..13f93cd6c 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala index fb2ca5246..78ead237e 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index f2d285e67..2759323fb 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala index e57069d23..a2fc4baf1 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -284,7 +284,7 @@ class TileStatsSpec extends TestEnvironment with TestData { val minTile = dsNd.select(agg_local_min($"tiles")).first() assert(minTile.toArray() === completeTile.toArray()) - val maxTile = dsNd.select(agg_local_max($"tiles")).first() + val maxTile = dsNd.select(agg_local_max($"tiles")).first() assert(maxTile.toArray() === completeTile.toArray()) val meanTile = dsNd.select(agg_local_mean($"tiles")).first() diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala index 35e0021b7..ceac41f64 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala @@ -1,9 +1,7 @@ - - /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala index 4270a5314..1d4dbc4f6 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ml/NoDataFilterSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala index 31e816d9a..2d9e2d04c 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ml/TileExploderSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala index 59e5c81f5..ca14400a1 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala index 18d158eeb..7fbc274f4 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala index 99063c9d0..d620dd4fd 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/DataSourceOptions.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index 876895d88..3c3151783 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 885464df6..b0904caa6 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala index 539bcb84d..d16d69fb1 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala index 1c6c2bd0d..39fb16ca1 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala index ed4dfe099..11edc1d5f 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalog.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala index 18f2248a4..8662fdc64 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala index ddf8a9c74..343f4683d 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017-2019 Astraea, Inc. & Azavea * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala index 0fc7e28e6..9f90c96fd 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/Layer.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala index 71ff81796..34bd6536b 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/MergeableData.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala index 8ef009f26..67ea65510 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala index 5288cbe39..bb4cc4840 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala index 1af62bcd5..9a649bb94 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala index bbd173e01..0ed2deefa 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 25e69c067..d221acab9 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala index 70e55d9df..042fa4c3b 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 117886c9c..70d70f0d7 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017-2019 Azavea & Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala index c953d94c3..0cf7e358c 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/TileFeatureSupportSpec.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/docs/src/main/tut/apps/geotrellis-ops.md b/docs/src/main/tut/apps/geotrellis-ops.md index 81a97a3fa..edc5302c7 100644 --- a/docs/src/main/tut/apps/geotrellis-ops.md +++ b/docs/src/main/tut/apps/geotrellis-ops.md @@ -1,7 +1,7 @@ # GeoTrellis Operations ```tut:invisible -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster._ import geotrellis.raster.render._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff diff --git a/docs/src/main/tut/apps/ndvi.md b/docs/src/main/tut/apps/ndvi.md index a9fb72a3e..5ce1d1246 100644 --- a/docs/src/main/tut/apps/ndvi.md +++ b/docs/src/main/tut/apps/ndvi.md @@ -1,7 +1,7 @@ # Computing NDVI ```tut:invisible -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster._ import geotrellis.raster.render._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff diff --git a/docs/src/main/tut/creating-rasterframes.md b/docs/src/main/tut/creating-rasterframes.md index 7e7ab2c66..75b65f869 100644 --- a/docs/src/main/tut/creating-rasterframes.md +++ b/docs/src/main/tut/creating-rasterframes.md @@ -7,7 +7,7 @@ There are a couple of setup steps necessary anytime you want to work with Raster ```tut:silent -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import org.apache.spark.sql._ ``` @@ -46,7 +46,7 @@ First add the following import: ```tut:silent -import astraea.spark.rasterframes.datasource.geotiff._ +import org.locationtech.rasterframes.datasource.geotiff._ import java.io.File ``` @@ -95,7 +95,7 @@ Before we show how all of this works we need to have a GeoTrellis layer to work ```tut:silent -import astraea.spark.rasterframes.datasource.geotrellis._ +import org.locationtech.rasterframes.datasource.geotrellis._ import java.nio.file.Files val base = Files.createTempDirectory("rf-").toUri diff --git a/docs/src/main/tut/exporting-rasterframes.md b/docs/src/main/tut/exporting-rasterframes.md index 2015943f5..5012f1019 100644 --- a/docs/src/main/tut/exporting-rasterframes.md +++ b/docs/src/main/tut/exporting-rasterframes.md @@ -1,7 +1,7 @@ # Exporting RasterFrames ```tut:invisible -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.spark._ import geotrellis.raster._ import geotrellis.raster.render._ @@ -183,8 +183,8 @@ showType(rf.toTileLayerRDD($"tile".as[Tile])) spark.stop() ``` -[rfInit]: astraea.spark.rasterframes.package#rfInit%28SQLContext%29:Unit +[rfInit]: org.locationtech.rasterframes.package#rfInit%28SQLContext%29:Unit [rdd]: org.apache.spark.sql.Dataset#frdd:org.apache.spark.rdd.RDD[T] -[toTileLayerRDD]: astraea.spark.rasterframes.RasterFrameMethods#toTileLayerRDD%28tileCol:RasterFrameMethods.this.TileColumn%29:Either[geotrellis.spark.TileLayerRDD[geotrellis.spark.SpatialKey],geotrellis.spark.TileLayerRDD[geotrellis.spark.SpaceTimeKey]] -[tile_to_array_int]: astraea.spark.rasterframes.ColumnFunctions#tile_to_array_int +[toTileLayerRDD]: org.locationtech.rasterframes.RasterFrameMethods#toTileLayerRDD%28tileCol:RasterFrameMethods.this.TileColumn%29:Either[geotrellis.spark.TileLayerRDD[geotrellis.spark.SpatialKey],geotrellis.spark.TileLayerRDD[geotrellis.spark.SpaceTimeKey]] +[tile_to_array_int]: org.locationtech.rasterframes.ColumnFunctions#tile_to_array_int diff --git a/docs/src/main/tut/ml/classification.md b/docs/src/main/tut/ml/classification.md index 55c8ced98..b62940a7b 100644 --- a/docs/src/main/tut/ml/classification.md +++ b/docs/src/main/tut/ml/classification.md @@ -9,8 +9,8 @@ SparkML. First some setup: ```tut:silent -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.ml.{NoDataFilter, TileExploder} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.ml.{NoDataFilter, TileExploder} import geotrellis.raster._ import geotrellis.raster.render._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff diff --git a/docs/src/main/tut/ml/clustering.md b/docs/src/main/tut/ml/clustering.md index a3e803ace..fc63eabdb 100644 --- a/docs/src/main/tut/ml/clustering.md +++ b/docs/src/main/tut/ml/clustering.md @@ -7,8 +7,8 @@ In this example we will do some simple cell clustering based on multiband imager First some setup: ```tut:silent -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.ml.TileExploder +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.ml.TileExploder import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.raster._ import geotrellis.raster.render._ diff --git a/docs/src/main/tut/ml/statistics.md b/docs/src/main/tut/ml/statistics.md index 3ff086ad1..6249eef73 100644 --- a/docs/src/main/tut/ml/statistics.md +++ b/docs/src/main/tut/ml/statistics.md @@ -1,7 +1,7 @@ # Raster Statistics ```tut:invisible -import astraea.spark.rasterframes._ +import org.locationtech.rasterframes._ import geotrellis.raster._ import geotrellis.raster.render._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index d264d900d..fe9b91851 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -941,6 +941,6 @@ Pretty print the tile values as plain text. -[RasterFunctions]: astraea.spark.rasterframes.RasterFunctions +[RasterFunctions]: org.locationtech.rasterframes.RasterFunctions [scaladoc]: latest/api/index.html diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 9fff73799..f8fb23350 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -4,7 +4,8 @@ ### 0.8.0 -* Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.2.0, GeoMesa 2.2.1, JTS 1.16.0. +* _Breaking_: Root package changed from `astraea.spark.rasterframes` to `org.locationtech.rasterframes`. +* Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. * Added new tile functions `round`, `log`, `log10`, `log2`, `log1p`, `exp`, `exp10`, `exp2`, `expm1`, `resample`, `resample`. * Support python-side [Shapely](https://pypi.org/project/Shapely/) geometry User-Defined Type. * SQL API support for: `rf_assemble_tile`, `rf_array_to_tile`. @@ -18,7 +19,7 @@ * _Breaking_: renamed `agg_histogram` to `agg_approx_histogram`, `local_agg_stats` to `agg_local_stats`, `local_agg_max` to `agg_local_max`, `local_agg_min` to `agg_local_min`, `local_agg_mean` to `agg_local_mean`, `local_agg_data_cells` to `agg_local_data_cells`, `local_agg_no_data_cells` to `agg_local_no_data_cells`. * _Breaking_: `CellHistogram` no longer carries along approximate statistics, due to confusing behavior. Use `agg_stats` instead. * Introduced `LocalCellStatistics` class to wrap together results from `LocalStatsAggregate`. -* _Breaking_: `TileDimensions` moved from `astraea.spark.rasterframes` to `astraea.spark.rasterframes.model`. +* _Breaking_: `TileDimensions` moved from `astraea.spark.rasterframes` to `org.locationtech.rasterframes.model`. * _Breaking_: Renamed `RasterFrame.withBounds` to `RasterFrame.withGeometry` for consistency with DataSource schemas. * Added `RasterFrame.withExtent` extension method. * Added `st_extent` and deprecated `envelope`. Renamed `bounds_geometry` to `extent_geometry`. @@ -53,8 +54,8 @@ * Added [experimental DataSource implementations](https://github.com/locationtech/rasterframes/tree/develop/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds) for [MODIS](https://registry.opendata.aws/modis/) and [Landsat 8](https://registry.opendata.aws/landsat-8/) catalogs on AWS PDS. * _Change_: Default interpoation for `toRaster` and `toMultibandRaster` has been changed from `Bilinear` to `NearestNeighbor`. * _Breaking_: Renamed/moved `astraea.spark.rasterframes.functions.CellStatsAggregateFunction.Statistics` to -`astraea.spark.rasterframes.stats.CellStatistics`. -* _Breaking_: `HistogramAggregateFunction` now generates the new type `astraea.spark.rasterframes.stats.CellHistogram`. +`org.locationtech.rasterframes.stats.CellStatistics`. +* _Breaking_: `HistogramAggregateFunction` now generates the new type `org.locationtech.rasterframes.stats.CellHistogram`. * _Breaking_: `box2D` renamed `envelope`. ## 0.6.x diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala index 4721a1fc8..0a39071ff 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala index a8db278ea..f5e0dff64 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala index b5d920c86..875d30c1a 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala index 1ead777e1..37be5335e 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2089 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala index ee3d8c7e3..47ff0afab 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala index 873198713..3f5c9a142 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala index c57d34d0a..5a6c25b6e 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala index f92dc36f4..4c8077da6 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala index ffdb84f03..d1c886755 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala index 3419d9a81..32ea9ce87 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala index 35c3ede44..f615bbbe2 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala index bfbecd013..f203a187f 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala index 0afc2ecc1..ccf1331ff 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala index 9cac6e156..1122f2bc7 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala index f84a18c5d..e2cb93a91 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala index 137d7cc32..57e8e8f53 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala b/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala index 4ecf766d7..8edab293f 100644 --- a/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala +++ b/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2018 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of diff --git a/pyrasterframes/python/.gitignore b/pyrasterframes/python/.gitignore new file mode 100644 index 000000000..d43a8f7ce --- /dev/null +++ b/pyrasterframes/python/.gitignore @@ -0,0 +1,3 @@ +.coverage +htmlcov + diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 7a3583672..3ea7ab4a0 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2019 Astraea, Inc. + * Copyright 2017-2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of From a23fa6ad09239268d5fcd27e77b17b19713ec79e Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 24 Apr 2019 14:08:00 -0400 Subject: [PATCH 049/380] Documentation updates. --- docs/src/main/tut/release-notes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index f8fb23350..307e1224d 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -4,7 +4,7 @@ ### 0.8.0 -* _Breaking_: Root package changed from `astraea.spark.rasterframes` to `org.locationtech.rasterframes`. +* _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. * Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. * Added new tile functions `round`, `log`, `log10`, `log2`, `log1p`, `exp`, `exp10`, `exp2`, `expm1`, `resample`, `resample`. * Support python-side [Shapely](https://pypi.org/project/Shapely/) geometry User-Defined Type. @@ -114,7 +114,7 @@ ### 0.5.9 * Ported to sbt 1.0.3 -* Added sbt-generated `astraea.spark.rasterframes.RFBuildInfo` +* Added sbt-generated `org.locationtech.rasterframes.RFBuildInfo` * Fixed bug in computing `aggMean` when one or more tiles are `null` * Deprecated `rfIinit` in favor of `SparkSession.withRasterFrames` or `SQLContext.withRasterFrames` extension methods From e31710cffc982ffc792fc316815c6f95fea78f2c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 24 Apr 2019 16:25:47 -0400 Subject: [PATCH 050/380] Prefixed all columnar functions with `rf_` to avoid namespace collisions when using Python `*` or Scala `_` imports. --- .../rasterframes/bench/RasterRefBench.scala | 10 +- .../bench/StatsComputeBench.scala | 10 +- .../bench/TileAssembleBench.scala | 4 +- .../rasterframes/bench/TileExplodeBench.scala | 4 +- .../rasterframes/RasterFunctions.scala | 176 ++++++----- .../expressions/accessors/GetCellType.scala | 2 +- .../expressions/accessors/GetDimensions.scala | 2 +- .../aggstats/CellCountAggregate.scala | 8 +- .../aggstats/CellMeanAggregate.scala | 4 +- .../aggstats/CellStatsAggregate.scala | 4 +- .../aggstats/HistogramAggregate.scala | 4 +- .../aggstats/LocalCountAggregate.scala | 8 +- .../aggstats/LocalMeanAggregate.scala | 2 +- .../aggstats/LocalStatsAggregate.scala | 4 +- .../aggstats/LocalTileOpAggregate.scala | 4 +- .../expressions/generators/ExplodeTiles.scala | 2 +- .../expressions/localops/Add.scala | 2 +- .../expressions/localops/Divide.scala | 2 +- .../expressions/localops/Equal.scala | 2 +- .../expressions/localops/Exp.scala | 8 +- .../expressions/localops/Greater.scala | 2 +- .../expressions/localops/GreaterEqual.scala | 2 +- .../expressions/localops/Less.scala | 2 +- .../expressions/localops/LessEqual.scala | 2 +- .../expressions/localops/Log.scala | 6 +- .../expressions/localops/Multiply.scala | 2 +- .../localops/NormalizedDifference.scala | 2 +- .../expressions/localops/Resample.scala | 2 +- .../expressions/localops/Round.scala | 4 +- .../expressions/localops/Subtract.scala | 2 +- .../expressions/localops/Unequal.scala | 2 +- .../rasterframes/expressions/package.scala | 2 +- .../expressions/tilestats/DataCells.scala | 2 +- .../expressions/tilestats/IsNoDataTile.scala | 2 +- .../expressions/tilestats/NoDataCells.scala | 2 +- .../expressions/tilestats/Sum.scala | 2 +- .../expressions/tilestats/TileHistogram.scala | 2 +- .../expressions/tilestats/TileMax.scala | 2 +- .../expressions/tilestats/TileMean.scala | 2 +- .../expressions/tilestats/TileMin.scala | 2 +- .../expressions/tilestats/TileStats.scala | 2 +- .../transformers/DebugRender.scala | 4 +- .../transformers/ExtentToGeometry.scala | 2 +- .../expressions/transformers/Mask.scala | 6 +- .../transformers/ReprojectGeometry.scala | 2 +- .../transformers/TileToArrayDouble.scala | 2 +- .../transformers/TileToArrayInt.scala | 2 +- .../rasterframes/ml/TileExploder.scala | 2 +- .../util/ZeroSevenCompatibilityKit.scala | 96 +++--- .../test/scala/examples/Classification.scala | 4 +- core/src/test/scala/examples/Clustering.scala | 2 +- core/src/test/scala/examples/Exporting.scala | 14 +- .../test/scala/examples/LocalArithmetic.scala | 8 +- core/src/test/scala/examples/Masking.scala | 4 +- core/src/test/scala/examples/MeanValue.scala | 2 +- core/src/test/scala/examples/Tour.scala | 16 +- .../rasterframes/ExplodeSpec.scala | 32 +- .../rasterframes/GeometryOperationsSpec.scala | 8 +- .../locationtech/rasterframes/JTSSpec.scala | 8 +- .../rasterframes/RasterFrameSpec.scala | 2 +- .../rasterframes/RasterFunctionsSpec.scala | 278 +++++++++--------- .../rasterframes/ReprojectGeometrySpec.scala | 12 +- .../rasterframes/TileAssemblerSpec.scala | 21 +- .../rasterframes/TileStatsSpec.scala | 60 ++-- .../geotiff/GeoTiffDataSource.scala | 4 +- .../geotiff/GeoTiffDataSourceSpec.scala | 2 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 12 +- .../RasterSourceDataSourceSpec.scala | 4 +- docs/src/main/tut/apps/geotrellis-ops.md | 6 +- docs/src/main/tut/apps/ndvi.md | 2 +- docs/src/main/tut/exporting-rasterframes.md | 8 +- docs/src/main/tut/ml/classification.md | 4 +- docs/src/main/tut/ml/clustering.md | 2 +- docs/src/main/tut/ml/statistics.md | 19 +- docs/src/main/tut/release-notes.md | 21 +- .../datasource/awspds/L8Relation.scala | 2 +- pyrasterframes/python/examples/Clustering.py | 2 +- pyrasterframes/python/examples/MeanValue.py | 2 +- pyrasterframes/python/examples/NDVI.py | 2 +- .../python/pyrasterframes/__init__.py | 1 + .../python/pyrasterframes/context.py | 2 +- .../python/pyrasterframes/rasterfunctions.py | 224 +++++++------- .../python/tests/PyRasterFramesTests.py | 96 +++--- .../rasterframes/py/PyRFContext.scala | 82 +++--- 84 files changed, 690 insertions(+), 704 deletions(-) diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala index a2a9104bf..54386e2ef 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala @@ -58,7 +58,7 @@ class RasterRefBench extends SparkEnv with LazyLogging { @Benchmark def computeDifferenceExpanded() = { expandedDF - .select(normalized_difference($"B1", $"B2")) + .select(rf_normalized_difference($"B1", $"B2")) .cache() .count() } @@ -66,24 +66,24 @@ class RasterRefBench extends SparkEnv with LazyLogging { @Benchmark def computeDifferenceSingle() = { singleDF - .select(normalized_difference($"B1", $"B2")) + .select(rf_normalized_difference($"B1", $"B2")) .cache() .count() } @Benchmark def computeStatsSingle() = { - singleDF.select(agg_stats($"B1")).collect() + singleDF.select(rf_agg_stats($"B1")).collect() } @Benchmark def computeStatsExpanded() = { - expandedDF.select(agg_stats($"B1")).collect() + expandedDF.select(rf_agg_stats($"B1")).collect() } @Benchmark def computeDifferenceStats() = { - singleDF.select(agg_stats(normalized_difference($"B1", $"B2"))).collect() + singleDF.select(rf_agg_stats(rf_normalized_difference($"B1", $"B2"))).collect() } } \ No newline at end of file diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala index b686fd6fa..2ebc3efc0 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/StatsComputeBench.scala @@ -59,26 +59,26 @@ class StatsComputeBench extends SparkEnv { // @Benchmark // def computeStats(): Array[CellStatistics] = { -// tiles.select(agg_stats($"tile")).collect() +// tiles.select(rf_agg_stats($"tile")).collect() // } @Benchmark def computeHistogram(): Array[CellHistogram] = { - tiles.select(agg_approx_histogram($"tile")).collect() + tiles.select(rf_agg_approx_histogram($"tile")).collect() } // @Benchmark // def extractMean(): Array[Double] = { -// tiles.select(agg_stats($"tile").getField("mean")).map(_.getDouble(0)).collect() +// tiles.select(rf_agg_stats($"tile").getField("mean")).map(_.getDouble(0)).collect() // } // // @Benchmark // def directMean(): Array[Double] = { -// tiles.repartition(10).select(agg_mean($"tile")).collect() +// tiles.repartition(10).select(rf_agg_mean($"tile")).collect() // } // @Benchmark // def computeCounts() = { -// tiles.toDF("tile").select(data_cells($"tile") as "counts").agg(sum($"counts")).collect() +// tiles.toDF("tile").select(rf_data_cells($"tile") as "counts").agg(sum($"counts")).collect() // } } diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala index bf50ed334..8b33af369 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileAssembleBench.scala @@ -45,7 +45,7 @@ class TileAssembleBench extends SparkEnv { var cells1: DataFrame = _ var cells2: DataFrame = _ - val assembler = assemble_tile( + val assembler = rf_assemble_tile( $"column_index", $"row_index", $"tile", tileSize, tileSize, cellType ) @@ -54,7 +54,7 @@ class TileAssembleBench extends SparkEnv { def setupData(): Unit = { cells1 = Seq.fill(numTiles)(randomTile(tileSize, tileSize, cellType.name)).zipWithIndex .toDF("tile", "id") - .select($"id", explode_tiles($"tile")) + .select($"id", rf_explode_tiles($"tile")) .repartition(4, $"id") .cache() diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala index cd8004487..7f3352f69 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/TileExplodeBench.scala @@ -58,11 +58,11 @@ class TileExplodeBench extends SparkEnv { @Benchmark def arrayExplode() = { - tiles.select(posexplode(tile_to_array_double($"tile"))).count() + tiles.select(posexplode(rf_tile_to_array_double($"tile"))).count() } @Benchmark def tileExplode() = { - tiles.select(explode_tiles($"tile")).count() + tiles.select(rf_explode_tiles($"tile")).count() } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 220e89683..976be8330 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -27,7 +27,7 @@ import geotrellis.vector.Extent import org.apache.spark.annotation.Experimental import org.apache.spark.sql.functions.{lit, udf} import org.apache.spark.sql.{Column, TypedColumn} -import org.locationtech.jts.geom.{Envelope, Geometry} +import org.locationtech.jts.geom.Geometry import org.locationtech.rasterframes.expressions.TileAssembler import org.locationtech.rasterframes.expressions.accessors._ import org.locationtech.rasterframes.expressions.aggstats._ @@ -48,311 +48,307 @@ trait RasterFunctions { // format: off /** Create a row for each cell in Tile. */ - def explode_tiles(cols: Column*): Column = explode_tiles_sample(1.0, None, cols: _*) + def rf_explode_tiles(cols: Column*): Column = rf_explode_tiles_sample(1.0, None, cols: _*) /** Create a row for each cell in Tile with random sampling and optional seed. */ - def explode_tiles_sample(sampleFraction: Double, seed: Option[Long], cols: Column*): Column = + def rf_explode_tiles_sample(sampleFraction: Double, seed: Option[Long], cols: Column*): Column = ExplodeTiles(sampleFraction, seed, cols) /** Create a row for each cell in Tile with random sampling (no seed). */ - def explode_tiles_sample(sampleFraction: Double, cols: Column*): Column = + def rf_explode_tiles_sample(sampleFraction: Double, cols: Column*): Column = ExplodeTiles(sampleFraction, None, cols) /** Query the number of (cols, rows) in a Tile. */ - def tile_dimensions(col: Column): Column = GetDimensions(col) - - /** Extracts the bounding box of a geometry as a JTS envelope. */ - @deprecated("Replace usages of this with `st_extent`", "11/4/2018") - def envelope(col: Column): TypedColumn[Any, Envelope] = GetEnvelope(col) + def rf_tile_dimensions(col: Column): Column = GetDimensions(col) /** Extracts the bounding box of a geometry as an Extent */ - def st_extent(col: Column): TypedColumn[Any, Extent] = GeometryToExtent(col) + def rf_extent(col: Column): TypedColumn[Any, Extent] = GeometryToExtent(col) /** Flattens Tile into a double array. */ - def tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = + def rf_tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) /** Flattens Tile into an integer array. */ - def tile_to_array_int(col: Column): TypedColumn[Any, Array[Double]] = + def rf_tile_to_array_int(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) @Experimental /** Convert array in `arrayCol` into a Tile of dimensions `cols` and `rows`*/ - def array_to_tile(arrayCol: Column, cols: Int, rows: Int) = withAlias("array_to_tile", arrayCol)( + def rf_array_to_tile(arrayCol: Column, cols: Int, rows: Int) = withAlias("rf_array_to_tile", arrayCol)( udf[Tile, AnyRef](F.arrayToTile(cols, rows)).apply(arrayCol) ) /** Create a Tile from a column of cell data with location indexes and preform cell conversion. */ - def assemble_tile(columnIndex: Column, rowIndex: Column, cellData: Column, tileCols: Int, tileRows: Int, ct: CellType): TypedColumn[Any, Tile] = - convert_cell_type(TileAssembler(columnIndex, rowIndex, cellData, lit(tileCols), lit(tileRows)), ct).as(cellData.columnName).as[Tile](singlebandTileEncoder) + def rf_assemble_tile(columnIndex: Column, rowIndex: Column, cellData: Column, tileCols: Int, tileRows: Int, ct: CellType): TypedColumn[Any, Tile] = + rf_convert_cell_type(TileAssembler(columnIndex, rowIndex, cellData, lit(tileCols), lit(tileRows)), ct).as(cellData.columnName).as[Tile](singlebandTileEncoder) /** Create a Tile from a column of cell data with location indexes. */ - def assemble_tile(columnIndex: Column, rowIndex: Column, cellData: Column, tileCols: Column, tileRows: Column): TypedColumn[Any, Tile] = + def rf_assemble_tile(columnIndex: Column, rowIndex: Column, cellData: Column, tileCols: Column, tileRows: Column): TypedColumn[Any, Tile] = TileAssembler(columnIndex, rowIndex, cellData, tileCols, tileRows) /** Extract the Tile's cell type */ - def cell_type(col: Column): TypedColumn[Any, CellType] = GetCellType(col) + def rf_cell_type(col: Column): TypedColumn[Any, CellType] = GetCellType(col) /** Change the Tile's cell type */ - def convert_cell_type(col: Column, cellType: CellType): TypedColumn[Any, Tile] = + def rf_convert_cell_type(col: Column, cellType: CellType): TypedColumn[Any, Tile] = SetCellType(col, cellType) /** Change the Tile's cell type */ - def convert_cell_type(col: Column, cellTypeName: String): TypedColumn[Any, Tile] = + def rf_convert_cell_type(col: Column, cellTypeName: String): TypedColumn[Any, Tile] = SetCellType(col, cellTypeName) /** Convert a bounding box structure to a Geometry type. Intented to support multiple schemas. */ - def extent_geometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) + def rf_extent_geometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) /** Assign a `NoData` value to the Tiles. */ - def with_no_data(col: Column, nodata: Double): TypedColumn[Any, Tile] = withAlias("with_no_data", col)( + def rf_with_no_data(col: Column, nodata: Double): TypedColumn[Any, Tile] = withAlias("rf_with_no_data", col)( udf[Tile, Tile](F.withNoData(nodata)).apply(col) ).as[Tile] /** Compute the full column aggregate floating point histogram. */ - def agg_approx_histogram(col: Column): TypedColumn[Any, CellHistogram] = + def rf_agg_approx_histogram(col: Column): TypedColumn[Any, CellHistogram] = HistogramAggregate(col) /** Compute the full column aggregate floating point statistics. */ - def agg_stats(col: Column): TypedColumn[Any, CellStatistics] = + def rf_agg_stats(col: Column): TypedColumn[Any, CellStatistics] = CellStatsAggregate(col) /** Computes the column aggregate mean. */ - def agg_mean(col: Column) = CellMeanAggregate(col) + def rf_agg_mean(col: Column) = CellMeanAggregate(col) /** Computes the number of non-NoData cells in a column. */ - def agg_data_cells(col: Column): TypedColumn[Any, Long] = CellCountAggregate.DataCells(col) + def rf_agg_data_cells(col: Column): TypedColumn[Any, Long] = CellCountAggregate.DataCells(col) /** Computes the number of NoData cells in a column. */ - def agg_no_data_cells(col: Column): TypedColumn[Any, Long] = CellCountAggregate.NoDataCells(col) + def rf_agg_no_data_cells(col: Column): TypedColumn[Any, Long] = CellCountAggregate.NoDataCells(col) /** Compute the Tile-wise mean */ - def tile_mean(col: Column): TypedColumn[Any, Double] = + def rf_tile_mean(col: Column): TypedColumn[Any, Double] = TileMean(col) /** Compute the Tile-wise sum */ - def tile_sum(col: Column): TypedColumn[Any, Double] = + def rf_tile_sum(col: Column): TypedColumn[Any, Double] = Sum(col) /** Compute the minimum cell value in tile. */ - def tile_min(col: Column): TypedColumn[Any, Double] = + def rf_tile_min(col: Column): TypedColumn[Any, Double] = TileMin(col) /** Compute the maximum cell value in tile. */ - def tile_max(col: Column): TypedColumn[Any, Double] = + def rf_tile_max(col: Column): TypedColumn[Any, Double] = TileMax(col) /** Compute TileHistogram of Tile values. */ - def tile_histogram(col: Column): TypedColumn[Any, CellHistogram] = + def rf_tile_histogram(col: Column): TypedColumn[Any, CellHistogram] = TileHistogram(col) /** Compute statistics of Tile values. */ - def tile_stats(col: Column): TypedColumn[Any, CellStatistics] = + def rf_tile_stats(col: Column): TypedColumn[Any, CellStatistics] = TileStats(col) /** Counts the number of non-NoData cells per Tile. */ - def data_cells(tile: Column): TypedColumn[Any, Long] = + def rf_data_cells(tile: Column): TypedColumn[Any, Long] = DataCells(tile) /** Counts the number of NoData cells per Tile. */ - def no_data_cells(tile: Column): TypedColumn[Any, Long] = + def rf_no_data_cells(tile: Column): TypedColumn[Any, Long] = NoDataCells(tile) - def is_no_data_tile(tile: Column): TypedColumn[Any, Boolean] = + def rf_is_no_data_tile(tile: Column): TypedColumn[Any, Boolean] = IsNoDataTile(tile) /** Compute cell-local aggregate descriptive statistics for a column of Tiles. */ - def agg_local_stats(col: Column) = + def rf_agg_local_stats(col: Column) = LocalStatsAggregate(col) /** Compute the cell-wise/local max operation between Tiles in a column. */ - def agg_local_max(col: Column): TypedColumn[Any, Tile] = LocalTileOpAggregate.LocalMaxUDAF(col) + def rf_agg_local_max(col: Column): TypedColumn[Any, Tile] = LocalTileOpAggregate.LocalMaxUDAF(col) /** Compute the cellwise/local min operation between Tiles in a column. */ - def agg_local_min(col: Column): TypedColumn[Any, Tile] = LocalTileOpAggregate.LocalMinUDAF(col) + def rf_agg_local_min(col: Column): TypedColumn[Any, Tile] = LocalTileOpAggregate.LocalMinUDAF(col) /** Compute the cellwise/local mean operation between Tiles in a column. */ - def agg_local_mean(col: Column): TypedColumn[Any, Tile] = LocalMeanAggregate(col) + def rf_agg_local_mean(col: Column): TypedColumn[Any, Tile] = LocalMeanAggregate(col) /** Compute the cellwise/local count of non-NoData cells for all Tiles in a column. */ - def agg_local_data_cells(col: Column): TypedColumn[Any, Tile] = LocalCountAggregate.LocalDataCellsUDAF(col) + def rf_agg_local_data_cells(col: Column): TypedColumn[Any, Tile] = LocalCountAggregate.LocalDataCellsUDAF(col) /** Compute the cellwise/local count of NoData cells for all Tiles in a column. */ - def agg_local_no_data_cells(col: Column): TypedColumn[Any, Tile] = LocalCountAggregate.LocalNoDataCellsUDAF(col) + def rf_agg_local_no_data_cells(col: Column): TypedColumn[Any, Tile] = LocalCountAggregate.LocalNoDataCellsUDAF(col) /** Cellwise addition between two Tiles or Tile and scalar column. */ - def local_add(left: Column, right: Column): TypedColumn[Any, Tile] = Add(left, right) + def rf_local_add(left: Column, right: Column): TypedColumn[Any, Tile] = Add(left, right) /** Cellwise addition of a scalar value to a tile. */ - def local_add[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Add(tileCol, value) + def rf_local_add[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Add(tileCol, value) /** Cellwise subtraction between two Tiles. */ - def local_subtract(left: Column, right: Column): TypedColumn[Any, Tile] = Subtract(left, right) + def rf_local_subtract(left: Column, right: Column): TypedColumn[Any, Tile] = Subtract(left, right) /** Cellwise subtraction of a scalar value from a tile. */ - def local_subtract[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Subtract(tileCol, value) + def rf_local_subtract[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Subtract(tileCol, value) /** Cellwise multiplication between two Tiles. */ - def local_multiply(left: Column, right: Column): TypedColumn[Any, Tile] = Multiply(left, right) + def rf_local_multiply(left: Column, right: Column): TypedColumn[Any, Tile] = Multiply(left, right) /** Cellwise multiplication of a tile by a scalar value. */ - def local_multiply[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Multiply(tileCol, value) + def rf_local_multiply[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Multiply(tileCol, value) /** Cellwise division between two Tiles. */ - def local_divide(left: Column, right: Column): TypedColumn[Any, Tile] = Divide(left, right) + def rf_local_divide(left: Column, right: Column): TypedColumn[Any, Tile] = Divide(left, right) /** Cellwise division of a tile by a scalar value. */ - def local_divide[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Divide(tileCol, value) + def rf_local_divide[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Divide(tileCol, value) /** Perform an arbitrary GeoTrellis `LocalTileBinaryOp` between two Tile columns. */ - def local_algebra(op: LocalTileBinaryOp, left: Column, right: Column): + def rf_local_algebra(op: LocalTileBinaryOp, left: Column, right: Column): TypedColumn[Any, Tile] = withAlias(opName(op), left, right)( udf[Tile, Tile, Tile](op.apply).apply(left, right) ).as[Tile] /** Compute the normalized difference of two tile columns */ - def normalized_difference(left: Column, right: Column) = + def rf_normalized_difference(left: Column, right: Column) = NormalizedDifference(left, right) /** Constructor for constant tile column */ - def make_constant_tile(value: Number, cols: Int, rows: Int, cellType: String): TypedColumn[Any, Tile] = + def rf_make_constant_tile(value: Number, cols: Int, rows: Int, cellType: String): TypedColumn[Any, Tile] = udf(() => F.makeConstantTile(value, cols, rows, cellType)).apply().as(s"constant_$cellType").as[Tile] /** Alias for column of constant tiles of zero */ - def tile_zeros(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = + def rf_tile_zeros(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = udf(() => F.tileZeros(cols, rows, cellType)).apply().as(s"zeros_$cellType").as[Tile] /** Alias for column of constant tiles of one */ - def tile_ones(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = + def rf_tile_ones(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = udf(() => F.tileOnes(cols, rows, cellType)).apply().as(s"ones_$cellType").as[Tile] - /** Where the mask tile contains NODATA, replace values in the source tile with NODATA */ - def mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = + /** Where the rf_mask tile contains NODATA, replace values in the source tile with NODATA */ + def rf_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = Mask.MaskByDefined(sourceTile, maskTile) - /** Where the mask tile equals the mask value, replace values in the source tile with NODATA */ - def mask_by_value(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = + /** Where the rf_mask tile equals the rf_mask value, replace values in the source tile with NODATA */ + def rf_mask_by_value(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = Mask.MaskByValue(sourceTile, maskTile, maskValue) - /** Where the mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ - def inverse_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = + /** Where the rf_mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ + def rf_inverse_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = Mask.InverseMaskByDefined(sourceTile, maskTile) /** Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value. */ - def rasterize(geometry: Column, bounds: Column, value: Column, cols: Int, rows: Int): TypedColumn[Any, Tile] = - withAlias("rasterize", geometry)( + def rf_rasterize(geometry: Column, bounds: Column, value: Column, cols: Int, rows: Int): TypedColumn[Any, Tile] = + withAlias("rf_rasterize", geometry)( udf(F.rasterize(_: Geometry, _: Geometry, _: Int, cols, rows)).apply(geometry, bounds, value) ).as[Tile] /** Reproject a column of geometry from one CRS to another. */ - def reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRSCol: Column): TypedColumn[Any, Geometry] = + def rf_reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRSCol: Column): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRSCol) /** Reproject a column of geometry from one CRS to another. */ - def reproject_geometry(sourceGeom: Column, srcCRSCol: Column, dstCRS: CRS): TypedColumn[Any, Geometry] = + def rf_reproject_geometry(sourceGeom: Column, srcCRSCol: Column, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRSCol, dstCRS) /** Reproject a column of geometry from one CRS to another. */ - def reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = + def rf_reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRS) /** Render Tile as ASCII string, for debugging purposes. */ - def render_ascii(col: Column): TypedColumn[Any, String] = + def rf_render_ascii(col: Column): TypedColumn[Any, String] = DebugRender.RenderAscii(col) /** Render Tile cell values as numeric values, for debugging purposes. */ - def render_matrix(col: Column): TypedColumn[Any, String] = + def rf_render_matrix(col: Column): TypedColumn[Any, String] = DebugRender.RenderMatrix(col) /** Cellwise less than value comparison between two tiles. */ - def local_less(left: Column, right: Column): TypedColumn[Any, Tile] = + def rf_local_less(left: Column, right: Column): TypedColumn[Any, Tile] = Less(left, right) /** Cellwise less than value comparison between a tile and a scalar. */ - def local_less[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = + def rf_local_less[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Less(tileCol, value) /** Cellwise less than or equal to value comparison between a tile and a scalar. */ - def local_less_equal(left: Column, right: Column): TypedColumn[Any, Tile] = + def rf_local_less_equal(left: Column, right: Column): TypedColumn[Any, Tile] = LessEqual(left, right) /** Cellwise less than or equal to value comparison between a tile and a scalar. */ - def local_less_equal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = + def rf_local_less_equal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = LessEqual(tileCol, value) /** Cellwise greater than value comparison between two tiles. */ - def local_greater(left: Column, right: Column): TypedColumn[Any, Tile] = + def rf_local_greater(left: Column, right: Column): TypedColumn[Any, Tile] = Greater(left, right) /** Cellwise greater than value comparison between a tile and a scalar. */ - def local_greater[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = + def rf_local_greater[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Greater(tileCol, value) /** Cellwise greater than or equal to value comparison between two tiles. */ - def local_greater_equal(left: Column, right: Column): TypedColumn[Any, Tile] = + def rf_local_greater_equal(left: Column, right: Column): TypedColumn[Any, Tile] = GreaterEqual(left, right) /** Cellwise greater than or equal to value comparison between a tile and a scalar. */ - def local_greater_equal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = + def rf_local_greater_equal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = GreaterEqual(tileCol, value) /** Cellwise equal to value comparison between two tiles. */ - def local_equal(left: Column, right: Column): TypedColumn[Any, Tile] = + def rf_local_equal(left: Column, right: Column): TypedColumn[Any, Tile] = Equal(left, right) /** Cellwise equal to value comparison between a tile and a scalar. */ - def local_equal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = + def rf_local_equal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Equal(tileCol, value) /** Cellwise inequality comparison between two tiles. */ - def local_unequal(left: Column, right: Column): TypedColumn[Any, Tile] = + def rf_local_unequal(left: Column, right: Column): TypedColumn[Any, Tile] = Unequal(left, right) /** Cellwise inequality comparison between a tile and a scalar. */ - def local_unequal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = + def rf_local_unequal[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Unequal(tileCol, value) /** Round cell values to nearest integer without chaning cell type. */ - def round(tileCol: Column): TypedColumn[Any, Tile] = + def rf_round(tileCol: Column): TypedColumn[Any, Tile] = Round(tileCol) /** Take natural logarithm of cell values. */ - def log(tileCol: Column): TypedColumn[Any, Tile] = + def rf_log(tileCol: Column): TypedColumn[Any, Tile] = Log(tileCol) /** Take base 10 logarithm of cell values. */ - def log10(tileCol: Column): TypedColumn[Any, Tile] = + def rf_log10(tileCol: Column): TypedColumn[Any, Tile] = Log10(tileCol) /** Take base 2 logarithm of cell values. */ - def log2(tileCol: Column): TypedColumn[Any, Tile] = + def rf_log2(tileCol: Column): TypedColumn[Any, Tile] = Log2(tileCol) /** Natural logarithm of one plus cell values. */ - def log1p(tileCol: Column): TypedColumn[Any, Tile] = + def rf_log1p(tileCol: Column): TypedColumn[Any, Tile] = Log1p(tileCol) /** Exponential of cell values */ - def exp(tileCol: Column): TypedColumn[Any, Tile] = + def rf_exp(tileCol: Column): TypedColumn[Any, Tile] = Exp(tileCol) /** Ten to the power of cell values */ - def exp10(tileCol: Column): TypedColumn[Any, Tile] = + def rf_exp10(tileCol: Column): TypedColumn[Any, Tile] = Exp10(tileCol) /** Two to the power of cell values */ - def exp2(tileCol: Column): TypedColumn[Any, Tile] = + def rf_exp2(tileCol: Column): TypedColumn[Any, Tile] = Exp2(tileCol) /** Exponential of cell values, less one*/ - def expm1(tileCol: Column): TypedColumn[Any, Tile] = + def rf_expm1(tileCol: Column): TypedColumn[Any, Tile] = ExpM1(tileCol) /** Resample tile using nearest-neighbor */ - def resample[T: Numeric](tileCol: Column, value: T) = Resample(tileCol, value) + def rf_resample[T: Numeric](tileCol: Column, value: T) = Resample(tileCol, value) /** Resample tile using nearest-neighbor */ - def resample(tileCol: Column, column2: Column) = Resample(tileCol, column2) + def rf_resample(tileCol: Column, column2: Column) = Resample(tileCol, column2) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala index b3debf12d..869835c5f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCellType.scala @@ -35,7 +35,7 @@ import org.apache.spark.sql.{Column, TypedColumn} */ case class GetCellType(child: Expression) extends OnCellGridExpression with CodegenFallback { - override def nodeName: String = "cell_type" + override def nodeName: String = "rf_cell_type" def dataType: DataType = schemaOf[CellType] /** Implemented by subtypes to process incoming ProjectedRasterLike entity. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala index 1ba0b5995..f12bbd77d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala @@ -34,7 +34,7 @@ import org.locationtech.rasterframes.model.TileDimensions * @since 12/21/17 */ case class GetDimensions(child: Expression) extends OnCellGridExpression with CodegenFallback { - override def nodeName: String = "tile_dimensions" + override def nodeName: String = "rf_tile_dimensions" def dataType = schemaOf[TileDimensions] diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala index 84d938973..1e9e7e5e1 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala @@ -47,8 +47,8 @@ abstract class CellCountAggregate(isData: Boolean) extends UnaryRasterAggregate ) private def CellTest = - if (isData) tileOpAsExpression("data_cells", DataCells.op) - else tileOpAsExpression("no_data_cells", NoDataCells.op) + if (isData) tileOpAsExpression("rf_data_cells", DataCells.op) + else tileOpAsExpression("rf_no_data_cells", NoDataCells.op) val updateExpressions = Seq( If(IsNull(child), count, Add(count, CellTest(child))) @@ -77,7 +77,7 @@ object CellCountAggregate { 92384753""" ) case class DataCells(child: Expression) extends CellCountAggregate(true) { - override def nodeName: String = "agg_data_cells" + override def nodeName: String = "rf_agg_data_cells" } object DataCells { def apply(tile: Column): TypedColumn[Any, Long] = @@ -94,7 +94,7 @@ object CellCountAggregate { 23584""" ) case class NoDataCells(child: Expression) extends CellCountAggregate(false) { - override def nodeName: String = "agg_no_data_cells" + override def nodeName: String = "rf_agg_no_data_cells" } object NoDataCells { def apply(tile: Column): TypedColumn[Any, Long] = diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala index ff89e75ef..a77c3ee21 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala @@ -41,7 +41,7 @@ import org.apache.spark.sql.{Column, TypedColumn} .... """) case class CellMeanAggregate(child: Expression) extends UnaryRasterAggregate { - override def nodeName: String = "agg_mean" + override def nodeName: String = "rf_agg_mean" private lazy val sum = AttributeReference("sum", DoubleType, false, Metadata.empty)() @@ -58,7 +58,7 @@ case class CellMeanAggregate(child: Expression) extends UnaryRasterAggregate { // Cant' figure out why we can't just use the Expression directly // this is necessary to properly handle null rows. For example, // if we use `tilestats.Sum` directly, we get an NPE when the stage is executed. - private val DataCellCounts = tileOpAsExpression("data_cells", DataCells.op) + private val DataCellCounts = tileOpAsExpression("rf_data_cells", DataCells.op) private val SumCells = tileOpAsExpression("sum_cells", Sum.op) override val updateExpressions = Seq( diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala index 96f7c6172..84ea9632b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala @@ -124,7 +124,7 @@ object CellStatsAggregate { def apply(col: Column): TypedColumn[Any, CellStatistics] = new Column(new CellStatsAggregateUDAF(col.expr)) - .as(s"agg_stats($col)") // node renaming in class doesn't seem to propogate + .as(s"rf_agg_stats($col)") // node renaming in class doesn't seem to propogate .as[CellStatistics] /** Adapter hack to allow UserDefinedAggregateFunction to be referenced as an expression. */ @@ -145,7 +145,7 @@ object CellStatsAggregate { class CellStatsAggregateUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new CellStatsAggregate()), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_stats" + override def nodeName: String = "rf_agg_stats" } object CellStatsAggregateUDAF { def apply(child: Expression): CellStatsAggregateUDAF = new CellStatsAggregateUDAF(child) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala index f74c3bb54..cab065e58 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala @@ -99,7 +99,7 @@ object HistogramAggregate { def apply(col: Column): TypedColumn[Any, CellHistogram] = new Column(new HistogramAggregateUDAF(col.expr)) - .as(s"agg_approx_histogram($col)") // node renaming in class doesn't seem to propogate + .as(s"rf_agg_approx_histogram($col)") // node renaming in class doesn't seem to propogate .as[CellHistogram] /** Adapter hack to allow UserDefinedAggregateFunction to be referenced as an expression. */ @@ -116,7 +116,7 @@ object HistogramAggregate { class HistogramAggregateUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new HistogramAggregate()), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_approx_histogram" + override def nodeName: String = "rf_agg_approx_histogram" } object HistogramAggregateUDAF { def apply(child: Expression): HistogramAggregateUDAF = new HistogramAggregateUDAF(child) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala index 76c73c5a1..8300cfd04 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala @@ -87,13 +87,13 @@ object LocalCountAggregate { ) class LocalDataCellsUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new LocalCountAggregate(true)), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_local_data_cells" + override def nodeName: String = "rf_agg_local_data_cells" } object LocalDataCellsUDAF { def apply(child: Expression): LocalDataCellsUDAF = new LocalDataCellsUDAF(child) def apply(tile: Column): TypedColumn[Any, Tile] = new Column(new LocalDataCellsUDAF(tile.expr)) - .as(s"agg_local_data_cells($tile)") + .as(s"rf_agg_local_data_cells($tile)") .as[Tile] } @@ -102,13 +102,13 @@ object LocalCountAggregate { ) class LocalNoDataCellsUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new LocalCountAggregate(false)), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_local_no_data_cells" + override def nodeName: String = "rf_agg_local_no_data_cells" } object LocalNoDataCellsUDAF { def apply(child: Expression): LocalNoDataCellsUDAF = new LocalNoDataCellsUDAF(child) def apply(tile: Column): TypedColumn[Any, Tile] = new Column(new LocalNoDataCellsUDAF(tile.expr)) - .as(s"agg_local_no_data_cells($tile)") + .as(s"rf_agg_local_no_data_cells($tile)") .as[Tile] } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala index 9a127f22d..face1b8a8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala @@ -38,7 +38,7 @@ import org.locationtech.rasterframes.TileType case class LocalMeanAggregate(child: Expression) extends UnaryRasterAggregate { override def dataType: DataType = TileType - override def nodeName: String = "agg_local_mean" + override def nodeName: String = "rf_agg_local_mean" private lazy val count = AttributeReference("count", TileType, true)() diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala index 387250f55..65267ebc6 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala @@ -147,7 +147,7 @@ object LocalStatsAggregate { def apply(col: Column): TypedColumn[Any, LocalCellStatistics] = new Column(LocalStatsAggregateUDAF(col.expr)) - .as(s"agg_local_stats($col)") + .as(s"rf_agg_local_stats($col)") .as[LocalCellStatistics] /** Adapter hack to allow UserDefinedAggregateFunction to be referenced as an expression. */ @@ -164,7 +164,7 @@ object LocalStatsAggregate { class LocalStatsAggregateUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new LocalStatsAggregate()), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_local_stats" + override def nodeName: String = "rf_agg_local_stats" } object LocalStatsAggregateUDAF { def apply(child: Expression): LocalStatsAggregateUDAF = new LocalStatsAggregateUDAF(child) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala index dcfb51881..8aacffa9f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala @@ -79,7 +79,7 @@ object LocalTileOpAggregate { ) class LocalMinUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new LocalTileOpAggregate(BiasedMin)), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_local_min" + override def nodeName: String = "rf_agg_local_min" } object LocalMinUDAF { def apply(child: Expression): LocalMinUDAF = new LocalMinUDAF(child) @@ -91,7 +91,7 @@ object LocalTileOpAggregate { ) class LocalMaxUDAF(aggregateFunction: AggregateFunction, mode: AggregateMode, isDistinct: Boolean, resultId: ExprId) extends AggregateExpression(aggregateFunction, mode, isDistinct, resultId) { def this(child: Expression) = this(ScalaUDAF(Seq(ExtractTile(child)), new LocalTileOpAggregate(BiasedMax)), Complete, false, NamedExpression.newExprId) - override def nodeName: String = "agg_local_max" + override def nodeName: String = "rf_agg_local_max" } object LocalMaxUDAF { def apply(child: Expression): LocalMaxUDAF = new LocalMaxUDAF(child) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala index 7a5e6539a..bd2a4689a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/ExplodeTiles.scala @@ -43,7 +43,7 @@ case class ExplodeTiles( extends Expression with Generator with CodegenFallback { def this(children: Seq[Expression]) = this(1.0, None, children) - override def nodeName: String = "explode_tiles" + override def nodeName: String = "rf_explode_tiles" override def elementSchema: StructType = { val names = diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala index 2885f6816..e0b6b6714 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala @@ -47,7 +47,7 @@ import org.locationtech.rasterframes.util.DataBiasedOp.BiasedAdd ) case class Add(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_add" + override val nodeName: String = "rf_local_add" override protected def op(left: Tile, right: Tile): Tile = BiasedAdd(left, right) override protected def op(left: Tile, right: Double): Tile = BiasedAdd(left, right) override protected def op(left: Tile, right: Int): Tile = BiasedAdd(left, right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala index 27db49b5c..2b5f7d112 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Divide.scala @@ -43,7 +43,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Divide(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_divide" + override val nodeName: String = "rf_local_divide" override protected def op(left: Tile, right: Tile): Tile = left.localDivide(right) override protected def op(left: Tile, right: Double): Tile = left.localDivide(right) override protected def op(left: Tile, right: Int): Tile = left.localDivide(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala index 5d540db3a..a9e809b47 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Equal.scala @@ -41,7 +41,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Equal(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_equal" + override val nodeName: String = "rf_local_equal" override protected def op(left: Tile, right: Tile): Tile = left.localEqual(right) override protected def op(left: Tile, right: Double): Tile = left.localEqual(right) override protected def op(left: Tile, right: Int): Tile = left.localEqual(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala index b6d5993fc..ca9905e29 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Exp.scala @@ -41,7 +41,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Exp(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "exp" + override val nodeName: String = "rf_exp" override protected def op(tile: Tile): Tile = fpTile(tile).localPowValue(math.E) @@ -63,7 +63,7 @@ object Exp { ...""" ) case class Exp10(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "log10" + override val nodeName: String = "rf_log10" override protected def op(tile: Tile): Tile = fpTile(tile).localPowValue(10.0) @@ -84,7 +84,7 @@ object Exp10 { ...""" ) case class Exp2(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "exp2" + override val nodeName: String = "rf_exp2" override protected def op(tile: Tile): Tile = fpTile(tile).localPowValue(2.0) @@ -105,7 +105,7 @@ object Exp2{ ...""" ) case class ExpM1(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "expm1" + override val nodeName: String = "rf_expm1" override protected def op(tile: Tile): Tile = fpTile(tile).localPowValue(math.E).localSubtract(1.0) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala index a9cce3235..ad9b8bf03 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Greater.scala @@ -40,7 +40,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Greater(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_greater" + override val nodeName: String = "rf_local_greater" override protected def op(left: Tile, right: Tile): Tile = left.localGreater(right) override protected def op(left: Tile, right: Double): Tile = left.localGreater(right) override protected def op(left: Tile, right: Int): Tile = left.localGreater(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala index 8d363ca62..725898ca5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/GreaterEqual.scala @@ -41,7 +41,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class GreaterEqual(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_greater_equal" + override val nodeName: String = "rf_local_greater_equal" override protected def op(left: Tile, right: Tile): Tile = left.localGreaterOrEqual(right) override protected def op(left: Tile, right: Double): Tile = left.localGreaterOrEqual(right) override protected def op(left: Tile, right: Int): Tile = left.localGreaterOrEqual(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala index 25e053ee8..a80d628f7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Less.scala @@ -40,7 +40,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Less(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_less" + override val nodeName: String = "rf_local_less" override protected def op(left: Tile, right: Tile): Tile = left.localLess(right) override protected def op(left: Tile, right: Double): Tile = left.localLess(right) override protected def op(left: Tile, right: Int): Tile = left.localLess(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala index 51372c0ac..b9361610b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/LessEqual.scala @@ -41,7 +41,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class LessEqual(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_less_equal" + override val nodeName: String = "rf_local_less_equal" override protected def op(left: Tile, right: Tile): Tile = left.localLessOrEqual(right) override protected def op(left: Tile, right: Double): Tile = left.localLessOrEqual(right) override protected def op(left: Tile, right: Int): Tile = left.localLessOrEqual(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala index 1130e16a9..8e8d8a011 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Log.scala @@ -63,7 +63,7 @@ object Log { ...""" ) case class Log10(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "log10" + override val nodeName: String = "rf_log10" override protected def op(tile: Tile): Tile = fpTile(tile).localLog10() @@ -84,7 +84,7 @@ object Log10 { ...""" ) case class Log2(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "log2" + override val nodeName: String = "rf_log2" override protected def op(tile: Tile): Tile = fpTile(tile).localLog() / math.log(2.0) @@ -105,7 +105,7 @@ object Log2{ ...""" ) case class Log1p(child: Expression) extends UnaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "log1p" + override val nodeName: String = "rf_log1p" override protected def op(tile: Tile): Tile = fpTile(tile).localAdd(1.0).localLog() diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala index fabbcaa7a..784771906 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Multiply.scala @@ -43,7 +43,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Multiply(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_multiply" + override val nodeName: String = "rf_local_multiply" override protected def op(left: Tile, right: Tile): Tile = left.localMultiply(right) override protected def op(left: Tile, right: Double): Tile = left.localMultiply(right) override protected def op(left: Tile, right: Int): Tile = left.localMultiply(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala index b6894f90d..079fd7273 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala @@ -42,7 +42,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback ...""" ) case class NormalizedDifference(left: Expression, right: Expression) extends BinaryRasterOp with CodegenFallback { - override val nodeName: String = "normalized_difference" + override val nodeName: String = "rf_normalized_difference" override protected def op(left: Tile, right: Tile): Tile = { val diff = fpTile(left.localSubtract(right)) val sum = fpTile(left.localAdd(right)) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala index 2e813a1fa..6e752dfbc 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Resample.scala @@ -47,7 +47,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ) case class Resample(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "resample" + override val nodeName: String = "rf_resample" override protected def op(left: Tile, right: Tile): Tile = left.resample(right.cols, right.rows, NearestNeighbor) override protected def op(left: Tile, right: Double): Tile = left.resample((left.cols * right).toInt, (left.rows * right).toInt, NearestNeighbor) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala index ed04647de..0ca22cb8f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala @@ -32,7 +32,7 @@ import org.apache.spark.sql.{Column, TypedColumn} usage = "_FUNC_(tile) - Round cell values to the nearest integer without changing the cell type.", arguments = """ Arguments: - * tile - tile column to round""", + * tile - tile column to rf_round""", examples = """ Examples: > SELECT _FUNC_(tile); @@ -40,7 +40,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ) case class Round(child: Expression) extends UnaryLocalRasterOp with NullToValue with CodegenFallback { - override def nodeName: String = "round" + override def nodeName: String = "rf_round" override def na: Any = null override protected def op(child: Tile): Tile = child.localRound() } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala index ef7925dd0..c09a7ea47 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Subtract.scala @@ -43,7 +43,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Subtract(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_subtract" + override val nodeName: String = "rf_local_subtract" override protected def op(left: Tile, right: Tile): Tile = left.localSubtract(right) override protected def op(left: Tile, right: Double): Tile = left.localSubtract(right) override protected def op(left: Tile, right: Int): Tile = left.localSubtract(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala index b21334861..48a1e3963 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Unequal.scala @@ -41,7 +41,7 @@ import org.apache.spark.sql.{Column, TypedColumn} ...""" ) case class Unequal(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { - override val nodeName: String = "local_unequal" + override val nodeName: String = "rf_local_unequal" override protected def op(left: Tile, right: Tile): Tile = left.localUnequal(right) override protected def op(left: Tile, right: Double): Tile = left.localUnequal(right) override protected def op(left: Tile, right: Int): Tile = left.localUnequal(right) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index cc3110144..d426af4fd 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -70,7 +70,7 @@ package object expressions { registry.registerExpression[SetCellType]("rf_convert_cell_type") registry.registerExpression[GetDimensions]("rf_tile_dimensions") registry.registerExpression[ExtentToGeometry]("rf_extent_geometry") - registry.registerExpression[GeometryToExtent]("st_extent") + registry.registerExpression[GeometryToExtent]("rf_extent") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala index f62c88acc..a18148db3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/DataCells.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class DataCells(child: Expression) extends UnaryRasterOp with CodegenFallback with NullToValue { - override def nodeName: String = "data_cells" + override def nodeName: String = "rf_data_cells" override def dataType: DataType = LongType override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = DataCells.op(tile) override def na: Any = 0L diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala index 08eb0ec76..fd855cd39 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/IsNoDataTile.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class IsNoDataTile(child: Expression) extends UnaryRasterOp with CodegenFallback with NullToValue { - override def nodeName: String = "is_no_data_tile" + override def nodeName: String = "rf_is_no_data_tile" override def na: Any = true override def dataType: DataType = BooleanType override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = tile.isNoDataTile diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala index 379af473a..cf47ba14e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/NoDataCells.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class NoDataCells(child: Expression) extends UnaryRasterOp with CodegenFallback with NullToValue { - override def nodeName: String = "no_data_cells" + override def nodeName: String = "rf_no_data_cells" override def dataType: DataType = LongType override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = NoDataCells.op(tile) override def na: Any = 0L diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala index bac6af716..825f88d1d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala @@ -40,7 +40,7 @@ import org.locationtech.rasterframes.model.TileContext 2135.34""" ) case class Sum(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def nodeName: String = "tile_sum" + override def nodeName: String = "rf_tile_sum" override def dataType: DataType = DoubleType override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = Sum.op(tile) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala index 4ca25f0c9..96e3d3dcc 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileHistogram.scala @@ -44,7 +44,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class TileHistogram(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def nodeName: String = "tile_histogram" + override def nodeName: String = "rf_tile_histogram" override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = TileHistogram.converter(TileHistogram.op(tile)) override def dataType: DataType = CellHistogram.schema diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala index 5f387cb89..3204f4aaf 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMax.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class TileMax(child: Expression) extends UnaryRasterOp with NullToValue with CodegenFallback { - override def nodeName: String = "tile_max" + override def nodeName: String = "rf_tile_max" override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = TileMax.op(tile) override def dataType: DataType = DoubleType override def na: Any = Double.MinValue diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala index 4bd0ba611..92c833f98 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMean.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class TileMean(child: Expression) extends UnaryRasterOp with NullToValue with CodegenFallback { - override def nodeName: String = "tile_mean" + override def nodeName: String = "rf_tile_mean" override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = TileMean.op(tile) override def dataType: DataType = DoubleType override def na: Any = Double.NaN diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala index bbc691b4a..71fa0194a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileMin.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class TileMin(child: Expression) extends UnaryRasterOp with NullToValue with CodegenFallback { - override def nodeName: String = "tile_min" + override def nodeName: String = "rf_tile_min" override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = TileMin.op(tile) override def dataType: DataType = DoubleType override def na: Any = Double.MaxValue diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala index 225fbfcb7..fac6d330e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/TileStats.scala @@ -44,7 +44,7 @@ import org.locationtech.rasterframes.model.TileContext ) case class TileStats(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def nodeName: String = "tile_stats" + override def nodeName: String = "rf_tile_stats" override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = TileStats.converter(TileStats.op(tile).orNull) override def dataType: DataType = CellStatistics.schema diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala index f13551d7e..babb9c7b7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/DebugRender.scala @@ -55,7 +55,7 @@ object DebugRender { * tile - tile to render""" ) case class RenderAscii(child: Expression) extends DebugRender(true) { - override def nodeName: String = "render_ascii" + override def nodeName: String = "rf_render_ascii" } object RenderAscii { def apply(tile: Column): TypedColumn[Any, String] = @@ -69,7 +69,7 @@ object DebugRender { * tile - tile to render""" ) case class RenderMatrix(child: Expression) extends DebugRender(false) { - override def nodeName: String = "render_matrix" + override def nodeName: String = "rf_render_matrix" } object RenderMatrix { def apply(tile: Column): TypedColumn[Any, String] = diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala index b02a216ec..7303baa29 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala @@ -40,7 +40,7 @@ import org.locationtech.geomesa.spark.jts.encoders.SpatialEncoders * @since 8/24/18 */ case class ExtentToGeometry(child: Expression) extends UnaryExpression with CodegenFallback { - override def nodeName: String = "extent_geometry" + override def nodeName: String = "rf_extent_geometry" override def dataType: DataType = JTSTypes.GeometryTypeInstance diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala index 9fb333838..ac755cb0b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala @@ -97,7 +97,7 @@ object Mask { ) case class MaskByDefined(target: Expression, mask: Expression) extends Mask(target, mask, Literal(0), false) { - override def nodeName: String = "mask" + override def nodeName: String = "rf_mask" } object MaskByDefined { def apply(targetTile: Column, maskTile: Column): TypedColumn[Any, Tile] = @@ -117,7 +117,7 @@ object Mask { ) case class InverseMaskByDefined(leftTile: Expression, rightTile: Expression) extends Mask(leftTile, rightTile, Literal(0), true) { - override def nodeName: String = "inverse_mask" + override def nodeName: String = "rf_inverse_mask" } object InverseMaskByDefined { def apply(srcTile: Column, maskingTile: Column): TypedColumn[Any, Tile] = @@ -137,7 +137,7 @@ object Mask { ) case class MaskByValue(leftTile: Expression, rightTile: Expression, maskValue: Expression) extends Mask(leftTile, rightTile, maskValue, false) { - override def nodeName: String = "mask_by_value" + override def nodeName: String = "rf_mask_by_value" } object MaskByValue { def apply(srcTile: Column, maskingTile: Column, maskValue: Column): TypedColumn[Any, Tile] = diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala index 42a304bb3..83a5d876a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -43,7 +43,7 @@ import org.locationtech.rasterframes.jts.ReprojectionTransformer case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: Expression) extends Expression with CodegenFallback with ExpectsInputTypes { - override def nodeName: String = "reproject_geometry" + override def nodeName: String = "rf_reproject_geometry" override def dataType: DataType = JTSTypes.GeometryTypeInstance override def nullable: Boolean = geometry.nullable || srcCRS.nullable || dstCRS.nullable override def children: Seq[Expression] = Seq(geometry, srcCRS, dstCRS) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala index 7e3ba0a82..5d7786f1c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayDouble.scala @@ -37,7 +37,7 @@ import org.locationtech.rasterframes.model.TileContext * tile - tile to convert""" ) case class TileToArrayDouble(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def nodeName: String = "tile_to_array_double" + override def nodeName: String = "rf_tile_to_array_double" override def dataType: DataType = DataTypes.createArrayType(DoubleType, false) override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = { ArrayData.toArrayData(tile.toArrayDouble()) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala index 3b1c697b3..c299d57c7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/TileToArrayInt.scala @@ -38,7 +38,7 @@ import org.locationtech.rasterframes.model.TileContext * tile - tile to convert""" ) case class TileToArrayInt(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def nodeName: String = "tile_to_array_int" + override def nodeName: String = "rf_tile_to_array_int" override def dataType: DataType = DataTypes.createArrayType(IntegerType, false) override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = { ArrayData.toArrayData(tile.toArray()) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala b/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala index c3ff11583..38f978231 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ml/TileExploder.scala @@ -58,7 +58,7 @@ class TileExploder(override val uid: String) extends Transformer val (tiles, nonTiles) = selectTileAndNonTileFields(dataset.schema) val tileCols = tiles.map(f ⇒ col(f.name)) val nonTileCols = nonTiles.map(f ⇒ col(f.name)) - val exploder = explode_tiles(tileCols: _*) + val exploder = rf_explode_tiles(tileCols: _*) dataset.select(nonTileCols :+ exploder: _*) } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala index ac3842cfc..083a58944 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -53,7 +53,7 @@ object ZeroSevenCompatibilityKit { // format: off /** Create a row for each cell in Tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def explodeTiles(cols: Column*): Column = delegate.explode_tiles(cols: _*) + def explodeTiles(cols: Column*): Column = delegate.rf_explode_tiles(cols: _*) /** Create a row for each cell in Tile with random sampling and optional seed. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") @@ -72,7 +72,7 @@ object ZeroSevenCompatibilityKit { @Experimental /** Convert array in `arrayCol` into a Tile of dimensions `cols` and `rows`*/ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def arrayToTile(arrayCol: Column, cols: Int, rows: Int) = withAlias("array_to_tile", arrayCol)( + def arrayToTile(arrayCol: Column, cols: Int, rows: Int) = withAlias("rf_array_to_tile", arrayCol)( udf[Tile, AnyRef](F.arrayToTile(cols, rows)).apply(arrayCol) ) @@ -112,11 +112,11 @@ object ZeroSevenCompatibilityKit { /** Compute the full column aggregate floating point histogram. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def aggHistogram(col: Column): TypedColumn[Any, CellHistogram] = delegate.agg_approx_histogram(col) + def aggHistogram(col: Column): TypedColumn[Any, CellHistogram] = delegate.rf_agg_approx_histogram(col) /** Compute the full column aggregate floating point statistics. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def aggStats(col: Column): TypedColumn[Any, CellStatistics] = delegate.agg_stats(col) + def aggStats(col: Column): TypedColumn[Any, CellStatistics] = delegate.rf_agg_stats(col) /** Computes the column aggregate mean. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") @@ -124,101 +124,101 @@ object ZeroSevenCompatibilityKit { /** Computes the number of non-NoData cells in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def aggDataCells(col: Column): TypedColumn[Any, Long] = delegate.agg_data_cells(col) + def aggDataCells(col: Column): TypedColumn[Any, Long] = delegate.rf_agg_data_cells(col) /** Computes the number of NoData cells in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def aggNoDataCells(col: Column): TypedColumn[Any, Long] = delegate.agg_no_data_cells(col) + def aggNoDataCells(col: Column): TypedColumn[Any, Long] = delegate.rf_agg_no_data_cells(col) /** Compute the Tile-wise mean */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def tileMean(col: Column): TypedColumn[Any, Double] = delegate.tile_mean(col) + def tileMean(col: Column): TypedColumn[Any, Double] = delegate.rf_tile_mean(col) /** Compute the Tile-wise sum */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def tileSum(col: Column): TypedColumn[Any, Double] = delegate.tile_sum(col) + def tileSum(col: Column): TypedColumn[Any, Double] = delegate.rf_tile_sum(col) /** Compute the minimum cell value in tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def tileMin(col: Column): TypedColumn[Any, Double] = delegate.tile_min(col) + def tileMin(col: Column): TypedColumn[Any, Double] = delegate.rf_tile_min(col) /** Compute the maximum cell value in tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def tileMax(col: Column): TypedColumn[Any, Double] = delegate.tile_max(col) + def tileMax(col: Column): TypedColumn[Any, Double] = delegate.rf_tile_max(col) /** Compute TileHistogram of Tile values. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def tileHistogram(col: Column): TypedColumn[Any, CellHistogram] = delegate.tile_histogram(col) + def tileHistogram(col: Column): TypedColumn[Any, CellHistogram] = delegate.rf_tile_histogram(col) /** Compute statistics of Tile values. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def tileStats(col: Column): TypedColumn[Any, CellStatistics] = delegate.tile_stats(col) + def tileStats(col: Column): TypedColumn[Any, CellStatistics] = delegate.rf_tile_stats(col) /** Counts the number of non-NoData cells per Tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def dataCells(tile: Column): TypedColumn[Any, Long] = delegate.data_cells(tile) + def dataCells(tile: Column): TypedColumn[Any, Long] = delegate.rf_data_cells(tile) /** Counts the number of NoData cells per Tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def noDataCells(tile: Column): TypedColumn[Any, Long] = delegate.no_data_cells(tile) + def noDataCells(tile: Column): TypedColumn[Any, Long] = delegate.rf_no_data_cells(tile) @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def isNoDataTile(tile: Column): TypedColumn[Any, Boolean] = delegate.is_no_data_tile(tile) + def isNoDataTile(tile: Column): TypedColumn[Any, Boolean] = delegate.rf_is_no_data_tile(tile) /** Compute cell-local aggregate descriptive statistics for a column of Tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAggStats(col: Column): Column = delegate.agg_local_stats(col) + def localAggStats(col: Column): Column = delegate.rf_agg_local_stats(col) /** Compute the cell-wise/local max operation between Tiles in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAggMax(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_max(col) + def localAggMax(col: Column): TypedColumn[Any, Tile] = delegate.rf_agg_local_max(col) /** Compute the cellwise/local min operation between Tiles in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAggMin(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_min(col) + def localAggMin(col: Column): TypedColumn[Any, Tile] = delegate.rf_agg_local_min(col) /** Compute the cellwise/local mean operation between Tiles in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAggMean(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_mean(col) + def localAggMean(col: Column): TypedColumn[Any, Tile] = delegate.rf_agg_local_mean(col) /** Compute the cellwise/local count of non-NoData cells for all Tiles in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAggDataCells(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_data_cells(col) + def localAggDataCells(col: Column): TypedColumn[Any, Tile] = delegate.rf_agg_local_data_cells(col) /** Compute the cellwise/local count of NoData cells for all Tiles in a column. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAggNoDataCells(col: Column): TypedColumn[Any, Tile] = delegate.agg_local_no_data_cells(col) + def localAggNoDataCells(col: Column): TypedColumn[Any, Tile] = delegate.rf_agg_local_no_data_cells(col) /** Cellwise addition between two Tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAdd(left: Column, right: Column): Column = delegate.local_add(left, right) + def localAdd(left: Column, right: Column): Column = delegate.rf_local_add(left, right) /** Cellwise addition of a scalar to a tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localAddScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_add(tileCol, value) + def localAddScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_add(tileCol, value) /** Cellwise subtraction between two Tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localSubtract(left: Column, right: Column): Column = delegate.local_subtract(left, right) + def localSubtract(left: Column, right: Column): Column = delegate.rf_local_subtract(left, right) /** Cellwise subtraction of a scalar from a tile. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localSubtractScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_subtract(tileCol, value) + def localSubtractScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_subtract(tileCol, value) /** Cellwise multiplication between two Tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localMultiply(left: Column, right: Column): Column = delegate.local_multiply(left, right) + def localMultiply(left: Column, right: Column): Column = delegate.rf_local_multiply(left, right) /** Cellwise multiplication of a tile by a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localMultiplyScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_multiply(tileCol, value) + def localMultiplyScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_multiply(tileCol, value) /** Cellwise division between two Tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localDivide(left: Column, right: Column): Column = delegate.local_divide(left, right) + def localDivide(left: Column, right: Column): Column = delegate.rf_local_divide(left, right) /** Cellwise division of a tile by a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localDivideScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_divide(tileCol, value) + def localDivideScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_divide(tileCol, value) /** Perform an arbitrary GeoTrellis `LocalTileBinaryOp` between two Tile columns. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localAlgebra(op: LocalTileBinaryOp, left: Column, right: Column): @@ -229,7 +229,7 @@ object ZeroSevenCompatibilityKit { /** Compute the normalized difference of two tile columns */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def normalizedDifference(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.normalized_difference(left, right) + def normalizedDifference(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.rf_normalized_difference(left, right) /** Constructor for constant tile column */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") @@ -246,76 +246,76 @@ object ZeroSevenCompatibilityKit { def tileOnes(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = udf(() => F.tileOnes(cols, rows, cellType)).apply().as(s"ones_$cellType").as[Tile] - /** Where the mask tile equals the mask value, replace values in the source tile with NODATA */ + /** Where the rf_mask tile equals the rf_mask value, replace values in the source tile with NODATA */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def maskByValue(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = - delegate.mask_by_value(sourceTile, maskTile, maskValue) + delegate.rf_mask_by_value(sourceTile, maskTile, maskValue) - /** Where the mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ + /** Where the rf_mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def inverseMask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = - delegate.inverse_mask(sourceTile, maskTile) + delegate.rf_inverse_mask(sourceTile, maskTile) /** Reproject a column of geometry from one CRS to another. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def reprojectGeometry(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = - delegate.reproject_geometry(sourceGeom, srcCRS, dstCRS) + delegate.rf_reproject_geometry(sourceGeom, srcCRS, dstCRS) /** Render Tile as ASCII string for debugging purposes. */ @Experimental @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def renderAscii(col: Column): TypedColumn[Any, String] = delegate.render_ascii(col) + def renderAscii(col: Column): TypedColumn[Any, String] = delegate.rf_render_ascii(col) /** Cellwise less than value comparison between two tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localLess(left: Column, right: Column): TypedColumn[Any, Tile] = - delegate.local_less(left, right) + delegate.rf_local_less(left, right) /** Cellwise less than value comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localLessScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_less(tileCol, value) + def localLessScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_less(tileCol, value) /** Cellwise less than or equal to value comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localLessEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_less_equal(left, right) + def localLessEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.rf_local_less_equal(left, right) /** Cellwise less than or equal to value comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localLessEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_less_equal(tileCol, value) + def localLessEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_less_equal(tileCol, value) /** Cellwise greater than value comparison between two tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def localGreater(left: Column, right: Column): TypedColumn[Any, Tile] = - delegate.local_greater(left, right) + delegate.rf_local_greater(left, right) /** Cellwise greater than value comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localGreaterScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_greater(tileCol, value) + def localGreaterScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_greater(tileCol, value) /** Cellwise greater than or equal to value comparison between two tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localGreaterEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_greater_equal(left, right) + def localGreaterEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.rf_local_greater_equal(left, right) /** Cellwise greater than or equal to value comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localGreaterEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_greater_equal(tileCol, value) + def localGreaterEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_greater_equal(tileCol, value) /** Cellwise equal to value comparison between two tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_equal(left, right) + def localEqual(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.rf_local_equal(left, right) /** Cellwise equal to value comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_equal(tileCol, value) + def localEqualScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_equal(tileCol, value) /** Cellwise inequality comparison between two tiles. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localUnequal(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.local_unequal(left, right) + def localUnequal(left: Column, right: Column): TypedColumn[Any, Tile] = delegate.rf_local_unequal(left, right) /** Cellwise inequality comparison between a tile and a scalar. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") - def localUnequalScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.local_unequal(tileCol, value) + def localUnequalScalar[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = delegate.rf_local_unequal(tileCol, value) } def register(sqlContext: SQLContext): Unit = { diff --git a/core/src/test/scala/examples/Classification.scala b/core/src/test/scala/examples/Classification.scala index 4d6579518..ae87aa6cf 100644 --- a/core/src/test/scala/examples/Classification.scala +++ b/core/src/test/scala/examples/Classification.scala @@ -73,7 +73,7 @@ object Classification extends App { .toRF(tileSize, tileSize, targetCol) // Take a peek at what kind of label data we have to work with. - target.select(agg_stats(target(targetCol))).show + target.select(rf_agg_stats(target(targetCol))).show val abt = joinedRF.spatialJoin(target) @@ -141,7 +141,7 @@ object Classification extends App { val tlm = joinedRF.tileLayerMetadata.left.get val retiled = scored.groupBy($"spatial_key").agg( - assemble_tile( + rf_assemble_tile( $"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, IntConstantNoDataCellType ) diff --git a/core/src/test/scala/examples/Clustering.scala b/core/src/test/scala/examples/Clustering.scala index 6fc64f0e7..c5e08ca1b 100644 --- a/core/src/test/scala/examples/Clustering.scala +++ b/core/src/test/scala/examples/Clustering.scala @@ -89,7 +89,7 @@ object Clustering extends App { val tlm = joinedRF.tileLayerMetadata.left.get val retiled = clustered.groupBy($"spatial_key").agg( - assemble_tile( + rf_assemble_tile( $"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) ) diff --git a/core/src/test/scala/examples/Exporting.scala b/core/src/test/scala/examples/Exporting.scala index e78e7cd3f..71ebb7faf 100644 --- a/core/src/test/scala/examples/Exporting.scala +++ b/core/src/test/scala/examples/Exporting.scala @@ -52,17 +52,17 @@ object Exporting extends App { // The @scaladoc[`tile_to_array`][tile_to_array] column function requires a type parameter to indicate the array element // type you would like used. The following types may be used: `Int`, `Double`, `Byte`, `Short`, `Float` - val withArrays = rf.withColumn("tileData", tile_to_array_int($"tile")).drop("tile") + val withArrays = rf.withColumn("tileData", rf_tile_to_array_int($"tile")).drop("tile") withArrays.show(5, 40) // You can convert the data back to an array, but you have to specify the target tile dimensions. - val tileBack = withArrays.withColumn("tileAgain", array_to_tile($"tileData", 128, 128)) + val tileBack = withArrays.withColumn("tileAgain", rf_array_to_tile($"tileData", 128, 128)) tileBack.drop("tileData").show(5, 40) // Note that the created tile will not have a `NoData` value associated with it. Here's how you can do that: - val tileBackAgain = withArrays.withColumn("tileAgain", with_no_data(array_to_tile($"tileData", 128, 128), 3)) + val tileBackAgain = withArrays.withColumn("tileAgain", rf_with_no_data(rf_array_to_tile($"tileData", 128, 128), 3)) tileBackAgain.drop("tileData").show(5, 50) // ## Writing to Parquet @@ -78,8 +78,8 @@ object Exporting extends App { val equalized = rf.withColumn("equalized", equalizer($"tile")).asRF equalized.printSchema - equalized.select(agg_stats($"tile")).show(false) - equalized.select(agg_stats($"equalized")).show(false) + equalized.select(rf_agg_stats($"tile")).show(false) + equalized.select(rf_agg_stats($"equalized")).show(false) // We write it out just like any other DataFrame, including the ability to specify partitioning: @@ -98,8 +98,8 @@ object Exporting extends App { val rf2 = spark.read.parquet(filePath) rf2.printSchema - equalized.select(agg_stats($"tile")).show(false) - equalized.select(agg_stats($"equalized")).show(false) + equalized.select(rf_agg_stats($"tile")).show(false) + equalized.select(rf_agg_stats($"equalized")).show(false) // ## Converting to `RDD` and `TileLayerRDD` // diff --git a/core/src/test/scala/examples/LocalArithmetic.scala b/core/src/test/scala/examples/LocalArithmetic.scala index 99970f560..26c9bf6d4 100644 --- a/core/src/test/scala/examples/LocalArithmetic.scala +++ b/core/src/test/scala/examples/LocalArithmetic.scala @@ -52,12 +52,12 @@ object LocalArithmetic extends App { map { case (b, t) ⇒ t.projectedRaster.toRF(s"band_$b") }. reduce(_ spatialJoin _) - val addRF = joinedRF.withColumn("1+2", local_add(joinedRF("band_1"), joinedRF("band_2"))).asRF - val divideRF = joinedRF.withColumn("1/2", local_divide(joinedRF("band_1"), joinedRF("band_2"))).asRF + val addRF = joinedRF.withColumn("1+2", rf_local_add(joinedRF("band_1"), joinedRF("band_2"))).asRF + val divideRF = joinedRF.withColumn("1/2", rf_local_divide(joinedRF("band_1"), joinedRF("band_2"))).asRF addRF.select("1+2").collect().apply(0) .getClass - val raster = divideRF.select(tile_sum(divideRF("1/2")), - tile_sum(joinedRF("band_1")), tile_sum(joinedRF("band_2"))) + val raster = divideRF.select(rf_tile_sum(divideRF("1/2")), + rf_tile_sum(joinedRF("band_1")), rf_tile_sum(joinedRF("band_2"))) raster.show(1) } \ No newline at end of file diff --git a/core/src/test/scala/examples/Masking.scala b/core/src/test/scala/examples/Masking.scala index 1d93b913c..4470e8871 100644 --- a/core/src/test/scala/examples/Masking.scala +++ b/core/src/test/scala/examples/Masking.scala @@ -33,9 +33,9 @@ object Masking extends App { val withMaskedTile = joinedRF.withColumn("maskTile", threshold(joinedRF("band_1"))).asRF - withMaskedTile.select(no_data_cells(withMaskedTile("maskTile"))).show() + withMaskedTile.select(rf_no_data_cells(withMaskedTile("maskTile"))).show() - val masked = withMaskedTile.withColumn("masked", mask(joinedRF("band_2"), joinedRF("maskTile"))).asRF + val masked = withMaskedTile.withColumn("masked", rf_mask(joinedRF("band_2"), joinedRF("maskTile"))).asRF val maskRF = masked.toRaster(masked("masked"), 466, 428) val b2 = masked.toRaster(masked("band_2"), 466, 428) diff --git a/core/src/test/scala/examples/MeanValue.scala b/core/src/test/scala/examples/MeanValue.scala index 192685b2d..5a2571404 100644 --- a/core/src/test/scala/examples/MeanValue.scala +++ b/core/src/test/scala/examples/MeanValue.scala @@ -44,7 +44,7 @@ object MeanValue extends App { rf.printSchema val tileCol = rf("tile") - rf.agg(agg_no_data_cells(tileCol), agg_data_cells(tileCol), agg_mean(tileCol)).show(false) + rf.agg(rf_agg_no_data_cells(tileCol), rf_agg_data_cells(tileCol), rf_agg_mean(tileCol)).show(false) spark.stop() } diff --git a/core/src/test/scala/examples/Tour.scala b/core/src/test/scala/examples/Tour.scala index 208e82564..8729c7d51 100644 --- a/core/src/test/scala/examples/Tour.scala +++ b/core/src/test/scala/examples/Tour.scala @@ -57,16 +57,16 @@ object Tour extends App { rf.show(8, false) // Confirm we have equally sized tiles - rf.select(tile_dimensions($"tile")).distinct().show() + rf.select(rf_tile_dimensions($"tile")).distinct().show() // Count the number of no-data cells - rf.select(agg_no_data_cells($"tile")).show(false) + rf.select(rf_agg_no_data_cells($"tile")).show(false) // Compute per-tile statistics - rf.select(tile_stats($"tile")).show(8, false) + rf.select(rf_tile_stats($"tile")).show(8, false) // Compute some aggregate stats over all cells - rf.select(agg_stats($"tile")).show(false) + rf.select(rf_agg_stats($"tile")).show(false) // Create a Spark UDT to perform contrast adjustment via GeoTrellis val contrast = udf((t: Tile) ⇒ t.sigmoidal(0.2, 10)) @@ -75,14 +75,14 @@ object Tour extends App { val withAdjusted = rf.withColumn("adjusted", contrast($"tile")).asRF // Show the stats for the adjusted version - withAdjusted.select(agg_stats($"adjusted")).show(false) + withAdjusted.select(rf_agg_stats($"adjusted")).show(false) // Reassemble into a raster and save to a file val raster = withAdjusted.toRaster($"adjusted", 774, 500) GeoTiff(raster).write("contrast-adjusted.tiff") // Perform some arbitrary local ops between columns and render - val withOp = withAdjusted.withColumn("op", local_subtract($"tile", $"adjusted")).asRF + val withOp = withAdjusted.withColumn("op", rf_local_subtract($"tile", $"adjusted")).asRF val raster2 = withOp.toRaster($"op", 774, 500) GeoTiff(raster2).write("with-op.tiff") @@ -91,7 +91,7 @@ object Tour extends App { val k = 4 // SparkML doesn't like NoData/NaN values, so we set the no-data value to something less offensive - val forML = rf.select(rf.spatialKeyColumn, with_no_data($"tile", 99999) as "tile").asRF + val forML = rf.select(rf.spatialKeyColumn, rf_with_no_data($"tile", 99999) as "tile").asRF // First we instantiate the transformer that converts tile rows into cell rows. val exploder = new TileExploder() @@ -123,7 +123,7 @@ object Tour extends App { // RasterFrames provides a special aggregation function for assembling tiles from cells with column/row indexes val retiled = clusteredCells.groupBy(forML.spatialKeyColumn).agg( - assemble_tile($"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) + rf_assemble_tile($"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) ) val clusteredRF = retiled.asRF($"spatial_key", tlm) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala index ac09b86c9..15701b166 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala @@ -52,7 +52,7 @@ class ExplodeSpec extends TestEnvironment with TestData { assert(query2.columns.length === 4) val df = Seq[(Tile, Tile)]((byteArrayTile, byteArrayTile)).toDF("tile1", "tile2") - val exploded = df.select(explode_tiles($"tile1", $"tile2")) + val exploded = df.select(rf_explode_tiles($"tile1", $"tile2")) //exploded.printSchema() assert(exploded.columns.length === 4) assert(exploded.count() === 9) @@ -61,17 +61,17 @@ class ExplodeSpec extends TestEnvironment with TestData { it("should explode tiles with random sampling") { val df = Seq[(Tile, Tile)]((byteArrayTile, byteArrayTile)).toDF("tile1", "tile2") - val exploded = df.select(explode_tiles_sample(0.5, $"tile1", $"tile2")) + val exploded = df.select(rf_explode_tiles_sample(0.5, $"tile1", $"tile2")) assert(exploded.columns.length === 4) assert(exploded.count() < 9) } it("should handle null tiles") { val df = Seq[Tile](null, byteArrayTile, null, byteArrayTile, null).toDF("tile1") - val exploded = df.select(explode_tiles($"tile1")) + val exploded = df.select(rf_explode_tiles($"tile1")) assert(exploded.count === byteArrayTile.size * 2) val df2 = Seq[(Tile, Tile)]((byteArrayTile, null), (null, byteArrayTile), (byteArrayTile, byteArrayTile)).toDF("tile1", "tile2") - val exploded2 = df2.select(explode_tiles($"tile1", $"tile2")) + val exploded2 = df2.select(rf_explode_tiles($"tile1", $"tile2")) assert(exploded2.count === byteArrayTile.size * 3) } @@ -79,7 +79,7 @@ class ExplodeSpec extends TestEnvironment with TestData { // Create a tile with a single (wierd) no-data value val tile: Tile = UShortArrayTile(rangeArray(9, _.toShort), 3, 3, 5.toShort) val cells = Seq(tile).toDF("tile") - .select(explode_tiles($"tile")) + .select(rf_explode_tiles($"tile")) .select($"tile".as[Double]) .collect() @@ -89,7 +89,7 @@ class ExplodeSpec extends TestEnvironment with TestData { it("should handle user-defined NoData values in tile sampler") { val tiles = allTileTypes.filter(t ⇒ !t.isInstanceOf[BitArrayTile]).map(_.withNoData(Some(3))) val cells = tiles.toDF("tile") - .select(explode_tiles($"tile")) + .select(rf_explode_tiles($"tile")) .select($"tile".as[Double]) .collect() cells.count(_.isNaN) should be(tiles.size) @@ -105,33 +105,34 @@ class ExplodeSpec extends TestEnvironment with TestData { val tile = FloatConstantTile(1.1f, 10, 10, FloatCellType) val df = Seq[Tile](tile).toDF("tile") - val arrayDF = df.select(tile_to_array_double($"tile").as[Array[Double]]) + val arrayDF = df.select(rf_tile_to_array_double($"tile").as[Array[Double]]) arrayDF.first().sum should be (110.0 +- 0.0001) } it("should convert an array into a tile") { val tile = FloatConstantTile(1.1f, 10, 10, FloatCellType) val df = Seq[Tile](tile, null).toDF("tile") - val arrayDF = df.withColumn("tileArray", tile_to_array_double($"tile")) + val arrayDF = df.withColumn("tileArray", rf_tile_to_array_double($"tile")) - val back = arrayDF.withColumn("backToTile", array_to_tile($"tileArray", 10, 10)) + val back = arrayDF.withColumn("backToTile", rf_array_to_tile($"tileArray", 10, 10)) val result = back.select($"backToTile".as[Tile]).first assert(result.toArrayDouble() === tile.toArrayDouble()) - val hasNoData = back.withColumn("with_no_data", with_no_data($"backToTile", 0)) + val hasNoData = back.withColumn("withNoData", rf_with_no_data($"backToTile", 0)) - val result2 = hasNoData.select($"with_no_data".as[Tile]).first + val result2 = hasNoData.select($"withNoData".as[Tile]).first assert(result2.cellType.asInstanceOf[UserDefinedNoData[_]].noDataValue === 0) } it("should reassemble single exploded tile") { val df = Seq[Tile](byteArrayTile).toDF("tile") - .select(explode_tiles($"tile")) + .select(rf_explode_tiles($"tile")) - val assembled = df.agg(assemble_tile( + val assembled = df.agg( + rf_assemble_tile( COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, TILE_COLUMN, @@ -146,12 +147,13 @@ class ExplodeSpec extends TestEnvironment with TestData { val image = sampleSmallGeoTiff val tinyTiles = image.projectedRaster.toRF(10, 10) - val exploded = tinyTiles.select(tinyTiles.spatialKeyColumn, explode_tiles(tinyTiles.tileColumns.head)) + val exploded = tinyTiles.select(tinyTiles.spatialKeyColumn, rf_explode_tiles(tinyTiles.tileColumns.head)) //exploded.printSchema() val assembled = exploded.groupBy(tinyTiles.spatialKeyColumn) - .agg(assemble_tile( + .agg( + rf_assemble_tile( COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, TILE_COLUMN, diff --git a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala index 8e50935de..ea26594f7 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala @@ -59,17 +59,17 @@ class GeometryOperationsSpec extends TestEnvironment with TestData { val (cols, rows) = tlm.layout.tileLayout.tileDimensions - val rasterized = toRasterize.withColumn("rasterized", rasterize($"geom", GEOMETRY_COLUMN, $"__fid__", cols, rows)) + val rasterized = toRasterize.withColumn("rasterized", rf_rasterize($"geom", GEOMETRY_COLUMN, $"__fid__", cols, rows)) assert(rasterized.count() === df.count() * rf.count()) - assert(rasterized.select(tile_dimensions($"rasterized")).distinct().count() === 1) - val pixelCount = rasterized.select(agg_data_cells($"rasterized")).first() + assert(rasterized.select(rf_tile_dimensions($"rasterized")).distinct().count() === 1) + val pixelCount = rasterized.select(rf_agg_data_cells($"rasterized")).first() assert(pixelCount < cols * rows) toRasterize.createOrReplaceTempView("stuff") val viaSQL = sql(s"select rf_rasterize(geom, geometry, __fid__, $cols, $rows) as rasterized from stuff") - assert(viaSQL.select(agg_data_cells($"rasterized")).first === pixelCount) + assert(viaSQL.select(rf_agg_data_cells($"rasterized")).first === pixelCount) //rasterized.select($"rasterized".as[Tile]).foreach(t ⇒ t.renderPng(ColorMaps.IGBP).write("target/" + t.hashCode() + ".png")) } diff --git a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala index cce1eba64..a9da6cbcb 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala @@ -82,7 +82,7 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { it("should provide a means of getting a bounding box") { import spark.implicits._ - val boxed = rf.select(GEOMETRY_COLUMN, st_extent(GEOMETRY_COLUMN) as "extent") + val boxed = rf.select(GEOMETRY_COLUMN, rf_extent(GEOMETRY_COLUMN) as "extent") assert(boxed.select($"extent".as[Extent]).first.area > 0) assert(boxed.toDF("bounds", "bbox").select("bbox.*").schema.length === 4) } @@ -110,9 +110,9 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { val df = Seq((latLng, webMercator)).toDF("ll", "wm") val rp = df.select( - reproject_geometry($"ll", LatLng, WebMercator) as "wm2", - reproject_geometry($"wm", WebMercator, LatLng) as "ll2", - reproject_geometry(reproject_geometry($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" + rf_reproject_geometry($"ll", LatLng, WebMercator) as "wm2", + rf_reproject_geometry($"wm", WebMercator, LatLng) as "ll2", + rf_reproject_geometry(rf_reproject_geometry($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" ).as[(Geometry, Geometry, Geometry)] diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala index f3e41bc9a..a23cfb771 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala @@ -87,7 +87,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys assert(rf.schema.head.metadata.json.contains("tileLayout")) assert( - rf.select(tile_dimensions($"tile")) + rf.select(rf_tile_dimensions($"tile")) .as[Tuple1[(Int, Int)]] .map(_._1) .collect() diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 6571d9c25..a7e94c2d2 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -71,46 +71,46 @@ class RasterFunctionsSpec extends FunSpec it("should local_add") { val df = Seq((one, two)).toDF("one", "two") - val maybeThree = df.select(local_add($"one", $"two")).as[ProjectedRasterTile] + val maybeThree = df.select(rf_local_add($"one", $"two")).as[ProjectedRasterTile] assertEqual(maybeThree.first(), three) assertEqual(df.selectExpr("rf_local_add(one, two)").as[ProjectedRasterTile].first(), three) - val maybeThreeTile = df.select(local_add(ExtractTile($"one"), ExtractTile($"two"))).as[Tile] + val maybeThreeTile = df.select(rf_local_add(ExtractTile($"one"), ExtractTile($"two"))).as[Tile] assertEqual(maybeThreeTile.first(), three.toArrayTile()) checkDocs("rf_local_add") } - it("should local_subtract") { + it("should rf_local_subtract") { val df = Seq((three, two)).toDF("three", "two") - val maybeOne = df.select(local_subtract($"three", $"two")).as[ProjectedRasterTile] + val maybeOne = df.select(rf_local_subtract($"three", $"two")).as[ProjectedRasterTile] assertEqual(maybeOne.first(), one) assertEqual(df.selectExpr("rf_local_subtract(three, two)").as[ProjectedRasterTile].first(), one) val maybeOneTile = - df.select(local_subtract(ExtractTile($"three"), ExtractTile($"two"))).as[Tile] + df.select(rf_local_subtract(ExtractTile($"three"), ExtractTile($"two"))).as[Tile] assertEqual(maybeOneTile.first(), one.toArrayTile()) checkDocs("rf_local_subtract") } - it("should local_multiply") { + it("should rf_local_multiply") { val df = Seq((three, two)).toDF("three", "two") - val maybeSix = df.select(local_multiply($"three", $"two")).as[ProjectedRasterTile] + val maybeSix = df.select(rf_local_multiply($"three", $"two")).as[ProjectedRasterTile] assertEqual(maybeSix.first(), six) assertEqual(df.selectExpr("rf_local_multiply(three, two)").as[ProjectedRasterTile].first(), six) val maybeSixTile = - df.select(local_multiply(ExtractTile($"three"), ExtractTile($"two"))).as[Tile] + df.select(rf_local_multiply(ExtractTile($"three"), ExtractTile($"two"))).as[Tile] assertEqual(maybeSixTile.first(), six.toArrayTile()) checkDocs("rf_local_multiply") } - it("should local_divide") { + it("should rf_local_divide") { val df = Seq((six, two)).toDF("six", "two") - val maybeThree = df.select(local_divide($"six", $"two")).as[ProjectedRasterTile] + val maybeThree = df.select(rf_local_divide($"six", $"two")).as[ProjectedRasterTile] assertEqual(maybeThree.first(), three) assertEqual(df.selectExpr("rf_local_divide(six, two)").as[ProjectedRasterTile].first(), three) @@ -119,138 +119,138 @@ class RasterFunctionsSpec extends FunSpec .as[ProjectedRasterTile].first(), six) val maybeThreeTile = - df.select(local_divide(ExtractTile($"six"), ExtractTile($"two"))).as[Tile] + df.select(rf_local_divide(ExtractTile($"six"), ExtractTile($"two"))).as[Tile] assertEqual(maybeThreeTile.first(), three.toArrayTile()) checkDocs("rf_local_divide") } } describe("scalar tile operations") { - it("should local_add") { + it("should rf_local_add") { val df = Seq(one).toDF("one") - val maybeThree = df.select(local_add($"one", 2)).as[ProjectedRasterTile] + val maybeThree = df.select(rf_local_add($"one", 2)).as[ProjectedRasterTile] assertEqual(maybeThree.first(), three) - val maybeThreeD = df.select(local_add($"one", 2.1)).as[ProjectedRasterTile] + val maybeThreeD = df.select(rf_local_add($"one", 2.1)).as[ProjectedRasterTile] assertEqual(maybeThreeD.first(), three.convert(DoubleConstantNoDataCellType).localAdd(0.1)) - val maybeThreeTile = df.select(local_add(ExtractTile($"one"), 2)).as[Tile] + val maybeThreeTile = df.select(rf_local_add(ExtractTile($"one"), 2)).as[Tile] assertEqual(maybeThreeTile.first(), three.toArrayTile()) } - it("should local_subtract") { + it("should rf_local_subtract") { val df = Seq(three).toDF("three") - val maybeOne = df.select(local_subtract($"three", 2)).as[ProjectedRasterTile] + val maybeOne = df.select(rf_local_subtract($"three", 2)).as[ProjectedRasterTile] assertEqual(maybeOne.first(), one) - val maybeOneD = df.select(local_subtract($"three", 2.0)).as[ProjectedRasterTile] + val maybeOneD = df.select(rf_local_subtract($"three", 2.0)).as[ProjectedRasterTile] assertEqual(maybeOneD.first(), one) - val maybeOneTile = df.select(local_subtract(ExtractTile($"three"), 2)).as[Tile] + val maybeOneTile = df.select(rf_local_subtract(ExtractTile($"three"), 2)).as[Tile] assertEqual(maybeOneTile.first(), one.toArrayTile()) } - it("should local_multiply") { + it("should rf_local_multiply") { val df = Seq(three).toDF("three") - val maybeSix = df.select(local_multiply($"three", 2)).as[ProjectedRasterTile] + val maybeSix = df.select(rf_local_multiply($"three", 2)).as[ProjectedRasterTile] assertEqual(maybeSix.first(), six) - val maybeSixD = df.select(local_multiply($"three", 2.0)).as[ProjectedRasterTile] + val maybeSixD = df.select(rf_local_multiply($"three", 2.0)).as[ProjectedRasterTile] assertEqual(maybeSixD.first(), six) - val maybeSixTile = df.select(local_multiply(ExtractTile($"three"), 2)).as[Tile] + val maybeSixTile = df.select(rf_local_multiply(ExtractTile($"three"), 2)).as[Tile] assertEqual(maybeSixTile.first(), six.toArrayTile()) } - it("should local_divide") { + it("should rf_local_divide") { val df = Seq(six).toDF("six") - val maybeThree = df.select(local_divide($"six", 2)).as[ProjectedRasterTile] + val maybeThree = df.select(rf_local_divide($"six", 2)).as[ProjectedRasterTile] assertEqual(maybeThree.first(), three) - val maybeThreeD = df.select(local_divide($"six", 2.0)).as[ProjectedRasterTile] + val maybeThreeD = df.select(rf_local_divide($"six", 2.0)).as[ProjectedRasterTile] assertEqual(maybeThreeD.first(), three) - val maybeThreeTile = df.select(local_divide(ExtractTile($"six"), 2)).as[Tile] + val maybeThreeTile = df.select(rf_local_divide(ExtractTile($"six"), 2)).as[Tile] assertEqual(maybeThreeTile.first(), three.toArrayTile()) } } describe("tile comparison relations") { - it("should evaluate local_less") { + it("should evaluate rf_local_less") { val df = Seq((two, three, six)).toDF("two", "three", "six") - df.select(tile_sum(local_less($"two", 6))).first() should be(100.0) - df.select(tile_sum(local_less($"two", 1.9))).first() should be(0.0) - df.select(tile_sum(local_less($"two", 2))).first() should be(0.0) - df.select(tile_sum(local_less($"three", $"two"))).first() should be(0.0) - df.select(tile_sum(local_less($"three", $"three"))).first() should be(0.0) - df.select(tile_sum(local_less($"three", $"six"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_less($"two", 6))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_less($"two", 1.9))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_less($"two", 2))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_less($"three", $"two"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_less($"three", $"three"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_less($"three", $"six"))).first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_less(two, 6))").as[Double].first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_less(three, three))").as[Double].first() should be(0.0) checkDocs("rf_local_less") } - it("should evaluate local_less_equal") { + it("should evaluate rf_local_less_equal") { val df = Seq((two, three, six)).toDF("two", "three", "six") - df.select(tile_sum(local_less_equal($"two", 6))).first() should be(100.0) - df.select(tile_sum(local_less_equal($"two", 1.9))).first() should be(0.0) - df.select(tile_sum(local_less_equal($"two", 2))).first() should be(100.0) - df.select(tile_sum(local_less_equal($"three", $"two"))).first() should be(0.0) - df.select(tile_sum(local_less_equal($"three", $"three"))).first() should be(100.0) - df.select(tile_sum(local_less_equal($"three", $"six"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_less_equal($"two", 6))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_less_equal($"two", 1.9))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_less_equal($"two", 2))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_less_equal($"three", $"two"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_less_equal($"three", $"three"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_less_equal($"three", $"six"))).first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_less_equal(two, 6))").as[Double].first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_less_equal(three, three))").as[Double].first() should be(100.0) checkDocs("rf_local_less_equal") } - it("should evaluate local_greater") { + it("should evaluate rf_local_greater") { val df = Seq((two, three, six)).toDF("two", "three", "six") - df.select(tile_sum(local_greater($"two", 6))).first() should be(0.0) - df.select(tile_sum(local_greater($"two", 1.9))).first() should be(100.0) - df.select(tile_sum(local_greater($"two", 2))).first() should be(0.0) - df.select(tile_sum(local_greater($"three", $"two"))).first() should be(100.0) - df.select(tile_sum(local_greater($"three", $"three"))).first() should be(0.0) - df.select(tile_sum(local_greater($"three", $"six"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_greater($"two", 6))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_greater($"two", 1.9))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_greater($"two", 2))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_greater($"three", $"two"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_greater($"three", $"three"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_greater($"three", $"six"))).first() should be(0.0) df.selectExpr("rf_tile_sum(rf_local_greater(two, 1.9))").as[Double].first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_greater(three, three))").as[Double].first() should be(0.0) checkDocs("rf_local_greater") } - it("should evaluate local_greater_equal") { + it("should evaluate rf_local_greater_equal") { val df = Seq((two, three, six)).toDF("two", "three", "six") - df.select(tile_sum(local_greater_equal($"two", 6))).first() should be(0.0) - df.select(tile_sum(local_greater_equal($"two", 1.9))).first() should be(100.0) - df.select(tile_sum(local_greater_equal($"two", 2))).first() should be(100.0) - df.select(tile_sum(local_greater_equal($"three", $"two"))).first() should be(100.0) - df.select(tile_sum(local_greater_equal($"three", $"three"))).first() should be(100.0) - df.select(tile_sum(local_greater_equal($"three", $"six"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_greater_equal($"two", 6))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_greater_equal($"two", 1.9))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_greater_equal($"two", 2))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_greater_equal($"three", $"two"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_greater_equal($"three", $"three"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_greater_equal($"three", $"six"))).first() should be(0.0) df.selectExpr("rf_tile_sum(rf_local_greater_equal(two, 1.9))").as[Double].first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_greater_equal(three, three))").as[Double].first() should be(100.0) checkDocs("rf_local_greater_equal") } - it("should evaluate local_equal") { + it("should evaluate rf_local_equal") { val df = Seq((two, three, three)).toDF("two", "threeA", "threeB") - df.select(tile_sum(local_equal($"two", 2))).first() should be(100.0) - df.select(tile_sum(local_equal($"two", 2.1))).first() should be(0.0) - df.select(tile_sum(local_equal($"two", $"threeA"))).first() should be(0.0) - df.select(tile_sum(local_equal($"threeA", $"threeB"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_equal($"two", 2))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_equal($"two", 2.1))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_equal($"two", $"threeA"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_equal($"threeA", $"threeB"))).first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_equal(two, 1.9))").as[Double].first() should be(0.0) df.selectExpr("rf_tile_sum(rf_local_equal(threeA, threeB))").as[Double].first() should be(100.0) checkDocs("rf_local_equal") } - it("should evaluate local_unequal") { + it("should evaluate rf_local_unequal") { val df = Seq((two, three, three)).toDF("two", "threeA", "threeB") - df.select(tile_sum(local_unequal($"two", 2))).first() should be(0.0) - df.select(tile_sum(local_unequal($"two", 2.1))).first() should be(100.0) - df.select(tile_sum(local_unequal($"two", $"threeA"))).first() should be(100.0) - df.select(tile_sum(local_unequal($"threeA", $"threeB"))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_unequal($"two", 2))).first() should be(0.0) + df.select(rf_tile_sum(rf_local_unequal($"two", 2.1))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_unequal($"two", $"threeA"))).first() should be(100.0) + df.select(rf_tile_sum(rf_local_unequal($"threeA", $"threeB"))).first() should be(0.0) df.selectExpr("rf_tile_sum(rf_local_unequal(two, 1.9))").as[Double].first() should be(100.0) df.selectExpr("rf_tile_sum(rf_local_unequal(threeA, threeB))").as[Double].first() should be(0.0) checkDocs("rf_local_unequal") @@ -260,10 +260,10 @@ class RasterFunctionsSpec extends FunSpec describe("per-tile stats") { it("should compute data cell counts") { val df = Seq(TestData.injectND(numND)(two)).toDF("two") - df.select(data_cells($"two")).first() shouldBe (cols * rows - numND).toLong + df.select(rf_data_cells($"two")).first() shouldBe (cols * rows - numND).toLong val df2 = randNDTilesWithNull.toDF("tile") - df2.select(data_cells($"tile") as "cells") + df2.select(rf_data_cells($"tile") as "cells") .agg(sum("cells")) .as[Long] .first() should be (expectedRandData) @@ -272,10 +272,10 @@ class RasterFunctionsSpec extends FunSpec } it("should compute no-data cell counts") { val df = Seq(TestData.injectND(numND)(two)).toDF("two") - df.select(no_data_cells($"two")).first() should be(numND) + df.select(rf_no_data_cells($"two")).first() should be(numND) val df2 = randNDTilesWithNull.toDF("tile") - df2.select(no_data_cells($"tile") as "cells") + df2.select(rf_no_data_cells($"tile") as "cells") .agg(sum("cells")) .as[Long] .first() should be (expectedRandNoData) @@ -284,15 +284,15 @@ class RasterFunctionsSpec extends FunSpec } it("should detect no-data tiles") { val df = Seq(nd).toDF("nd") - df.select(is_no_data_tile($"nd")).first() should be(true) + df.select(rf_is_no_data_tile($"nd")).first() should be(true) val df2 = Seq(two).toDF("not_nd") - df2.select(is_no_data_tile($"not_nd")).first() should be(false) + df2.select(rf_is_no_data_tile($"not_nd")).first() should be(false) checkDocs("rf_is_no_data_tile") } it("should find the minimum cell value") { val min = randNDTile.toArray().filter(c => raster.isData(c)).min.toDouble val df = Seq(randNDTile).toDF("rand") - df.select(tile_min($"rand")).first() should be(min) + df.select(rf_tile_min($"rand")).first() should be(min) df.selectExpr("rf_tile_min(rand)").as[Double].first() should be(min) checkDocs("rf_tile_min") } @@ -300,7 +300,7 @@ class RasterFunctionsSpec extends FunSpec it("should find the maximum cell value") { val max = randNDTile.toArray().filter(c => raster.isData(c)).max.toDouble val df = Seq(randNDTile).toDF("rand") - df.select(tile_max($"rand")).first() should be(max) + df.select(rf_tile_max($"rand")).first() should be(max) df.selectExpr("rf_tile_max(rand)").as[Double].first() should be(max) checkDocs("rf_tile_max") } @@ -308,7 +308,7 @@ class RasterFunctionsSpec extends FunSpec val values = randNDTile.toArray().filter(c => raster.isData(c)) val mean = values.sum.toDouble / values.length val df = Seq(randNDTile).toDF("rand") - df.select(tile_mean($"rand")).first() should be(mean) + df.select(rf_tile_mean($"rand")).first() should be(mean) df.selectExpr("rf_tile_mean(rand)").as[Double].first() should be(mean) checkDocs("rf_tile_mean") } @@ -317,7 +317,7 @@ class RasterFunctionsSpec extends FunSpec val values = randNDTile.toArray().filter(c => raster.isData(c)) val mean = values.sum.toDouble / values.length val df = Seq(randNDTile).toDF("rand") - val stats = df.select(tile_stats($"rand")).first() + val stats = df.select(rf_tile_stats($"rand")).first() stats.mean should be (mean +- 0.00001) val stats2 = df.selectExpr("rf_tile_stats(rand) as stats") @@ -325,16 +325,16 @@ class RasterFunctionsSpec extends FunSpec .first() stats2 should be (stats) - df.select(tile_stats($"rand") as "stats") + df.select(rf_tile_stats($"rand") as "stats") .select($"stats.mean").as[Double] .first() should be(mean +- 0.00001) df.selectExpr("rf_tile_stats(rand) as stats") - .select($"stats.no_data_cells").as[Long] + .select($"stats.rf_no_data_cells").as[Long] .first() should be <= (cols * rows - numND).toLong val df2 = randNDTilesWithNull.toDF("tile") df2 - .select(tile_stats($"tile")("data_cells") as "cells") + .select(rf_tile_stats($"tile")("rf_data_cells") as "cells") .agg(sum("cells")) .as[Long] .first() should be (expectedRandData) @@ -344,7 +344,7 @@ class RasterFunctionsSpec extends FunSpec it("should compute the tile histogram") { val df = Seq(randNDTile).toDF("rand") - val h1 = df.select(tile_histogram($"rand")).first() + val h1 = df.select(rf_tile_histogram($"rand")).first() val h2 = df.selectExpr("rf_tile_histogram(rand) as hist") .select($"hist".as[CellHistogram]) @@ -359,14 +359,14 @@ class RasterFunctionsSpec extends FunSpec describe("aggregate statistics") { it("should count data cells") { val df = randNDTilesWithNull.filter(_ != null).toDF("tile") - df.select(agg_data_cells($"tile")).first() should be (expectedRandData) + df.select(rf_agg_data_cells($"tile")).first() should be (expectedRandData) df.selectExpr("rf_agg_data_cells(tile)").as[Long].first() should be (expectedRandData) checkDocs("rf_agg_data_cells") } it("should count no-data cells") { val df = randNDTilesWithNull.toDF("tile") - df.select(agg_no_data_cells($"tile")).first() should be (expectedRandNoData) + df.select(rf_agg_no_data_cells($"tile")).first() should be (expectedRandNoData) df.selectExpr("rf_agg_no_data_cells(tile)").as[Long].first() should be (expectedRandNoData) checkDocs("rf_agg_no_data_cells") } @@ -375,12 +375,12 @@ class RasterFunctionsSpec extends FunSpec val df = randNDTilesWithNull.toDF("tile") df - .select(agg_stats($"tile") as "stats") - .select("stats.data_cells", "stats.no_data_cells") + .select(rf_agg_stats($"tile") as "stats") + .select("stats.rf_data_cells", "stats.rf_no_data_cells") .as[(Long, Long)] .first() should be ((expectedRandData, expectedRandNoData)) df.selectExpr("rf_agg_stats(tile) as stats") - .select("stats.data_cells") + .select("stats.rf_data_cells") .as[Long] .first() should be (expectedRandData) @@ -389,7 +389,7 @@ class RasterFunctionsSpec extends FunSpec it("should compute a aggregate histogram") { val df = randNDTilesWithNull.toDF("tile") - val hist1 = df.select(agg_approx_histogram($"tile")).first() + val hist1 = df.select(rf_agg_approx_histogram($"tile")).first() val hist2 = df.selectExpr("rf_agg_approx_histogram(tile) as hist") .select($"hist".as[CellHistogram]) .first() @@ -399,7 +399,7 @@ class RasterFunctionsSpec extends FunSpec it("should compute local statistics") { val df = randNDTilesWithNull.toDF("tile") - val stats1 = df.select(agg_local_stats($"tile")) + val stats1 = df.select(rf_agg_local_stats($"tile")) .first() val stats2 = df.selectExpr("rf_agg_local_stats(tile) as stats") .select($"stats".as[LocalCellStatistics]) @@ -411,21 +411,21 @@ class RasterFunctionsSpec extends FunSpec it("should compute local min") { val df = Seq(two, three, one, six).toDF("tile") - df.select(agg_local_min($"tile")).first() should be(one.toArrayTile()) + df.select(rf_agg_local_min($"tile")).first() should be(one.toArrayTile()) df.selectExpr("rf_agg_local_min(tile)").as[Tile].first() should be(one.toArrayTile()) checkDocs("rf_agg_local_min") } it("should compute local max") { val df = Seq(two, three, one, six).toDF("tile") - df.select(agg_local_max($"tile")).first() should be(six.toArrayTile()) + df.select(rf_agg_local_max($"tile")).first() should be(six.toArrayTile()) df.selectExpr("rf_agg_local_max(tile)").as[Tile].first() should be(six.toArrayTile()) checkDocs("rf_agg_local_max") } it("should compute local data cell counts") { val df = Seq(two, randNDTile, nd).toDF("tile") - val t1 = df.select(agg_local_data_cells($"tile")).first() + val t1 = df.select(rf_agg_local_data_cells($"tile")).first() val t2 = df.selectExpr("rf_agg_local_data_cells(tile) as cnt").select($"cnt".as[Tile]).first() t1 should be (t2) checkDocs("rf_agg_local_data_cells") @@ -433,20 +433,20 @@ class RasterFunctionsSpec extends FunSpec it("should compute local no-data cell counts") { val df = Seq(two, randNDTile, nd).toDF("tile") - val t1 = df.select(agg_local_no_data_cells($"tile")).first() + val t1 = df.select(rf_agg_local_no_data_cells($"tile")).first() val t2 = df.selectExpr("rf_agg_local_no_data_cells(tile) as cnt").select($"cnt".as[Tile]).first() t1 should be (t2) - val t3 = df.select(local_add(agg_local_data_cells($"tile"), agg_local_no_data_cells($"tile"))).first() + val t3 = df.select(rf_local_add(rf_agg_local_data_cells($"tile"), rf_agg_local_no_data_cells($"tile"))).first() t3 should be(three.toArrayTile()) checkDocs("rf_agg_local_no_data_cells") } } describe("analytical transformations") { - it("should compute normalized_difference") { + it("should compute rf_normalized_difference") { val df = Seq((three, two)).toDF("three", "two") - df.select(tile_to_array_double(normalized_difference($"three", $"two"))) + df.select(rf_tile_to_array_double(rf_normalized_difference($"three", $"two"))) .first() .forall(_ == 0.2) shouldBe true @@ -458,64 +458,64 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_normalized_difference") } - it("should mask one tile against another") { + it("should rf_mask one tile against another") { val df = Seq[Tile](randTile).toDF("tile") - val withMask = df.withColumn("mask", - convert_cell_type( - local_greater($"tile", 50), + val withMask = df.withColumn("rf_mask", + rf_convert_cell_type( + rf_local_greater($"tile", 50), "uint8") ) val withMasked = withMask.withColumn("masked", - mask($"tile", $"mask")) + rf_mask($"tile", $"rf_mask")) - val result = withMasked.agg(agg_no_data_cells($"tile") < agg_no_data_cells($"masked")).as[Boolean] + val result = withMasked.agg(rf_agg_no_data_cells($"tile") < rf_agg_no_data_cells($"masked")).as[Boolean] result.first() should be(true) checkDocs("rf_mask") } - it("should inverse mask one tile against another") { + it("should inverse rf_mask one tile against another") { val df = Seq[Tile](randTile).toDF("tile") - val baseND = df.select(agg_no_data_cells($"tile")).first() + val baseND = df.select(rf_agg_no_data_cells($"tile")).first() - val withMask = df.withColumn("mask", - convert_cell_type( - local_greater($"tile", 50), + val withMask = df.withColumn("rf_mask", + rf_convert_cell_type( + rf_local_greater($"tile", 50), "uint8" ) ) val withMasked = withMask - .withColumn("masked", mask($"tile", $"mask")) - .withColumn("inv_masked", inverse_mask($"tile", $"mask")) + .withColumn("masked", rf_mask($"tile", $"rf_mask")) + .withColumn("inv_masked", rf_inverse_mask($"tile", $"rf_mask")) - val result = withMasked.agg(agg_no_data_cells($"masked") + agg_no_data_cells($"inv_masked")).as[Long] + val result = withMasked.agg(rf_agg_no_data_cells($"masked") + rf_agg_no_data_cells($"inv_masked")).as[Long] result.first() should be(tileSize + baseND) checkDocs("rf_inverse_mask") } - it("should mask tile by another identified by specified value") { + it("should rf_mask tile by another identified by specified value") { val df = Seq[Tile](randTile).toDF("tile") val mask_value = 4 - val withMask = df.withColumn("mask", - local_multiply(convert_cell_type( - local_greater($"tile", 50), + val withMask = df.withColumn("rf_mask", + rf_local_multiply(rf_convert_cell_type( + rf_local_greater($"tile", 50), "uint8"), lit(mask_value) ) ) val withMasked = withMask.withColumn("masked", - mask_by_value($"tile", $"mask", lit(mask_value))) + rf_mask_by_value($"tile", $"rf_mask", lit(mask_value))) - val result = withMasked.agg(agg_no_data_cells($"tile") < agg_no_data_cells($"masked")).as[Boolean] + val result = withMasked.agg(rf_agg_no_data_cells($"tile") < rf_agg_no_data_cells($"masked")).as[Boolean] result.first() should be(true) checkDocs("rf_mask_by_value") @@ -523,7 +523,7 @@ class RasterFunctionsSpec extends FunSpec it("should render ascii art") { val df = Seq[Tile](ProjectedRasterTile(TestData.l8Labels)).toDF("tile") - val r1 = df.select(render_ascii($"tile")) + val r1 = df.select(rf_render_ascii($"tile")) val r2 = df.selectExpr("rf_render_ascii(tile)").as[String] r1.first() should be(r2.first()) checkDocs("rf_render_ascii") @@ -531,7 +531,7 @@ class RasterFunctionsSpec extends FunSpec it("should render cells as matrix") { val df = Seq(randDoubleNDTile).toDF("tile") - val r1 = df.select(render_matrix($"tile")) + val r1 = df.select(rf_render_matrix($"tile")) val r2 = df.selectExpr("rf_render_matrix(tile)").as[String] r1.first() should be(r2.first()) checkDocs("rf_render_matrix") @@ -545,9 +545,9 @@ class RasterFunctionsSpec extends FunSpec val df = Seq((three_plus, three_less, three)).toDF("three_plus", "three_less", "three") - assertEqual(df.select(round($"three")).as[ProjectedRasterTile].first(), three) - assertEqual(df.select(round($"three_plus")).as[ProjectedRasterTile].first(), three_double) - assertEqual(df.select(round($"three_less")).as[ProjectedRasterTile].first(), three_double) + assertEqual(df.select(rf_round($"three")).as[ProjectedRasterTile].first(), three) + assertEqual(df.select(rf_round($"three_plus")).as[ProjectedRasterTile].first(), three_double) + assertEqual(df.select(rf_round($"three_less")).as[ProjectedRasterTile].first(), three_double) assertEqual(df.selectExpr("rf_round(three)").as[ProjectedRasterTile].first(), three) assertEqual(df.selectExpr("rf_round(three_plus)").as[ProjectedRasterTile].first(), three_double) @@ -557,26 +557,26 @@ class RasterFunctionsSpec extends FunSpec } it("should take logarithms positive cell values"){ - // log10 1000 == 3 + // rf_log10 1000 == 3 val thousand = TestData.projectedRasterTile(cols, rows, 1000, extent, crs, ShortConstantNoDataCellType) val threesDouble = TestData.projectedRasterTile(cols, rows, 3.0, extent, crs, DoubleConstantNoDataCellType) val zerosDouble = TestData.projectedRasterTile(cols, rows, 0.0, extent, crs, DoubleConstantNoDataCellType) val df1 = Seq(thousand).toDF("tile") - assertEqual(df1.select(log10($"tile")).as[ProjectedRasterTile].first(), threesDouble) + assertEqual(df1.select(rf_log10($"tile")).as[ProjectedRasterTile].first(), threesDouble) - // ln random tile == log10 random tile / log10(e); random tile square to ensure all positive cell values + // ln random tile == rf_log10 random tile / rf_log10(e); random tile square to ensure all positive cell values val df2 = Seq(randPositiveDoubleTile).toDF("tile") val log10e = math.log10(math.E) - assertEqual(df2.select(log($"tile")).as[ProjectedRasterTile].first(), - df2.select(log10($"tile")).as[ProjectedRasterTile].first() / log10e) + assertEqual(df2.select(rf_log($"tile")).as[ProjectedRasterTile].first(), + df2.select(rf_log10($"tile")).as[ProjectedRasterTile].first() / log10e) lazy val maybeZeros = df2 .selectExpr(s"rf_local_subtract(rf_log(tile), rf_local_divide(rf_log10(tile), ${log10e}))") .as[ProjectedRasterTile].first() assertEqual(maybeZeros, zerosDouble) - // log1p for zeros should be ln(1) + // rf_log1p for zeros should be ln(1) val ln1 = math.log1p(0.0) val df3 = Seq(zero).toDF("tile") val maybeLn1 = df3.selectExpr(s"rf_log1p(tile)").as[ProjectedRasterTile].first() @@ -594,42 +594,42 @@ class RasterFunctionsSpec extends FunSpec // tile zeros ==> -Infinity val df_0 = Seq(zero).toDF("tile") - assertEqual(df_0.select(log($"tile")).as[ProjectedRasterTile].first(), ni_float) - assertEqual(df_0.select(log10($"tile")).as[ProjectedRasterTile].first(), ni_float) - assertEqual(df_0.select(log2($"tile")).as[ProjectedRasterTile].first(), ni_float) - // log1p of zeros should be 0. - assertEqual(df_0.select(log1p($"tile")).as[ProjectedRasterTile].first(), zero_float) + assertEqual(df_0.select(rf_log($"tile")).as[ProjectedRasterTile].first(), ni_float) + assertEqual(df_0.select(rf_log10($"tile")).as[ProjectedRasterTile].first(), ni_float) + assertEqual(df_0.select(rf_log2($"tile")).as[ProjectedRasterTile].first(), ni_float) + // rf_log1p of zeros should be 0. + assertEqual(df_0.select(rf_log1p($"tile")).as[ProjectedRasterTile].first(), zero_float) // tile negative values ==> NaN assert(df_0.selectExpr("rf_log(rf_local_subtract(tile, 42))").as[ProjectedRasterTile].first().isNoDataTile) assert(df_0.selectExpr("rf_log2(rf_local_subtract(tile, 42))").as[ProjectedRasterTile].first().isNoDataTile) - assert(df_0.select(log1p(local_subtract($"tile", 42))).as[ProjectedRasterTile].first().isNoDataTile) - assert(df_0.select(log10(local_subtract($"tile", lit(0.01)))).as[ProjectedRasterTile].first().isNoDataTile) + assert(df_0.select(rf_log1p(rf_local_subtract($"tile", 42))).as[ProjectedRasterTile].first().isNoDataTile) + assert(df_0.select(rf_log10(rf_local_subtract($"tile", lit(0.01)))).as[ProjectedRasterTile].first().isNoDataTile) } it("should take exponential") { val df = Seq(six).toDF("tile") - // exp inverses log + // rf_exp inverses rf_log assertEqual( - df.select(exp(log($"tile"))).as[ProjectedRasterTile].first(), + df.select(rf_exp(rf_log($"tile"))).as[ProjectedRasterTile].first(), six ) // base 2 assertEqual( - df.select(exp2(log2($"tile"))).as[ProjectedRasterTile].first(), + df.select(rf_exp2(rf_log2($"tile"))).as[ProjectedRasterTile].first(), six) // base 10 assertEqual( - df.select(exp10(log10($"tile"))).as[ProjectedRasterTile].first(), + df.select(rf_exp10(rf_log10($"tile"))).as[ProjectedRasterTile].first(), six) // plus/minus 1 assertEqual( - df.select(expm1(log1p($"tile"))).as[ProjectedRasterTile].first(), + df.select(rf_expm1(rf_log1p($"tile"))).as[ProjectedRasterTile].first(), six) // SQL @@ -647,7 +647,7 @@ class RasterFunctionsSpec extends FunSpec df.selectExpr("rf_exp2(rf_log2(tile))").as[ProjectedRasterTile].first(), six) - // SQL expm1 + // SQL rf_expm1 assertEqual( df.selectExpr("rf_expm1(rf_log1p(tile))").as[ProjectedRasterTile].first(), six) @@ -678,11 +678,11 @@ class RasterFunctionsSpec extends FunSpec def df = Seq(lowRes).toDF("tile") - val maybeUp = df.select(resample($"tile", lit(2))).as[ProjectedRasterTile].first() + val maybeUp = df.select(rf_resample($"tile", lit(2))).as[ProjectedRasterTile].first() assertEqual(maybeUp, upsampled) def df2 = Seq((lowRes, fourByFour)).toDF("tile1", "tile2") - val maybeUpShape = df2.select(resample($"tile1", $"tile2")).as[ProjectedRasterTile].first() + val maybeUpShape = df2.select(rf_resample($"tile1", $"tile2")).as[ProjectedRasterTile].first() assertEqual(maybeUpShape, upsampled) // Downsample by double argument < 1 diff --git a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index 72bd5e960..c227944e0 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -60,9 +60,9 @@ class ReprojectGeometrySpec extends FunSpec val df = Seq((latLng, webMercator)).toDF("ll", "wm") val rp = df.select( - reproject_geometry($"ll", LatLng, WebMercator) as "wm2", - reproject_geometry($"wm", WebMercator, LatLng) as "ll2", - reproject_geometry(reproject_geometry($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" + rf_reproject_geometry($"ll", LatLng, WebMercator) as "wm2", + rf_reproject_geometry($"wm", WebMercator, LatLng) as "ll2", + rf_reproject_geometry(rf_reproject_geometry($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" ).as[(Geometry, Geometry, Geometry)] @@ -79,9 +79,9 @@ class ReprojectGeometrySpec extends FunSpec val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") val rp = df.select( - reproject_geometry($"ll", $"llCRS", WebMercator) as "wm2", - reproject_geometry($"wm", WebMercator, $"llCRS") as "ll2", - reproject_geometry(reproject_geometry($"ll", $"llCRS", Sinusoidal), Sinusoidal, WebMercator) as "wm3" + rf_reproject_geometry($"ll", $"llCRS", WebMercator) as "wm2", + rf_reproject_geometry($"wm", WebMercator, $"llCRS") as "ll2", + rf_reproject_geometry(rf_reproject_geometry($"ll", $"llCRS", Sinusoidal), Sinusoidal, WebMercator) as "wm3" ).as[(Geometry, Geometry, Geometry)] diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index 2759323fb..d484ff915 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -46,11 +46,11 @@ class TileAssemblerSpec extends TestEnvironment { val ct = rf.tileLayerMetadata.merge.cellType val (tileCols, tileRows) = rf.tileLayerMetadata.merge.tileLayout.tileDimensions - val exploded = rf.select($"spatial_key", explode_tiles($"tile")) + val exploded = rf.select($"spatial_key", rf_explode_tiles($"tile")) val assembled = exploded .groupBy($"spatial_key") - .agg(assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, $"tile", tileCols, tileRows, ct)) + .agg(rf_assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, $"tile", tileCols, tileRows, ct)) assert( @@ -65,13 +65,14 @@ class TileAssemblerSpec extends TestEnvironment { val sceneSize = (260, 257) val rs = InMemoryRasterSource(TestData.randomTile(sceneSize._1, sceneSize._2, ByteConstantNoDataCellType), Extent(10, 20, 30, 40), LatLng) val df = rs.toDF - val exploded = df.select($"spatial_index", $"extent", tile_dimensions($"tile") as "tile_dimensions", explode_tiles($"tile")) + val exploded = df.select($"spatial_index", $"extent", rf_tile_dimensions($"tile") as "rf_tile_dimensions", rf_explode_tiles($"tile")) val assembled = exploded - .groupBy($"spatial_index", $"extent", $"tile_dimensions") + .groupBy($"spatial_index", $"extent", $"rf_tile_dimensions") .agg( - convert_cell_type(assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, - $"tile", $"tile_dimensions.cols", $"tile_dimensions.rows"), rs.cellType) as "tile" + rf_convert_cell_type( + rf_assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, + $"tile", $"rf_tile_dimensions.cols", $"rf_tile_dimensions.rows"), rs.cellType) as "tile" ) assert( @@ -89,7 +90,7 @@ class TileAssemblerSpec extends TestEnvironment { val exploded = util.time("exploded") { df - .select($"spatial_index", explode_tiles($"tile")) + .select($"spatial_index", rf_explode_tiles($"tile")) .forceCache } @@ -98,7 +99,7 @@ class TileAssemblerSpec extends TestEnvironment { val assembled = util.time("assembled") { exploded .groupBy($"spatial_index") - .agg(assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, + .agg(rf_assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, $"tile", 256, 256, UShortUserDefinedNoDataCellType(32767))) .forceCache @@ -111,8 +112,8 @@ class TileAssemblerSpec extends TestEnvironment { assert(assembled.count() === df.count()) - val expected = df.select(agg_stats($"tile")).first() - val result = assembled.select(agg_stats($"tile")).first() + val expected = df.select(rf_agg_stats($"tile")).first() + val result = assembled.select(rf_agg_stats($"tile")).first() assert(result.copy(no_data_cells = expected.no_data_cells) === expected) } diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala index a2fc4baf1..3ddbc52ec 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala @@ -43,7 +43,7 @@ class TileStatsSpec extends TestEnvironment with TestData { it("should report dimensions") { val df = Seq[(Tile, Tile)]((byteArrayTile, byteArrayTile)).toDF("tile1", "tile2") - val dims = df.select(tile_dimensions($"tile1") as "dims").select("dims.*") + val dims = df.select(rf_tile_dimensions($"tile1") as "dims").select("dims.*") assert(dims.as[(Int, Int)].first() === (3, 3)) assert(dims.schema.head.name === "cols") @@ -67,7 +67,7 @@ class TileStatsSpec extends TestEnvironment with TestData { forEvery(ct) { c => val expected = CellType.fromName(c) val tile = randomTile(5, 5, expected) - val result = Seq(tile).toDF("tile").select(cell_type($"tile")).first() + val result = Seq(tile).toDF("tile").select(rf_cell_type($"tile")).first() result should be(expected) } } @@ -80,7 +80,7 @@ class TileStatsSpec extends TestEnvironment with TestData { it("should compute accurate item counts") { val ds = Seq[Tile](tile1, tile2, tile3).toDF("tiles") val checkedValues = Seq[Double](0, 4, 7, 13, 26) - val result = checkedValues.map(x => ds.select(tile_histogram($"tiles")).first().itemCount(x)) + val result = checkedValues.map(x => ds.select(rf_tile_histogram($"tiles")).first().itemCount(x)) forEvery(checkedValues) { x => assert((x == 0 && result.head == 4) || result.contains(x - 1)) } @@ -89,7 +89,7 @@ class TileStatsSpec extends TestEnvironment with TestData { it("Should compute quantiles") { val ds = Seq[Tile](tile1, tile2, tile3).toDF("tiles") val numBreaks = 5 - val breaks = ds.select(tile_histogram($"tiles")).map(_.quantileBreaks(numBreaks)).collect() + val breaks = ds.select(rf_tile_histogram($"tiles")).map(_.quantileBreaks(numBreaks)).collect() assert(breaks(1).length === numBreaks) assert(breaks(0).apply(2) == 25) assert(breaks(1).max <= 3 && breaks.apply(1).min >= -5) @@ -101,7 +101,7 @@ class TileStatsSpec extends TestEnvironment with TestData { ds.createOrReplaceTempView("tmp") withClue("max") { - val max = ds.agg(agg_local_max($"tiles")) + val max = ds.agg(rf_agg_local_max($"tiles")) val expected = Max(byteArrayTile, byteConstantTile) write(max) assert(max.as[Tile].first() === expected) @@ -112,7 +112,7 @@ class TileStatsSpec extends TestEnvironment with TestData { } withClue("min") { - val min = ds.agg(agg_local_min($"tiles")) + val min = ds.agg(rf_agg_local_min($"tiles")) val expected = Min(byteArrayTile, byteConstantTile) write(min) assert(min.as[Tile].first() === Min(byteArrayTile, byteConstantTile)) @@ -127,11 +127,11 @@ class TileStatsSpec extends TestEnvironment with TestData { withClue("mean") { val ds = Seq.fill[Tile](3)(randomTile(5, 5, FloatConstantNoDataCellType)).toDS() - val means1 = ds.select(tile_stats($"value")).map(_.mean).collect - val means2 = ds.select(tile_mean($"value")).collect + val means1 = ds.select(rf_tile_stats($"value")).map(_.mean).collect + val means2 = ds.select(rf_tile_mean($"value")).collect // Compute the mean manually, knowing we're not dealing with no-data values. val means = - ds.select(tile_to_array_double($"value")).map(a => a.sum / a.length).collect + ds.select(rf_tile_to_array_double($"value")).map(a => a.sum / a.length).collect forAll(means.zip(means1)) { case (l, r) => assert(l === r +- 1e-6) } forAll(means.zip(means2)) { case (l, r) => assert(l === r +- 1e-6) } @@ -139,7 +139,7 @@ class TileStatsSpec extends TestEnvironment with TestData { withClue("sum") { val rf = l8Sample(1).projectedRaster.toRF val expected = 309149454 // computed with rasterio - val result = rf.agg(sum(tile_sum($"tile"))).collect().head.getDouble(0) + val result = rf.agg(sum(rf_tile_sum($"tile"))).collect().head.getDouble(0) logger.info(s"L8 sample band 1 grand total: ${result}") assert(result === expected) } @@ -149,7 +149,7 @@ class TileStatsSpec extends TestEnvironment with TestData { val ds = Seq.fill[Tile](3)(randomTile(5, 5, FloatCellType)).toDF("tiles") ds.createOrReplaceTempView("tmp") - val r1 = ds.select(tile_histogram($"tiles")) + val r1 = ds.select(rf_tile_histogram($"tiles")) assert(r1.first.totalCount === 5 * 5) write(r1) val r2 = sql("select hist.* from (select rf_tile_histogram(tiles) as hist from tmp)").as[CellHistogram] @@ -179,7 +179,7 @@ class TileStatsSpec extends TestEnvironment with TestData { .fill[Tile](rows)(randomTile(tileSize, tileSize, FloatConstantNoDataCellType)) .toDF("tiles") ds.createOrReplaceTempView("tmp") - val agg = ds.select(agg_approx_histogram($"tiles")) + val agg = ds.select(rf_agg_approx_histogram($"tiles")) val histArray = agg.collect() histArray.length should be (1) @@ -198,21 +198,21 @@ class TileStatsSpec extends TestEnvironment with TestData { it("should compute aggregate mean") { val ds = (Seq.fill[Tile](10)(randomTile(5, 5, FloatCellType)) :+ null).toDF("tiles") - val agg = ds.select(agg_mean($"tiles")) - val stats = ds.select(agg_stats($"tiles") as "stats").select($"stats.mean".as[Double]) + val agg = ds.select(rf_agg_mean($"tiles")) + val stats = ds.select(rf_agg_stats($"tiles") as "stats").select($"stats.mean".as[Double]) assert(agg.first() === stats.first()) } it("should compute aggregate statistics") { val ds = Seq.fill[Tile](10)(randomTile(5, 5, FloatConstantNoDataCellType)).toDF("tiles") - val exploded = ds.select(explode_tiles($"tiles")) + val exploded = ds.select(rf_explode_tiles($"tiles")) val (mean, vrnc) = exploded.agg(avg($"tiles"), var_pop($"tiles")).as[(Double, Double)].first - val stats = ds.select(agg_stats($"tiles") as "stats") ///.as[(Long, Double, Double, Double, Double)] + val stats = ds.select(rf_agg_stats($"tiles") as "stats") ///.as[(Long, Double, Double, Double, Double)] //stats.printSchema() noException shouldBe thrownBy { - ds.select(agg_stats($"tiles")).collect() + ds.select(rf_agg_stats($"tiles")).collect() } val agg = stats.select($"stats.variance".as[Double]) @@ -221,9 +221,9 @@ class TileStatsSpec extends TestEnvironment with TestData { ds.createOrReplaceTempView("tmp") val agg2 = sql("select stats.* from (select rf_agg_stats(tiles) as stats from tmp)") - assert(agg2.first().getAs[Long]("data_cells") === 250L) + assert(agg2.first().getAs[Long]("rf_data_cells") === 250L) - val agg3 = ds.agg(agg_stats($"tiles") as "stats").select($"stats.mean".as[Double]) + val agg3 = ds.agg(rf_agg_stats($"tiles") as "stats").select($"stats.mean".as[Double]) assert(mean === agg3.first()) } @@ -236,7 +236,7 @@ class TileStatsSpec extends TestEnvironment with TestData { .map(injectND(2)) :+ null).toDF("tiles") ds.createOrReplaceTempView("tmp") - val agg = ds.select(agg_local_stats($"tiles") as "stats") + val agg = ds.select(rf_agg_local_stats($"tiles") as "stats") val stats = agg.select("stats.*") //printStatsRows(stats) @@ -269,25 +269,25 @@ class TileStatsSpec extends TestEnvironment with TestData { val dsNd = (Seq.fill(20)(completeTile) :+ incompleteTile :+ null).toDF("tiles") // counted everything properly - val countTile = ds.select(agg_local_data_cells($"tiles")).first() + val countTile = ds.select(rf_agg_local_data_cells($"tiles")).first() forAll(countTile.toArray())(i => assert(i === 20)) - val countArray = dsNd.select(agg_local_data_cells($"tiles")).first().toArray() + val countArray = dsNd.select(rf_agg_local_data_cells($"tiles")).first().toArray() val expectedCount = (completeTile.localDefined().toArray zip incompleteTile.localDefined().toArray()).toSeq.map( pr => pr._1 * 20 + pr._2) assert(countArray === expectedCount) - val countNodataArray = dsNd.select(agg_local_no_data_cells($"tiles")).first().toArray + val countNodataArray = dsNd.select(rf_agg_local_no_data_cells($"tiles")).first().toArray assert(countNodataArray === incompleteTile.localUndefined().toArray) - val minTile = dsNd.select(agg_local_min($"tiles")).first() + val minTile = dsNd.select(rf_agg_local_min($"tiles")).first() assert(minTile.toArray() === completeTile.toArray()) - val maxTile = dsNd.select(agg_local_max($"tiles")).first() + val maxTile = dsNd.select(rf_agg_local_max($"tiles")).first() assert(maxTile.toArray() === completeTile.toArray()) - val meanTile = dsNd.select(agg_local_mean($"tiles")).first() + val meanTile = dsNd.select(rf_agg_local_mean($"tiles")).first() assert(meanTile.toArray() === completeTile.toArray()) } } @@ -300,20 +300,20 @@ class TileStatsSpec extends TestEnvironment with TestData { .map(injectND(nds)) :+ null).toDF("tiles") it("should count cells by NoData state") { - val counts = tiles.select(no_data_cells($"tiles")).collect().dropRight(1) + val counts = tiles.select(rf_no_data_cells($"tiles")).collect().dropRight(1) forEvery(counts)(c => assert(c === nds)) - val counts2 = tiles.select(data_cells($"tiles")).collect().dropRight(1) + val counts2 = tiles.select(rf_data_cells($"tiles")).collect().dropRight(1) forEvery(counts2)(c => assert(c === tsize * tsize - nds)) } it("should detect all NoData tiles") { - val ndCount = tiles.select("*").where(is_no_data_tile($"tiles")).count() + val ndCount = tiles.select("*").where(rf_is_no_data_tile($"tiles")).count() ndCount should be(1) val ndTiles = (Seq.fill[Tile](count)(ArrayTile.empty(UByteConstantNoDataCellType, tsize, tsize)) :+ null) .toDF("tiles") - val ndCount2 = ndTiles.select("*").where(is_no_data_tile($"tiles")).count() + val ndCount2 = ndTiles.select("*").where(rf_is_no_data_tile($"tiles")).count() ndCount2 should be(count + 1) } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index b0904caa6..a9c1bdaca 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -78,14 +78,14 @@ class GeoTiffDataSource extends DataSourceRegister val c = rf .where(SPATIAL_KEY_COLUMN("row") === sk.row) .agg( - F.sum(tile_dimensions(tc)("cols") cast(LongType)) + F.sum(rf_tile_dimensions(tc)("cols") cast(LongType)) ).first() .getLong(0) val r = rf .where(SPATIAL_KEY_COLUMN("col") === sk.col) .agg( - F.sum(tile_dimensions(tc)("rows") cast(LongType)) + F.sum(rf_tile_dimensions(tc)("rows") cast(LongType)) ).first() .getLong(0) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index d221acab9..c80011438 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -86,7 +86,7 @@ class GeoTiffDataSourceSpec val rf = spark.read.geotiff.loadRF(l8samplePath) val expected = 309149454 // computed with rasterio val result = rf.agg( - sum(tile_sum(rf("tile"))) + sum(rf_tile_sum(rf("tile"))) ).collect().head.getDouble(0) assert(result === expected) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 70d70f0d7..d8f8d8684 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -132,7 +132,7 @@ class GeoTrellisDataSourceSpec it("used produce tile UDT that we can manipulate") { val df = layerReader.loadRF(layer) - .select(SPATIAL_KEY_COLUMN, tile_stats(TILE_COLUMN)) + .select(SPATIAL_KEY_COLUMN, rf_tile_stats(TILE_COLUMN)) assert(df.count() > 0) } @@ -188,7 +188,7 @@ class GeoTrellisDataSourceSpec .withTileSubdivisions(param) .loadRF(layer) - val dims = df.select(tile_dimensions(df.tileColumns.head)("cols"), tile_dimensions(df.tileColumns.head)("rows")).first() + val dims = df.select(rf_tile_dimensions(df.tileColumns.head)("cols"), rf_tile_dimensions(df.tileColumns.head)("rows")).first() assert(dims.getAs[Int](0) === tileSize / param) assert(dims.getAs[Int](1) === tileSize / param) @@ -201,7 +201,7 @@ class GeoTrellisDataSourceSpec .withTileSubdivisions(param) .loadRF(tfLayer) - val dims = rf.select(tile_dimensions(rf.tileColumns.head)("cols"), tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / param) assert(dims.getAs[Int](1) === tileSize / param) @@ -223,7 +223,7 @@ class GeoTrellisDataSourceSpec // is it subdivided? assert(rf.count === testRdd.count * subParam * subParam) - val dims = rf.select(tile_dimensions(rf.tileColumns.head)("cols"), tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / subParam) assert(dims.getAs[Int](1) === tileSize / subParam) @@ -451,7 +451,7 @@ class GeoTrellisDataSourceSpec assert(rf.count === testRdd.count * subParam * subParam) - val dims = rf.select(tile_dimensions(rf.tileColumns.head)("cols"), tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / subParam) assert(dims.getAs[Int](1) === tileSize / subParam) @@ -466,7 +466,7 @@ class GeoTrellisDataSourceSpec // is it subdivided? assert(rf.count === testRdd.count * subParam * subParam) - val dims = rf.select(tile_dimensions(rf.tileColumns.head)("cols"), tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / subParam) assert(dims.getAs[Int](1) === tileSize / subParam) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 42765f6e6..8ce677ed7 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -79,7 +79,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { .cache() df.schema.size should be (4) // Test (roughly) we have three distinct but compabible bands - val stats = df.agg(agg_stats($"tile_b0") as "s0", agg_stats($"tile_b1") as "s1", agg_stats($"tile_b2") as "s2") + val stats = df.agg(rf_agg_stats($"tile_b0") as "s0", rf_agg_stats($"tile_b1") as "s1", rf_agg_stats($"tile_b2") as "s2") stats.select($"s0.data_cells" === $"s1.data_cells").as[Boolean].first() should be(true) stats.select($"s0.data_cells" === $"s2.data_cells").as[Boolean].first() should be(true) stats.select($"s0.mean" =!= $"s1.mean").as[Boolean].first() should be(true) @@ -93,7 +93,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.count() should be(math.ceil(1028.0 / 128).toInt * math.ceil(989.0 / 128).toInt) - val dims = df.select(tile_dimensions($"tile").as[TileDimensions]).distinct().collect() + val dims = df.select(rf_tile_dimensions($"tile").as[TileDimensions]).distinct().collect() dims should contain allElementsOf Seq(TileDimensions(4,128), TileDimensions(128,128), TileDimensions(128,93), TileDimensions(4,93)) diff --git a/docs/src/main/tut/apps/geotrellis-ops.md b/docs/src/main/tut/apps/geotrellis-ops.md index edc5302c7..56ccbbabb 100644 --- a/docs/src/main/tut/apps/geotrellis-ops.md +++ b/docs/src/main/tut/apps/geotrellis-ops.md @@ -26,15 +26,15 @@ Here's an example creating a UDFs to invoke the `equalize` transformation on eac import geotrellis.raster.equalization._ val equalizer = udf((t: Tile) => t.equalize()) val equalized = rf.select(equalizer($"tile") as "equalized") -equalized.select(tile_mean($"equalized") as "equalizedMean").show(5, false) +equalized.select(rf_tile_mean($"equalized") as "equalizedMean").show(5, false) ``` Here's an example downsampling a tile and rendering each tile as a matrix of numerical values. ```tut val downsample = udf((t: Tile) => t.resample(4, 4)) -val downsampled = rf.where(no_data_cells($"tile") === 0).select(downsample($"tile") as "minime") -downsampled.select(tile_to_array_double($"minime") as "cell_values").limit(2).show(false) +val downsampled = rf.where(rf_no_data_cells($"tile") === 0).select(downsample($"tile") as "minime") +downsampled.select(rf_tile_to_array_double($"minime") as "cell_values").limit(2).show(false) ``` diff --git a/docs/src/main/tut/apps/ndvi.md b/docs/src/main/tut/apps/ndvi.md index 5ce1d1246..85c59f2b2 100644 --- a/docs/src/main/tut/apps/ndvi.md +++ b/docs/src/main/tut/apps/ndvi.md @@ -30,7 +30,7 @@ def redBand = SinglebandGeoTiff("../core/src/test/resources/L8-B4-Elkton-VA.tiff def nirBand = SinglebandGeoTiff("../core/src/test/resources/L8-B5-Elkton-VA.tiff").projectedRaster.toRF("nir_band") // We use `asRF` to indicate we know the structure still conforms to RasterFrame constraints -val rf = redBand.spatialJoin(nirBand).withColumn("ndvi", normalized_difference($"red_band", $"nir_band")).asRF +val rf = redBand.spatialJoin(nirBand).withColumn("ndvi", rf_normalized_difference($"red_band", $"nir_band")).asRF val pr = rf.toRaster($"ndvi", 466, 428) diff --git a/docs/src/main/tut/exporting-rasterframes.md b/docs/src/main/tut/exporting-rasterframes.md index 5012f1019..b2b806fbd 100644 --- a/docs/src/main/tut/exporting-rasterframes.md +++ b/docs/src/main/tut/exporting-rasterframes.md @@ -27,11 +27,11 @@ The cell values within a `Tile` are encoded internally as an array. There may be where the additional context provided by the `Tile` construct is no longer needed and one would prefer to work with the underlying array data. -The @scaladoc[`tile_to_array_int`][tile_to_array_int] column function requires a type parameter to indicate the array element -type you would like used. The following types may be used: `Int`, `Double`, `Byte`, `Short`, `Float` +The @scaladoc[`rf_tile_to_array_int`][rf_tile_to_array_int] and @scaladoc[`rf_tile_to_array_double`][rf_tile_to_array_double] +provide this facility. ```tut -val withArrays = rf.withColumn("tileData", tile_to_array_int($"tile")).drop("tile") +val withArrays = rf.withColumn("tileData", rf_tile_to_array_int($"tile")).drop("tile") withArrays.show(5, 40) ``` @@ -45,7 +45,7 @@ tileBack.drop("tileData").show(5, 40) Note that the created tile will not have a `NoData` value associated with it. Here's how you can do that: ```tut -val tileBackAgain = withArrays.withColumn("tileAgain", withNoData(arrayToTile($"tileData", 128, 128), 3)) +val tileBackAgain = withArrays.withColumn("tileAgain", rf_with_no_data(rf_array_to_tile($"tileData", 128, 128), 3)) tileBackAgain.drop("tileData").show(5, 50) ``` diff --git a/docs/src/main/tut/ml/classification.md b/docs/src/main/tut/ml/classification.md index b62940a7b..fb50e5664 100644 --- a/docs/src/main/tut/ml/classification.md +++ b/docs/src/main/tut/ml/classification.md @@ -78,7 +78,7 @@ val target = readTiff(filenamePattern.format("Labels")). Take a peek at what kind of label data we have to work with. ```tut -target.select(agg_stats(target(targetCol))).show +target.select(rf_agg_stats(target(targetCol))).show ``` Join the target label RasterFrame with the band tiles to create our analytics base table @@ -186,7 +186,7 @@ First, we get the DataFrame back into RasterFrame form: val tlm = joinedRF.tileLayerMetadata.left.get val retiled = scored.groupBy($"spatial_key").agg( - assemble_tile( + rf_assemble_tile( $"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType ) diff --git a/docs/src/main/tut/ml/clustering.md b/docs/src/main/tut/ml/clustering.md index fc63eabdb..36de19652 100644 --- a/docs/src/main/tut/ml/clustering.md +++ b/docs/src/main/tut/ml/clustering.md @@ -119,7 +119,7 @@ First, we get the DataFrame back into RasterFrame form: val tlm = joinedRF.tileLayerMetadata.left.get val retiled = clustered.groupBy($"spatial_key").agg( - assemble_tile( + rf_assemble_tile( $"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType ) diff --git a/docs/src/main/tut/ml/statistics.md b/docs/src/main/tut/ml/statistics.md index 6249eef73..94611be0b 100644 --- a/docs/src/main/tut/ml/statistics.md +++ b/docs/src/main/tut/ml/statistics.md @@ -28,7 +28,7 @@ RasterFrames has a number of extension methods and columnar functions for perfor Get the nominal tile dimensions. Depending on the tiling there may be some tiles with different sizes on the edges. ```tut -rf.select(rf.spatialKeyColumn, tile_dimensions($"tile")).show(3) +rf.select(rf.spatialKeyColumn, rf_tile_dimensions($"tile")).show(3) ``` ### Descriptive Statistics @@ -38,16 +38,15 @@ rf.select(rf.spatialKeyColumn, tile_dimensions($"tile")).show(3) Count the numer of `NoData` and non-`NoData` cells in each tile. ```tut -rf.select(rf.spatialKeyColumn, no_data_cells($"tile"), data_cells($"tile")).show(3) +rf.select(rf.spatialKeyColumn, rf_no_data_cells($"tile"), rf_data_cells($"tile")).show(3) ``` #### Tile Mean -Compute the mean value in each tile. Use `tileMean` for integral cell types, and `tileMeanDouble` for floating point -cell types. +Compute the mean value in each tile. ```tut -rf.select(rf.spatialKeyColumn, tile_mean($"tile")).show(3) +rf.select(rf.spatialKeyColumn, rf_tile_mean($"tile")).show(3) ``` #### Tile Summary Statistics @@ -56,7 +55,7 @@ Compute a suite of summary statistics for each tile. Use `tile_stats` for integr for floating point cell types. ```tut -rf.withColumn("stats", tile_stats($"tile")).select(rf.spatialKeyColumn, $"stats.*").show(3) +rf.withColumn("stats", rf_tile_stats($"tile")).select(rf.spatialKeyColumn, $"stats.*").show(3) ``` ### Histogram @@ -66,22 +65,22 @@ The `tile_histogram` function computes a histogram over the data in each tile. In this example we compute quantile breaks. ```tut -rf.select(tile_histogram($"tile")).map(_.quantileBreaks(5)).show(5, false) +rf.select(rf_tile_histogram($"tile")).map(_.quantileBreaks(5)).show(5, false) ``` ## Aggregate Statistics -The `agg_stats` function computes the same summary statistics as `tile_stats`, but aggregates them over the whole +The `rf_agg_stats` function computes the same summary statistics as `rf_tile_stats`, but aggregates them over the whole RasterFrame. ```tut -rf.select(agg_stats($"tile")).show() +rf.select(rf_agg_stats($"tile")).show() ``` A more involved example: extract bin counts from a computed `Histogram`. ```tut -rf.select(agg_approx_histogram($"tile")). +rf.select(rf_agg_approx_histogram($"tile")). map(h => for(v <- h.labels) yield(v, h.itemCount(v))). select(explode($"value") as "counts"). select("counts._1", "counts._2"). diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 307e1224d..9e5698c36 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -4,25 +4,26 @@ ### 0.8.0 -* _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. * Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. -* Added new tile functions `round`, `log`, `log10`, `log2`, `log1p`, `exp`, `exp10`, `exp2`, `expm1`, `resample`, `resample`. +* Added new tile functions `rf_round`, `rf_log`, `rf_log10`, `rf_log2`, `rf_log1p`, `rf_exp`, `rf_exp10`, `rf_exp2`, `rf_expm1`, `rf_resample`. * Support python-side [Shapely](https://pypi.org/project/Shapely/) geometry User-Defined Type. * SQL API support for: `rf_assemble_tile`, `rf_array_to_tile`. -* _Breaking_: With the upgrade to JTS 1.16.0, all imports of `com.vividsolutions.jts` need to be changed to `org.locationtech.jts`. * Introduced at the source level the concept of a `RasterSource` and `RasterRef`, enabling lazy/delayed read of sub-scene tiles. -* _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. +* Added `rf_render_matrix` debugging function. +* Added `RasterFrame.withExtent` extension method. +* Added `rf_extent` and removed `envelope`. +* _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. +* _Breaking_: With the upgrade to JTS 1.16.0, all imports of `com.vividsolutions.jts` need to be changed to `org.locationtech.jts`. +* _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, with an `rf_` prefix, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. * _Breaking_: In Scala and SQL, `..._scalar` functions (e.g. `local_add_scalar`) have been removed. Non-scalar forms now dynamically detect type of right hand side. -* _Breaking_: `tileToArray` has been replaced with `tile_to_array_double` and `tile_to_array_int`. -* Added `render_matrix` debugging function. -* _Breaking_: renamed `agg_histogram` to `agg_approx_histogram`, `local_agg_stats` to `agg_local_stats`, `local_agg_max` to `agg_local_max`, `local_agg_min` to `agg_local_min`, `local_agg_mean` to `agg_local_mean`, `local_agg_data_cells` to `agg_local_data_cells`, `local_agg_no_data_cells` to `agg_local_no_data_cells`. -* _Breaking_: `CellHistogram` no longer carries along approximate statistics, due to confusing behavior. Use `agg_stats` instead. +* _Breaking_: `tileToArray` has been replaced with `_tile_to_array_double` and `_tile_to_array_int`. +* _Breaking_: Renamed `bounds_geometry` to `rf_extent_geometry`. +* _Breaking_: renamed `agg_histogram` to `rf_agg_approx_histogram`, `local_agg_stats` to `rf_agg_local_stats`, `local_agg_max` to `rf_agg_local_max`, `local_agg_min` to `rf_agg_local_min`, `local_agg_mean` to `rf_agg_local_mean`, `local_agg_data_cells` to `rf_agg_local_data_cells`, `local_agg_no_data_cells` to `rf_agg_local_no_data_cells`. +* _Breaking_: `CellHistogram` no longer carries along approximate statistics, due to confusing behavior. Use `rf_agg_stats` instead. * Introduced `LocalCellStatistics` class to wrap together results from `LocalStatsAggregate`. * _Breaking_: `TileDimensions` moved from `astraea.spark.rasterframes` to `org.locationtech.rasterframes.model`. * _Breaking_: Renamed `RasterFrame.withBounds` to `RasterFrame.withGeometry` for consistency with DataSource schemas. -* Added `RasterFrame.withExtent` extension method. -* Added `st_extent` and deprecated `envelope`. Renamed `bounds_geometry` to `extent_geometry`. ## 0.7.x diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala index 4c8077da6..3c734be2c 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -89,7 +89,7 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[F .format(L8CatalogDataSource.SHORT_NAME) .load() .withColumnRenamed(PDSFields.ACQUISITION_DATE.name, PDSFields.TIMESTAMP.name) - .withColumn(PDSFields.BOUNDS.name, extent_geometry(col(PDSFields.BOUNDS_WGS84.name))) + .withColumn(PDSFields.BOUNDS.name, rf_extent_geometry(col(PDSFields.BOUNDS_WGS84.name))) .drop(PDSFields.BOUNDS_WGS84.name) val filtered = aggFilters diff --git a/pyrasterframes/python/examples/Clustering.py b/pyrasterframes/python/examples/Clustering.py index 8566d6276..84e30c027 100644 --- a/pyrasterframes/python/examples/Clustering.py +++ b/pyrasterframes/python/examples/Clustering.py @@ -72,7 +72,7 @@ layout = tlm['layoutDefinition']['tileLayout'] retiled = clustered.groupBy('spatial_key').agg( - assemble_tile('column_index', 'row_index', 'prediction', + rf_assemble_tile('column_index', 'row_index', 'prediction', layout['tileCols'], layout['tileRows'], 'int8') ) diff --git a/pyrasterframes/python/examples/MeanValue.py b/pyrasterframes/python/examples/MeanValue.py index 2c7308c43..2f02f0bac 100644 --- a/pyrasterframes/python/examples/MeanValue.py +++ b/pyrasterframes/python/examples/MeanValue.py @@ -21,5 +21,5 @@ #py_mv_find_mean tileCol = 'tile' -rf.agg(agg_no_data_cells(tileCol), agg_data_cells(tileCol), agg_mean(tileCol)).show(5, False) +rf.agg(rf_agg_no_data_cells(tileCol), rf_agg_data_cells(tileCol), rf_agg_mean(tileCol)).show(5, False) #py_mv_find_mean \ No newline at end of file diff --git a/pyrasterframes/python/examples/NDVI.py b/pyrasterframes/python/examples/NDVI.py index f98619d27..fc6594bb6 100644 --- a/pyrasterframes/python/examples/NDVI.py +++ b/pyrasterframes/python/examples/NDVI.py @@ -22,7 +22,7 @@ #py_ndvi_column rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ - .withColumn("ndvi", normalized_difference('red_band', 'nir_band')) + .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) rf.printSchema() rf.show(20) #py_ndvi_column diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index b886bfabd..fe3f1b9ba 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -52,6 +52,7 @@ def _convertDF(df, sp_key = None, metadata = None): # TODO: make sure this supports **options DataFrameReader.geotiff = lambda df_reader, path: _reader(df_reader, "geotiff", path) DataFrameReader.geotrellis = lambda df_reader, path: _reader(df_reader, "geotrellis", path) +DataFrameReader.rastersource = lambda df_reader, path: _reader(df_reader, "rastersource", path) diff --git a/pyrasterframes/python/pyrasterframes/context.py b/pyrasterframes/python/pyrasterframes/context.py index 80a2e120d..f6d307475 100644 --- a/pyrasterframes/python/pyrasterframes/context.py +++ b/pyrasterframes/python/pyrasterframes/context.py @@ -19,7 +19,7 @@ def __init__(self, spark_session): self._jrfctx = self._jvm.org.locationtech.rasterframes.py.PyRFContext(jsess) def list_to_seq(self, py_list): - conv = self.lookup('listToSeq') + conv = self.lookup('_listToSeq') return conv(py_list) def lookup(self, function_name): diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index ddc8c19f0..d23213a2a 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -21,15 +21,15 @@ def _context_call(name, *args): def _celltype(cellTypeStr): """ Convert the string cell type to the expected CellType object.""" - return _context_call('cell_type', cellTypeStr) + return _context_call('rf_cell_type', cellTypeStr) def _create_assembleTile(): """ Create a function mapping to the Scala implementation.""" def _(colIndex, rowIndex, cellData, numCols, numRows, cellType): - jfcn = RFContext.active().lookup('assemble_tile') + jfcn = RFContext.active().lookup('rf_assemble_tile') return Column(jfcn(_to_java_column(colIndex), _to_java_column(rowIndex), _to_java_column(cellData), numCols, numRows, _celltype(cellType))) - _.__name__ = 'assemble_tile' + _.__name__ = 'rf_assemble_tile' _.__doc__ = "Create a Tile from a column of cell data with location indices" _.__module__ = THIS_MODULE return _ @@ -38,9 +38,9 @@ def _(colIndex, rowIndex, cellData, numCols, numRows, cellType): def _create_arrayToTile(): """ Create a function mapping to the Scala implementation.""" def _(arrayCol, numCols, numRows): - jfcn = RFContext.active().lookup('array_to_tile') + jfcn = RFContext.active().lookup('rf_array_to_tile') return Column(jfcn(_to_java_column(arrayCol), numCols, numRows)) - _.__name__ = 'array_to_tile' + _.__name__ = 'rf_array_to_tile' _.__doc__ = "Convert array in `arrayCol` into a Tile of dimensions `numCols` and `numRows'" _.__module__ = THIS_MODULE return _ @@ -49,9 +49,9 @@ def _(arrayCol, numCols, numRows): def _create_convertCellType(): """ Create a function mapping to the Scala implementation.""" def _(tileCol, cellType): - jfcn = RFContext.active().lookup('convert_cell_type') + jfcn = RFContext.active().lookup('rf_convert_cell_type') return Column(jfcn(_to_java_column(tileCol), _celltype(cellType))) - _.__name__ = 'convert_cell_type' + _.__name__ = 'rf_convert_cell_type' _.__doc__ = "Convert the numeric type of the Tiles in `tileCol`" _.__module__ = THIS_MODULE return _ @@ -60,9 +60,9 @@ def _(tileCol, cellType): def _create_makeConstantTile(): """ Create a function mapping to the Scala implementation.""" def _(value, cols, rows, cellType): - jfcn = RFContext.active().lookup('make_constant_tile') + jfcn = RFContext.active().lookup('rf_make_constant_tile') return Column(jfcn(value, cols, rows, cellType)) - _.__name__ = 'make_constant_tile' + _.__name__ = 'rf_make_constant_tile' _.__doc__ = "Constructor for constant tile column" _.__module__ = THIS_MODULE return _ @@ -71,9 +71,9 @@ def _(value, cols, rows, cellType): def _create_tileZeros(): """ Create a function mapping to the Scala implementation.""" def _(cols, rows, cellType = 'float64'): - jfcn = RFContext.active().lookup('tile_zeros') + jfcn = RFContext.active().lookup('rf_tile_zeros') return Column(jfcn(cols, rows, cellType)) - _.__name__ = 'tile_zeros' + _.__name__ = 'rf_tile_zeros' _.__doc__ = "Create column of constant tiles of zero" _.__module__ = THIS_MODULE return _ @@ -82,31 +82,31 @@ def _(cols, rows, cellType = 'float64'): def _create_tileOnes(): """ Create a function mapping to the Scala implementation.""" def _(cols, rows, cellType = 'float64'): - jfcn = RFContext.active().lookup('tile_ones') + jfcn = RFContext.active().lookup('rf_tile_ones') return Column(jfcn(cols, rows, cellType)) - _.__name__ = 'tile_ones' + _.__name__ = 'rf_tile_ones' _.__doc__ = "Create column of constant tiles of one" _.__module__ = THIS_MODULE return _ def _create_rasterize(): - """ Create a function mapping to the Scala rasterize function. """ + """ Create a function mapping to the Scala rf_rasterize function. """ def _(geometryCol, boundsCol, valueCol, numCols, numRows): - jfcn = RFContext.active().lookup('rasterize') + jfcn = RFContext.active().lookup('rf_rasterize') return Column(jfcn(_to_java_column(geometryCol), _to_java_column(boundsCol), _to_java_column(valueCol), numCols, numRows)) - _.__name__ = 'rasterize' + _.__name__ = 'rf_rasterize' _.__doc__ = 'Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value.' _.__module__ = THIS_MODULE return _ def _create_reproject_geometry(): - """ Create a function mapping to the Scala reproject_geometry function. """ + """ Create a function mapping to the Scala rf_reproject_geometry function. """ def _(geometryCol, srcCRSName, dstCRSName): - jfcn = RFContext.active().lookup('reproject_geometry') + jfcn = RFContext.active().lookup('rf_reproject_geometry') return Column(jfcn(_to_java_column(geometryCol), srcCRSName, dstCRSName)) - _.__name__ = 'reproject_geometry' + _.__name__ = 'rf_reproject_geometry' _.__doc__ = """Reproject a column of geometry given the CRS names of the source and destination. Currently supported registries are EPSG, ESRI, WORLD, NAD83, & NAD27. An example of a valid CRS name is EPSG:3005. @@ -116,137 +116,137 @@ def _(geometryCol, srcCRSName, dstCRSName): def _create_explode_tiles(): - """ Create a function mapping to Scala explode_tiles function """ + """ Create a function mapping to Scala rf_explode_tiles function """ def _(*args): - jfcn = RFContext.active().lookup('explode_tiles') + jfcn = RFContext.active().lookup('rf_explode_tiles') jcols = [_to_java_column(arg) for arg in args] return Column(jfcn(RFContext.active().list_to_seq(jcols))) - _.__name__ = 'explode_tiles' + _.__name__ = 'rf_explode_tiles' _.__doc__ = 'Create a row for each cell in Tile.' _.__module__ = THIS_MODULE return _ def _create_explode_tiles_sample(): - """ Create a function mapping to Scala explode_tiles_sample function""" + """ Create a function mapping to Scala rf_explode_tiles_sample function""" def _(sample_frac, seed, *tile_cols): - jfcn = RFContext.active().lookup('explode_tiles_sample') + jfcn = RFContext.active().lookup('rf_explode_tiles_sample') jcols = [_to_java_column(arg) for arg in tile_cols] return Column(jfcn(sample_frac, seed, RFContext.active().list_to_seq(jcols))) - _.__name__ = 'explode_tiles_sample' + _.__name__ = 'rf_explode_tiles_sample' _.__doc__ = 'Create a row for a sample of cells in Tile columns.' _.__module__ = THIS_MODULE return _ def _create_maskByValue(): - """ Create a function mapping to Scala mask_by_value function """ + """ Create a function mapping to Scala rf_mask_by_value function """ def _(data_tile, mask_tile, mask_value): - jfcn = RFContext.active().lookup('mask_by_value') + jfcn = RFContext.active().lookup('rf_mask_by_value') return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) - _.__name__ = 'mask_by_value' + _.__name__ = 'rf_mask_by_value' _.__doc__ = 'Generate a tile with the values from the data tile, but where cells in the masking tile contain the masking value, replace the data value with NODATA.' _.__module__ = THIS_MODULE return _ _rf_unique_functions = { - 'array_to_tile': _create_arrayToTile(), - 'assemble_tile': _create_assembleTile(), - 'cell_types': lambda: _context_call('cell_types'), - 'convert_cell_type': _create_convertCellType(), - 'explode_tiles': _create_explode_tiles(), - 'explode_tiles_sample': _create_explode_tiles_sample(), - 'make_constant_tile': _create_makeConstantTile(), - 'mask_by_value': _create_maskByValue(), - 'rasterize': _create_rasterize(), - 'reproject_geometry': _create_reproject_geometry(), - 'tile_ones': _create_tileOnes(), - 'tile_zeros': _create_tileZeros(), + 'rf_array_to_tile': _create_arrayToTile(), + 'rf_assemble_tile': _create_assembleTile(), + 'rf_cell_types': lambda: _context_call('rf_cell_types'), + 'rf_convert_cell_type': _create_convertCellType(), + 'rf_explode_tiles': _create_explode_tiles(), + 'rf_explode_tiles_sample': _create_explode_tiles_sample(), + 'rf_make_constant_tile': _create_makeConstantTile(), + 'rf_mask_by_value': _create_maskByValue(), + 'rf_rasterize': _create_rasterize(), + 'rf_reproject_geometry': _create_reproject_geometry(), + 'rf_tile_ones': _create_tileOnes(), + 'rf_tile_zeros': _create_tileZeros(), } _rf_column_scalar_functions = { - 'with_no_data': 'Assign a `NoData` value to the Tiles in the given Column.', - 'local_add_scalar': 'Add a scalar to a Tile', - 'local_add_scalar_int': 'Add a scalar to a Tile', - 'local_subtract_scalar': 'Subtract a scalar from a Tile', - 'local_subtract_scalar_int': 'Subtract a scalar from a Tile', - 'local_multiply_scalar': 'Multiply a Tile by a scalar', - 'local_multiply_scalar_int': 'Multiply a Tile by a scalar', - 'local_divide_scalar': 'Divide a Tile by a scalar', - 'local_divide_scalar_int': 'Divide a Tile by a scalar', - 'local_less_scalar': 'Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0', - 'local_less_scalar_int': 'Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0', - 'local_less_equal_scalar': 'Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0', - 'local_less_equal_scalar_int': 'Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0', - 'local_greater_scalar': 'Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0', - 'local_greater_scalar_int': 'Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0', - 'local_greater_equal_scalar': 'Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0', - 'local_greater_equal_scalar_int': 'Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0', - 'local_equal_scalar': 'Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0', - 'local_equal_scalar_int': 'Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0', - 'local_unequal_scalar': 'Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0', - 'local_unequal_scalar_int': 'Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0', + 'rf_with_no_data': 'Assign a `NoData` value to the Tiles in the given Column.', + 'rf_local_add_double': 'Add a scalar to a Tile', + 'rf_local_add_int': 'Add a scalar to a Tile', + 'rf_local_subtract_double': 'Subtract a scalar from a Tile', + 'rf_local_subtract_int': 'Subtract a scalar from a Tile', + 'rf_local_multiply_double': 'Multiply a Tile by a scalar', + 'rf_local_multiply_int': 'Multiply a Tile by a scalar', + 'rf_local_divide_double': 'Divide a Tile by a scalar', + 'rf_local_divide_int': 'Divide a Tile by a scalar', + 'rf_local_less_double': 'Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0', + 'rf_local_less_int': 'Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0', + 'rf_local_less_equal_double': 'Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0', + 'rf_local_less_equal_int': 'Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0', + 'rf_local_greater_double': 'Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0', + 'rf_local_greater_int': 'Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0', + 'rf_local_greater_equal_double': 'Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0', + 'rf_local_greater_equal_int': 'Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0', + 'rf_local_equal_double': 'Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0', + 'rf_local_equal_int': 'Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0', + 'rf_local_unequal_double': 'Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0', + 'rf_local_unequal_int': 'Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0', } _rf_column_functions = { # ------- RasterFrames functions ------- - 'tile_dimensions': 'Query the number of (cols, rows) in a Tile.', + 'rf_tile_dimensions': 'Query the number of (cols, rows) in a Tile.', 'envelope': 'Extracts the bounding box (envelope) of the geometry.', - 'tile_to_int_array': 'Flattens Tile into an array of integers. Deprecated in favor of `tile_to_array_int`.', - 'tile_to_double_array': 'Flattens Tile into an array of doubles. Deprecated in favor of `tile_to_array_double`', - 'tile_to_array_int': 'Flattens Tile into an array of integers.', - 'tile_to_array_double': 'Flattens Tile into an array of doubles.', - 'cell_type': 'Extract the Tile\'s cell type', - 'is_no_data_tile': 'Report if the Tile is entirely NODDATA cells', - 'agg_approx_histogram': 'Compute the full column aggregate floating point histogram', - 'agg_stats': 'Compute the full column aggregate floating point statistics', - 'agg_mean': 'Computes the column aggregate mean', - 'agg_data_cells': 'Computes the number of non-NoData cells in a column', - 'agg_no_data_cells': 'Computes the number of NoData cells in a column', - 'tile_histogram': 'Compute the Tile-wise histogram', - 'tile_mean': 'Compute the Tile-wise mean', - 'tile_sum': 'Compute the Tile-wise sum', - 'tile_min': 'Compute the Tile-wise minimum', - 'tile_max': 'Compute the Tile-wise maximum', - 'tile_stats': 'Compute the Tile-wise floating point statistics', - 'render_ascii': 'Render ASCII art of tile', - 'no_data_cells': 'Count of NODATA cells', - 'data_cells': 'Count of cells with valid data', - 'local_add': 'Add two Tiles', - 'local_subtract': 'Subtract two Tiles', - 'local_multiply': 'Multiply two Tiles', - 'local_divide': 'Divide two Tiles', - 'normalized_difference': 'Compute the normalized difference of two tiles', + 'tile_to_int_array': 'Flattens Tile into an array of integers. Deprecated in favor of `rf_tile_to_array_int`.', + 'tile_to_double_array': 'Flattens Tile into an array of doubles. Deprecated in favor of `rf_tile_to_array_double`', + 'rf_tile_to_array_int': 'Flattens Tile into an array of integers.', + 'rf_tile_to_array_double': 'Flattens Tile into an array of doubles.', + 'rf_cell_type': 'Extract the Tile\'s cell type', + 'rf_is_no_data_tile': 'Report if the Tile is entirely NODDATA cells', + 'rf_agg_approx_histogram': 'Compute the full column aggregate floating point histogram', + 'rf_agg_stats': 'Compute the full column aggregate floating point statistics', + 'rf_agg_mean': 'Computes the column aggregate mean', + 'rf_agg_data_cells': 'Computes the number of non-NoData cells in a column', + 'rf_agg_no_data_cells': 'Computes the number of NoData cells in a column', + 'rf_tile_histogram': 'Compute the Tile-wise histogram', + 'rf_tile_mean': 'Compute the Tile-wise mean', + 'rf_tile_sum': 'Compute the Tile-wise sum', + 'rf_tile_min': 'Compute the Tile-wise minimum', + 'rf_tile_max': 'Compute the Tile-wise maximum', + 'rf_tile_stats': 'Compute the Tile-wise floating point statistics', + 'rf_render_ascii': 'Render ASCII art of tile', + 'rf_no_data_cells': 'Count of NODATA cells', + 'rf_data_cells': 'Count of cells with valid data', + 'rf_local_add': 'Add two Tiles', + 'rf_local_subtract': 'Subtract two Tiles', + 'rf_local_multiply': 'Multiply two Tiles', + 'rf_local_divide': 'Divide two Tiles', + 'rf_normalized_difference': 'Compute the normalized difference of two tiles', 'local_agg_stats': 'Compute cell-local aggregate descriptive statistics for a column of Tiles.', - 'agg_local_max': 'Compute the cell-wise/local max operation between Tiles in a column.', - 'agg_local_min': 'Compute the cellwise/local min operation between Tiles in a column.', - 'agg_local_mean': 'Compute the cellwise/local mean operation between Tiles in a column.', - 'agg_local_data_cells': 'Compute the cellwise/local count of non-NoData cells for all Tiles in a column.', - 'agg_local_no_data_cells': 'Compute the cellwise/local count of NoData cells for all Tiles in a column.', - 'mask': 'Where the mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.', - 'inverse_mask': 'Where the mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.', - 'local_less': 'Cellwise less than comparison between two tiles', - 'local_less_equal': 'Cellwise less than or equal to comparison between two tiles', - 'local_greater': 'Cellwise greater than comparison between two tiles', - 'local_greater_equal': 'Cellwise greater than or equal to comparison between two tiles', - 'local_equal': 'Cellwise equality comparison between two tiles', - 'local_unequal': 'Cellwise inequality comparison between two tiles', - 'round': 'Round cell values to the nearest integer without changing the cell type', - 'log': 'Performs cell-wise natural logarithm', - 'log10': 'Performs cell-wise logartithm with base 10', - 'log2': 'Performs cell-wise logartithm with base 2', - 'log1p': 'Performs natural logarithm of cell values plus one', - 'exp': 'Performs cell-wise exponential', - 'exp2': 'Compute 2 to the power of cell values', - 'exp10': 'Compute 10 to the power of cell values', - 'expm1': 'Performs cell-wise exponential, then subtract one', - 'resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', - 'st_extent': 'Compute the extent/bbox of a Geometry', - 'extent_geometry': 'Convert the given extent/bbox to a polygon', + 'rf_agg_local_max': 'Compute the cell-wise/local max operation between Tiles in a column.', + 'rf_agg_local_min': 'Compute the cellwise/local min operation between Tiles in a column.', + 'rf_agg_local_mean': 'Compute the cellwise/local mean operation between Tiles in a column.', + 'rf_agg_local_data_cells': 'Compute the cellwise/local count of non-NoData cells for all Tiles in a column.', + 'rf_agg_local_no_data_cells': 'Compute the cellwise/local count of NoData cells for all Tiles in a column.', + 'rf_mask': 'Where the rf_mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.', + 'rf_inverse_mask': 'Where the rf_mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.', + 'rf_local_less': 'Cellwise less than comparison between two tiles', + 'rf_local_less_equal': 'Cellwise less than or equal to comparison between two tiles', + 'rf_local_greater': 'Cellwise greater than comparison between two tiles', + 'rf_local_greater_equal': 'Cellwise greater than or equal to comparison between two tiles', + 'rf_local_equal': 'Cellwise equality comparison between two tiles', + 'rf_local_unequal': 'Cellwise inequality comparison between two tiles', + 'rf_round': 'Round cell values to the nearest integer without changing the cell type', + 'rf_log': 'Performs cell-wise natural logarithm', + 'rf_log10': 'Performs cell-wise logartithm with base 10', + 'rf_log2': 'Performs cell-wise logartithm with base 2', + 'rf_log1p': 'Performs natural logarithm of cell values plus one', + 'rf_exp': 'Performs cell-wise exponential', + 'rf_exp2': 'Compute 2 to the power of cell values', + 'rf_exp10': 'Compute 10 to the power of cell values', + 'rf_expm1': 'Performs cell-wise exponential, then subtract one', + 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', + 'rf_extent': 'Compute the extent/bbox of a Geometry', + 'rf_extent_geometry': 'Convert the given extent/bbox to a polygon', # ------- JTS functions ------- # spatial constructors diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index d0c531533..2dbeb566f 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -52,7 +52,7 @@ def setUpClass(cls): # convert the tile cell type to provide for other operations cls.tileCol = 'tile' - cls.rf = rf.withColumn('tile2', convert_cell_type(cls.tileCol, 'float32')) \ + cls.rf = rf.withColumn('tile2', rf_convert_cell_type(cls.tileCol, 'float32')) \ .drop(cls.tileCol) \ .withColumnRenamed('tile2', cls.tileCol).asRF() #cls.rf.show() @@ -74,71 +74,71 @@ def test_tile_operations(self): df1 = self.rf.withColumnRenamed(self.tileCol, 't1').asRF() df2 = self.rf.withColumnRenamed(self.tileCol, 't2').asRF() df3 = df1.spatialJoin(df2).asRF() - df3 = df3.withColumn('norm_diff', normalized_difference('t1', 't2')) + df3 = df3.withColumn('norm_diff', rf_normalized_difference('t1', 't2')) df3.printSchema() aggs = df3.agg( - agg_mean('norm_diff'), + rf_agg_mean('norm_diff'), ) aggs.show() row = aggs.first() - self.assertTrue(_rounded_compare(row['agg_mean(norm_diff)'], 0)) + self.assertTrue(_rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) def test_general(self): meta = self.rf.tileLayerMetadata() self.assertIsNotNone(meta['bounds']) - df = self.rf.withColumn('dims', tile_dimensions(self.tileCol)) \ - .withColumn('type', cell_type(self.tileCol)) \ - .withColumn('dCells', data_cells(self.tileCol)) \ - .withColumn('ndCells', no_data_cells(self.tileCol)) \ - .withColumn('min', tile_min(self.tileCol)) \ - .withColumn('max', tile_max(self.tileCol)) \ - .withColumn('mean', tile_mean(self.tileCol)) \ - .withColumn('sum', tile_sum(self.tileCol)) \ - .withColumn('stats', tile_stats(self.tileCol)) \ - .withColumn('envelope', envelope('geometry')) \ - .withColumn('ascii', render_ascii(self.tileCol)) \ - .withColumn('log', log(self.tileCol)) \ - .withColumn('exp', exp(self.tileCol)) \ - .withColumn('expm1', expm1(self.tileCol)) \ - .withColumn('round', round(self.tileCol)) + df = self.rf.withColumn('dims', rf_tile_dimensions(self.tileCol)) \ + .withColumn('type', rf_cell_type(self.tileCol)) \ + .withColumn('dCells', rf_data_cells(self.tileCol)) \ + .withColumn('ndCells', rf_no_data_cells(self.tileCol)) \ + .withColumn('min', rf_tile_min(self.tileCol)) \ + .withColumn('max', rf_tile_max(self.tileCol)) \ + .withColumn('mean', rf_tile_mean(self.tileCol)) \ + .withColumn('sum', rf_tile_sum(self.tileCol)) \ + .withColumn('stats', rf_tile_stats(self.tileCol)) \ + .withColumn('extent', rf_extent('geometry')) \ + .withColumn('ascii', rf_render_ascii(self.tileCol)) \ + .withColumn('log', rf_log(self.tileCol)) \ + .withColumn('exp', rf_exp(self.tileCol)) \ + .withColumn('expm1', rf_expm1(self.tileCol)) \ + .withColumn('round', rf_round(self.tileCol)) df.show() def test_rasterize(self): - # NB: This test just makes sure rasterize runs, not that the results are correct. - withRaster = self.rf.withColumn('rasterize', rasterize('geometry', 'geometry', lit(42), 10, 10)) + # NB: This test just makes sure rf_rasterize runs, not that the results are correct. + withRaster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) withRaster.show() def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', reproject_geometry('center', 'EPSG:4326', 'EPSG:3857')) + reprojected = self.rf.withColumn('reprojected', rf_reproject_geometry('center', 'EPSG:4326', 'EPSG:3857')) reprojected.show() def test_aggregations(self): aggs = self.rf.agg( - agg_mean(self.tileCol), - agg_data_cells(self.tileCol), - agg_no_data_cells(self.tileCol), - agg_stats(self.tileCol), - agg_approx_histogram(self.tileCol) + rf_agg_mean(self.tileCol), + rf_agg_data_cells(self.tileCol), + rf_agg_no_data_cells(self.tileCol), + rf_agg_stats(self.tileCol), + rf_agg_approx_histogram(self.tileCol) ) aggs.show() row = aggs.first() - self.assertTrue(_rounded_compare(row['agg_mean(tile)'], 10160)) - print(row['agg_data_cells(tile)']) - self.assertEqual(row['agg_data_cells(tile)'], 387000) - self.assertEqual(row['agg_no_data_cells(tile)'], 1000) - self.assertEqual(row['agg_stats(tile)'].data_cells, row['agg_data_cells(tile)']) + self.assertTrue(_rounded_compare(row['rf_agg_mean(tile)'], 10160)) + print(row['rf_agg_data_cells(tile)']) + self.assertEqual(row['rf_agg_data_cells(tile)'], 387000) + self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) + self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) def test_sql(self): self.rf.createOrReplaceTempView("rf") - dims = self.rf.withColumn('dims', tile_dimensions(self.tileCol)).first().dims + dims = self.rf.withColumn('dims', rf_tile_dimensions(self.tileCol)).first().dims dims_str = """{}, {}""".format(dims.cols, dims.rows) self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, @@ -152,11 +152,11 @@ def test_sql(self): FROM r3""") ops.printSchema - statsRow = ops.select(tile_mean(self.tileCol).alias('base'), - tile_mean("AndOne").alias('plus_one'), - tile_mean("LessOne").alias('minus_one'), - tile_mean("TimesTwo").alias('double'), - tile_mean("OverTwo").alias('half')) \ + statsRow = ops.select(rf_tile_mean(self.tileCol).alias('base'), + rf_tile_mean("AndOne").alias('plus_one'), + rf_tile_mean("LessOne").alias('minus_one'), + rf_tile_mean("TimesTwo").alias('double'), + rf_tile_mean("OverTwo").alias('half')) \ .first() self.assertTrue(_rounded_compare(statsRow.base, statsRow.plus_one - 1)) @@ -166,12 +166,12 @@ def test_sql(self): def test_explode(self): import pyspark.sql.functions as F - self.rf.select('spatial_key', explode_tiles(self.tileCol)).show() + self.rf.select('spatial_key', rf_explode_tiles(self.tileCol)).show() # +-----------+------------+---------+-------+ # |spatial_key|column_index|row_index|tile | # +-----------+------------+---------+-------+ # |[2,1] |4 |0 |10150.0| - cell = self.rf.select(self.rf.spatialKeyColumn(), explode_tiles(self.rf.tile)) \ + cell = self.rf.select(self.rf.spatialKeyColumn(), rf_explode_tiles(self.rf.tile)) \ .where(F.col("spatial_key.col")==2) \ .where(F.col("spatial_key.row")==1) \ .where(F.col("column_index")==4) \ @@ -182,7 +182,7 @@ def test_explode(self): # Test the sample version frac = 0.01 - sample_count = self.rf.select(explode_tiles_sample(frac, 1872, self.tileCol)).count() + sample_count = self.rf.select(rf_explode_tiles_sample(frac, 1872, self.tileCol)).count() print('Sample count is {}'.format(sample_count)) self.assertTrue(sample_count > 0) self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room @@ -195,13 +195,13 @@ def test_maskByValue(self): mask_value = 4 rf1 = self.rf.select(self.rf.tile, - local_multiply( - convert_cell_type( - local_greater_scalar_int(self.rf.tile, 25000), + rf_local_multiply( + rf_convert_cell_type( + rf_local_greater_int(self.rf.tile, 25000), "uint8"), lit(mask_value)).alias('mask')) - rf2 = rf1.select(rf1.tile, mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) - result = rf2.agg(agg_no_data_cells(rf2.tile) < agg_no_data_cells(rf2.masked)) \ + rf2 = rf1.select(rf1.tile, rf_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) + result = rf2.agg(rf_agg_no_data_cells(rf2.tile) < rf_agg_no_data_cells(rf2.masked)) \ .collect()[0][0] self.assertTrue(result) @@ -209,8 +209,8 @@ def test_maskByValue(self): def test_resample(self): from pyspark.sql.functions import lit result = self.rf.select( - tile_min(local_equal( - resample(resample(self.rf.tile, lit(2)), lit(0.5)), + rf_tile_min(rf_local_equal( + rf_resample(rf_resample(self.rf.tile, lit(2)), lit(0.5)), self.rf.tile)) ).collect()[0][0] diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 3ea7ab4a0..a649cd8a7 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -20,14 +20,11 @@ */ package org.locationtech.rasterframes.py -import org.locationtech.rasterframes._ -import org.locationtech.jts.geom.Geometry -import geotrellis.raster.{ArrayTile, CellType, MultibandTile} +import geotrellis.raster.{CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ -import org.locationtech.geomesa.spark.jts.util.WKBUtils -import org.locationtech.rasterframes.RasterFunctions +import org.locationtech.rasterframes.{RasterFunctions, _} import org.locationtech.rasterframes.model.LazyCRS import spray.json._ @@ -95,27 +92,18 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions /** * Convenience functions for use in Python */ - def cell_type(name: String): CellType = CellType.fromName(name) + def rf_cell_type(name: String): CellType = CellType.fromName(name) /** * Convenience list of valid cell type strings * @return Java List of String, which py4j can interpret as a python `list` */ - def cell_types = { + def rf_cell_types = { org.locationtech.rasterframes.functions.cellTypes().asJava } - /** DESERIALIZATION **/ - - def generate_tile(cellType: String, cols: Int, rows: Int, bytes: Array[Byte]): ArrayTile = { - ArrayTile.fromBytes(bytes, this.cell_type(cellType), cols, rows) - } - - def generate_geometry(obj: Array[Byte]): Geometry = WKBUtils.read(obj) - - def explode_tiles_sample(sampleFraction: Double, seed: Long, cols: Column*): Column = - explode_tiles_sample(sampleFraction, Some(seed), cols: _*) - + def rf_explode_tiles_sample(sampleFraction: Double, seed: Long, cols: Column*): Column = + rf_explode_tiles_sample(sampleFraction, Some(seed), cols: _*) def tileColumns(df: DataFrame): Array[Column] = df.asRF.tileColumns.toArray @@ -126,51 +114,53 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def temporalKeyColumn(df: DataFrame): Column = df.asRF.temporalKeyColumn.orNull - def tile_to_int_array(col: Column): Column = tile_to_array_int(col) - - def tile_to_double_array(col: Column): Column = tile_to_array_double(col) - // All the scalar tile arithmetic functions - def local_add_scalar(col: Column, scalar: Double): Column = local_add[Double](col, scalar) + def rf_local_add_double(col: Column, scalar: Double): Column = rf_local_add[Double](col, scalar) - def local_add_scalar_int(col: Column, scalar: Int): Column = local_add[Int](col, scalar) + def rf_local_add_int(col: Column, scalar: Int): Column = rf_local_add[Int](col, scalar) - def local_subtract_scalar(col: Column, scalar: Double): Column = local_subtract[Double](col, scalar) + def rf_local_subtract_double(col: Column, scalar: Double): Column = rf_local_subtract[Double](col, scalar) - def local_subtract_scalar_int(col: Column, scalar: Int): Column = local_subtract[Int](col, scalar) + def rf_local_subtract_int(col: Column, scalar: Int): Column = rf_local_subtract[Int](col, scalar) - def local_divide_scalar(col: Column, scalar: Double): Column = local_divide[Double](col, scalar) + def rf_local_divide_double(col: Column, scalar: Double): Column = rf_local_divide[Double](col, scalar) - def local_divide_scalar_int(col: Column, scalar: Int): Column = local_divide[Int](col, scalar) + def rf_local_divide_int(col: Column, scalar: Int): Column = rf_local_divide[Int](col, scalar) - def local_multiply_scalar(col: Column, scalar: Double): Column = local_multiply[Double](col, scalar) + def rf_local_multiply_double(col: Column, scalar: Double): Column = rf_local_multiply[Double](col, scalar) - def local_multiply_scalar_int(col: Column, scalar: Int): Column = local_multiply[Int](col, scalar) + def rf_local_multiply_int(col: Column, scalar: Int): Column = rf_local_multiply[Int](col, scalar) - def local_less_scalar(col: Column, scalar: Double): Column = local_less[Double](col, scalar) + def rf_local_less_double(col: Column, scalar: Double): Column = rf_local_less[Double](col, scalar) - def local_less_scalar_int(col: Column, scalar: Int): Column = local_less[Int](col, scalar) + def rf_local_less_int(col: Column, scalar: Int): Column = rf_local_less[Int](col, scalar) - def local_less_equal_scalar(col: Column, scalar: Double): Column = local_less_equal[Double](col, scalar) + def rf_local_less_equal_double(col: Column, scalar: Double): Column = rf_local_less_equal[Double](col, scalar) - def local_less_equal_scalar_int(col: Column, scalar: Int): Column = local_less_equal[Int](col, scalar) + def rf_local_less_equal_int(col: Column, scalar: Int): Column = rf_local_less_equal[Int](col, scalar) - def local_greater_scalar(col: Column, scalar: Double): Column = local_greater[Double](col, scalar) + def rf_local_greater_double(col: Column, scalar: Double): Column = rf_local_greater[Double](col, scalar) - def local_greater_scalar_int(col: Column, scalar: Int): Column = local_greater[Int](col, scalar) + def rf_local_greater_int(col: Column, scalar: Int): Column = rf_local_greater[Int](col, scalar) - def local_greater_equal_scalar(col: Column, scalar: Double): Column = local_greater_equal[Double](col, scalar) + def rf_local_greater_equal_double(col: Column, scalar: Double): Column = rf_local_greater_equal[Double](col, scalar) - def local_greater_equal_scalar_int(col: Column, scalar: Int): Column = local_greater_equal[Int](col, scalar) + def rf_local_greater_equal_int(col: Column, scalar: Int): Column = rf_local_greater_equal[Int](col, scalar) - def local_equal_scalar(col: Column, scalar: Double): Column = local_equal[Double](col, scalar) + def rf_local_equal_double(col: Column, scalar: Double): Column = rf_local_equal[Double](col, scalar) - def local_equal_scalar_int(col: Column, scalar: Int): Column = local_equal[Int](col, scalar) + def rf_local_equal_int(col: Column, scalar: Int): Column = rf_local_equal[Int](col, scalar) - def local_unequal_scalar(col: Column, scalar: Double): Column = local_unequal[Double](col, scalar) + def rf_local_unequal_double(col: Column, scalar: Double): Column = rf_local_unequal[Double](col, scalar) - def local_unequal_scalar_int(col: Column, scalar: Int): Column = local_unequal[Int](col, scalar) + def rf_local_unequal_int(col: Column, scalar: Int): Column = rf_local_unequal[Int](col, scalar) + + def rf_reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { + val src = LazyCRS(srcName) + val dst = LazyCRS(dstName) + rf_reproject_geometry(geometryCol, src, dst) + } // return toRaster, get just the tile, and make an array out of it def toIntRaster(df: DataFrame, colname: String, cols: Int, rows: Int): Array[Int] = { @@ -195,11 +185,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def withSpatialIndex(df: DataFrame): RasterFrame = df.asRF.withSpatialIndex() - def reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { - val src = LazyCRS(srcName) - val dst = LazyCRS(dstName) - reproject_geometry(geometryCol, src, dst) - } + //----------------------------Support Routines----------------------------------------- - def listToSeq(cols: java.util.ArrayList[AnyRef]): Seq[AnyRef] = cols.asScala + def _listToSeq(cols: java.util.ArrayList[AnyRef]): Seq[AnyRef] = cols.asScala } From 3582b614eb080432f588905dd2fb7e686abb2ad8 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 25 Apr 2019 17:26:24 -0400 Subject: [PATCH 051/380] Fixed integration test. --- .../experimental/datasource/ReadTilesExpression.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala index 875d30c1a..37e32ba46 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -30,6 +30,7 @@ import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.{ProjectedRaster, Tile} import geotrellis.spark.io.hadoop.HdfsRangeReader +import geotrellis.spark.io.http.util.HttpRangeReader import geotrellis.spark.io.s3.S3Client import geotrellis.spark.io.s3.util.S3RangeReader import geotrellis.util.{ByteReader, FileRangeReader, RangeReader, StreamingByteReader} @@ -41,7 +42,6 @@ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, Generator, Literal} import org.apache.spark.sql.types._ -import org.locationtech.rasterframes.ref.HttpRangeReader /** * Catalyst generator to convert a geotiff download URL into a series of rows containing the internal From d29cda26e855388dd971f0e07b22430c81c2e690 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 25 Apr 2019 12:21:00 -0400 Subject: [PATCH 052/380] Changed constant tile injection via literal rather than UDF. Normalization of naming of tile creation functions. --- .../apache/spark/sql/rf/RasterSourceUDT.scala | 2 +- .../rasterframes/RasterFunctions.scala | 67 ++++++++++++------- .../rasterframes/encoders/package.scala | 8 ++- .../transformers/URIToRasterSource.scala | 4 +- .../rasterframes/functions/package.scala | 4 +- .../rasterframes/model/Cells.scala | 19 ++++-- .../rasterframes/rasterframes.scala | 6 +- .../rasterframes/tiles/InternalRowTile.scala | 36 +++------- .../rasterframes/util/package.scala | 11 +-- .../rasterframes/RasterFunctionsSpec.scala | 37 ++++++++-- .../rasterframes/TileStatsSpec.scala | 2 +- docs/src/main/tut/reference.md | 2 +- docs/src/main/tut/release-notes.md | 6 +- .../datasource/ReadTilesExpression.scala | 2 +- pyrasterframes/python/coverage-report.sh | 9 +++ .../python/pyrasterframes/rasterfunctions.py | 14 ++-- .../python/tests/PyRasterFramesTests.py | 5 ++ 17 files changed, 146 insertions(+), 88 deletions(-) create mode 100755 pyrasterframes/python/coverage-report.sh diff --git a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala index fba25bf83..bbcafec2a 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala @@ -65,7 +65,7 @@ class RasterSourceUDT extends UserDefinedType[RasterSource] { } } -object RasterSourceUDT extends RasterSourceUDT { +object RasterSourceUDT { UDTRegistration.register(classOf[RasterSource].getName, classOf[RasterSourceUDT].getName) implicit val rasterSourceSerializer: CatalystSerializer[RasterSource] = new CatalystSerializer[RasterSource] { diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 976be8330..95adea29f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -97,6 +97,14 @@ trait RasterFunctions { def rf_convert_cell_type(col: Column, cellTypeName: String): TypedColumn[Any, Tile] = SetCellType(col, cellTypeName) + /** Resample tile to different size based on scalar factor or tile whose dimension to match. Scalar less + * than one will downsample tile; greater than one will upsample. Uses nearest-neighbor. */ + def rf_resample[T: Numeric](tileCol: Column, factorValue: T) = Resample(tileCol, factorValue) + + /** Resample tile to different size based on scalar factor or tile whose dimension to match. Scalar less + * than one will downsample tile; greater than one will upsample. Uses nearest-neighbor. */ + def rf_resample(tileCol: Column, factorCol: Column) = Resample(tileCol, factorCol) + /** Convert a bounding box structure to a Geometry type. Intented to support multiple schemas. */ def rf_extent_geometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) @@ -201,27 +209,45 @@ trait RasterFunctions { def rf_local_divide[T: Numeric](tileCol: Column, value: T): TypedColumn[Any, Tile] = Divide(tileCol, value) /** Perform an arbitrary GeoTrellis `LocalTileBinaryOp` between two Tile columns. */ - def rf_local_algebra(op: LocalTileBinaryOp, left: Column, right: Column): - TypedColumn[Any, Tile] = - withAlias(opName(op), left, right)( - udf[Tile, Tile, Tile](op.apply).apply(left, right) - ).as[Tile] + def rf_local_algebra(op: LocalTileBinaryOp, left: Column, right: Column): TypedColumn[Any, Tile] = + withTypedAlias(opName(op), left, right)(udf[Tile, Tile, Tile](op.apply).apply(left, right)) /** Compute the normalized difference of two tile columns */ def rf_normalized_difference(left: Column, right: Column) = NormalizedDifference(left, right) - /** Constructor for constant tile column */ - def rf_make_constant_tile(value: Number, cols: Int, rows: Int, cellType: String): TypedColumn[Any, Tile] = - udf(() => F.makeConstantTile(value, cols, rows, cellType)).apply().as(s"constant_$cellType").as[Tile] - - /** Alias for column of constant tiles of zero */ - def rf_tile_zeros(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = - udf(() => F.tileZeros(cols, rows, cellType)).apply().as(s"zeros_$cellType").as[Tile] - - /** Alias for column of constant tiles of one */ - def rf_tile_ones(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = - udf(() => F.tileOnes(cols, rows, cellType)).apply().as(s"ones_$cellType").as[Tile] + /** Constructor for tile column with a single cell value. */ + def rf_make_constant_tile(value: Number, cols: Int, rows: Int, cellType: CellType): TypedColumn[Any, Tile] = + rf_make_constant_tile(value, cols, rows, cellType.name) + + /** Constructor for tile column with a single cell value. */ + def rf_make_constant_tile(value: Number, cols: Int, rows: Int, cellTypeName: String): TypedColumn[Any, Tile] = { + import org.apache.spark.sql.rf.TileUDT.tileSerializer + val constTile = encoders.serialized_literal(F.makeConstantTile(value, cols, rows, cellTypeName)) + withTypedAlias(s"rf_make_constant_tile($value, $cols, $rows, $cellTypeName)")(constTile) + } + + /** Create a column constant tiles of zero */ + def rf_make_zeros_tile(cols: Int, rows: Int, cellType: CellType): TypedColumn[Any, Tile] = + rf_make_zeros_tile(cols, rows, cellType.name) + + /** Create a column constant tiles of zero */ + def rf_make_zeros_tile(cols: Int, rows: Int, cellTypeName: String): TypedColumn[Any, Tile] = { + import org.apache.spark.sql.rf.TileUDT.tileSerializer + val constTile = encoders.serialized_literal(F.tileZeros(cols, rows, cellTypeName)) + withTypedAlias(s"rf_make_zeros_tile($cols, $rows, $cellTypeName)")(constTile) + } + + /** Creates a column of tiles containing all ones */ + def rf_make_ones_tile(cols: Int, rows: Int, cellType: CellType): TypedColumn[Any, Tile] = + rf_make_ones_tile(cols, rows, cellType.name) + + /** Creates a column of tiles containing all ones */ + def rf_make_ones_tile(cols: Int, rows: Int, cellTypeName: String): TypedColumn[Any, Tile] = { + import org.apache.spark.sql.rf.TileUDT.tileSerializer + val constTile = encoders.serialized_literal(F.tileOnes(cols, rows, cellTypeName)) + withTypedAlias(s"rf_make_ones_tile($cols, $rows, $cellTypeName)")(constTile) + } /** Where the rf_mask tile contains NODATA, replace values in the source tile with NODATA */ def rf_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = @@ -237,9 +263,9 @@ trait RasterFunctions { /** Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value. */ def rf_rasterize(geometry: Column, bounds: Column, value: Column, cols: Int, rows: Int): TypedColumn[Any, Tile] = - withAlias("rf_rasterize", geometry)( + withTypedAlias("rf_rasterize", geometry)( udf(F.rasterize(_: Geometry, _: Geometry, _: Int, cols, rows)).apply(geometry, bounds, value) - ).as[Tile] + ) /** Reproject a column of geometry from one CRS to another. */ def rf_reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRSCol: Column): TypedColumn[Any, Geometry] = @@ -345,10 +371,5 @@ trait RasterFunctions { def rf_expm1(tileCol: Column): TypedColumn[Any, Tile] = ExpM1(tileCol) - /** Resample tile using nearest-neighbor */ - def rf_resample[T: Numeric](tileCol: Column, value: T) = Resample(tileCol, value) - - /** Resample tile using nearest-neighbor */ - def rf_resample(tileCol: Column, column2: Column) = Resample(tileCol, column2) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala index d2ebf0c84..8cb5a6f85 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/package.scala @@ -21,6 +21,7 @@ package org.locationtech.rasterframes +import org.apache.spark.sql.rf._ import org.apache.spark.sql.Column import org.apache.spark.sql.catalyst.expressions.Literal @@ -43,7 +44,12 @@ package object encoders { /** Constructs a catalyst literal expression from anything with a serializer. */ def SerializedLiteral[T >: Null: CatalystSerializer](t: T): Literal = { val ser = CatalystSerializer[T] - Literal.create(ser.toInternalRow(t), ser.schema) + val schema = ser.schema match { + case s if s.conformsTo(TileType.sqlType) => TileType + case s if s.conformsTo(RasterSourceType.sqlType) => RasterSourceType + case s => s + } + Literal.create(ser.toInternalRow(t), schema) } /** Constructs a Dataframe literal column from anything with a serializer. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala index e5bd7904b..bd5792aee 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -23,7 +23,7 @@ package org.locationtech.rasterframes.expressions.transformers import java.net.URI -import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.RasterSourceType import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ExpectsInputTypes, Expression, UnaryExpression} @@ -53,7 +53,7 @@ case class URIToRasterSource(override val child: Expression) val uriString = input.asInstanceOf[UTF8String].toString val uri = URI.create(uriString) val ref = RasterSource(uri) - RasterSourceUDT.serialize(ref) + RasterSourceType.serialize(ref) } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index e404657c4..62933029a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -138,8 +138,8 @@ package object functions { def register(sqlContext: SQLContext): Unit = { sqlContext.udf.register("rf_make_constant_tile", makeConstantTile) - sqlContext.udf.register("rf_tile_zeros", tileZeros) - sqlContext.udf.register("rf_tile_ones", tileOnes) + sqlContext.udf.register("rf_make_zeros_tile", tileZeros) + sqlContext.udf.register("rf_make_ones_tile", tileOnes) sqlContext.udf.register("rf_cell_types", cellTypes) sqlContext.udf.register("rf_rasterize", rasterize) diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala index 1c7840511..4566e7630 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala @@ -21,7 +21,7 @@ package org.locationtech.rasterframes.model -import geotrellis.raster.{ArrayTile, Tile} +import geotrellis.raster.{ArrayTile, ConstantTile, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{BinaryType, StructField, StructType} import org.locationtech.rasterframes.encoders.CatalystSerializer._ @@ -32,6 +32,7 @@ import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile /** Represents the union of binary cell datas or a reference to the data.*/ case class Cells(data: Either[Array[Byte], RasterRef]) { def isRef: Boolean = data.isRight + /** Convert cells into either a RasterRefTile or an ArrayTile. */ def toTile(ctx: TileDataContext): Tile = { data.fold( @@ -42,21 +43,27 @@ case class Cells(data: Either[Array[Byte], RasterRef]) { } object Cells { + /** Extracts the Cells from a Tile. */ def apply(t: Tile): Cells = { t match { case ref: RasterRefTile => Cells(Right(ref.rr)) - case o => + case const: ConstantTile => + // TODO: Create mechanism whereby constant tiles aren't expanded. + Cells(Left(const.toArrayTile().toBytes)) + case o => Cells(Left(o.toBytes)) } } implicit def cellsSerializer: CatalystSerializer[Cells] = new CatalystSerializer[Cells] { - override def schema: StructType = StructType(Seq( - StructField("cells", BinaryType, true), - StructField("ref", schemaOf[RasterRef], true) - )) + override def schema: StructType = + StructType( + Seq( + StructField("cells", BinaryType, true), + StructField("ref", schemaOf[RasterRef], true) + )) override protected def to[R](t: Cells, io: CatalystSerializer.CatalystIO[R]): R = io.create( t.data.left.getOrElse(null), t.data.right.map(rr => io.to(rr)).right.getOrElse(null) diff --git a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala index 8a7ac0fc2..03eb1a40f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala @@ -25,7 +25,7 @@ import com.typesafe.scalalogging.LazyLogging import geotrellis.raster.{Tile, TileFeature} import geotrellis.spark.{ContextRDD, Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.rdd.RDD -import org.apache.spark.sql.rf.TileUDT +import org.apache.spark.sql.rf.{RasterSourceUDT, TileUDT} import org.apache.spark.sql.{DataFrame, SQLContext, rf} import org.locationtech.geomesa.spark.jts.DataFrameFunctions import org.locationtech.rasterframes.encoders.StandardEncoders @@ -33,6 +33,7 @@ import org.locationtech.rasterframes.extensions.Implicits import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.util.ZeroSevenCompatibilityKit import shapeless.tag.@@ + import scala.reflect.runtime.universe._ package object rasterframes extends StandardColumns @@ -86,6 +87,9 @@ package object rasterframes extends StandardColumns /** TileUDT type reference. */ def TileType = new TileUDT() + /** RasterSourceUDT type reference. */ + def RasterSourceType = new RasterSourceUDT() + /** * A RasterFrame is just a DataFrame with certain invariants, enforced via the methods that create and transform them: * 1. One column is a [[geotrellis.spark.SpatialKey]] or [[geotrellis.spark.SpaceTimeKey]] diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala index 9d18eb586..2785888d7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala @@ -24,7 +24,6 @@ package org.locationtech.rasterframes.tiles import java.nio.ByteBuffer import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO -import org.locationtech.rasterframes.model.TileDataContext import geotrellis.raster._ import org.apache.spark.sql.catalyst.InternalRow import org.locationtech.rasterframes.model.{Cells, TileDataContext} @@ -33,36 +32,22 @@ import org.locationtech.rasterframes.model.{Cells, TileDataContext} * Wrapper around a `Tile` encoded in a Catalyst `InternalRow`, for the purpose * of providing compatible semantics over common operations. * - * @groupname COPIES Memory Copying - * @groupdesc COPIES Requires creating an intermediate copy of - * the complete `Tile` contents, and should be avoided. - * * @since 11/29/17 */ class InternalRowTile(val mem: InternalRow) extends FixedDelegatingTile { import InternalRowTile._ - /** @group COPIES */ - override def toArrayTile(): ArrayTile = realizedTile + override def toArrayTile(): ArrayTile = realizedTile.toArrayTile() - // TODO: We want to reimpliement the delegated methods so that they read directly from tungsten storage - protected lazy val realizedTile: ArrayTile = { - val data = toBytes - if(data.length < cols * rows && cellType.name != "bool") { - val ctile = ConstantTile.fromBytes(data, cellType, cols, rows) - val atile = ctile.toArrayTile() - atile - } - else - ArrayTile.fromBytes(data, cellType, cols, rows) - } + // TODO: We want to reimplement relevant delegated methods so that they read directly from tungsten storage + protected lazy val realizedTile: Tile = cells.toTile(cellContext) - /** @group COPIES */ protected override def delegate: Tile = realizedTile - private lazy val cellContext: TileDataContext = + private def cellContext: TileDataContext = CatalystIO[InternalRow].get[TileDataContext](mem, 0) + private def cells: Cells = CatalystIO[InternalRow].get[Cells](mem, 1) /** Retrieve the cell type from the internal encoding. */ override def cellType: CellType = cellContext.cellType @@ -75,13 +60,9 @@ class InternalRowTile(val mem: InternalRow) extends FixedDelegatingTile { /** Get the internally encoded tile data cells. */ override lazy val toBytes: Array[Byte] = { - val cellData = CatalystIO[InternalRow] - .get[Cells](mem, 1) - .data - - cellData.left + cells.data.left .getOrElse(throw new IllegalStateException( - "Expected tile cell bytes, but received RasterRef instead: " + cellData.right.get) + "Expected tile cell bytes, but received RasterRef instead: " + cells.data.right.get) ) } @@ -99,12 +80,11 @@ class InternalRowTile(val mem: InternalRow) extends FixedDelegatingTile { } /** Reads the cell value at the given index as an Int. */ - def apply(i: Int): Int = cellReader(i) + def apply(i: Int): Int = cellReader.apply(i) /** Reads the cell value at the given index as a Double. */ def applyDouble(i: Int): Double = cellReader.applyDouble(i) - /** @group COPIES */ def copy = new InternalRowTile(mem.copy) private lazy val cellReader: CellReader = { diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala index f723224f9..2f1ee9ca4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala @@ -37,7 +37,7 @@ import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.catalyst.rules.Rule import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.StringType -import org.apache.spark.sql.{Column, DataFrame, SQLContext} +import org.apache.spark.sql._ import org.slf4j.LoggerFactory import spire.syntax.cfor._ @@ -83,18 +83,21 @@ package object util { /** Tags output column with a nicer name. */ private[rasterframes] - def withAlias(name: String, inputs: Column*)(output: Column) = { + def withAlias(name: String, inputs: Column*)(output: Column): Column = { val paramNames = inputs.map(_.columnName).mkString(",") output.as(s"$name($paramNames)") } + /** Tags output column with a nicer name, yet strongly typed. */ + private[rasterframes] + def withTypedAlias[T: Encoder](name: String, inputs: Column*)(output: Column): TypedColumn[Any, T] = + withAlias(name, inputs: _*)(output).as[T] + /** Derives and operator name from the implementing object name. */ private[rasterframes] def opName(op: LocalTileBinaryOp) = op.getClass.getSimpleName.replace("$", "").toLowerCase - - implicit class WithCombine[T](left: Option[T]) { def combine[A, R >: A](a: A)(f: (T, A) ⇒ R): R = left.map(f(_, a)).getOrElse(a) def tupleWith[R](right: Option[R]): Option[(T, R)] = left.flatMap(l ⇒ right.map((l, _))) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index a7e94c2d2..a72be9347 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -24,7 +24,7 @@ package org.locationtech.rasterframes import geotrellis.proj4.LatLng import geotrellis.raster import geotrellis.raster.testkit.RasterMatchers -import geotrellis.raster.{ArrayTile, ByteUserDefinedNoDataCellType, DoubleConstantNoDataCellType, ShortConstantNoDataCellType, Tile, UByteConstantNoDataCellType} +import geotrellis.raster._ import geotrellis.vector.Extent import org.apache.spark.sql.Encoders import org.apache.spark.sql.functions._ @@ -67,6 +67,33 @@ class RasterFunctionsSpec extends FunSpec implicit val pairEnc = Encoders.tuple(ProjectedRasterTile.prtEncoder, ProjectedRasterTile.prtEncoder) implicit val tripEnc = Encoders.tuple(ProjectedRasterTile.prtEncoder, ProjectedRasterTile.prtEncoder, ProjectedRasterTile.prtEncoder) + describe("constant tile generation operations") { + val dim = 2 + val rows = 2 + + it("should create a ones tile") { + val df = (0 until rows).toDF("id") + .withColumn("const", rf_make_ones_tile(dim, dim, IntConstantNoDataCellType)) + val result = df.select(rf_tile_sum($"const") as "ts").agg(sum("ts")).as[Double].first() + result should be (dim * dim * rows) + } + + it("should create a zeros tile") { + val df = (0 until rows).toDF("id") + .withColumn("const", rf_make_zeros_tile(dim, dim, FloatConstantNoDataCellType)) + val result = df.select(rf_tile_sum($"const") as "ts").agg(sum("ts")).as[Double].first() + result should be (0) + } + + it("should create an arbitrary constant tile") { + val value = 4 + val df = (0 until rows).toDF("id") + .withColumn("const", rf_make_constant_tile(value, dim, dim, ByteConstantNoDataCellType)) + val result = df.select(rf_tile_sum($"const") as "ts").agg(sum("ts")).as[Double].first() + result should be (dim * dim * rows * value) + } + } + describe("arithmetic tile operations") { it("should local_add") { val df = Seq((one, two)).toDF("one", "two") @@ -329,12 +356,12 @@ class RasterFunctionsSpec extends FunSpec .select($"stats.mean").as[Double] .first() should be(mean +- 0.00001) df.selectExpr("rf_tile_stats(rand) as stats") - .select($"stats.rf_no_data_cells").as[Long] + .select($"stats.no_data_cells").as[Long] .first() should be <= (cols * rows - numND).toLong val df2 = randNDTilesWithNull.toDF("tile") df2 - .select(rf_tile_stats($"tile")("rf_data_cells") as "cells") + .select(rf_tile_stats($"tile")("data_cells") as "cells") .agg(sum("cells")) .as[Long] .first() should be (expectedRandData) @@ -376,11 +403,11 @@ class RasterFunctionsSpec extends FunSpec df .select(rf_agg_stats($"tile") as "stats") - .select("stats.rf_data_cells", "stats.rf_no_data_cells") + .select("stats.data_cells", "stats.no_data_cells") .as[(Long, Long)] .first() should be ((expectedRandData, expectedRandNoData)) df.selectExpr("rf_agg_stats(tile) as stats") - .select("stats.rf_data_cells") + .select("stats.data_cells") .as[Long] .first() should be (expectedRandData) diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala index 3ddbc52ec..6309e3eda 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala @@ -221,7 +221,7 @@ class TileStatsSpec extends TestEnvironment with TestData { ds.createOrReplaceTempView("tmp") val agg2 = sql("select stats.* from (select rf_agg_stats(tiles) as stats from tmp)") - assert(agg2.first().getAs[Long]("rf_data_cells") === 250L) + assert(agg2.first().getAs[Long]("data_cells") === 250L) val agg3 = ds.agg(rf_agg_stats($"tiles") as "stats").select($"stats.mean".as[Double]) assert(mean === agg3.first()) diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index fe9b91851..860a750d8 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -556,7 +556,7 @@ The following functions compute a statistical summary per row of a `tile` column ```python import pyspark.functions as F spark.sql(""" - SELECT 1 as id, rf_tile_ones(5, 5, 'float32') as t + SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION SELECT 2 as id, rf_local_multiply(rf_tile_ones(5, 5, 'float32'), 3) as t """).select(F.col('id'), tile_sum(F.col('t'))).show() diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 9e5698c36..c831a15d7 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -55,8 +55,8 @@ * Added [experimental DataSource implementations](https://github.com/locationtech/rasterframes/tree/develop/experimental/src/main/scala/astraea/spark/rasterframes/experimental/datasource/awspds) for [MODIS](https://registry.opendata.aws/modis/) and [Landsat 8](https://registry.opendata.aws/landsat-8/) catalogs on AWS PDS. * _Change_: Default interpoation for `toRaster` and `toMultibandRaster` has been changed from `Bilinear` to `NearestNeighbor`. * _Breaking_: Renamed/moved `astraea.spark.rasterframes.functions.CellStatsAggregateFunction.Statistics` to -`org.locationtech.rasterframes.stats.CellStatistics`. -* _Breaking_: `HistogramAggregateFunction` now generates the new type `org.locationtech.rasterframes.stats.CellHistogram`. +`astraea.spark.rasterframes.stats.CellStatistics`. +* _Breaking_: `HistogramAggregateFunction` now generates the new type `astraea.spark.rasterframes.stats.CellHistogram`. * _Breaking_: `box2D` renamed `envelope`. ## 0.6.x @@ -115,7 +115,7 @@ ### 0.5.9 * Ported to sbt 1.0.3 -* Added sbt-generated `org.locationtech.rasterframes.RFBuildInfo` +* Added sbt-generated `astraea.spark.rasterframes.RFBuildInfo` * Fixed bug in computing `aggMean` when one or more tiles are `null` * Deprecated `rfIinit` in favor of `SparkSession.withRasterFrames` or `SQLContext.withRasterFrames` extension methods diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala index 875d30c1a..37e32ba46 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala @@ -30,6 +30,7 @@ import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.reader.GeoTiffReader import geotrellis.raster.{ProjectedRaster, Tile} import geotrellis.spark.io.hadoop.HdfsRangeReader +import geotrellis.spark.io.http.util.HttpRangeReader import geotrellis.spark.io.s3.S3Client import geotrellis.spark.io.s3.util.S3RangeReader import geotrellis.util.{ByteReader, FileRangeReader, RangeReader, StreamingByteReader} @@ -41,7 +42,6 @@ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, Generator, Literal} import org.apache.spark.sql.types._ -import org.locationtech.rasterframes.ref.HttpRangeReader /** * Catalyst generator to convert a geotiff download URL into a series of rows containing the internal diff --git a/pyrasterframes/python/coverage-report.sh b/pyrasterframes/python/coverage-report.sh new file mode 100755 index 000000000..8cde233a1 --- /dev/null +++ b/pyrasterframes/python/coverage-report.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash -e + +# If `coverage` tool isn't installed: `{pip|conda} install coverage` + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" + +cd "$( dirname "${BASH_SOURCE[0]}" )" + +coverage run setup.py test && coverage html --omit='.eggs/*,setup.py' && open htmlcov/index.html \ No newline at end of file diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index d23213a2a..9bf10af38 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -71,9 +71,9 @@ def _(value, cols, rows, cellType): def _create_tileZeros(): """ Create a function mapping to the Scala implementation.""" def _(cols, rows, cellType = 'float64'): - jfcn = RFContext.active().lookup('rf_tile_zeros') + jfcn = RFContext.active().lookup('rf_make_zeros_tile') return Column(jfcn(cols, rows, cellType)) - _.__name__ = 'rf_tile_zeros' + _.__name__ = 'rf_make_zeros_tile' _.__doc__ = "Create column of constant tiles of zero" _.__module__ = THIS_MODULE return _ @@ -82,7 +82,7 @@ def _(cols, rows, cellType = 'float64'): def _create_tileOnes(): """ Create a function mapping to the Scala implementation.""" def _(cols, rows, cellType = 'float64'): - jfcn = RFContext.active().lookup('rf_tile_ones') + jfcn = RFContext.active().lookup('rf_make_ones_tile') return Column(jfcn(cols, rows, cellType)) _.__name__ = 'rf_tile_ones' _.__doc__ = "Create column of constant tiles of one" @@ -162,8 +162,8 @@ def _(data_tile, mask_tile, mask_value): 'rf_mask_by_value': _create_maskByValue(), 'rf_rasterize': _create_rasterize(), 'rf_reproject_geometry': _create_reproject_geometry(), - 'rf_tile_ones': _create_tileOnes(), - 'rf_tile_zeros': _create_tileZeros(), + 'rf_make_ones_tile': _create_tileOnes(), + 'rf_make_zeros_tile': _create_tileZeros(), } @@ -195,9 +195,6 @@ def _(data_tile, mask_tile, mask_value): _rf_column_functions = { # ------- RasterFrames functions ------- 'rf_tile_dimensions': 'Query the number of (cols, rows) in a Tile.', - 'envelope': 'Extracts the bounding box (envelope) of the geometry.', - 'tile_to_int_array': 'Flattens Tile into an array of integers. Deprecated in favor of `rf_tile_to_array_int`.', - 'tile_to_double_array': 'Flattens Tile into an array of doubles. Deprecated in favor of `rf_tile_to_array_double`', 'rf_tile_to_array_int': 'Flattens Tile into an array of integers.', 'rf_tile_to_array_double': 'Flattens Tile into an array of doubles.', 'rf_cell_type': 'Extract the Tile\'s cell type', @@ -221,7 +218,6 @@ def _(data_tile, mask_tile, mask_value): 'rf_local_multiply': 'Multiply two Tiles', 'rf_local_divide': 'Divide two Tiles', 'rf_normalized_difference': 'Compute the normalized difference of two tiles', - 'local_agg_stats': 'Compute cell-local aggregate descriptive statistics for a column of Tiles.', 'rf_agg_local_max': 'Compute the cell-wise/local max operation between Tiles in a column.', 'rf_agg_local_min': 'Compute the cellwise/local min operation between Tiles in a column.', 'rf_agg_local_mean': 'Compute the cellwise/local mean operation between Tiles in a column.', diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 2dbeb566f..feaab8cd6 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -69,6 +69,11 @@ def test_identify_columns(self): self.assertIsNone(col, '`temporalKeyColumn` should be `None`') print("Temporal key column: ", col) + def test_tile_creation(self): + base = self.spark.createDataFrame([1, 2, 3, 4], 'integer') + tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), rf_make_ones_tile(3, 3, "int32")) + tiles.show() + self.assertEqual(tiles.count(), 4) def test_tile_operations(self): df1 = self.rf.withColumnRenamed(self.tileCol, 't1').asRF() From 7e6b33e81670331604ad4aecf16025a6a84f9ee0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 25 Apr 2019 22:11:34 -0400 Subject: [PATCH 053/380] Updated reference.md to reflect function name changes. --- docs/src/main/tut/reference.md | 421 ++++++++++++++++----------------- 1 file changed, 204 insertions(+), 217 deletions(-) diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 860a750d8..208eef647 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -38,13 +38,13 @@ _SQL_: `rf_reproject_geometry` Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. -#### envelope +#### rf_extent _Python_: - Struct[Double minX, Double maxX, Double minY, Double maxY] envelope(Geometry geom) + Struct[Double xmin, Double xmax, Double ymin, Double ymax] envelope(Geometry geom) -Python only. Extracts the bounding box (envelope) of the geometry. +Extracts the bounding box (extent/envelope) of the geometry. See also GeoMesa [st_envelope](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#st-envelope) which returns a Geometry type. @@ -52,12 +52,12 @@ See also GeoMesa [st_envelope](https://www.geomesa.org/documentation/user/spark/ Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and nodata](reference.md#masking-and-nodata) for additional discussion of cell types. -#### cell_types +#### rf_cell_types _Python_: - Array[String] cell_types() + Array[String] rf_cell_types() _SQL_: `rf_cell_types` @@ -82,43 +82,43 @@ Print an array of possible cell type names, as below. These names are used in ot |float64 | -#### tile_dimensions +#### rf_tile_dimensions _Python_: - Struct[Int, Int] tile_dimensions(Tile tile) + Struct[Int, Int] rf_tile_dimensions(Tile tile) _SQL_: `rf_tile_dimensions` Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. -#### cell_type +#### rf_cell_type _Python_: - Struct[String] cell_type(Tile tile) + Struct[String] rf_cell_type(Tile tile) _SQL_: `rf_cell_type` -Get the cell type of the `tile`. Available cell types can be retrieved with the @ref:[cell_types](reference.md#cell-types) function. +Get the cell type of the `tile`. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf_cell-types) function. -#### convert_cell_type +#### rf_convert_cell_type _Python_: - Tile convert_cell_type(Tile tileCol, String cellType) + Tile rf_convert_cell_type(Tile tileCol, String cellType) _SQL_: `rf_convert_cell_type` Convert `tileCol` to a different cell type. -#### resample +#### rf_resample _Python_: - Tile resample(Tile tile, Double factor) - Tile resample(Tile tile, Int factor) - Tile resample(Tile tile, Tile shape_tile) + Tile rf_resample(Tile tile, Double factor) + Tile rf_resample(Tile tile, Int factor) + Tile rf_resample(Tile tile, Tile shape_tile) _SQL_: `rf_resample` @@ -128,46 +128,46 @@ Change the tile dimension. Passing a numeric `factor` will scale the number of c Functions to create a new Tile column, either from scratch or from existing data not yet in a `tile`. -#### tile_zeros +#### rf_make_zeros_tile _Python_: ``` -Tile tile_zeros(Int tile_columns, Int tile_rows, String cell_type_name) +Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, String cell_type_name) ``` -_SQL_: `rf_tile_zeros` +_SQL_: `rf_make_zeros_tile` -Create a `tile` of shape `tile_columns` by `tile_rows` full of zeros, with the specified cell type. See function @ref:[`cell_types`](reference.md#cell-types) for valid values. All arguments are literal values and not column expressions. +Create a `tile` of shape `tile_columns` by `tile_rows` full of zeros, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. -#### tile_ones +#### rf_make_ones_tile _Python_: ``` -Tile tile_ones(Int tile_columns, Int tile_rows, String cell_type_name) +Tile rf_make_ones_tile(Int tile_columns, Int tile_rows, String cell_type_name) ``` -_SQL_: `rf_tile_ones` +_SQL_: `rf_make_ones_tile` -Create a `tile` of shape `tile_columns` by `tile_rows` full of ones, with the specified cell type. See function @ref:[`cell_types`](reference.md#cell-types) for valid values. All arguments are literal values and not column expressions. +Create a `tile` of shape `tile_columns` by `tile_rows` full of ones, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. -#### make_constant_tile +#### rf_make_constant_tile _Python_: - Tile make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, String cell_type_name) + Tile rf_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, String cell_type_name) _SQL_: `rf_make_constant_tile` -Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with the specified cell type. See function @ref:[`cell_types`](reference.md#cell-types) for valid values. All arguments are literal values and not column expressions. +Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. -#### rasterize +#### rf_rasterize _Python_: - Tile rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows) + Tile rf_rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows) _SQL_: `rf_rasterize` @@ -205,27 +205,27 @@ FROM ``` -#### array_to_tile +#### rf_array_to_tile _Python_: - Tile array_to_tile(Array arrayCol, Int numCols, Int numRows) + Tile rf_array_to_tile(Array arrayCol, Int numCols, Int numRows) Python only. Create a `tile` from a Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), filling values in row-major order. -#### assemble_tile +#### rf_assemble_tile _Python_: - Tile assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, String cellType) + Tile rf_assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, String cellType) -Python only. Create a Tile from a column of cell data with location indices. This function is the inverse of @ref:[`explode_tiles`](reference.md#explode-tiles). Intended use is with a `groupby`, producing one row with a new `tile` per group. The `numCols`, `numRows` and `cellType` arguments are literal values, others are column expressions. Valid values for `cellType` can be found with function @ref:[`cell_types`](reference.md#cell-types). +Python only. Create a Tile from a column of cell data with location indices. This function is the inverse of @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles). Intended use is with a `groupby`, producing one row with a new `tile` per group. The `numCols`, `numRows` and `cellType` arguments are literal values, others are column expressions. Valid values for `cellType` can be found with function @ref:[`rf_cell_types`](reference.md#rf-cell-types). ### Masking and Nodata In raster operations, the preservation and correct processing of missing operations is very important. The idea of missing data is often expressed as a null or NaN. In raster data, missing observations are often termed NODATA; we will style them as nodata in this document. RasterFrames provides a variety of functions to manage and inspect nodata within `tile`s. -See also statistical summaries to get the count of data and nodata values per `tile` and aggregate in a `tile` column: @ref:[`data_cells`](reference.md#data-cells), @ref:[`no_data_cells`](reference.md#no-data-cells), @ref:[`agg_data_cells`](reference.md#agg-data-cells), @ref:[`agg_no_data_cells`](reference.md#agg-no-data-cells). +See also statistical summaries to get the count of data and nodata values per `tile` and aggregate in a `tile` column: @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). It is important to note that not all cell types support the nodata representation: these are `bool` and when the cell type string ends in `raw`. @@ -235,11 +235,11 @@ For float cell types, the nodata can either be NaN or a user-defined value; for For more reading about cell types and ndodata, see the [GeoTrellis documentation](https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html?#working-with-cell-values). -#### mask +#### rf_mask _Python_: - Tile mask(Tile tile, Tile mask) + Tile rf_mask(Tile tile, Tile mask) _SQL_: `rf_mask` @@ -248,42 +248,42 @@ Where the `mask` contains nodata, replace values in the `tile` with nodata. Returned `tile` cell type will be coerced to one supporting nodata if it does not already. -#### inverse_mask +#### rf_inverse_mask _Python_: - Tile inverse_mask(Tile tile, Tile mask) + Tile rf_inverse_mask(Tile tile, Tile mask) _SQL_: `rf_inverse_mask` Where the `mask` _does not_ contain nodata, replace values in `tile` with nodata. -#### mask_by_value +#### rf_mask_by_value _Python_: - Tile mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value) + Tile rf_mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value) _SQL_: `rf_mask_by_value` Generate a `tile` with the values from `data_tile`, with nodata in cells where the `mask_tile` is equal to `mask_value`. -#### is_no_data_tile +#### rf_is_no_data_tile _Python_: - Boolean is_no_data_tile(tile) + Boolean rf_is_no_data_tile(Tile) _SQL_: `rf_is_no_data_tile` Returns true if `tile` contains only nodata. By definition returns false if cell type does not support nodata. -#### with_no_data +#### rf_with_no_data _Python_: - Tile with_no_data(Tile tile, Double no_data_value) + Tile rf_with_no_data(Tile tile, Double no_data_value) Python only. Return a `tile` column marking as nodata all cells equal to `no_data_value`. @@ -297,257 +297,236 @@ If input `tile` had a nodata value already, the behaviour depends on if its cell Some of these functions have similar variations in the Python API: - - `local_op`: applies `op` to two columns; the right hand side can be a `tile` or a numeric column. - - `local_op_scalar`: applies `op` to a `tile` and a literal scalar, coercing the `tile` to a floating point type + - `rf_local_op`: applies `op` to two columns; the right hand side can be a `tile` or a numeric column. + - `rf_local_op_double`: applies `op` to a `tile` and a literal scalar, coercing the `tile` to a floating point type - `local_op_scalar_int`: applies `op` to a `tile` and a literal scalar, without coercing the `tile` to a floating point type -We will provide all these variations for `local_add` and then suppress the rest in this document. +We will provide all these variations for `rf_local_add` and then suppress the rest in this document. -The SQL API does not require the `local_op_scalar` or `local_op_scalar_int` forms. +The SQL API does not require the `rf_local_op_double` or `rf_local_op_scalar_int` forms. -#### local_add +#### rf_local_add _Python_: - Tile local_add(Tile tile1, Tile rhs) - Tile local_add(Tile tile1, Int rhs) - Tile local_add(Tile tile1, Double rhs) + Tile rf_local_add(Tile tile1, Tile rhs) + Tile rf_local_add_int(Tile tile1, Int rhs) + Tile rf_local_add_double(Tile tile1, Double rhs) _SQL_: `rf_local_add` Returns a `tile` column containing the element-wise sum of `tile1` and `rhs`. -#### local_add_scalar - -_Python_: - - Tile local_add_scalar(Tile tile, Double scalar) - -_SQL_: `rf_local_add_scalar` - -Returns a `tile` column containing the element-wise sum of `tile` and `scalar`. If `tile` is integral type, it will be coerced to floating before addition; returns float valued `tile`. - - -#### local_add_scalar_int - -_Python_: - - Tile local_add_scalar_int(Tile tile, Int scalar) - -_SQL_: `rf_local_add_scalar_int` - -Returns a `tile` column containing the element-wise sum of `tile` and `scalar`. If `tile` is integral type, returns integral type `tile`. - -#### local_subtract +#### rf_local_subtract _Python_: - Tile local_subtract(Tile tile1, Tile rhs) - Tile local_subtract(Tile tile1, Int rhs) - Tile local_subtract(Tile tile1, Double rhs) + Tile rf_local_subtract(Tile tile1, Tile rhs) + Tile rf_local_subtract_int(Tile tile1, Int rhs) + Tile rf_local_subtract_double(Tile tile1, Double rhs) _SQL_: `rf_local_subtract` Returns a `tile` column containing the element-wise difference of `tile1` and `rhs`. -#### local_multiply +#### rf_local_multiply _Python_: - Tile local_multiply(Tile tile1, Tile rhs) - Tile local_multiply(Tile tile1, Int rhs) - Tile local_multiply(Tile tile1, Double rhs) + Tile rf_local_multiply(Tile tile1, Tile rhs) + Tile rf_local_multiply_int(Tile tile1, Int rhs) + Tile rf_local_multiply_double(Tile tile1, Double rhs) _SQL_: `rf_local_multiply` Returns a `tile` column containing the element-wise product of `tile1` and `rhs`. This is **not** the matrix multiplication of `tile1` and `rhs`. -#### local_divide +#### rf_local_divide _Python_: - Tile local_divide(Tile tile1, Tile rhs) - Tile local_divide(Tile tile1, Int rhs) - Tile local_divide(Tile tile1, Double rhs) + Tile rf_local_divide(Tile tile1, Tile rhs) + Tile rf_local_divide_int(Tile tile1, Int rhs) + Tile rf_local_divide_double(Tile tile1, Double rhs) _SQL_: `rf_local_divide` Returns a `tile` column containing the element-wise quotient of `tile1` and `rhs`. -#### normalized_difference +#### rf_normalized_difference _Python_: - Tile normalized_difference(Tile tile1, Tile tile2) + Tile rf_normalized_difference(Tile tile1, Tile tile2) _SQL_: `rf_normalized_difference` Compute the normalized difference of the the two `tile`s: `(tile1 - tile2) / (tile1 + tile2)`. Result is always floating point cell type. This function has no scalar variant. -#### local_less +#### rf_local_less _Python_: - Tile local_less(Tile tile1, Tile rhs) - Tile local_less(Tile tile1, Int rhs) - Tile local_less(Tile tile1, Double rhs) + Tile rf_local_less(Tile tile1, Tile rhs) + Tile rf_local_less_int(Tile tile1, Int rhs) + Tile rf_local_less_double(Tile tile1, Double rhs) -_SQL_: `rf_less` +_SQL_: `rf_local_less` Returns a `tile` column containing the element-wise evaluation of `tile1` is less than `rhs`. -#### local_less_equal +#### rf_local_less_equal _Python_: - Tile local_less_equal(Tile tile1, Tile rhs) - Tile local_less_equal(Tile tile1, Int rhs) - Tile local_less_equal(Tile tile1, Double rhs) + Tile rf_local_less_equal(Tile tile1, Tile rhs) + Tile rf_local_less_equal_int(Tile tile1, Int rhs) + Tile rf_local_less_equal_double(Tile tile1, Double rhs) -_SQL_: `rf_less_equal` +_SQL_: `rf_local_less_equal` Returns a `tile` column containing the element-wise evaluation of `tile1` is less than or equal to `rhs`. -#### local_greater +#### rf_local_greater _Python_: - Tile local_greater(Tile tile1, Tile rhs) - Tile local_greater(Tile tile1, Int rhs) - Tile local_greater(Tile tile1, Double rhs) + Tile rf_local_greater(Tile tile1, Tile rhs) + Tile rf_local_greater_int(Tile tile1, Int rhs) + Tile rf_local_greater_double(Tile tile1, Double rhs) -_SQL_: `rf_greater` +_SQL_: `rf_local_greater` Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than `rhs`. -#### local_greater_equal +#### rf_local_greater_equal _Python_: - Tile local_greater_equal(Tile tile1, Tile rhs) - Tile local_greater_equal(Tile tile1, Int rhs) - Tile local_greater_equal(Tile tile1, Double rhs) + Tile rf_local_greater_equal(Tile tile1, Tile rhs) + Tile rf_local_greater_equal_int(Tile tile1, Int rhs) + Tile rf_local_greater_equal_double(Tile tile1, Double rhs) -_SQL_: `rf_greater_equal` +_SQL_: `rf_local_greater_equal` Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than or equal to `rhs`. -#### local_equal +#### rf_local_equal _Python_: - Tile local_equal(Tile tile1, Tile rhs) - Tile local_equal(Tile tile1, Int rhs) - Tile local_equal(Tile tile1, Double rhs) + Tile rf_local_equal(Tile tile1, Tile rhs) + Tile rf_local_equal_int(Tile tile1, Int rhs) + Tile rf_local_equal_double(Tile tile1, Double rhs) -_SQL_: `rf_equal` +_SQL_: `rf_local_equal` Returns a `tile` column containing the element-wise equality of `tile1` and `rhs`. -#### local_unequal +#### rf_local_unequal _Python_: - Tile local_unequal(Tile tile1, Tile rhs) - Tile local_unequal(Tile tile1, Int rhs) - Tile local_unequal(Tile tile1, Double rhs) + Tile rf_local_unequal(Tile tile1, Tile rhs) + Tile rf_local_unequal_int(Tile tile1, Int rhs) + Tile rf_local_unequal_double(Tile tile1, Double rhs) -_SQL_: `rf_unequal` +_SQL_: `rf_local_unequal` Returns a `tile` column containing the element-wise inequality of `tile1` and `rhs`. -#### round +#### rf_round _Python_: - Tile round(Tile tile) + Tile rf_round(Tile tile) _SQL_: `rf_round` Round cell values to the nearest integer without changing the cell type. -#### exp +#### rf_exp _Python_: - Tile exp(Tile tile) + Tile rf_exp(Tile tile) _SQL_: `rf_exp` Performs cell-wise exponential. -#### exp10 +#### rf_exp10 _Python_: - Tile exp10(Tile tile) + Tile rf_exp10(Tile tile) _SQL_: `rf_exp10` Compute 10 to the power of cell values. -#### exp2 +#### rf_exp2 _Python_: - Tile exp2(Tile tile) + Tile rf_exp2(Tile tile) _SQL_: `rf_exp2` Compute 2 to the power of cell values. -#### expm1 +#### rf_expm1 _Python_: - Tile expm1(Tile tile) + Tile rf_expm1(Tile tile) _SQL_: `rf_expm1` Performs cell-wise exponential, then subtract one. Inverse of @ref:[`log1p`](reference.md#log1p). -#### log +#### rf_log _Python_: - Tile log(Tile tile) + Tile rf_log(Tile tile) _SQL_: `rf_log` Performs cell-wise natural logarithm. -#### log10 +#### rf_log10 _Python_: - Tile log10(Tile tile) + Tile rf_log10(Tile tile) _SQL_: `rf_log10` Performs cell-wise logarithm with base 10. -#### log2 +#### rf_log2 _Python_: - Tile log2(Tile tile) + Tile rf_log2(Tile tile) _SQL_: `rf_log2` Performs cell-wise logarithm with base 2. -#### log1p +#### rf_log1p _Python_: - Tile log1p(Tile tile) + Tile rf_log1p(Tile tile) _SQL_: `rf_log1p` -Performs natural logarithm of cell values plus one. Inverse of @ref:[`expm1`](reference.md#expm1). +Performs natural logarithm of cell values plus one. Inverse of @ref:[`rf_expm1`](reference.md#rf-expm1). ### Tile Statistics @@ -559,11 +538,11 @@ spark.sql(""" SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION SELECT 2 as id, rf_local_multiply(rf_tile_ones(5, 5, 'float32'), 3) as t - """).select(F.col('id'), tile_sum(F.col('t'))).show() + """).select(F.col('id'), rf_tile_sum(F.col('t'))).show() +---+-----------+ -| id|tile_sum(t)| +| id|rf_tile_sum(t)| +---+-----------+ | 2| 75.0| | 1| 25.0| @@ -571,89 +550,89 @@ spark.sql(""" ``` -#### tile_sum +#### rf_tile_sum _Python_: - Double tile_sum(Tile tile) + Double rf_tile_sum(Tile tile) _SQL_: `rf_tile_sum` Computes the sum of cells in each row of column `tile`, ignoring nodata values. -#### tile_mean +#### rf_tile_mean _Python_: - Double tile_mean(Tile tile) + Double rf_tile_mean(Tile tile) _SQL_: `rf_tile_mean` Computes the mean of cells in each row of column `tile`, ignoring nodata values. -#### tile_min +#### rf_tile_min _Python_: - Double tile_min(Tile tile) + Double rf_tile_min(Tile tile) _SQL_: `rf_tile_min` Computes the min of cells in each row of column `tile`, ignoring nodata values. -#### tile_max +#### rf_tile_max _Python_: - Double tile_max(Tile tile) + Double rf_tile_max(Tile tile) _SQL_: `rf_tile_max` Computes the max of cells in each row of column `tile`, ignoring nodata values. -#### no_data_cells +#### rf_no_data_cells _Python_: - Long no_data_cells(Tile tile) + Long rf_no_data_cells(Tile tile) _SQL_: `rf_no_data_cells` Return the count of nodata cells in the `tile`. -#### data_cells +#### rf_data_cells _Python_: - Long data_cells(Tile tile) + Long rf_data_cells(Tile tile) _SQL_: `rf_data_cells` Return the count of data cells in the `tile`. -#### tile_stats +#### rf_tile_stats _Python_: - Struct[Long, Long, Double, Double, Double, Double] tile_stats(Tile tile) + Struct[Long, Long, Double, Double, Double, Double] rf_tile_stats(Tile tile) -_SQL_: `tile_stats` +_SQL_: `rf_tile_stats` Computes the following statistics of cells in each row of column `tile`: data cell count, nodata cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring nodata values. -#### tile_histogram +#### rf_tile_histogram _Python_: - Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] tile_histogram(Tile tile) + Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_tile_histogram(Tile tile) -_SQL_: `rf_tile_histogram` +_SQL_: `rf_rf_tile_histogram` -Computes a statistical summary of cell values within each row of `tile`. Resulting column has the below schema. Note that several of the other `tile` statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`agg_approx_histogram`](reference.md#agg-approx-histogram) which computes the statistics across all rows in a group. +Computes a statistical summary of cell values within each row of `tile`. Resulting column has the below schema. Note that several of the other `tile` statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) which computes the statistics across all rows in a group. ``` |-- tile_histogram: struct (nullable = true) @@ -677,8 +656,8 @@ These functions compute statistical summaries over all of the cell values *and* ```python from pyspark.functions import month -from pyrasterframes.functions import agg_mean -rf.groupby(month(rf.datetime)).agg(agg_mean(rf.red_band).alias('red_mean_monthly')) +from pyrasterframes.functions import rf_agg_mean +rf.groupby(month(rf.datetime)).agg(rf_agg_mean(rf.red_band).alias('red_mean_monthly')) ``` Continuing our example from the @ref:[Tile Statistics](reference.md#tile-statistics) section, consider the following. Note that only a single row is returned. It is averaging 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. @@ -688,73 +667,73 @@ spark.sql(""" SELECT 1 as id, rf_tile_ones(5, 5, 'float32') as t UNION SELECT 2 as id, rf_local_multiply_scalar(rf_tile_ones(5, 5, 'float32'), 3) as t -""").agg(agg_mean(F.col('t'))).show(10, False) +""").agg(rf_agg_mean(F.col('t'))).show(10, False) -+-----------+ -|agg_mean(t)| -+-----------+ -|2.0 | -+-----------+ ++--------------+ +|rf_agg_mean(t)| ++--------------+ +|2.0 | ++--------------+ ``` -#### agg_mean +#### rf_agg_mean _Python_: - Double agg_mean(Tile tile) + Double rf_agg_mean(Tile tile) -_SQL_: @ref:[`rf_agg_stats`](reference.md#agg-stats)`(tile).mean` +_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).mean` -Aggregates over the `tile` and return the mean of cell values, ignoring nodata. Equivalent to @ref:[`agg_stats`](reference.md#agg-stats)`.mean`. +Aggregates over the `tile` and return the mean of cell values, ignoring nodata. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.mean`. -#### agg_data_cells +#### rf_agg_data_cells _Python_: - Long agg_data_cells(Tile tile) + Long rf_agg_data_cells(Tile tile) -_SQL_: @ref:[`rf_agg_stats`](reference.md#agg-stats)`(tile).dataCells` +_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` -Aggregates over the `tile` and return the count of data cells. Equivalent to @ref:[`agg_stats`](reference.md#agg-stats)`.dataCells`. C.F. `data_cells`; equivalent code: +Aggregates over the `tile` and return the count of data cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.dataCells`. C.F. `data_cells`; equivalent code: ```python -rf.select(agg_data_cells(rf.tile).alias('agg_data_cell')).show() +rf.select(rf_agg_data_cells(rf.tile).alias('agg_data_cell')).show() # Equivalent to -rf.agg(F.sum(data_cells(rf.tile)).alias('agg_data_cell')).show() +rf.agg(F.sum(rf_data_cells(rf.tile)).alias('agg_data_cell')).show() ``` -#### agg_no_data_cells +#### rf_agg_no_data_cells _Python_: - Long agg_no_data_cells(Tile tile) + Long rf_agg_no_data_cells(Tile tile) -_SQL_: @ref:[`rf_agg_stats`](reference.md#agg-stats)`(tile).noDataCells` +_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).noDataCells` -Aggregates over the `tile` and return the count of nodata cells. Equivalent to @ref:[`agg_stats`](reference.md#agg-stats)`.noDataCells`. C.F. @ref:[`no_data_cells`](reference.md#no-data-cells) a row-wise count of no data cells. +Aggregates over the `tile` and return the count of nodata cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.noDataCells`. C.F. @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells) a row-wise count of no data cells. -#### agg_stats +#### rf_agg_stats _Python_: - Struct[Long, Long, Double, Double, Double, Double] agg_stats(Tile tile) + Struct[Long, Long, Double, Double, Double, Double] rf_agg_stats(Tile tile) _SQL_: `rf_agg_stats` Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of nodata cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of nodata. -#### agg_approx_histogram +#### rf_agg_approx_histogram _Python_: - Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] agg_approx_histogram(Tile tile) + Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_agg_approx_histogram(Tile tile) _SQL_: `rf_agg_approx_histogram` Aggregates over the `tile` return statistical summaries of the cell values, including a histogram, in the below schema. The `bins` array is of tuples of histogram values and counts. Typically values are plotted on the x-axis and counts on the y-axis. -Note that several of the other cell value statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`tile_histogram`](reference.md#tile-histogram) function which operates on a single row at a time. +Note that several of the other cell value statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function which operates on a single row at a time. ``` |-- agg_approx_histogram: struct (nullable = true) @@ -775,7 +754,7 @@ Note that several of the other cell value statistics functions are convenience m Local statistics compute the element-wise statistics across a DataFrame or group of `tile`s, resulting in a `tile` that has the same dimension. -Consider again our example for Tile Statistics and Aggregate Tile Statistics, this time apply @ref:[`agg_local_mean`](reference.md#agg-local-mean). We see that it is computing the element-wise mean across the two rows. In this case it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. +Consider again our example for Tile Statistics and Aggregate Tile Statistics, this time apply @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean). We see that it is computing the element-wise mean across the two rows. In this case it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. ```python @@ -784,10 +763,10 @@ lam = spark.sql(""" SELECT 1 as id, rf_tile_ones(5, 5, 'float32') as t UNION SELECT 2 as id, rf_local_multiply(rf_tile_ones(5, 5, 'float32'), 3) as t -""").agg(local_agg_mean(F.col('t')).alias('l')) \ +""").agg(rf_local_agg_mean(F.col('t')).alias('l')) \ ## local_agg_mean returns a tile -lam.select(tile_dimensions(lam.l)).show() +lam.select(rf_tile_dimensions(lam.l)).show() ## +------------------+ |tile_dimensions(l)| @@ -796,7 +775,7 @@ lam.select(tile_dimensions(lam.l)).show() +------------------+ ## -lam.select(explode_tiles(lam.l)).show(10, False) +lam.select(rf_explode_tiles(lam.l)).show(10, False) ## +------------+---------+---+ |column_index|row_index|l | @@ -816,61 +795,61 @@ only showing top 10 rows ``` -#### agg_local_max +#### rf_agg_local_max _Python_: - Tile agg_local_max(Tile tile) + Tile rf_agg_local_max(Tile tile) _SQL_: `rf_agg_local_max` Compute the cell-local maximum operation over Tiles in a column. -#### agg_local_min +#### rf_agg_local_min _Python_: - Tile agg_local_min(Tile tile) + Tile rf_agg_local_min(Tile tile) _SQL_: `rf_agg_local_min` Compute the cell-local minimum operation over Tiles in a column. -#### agg_local_mean +#### rf_agg_local_mean _Python_: - Tile agg_local_mean(Tile tile) + Tile rf_agg_local_mean(Tile tile) _SQL_: `rf_agg_local_mean` Compute the cell-local mean operation over Tiles in a column. -#### agg_local_data_cells +#### rf_agg_local_data_cells _Python_: - Tile agg_local_data_cells(Tile tile) + Tile rf_agg_local_data_cells(Tile tile) _SQL_: `rf_agg_local_data_cells` Compute the cell-local count of data cells over Tiles in a column. Returned `tile` has a cell type of `int32`. -#### agg_local_no_data_cells +#### rf_agg_local_no_data_cells _Python_: - Tile agg_local_no_data_cells(Tile tile) + Tile rf_agg_local_no_data_cells(Tile tile) _SQL_: `rf_agg_local_no_data_cells` Compute the cell-local count of nodata cells over Tiles in a column. Returned `tile` has a cell type of `int32`. -#### agg_local_stats +#### rf_agg_local_stats _Python_: - Struct[Tile, Tile, Tile, Tile, Tile] agg_local_stats(Tile tile) + Struct[Tile, Tile, Tile, Tile, Tile] rf_agg_local_stats(Tile tile) _SQL_: `rf_agg_local_stats` @@ -881,65 +860,73 @@ Compute cell-local aggregate count, minimum, maximum, mean, and variance for a c RasterFrames provides several ways to convert a `tile` into other data structures. See also functions for @ref:[creating tiles](reference.md#tile-creation). -#### explode_tiles +#### rf_xplode_tiles _Python_: - Int, Int, Numeric* explode_tiles(Tile* tile) + Int, Int, Numeric* rf_explode_tiles(Tile* tile) _SQL_: `rf_explode_tiles` -Create a row for each cell in `tile` columns. Many `tile` columns can be passed in, and the returned DataFrame will have one numeric column per input. There will also be columns for `column_index` and `row_index`. Inverse of @ref:[`assemble_tile`](reference.md#assemble-tile). When using this function, be sure to have a unique identifier for rows in order to successfully invert the operation. +Create a row for each cell in `tile` columns. Many `tile` columns can be passed in, and the returned DataFrame will have one numeric column per input. There will also be columns for `column_index` and `row_index`. Inverse of @ref:[`rf_assemble_tile`](reference.md#rf-assemble-tile). When using this function, be sure to have a unique identifier for rows in order to successfully invert the operation. -#### explode_tiles_sample +#### rf_explode_tiles_sample _Python_: - Int, Int, Numeric* explode_tiles_sample(Double sample_frac, Long seed, Tile* tile) + Int, Int, Numeric* rf_explode_tiles_sample(Double sample_frac, Long seed, Tile* tile) -Python only. As with @ref:[`explode_tiles`](reference.md#explode-tiles), but taking a randomly sampled subset of cells. Equivalent to the below, but this implementation is optimized for speed. Parameter `sample_frac` should be between 0.0 and 1.0. +Python only. As with @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles), but taking a randomly sampled subset of cells. Equivalent to the below, but this implementation is optimized for speed. Parameter `sample_frac` should be between 0.0 and 1.0. ```python -df.select(df.id, explode_tiles(df.tile1, df.tile2, df.tile3)) \ +df.select(df.id, rf_explode_tiles(df.tile1, df.tile2, df.tile3)) \ .sample(False, 0.05, 8675309) # Equivalent result, faster -df.select(df.id, explode_tiles_sample(0.05, 8675309, df.tile1, df.tile2, df.tile3)) \ +df.select(df.id, rf_explode_tiles_sample(0.05, 8675309, df.tile1, df.tile2, df.tile3)) \ ``` -#### tile_to_int_array +#### rf_tile_to_array_int _Python_: - Array tile_to_int_array(Tile tile) + Array rf_tile_to_array_int(Tile tile) -_SQL_: `rf_tile_to_int_array` +_SQL_: `rf_tile_to_array_int` Convert Tile column to Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Float cell types will be coerced to integral type by flooring. -#### tile_to_double_array +#### rf_tile_to_array_double _Python_: - Array tile_to_double_arry(Tile tile) + Array rf_tile_to_arry_double(Tile tile) -_SQL_: `rf_tile_to_double_array` +_SQL_: `rf_tile_to_array_double` Convert tile column to Spark [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Integral cell types will be coerced to floats. -#### render_ascii +#### rf_ender_ascii _Python_: - String render_ascii(Tile tile) + String rf_render_ascii(Tile tile) _SQL_: `rf_render_ascii` Pretty print the tile values as plain text. +#### rf_render_matrix + +_Python_: + + String rf_render_matrix(Tile tile) + +_SQL_: `rf_render_matrix` +Render Tile cell values as numeric values, for debugging purposes. [RasterFunctions]: org.locationtech.rasterframes.RasterFunctions [scaladoc]: latest/api/index.html From 1c2e71c0170ef65f6ec118050a5915792e8f581f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sun, 28 Apr 2019 10:31:37 -0400 Subject: [PATCH 054/380] Updates from code review. --- .../rasterframes/RasterFunctions.scala | 4 ++-- .../expressions/localops/Round.scala | 2 +- .../rasterframes/expressions/package.scala | 15 +++++++------- .../transformers/GeometryToExtent.scala | 2 +- .../util/ZeroSevenCompatibilityKit.scala | 4 ++-- .../rasterframes/RasterFunctionsSpec.scala | 20 +++++++++---------- .../rasterframes/TileAssemblerSpec.scala | 6 +++--- docs/src/main/tut/reference.md | 12 +++++------ .../python/pyrasterframes/rasterfunctions.py | 1 + 9 files changed, 33 insertions(+), 33 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 95adea29f..91686b3be 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -253,11 +253,11 @@ trait RasterFunctions { def rf_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = Mask.MaskByDefined(sourceTile, maskTile) - /** Where the rf_mask tile equals the rf_mask value, replace values in the source tile with NODATA */ + /** Where the `maskTile` equals `maskValue`, replace values in the source tile with `NoData` */ def rf_mask_by_value(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = Mask.MaskByValue(sourceTile, maskTile, maskValue) - /** Where the rf_mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ + /** Where the `maskTile` does **not** contain `NoData`, replace values in the source tile with `NoData` */ def rf_inverse_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = Mask.InverseMaskByDefined(sourceTile, maskTile) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala index 0ca22cb8f..92f1c2f89 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Round.scala @@ -32,7 +32,7 @@ import org.apache.spark.sql.{Column, TypedColumn} usage = "_FUNC_(tile) - Round cell values to the nearest integer without changing the cell type.", arguments = """ Arguments: - * tile - tile column to rf_round""", + * tile - tile column to round""", examples = """ Examples: > SELECT _FUNC_(tile); diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index d426af4fd..e4d48c9e9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -21,23 +21,22 @@ package org.locationtech.rasterframes -import org.locationtech.rasterframes.expressions.accessors._ -import org.locationtech.rasterframes.expressions.aggstats._ -import org.locationtech.rasterframes.expressions.generators._ -import org.locationtech.rasterframes.expressions.localops._ -import org.locationtech.rasterframes.expressions.tilestats._ -import org.locationtech.rasterframes.expressions.transformers._ import geotrellis.raster.{DoubleConstantNoDataCellType, Tile} -import org.apache.spark.sql.catalyst.{InternalRow, ScalaReflection} import org.apache.spark.sql.catalyst.analysis.FunctionRegistry import org.apache.spark.sql.catalyst.expressions.{Expression, ScalaUDF} +import org.apache.spark.sql.catalyst.{InternalRow, ScalaReflection} import org.apache.spark.sql.rf.VersionShims._ import org.apache.spark.sql.{SQLContext, rf} +import org.locationtech.rasterframes.expressions.accessors._ import org.locationtech.rasterframes.expressions.aggstats.CellCountAggregate.DataCells +import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.generators._ import org.locationtech.rasterframes.expressions.localops._ +import org.locationtech.rasterframes.expressions.tilestats._ +import org.locationtech.rasterframes.expressions.transformers._ -import scala.util.Try import scala.reflect.runtime.universe._ +import scala.util.Try /** * Module of Catalyst expressions for efficiently working with tiles. * diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala index cac726a8f..e9c259df4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala @@ -37,7 +37,7 @@ import org.apache.spark.sql.{Column, TypedColumn} * @since 8/24/18 */ case class GeometryToExtent(child: Expression) extends UnaryExpression with CodegenFallback { - override def nodeName: String = "geometry_bounds" + override def nodeName: String = "rf_extent" override def dataType: DataType = schemaOf[Extent] diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala index 083a58944..ecd122adb 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -246,12 +246,12 @@ object ZeroSevenCompatibilityKit { def tileOnes(cols: Int, rows: Int, cellType: String = "float64"): TypedColumn[Any, Tile] = udf(() => F.tileOnes(cols, rows, cellType)).apply().as(s"ones_$cellType").as[Tile] - /** Where the rf_mask tile equals the rf_mask value, replace values in the source tile with NODATA */ + /** Where the mask tile equals the mask value, replace values in the source tile with NODATA */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def maskByValue(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = delegate.rf_mask_by_value(sourceTile, maskTile, maskValue) - /** Where the rf_mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ + /** Where the mask tile DOES NOT contain NODATA, replace values in the source tile with NODATA */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def inverseMask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = delegate.rf_inverse_mask(sourceTile, maskTile) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index a72be9347..c89e66c26 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -485,17 +485,17 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_normalized_difference") } - it("should rf_mask one tile against another") { + it("should mask one tile against another") { val df = Seq[Tile](randTile).toDF("tile") - val withMask = df.withColumn("rf_mask", + val withMask = df.withColumn("mask", rf_convert_cell_type( rf_local_greater($"tile", 50), "uint8") ) val withMasked = withMask.withColumn("masked", - rf_mask($"tile", $"rf_mask")) + rf_mask($"tile", $"mask")) val result = withMasked.agg(rf_agg_no_data_cells($"tile") < rf_agg_no_data_cells($"masked")).as[Boolean] @@ -504,12 +504,12 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_mask") } - it("should inverse rf_mask one tile against another") { + it("should inverse mask one tile against another") { val df = Seq[Tile](randTile).toDF("tile") val baseND = df.select(rf_agg_no_data_cells($"tile")).first() - val withMask = df.withColumn("rf_mask", + val withMask = df.withColumn("mask", rf_convert_cell_type( rf_local_greater($"tile", 50), "uint8" @@ -517,8 +517,8 @@ class RasterFunctionsSpec extends FunSpec ) val withMasked = withMask - .withColumn("masked", rf_mask($"tile", $"rf_mask")) - .withColumn("inv_masked", rf_inverse_mask($"tile", $"rf_mask")) + .withColumn("masked", rf_mask($"tile", $"mask")) + .withColumn("inv_masked", rf_inverse_mask($"tile", $"mask")) val result = withMasked.agg(rf_agg_no_data_cells($"masked") + rf_agg_no_data_cells($"inv_masked")).as[Long] @@ -527,11 +527,11 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_inverse_mask") } - it("should rf_mask tile by another identified by specified value") { + it("should mask tile by another identified by specified value") { val df = Seq[Tile](randTile).toDF("tile") val mask_value = 4 - val withMask = df.withColumn("rf_mask", + val withMask = df.withColumn("mask", rf_local_multiply(rf_convert_cell_type( rf_local_greater($"tile", 50), "uint8"), @@ -540,7 +540,7 @@ class RasterFunctionsSpec extends FunSpec ) val withMasked = withMask.withColumn("masked", - rf_mask_by_value($"tile", $"rf_mask", lit(mask_value))) + rf_mask_by_value($"tile", $"mask", lit(mask_value))) val result = withMasked.agg(rf_agg_no_data_cells($"tile") < rf_agg_no_data_cells($"masked")).as[Boolean] diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index d484ff915..8fc11f878 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -65,14 +65,14 @@ class TileAssemblerSpec extends TestEnvironment { val sceneSize = (260, 257) val rs = InMemoryRasterSource(TestData.randomTile(sceneSize._1, sceneSize._2, ByteConstantNoDataCellType), Extent(10, 20, 30, 40), LatLng) val df = rs.toDF - val exploded = df.select($"spatial_index", $"extent", rf_tile_dimensions($"tile") as "rf_tile_dimensions", rf_explode_tiles($"tile")) + val exploded = df.select($"spatial_index", $"extent", rf_tile_dimensions($"tile") as "tile_dimensions", rf_explode_tiles($"tile")) val assembled = exploded - .groupBy($"spatial_index", $"extent", $"rf_tile_dimensions") + .groupBy($"spatial_index", $"extent", $"tile_dimensions") .agg( rf_convert_cell_type( rf_assemble_tile(COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, - $"tile", $"rf_tile_dimensions.cols", $"rf_tile_dimensions.rows"), rs.cellType) as "tile" + $"tile", $"tile_dimensions.cols", $"tile_dimensions.rows"), rs.cellType) as "tile" ) assert( diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 208eef647..1c44dbb3f 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -42,7 +42,7 @@ Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` _Python_: - Struct[Double xmin, Double xmax, Double ymin, Double ymax] envelope(Geometry geom) + Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(Geometry geom) Extracts the bounding box (extent/envelope) of the geometry. @@ -100,7 +100,7 @@ _Python_: _SQL_: `rf_cell_type` -Get the cell type of the `tile`. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf_cell-types) function. +Get the cell type of the `tile`. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. #### rf_convert_cell_type @@ -299,11 +299,11 @@ Some of these functions have similar variations in the Python API: - `rf_local_op`: applies `op` to two columns; the right hand side can be a `tile` or a numeric column. - `rf_local_op_double`: applies `op` to a `tile` and a literal scalar, coercing the `tile` to a floating point type - - `local_op_scalar_int`: applies `op` to a `tile` and a literal scalar, without coercing the `tile` to a floating point type + - `rf_local_op_int`: applies `op` to a `tile` and a literal scalar, without coercing the `tile` to a floating point type We will provide all these variations for `rf_local_add` and then suppress the rest in this document. -The SQL API does not require the `rf_local_op_double` or `rf_local_op_scalar_int` forms. +The SQL API does not require the `rf_local_op_double` or `rf_local_op_int` forms (just `rf_local_op`). #### rf_local_add @@ -860,7 +860,7 @@ Compute cell-local aggregate count, minimum, maximum, mean, and variance for a c RasterFrames provides several ways to convert a `tile` into other data structures. See also functions for @ref:[creating tiles](reference.md#tile-creation). -#### rf_xplode_tiles +#### rf_explode_tiles _Python_: @@ -908,7 +908,7 @@ _SQL_: `rf_tile_to_array_double` Convert tile column to Spark [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Integral cell types will be coerced to floats. -#### rf_ender_ascii +#### rf_render_ascii _Python_: diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 9bf10af38..01ff4c282 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -223,6 +223,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_agg_local_mean': 'Compute the cellwise/local mean operation between Tiles in a column.', 'rf_agg_local_data_cells': 'Compute the cellwise/local count of non-NoData cells for all Tiles in a column.', 'rf_agg_local_no_data_cells': 'Compute the cellwise/local count of NoData cells for all Tiles in a column.', + 'rf_agg_local_stats': 'Compute cell-local aggregate descriptive statistics for a column of Tiles.', 'rf_mask': 'Where the rf_mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.', 'rf_inverse_mask': 'Where the rf_mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.', 'rf_local_less': 'Cellwise less than comparison between two tiles', From 02d47a2963e6c8e552827aab2501296f5e37444b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 22 Apr 2019 21:15:23 -0400 Subject: [PATCH 055/380] Added ability to use a RasterSourceRelation against a table/view of paths. --- .../rastersource/RasterSourceDataSource.scala | 20 +++++++++++--- .../rastersource/RasterSourceRelation.scala | 26 +++++++++++++++++-- .../datasource/rastersource/package.scala | 6 +++++ .../RasterSourceDataSourceSpec.scala | 15 +++++++++++ 4 files changed, 62 insertions(+), 5 deletions(-) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index 41b1ef76f..d8723f25f 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -29,10 +29,13 @@ class RasterSourceDataSource extends DataSourceRegister with RelationProvider { import RasterSourceDataSource._ override def shortName(): String = SHORT_NAME override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { - val inexes = parameters.bandIndexes - val files = parameters.filePaths + val bands = parameters.bandIndexes val tiling = parameters.tileDims - RasterSourceRelation(sqlContext, files, inexes, tiling) + val pathTable = parameters.pathTable + val files = parameters.filePaths + require(!(pathTable.nonEmpty && files.nonEmpty), + "Only one of a set of file paths OR a paths table column may be provided.") + RasterSourceRelation(sqlContext, files, pathTable, bands, tiling) } } object RasterSourceDataSource { @@ -41,6 +44,11 @@ object RasterSourceDataSource { final val PATHS_PARAM = "paths" final val BAND_INDEXES_PARAM = "bandIndexes" final val TILE_DIMS_PARAM = "tileDimensions" + final val PATH_TABLE_PARAM = "pathTable" + final val PATH_TABLE_COL_PARAM = "pathTableColumn" + + /** Container for specifying where to select raster paths from. */ + case class PathColumn(tableName: String, columnName: String) private[rastersource] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { @@ -64,5 +72,11 @@ object RasterSourceDataSource { .get(BAND_INDEXES_PARAM) .map(_.split(',').map(_.trim.toInt).toSeq) .getOrElse(Seq(0)) + + def pathTable: Option[PathColumn] = parameters + .get(PATH_TABLE_PARAM) + .zip(parameters.get(PATH_TABLE_COL_PARAM)) + .map(p => PathColumn(p._1, p._2)) + .headOption } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index a063443dd..c4eaec291 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -21,6 +21,7 @@ package org.locationtech.rasterframes.datasource.rastersource +<<<<<<< HEAD:datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames import org.locationtech.rasterframes.encoders.CatalystSerializer._ @@ -32,6 +33,21 @@ import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{Row, SQLContext} import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.tiles.ProjectedRasterTile +======= +import astraea.spark.rasterframes._ +import astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource.PathColumn +import astraea.spark.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames +import astraea.spark.rasterframes.encoders.CatalystSerializer._ +import astraea.spark.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} +import astraea.spark.rasterframes.model.TileDimensions +import astraea.spark.rasterframes.tiles.ProjectedRasterTile +import astraea.spark.rasterframes.util._ +import org.apache.spark.rdd.RDD +import org.apache.spark.sql.sources.{BaseRelation, TableScan} +import org.apache.spark.sql.types.{StringType, StructField, StructType} +import org.apache.spark.sql.{DataFrame, Row, SQLContext} +import org.apache.spark.sql.functions.col +>>>>>>> Added ability to use a RasterSourceRelation against a table/view of paths.:datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala /** * Constructs a Spark Relation over one or more RasterSource paths. @@ -40,7 +56,7 @@ import org.locationtech.rasterframes.tiles.ProjectedRasterTile * @param bandIndexes band indexes to fetch * @param subtileDims how big to tile/subdivide rasters info */ -case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { +case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], pathTable: Option[PathColumn], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { override def schema: StructType = StructType(Seq( StructField(PATH_COLUMN.columnName, StringType, false) @@ -57,7 +73,13 @@ case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], band val refs = RasterSourceToRasterRefs(subtileDims, bandIndexes, URIToRasterSource($"path")) val refsToTiles = names.map(n => RasterRefToTile($"$n") as n) - val df = paths.toDF("path") + val pathsTable: DataFrame = pathTable match { + case Some(spec) => + sqlContext.table(spec.tableName).select(col(spec.columnName) as "path") + case _ => paths.toDF("path") + } + + val df = pathsTable .select(PATH_COLUMN, refs as names) .select(PATH_COLUMN +: refsToTiles: _*) df.rdd diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala index 69720d6d9..cddace678 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala @@ -50,6 +50,12 @@ package object rastersource { reader.option(RasterSourceDataSource.TILE_DIMS_PARAM, s"$cols,$rows") ) + def fromTable(tableName: String, columnName: String): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.option(RasterSourceDataSource.PATH_TABLE_PARAM, tableName) + .option(RasterSourceDataSource.PATH_TABLE_COL_PARAM, columnName) + ) + def from(newlineDelimPaths: String): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.option(RasterSourceDataSource.PATHS_PARAM, newlineDelimPaths) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 42765f6e6..bfb5c95dc 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -53,6 +53,11 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { val p = Map(TILE_DIMS_PARAM -> "4, 5") p.tileDims should be (Some(TileDimensions(4, 5))) } + + it("should parse path table specificatino") { + val p = Map(PATH_TABLE_PARAM -> "pathTable", PATH_TABLE_COL_PARAM -> "path") + p.pathTable should be (Some(PathColumn("pathTable", "path"))) + } } describe("RasterSource as relation reading") { @@ -108,6 +113,16 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.schema.size should be(2) } + it("should read a multiple files from a table") { + Seq(cogPath, l8samplePath, nonCogPath).toDF("path").createOrReplaceTempView("pathsTable") + val df = spark.read.rastersource + .fromTable("pathsTable", "path") + .withTileDimensions(128, 128) + .load() + df.select("path").distinct().count() should be(3) + df.schema.size should be(2) + } + it("should read a multiple files with heterogeneous bands") { val df = spark.read.rastersource .from(Seq(cogPath, l8samplePath, nonCogPath)) From 3a00ef572c506215dccd2ab8858c7565e21bd68e Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 23 Apr 2019 15:58:04 -0400 Subject: [PATCH 056/380] Switched to GDAL base image for CircleCI. --- .circleci/config.yml | 4 ++-- .../rasterframes/bench/RasterRefBench.scala | 9 ++++----- .../rasterframes/bench/package.scala | 2 +- .../rastersource/RasterSourceRelation.scala | 20 +++---------------- 4 files changed, 10 insertions(+), 25 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index fe3a6f3fc..787af5316 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,8 +5,8 @@ _defaults: &defaults environment: TERM: dumb docker: - - image: circleci/openjdk:8-jdk - + - image: s22s/rasterframes-circleci:latest + _setenv: &setenv name: set CloudRepo credentials command: |- diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala index a2a9104bf..dddabd09a 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala @@ -19,14 +19,13 @@ * */ -package astraea.spark.rasterframes.bench - +package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.expressions.transformers.RasterSourceToTiles -import astraea.spark.rasterframes.ref.RasterSource +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.transformers.RasterSourceToTiles +import org.locationtech.rasterframes.ref.RasterSource import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ import org.openjdk.jmh.annotations._ diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala index f047336e3..65d8ab88f 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/package.scala @@ -29,7 +29,7 @@ import geotrellis.raster.{ArrayTile, CellType, NODATA, Tile, isNoData} * @author sfitch * @since 10/4/17 */ -package object rasterframes { +package object bench { val rnd = new scala.util.Random(42) /** Construct a tile of given size and cell type populated with random values. */ diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index c4eaec291..efc4e663a 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -21,7 +21,6 @@ package org.locationtech.rasterframes.datasource.rastersource -<<<<<<< HEAD:datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames import org.locationtech.rasterframes.encoders.CatalystSerializer._ @@ -30,24 +29,11 @@ import org.locationtech.rasterframes.util._ import org.apache.spark.rdd.RDD import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} -import org.apache.spark.sql.{Row, SQLContext} +import org.apache.spark.sql.{DataFrame, Row, SQLContext} +import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.PathColumn import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.tiles.ProjectedRasterTile -======= -import astraea.spark.rasterframes._ -import astraea.spark.rasterframes.datasource.rastersource.RasterSourceDataSource.PathColumn -import astraea.spark.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames -import astraea.spark.rasterframes.encoders.CatalystSerializer._ -import astraea.spark.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} -import astraea.spark.rasterframes.model.TileDimensions -import astraea.spark.rasterframes.tiles.ProjectedRasterTile -import astraea.spark.rasterframes.util._ -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.sources.{BaseRelation, TableScan} -import org.apache.spark.sql.types.{StringType, StructField, StructType} -import org.apache.spark.sql.{DataFrame, Row, SQLContext} -import org.apache.spark.sql.functions.col ->>>>>>> Added ability to use a RasterSourceRelation against a table/view of paths.:datasource/src/main/scala/astraea/spark/rasterframes/datasource/rastersource/RasterSourceRelation.scala /** * Constructs a Spark Relation over one or more RasterSource paths. From 24ced8f735880572582821b25f38ae20491ec29b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Apr 2019 11:42:09 -0400 Subject: [PATCH 057/380] Incremental progress toward multi-file multiband RasterFrames. --- .../transformers/URIToRasterSource.scala | 7 +- .../rasterframes/util/package.scala | 7 +- .../locationtech/rasterframes/TestData.scala | 8 +- .../rastersource/RasterSourceDataSource.scala | 8 +- .../rastersource/RasterSourceRelation.scala | 99 +++++++++++++------ .../datasource/rastersource/package.scala | 4 +- .../geotiff/GeoTiffDataSourceSpec.scala | 2 +- .../RasterSourceDataSourceSpec.scala | 43 ++++---- 8 files changed, 117 insertions(+), 61 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala index e5bd7904b..84126441b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -23,7 +23,6 @@ package org.locationtech.rasterframes.expressions.transformers import java.net.URI -import org.locationtech.rasterframes.ref.RasterRef import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ExpectsInputTypes, Expression, UnaryExpression} @@ -31,7 +30,7 @@ import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StringType} import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.unsafe.types.UTF8String -import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} +import org.locationtech.rasterframes.ref.RasterSource /** @@ -58,6 +57,6 @@ case class URIToRasterSource(override val child: Expression) } object URIToRasterSource { - def apply(rasterURI: Column): TypedColumn[Any, RasterRef] = - new Column(new URIToRasterSource(rasterURI.expr)).as[RasterRef] + def apply(rasterURI: Column): TypedColumn[Any, RasterSource] = + new Column(new URIToRasterSource(rasterURI.expr)).as[RasterSource] } diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala index f723224f9..e27af9156 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala @@ -32,7 +32,8 @@ import geotrellis.raster.{CellGrid, Tile, isNoData} import geotrellis.spark.Bounds import geotrellis.spark.tiling.TilerKeyMethods import geotrellis.util.{ByteReader, GetComponent} -import org.apache.spark.sql.catalyst.expressions.{Expression, NamedExpression} +import org.apache.spark.sql.catalyst.analysis.UnresolvedAttribute +import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, NamedExpression} import org.apache.spark.sql.catalyst.plans.logical.LogicalPlan import org.apache.spark.sql.catalyst.rules.Rule import org.apache.spark.sql.rf._ @@ -103,7 +104,9 @@ package object util { implicit class ExpressionWithName(val expr: Expression) extends AnyVal { import org.apache.spark.sql.catalyst.expressions.Literal def name: String = expr match { - case n: NamedExpression ⇒ n.name + case n: NamedExpression if n.resolved ⇒ n.name + case UnresolvedAttribute(parts) => parts.mkString("_") + case Alias(_, name) => name case l: Literal if l.dataType == StringType ⇒ String.valueOf(l.value) case o ⇒ o.toString } diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index 13f93cd6c..5840fe566 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -110,6 +110,12 @@ trait TestData { require((1 to 11).contains(band), "Invalid band number") readSingleband(s"L8-B$band-Elkton-VA.tiff") } + + def l8SamplePath(band: Int) = { + require((1 to 11).contains(band), "Invalid band number") + getClass.getResource(s"/L8-B$band-Elkton-VA.tiff").toURI + } + def l8Labels = readSingleband("L8-Labels-Elkton-VA.tiff") def naipSample(band: Int) = { @@ -135,7 +141,7 @@ trait TestData { lazy val localSentinel: URL = getClass.getResource("/B01.jp2") lazy val cogPath: URI = getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI lazy val nonCogPath: URI = getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI - lazy val l8samplePath: URI = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI + lazy val l8B1SamplePath: URI = l8SamplePath(1) object JTS { val fact = new GeometryFactory() diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index d8723f25f..a09072f63 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -45,10 +45,10 @@ object RasterSourceDataSource { final val BAND_INDEXES_PARAM = "bandIndexes" final val TILE_DIMS_PARAM = "tileDimensions" final val PATH_TABLE_PARAM = "pathTable" - final val PATH_TABLE_COL_PARAM = "pathTableColumn" + final val PATH_TABLE_COL_PARAM = "pathTableColumns" /** Container for specifying where to select raster paths from. */ - case class PathColumn(tableName: String, columnName: String) + case class RasterSourceTable(tableName: String, columnNames: String*) private[rastersource] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { @@ -73,10 +73,10 @@ object RasterSourceDataSource { .map(_.split(',').map(_.trim.toInt).toSeq) .getOrElse(Seq(0)) - def pathTable: Option[PathColumn] = parameters + def pathTable: Option[RasterSourceTable] = parameters .get(PATH_TABLE_PARAM) .zip(parameters.get(PATH_TABLE_COL_PARAM)) - .map(p => PathColumn(p._1, p._2)) + .map(p => RasterSourceTable(p._1, p._2.split(','): _*)) .headOption } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index efc4e663a..b56146f66 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -22,7 +22,7 @@ package org.locationtech.rasterframes.datasource.rastersource import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceRelation.bandNames +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceRelation.{bandNames} import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} import org.locationtech.rasterframes.util._ @@ -31,52 +31,95 @@ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.PathColumn +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.RasterSourceTable import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Constructs a Spark Relation over one or more RasterSource paths. - * @param sqlContext - * @param paths list of URIs to fetch rastefrom. + * @param sqlContext Query context + * @param discretePaths list of URIs to fetch rastefrom. * @param bandIndexes band indexes to fetch * @param subtileDims how big to tile/subdivide rasters info */ -case class RasterSourceRelation(sqlContext: SQLContext, paths: Seq[String], pathTable: Option[PathColumn], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { +case class RasterSourceRelation(sqlContext: SQLContext, discretePaths: Seq[String], + pathTable: Option[RasterSourceTable], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) + extends BaseRelation with TableScan { - override def schema: StructType = StructType(Seq( - StructField(PATH_COLUMN.columnName, StringType, false) - ) ++ { + lazy val inputColNames = pathTable + .map(_.columnNames) + .getOrElse(Seq(TILE_COLUMN.columnName)) + + def pathColNames = inputColNames + .map(_ + "_path") + + def srcColNames = inputColNames + .map(_ + "_src") + + def refColNames = inputColNames + .flatMap(bandNames(_, bandIndexes)) + .map(_ + "_ref") + + def tileColNames = inputColNames + .flatMap(bandNames(_, bandIndexes)) + + override def schema: StructType = { val tileSchema = schemaOf[ProjectedRasterTile] - for { - name <- bandNames(bandIndexes) - } yield StructField(name, tileSchema, true) - }) + val paths = for { + pathCol <- pathColNames + } yield StructField(pathCol, StringType, false) + val tiles = for { + tileColName <- tileColNames + } yield StructField(tileColName, tileSchema, true) + + StructType(paths ++ tiles) + } override def buildScan(): RDD[Row] = { import sqlContext.implicits._ - val names = bandNames(bandIndexes) - val refs = RasterSourceToRasterRefs(subtileDims, bandIndexes, URIToRasterSource($"path")) - val refsToTiles = names.map(n => RasterRefToTile($"$n") as n) - - val pathsTable: DataFrame = pathTable match { - case Some(spec) => - sqlContext.table(spec.tableName).select(col(spec.columnName) as "path") - case _ => paths.toDF("path") + + // The general transformaion is: + // input -> path -> src -> ref -> tile + // Each step is broken down for readability + val inputs: DataFrame = pathTable match { + case Some(spec) => sqlContext.table(spec.tableName) + case _ => discretePaths.toDF(inputColNames.head) } - val df = pathsTable - .select(PATH_COLUMN, refs as names) - .select(PATH_COLUMN +: refsToTiles: _*) + // Basically renames the input columns to have the '_path' suffix + val pathsAliasing = for { + (input, path) <- inputColNames.zip(pathColNames) + } yield col(input).as(path) + + // Wraps paths in a RasterSource + val srcs = for { + (pathColName, srcColName) <- pathColNames.zip(srcColNames) + } yield URIToRasterSource(col(pathColName)) as srcColName + + // Combines RasterSource + bandIndex into a RasterRef + val refs = for { + (inputColName, srcColName) <- inputColNames.zip(srcColNames) + } yield RasterSourceToRasterRefs(subtileDims, bandIndexes, col(srcColName)) as bandNames(inputColName, bandIndexes) + + val refsToTiles = for { + (tileColName, refColName) <- refColNames.zip(tileColNames) + } yield RasterRefToTile(col(refColName)) as tileColName + + val paths = pathColNames.map(col) + + val df = inputs + .select(pathsAliasing: _*) + .select(paths ++ srcs: _*) + .select(paths ++ refs: _*) + .select(paths ++ refsToTiles: _*) + df.rdd } } object RasterSourceRelation { - private def bandNames(bandIndexes: Seq[Int]): Seq[String] = bandIndexes match { + private def bandNames(basename: String, bandIndexes: Seq[Int]): Seq[String] = bandIndexes match { case Seq() => Seq.empty - case Seq(0) => Seq(TILE_COLUMN.columnName) - case s => - val basename = TILE_COLUMN.columnName - s.map(n => basename + "_b" + n) + case Seq(0) => Seq(basename) + case s => s.map(n => basename + "_b" + n) } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala index cddace678..cae9e7fcd 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala @@ -50,10 +50,10 @@ package object rastersource { reader.option(RasterSourceDataSource.TILE_DIMS_PARAM, s"$cols,$rows") ) - def fromTable(tableName: String, columnName: String): RasterSourceDataFrameReader = + def fromTable(tableName: String, bandColumnNames: String*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.option(RasterSourceDataSource.PATH_TABLE_PARAM, tableName) - .option(RasterSourceDataSource.PATH_TABLE_COL_PARAM, columnName) + .option(RasterSourceDataSource.PATH_TABLE_COL_PARAM, bandColumnNames.mkString(",")) ) def from(newlineDelimPaths: String): RasterSourceDataFrameReader = diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index d221acab9..4ece87c35 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -83,7 +83,7 @@ class GeoTiffDataSourceSpec it("should read in correctly check-summed contents") { // c.f. TileStatsSpec -> computing statistics over tiles -> should compute tile statistics -> sum - val rf = spark.read.geotiff.loadRF(l8samplePath) + val rf = spark.read.geotiff.loadRF(l8B1SamplePath) val expected = 309149454 // computed with rasterio val result = rf.agg( sum(tile_sum(rf("tile"))) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index bfb5c95dc..3f690fb3b 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -54,15 +54,15 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { p.tileDims should be (Some(TileDimensions(4, 5))) } - it("should parse path table specificatino") { + it("should parse path table specification") { val p = Map(PATH_TABLE_PARAM -> "pathTable", PATH_TABLE_COL_PARAM -> "path") - p.pathTable should be (Some(PathColumn("pathTable", "path"))) + p.pathTable should be (Some(RasterSourceTable("pathTable", "path"))) } } describe("RasterSource as relation reading") { it("should default to a single band schema") { - val df = spark.read.rastersource.load(l8samplePath.toASCIIString) + val df = spark.read.rastersource.load(l8B1SamplePath.toASCIIString) val tcols = df.tileColumns tcols.length should be(1) tcols.map(_.columnName) should contain("tile") @@ -102,35 +102,24 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { dims should contain allElementsOf Seq(TileDimensions(4,128), TileDimensions(128,128), TileDimensions(128,93), TileDimensions(4,93)) - df.select("path").distinct().count() should be(1) + df.select("tile_path").distinct().count() should be(1) } it("should read a multiple files with one band") { val df = spark.read.rastersource - .from(Seq(cogPath, l8samplePath, nonCogPath)) + .from(Seq(cogPath, l8B1SamplePath, nonCogPath)) .withTileDimensions(128, 128) .load() - df.select("path").distinct().count() should be(3) - df.schema.size should be(2) - } - - it("should read a multiple files from a table") { - Seq(cogPath, l8samplePath, nonCogPath).toDF("path").createOrReplaceTempView("pathsTable") - val df = spark.read.rastersource - .fromTable("pathsTable", "path") - .withTileDimensions(128, 128) - .load() - df.select("path").distinct().count() should be(3) + df.select("tile_path").distinct().count() should be(3) df.schema.size should be(2) } - it("should read a multiple files with heterogeneous bands") { val df = spark.read.rastersource - .from(Seq(cogPath, l8samplePath, nonCogPath)) + .from(Seq(cogPath, l8B1SamplePath, nonCogPath)) .withTileDimensions(128, 128) .withBandIndexes(0, 1, 2, 3) .load() .cache() - df.select("path").distinct().count() should be(3) + df.select("tile_path").distinct().count() should be(3) df.schema.size should be(5) df.select($"tile_b0").count() should be (df.select($"tile_b0").na.drop.count()) @@ -138,5 +127,21 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.select($"tile_b1").na.drop.count() should be (df.select($"tile_b2").na.drop.count()) df.select($"tile_b3").na.drop.count() should be (0) } + + + it("should read a extent coherent bands from multiple files") { + val bandPaths = Seq((l8SamplePath(1).toASCIIString, l8SamplePath(2).toASCIIString, l8SamplePath(3).toASCIIString)) + .toDF("B1", "B2", "B3") + + bandPaths.createOrReplaceTempView("pathsTable") + + val df = spark.read.rastersource + .fromTable("pathsTable", "B1", "B2", "B3") + .withTileDimensions(128, 128) + .load() + df.show(false) + df.select("path").distinct().count() should be(3) + df.schema.size should be(2) + } } } From 6fc0b4d6871250e140cf2a88da55e2db580adbd9 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Apr 2019 13:08:14 -0400 Subject: [PATCH 058/380] Updated RasterSourceRelation to allow for multiple extent-coherent files to be used as separate bands. --- .../RasterSourceToRasterRefs.scala | 11 +++++- .../transformers/RasterSourceToTiles.scala | 3 ++ .../rastersource/RasterSourceRelation.scala | 37 +++++++++---------- .../RasterSourceDataSourceSpec.scala | 6 ++- 4 files changed, 34 insertions(+), 23 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index 0bdfa1ee3..663f090ff 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -32,6 +32,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} @@ -54,8 +55,8 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[ override def elementSchema: StructType = StructType(for { child <- children - band <- bandIndexes - name = child.name + (if (bandIndexes.length > 1) "_b" + band else "") + basename = child.name + "_ref" + name <- bandNames(basename, bandIndexes) } yield StructField(name, rasterRefSchema, true)) private def band2ref(src: RasterSource, e: Option[Extent])(b: Int): RasterRef = @@ -86,4 +87,10 @@ object RasterSourceToRasterRefs { def apply(rrs: Column*): TypedColumn[Any, RasterRef] = apply(None, Seq(0), rrs: _*) def apply(subtileDims: Option[TileDimensions], bandIndexes: Seq[Int], rrs: Column*): TypedColumn[Any, RasterRef] = new Column(new RasterSourceToRasterRefs(rrs.map(_.expr), bandIndexes, subtileDims)).as[RasterRef] + + private[rasterframes] def bandNames(basename: String, bandIndexes: Seq[Int]): Seq[String] = bandIndexes match { + case Seq() => Seq.empty + case Seq(0) => Seq(basename) + case s => s.map(n => basename + "_b" + n) + } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala index 351c25783..5302640b4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala @@ -40,6 +40,7 @@ import org.locationtech.rasterframes.TileType * * @since 9/6/18 */ +@deprecated("Use RasterSourceToRasterRefs and RasterRef to Tile instread", "4/28/19") case class RasterSourceToTiles(children: Seq[Expression], applyTiling: Boolean) extends Expression with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { @@ -74,7 +75,9 @@ case class RasterSourceToTiles(children: Seq[Expression], applyTiling: Boolean) object RasterSourceToTiles { + @deprecated("Use RasterSourceToRasterRefs and RasterRef to Tile instread", "4/28/19") def apply(rrs: Column*): Column = apply(true, rrs: _*) + @deprecated("Use RasterSourceToRasterRefs and RasterRef to Tile instread", "4/28/19") def apply(applyTiling: Boolean, rrs: Column*): Column = new Column(new RasterSourceToTiles(rrs.map(_.expr), applyTiling)) } \ No newline at end of file diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index b56146f66..c33722520 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -22,7 +22,6 @@ package org.locationtech.rasterframes.datasource.rastersource import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceRelation.{bandNames} import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} import org.locationtech.rasterframes.util._ @@ -32,6 +31,7 @@ import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.RasterSourceTable +import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.tiles.ProjectedRasterTile @@ -56,7 +56,7 @@ case class RasterSourceRelation(sqlContext: SQLContext, discretePaths: Seq[Strin def srcColNames = inputColNames .map(_ + "_src") - def refColNames = inputColNames + def refColNames = srcColNames .flatMap(bandNames(_, bandIndexes)) .map(_ + "_ref") @@ -96,30 +96,29 @@ case class RasterSourceRelation(sqlContext: SQLContext, discretePaths: Seq[Strin (pathColName, srcColName) <- pathColNames.zip(srcColNames) } yield URIToRasterSource(col(pathColName)) as srcColName - // Combines RasterSource + bandIndex into a RasterRef - val refs = for { - (inputColName, srcColName) <- inputColNames.zip(srcColNames) - } yield RasterSourceToRasterRefs(subtileDims, bandIndexes, col(srcColName)) as bandNames(inputColName, bandIndexes) + // Expand RasterSource into multiple columns per band, and multiple rows per tile + // There's some unintentional fragililty here in that the structure of the expression + // is expected to line up with our column structure here. + val refs = RasterSourceToRasterRefs(subtileDims, bandIndexes, srcs: _*) as refColNames + // RasterSourceToRasterRef is a generator, which means you have to do the Tile conversion + // in a separate select statement (Query planner doesn't know how many columns ahead of time). val refsToTiles = for { - (tileColName, refColName) <- refColNames.zip(tileColNames) + (refColName, tileColName) <- refColNames.zip(tileColNames) } yield RasterRefToTile(col(refColName)) as tileColName - val paths = pathColNames.map(col) - - val df = inputs + // Add path columns + val withPaths = inputs .select(pathsAliasing: _*) - .select(paths ++ srcs: _*) - .select(paths ++ refs: _*) + + // Path columns have to be manually pulled along through each step. Resolve columns once + // and reused with each select. + val paths = pathColNames.map(withPaths.apply) + + val df = withPaths + .select(paths :+ refs: _*) .select(paths ++ refsToTiles: _*) df.rdd } } -object RasterSourceRelation { - private def bandNames(basename: String, bandIndexes: Seq[Int]): Seq[String] = bandIndexes match { - case Seq() => Seq.empty - case Seq(0) => Seq(basename) - case s => s.map(n => basename + "_b" + n) - } -} diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 3f690fb3b..4d9ee9445 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -133,15 +133,17 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { val bandPaths = Seq((l8SamplePath(1).toASCIIString, l8SamplePath(2).toASCIIString, l8SamplePath(3).toASCIIString)) .toDF("B1", "B2", "B3") + bandPaths.show() + bandPaths.createOrReplaceTempView("pathsTable") val df = spark.read.rastersource .fromTable("pathsTable", "B1", "B2", "B3") .withTileDimensions(128, 128) .load() + df.show(false) - df.select("path").distinct().count() should be(3) - df.schema.size should be(2) + df.schema.size should be(6) } } } From 4673e8c3342dd15f70009113e0012cff7a2450da Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Apr 2019 13:16:13 -0400 Subject: [PATCH 059/380] Revised unit test for multi-file bands in RasterSourceRelation. --- .../rastersource/RasterSourceDataSourceSpec.scala | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 4d9ee9445..7cb0c34a7 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -130,11 +130,12 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { it("should read a extent coherent bands from multiple files") { - val bandPaths = Seq((l8SamplePath(1).toASCIIString, l8SamplePath(2).toASCIIString, l8SamplePath(3).toASCIIString)) + val bandPaths = Seq(( + l8SamplePath(1).toASCIIString, + l8SamplePath(2).toASCIIString, + l8SamplePath(3).toASCIIString)) .toDF("B1", "B2", "B3") - bandPaths.show() - bandPaths.createOrReplaceTempView("pathsTable") val df = spark.read.rastersource @@ -142,8 +143,9 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { .withTileDimensions(128, 128) .load() - df.show(false) df.schema.size should be(6) + df.tileColumns.size should be (3) + df.select($"B1_path").distinct().count() should be (1) } } } From adf229a5517a59b5248c4f39386253ab5e5ab759 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Apr 2019 15:37:29 -0400 Subject: [PATCH 060/380] Expressed clearer distinction between getting the extent from a Geometry vs ProjectedRasterTile. --- .../org/locationtech/rasterframes/RasterFunctions.scala | 5 ++++- .../org/locationtech/rasterframes/expressions/package.scala | 3 ++- .../expressions/transformers/GeometryToExtent.scala | 2 +- .../test/scala/org/locationtech/rasterframes/JTSSpec.scala | 2 +- .../org/locationtech/rasterframes/ref/RasterRefSpec.scala | 6 +++--- docs/src/main/tut/reference.md | 4 ++-- docs/src/main/tut/release-notes.md | 3 ++- pyrasterframes/python/pyrasterframes/rasterfunctions.py | 3 ++- pyrasterframes/python/tests/PyRasterFramesTests.py | 4 ++-- 9 files changed, 19 insertions(+), 13 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 91686b3be..279bc172d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -62,7 +62,10 @@ trait RasterFunctions { def rf_tile_dimensions(col: Column): Column = GetDimensions(col) /** Extracts the bounding box of a geometry as an Extent */ - def rf_extent(col: Column): TypedColumn[Any, Extent] = GeometryToExtent(col) + def st_extent(col: Column): TypedColumn[Any, Extent] = GeometryToExtent(col) + + /** Extracts the bounding box from a RasterSource or ProjectedRasterTile */ + def rf_extent(col: Column): TypedColumn[Any, Extent] = GetExtent(col) /** Flattens Tile into a double array. */ def rf_tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index e4d48c9e9..078736655 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -69,7 +69,8 @@ package object expressions { registry.registerExpression[SetCellType]("rf_convert_cell_type") registry.registerExpression[GetDimensions]("rf_tile_dimensions") registry.registerExpression[ExtentToGeometry]("rf_extent_geometry") - registry.registerExpression[GeometryToExtent]("rf_extent") + registry.registerExpression[GeometryToExtent]("st_extent") + registry.registerExpression[GetExtent]("rf_extent") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala index e9c259df4..adb52468b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/GeometryToExtent.scala @@ -37,7 +37,7 @@ import org.apache.spark.sql.{Column, TypedColumn} * @since 8/24/18 */ case class GeometryToExtent(child: Expression) extends UnaryExpression with CodegenFallback { - override def nodeName: String = "rf_extent" + override def nodeName: String = "st_extent" override def dataType: DataType = schemaOf[Extent] diff --git a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala index a9da6cbcb..24cbe8f0f 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala @@ -82,7 +82,7 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { it("should provide a means of getting a bounding box") { import spark.implicits._ - val boxed = rf.select(GEOMETRY_COLUMN, rf_extent(GEOMETRY_COLUMN) as "extent") + val boxed = rf.select(GEOMETRY_COLUMN, st_extent(GEOMETRY_COLUMN) as "extent") assert(boxed.select($"extent".as[Extent]).first.area > 0) assert(boxed.toDF("bounds", "bbox").select("bbox.*").schema.length === 4) } diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala index ca14400a1..606b949f0 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala @@ -110,12 +110,12 @@ class RasterRefSpec extends TestEnvironment with TestData { } } - describe("GetExtent Expression") { + describe("rf_extent") { it("should read from RasterRef") { import spark.implicits._ new Fixture { val ds = Seq((1, fullRaster)).toDF("index", "ref") - val extent = ds.select(GetExtent($"ref")) + val extent = ds.select(rf_extent($"ref")) assert(extent.count() === 1) assert(extent.first() !== null) } @@ -124,7 +124,7 @@ class RasterRefSpec extends TestEnvironment with TestData { import spark.implicits._ new Fixture { val ds = Seq((1, subRaster)).toDF("index", "ref") - val extent = ds.select(GetExtent($"ref")) + val extent = ds.select(rf_extent($"ref")) assert(extent.count() === 1) assert(extent.first() !== null) } diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 1c44dbb3f..a36df2cec 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -38,11 +38,11 @@ _SQL_: `rf_reproject_geometry` Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. -#### rf_extent +#### st_extent _Python_: - Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(Geometry geom) + Struct[Double xmin, Double xmax, Double ymin, Double ymax] st_extent(Geometry geom) Extracts the bounding box (extent/envelope) of the geometry. diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index c831a15d7..996697dcb 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -12,7 +12,8 @@ * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. * Added `rf_render_matrix` debugging function. * Added `RasterFrame.withExtent` extension method. -* Added `rf_extent` and removed `envelope`. +* Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` types). +* _Breaking_ : Removed `envelope`, in lieu of `st_extent`, `rf_extent` or `st_envelope` * _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. * _Breaking_: With the upgrade to JTS 1.16.0, all imports of `com.vividsolutions.jts` need to be changed to `org.locationtech.jts`. * _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, with an `rf_` prefix, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 01ff4c282..9ef89df00 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -242,7 +242,8 @@ def _(data_tile, mask_tile, mask_value): 'rf_exp10': 'Compute 10 to the power of cell values', 'rf_expm1': 'Performs cell-wise exponential, then subtract one', 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', - 'rf_extent': 'Compute the extent/bbox of a Geometry', + 'st_extent': 'Compute the extent/bbox of a Geometry', + 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', 'rf_extent_geometry': 'Convert the given extent/bbox to a polygon', # ------- JTS functions ------- diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index feaab8cd6..4c24fd828 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -103,13 +103,13 @@ def test_general(self): .withColumn('mean', rf_tile_mean(self.tileCol)) \ .withColumn('sum', rf_tile_sum(self.tileCol)) \ .withColumn('stats', rf_tile_stats(self.tileCol)) \ - .withColumn('extent', rf_extent('geometry')) \ + .withColumn('extent', st_extent('geometry')) \ .withColumn('ascii', rf_render_ascii(self.tileCol)) \ .withColumn('log', rf_log(self.tileCol)) \ .withColumn('exp', rf_exp(self.tileCol)) \ .withColumn('expm1', rf_expm1(self.tileCol)) \ .withColumn('round', rf_round(self.tileCol)) - + # TODO: add test for rf_extent once rastersource connector is integrated. df.show() def test_rasterize(self): From 51c7686d7ec201faa7b75497db0b3404fa3c8954 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 30 Apr 2019 10:33:31 -0400 Subject: [PATCH 061/380] Added `rf_geometry`. Changed `rf_tile_dimensions` to `rf_dimensions`. Removed `RasterSourceToTiles` --- .../rasterframes/bench/RasterRefBench.scala | 18 ++-- .../rasterframes/RasterFunctions.scala | 13 +-- .../expressions/accessors/GetDimensions.scala | 15 +++- .../expressions/accessors/GetExtent.scala | 11 ++- .../expressions/accessors/GetGeometry.scala | 57 +++++++++++++ .../rasterframes/expressions/package.scala | 5 +- .../transformers/ExtentToGeometry.scala | 2 +- .../transformers/RasterSourceToTiles.scala | 83 ------------------- .../transformers/URIToRasterSource.scala | 2 - core/src/test/resources/log4j.properties | 2 +- core/src/test/scala/examples/Tour.scala | 2 +- .../rasterframes/ExplodeSpec.scala | 2 +- .../rasterframes/GeometryOperationsSpec.scala | 2 +- .../rasterframes/RasterFrameSpec.scala | 7 +- .../rasterframes/RasterFunctionsSpec.scala | 20 +++++ .../rasterframes/TileAssemblerSpec.scala | 2 +- .../rasterframes/TileStatsSpec.scala | 6 +- .../geotiff/GeoTiffDataSource.scala | 4 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 10 +-- .../RasterSourceDataSourceSpec.scala | 2 +- docs/src/main/tut/reference.md | 6 +- docs/src/main/tut/release-notes.md | 7 +- .../datasource/awspds/L8Relation.scala | 2 +- .../python/pyrasterframes/rasterfunctions.py | 5 +- .../python/tests/PyRasterFramesTests.py | 8 +- 25 files changed, 153 insertions(+), 140 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetGeometry.scala delete mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala index 0553daec2..a3450e1d7 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala @@ -23,17 +23,14 @@ package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.expressions.transformers.RasterSourceToTiles -import org.locationtech.rasterframes.ref.RasterSource import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs} +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.ref.RasterSource import org.openjdk.jmh.annotations._ -/** - * - * - * @since 11/1/18 - */ + @BenchmarkMode(Array(Mode.AverageTime)) @State(Scope.Benchmark) @OutputTimeUnit(TimeUnit.MILLISECONDS) @@ -47,11 +44,12 @@ class RasterRefBench extends SparkEnv with LazyLogging { def setupData(): Unit = { val r1 = RasterSource(remoteCOGSingleband1) val r2 = RasterSource(remoteCOGSingleband2) + singleDF = Seq((r1, r2)).toDF("B1", "B2") - .select(RasterSourceToTiles(false, $"B1", $"B2")) + .select(RasterRefToTile(RasterSourceToRasterRefs(Some(TileDimensions(r1.dimensions)), Seq(0), $"B1", $"B2"))) expandedDF = Seq((r1, r2)).toDF("B1", "B2") - .select(RasterSourceToTiles(true, $"B1", $"B2")) + .select(RasterRefToTile(RasterSourceToRasterRefs($"B1", $"B2"))) } @Benchmark diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 279bc172d..cae2e65d2 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -35,6 +35,7 @@ import org.locationtech.rasterframes.expressions.generators._ import org.locationtech.rasterframes.expressions.localops._ import org.locationtech.rasterframes.expressions.tilestats._ import org.locationtech.rasterframes.expressions.transformers._ +import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.stats._ import org.locationtech.rasterframes.{functions => F} @@ -59,7 +60,7 @@ trait RasterFunctions { ExplodeTiles(sampleFraction, None, cols) /** Query the number of (cols, rows) in a Tile. */ - def rf_tile_dimensions(col: Column): Column = GetDimensions(col) + def rf_dimensions(col: Column): TypedColumn[Any, TileDimensions] = GetDimensions(col) /** Extracts the bounding box of a geometry as an Extent */ def st_extent(col: Column): TypedColumn[Any, Extent] = GeometryToExtent(col) @@ -109,12 +110,15 @@ trait RasterFunctions { def rf_resample(tileCol: Column, factorCol: Column) = Resample(tileCol, factorCol) /** Convert a bounding box structure to a Geometry type. Intented to support multiple schemas. */ - def rf_extent_geometry(bounds: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(bounds) + def st_geometry(extent: Column): TypedColumn[Any, Geometry] = ExtentToGeometry(extent) + + /** Extract the extent of a RasterSource or ProjectedRasterTile as a Geometry type. */ + def rf_geometry(raster: Column): TypedColumn[Any, Geometry] = GetGeometry(raster) /** Assign a `NoData` value to the Tiles. */ - def rf_with_no_data(col: Column, nodata: Double): TypedColumn[Any, Tile] = withAlias("rf_with_no_data", col)( + def rf_with_no_data(col: Column, nodata: Double): TypedColumn[Any, Tile] = withTypedAlias("rf_with_no_data", col)( udf[Tile, Tile](F.withNoData(nodata)).apply(col) - ).as[Tile] + ) /** Compute the full column aggregate floating point histogram. */ def rf_agg_approx_histogram(col: Column): TypedColumn[Any, CellHistogram] = @@ -374,5 +378,4 @@ trait RasterFunctions { def rf_expm1(tileCol: Column): TypedColumn[Any, Tile] = ExpM1(tileCol) - } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala index f12bbd77d..dffdfdecb 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetDimensions.scala @@ -25,16 +25,23 @@ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.OnCellGridExpression import geotrellis.raster.CellGrid import org.apache.spark.sql._ -import org.apache.spark.sql.catalyst.expressions.Expression +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.locationtech.rasterframes.model.TileDimensions /** - * Extract a Tile's dimensions + * Extract a raster's dimensions * @since 12/21/17 */ +@ExpressionDescription( + usage = "_FUNC_(raster) - Fetches the dimensions (columns & rows) of a Tile, ProjectedRasterTile or RasterSource.", + examples = """ + Examples: + > SELECT _FUNC_(raster); + .... + """) case class GetDimensions(child: Expression) extends OnCellGridExpression with CodegenFallback { - override def nodeName: String = "rf_tile_dimensions" + override def nodeName: String = "rf_dimensions" def dataType = schemaOf[TileDimensions] @@ -42,6 +49,6 @@ case class GetDimensions(child: Expression) extends OnCellGridExpression with Co } object GetDimensions { - def apply(col: Column): Column = + def apply(col: Column): TypedColumn[Any, TileDimensions] = new Column(new GetDimensions(col.expr)).as[TileDimensions] } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala index 9cfdea016..2266c69b5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetExtent.scala @@ -33,13 +33,20 @@ import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.rasterframes.model.TileContext /** - * Expression to extract the Extent out of a RasterRef or ProjectedRasterTile column. + * Expression to extract the Extent out of a RasterSource or ProjectedRasterTile column. * * @since 9/10/18 */ +@ExpressionDescription( + usage = "_FUNC_(raster) - Fetches the extent (bounding box or envelope) of a ProjectedRasterTile or RasterSource.", + examples = """ + Examples: + > SELECT _FUNC_(raster); + .... + """) case class GetExtent(child: Expression) extends OnTileContextExpression with CodegenFallback { override def dataType: DataType = schemaOf[Extent] - override def nodeName: String = "extent" + override def nodeName: String = "rf_extent" override def eval(ctx: TileContext): InternalRow = ctx.extent.toInternalRow } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetGeometry.scala new file mode 100644 index 000000000..7ff3bcfc7 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetGeometry.scala @@ -0,0 +1,57 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.accessors + +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.expressions._ +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.jts.JTSTypes +import org.apache.spark.sql.types._ +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.jts.geom.Geometry +import org.locationtech.rasterframes.encoders.StandardEncoders.jtsGeometryEncoder +import org.locationtech.rasterframes.expressions.OnTileContextExpression +import org.locationtech.rasterframes.model.TileContext + +/** + * Expression to extract the Extent out of a RasterSource or ProjectedRasterTile column. + * + * @since 9/10/18 + */ +@ExpressionDescription( + usage = "_FUNC_(raster) - Fetches the extent (bounding box or envelope) of a ProjectedRasterTile or RasterSource.", + examples = """ + Examples: + > SELECT _FUNC_(raster); + .... + """) +case class GetGeometry(child: Expression) extends OnTileContextExpression with CodegenFallback { + override def dataType: DataType = JTSTypes.GeometryTypeInstance + override def nodeName: String = "rf_geometry" + override def eval(ctx: TileContext): InternalRow = + JTSTypes.GeometryTypeInstance.serialize(ctx.extent.jtsGeom) +} + +object GetGeometry { + def apply(col: Column): TypedColumn[Any, Geometry] = + new Column(GetGeometry(col.expr)).as[Geometry] +} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 078736655..0905dad39 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -67,8 +67,9 @@ package object expressions { registry.registerExpression[ExplodeTiles]("rf_explode_tiles") registry.registerExpression[GetCellType]("rf_cell_type") registry.registerExpression[SetCellType]("rf_convert_cell_type") - registry.registerExpression[GetDimensions]("rf_tile_dimensions") - registry.registerExpression[ExtentToGeometry]("rf_extent_geometry") + registry.registerExpression[GetDimensions]("rf_dimensions") + registry.registerExpression[ExtentToGeometry]("st_geometry") + registry.registerExpression[GetGeometry]("rf_geometry") registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[GetExtent]("rf_extent") registry.registerExpression[Subtract]("rf_local_subtract") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala index 7303baa29..9d2d12d2f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ExtentToGeometry.scala @@ -40,7 +40,7 @@ import org.locationtech.geomesa.spark.jts.encoders.SpatialEncoders * @since 8/24/18 */ case class ExtentToGeometry(child: Expression) extends UnaryExpression with CodegenFallback { - override def nodeName: String = "rf_extent_geometry" + override def nodeName: String = "st_geometry" override def dataType: DataType = JTSTypes.GeometryTypeInstance diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala deleted file mode 100644 index 5302640b4..000000000 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToTiles.scala +++ /dev/null @@ -1,83 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2019 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package org.locationtech.rasterframes.expressions.transformers - -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.util._ -import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.sql.Column -import org.apache.spark.sql.catalyst.InternalRow -import org.apache.spark.sql.catalyst.expressions._ -import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback -import org.apache.spark.sql.rf._ -import org.apache.spark.sql.types.{DataType, StructField, StructType} - -import scala.util.control.NonFatal -import org.locationtech.rasterframes.TileType - -/** - * Accepts RasterRef and generates one or more RasterRef instances representing the - * native internal sub-tiling, if any (and requested). - * - * @since 9/6/18 - */ -@deprecated("Use RasterSourceToRasterRefs and RasterRef to Tile instread", "4/28/19") -case class RasterSourceToTiles(children: Seq[Expression], applyTiling: Boolean) extends Expression - with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { - - private val RasterSourceType = new RasterSourceUDT() - override def inputTypes: Seq[DataType] = Seq.fill(children.size)(RasterSourceType) - override def nodeName: String = "raster_source_to_tile" - - override def elementSchema: StructType = StructType( - children.map(e ⇒ StructField(e.name, TileType, true)) - ) - - override def eval(input: InternalRow): TraversableOnce[InternalRow] = { - implicit val ser = TileUDT.tileSerializer - - try { - val refs = children.map { child ⇒ - val src = RasterSourceType.deserialize(child.eval(input)) - val tiles = if (applyTiling) src.readAll() else { - Seq(src.read(src.extent)) - } - tiles.map(_.mapTile(_.band(0))) - } - refs.transpose.map(ts ⇒ InternalRow(ts.map(r ⇒ r.tile.toInternalRow): _*)) - } - catch { - case NonFatal(ex) ⇒ - logger.error("Error fetching data for " + sql, ex) - Traversable.empty - } - } -} - - -object RasterSourceToTiles { - @deprecated("Use RasterSourceToRasterRefs and RasterRef to Tile instread", "4/28/19") - def apply(rrs: Column*): Column = apply(true, rrs: _*) - @deprecated("Use RasterSourceToRasterRefs and RasterRef to Tile instread", "4/28/19") - def apply(applyTiling: Boolean, rrs: Column*): Column = - new Column(new RasterSourceToTiles(rrs.map(_.expr), applyTiling)) -} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala index 1c11ce8c7..4a9c2659c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -27,13 +27,11 @@ import org.locationtech.rasterframes.RasterSourceType import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ExpectsInputTypes, Expression, UnaryExpression} -import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StringType} import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.unsafe.types.UTF8String import org.locationtech.rasterframes.ref.RasterSource - /** * Catalyst generator to convert a geotiff download URL into a series of rows * containing references to the internal tiles and associated extents. diff --git a/core/src/test/resources/log4j.properties b/core/src/test/resources/log4j.properties index db5aa310a..38dc57f1e 100644 --- a/core/src/test/resources/log4j.properties +++ b/core/src/test/resources/log4j.properties @@ -30,7 +30,7 @@ log4j.logger.org.apache.spark.repl.Main=WARN log4j.logger.org.apache=ERROR log4j.logger.com.amazonaws=WARN -log4j.logger.geotrellis=INFO +log4j.logger.geotrellis=WARN # Settings to quiet third party logs that are too verbose log4j.logger.org.spark_project.jetty=WARN diff --git a/core/src/test/scala/examples/Tour.scala b/core/src/test/scala/examples/Tour.scala index 8729c7d51..8dac067b8 100644 --- a/core/src/test/scala/examples/Tour.scala +++ b/core/src/test/scala/examples/Tour.scala @@ -57,7 +57,7 @@ object Tour extends App { rf.show(8, false) // Confirm we have equally sized tiles - rf.select(rf_tile_dimensions($"tile")).distinct().show() + rf.select(rf_dimensions($"tile")).distinct().show() // Count the number of no-data cells rf.select(rf_agg_no_data_cells($"tile")).show(false) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala index 15701b166..2a44bf3cf 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala @@ -45,7 +45,7 @@ class ExplodeSpec extends TestEnvironment with TestData { write(query) assert(query.select("cell_0", "cell_1").as[(Double, Double)].collect().forall(_ == ((1.0, 2.0)))) val query2 = sql( - """|select rf_tile_dimensions(tiles) as dims, rf_explode_tiles(tiles) from ( + """|select rf_dimensions(tiles) as dims, rf_explode_tiles(tiles) from ( |select rf_make_constant_tile(1, 10, 10, 'int8raw') as tiles) |""".stripMargin) write(query2) diff --git a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala index ea26594f7..0da6035a0 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala @@ -62,7 +62,7 @@ class GeometryOperationsSpec extends TestEnvironment with TestData { val rasterized = toRasterize.withColumn("rasterized", rf_rasterize($"geom", GEOMETRY_COLUMN, $"__fid__", cols, rows)) assert(rasterized.count() === df.count() * rf.count()) - assert(rasterized.select(rf_tile_dimensions($"rasterized")).distinct().count() === 1) + assert(rasterized.select(rf_dimensions($"rasterized")).distinct().count() === 1) val pixelCount = rasterized.select(rf_agg_data_cells($"rasterized")).first() assert(pixelCount < cols * rows) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala index a23cfb771..98ecd55fa 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala @@ -35,6 +35,7 @@ import geotrellis.spark.tiling._ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.functions._ import org.apache.spark.sql.{SQLContext, SparkSession} +import org.locationtech.rasterframes.model.TileDimensions import scala.util.control.NonFatal @@ -87,11 +88,9 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys assert(rf.schema.head.metadata.json.contains("tileLayout")) assert( - rf.select(rf_tile_dimensions($"tile")) - .as[Tuple1[(Int, Int)]] - .map(_._1) + rf.select(rf_dimensions($"tile")) .collect() - .forall(_ == (10, 10)) + .forall(_ == TileDimensions(10, 10)) ) assert(rf.count() === 4) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index c89e66c26..c28f3c422 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -29,6 +29,7 @@ import geotrellis.vector.Extent import org.apache.spark.sql.Encoders import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.expressions.accessors.ExtractTile +import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.stats._ import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.scalatest.{FunSpec, Matchers} @@ -284,6 +285,25 @@ class RasterFunctionsSpec extends FunSpec } } + describe("raster metadata") { + it("should get the TileDimensions of a Tile") { + val t = Seq(randTile).toDF("tile").select(rf_dimensions($"tile")).first() + t should be (TileDimensions(randTile.dimensions)) + checkDocs("rf_dimensions") + } + it("should get the Extent of a ProjectedRasterTile") { + val e = Seq(randTile).toDF("tile").select(rf_extent($"tile")).first() + e should be (extent) + checkDocs("rf_extent") + } + + it("should get the Geometry of a ProjectedRasterTile") { + val g = Seq(randTile).toDF("tile").select(rf_geometry($"tile")).first() + g should be (extent.jtsGeom) + checkDocs("rf_geometry") + } + } + describe("per-tile stats") { it("should compute data cell counts") { val df = Seq(TestData.injectND(numND)(two)).toDF("two") diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index 8fc11f878..7dbccc92a 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -65,7 +65,7 @@ class TileAssemblerSpec extends TestEnvironment { val sceneSize = (260, 257) val rs = InMemoryRasterSource(TestData.randomTile(sceneSize._1, sceneSize._2, ByteConstantNoDataCellType), Extent(10, 20, 30, 40), LatLng) val df = rs.toDF - val exploded = df.select($"spatial_index", $"extent", rf_tile_dimensions($"tile") as "tile_dimensions", rf_explode_tiles($"tile")) + val exploded = df.select($"spatial_index", $"extent", rf_dimensions($"tile") as "tile_dimensions", rf_explode_tiles($"tile")) val assembled = exploded .groupBy($"spatial_index", $"extent", $"tile_dimensions") diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala index 6309e3eda..512a205fe 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala @@ -43,13 +43,13 @@ class TileStatsSpec extends TestEnvironment with TestData { it("should report dimensions") { val df = Seq[(Tile, Tile)]((byteArrayTile, byteArrayTile)).toDF("tile1", "tile2") - val dims = df.select(rf_tile_dimensions($"tile1") as "dims").select("dims.*") + val dims = df.select(rf_dimensions($"tile1") as "dims").select("dims.*") assert(dims.as[(Int, Int)].first() === (3, 3)) assert(dims.schema.head.name === "cols") val query = sql("""|select dims.* from ( - |select rf_tile_dimensions(tiles) as dims from ( + |select rf_dimensions(tiles) as dims from ( |select rf_make_constant_tile(1, 10, 10, 'int8raw') as tiles)) |""".stripMargin) write(query) @@ -57,7 +57,7 @@ class TileStatsSpec extends TestEnvironment with TestData { df.repartition(4).createOrReplaceTempView("tmp") assert( - sql("select dims.* from (select rf_tile_dimensions(tile2) as dims from tmp)") + sql("select dims.* from (select rf_dimensions(tile2) as dims from tmp)") .as[(Int, Int)] .first() === (3, 3)) } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index a9c1bdaca..4b306df1e 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -78,14 +78,14 @@ class GeoTiffDataSource extends DataSourceRegister val c = rf .where(SPATIAL_KEY_COLUMN("row") === sk.row) .agg( - F.sum(rf_tile_dimensions(tc)("cols") cast(LongType)) + F.sum(rf_dimensions(tc)("cols") cast(LongType)) ).first() .getLong(0) val r = rf .where(SPATIAL_KEY_COLUMN("col") === sk.col) .agg( - F.sum(rf_tile_dimensions(tc)("rows") cast(LongType)) + F.sum(rf_dimensions(tc)("rows") cast(LongType)) ).first() .getLong(0) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index d8f8d8684..23e9283be 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -188,7 +188,7 @@ class GeoTrellisDataSourceSpec .withTileSubdivisions(param) .loadRF(layer) - val dims = df.select(rf_tile_dimensions(df.tileColumns.head)("cols"), rf_tile_dimensions(df.tileColumns.head)("rows")).first() + val dims = df.select(rf_dimensions(df.tileColumns.head)("cols"), rf_dimensions(df.tileColumns.head)("rows")).first() assert(dims.getAs[Int](0) === tileSize / param) assert(dims.getAs[Int](1) === tileSize / param) @@ -201,7 +201,7 @@ class GeoTrellisDataSourceSpec .withTileSubdivisions(param) .loadRF(tfLayer) - val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_dimensions(rf.tileColumns.head)("cols"), rf_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / param) assert(dims.getAs[Int](1) === tileSize / param) @@ -223,7 +223,7 @@ class GeoTrellisDataSourceSpec // is it subdivided? assert(rf.count === testRdd.count * subParam * subParam) - val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_dimensions(rf.tileColumns.head)("cols"), rf_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / subParam) assert(dims.getAs[Int](1) === tileSize / subParam) @@ -451,7 +451,7 @@ class GeoTrellisDataSourceSpec assert(rf.count === testRdd.count * subParam * subParam) - val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_dimensions(rf.tileColumns.head)("cols"), rf_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / subParam) assert(dims.getAs[Int](1) === tileSize / subParam) @@ -466,7 +466,7 @@ class GeoTrellisDataSourceSpec // is it subdivided? assert(rf.count === testRdd.count * subParam * subParam) - val dims = rf.select(rf_tile_dimensions(rf.tileColumns.head)("cols"), rf_tile_dimensions(rf.tileColumns.head)("rows")) + val dims = rf.select(rf_dimensions(rf.tileColumns.head)("cols"), rf_dimensions(rf.tileColumns.head)("rows")) .first() assert(dims.getAs[Int](0) === tileSize / subParam) assert(dims.getAs[Int](1) === tileSize / subParam) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index fa9cd4c02..25180b1ea 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -98,7 +98,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.count() should be(math.ceil(1028.0 / 128).toInt * math.ceil(989.0 / 128).toInt) - val dims = df.select(rf_tile_dimensions($"tile").as[TileDimensions]).distinct().collect() + val dims = df.select(rf_dimensions($"tile").as[TileDimensions]).distinct().collect() dims should contain allElementsOf Seq(TileDimensions(4,128), TileDimensions(128,128), TileDimensions(128,93), TileDimensions(4,93)) diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index a36df2cec..75cd1f63f 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -82,13 +82,13 @@ Print an array of possible cell type names, as below. These names are used in ot |float64 | -#### rf_tile_dimensions +#### rf_dimensions _Python_: - Struct[Int, Int] rf_tile_dimensions(Tile tile) + Struct[Int, Int] rf_dimensions(Tile tile) -_SQL_: `rf_tile_dimensions` +_SQL_: `rf_dimensions` Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 996697dcb..b9609e9c0 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -12,8 +12,11 @@ * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. * Added `rf_render_matrix` debugging function. * Added `RasterFrame.withExtent` extension method. -* Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` types). -* _Breaking_ : Removed `envelope`, in lieu of `st_extent`, `rf_extent` or `st_envelope` +* Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` and `RasterSource` columns). +* Added `st_geometry` (for `Extent` types) and `rf_geometry` (for `ProjectedRasterTile` and `RasterSource` columns). +* _Breaking_: Removed `envelope`, in lieu of `st_extent`, `rf_extent` or `st_envelope` +* _Breaking_: Renamed `rf_extent_geometry` to `st_geometry` +* _Breaking_: Renamed `rf_tile_dimensions` to `rf_dimensions` * _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. * _Breaking_: With the upgrade to JTS 1.16.0, all imports of `com.vividsolutions.jts` need to be changed to `org.locationtech.jts`. * _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, with an `rf_` prefix, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala index 3c734be2c..bfb48558e 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -89,7 +89,7 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[F .format(L8CatalogDataSource.SHORT_NAME) .load() .withColumnRenamed(PDSFields.ACQUISITION_DATE.name, PDSFields.TIMESTAMP.name) - .withColumn(PDSFields.BOUNDS.name, rf_extent_geometry(col(PDSFields.BOUNDS_WGS84.name))) + .withColumn(PDSFields.BOUNDS.name, st_geometry(col(PDSFields.BOUNDS_WGS84.name))) .drop(PDSFields.BOUNDS_WGS84.name) val filtered = aggFilters diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 9ef89df00..2481b8bc1 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -194,7 +194,7 @@ def _(data_tile, mask_tile, mask_value): _rf_column_functions = { # ------- RasterFrames functions ------- - 'rf_tile_dimensions': 'Query the number of (cols, rows) in a Tile.', + 'rf_dimensions': 'Query the number of (cols, rows) in a Tile.', 'rf_tile_to_array_int': 'Flattens Tile into an array of integers.', 'rf_tile_to_array_double': 'Flattens Tile into an array of doubles.', 'rf_cell_type': 'Extract the Tile\'s cell type', @@ -244,7 +244,8 @@ def _(data_tile, mask_tile, mask_value): 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', 'st_extent': 'Compute the extent/bbox of a Geometry', 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', - 'rf_extent_geometry': 'Convert the given extent/bbox to a polygon', + 'st_geometry': 'Convert the given extent/bbox to a polygon', + 'rf_geometry': 'Get the extent of a RasterSource or ProjectdRasterTile as a Geometry', # ------- JTS functions ------- # spatial constructors diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 4c24fd828..1a7174691 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -94,7 +94,7 @@ def test_tile_operations(self): def test_general(self): meta = self.rf.tileLayerMetadata() self.assertIsNotNone(meta['bounds']) - df = self.rf.withColumn('dims', rf_tile_dimensions(self.tileCol)) \ + df = self.rf.withColumn('dims', rf_dimensions(self.tileCol)) \ .withColumn('type', rf_cell_type(self.tileCol)) \ .withColumn('dCells', rf_data_cells(self.tileCol)) \ .withColumn('ndCells', rf_no_data_cells(self.tileCol)) \ @@ -104,12 +104,14 @@ def test_general(self): .withColumn('sum', rf_tile_sum(self.tileCol)) \ .withColumn('stats', rf_tile_stats(self.tileCol)) \ .withColumn('extent', st_extent('geometry')) \ + .withColumn('extent_geom1', st_geometry('extent')) \ .withColumn('ascii', rf_render_ascii(self.tileCol)) \ .withColumn('log', rf_log(self.tileCol)) \ .withColumn('exp', rf_exp(self.tileCol)) \ .withColumn('expm1', rf_expm1(self.tileCol)) \ .withColumn('round', rf_round(self.tileCol)) - # TODO: add test for rf_extent once rastersource connector is integrated. + # TODO: add test for rf_extent and rf_geometry once rastersource connector is integrated and we have + # a source of ProjectedRasterTiles. df.show() def test_rasterize(self): @@ -143,7 +145,7 @@ def test_sql(self): self.rf.createOrReplaceTempView("rf") - dims = self.rf.withColumn('dims', rf_tile_dimensions(self.tileCol)).first().dims + dims = self.rf.withColumn('dims', rf_dimensions(self.tileCol)).first().dims dims_str = """{}, {}""".format(dims.cols, dims.rows) self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, From 7dccb8eb09f41b2ebc6407f5f0d3e03a767394b1 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 30 Apr 2019 15:39:57 -0400 Subject: [PATCH 062/380] Renamed `rf_reproject_geometry` to `st_reproject` Fixed L8 integration test. --- core/src/main/resources/reference.conf | 18 +++++------ .../rasterframes/RasterFunctions.scala | 6 ++-- .../transformers/ReprojectGeometry.scala | 2 +- .../rasterframes/functions/package.scala | 2 +- .../rasterframes/model/Cells.scala | 3 ++ .../rasterframes/ref/RasterRef.scala | 3 +- .../util/ZeroSevenCompatibilityKit.scala | 2 +- .../locationtech/rasterframes/JTSSpec.scala | 8 ++--- .../rasterframes/ReprojectGeometrySpec.scala | 12 +++---- docs/src/main/tut/reference.md | 6 ++-- docs/src/main/tut/release-notes.md | 3 +- .../awspds/L8CatalogRelationTest.scala | 0 .../datasource/awspds/L8RelationTest.scala | 32 +++++++------------ .../awspds/MODISCatalogRelationTest.scala | 0 .../datasource/awspds/L8DataSource.scala | 4 +-- .../datasource/awspds/L8Relation.scala | 18 ++++++----- .../src/test/resources/application.conf | 8 +++++ .../python/pyrasterframes/rasterfunctions.py | 8 ++--- .../rasterframes/py/PyRFContext.scala | 2 +- 19 files changed, 70 insertions(+), 67 deletions(-) rename experimental/src/it/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala (100%) rename experimental/src/it/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/L8RelationTest.scala (67%) rename experimental/src/it/scala/{astraea/spark => org/locationtech}/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala (100%) create mode 100644 experimental/src/test/resources/application.conf diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index 00473ae15..b4ce78b06 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -4,15 +4,13 @@ rasterframes { } vlm.gdal { - settings { - options { - // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options - //CPL_DEBUG = "OFF" - AWS_REQUEST_PAYER = "requester" - GDAL_DISABLE_READDIR_ON_OPEN = "YES" - CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.jp2" - } - // set this to `false` if CPL_DEBUG is `ON` - useExceptions = true + options { + // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options + //CPL_DEBUG = "ON" + AWS_REQUEST_PAYER = "requester" + GDAL_DISABLE_READDIR_ON_OPEN = "YES" + CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.jp2" } + // set this to `false` if CPL_DEBUG is `ON` + //useExceptions = false } \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index cae2e65d2..abf4d7c31 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -275,15 +275,15 @@ trait RasterFunctions { ) /** Reproject a column of geometry from one CRS to another. */ - def rf_reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRSCol: Column): TypedColumn[Any, Geometry] = + def st_reproject(sourceGeom: Column, srcCRS: CRS, dstCRSCol: Column): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRSCol) /** Reproject a column of geometry from one CRS to another. */ - def rf_reproject_geometry(sourceGeom: Column, srcCRSCol: Column, dstCRS: CRS): TypedColumn[Any, Geometry] = + def st_reproject(sourceGeom: Column, srcCRSCol: Column, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRSCol, dstCRS) /** Reproject a column of geometry from one CRS to another. */ - def rf_reproject_geometry(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = + def st_reproject(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRS) /** Render Tile as ASCII string, for debugging purposes. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala index 83a5d876a..1b85ffc59 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -43,7 +43,7 @@ import org.locationtech.rasterframes.jts.ReprojectionTransformer case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: Expression) extends Expression with CodegenFallback with ExpectsInputTypes { - override def nodeName: String = "rf_reproject_geometry" + override def nodeName: String = "st_reproject" override def dataType: DataType = JTSTypes.GeometryTypeInstance override def nullable: Boolean = geometry.nullable || srcCRS.nullable || dstCRS.nullable override def children: Seq[Expression] = Seq(geometry, srcCRS, dstCRS) diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index 62933029a..17b553336 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -144,6 +144,6 @@ package object functions { sqlContext.udf.register("rf_cell_types", cellTypes) sqlContext.udf.register("rf_rasterize", rasterize) - sqlContext.udf.register("rf_reproject_geometry", reprojectGeometryCRSName) + sqlContext.udf.register("st_reproject", reprojectGeometryCRSName) } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala index 4566e7630..975109f0c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala @@ -28,6 +28,7 @@ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import org.locationtech.rasterframes.ref.RasterRef import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes.tiles.ProjectedRasterTile.ConcreteProjectedRasterTile /** Represents the union of binary cell datas or a reference to the data.*/ case class Cells(data: Either[Array[Byte], RasterRef]) { @@ -47,6 +48,8 @@ object Cells { /** Extracts the Cells from a Tile. */ def apply(t: Tile): Cells = { t match { + case prt: ConcreteProjectedRasterTile => + apply(prt.t) case ref: RasterRefTile => Cells(Right(ref.rr)) case const: ConstantTile => diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala index 634695595..ad2291c77 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala @@ -30,6 +30,7 @@ import org.apache.spark.sql.rf.RasterSourceUDT import org.apache.spark.sql.types.{IntegerType, StructField, StructType} import org.locationtech.rasterframes.encoders.CatalystSerializer.{CatalystIO, _} import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** @@ -45,7 +46,7 @@ case class RasterRef(source: RasterSource, bandIndex: Int, subextent: Option[Ext def cols: Int = grid.width def rows: Int = grid.height def cellType: CellType = source.cellType - def tile: ProjectedRasterTile = ProjectedRasterTile(realizedTile, extent, crs) + def tile: ProjectedRasterTile = ProjectedRasterTile(RasterRefTile(this), extent, crs) protected lazy val grid: GridBounds = source.rasterExtent.gridBoundsFor(extent) protected def srcExtent: Extent = extent diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala index ecd122adb..b5e62b42d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -259,7 +259,7 @@ object ZeroSevenCompatibilityKit { /** Reproject a column of geometry from one CRS to another. */ @deprecated("Part of 0.7.x compatibility kit, to be removed after 0.8.x. Please use \"snake_case\" variant instead.", "0.8.0") def reprojectGeometry(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = - delegate.rf_reproject_geometry(sourceGeom, srcCRS, dstCRS) + delegate.st_reproject(sourceGeom, srcCRS, dstCRS) /** Render Tile as ASCII string for debugging purposes. */ @Experimental diff --git a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala index 24cbe8f0f..92bd42b4d 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala @@ -110,9 +110,9 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { val df = Seq((latLng, webMercator)).toDF("ll", "wm") val rp = df.select( - rf_reproject_geometry($"ll", LatLng, WebMercator) as "wm2", - rf_reproject_geometry($"wm", WebMercator, LatLng) as "ll2", - rf_reproject_geometry(rf_reproject_geometry($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" + st_reproject($"ll", LatLng, WebMercator) as "wm2", + st_reproject($"wm", WebMercator, LatLng) as "ll2", + st_reproject(st_reproject($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" ).as[(Geometry, Geometry, Geometry)] @@ -125,7 +125,7 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { df.createOrReplaceTempView("geom") - val wm4 = sql("SELECT rf_reproject_geometry(ll, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', 'EPSG:3857') AS wm4 from geom") + val wm4 = sql("SELECT st_reproject(ll, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', 'EPSG:3857') AS wm4 from geom") .as[Geometry].first() wm4 should matchGeom(webMercator, 0.00001) } diff --git a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index c227944e0..46805a441 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -60,9 +60,9 @@ class ReprojectGeometrySpec extends FunSpec val df = Seq((latLng, webMercator)).toDF("ll", "wm") val rp = df.select( - rf_reproject_geometry($"ll", LatLng, WebMercator) as "wm2", - rf_reproject_geometry($"wm", WebMercator, LatLng) as "ll2", - rf_reproject_geometry(rf_reproject_geometry($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" + st_reproject($"ll", LatLng, WebMercator) as "wm2", + st_reproject($"wm", WebMercator, LatLng) as "ll2", + st_reproject(st_reproject($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" ).as[(Geometry, Geometry, Geometry)] @@ -79,9 +79,9 @@ class ReprojectGeometrySpec extends FunSpec val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") val rp = df.select( - rf_reproject_geometry($"ll", $"llCRS", WebMercator) as "wm2", - rf_reproject_geometry($"wm", WebMercator, $"llCRS") as "ll2", - rf_reproject_geometry(rf_reproject_geometry($"ll", $"llCRS", Sinusoidal), Sinusoidal, WebMercator) as "wm3" + st_reproject($"ll", $"llCRS", WebMercator) as "wm2", + st_reproject($"wm", WebMercator, $"llCRS") as "ll2", + st_reproject(st_reproject($"ll", $"llCRS", Sinusoidal), Sinusoidal, WebMercator) as "wm3" ).as[(Geometry, Geometry, Geometry)] diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 75cd1f63f..df28c11ab 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -28,12 +28,12 @@ Various LocationTech GeoMesa UDFs to deal with `geomtery` type columns are also RasterFrames provides two additional functions for vector geometry. -#### reproject_geometry +#### st_reproject _Python_: - Geometry reproject_geometry(Geometry geom, String origin_crs, String destination_crs) + Geometry st_reproject(Geometry geom, String origin_crs, String destination_crs) -_SQL_: `rf_reproject_geometry` +_SQL_: `st_reproject` Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index b9609e9c0..f04f6cf9a 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -14,10 +14,11 @@ * Added `RasterFrame.withExtent` extension method. * Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` and `RasterSource` columns). * Added `st_geometry` (for `Extent` types) and `rf_geometry` (for `ProjectedRasterTile` and `RasterSource` columns). +* _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. * _Breaking_: Removed `envelope`, in lieu of `st_extent`, `rf_extent` or `st_envelope` * _Breaking_: Renamed `rf_extent_geometry` to `st_geometry` * _Breaking_: Renamed `rf_tile_dimensions` to `rf_dimensions` -* _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. +* _Breaking_: Renamed `rf_reproject_geometry` to `st_reproject` * _Breaking_: With the upgrade to JTS 1.16.0, all imports of `com.vividsolutions.jts` need to be changed to `org.locationtech.jts`. * _Deprecation_: Tile column functions (in `RasterFunctions`) and SQL registered names have all been renamed to follow `snake_case` conventions, with an `rf_` prefix, matching SQL and Python. A temporary compatibility shim is included so that code built against 0.7.1 and earlier still work. These will be marked as deprecated. * _Breaking_: In Scala and SQL, `..._scalar` functions (e.g. `local_add_scalar`) have been removed. Non-scalar forms now dynamically detect type of right hand side. diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala similarity index 100% rename from experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala rename to experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala similarity index 67% rename from experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala rename to experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala index 780ea9195..f53246c09 100644 --- a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/L8RelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala @@ -21,8 +21,6 @@ package org.locationtech.rasterframes.experimental.datasource.awspds import org.locationtech.rasterframes._ -import org.apache.spark.sql.DataFrame -import org.locationtech.rasterframes.TestEnvironment import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll} /** @@ -30,8 +28,6 @@ import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll} */ class L8RelationTest extends TestEnvironment with BeforeAndAfterAll with BeforeAndAfter { - private var scenes: DataFrame = _ - val query = """ |SELECT geometry, timestamp, B1, B2 |FROM l8 @@ -46,28 +42,24 @@ class L8RelationTest extends TestEnvironment with BeforeAndAfterAll with BeforeA .format(L8DataSource.SHORT_NAME) .load() l8.createOrReplaceTempView("l8") - scenes = sql(query).cache() + sql(query).createOrReplaceTempView("subscenes") } describe("Read L8 on PDS as a DataSource") { + import spark.implicits._ it("should count scenes") { - assert(scenes.schema.size === 4) - assert(scenes.count() === 7) + val scenes = sql("SELECT entity_id FROM l8 DISTINCT") + scenes.count() shouldBe >(300400L) + + val subscenes = sqlContext.table("subscenes") + subscenes.schema.size should be (4) + subscenes.count() should be(7) } - it("should count tiles") { - val l8 = spark.read - .format(L8DataSource.SHORT_NAME) - .option(L8DataSource.USE_TILING, true) - .load() - l8.createOrReplaceTempView("l82") - val scenes2 = sql(query.replaceAll("l8", "l82")).cache() - val scenesCount = scenes.count() - val scenes2Count = scenes2.count() - println(scenesCount, scenes2Count) - // Most L8 geotiffs are 16x16 tiles, but some are smaller. - // Test against the lower bound. - assert(scenes2Count > scenesCount * 15 * 15) + it("should compute statistics") { + val subscenes = sqlContext.table("subscenes") + val stats = subscenes.select(rf_agg_stats($"B1")).first() + stats.data_cells shouldBe >(420024000L) } } } diff --git a/experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala similarity index 100% rename from experimental/src/it/scala/astraea/spark/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala rename to experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala index 5a6c25b6e..95e70ff4f 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala @@ -33,12 +33,10 @@ class L8DataSource extends DataSourceRegister with RelationProvider { override def shortName(): String = L8DataSource.SHORT_NAME override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { - val useTiling = parameters.get(L8DataSource.USE_TILING).exists(_.toBoolean) - L8Relation(sqlContext, useTiling) + L8Relation(sqlContext) } } object L8DataSource { final val SHORT_NAME = "awsl8" - final val USE_TILING = "useTiling" } diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala index bfb48558e..43c180cac 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala @@ -34,14 +34,14 @@ import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources._ import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, Row, SQLContext} -import org.locationtech.rasterframes.ref.RasterRef +import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Spark relation over AWS PDS Landsat 8 collection. * * @since 8/21/18 */ -case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[Filter] = Seq.empty) +case class L8Relation(sqlContext: SQLContext, filters: Seq[Filter] = Seq.empty) extends BaseRelation with PrunedFilteredScan with SpatialRelationReceiver[L8Relation] with LazyLogging { override def schema: StructType = L8Relation.schema @@ -99,13 +99,15 @@ case class L8Relation(sqlContext: SQLContext, useTiling: Boolean, filters: Seq[F val nonTile = other.map(col) - val df = { - val dims = if (useTiling) Some(NOMINAL_TILE_DIMS) else None + val df = if (bands.nonEmpty) { val sources = bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)) // NB: We assume that `nativeTiling` preserves the band names. - val expanded = RasterSourceToRasterRefs(dims, Seq(0), sources: _*) - filtered.select(nonTile :+ expanded: _*) - } + val expanded = RasterSourceToRasterRefs(None, Seq(0), sources: _*) + + filtered + .select(nonTile :+ expanded: _*) + .select(nonTile ++ bands.map(b => RasterRefToTile(col(b + "_ref")) as b): _*) + } else filtered // Make sure shape of resulting rows conforms to what was requested val selected = requiredColumns.headOption @@ -129,7 +131,7 @@ object L8Relation extends PDSFields { case ACQUISITION_DATE ⇒ ACQUISITION_DATE.copy(name = StandardColumns.TIMESTAMP_COLUMN.columnName) case s if s.name == BOUNDS_WGS84.name ⇒ BOUNDS case s if s != DOWNLOAD_URL ⇒ s - } ++ L8Relation.Bands.values.toSeq.map(b ⇒ StructField(b.toString, schemaOf[RasterRef], true)) + } ++ L8Relation.Bands.values.toSeq.map(b ⇒ StructField(b.toString, schemaOf[ProjectedRasterTile], true)) ) } } diff --git a/experimental/src/test/resources/application.conf b/experimental/src/test/resources/application.conf new file mode 100644 index 000000000..36c16db32 --- /dev/null +++ b/experimental/src/test/resources/application.conf @@ -0,0 +1,8 @@ +vlm.gdal { + options { + // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options + //CPL_DEBUG = "ON" + } + // set this to `false` if CPL_DEBUG is `ON` + //useExceptions = false +} \ No newline at end of file diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 2481b8bc1..c59d1416b 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -102,11 +102,11 @@ def _(geometryCol, boundsCol, valueCol, numCols, numRows): def _create_reproject_geometry(): - """ Create a function mapping to the Scala rf_reproject_geometry function. """ + """ Create a function mapping to the Scala st_reproject function. """ def _(geometryCol, srcCRSName, dstCRSName): - jfcn = RFContext.active().lookup('rf_reproject_geometry') + jfcn = RFContext.active().lookup('st_reproject') return Column(jfcn(_to_java_column(geometryCol), srcCRSName, dstCRSName)) - _.__name__ = 'rf_reproject_geometry' + _.__name__ = 'st_reproject' _.__doc__ = """Reproject a column of geometry given the CRS names of the source and destination. Currently supported registries are EPSG, ESRI, WORLD, NAD83, & NAD27. An example of a valid CRS name is EPSG:3005. @@ -161,7 +161,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_make_constant_tile': _create_makeConstantTile(), 'rf_mask_by_value': _create_maskByValue(), 'rf_rasterize': _create_rasterize(), - 'rf_reproject_geometry': _create_reproject_geometry(), + 'st_reproject': _create_reproject_geometry(), 'rf_make_ones_tile': _create_tileOnes(), 'rf_make_zeros_tile': _create_tileZeros(), } diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index a649cd8a7..b1aae5d84 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -159,7 +159,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { val src = LazyCRS(srcName) val dst = LazyCRS(dstName) - rf_reproject_geometry(geometryCol, src, dst) + st_reproject(geometryCol, src, dst) } // return toRaster, get just the tile, and make an array out of it From 52dadaf70413b79f474397263f6cc827fe622085 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 30 Apr 2019 20:07:38 -0400 Subject: [PATCH 063/380] python rastersource Signed-off-by: Jason T. Brown --- .../RasterSourceDataSourceSpec.scala | 2 +- .../python/pyrasterframes/__init__.py | 1 + .../python/tests/PyRasterFramesTests.py | 35 +++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 7cb0c34a7..f9df99fad 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -140,7 +140,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { val df = spark.read.rastersource .fromTable("pathsTable", "B1", "B2", "B3") - .withTileDimensions(128, 128) +// .withTileDimensions(128, 128) .load() df.schema.size should be(6) diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index b886bfabd..fe3f1b9ba 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -52,6 +52,7 @@ def _convertDF(df, sp_key = None, metadata = None): # TODO: make sure this supports **options DataFrameReader.geotiff = lambda df_reader, path: _reader(df_reader, "geotiff", path) DataFrameReader.geotrellis = lambda df_reader, path: _reader(df_reader, "geotrellis", path) +DataFrameReader.rastersource = lambda df_reader, path: _reader(df_reader, "rastersource", path) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index d0c531533..c7dce17dc 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -285,6 +285,41 @@ def some_point(g): pandas_df_out.poly_len.values ) + def test_raster_source_reader(self): + # much the same as RasterSourceDataSourceSpec here + def l8path(b): + assert b in range(1, 12) + #ok + base = "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/199/026/LC08_L1TP_199026_20180919_20180928_01_T1/LC08_L1TP_199026_20180919_20180928_01_T1_B{}.TIF" + base='s3://s22s-demeter-data-assets-prod/MOD11A1.006/18/06/2018153/MOD11A1.A2018153.h18v06.006.2018154084835_LSTD_B01.TIF' + #ok + # base = 'file:///Users/jbrown/src/rasterframes/core/target/scala-2.11/test-classes/L8-B{}-Elkton-VA.tiff' + + # not ok base = '/Users/jbrown/src/rasterframes/core/target/scala-2.11/test-classes/L8-B{}-Elkton-VA.tiff' + return base.format(b) + + # band_paths = self.spark.createDataFrame([{'B1': l8path(1), 'B2': l8path(2), 'B3': l8path(3)}]) + # band_paths.createOrReplaceTempView('pathsTable') + df = self.spark.read.format('rastersource') \ + .options(tileDimensions='32, 32', #Elkton files are 186 by 169 + path=l8path(1), + ) \ + .load() + #[l8path(b) for b in [1,2,3]]) \ + + df.printSchema() + + self.assertTrue(len(df.columns) == 2) # tile_path and tile + tile_size_df = df.select(tile_dimensions(df.tile).rows.alias('r'), tile_dimensions(df.tile).cols.alias('c'))\ + .groupby(['r','c']).count().toPandas() + + print(tile_size_df) + # the most common should be as given in options above. + self.assertTrue(tile_size_df.r.value_counts().idxmax() == 32) + self.assertTrue(tile_size_df.c.value_counts().idxmax() == 32) # columns + # all rows are from a single source URI + self.assertTrue(df.select(df.tile_path).distinct().count() == 1) + def suite(): function_tests = unittest.TestSuite() From b8367e359142504448e7f1a75df53c3fcef937c7 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 30 Apr 2019 20:59:18 -0400 Subject: [PATCH 064/380] Tweaking the docs to reflect new function names; remove SQL repeat of function name where necessary; add extent functions Signed-off-by: Jason T. Brown --- docs/src/main/tut/reference.md | 271 ++++----------------------------- 1 file changed, 32 insertions(+), 239 deletions(-) diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index df28c11ab..6d009a3e6 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -14,53 +14,44 @@ ReturnDataType function_name(InputDataType argument1, InputDataType argument2) ## List of Available SQL and Python Functions -The convention in this document will be to define the function signature as below, with its return type, the function name, and named arguments with their types. - -``` -ReturnDataType function_name(InputDataType argument1, InputDataType argument2) -``` - @@toc { depth=3 } ### Vector Operations Various LocationTech GeoMesa UDFs to deal with `geomtery` type columns are also provided in the SQL engine and within the `pyrasterframes.rasterfunctions` Python module. These are documented in the [LocationTech GeoMesa Spark SQL documentation](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#). These functions are all prefixed with `st_`. -RasterFrames provides two additional functions for vector geometry. +RasterFrames provides some additional functions for vector geometry operations. #### st_reproject -_Python_: Geometry st_reproject(Geometry geom, String origin_crs, String destination_crs) -_SQL_: `st_reproject` Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. #### st_extent -_Python_: - Struct[Double xmin, Double xmax, Double ymin, Double ymax] st_extent(Geometry geom) Extracts the bounding box (extent/envelope) of the geometry. See also GeoMesa [st_envelope](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#st-envelope) which returns a Geometry type. +#### st_geometry + + Geometry st_extent(Struct[Double xmin, Double xmax, Double ymin, Double ymax] extent) + +Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`](reference.md#st-extent) or @ref:[`rf_extent`](reference.md#rf-extent). + ### Tile Metadata and Mutation Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and nodata](reference.md#masking-and-nodata) for additional discussion of cell types. #### rf_cell_types - -_Python_: - Array[String] rf_cell_types() -_SQL_: `rf_cell_types` - Print an array of possible cell type names, as below. These names are used in other functions. See @ref:[discussion on nodata](reference.md#masking-and-nodata) for additional details. |cell_types | @@ -84,43 +75,36 @@ Print an array of possible cell type names, as below. These names are used in ot #### rf_dimensions -_Python_: - Struct[Int, Int] rf_dimensions(Tile tile) -_SQL_: `rf_dimensions` - Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. #### rf_cell_type -_Python_: - Struct[String] rf_cell_type(Tile tile) -_SQL_: `rf_cell_type` - Get the cell type of the `tile`. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. #### rf_convert_cell_type -_Python_: - Tile rf_convert_cell_type(Tile tileCol, String cellType) - -_SQL_: `rf_convert_cell_type` Convert `tileCol` to a different cell type. -#### rf_resample -_Python_: +#### rf_extent + + Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(ProjectedRasterTile raster) + Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(RasterSource raster) + +Fetches the extent (bounding box or envelope) of a `ProjectedRasterTile` or `RasterSource` type tile columns. + +#### rf_resample Tile rf_resample(Tile tile, Double factor) Tile rf_resample(Tile tile, Int factor) Tile rf_resample(Tile tile, Tile shape_tile) -_SQL_: `rf_resample` Change the tile dimension. Passing a numeric `factor` will scale the number of columns and rows in the tile: 1.0 is the same number of columns and row; less than one downsamples the tile; and greater than one upsamples the tile. Passing a `shape_tile` as the second argument outputs `tile` having the same number of columns and rows as `shape_tile`. All resampling is by nearest neighbor method. @@ -130,46 +114,34 @@ Functions to create a new Tile column, either from scratch or from existing data #### rf_make_zeros_tile -_Python_: - ``` Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, String cell_type_name) ``` -_SQL_: `rf_make_zeros_tile` Create a `tile` of shape `tile_columns` by `tile_rows` full of zeros, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. #### rf_make_ones_tile -_Python_: - ``` Tile rf_make_ones_tile(Int tile_columns, Int tile_rows, String cell_type_name) ``` -_SQL_: `rf_make_ones_tile` Create a `tile` of shape `tile_columns` by `tile_rows` full of ones, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. #### rf_make_constant_tile -_Python_: - Tile rf_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, String cell_type_name) -_SQL_: `rf_make_constant_tile` Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. #### rf_rasterize -_Python_: - Tile rf_rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows) -_SQL_: `rf_rasterize` Convert a vector Geometry `geom` into a Tile representation. The `value` will be "burned-in" to the returned `tile` where the `geom` intersects the `tile_bounds`. Returned `tile` will have shape `tile_columns` by `tile_rows`. Values outside the `geom` will be assigned a nodata value. Returned `tile` has cell type `int32`, note that `value` is of type Int. @@ -207,16 +179,12 @@ FROM #### rf_array_to_tile -_Python_: - Tile rf_array_to_tile(Array arrayCol, Int numCols, Int numRows) Python only. Create a `tile` from a Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), filling values in row-major order. #### rf_assemble_tile -_Python_: - Tile rf_assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, String cellType) Python only. Create a Tile from a column of cell data with location indices. This function is the inverse of @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles). Intended use is with a `groupby`, producing one row with a new `tile` per group. The `numCols`, `numRows` and `cellType` arguments are literal values, others are column expressions. Valid values for `cellType` can be found with function @ref:[`rf_cell_types`](reference.md#rf-cell-types). @@ -237,12 +205,8 @@ For more reading about cell types and ndodata, see the [GeoTrellis documentation #### rf_mask -_Python_: - Tile rf_mask(Tile tile, Tile mask) -_SQL_: `rf_mask` - Where the `mask` contains nodata, replace values in the `tile` with nodata. Returned `tile` cell type will be coerced to one supporting nodata if it does not already. @@ -250,39 +214,25 @@ Returned `tile` cell type will be coerced to one supporting nodata if it does no #### rf_inverse_mask -_Python_: - Tile rf_inverse_mask(Tile tile, Tile mask) -_SQL_: `rf_inverse_mask` - Where the `mask` _does not_ contain nodata, replace values in `tile` with nodata. #### rf_mask_by_value -_Python_: - Tile rf_mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value) -_SQL_: `rf_mask_by_value` - Generate a `tile` with the values from `data_tile`, with nodata in cells where the `mask_tile` is equal to `mask_value`. #### rf_is_no_data_tile -_Python_: - Boolean rf_is_no_data_tile(Tile) - -_SQL_: `rf_is_no_data_tile` Returns true if `tile` contains only nodata. By definition returns false if cell type does not support nodata. #### rf_with_no_data -_Python_: - Tile rf_with_no_data(Tile tile, Double no_data_value) Python only. Return a `tile` column marking as nodata all cells equal to `no_data_value`. @@ -301,231 +251,160 @@ Some of these functions have similar variations in the Python API: - `rf_local_op_double`: applies `op` to a `tile` and a literal scalar, coercing the `tile` to a floating point type - `rf_local_op_int`: applies `op` to a `tile` and a literal scalar, without coercing the `tile` to a floating point type -We will provide all these variations for `rf_local_add` and then suppress the rest in this document. - The SQL API does not require the `rf_local_op_double` or `rf_local_op_int` forms (just `rf_local_op`). #### rf_local_add -_Python_: - Tile rf_local_add(Tile tile1, Tile rhs) Tile rf_local_add_int(Tile tile1, Int rhs) Tile rf_local_add_double(Tile tile1, Double rhs) -_SQL_: `rf_local_add` Returns a `tile` column containing the element-wise sum of `tile1` and `rhs`. #### rf_local_subtract -_Python_: - Tile rf_local_subtract(Tile tile1, Tile rhs) Tile rf_local_subtract_int(Tile tile1, Int rhs) Tile rf_local_subtract_double(Tile tile1, Double rhs) -_SQL_: `rf_local_subtract` Returns a `tile` column containing the element-wise difference of `tile1` and `rhs`. #### rf_local_multiply -_Python_: - Tile rf_local_multiply(Tile tile1, Tile rhs) Tile rf_local_multiply_int(Tile tile1, Int rhs) Tile rf_local_multiply_double(Tile tile1, Double rhs) -_SQL_: `rf_local_multiply` Returns a `tile` column containing the element-wise product of `tile1` and `rhs`. This is **not** the matrix multiplication of `tile1` and `rhs`. #### rf_local_divide -_Python_: - Tile rf_local_divide(Tile tile1, Tile rhs) Tile rf_local_divide_int(Tile tile1, Int rhs) Tile rf_local_divide_double(Tile tile1, Double rhs) -_SQL_: `rf_local_divide` Returns a `tile` column containing the element-wise quotient of `tile1` and `rhs`. #### rf_normalized_difference -_Python_: - Tile rf_normalized_difference(Tile tile1, Tile tile2) -_SQL_: `rf_normalized_difference` Compute the normalized difference of the the two `tile`s: `(tile1 - tile2) / (tile1 + tile2)`. Result is always floating point cell type. This function has no scalar variant. #### rf_local_less -_Python_: - Tile rf_local_less(Tile tile1, Tile rhs) Tile rf_local_less_int(Tile tile1, Int rhs) Tile rf_local_less_double(Tile tile1, Double rhs) -_SQL_: `rf_local_less` Returns a `tile` column containing the element-wise evaluation of `tile1` is less than `rhs`. #### rf_local_less_equal -_Python_: - Tile rf_local_less_equal(Tile tile1, Tile rhs) Tile rf_local_less_equal_int(Tile tile1, Int rhs) Tile rf_local_less_equal_double(Tile tile1, Double rhs) -_SQL_: `rf_local_less_equal` Returns a `tile` column containing the element-wise evaluation of `tile1` is less than or equal to `rhs`. #### rf_local_greater -_Python_: - Tile rf_local_greater(Tile tile1, Tile rhs) Tile rf_local_greater_int(Tile tile1, Int rhs) Tile rf_local_greater_double(Tile tile1, Double rhs) -_SQL_: `rf_local_greater` Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than `rhs`. #### rf_local_greater_equal -_Python_: - Tile rf_local_greater_equal(Tile tile1, Tile rhs) Tile rf_local_greater_equal_int(Tile tile1, Int rhs) Tile rf_local_greater_equal_double(Tile tile1, Double rhs) -_SQL_: `rf_local_greater_equal` Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than or equal to `rhs`. #### rf_local_equal -_Python_: - Tile rf_local_equal(Tile tile1, Tile rhs) Tile rf_local_equal_int(Tile tile1, Int rhs) Tile rf_local_equal_double(Tile tile1, Double rhs) -_SQL_: `rf_local_equal` Returns a `tile` column containing the element-wise equality of `tile1` and `rhs`. #### rf_local_unequal -_Python_: - Tile rf_local_unequal(Tile tile1, Tile rhs) Tile rf_local_unequal_int(Tile tile1, Int rhs) Tile rf_local_unequal_double(Tile tile1, Double rhs) -_SQL_: `rf_local_unequal` Returns a `tile` column containing the element-wise inequality of `tile1` and `rhs`. #### rf_round -_Python_: - Tile rf_round(Tile tile) -_SQL_: `rf_round` - Round cell values to the nearest integer without changing the cell type. #### rf_exp -_Python_: - Tile rf_exp(Tile tile) -_SQL_: `rf_exp` - Performs cell-wise exponential. #### rf_exp10 -_Python_: - Tile rf_exp10(Tile tile) -_SQL_: `rf_exp10` - Compute 10 to the power of cell values. #### rf_exp2 -_Python_: - Tile rf_exp2(Tile tile) -_SQL_: `rf_exp2` - Compute 2 to the power of cell values. #### rf_expm1 -_Python_: - Tile rf_expm1(Tile tile) -_SQL_: `rf_expm1` - Performs cell-wise exponential, then subtract one. Inverse of @ref:[`log1p`](reference.md#log1p). #### rf_log -_Python_: - Tile rf_log(Tile tile) -_SQL_: `rf_log` - Performs cell-wise natural logarithm. #### rf_log10 -_Python_: - Tile rf_log10(Tile tile) -_SQL_: `rf_log10` - Performs cell-wise logarithm with base 10. #### rf_log2 -_Python_: - Tile rf_log2(Tile tile) -_SQL_: `rf_log2` - Performs cell-wise logarithm with base 2. #### rf_log1p -_Python_: - Tile rf_log1p(Tile tile) -_SQL_: `rf_log1p` - Performs natural logarithm of cell values plus one. Inverse of @ref:[`rf_expm1`](reference.md#rf-expm1). ### Tile Statistics @@ -552,86 +431,60 @@ spark.sql(""" #### rf_tile_sum -_Python_: - Double rf_tile_sum(Tile tile) -_SQL_: `rf_tile_sum` Computes the sum of cells in each row of column `tile`, ignoring nodata values. #### rf_tile_mean -_Python_: - Double rf_tile_mean(Tile tile) -_SQL_: `rf_tile_mean` Computes the mean of cells in each row of column `tile`, ignoring nodata values. #### rf_tile_min -_Python_: - Double rf_tile_min(Tile tile) -_SQL_: `rf_tile_min` Computes the min of cells in each row of column `tile`, ignoring nodata values. #### rf_tile_max -_Python_: - Double rf_tile_max(Tile tile) -_SQL_: `rf_tile_max` Computes the max of cells in each row of column `tile`, ignoring nodata values. #### rf_no_data_cells -_Python_: - Long rf_no_data_cells(Tile tile) -_SQL_: `rf_no_data_cells` Return the count of nodata cells in the `tile`. #### rf_data_cells -_Python_: - Long rf_data_cells(Tile tile) -_SQL_: `rf_data_cells` Return the count of data cells in the `tile`. #### rf_tile_stats -_Python_: - Struct[Long, Long, Double, Double, Double, Double] rf_tile_stats(Tile tile) -_SQL_: `rf_tile_stats` - Computes the following statistics of cells in each row of column `tile`: data cell count, nodata cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring nodata values. #### rf_tile_histogram -_Python_: - Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_tile_histogram(Tile tile) -_SQL_: `rf_rf_tile_histogram` - Computes a statistical summary of cell values within each row of `tile`. Resulting column has the below schema. Note that several of the other `tile` statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) which computes the statistics across all rows in a group. ``` @@ -664,9 +517,9 @@ Continuing our example from the @ref:[Tile Statistics](reference.md#tile-statist ```python spark.sql(""" -SELECT 1 as id, rf_tile_ones(5, 5, 'float32') as t +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION -SELECT 2 as id, rf_local_multiply_scalar(rf_tile_ones(5, 5, 'float32'), 3) as t +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t """).agg(rf_agg_mean(F.col('t'))).show(10, False) +--------------+ @@ -678,8 +531,6 @@ SELECT 2 as id, rf_local_multiply_scalar(rf_tile_ones(5, 5, 'float32'), 3) as t #### rf_agg_mean -_Python_: - Double rf_agg_mean(Tile tile) _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).mean` @@ -689,8 +540,6 @@ Aggregates over the `tile` and return the mean of cell values, ignoring nodata. #### rf_agg_data_cells -_Python_: - Long rf_agg_data_cells(Tile tile) _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` @@ -698,38 +547,31 @@ _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` Aggregates over the `tile` and return the count of data cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.dataCells`. C.F. `data_cells`; equivalent code: ```python -rf.select(rf_agg_data_cells(rf.tile).alias('agg_data_cell')).show() +rf.select(rf_agg_data_cells(rf.tile).alias('agg_data_cell')) # Equivalent to -rf.agg(F.sum(rf_data_cells(rf.tile)).alias('agg_data_cell')).show() +import pyspark.sql.functions as F +rf.agg(F.sum(rf_data_cells(rf.tile)).alias('agg_data_cell')) ``` #### rf_agg_no_data_cells -_Python_: - Long rf_agg_no_data_cells(Tile tile) -_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).noDataCells` +_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` Aggregates over the `tile` and return the count of nodata cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.noDataCells`. C.F. @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells) a row-wise count of no data cells. #### rf_agg_stats -_Python_: - Struct[Long, Long, Double, Double, Double, Double] rf_agg_stats(Tile tile) -_SQL_: `rf_agg_stats` Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of nodata cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of nodata. #### rf_agg_approx_histogram -_Python_: - Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_agg_approx_histogram(Tile tile) -_SQL_: `rf_agg_approx_histogram` Aggregates over the `tile` return statistical summaries of the cell values, including a histogram, in the below schema. The `bins` array is of tuples of histogram values and counts. Typically values are plotted on the x-axis and counts on the y-axis. @@ -759,23 +601,23 @@ Consider again our example for Tile Statistics and Aggregate Tile Statistics, th ```python import pyspark.functions as F -lam = spark.sql(""" -SELECT 1 as id, rf_tile_ones(5, 5, 'float32') as t +alm = spark.sql(""" +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION SELECT 2 as id, rf_local_multiply(rf_tile_ones(5, 5, 'float32'), 3) as t -""").agg(rf_local_agg_mean(F.col('t')).alias('l')) \ +""").agg(rf_agg_local_mean(F.col('t')).alias('l')) \ ## local_agg_mean returns a tile -lam.select(rf_tile_dimensions(lam.l)).show() +alm.select(rf_dimensions(alm.l)).show() ## -+------------------+ -|tile_dimensions(l)| -+------------------+ -| [5, 5]| -+------------------+ ++----------------+ +|rf_dimensions(l)| ++----------------+ +| [5, 5]| ++----------------+ ## -lam.select(rf_explode_tiles(lam.l)).show(10, False) +alm.select(rf_explode_tiles(alm.l)).show(10, False) ## +------------+---------+---+ |column_index|row_index|l | @@ -797,62 +639,38 @@ only showing top 10 rows #### rf_agg_local_max -_Python_: - Tile rf_agg_local_max(Tile tile) -_SQL_: `rf_agg_local_max` - Compute the cell-local maximum operation over Tiles in a column. #### rf_agg_local_min -_Python_: - Tile rf_agg_local_min(Tile tile) - -_SQL_: `rf_agg_local_min` Compute the cell-local minimum operation over Tiles in a column. #### rf_agg_local_mean -_Python_: - Tile rf_agg_local_mean(Tile tile) -_SQL_: `rf_agg_local_mean` - Compute the cell-local mean operation over Tiles in a column. #### rf_agg_local_data_cells -_Python_: - Tile rf_agg_local_data_cells(Tile tile) -_SQL_: `rf_agg_local_data_cells` - Compute the cell-local count of data cells over Tiles in a column. Returned `tile` has a cell type of `int32`. #### rf_agg_local_no_data_cells -_Python_: - Tile rf_agg_local_no_data_cells(Tile tile) - -_SQL_: `rf_agg_local_no_data_cells` Compute the cell-local count of nodata cells over Tiles in a column. Returned `tile` has a cell type of `int32`. #### rf_agg_local_stats -_Python_: - Struct[Tile, Tile, Tile, Tile, Tile] rf_agg_local_stats(Tile tile) -_SQL_: `rf_agg_local_stats` - Compute cell-local aggregate count, minimum, maximum, mean, and variance for a column of Tiles. Returns a struct of five `tile`s. @@ -862,18 +680,12 @@ RasterFrames provides several ways to convert a `tile` into other data structure #### rf_explode_tiles -_Python_: - Int, Int, Numeric* rf_explode_tiles(Tile* tile) - -_SQL_: `rf_explode_tiles` Create a row for each cell in `tile` columns. Many `tile` columns can be passed in, and the returned DataFrame will have one numeric column per input. There will also be columns for `column_index` and `row_index`. Inverse of @ref:[`rf_assemble_tile`](reference.md#rf-assemble-tile). When using this function, be sure to have a unique identifier for rows in order to successfully invert the operation. #### rf_explode_tiles_sample -_Python_: - Int, Int, Numeric* rf_explode_tiles_sample(Double sample_frac, Long seed, Tile* tile) Python only. As with @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles), but taking a randomly sampled subset of cells. Equivalent to the below, but this implementation is optimized for speed. Parameter `sample_frac` should be between 0.0 and 1.0. @@ -882,50 +694,31 @@ Python only. As with @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles), b df.select(df.id, rf_explode_tiles(df.tile1, df.tile2, df.tile3)) \ .sample(False, 0.05, 8675309) # Equivalent result, faster -df.select(df.id, rf_explode_tiles_sample(0.05, 8675309, df.tile1, df.tile2, df.tile3)) \ +df.select(df.id, rf_explode_tiles_sample(0.05, 8675309, df.tile1, df.tile2, df.tile3)) ``` #### rf_tile_to_array_int -_Python_: - Array rf_tile_to_array_int(Tile tile) - -_SQL_: `rf_tile_to_array_int` - Convert Tile column to Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Float cell types will be coerced to integral type by flooring. - #### rf_tile_to_array_double -_Python_: - Array rf_tile_to_arry_double(Tile tile) -_SQL_: `rf_tile_to_array_double` - Convert tile column to Spark [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Integral cell types will be coerced to floats. - #### rf_render_ascii -_Python_: - String rf_render_ascii(Tile tile) -_SQL_: `rf_render_ascii` - Pretty print the tile values as plain text. #### rf_render_matrix -_Python_: - String rf_render_matrix(Tile tile) -_SQL_: `rf_render_matrix` - Render Tile cell values as numeric values, for debugging purposes. [RasterFunctions]: org.locationtech.rasterframes.RasterFunctions From cb9991388c8db35baf8b0df88cdc6a0c15351655 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 23 Apr 2019 16:04:24 -0400 Subject: [PATCH 065/380] Add scala, python and SQL tile functions rf_for_all, rf_exists Signed-off-by: Jason T. Brown --- .../rasterframes/RasterFunctions.scala | 7 +++ .../rasterframes/expressions/package.scala | 2 + .../expressions/tilestats/Exists.scala | 54 +++++++++++++++++++ .../expressions/tilestats/ForAll.scala | 54 +++++++++++++++++++ .../expressions/tilestats/Sum.scala | 2 +- .../rasterframes/RasterFunctionsSpec.scala | 16 ++++++ docs/src/main/tut/reference.md | 13 ++++- .../python/pyrasterframes/rasterfunctions.py | 2 + .../python/tests/PyRasterFramesTests.py | 17 ++++++ 9 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index abf4d7c31..f12949709 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -169,9 +169,16 @@ trait RasterFunctions { def rf_no_data_cells(tile: Column): TypedColumn[Any, Long] = NoDataCells(tile) + /** Returns true if all cells in the tile are NoData.*/ def rf_is_no_data_tile(tile: Column): TypedColumn[Any, Boolean] = IsNoDataTile(tile) + /** Returns true if any cells in the tile are true (non-zero and not NoData). */ + def rf_exists(tile: Column): TypedColumn[Any, Boolean] = Exists(tile) + + /** Returns true if all cells in the tile are true (non-zero and not NoData). */ + def rf_for_all(tile: Column): TypedColumn[Any, Boolean] = ForAll(tile) + /** Compute cell-local aggregate descriptive statistics for a column of Tiles. */ def rf_agg_local_stats(col: Column) = LocalStatsAggregate(col) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 0905dad39..d38a21aa4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -98,6 +98,8 @@ package object expressions { registry.registerExpression[DataCells]("rf_data_cells") registry.registerExpression[NoDataCells]("rf_no_data_cells") registry.registerExpression[IsNoDataTile]("rf_is_no_data_tile") + registry.registerExpression[Exists]("rf_exists") + registry.registerExpression[ForAll]("rf_for_all") registry.registerExpression[TileMin]("rf_tile_min") registry.registerExpression[TileMax]("rf_tile_max") registry.registerExpression[TileMean]("rf_tile_mean") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala new file mode 100644 index 000000000..333c7b762 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala @@ -0,0 +1,54 @@ +package org.locationtech.rasterframes.expressions.tilestats + +import geotrellis.raster.{Tile, isData} +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} +import org.apache.spark.sql.types._ +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext + +@ExpressionDescription( + usage = "_FUNC_(tile) - Returns true if any cells in the tile are true (non-zero and not nodata).", + arguments = + """ + Arguments: + * tile - tile to check + """, + examples = + """ + > SELECT _FUNC_(tile); + true + """ +) +case class Exists(child: Expression) extends UnaryRasterOp with CodegenFallback { + override def nodeName: String = "exists" + override def dataType: DataType = BooleanType + override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = Exists.op(tile) + +} + +object Exists{ + + def apply(tile: Column): TypedColumn[Any, Boolean] = new Column(Exists(tile.expr)).as[Boolean] + + def op(tile: Tile): Boolean = { + + def doubleValueIs(d: Double): Boolean = isData(d) & d != 0.0 + def intValueIs(i: Int): Boolean = isData(i) & i != 0 + + var (c, r) = (0, 0) + while (r < tile.rows) { + while(c < tile.cols) { + if(tile.cellType.isFloatingPoint) { if(doubleValueIs(tile.getDouble(c, r))) return true } + else { if(intValueIs(tile.get(c, r))) return true } + c += 1 + } + c = 0; r += 1 + } + + false + } + + +} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala new file mode 100644 index 000000000..1a5846611 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala @@ -0,0 +1,54 @@ +package org.locationtech.rasterframes.expressions.tilestats + +import geotrellis.raster.{Tile, isData} +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} +import org.apache.spark.sql.types._ +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext + +@ExpressionDescription( + usage = "_FUNC_(tile) - Returns true if all cells in the tile are true (non-zero and not nodata).", + arguments = + """ + Arguments: + * tile - tile to check + """, + examples = + """ + > SELECT _FUNC_(tile); + true + """ +) +case class ForAll(child: Expression) extends UnaryRasterOp with CodegenFallback { + override def nodeName: String = "for_all" + override def dataType: DataType = BooleanType + override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = ForAll.op(tile) + +} + +object ForAll{ + + def apply(tile: Column): TypedColumn[Any, Boolean] = new Column(ForAll(tile.expr)).as[Boolean] + + def op(tile: Tile): Boolean = { + + def doubleValueIs(d: Double): Boolean = isData(d) & d != 0.0 + def intValueIs(i: Int): Boolean = isData(i) & i != 0 + + var (c, r) = (0, 0) + while (r < tile.rows) { + while(c < tile.cols) { + if(tile.cellType.isFloatingPoint) { if(! doubleValueIs(tile.getDouble(c, r))) return false } + else { if(! intValueIs(tile.get(c, r))) return false } + c += 1 + } + c = 0; r += 1 + } + + true + } + + +} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala index 825f88d1d..096acdab6 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Sum.scala @@ -30,7 +30,7 @@ import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.rasterframes.model.TileContext @ExpressionDescription( - usage = "_FUNC_(tile) - Computes the sum of all the cells in a tile..", + usage = "_FUNC_(tile) - Computes the sum of all the cells in a tile.", arguments = """ Arguments: * tile - tile to sum up""", diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index c28f3c422..7fad416a0 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -336,6 +336,22 @@ class RasterFunctionsSpec extends FunSpec df2.select(rf_is_no_data_tile($"not_nd")).first() should be(false) checkDocs("rf_is_no_data_tile") } + + it("should evaluate exists and forall") { + val df0 = Seq(zero).toDF("tile") + df0.select(rf_exists($"tile")).first() should be(false) + df0.select(rf_for_all($"tile")).first() should be(false) + + Seq(one).toDF("tile").select(rf_exists($"tile")).first() should be(true) + Seq(one).toDF("tile").select(rf_for_all($"tile")).first() should be(true) + + val dfNd = Seq(TestData.injectND(1)(one)).toDF("tile") + dfNd.select(rf_exists($"tile")).first() should be(true) + dfNd.select(rf_for_all($"tile")).first() should be(false) + + checkDocs("rf_exists") + checkDocs("rf_for_all") + } it("should find the minimum cell value") { val min = randNDTile.toArray().filter(c => raster.isData(c)).min.toDouble val df = Seq(randNDTile).toDF("rand") diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 6d009a3e6..f30660f14 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -471,9 +471,20 @@ Return the count of nodata cells in the `tile`. Long rf_data_cells(Tile tile) - Return the count of data cells in the `tile`. +#### rf_exists + + Boolean rf_exists(Tile tile) + +Returns true if any cells in the tile are true (non-zero and not NoData). + +#### rf_for_all + + Boolean rf_for_all(Tile tile) + +Returns true if all cells in the tile are true (non-zero and not NoData). + #### rf_tile_stats Struct[Long, Long, Double, Double, Double, Double] rf_tile_stats(Tile tile) diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index c59d1416b..f836171b1 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -199,6 +199,8 @@ def _(data_tile, mask_tile, mask_value): 'rf_tile_to_array_double': 'Flattens Tile into an array of doubles.', 'rf_cell_type': 'Extract the Tile\'s cell type', 'rf_is_no_data_tile': 'Report if the Tile is entirely NODDATA cells', + 'rf_exists': 'Returns true if any cells in the tile are true (non-zero and not NoData)', + 'rf_for_all': 'Returns true if all cells in the tile are true (non-zero and not NoData).', 'rf_agg_approx_histogram': 'Compute the full column aggregate floating point histogram', 'rf_agg_stats': 'Compute the full column aggregate floating point statistics', 'rf_agg_mean': 'Computes the column aggregate mean', diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 1a7174691..ee0e4358c 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -223,6 +223,23 @@ def test_resample(self): self.assertTrue(result == 1) # short hand for all values are true + def test_exists_for_all(self): + df = self.rf.withColumn('should_exist', tile_ones(5, 5, 'int8')) \ + .withColumn('should_not_exist', tile_zeros(5, 5, 'int8')) + + should_exist = df.select(exists(df.should_exist).alias('se')).take(1)[0].se + should_any = df.select(any(df.should_exist).alias('se')).take(1)[0].se + self.assertTrue(should_exist) + self.assertTrue(should_any) + + should_not_exist = df.select(exists(df.should_not_exist).alias('se')).take(1)[0].se + should_not_any = df.select(any(df.should_not_exist).alias('se')).take(1)[0].se + self.assertTrue(not should_not_exist) + self.assertTrue(not should_not_any) + + self.assertTrue(df.select(for_all(df.should_exist).alias('se')).take(1)[0].se) + self.assertTrue(not df.select(for_all(df.should_not_exist).alias('se')).take(1)[0].se) + def test_geomesa_pyspark(self): from pyspark.sql.functions import lit, udf, sum From 3ac087a4e7ec49f3582aadaadf9d76badb07b3e4 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 1 May 2019 17:15:27 -0400 Subject: [PATCH 066/380] rf_for_all and rf_exists refinement; python tests passing. --- .../expressions/tilestats/Exists.scala | 23 +++++--------- .../expressions/tilestats/ForAll.scala | 31 +++++++++---------- .../rasterframes/rasterframes.scala | 6 ++++ .../rasterframes/RasterFunctionsSpec.scala | 2 +- docs/src/main/tut/reference.md | 6 ++-- .../python/tests/PyRasterFramesTests.py | 18 +++++------ .../rasterframes/py/PyRFContext.scala | 2 +- 7 files changed, 40 insertions(+), 48 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala index 333c7b762..cd04b1467 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/Exists.scala @@ -1,12 +1,14 @@ package org.locationtech.rasterframes.expressions.tilestats -import geotrellis.raster.{Tile, isData} +import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.isCellTrue import org.locationtech.rasterframes.expressions.UnaryRasterOp import org.locationtech.rasterframes.model.TileContext +import spire.syntax.cfor.cfor @ExpressionDescription( usage = "_FUNC_(tile) - Returns true if any cells in the tile are true (non-zero and not nodata).", @@ -29,26 +31,17 @@ case class Exists(child: Expression) extends UnaryRasterOp with CodegenFallback } object Exists{ + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.boolEnc def apply(tile: Column): TypedColumn[Any, Boolean] = new Column(Exists(tile.expr)).as[Boolean] def op(tile: Tile): Boolean = { - - def doubleValueIs(d: Double): Boolean = isData(d) & d != 0.0 - def intValueIs(i: Int): Boolean = isData(i) & i != 0 - - var (c, r) = (0, 0) - while (r < tile.rows) { - while(c < tile.cols) { - if(tile.cellType.isFloatingPoint) { if(doubleValueIs(tile.getDouble(c, r))) return true } - else { if(intValueIs(tile.get(c, r))) return true } - c += 1 + cfor(0)(_ < tile.rows, _ + 1) { r ⇒ + cfor(0)(_ < tile.cols, _ + 1) { c ⇒ + if(tile.cellType.isFloatingPoint) { if(isCellTrue(tile.getDouble(c, r))) return true } + else { if(isCellTrue(tile.get(c, r))) return true } } - c = 0; r += 1 } - false } - - } \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala index 1a5846611..a912a8a0b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/tilestats/ForAll.scala @@ -1,12 +1,14 @@ package org.locationtech.rasterframes.expressions.tilestats -import geotrellis.raster.{Tile, isData} +import geotrellis.raster.Tile import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.isCellTrue import org.locationtech.rasterframes.expressions.UnaryRasterOp import org.locationtech.rasterframes.model.TileContext +import spire.syntax.cfor.cfor @ExpressionDescription( usage = "_FUNC_(tile) - Returns true if all cells in the tile are true (non-zero and not nodata).", @@ -28,27 +30,22 @@ case class ForAll(child: Expression) extends UnaryRasterOp with CodegenFallback } -object ForAll{ +object ForAll { + import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.boolEnc def apply(tile: Column): TypedColumn[Any, Boolean] = new Column(ForAll(tile.expr)).as[Boolean] def op(tile: Tile): Boolean = { - - def doubleValueIs(d: Double): Boolean = isData(d) & d != 0.0 - def intValueIs(i: Int): Boolean = isData(i) & i != 0 - - var (c, r) = (0, 0) - while (r < tile.rows) { - while(c < tile.cols) { - if(tile.cellType.isFloatingPoint) { if(! doubleValueIs(tile.getDouble(c, r))) return false } - else { if(! intValueIs(tile.get(c, r))) return false } - c += 1 + cfor(0)(_ < tile.rows, _ + 1) { r ⇒ + cfor(0)(_ < tile.cols, _ + 1) { c ⇒ + if (tile.cellType.isFloatingPoint) { + if (!isCellTrue(tile.getDouble(c, r))) return false + } + else { + if (!isCellTrue(tile.get(c, r))) return false + } } - c = 0; r += 1 } - true } - - -} \ No newline at end of file +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala index 03eb1a40f..4224ef622 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala @@ -22,6 +22,7 @@ package org.locationtech import com.typesafe.config.ConfigFactory import com.typesafe.scalalogging.LazyLogging +import geotrellis.raster.isData import geotrellis.raster.{Tile, TileFeature} import geotrellis.spark.{ContextRDD, Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.rdd.RDD @@ -134,4 +135,9 @@ package object rasterframes extends StandardColumns override val selfType: TypeTag[SpaceTimeKey] = implicitly } } + + /** Test if a cell value evaluates to true: it is not NoData and it is non-zero */ + def isCellTrue(v: Double): Boolean = isData(v) & v != 0.0 + /** Test if a cell value evaluates to true: it is not NoData and it is non-zero */ + def isCellTrue(v: Int): Boolean = isData(v) & v != 0 } diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 7fad416a0..d82eaec9a 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -337,7 +337,7 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_is_no_data_tile") } - it("should evaluate exists and forall") { + it("should evaluate exists and for_all") { val df0 = Seq(zero).toDF("tile") df0.select(rf_exists($"tile")).first() should be(false) df0.select(rf_for_all($"tile")).first() should be(false) diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index f30660f14..8fbb5f524 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -229,7 +229,7 @@ Generate a `tile` with the values from `data_tile`, with nodata in cells where t Boolean rf_is_no_data_tile(Tile) -Returns true if `tile` contains only nodata. By definition returns false if cell type does not support nodata. +Returns true if `tile` contains only nodata. By definition returns false if cell type does not support nodata. To count nodata cells or data cells, see @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_local_no_data_cells`](reference.md#rf-agg-local-no-data-cells), and @ref:[`rf_agg_local_data_cells`](reference.md#rf-agg-local-data-cells). This function is distinguished from @ref:[`rf_for_all`](reference.md#rf-for-all), which tests that values are not nodata and nonzero. #### rf_with_no_data @@ -477,13 +477,13 @@ Return the count of data cells in the `tile`. Boolean rf_exists(Tile tile) -Returns true if any cells in the tile are true (non-zero and not NoData). +Returns true if any cells in the tile are true (non-zero and not nodata). #### rf_for_all Boolean rf_for_all(Tile tile) -Returns true if all cells in the tile are true (non-zero and not NoData). +Returns true if all cells in the tile are true (non-zero and not nodata). See also @ref:[`rf_is_no_data_tile](reference.md#rf-is-no-data-tile), which tests that all cells are nodata. #### rf_tile_stats diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index ee0e4358c..4ef33a7cf 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -120,7 +120,7 @@ def test_rasterize(self): withRaster.show() def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', rf_reproject_geometry('center', 'EPSG:4326', 'EPSG:3857')) + reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) reprojected.show() def test_aggregations(self): @@ -224,21 +224,17 @@ def test_resample(self): self.assertTrue(result == 1) # short hand for all values are true def test_exists_for_all(self): - df = self.rf.withColumn('should_exist', tile_ones(5, 5, 'int8')) \ - .withColumn('should_not_exist', tile_zeros(5, 5, 'int8')) + df = self.rf.withColumn('should_exist', rf_make_ones_tile(5, 5, 'int8')) \ + .withColumn('should_not_exist', rf_make_zeros_tile(5, 5, 'int8')) - should_exist = df.select(exists(df.should_exist).alias('se')).take(1)[0].se - should_any = df.select(any(df.should_exist).alias('se')).take(1)[0].se + should_exist = df.select(rf_exists(df.should_exist).alias('se')).take(1)[0].se self.assertTrue(should_exist) - self.assertTrue(should_any) - should_not_exist = df.select(exists(df.should_not_exist).alias('se')).take(1)[0].se - should_not_any = df.select(any(df.should_not_exist).alias('se')).take(1)[0].se + should_not_exist = df.select(rf_exists(df.should_not_exist).alias('se')).take(1)[0].se self.assertTrue(not should_not_exist) - self.assertTrue(not should_not_any) - self.assertTrue(df.select(for_all(df.should_exist).alias('se')).take(1)[0].se) - self.assertTrue(not df.select(for_all(df.should_not_exist).alias('se')).take(1)[0].se) + self.assertTrue(df.select(rf_for_all(df.should_exist).alias('se')).take(1)[0].se) + self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) def test_geomesa_pyspark(self): diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index b1aae5d84..981cbac32 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -156,7 +156,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_local_unequal_int(col: Column, scalar: Int): Column = rf_local_unequal[Int](col, scalar) - def rf_reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { + def st_reproject(geometryCol: Column, srcName: String, dstName: String): Column = { val src = LazyCRS(srcName) val dst = LazyCRS(dstName) st_reproject(geometryCol, src, dst) From c97af4ad35beb8a08c6725388b7673791bc8ef72 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 1 May 2019 16:20:21 -0400 Subject: [PATCH 067/380] Misc branch sync items. --- .circleci/config.yml | 2 - build/circleci/Dockerfile | 67 +++++++++++++++++++ build/circleci/README.md | 6 ++ .../rasterframes/RasterFunctions.scala | 20 ++++-- .../expressions/TileAssembler.scala | 28 +++++++- .../rasterframes/expressions/package.scala | 1 + .../rasterframes/functions/package.scala | 9 ++- .../rasterframes/ExplodeSpec.scala | 49 ++++++++++++-- .../python/tests/PyRasterFramesTests.py | 2 +- .../rasterframes/py/PyRFContext.scala | 2 +- 10 files changed, 169 insertions(+), 17 deletions(-) create mode 100644 build/circleci/Dockerfile create mode 100644 build/circleci/README.md diff --git a/.circleci/config.yml b/.circleci/config.yml index 787af5316..da9f0e538 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -69,7 +69,6 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get install python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: *unsetenv @@ -85,7 +84,6 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get install python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: cat /dev/null | sbt publish diff --git a/build/circleci/Dockerfile b/build/circleci/Dockerfile new file mode 100644 index 000000000..da964c32a --- /dev/null +++ b/build/circleci/Dockerfile @@ -0,0 +1,67 @@ +FROM circleci/openjdk:8-jdk + +ENV OPENJPEG_VERSION 2.3.0 +ENV GDAL_VERSION 2.3.3 +ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ + +# most of these libraries required for +# python-pip pandoc && pip install setuptools => required for pyrasterframes testing +RUN sudo apt-get update && \ + sudo apt-get install -y \ + python-pip pandoc \ + wget \ + gcc g++ build-essential \ + libcurl4-gnutls-dev \ + libproj-dev \ + libgeos-dev \ + libhdf4-alt-dev \ + libhdf5-serial-dev \ + bash-completion \ + cmake \ + imagemagick \ + libpng-dev \ + swig \ + ant \ + && sudo apt-get clean all \ + && pip install setuptools + +# install OpenJPEG +RUN cd /tmp && \ + wget https://github.com/uclouvain/openjpeg/archive/v${OPENJPEG_VERSION}.tar.gz && \ + tar -xf v${OPENJPEG_VERSION}.tar.gz && \ + cd openjpeg-${OPENJPEG_VERSION}/ && \ + mkdir build && \ + cd build && \ + cmake .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/ && \ + make -j && \ + sudo make install && \ + cd /tmp && rm -Rf v${OPENJPEG_VERSION}.tar.gz openjpeg* + +# Compile and install GDAL with Java bindings +RUN cd /tmp && \ + wget http://download.osgeo.org/gdal/${GDAL_VERSION}/gdal-${GDAL_VERSION}.tar.gz && \ + tar -xf gdal-${GDAL_VERSION}.tar.gz && \ + cd gdal-${GDAL_VERSION} && \ + ./configure \ + --with-curl \ + --with-hdf4 \ + --with-hdf5 \ + --with-geos \ + --with-geotiff=internal \ + --with-hide-internal-symbols \ + --with-java=$JAVA_HOME \ + --with-libtiff=internal \ + --with-libz=internal \ + --with-mrf \ + --with-openjpeg \ + --with-threads \ + --without-jp2mrsid \ + --without-netcdf \ + --without-ecw \ + && \ + make -j 8 && \ + sudo make install && \ + cd swig/java && \ + sudo make install && \ + sudo ldconfig && \ + cd /tmp && rm -Rf gdal* diff --git a/build/circleci/README.md b/build/circleci/README.md new file mode 100644 index 000000000..69b9cdff3 --- /dev/null +++ b/build/circleci/README.md @@ -0,0 +1,6 @@ +# CircleCI Dockerfile Build file + +```bash +docker build -t s22s/rasterframes-circleci:latest . +docker push s22s/rasterframes-circleci:latest +``` diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index abf4d7c31..08e1f35b8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -274,15 +274,27 @@ trait RasterFunctions { udf(F.rasterize(_: Geometry, _: Geometry, _: Int, cols, rows)).apply(geometry, bounds, value) ) - /** Reproject a column of geometry from one CRS to another. */ + /** Reproject a column of geometry from one CRS to another. + * @param sourceGeom Geometry column to reproject + * @param srcCRS Native CRS of `sourceGeom` as a literal + * @param dstCRSCol Destination CRS as a column + */ def st_reproject(sourceGeom: Column, srcCRS: CRS, dstCRSCol: Column): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRSCol) - /** Reproject a column of geometry from one CRS to another. */ - def st_reproject(sourceGeom: Column, srcCRSCol: Column, dstCRS: CRS): TypedColumn[Any, Geometry] = + /** Reproject a column of geometry from one CRS to another. + * @param sourceGeom Geometry column to reproject + * @param srcCRSCol Native CRS of `sourceGeom` as a column + * @param dstCRS Destination CRS as a literal + */ + def st_reproject(sourceGeom: Column, srcCRSCol: Column, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRSCol, dstCRS) - /** Reproject a column of geometry from one CRS to another. */ + /** Reproject a column of geometry from one CRS to another. + * @param sourceGeom Geometry column to reproject + * @param srcCRS Native CRS of `sourceGeom` as a literal + * @param dstCRS Destination CRS as a literal + */ def st_reproject(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRS) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala index fe284546a..c3fe0e17b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/TileAssembler.scala @@ -28,7 +28,7 @@ import org.locationtech.rasterframes.util._ import geotrellis.raster.{DataType => _, _} import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions.aggregate.{ImperativeAggregate, TypedImperativeAggregate} -import org.apache.spark.sql.catalyst.expressions.{Expression, ImplicitCastInputTypes} +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription, ImplicitCastInputTypes} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} import spire.syntax.cfor._ @@ -39,6 +39,24 @@ import org.locationtech.rasterframes.TileType * * @since 9/24/17 */ +@ExpressionDescription( + usage = "_FUNC_(colIndex, rowIndex, cellValue, tileCols, tileRows) - Assemble tiles from set of column and row indices and cell values.", + arguments = """ + Arguments: + * colIndex - column to place the cellValue in the generated tile + * rowIndex - row to place the cellValue in the generated tile + * cellValue - numeric value to place in the generated tile at colIndex and rowIndex + * tileCols - number of columns in the generated tile + * tileRows - number of rows in the generated tile""", + examples = """ + Examples: + > SELECT _FUNC_(column_index, row_index, cell0, 10, 10) as tile; + ... + > SELECT _FUNC_(column_index, row_index, tile, 10, 10) as tile2 + FROM (SELECT rf_explode_tiles(rf_make_constant_tile(4, 10, 10, 'int8raw')) as tile) + ... + """ +) case class TileAssembler( colIndex: Expression, rowIndex: Expression, @@ -49,11 +67,17 @@ case class TileAssembler( inputAggBufferOffset: Int = 0) extends TypedImperativeAggregate[TileBuffer] with ImplicitCastInputTypes { + def this(colIndex: Expression, + rowIndex: Expression, + cellValue: Expression, + tileCols: Expression, + tileRows: Expression) = this(colIndex, rowIndex, cellValue, tileCols, tileRows, 0, 0) + override def children: Seq[Expression] = Seq(colIndex, rowIndex, cellValue, tileCols, tileRows) override def inputTypes = Seq(ShortType, ShortType, DoubleType, ShortType, ShortType) - override def prettyName: String = "assemble_tiles" + override def prettyName: String = "rf_assemble_tiles" override def withNewMutableAggBufferOffset(newMutableAggBufferOffset: Int): ImperativeAggregate = copy(mutableAggBufferOffset = newMutableAggBufferOffset) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 0905dad39..110b2ab25 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -64,6 +64,7 @@ package object expressions { registry.registerExpression[Add]("rf_local_add") registry.registerExpression[Subtract]("rf_local_subtract") + registry.registerExpression[TileAssembler]("rf_assemble_tile") registry.registerExpression[ExplodeTiles]("rf_explode_tiles") registry.registerExpression[GetCellType]("rf_cell_type") registry.registerExpression[SetCellType]("rf_convert_cell_type") diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index 17b553336..c72efb52d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -68,6 +68,10 @@ package object functions { } } + private[rasterframes] val arrayToTile: (Array[_], Int, Int) ⇒ Tile = (a, cols, rows) ⇒ { + arrayToTile(cols, rows).apply(a) + } + /** Set the tile's no-data value. */ private[rasterframes] def withNoData(nodata: Double) = safeEval[Tile, Tile](_.withNoData(Some(nodata))) @@ -86,6 +90,8 @@ package object functions { } } + + /** Alias for constant tiles of zero */ private[rasterframes] val tileZeros: (Int, Int, String) ⇒ Tile = (cols, rows, cellTypeName) ⇒ makeConstantTile(0, cols, rows, cellTypeName) @@ -143,7 +149,8 @@ package object functions { sqlContext.udf.register("rf_cell_types", cellTypes) sqlContext.udf.register("rf_rasterize", rasterize) - sqlContext.udf.register("st_reproject", reprojectGeometryCRSName) + sqlContext.udf.register("rf_array_to_tile", arrayToTile) + } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala index 2a44bf3cf..021b528d1 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala @@ -110,7 +110,7 @@ class ExplodeSpec extends TestEnvironment with TestData { } it("should convert an array into a tile") { - val tile = FloatConstantTile(1.1f, 10, 10, FloatCellType) + val tile = TestData.randomTile(10, 10, FloatCellType) val df = Seq[Tile](tile, null).toDF("tile") val arrayDF = df.withColumn("tileArray", rf_tile_to_array_double($"tile")) @@ -120,6 +120,11 @@ class ExplodeSpec extends TestEnvironment with TestData { assert(result.toArrayDouble() === tile.toArrayDouble()) + // Same round trip, but with SQL expression for rf_array_to_tile + val resultSql = arrayDF.selectExpr("rf_array_to_tile(tileArray, 10, 10) as backToTile").as[Tile].first + + assert(resultSql.toArrayDouble() === tile.toArrayDouble()) + val hasNoData = back.withColumn("withNoData", rf_with_no_data($"backToTile", 0)) val result2 = hasNoData.select($"withNoData".as[Tile]).first @@ -128,7 +133,8 @@ class ExplodeSpec extends TestEnvironment with TestData { } it("should reassemble single exploded tile") { - val df = Seq[Tile](byteArrayTile).toDF("tile") + val tile = TestData.randomTile(10, 10, FloatCellType) + val df = Seq[Tile](tile).toDF("tile") .select(rf_explode_tiles($"tile")) val assembled = df.agg( @@ -136,11 +142,44 @@ class ExplodeSpec extends TestEnvironment with TestData { COLUMN_INDEX_COLUMN, ROW_INDEX_COLUMN, TILE_COLUMN, - 3, 3, byteArrayTile.cellType + 10, 10, tile.cellType )).as[Tile] val result = assembled.first() - assert(result === byteArrayTile) + assert(result === tile) + + val assembledSqlExpr = df.selectExpr("rf_assemble_tile(column_index, row_index, tile, 10, 10)") + + val resultSql = assembledSqlExpr.as[Tile].first() + assert(resultSql === tile) + + checkDocs("rf_assemble_tile") + } + + it("should reassemble single exploded tile with user-defined nodata") { + val ct = FloatUserDefinedNoDataCellType(-99) + val tile = TestData.injectND(3)(TestData.randomTile(5, 5, ct)) + val df = Seq[Tile](tile).toDF("tile") + .select(rf_explode_tiles($"tile")) + + val assembled = df.agg(rf_assemble_tile( + COLUMN_INDEX_COLUMN, + ROW_INDEX_COLUMN, + TILE_COLUMN, + 5, 5, ct + )).as[Tile] + + val result = assembled.first() + assert(result === tile) + + // and with SQL API + logger.info(df.schema.treeString) + + val assembledSqlExpr = df.selectExpr(s"rf_convert_cell_type(rf_assemble_tile(column_index, row_index, tile, 5, 5), '${ct.toString()}') as tile") + + val resultSql = assembledSqlExpr.as[Tile].first() + assert(resultSql === tile) + assert(resultSql.cellType === ct) } it("should reassemble multiple exploded tiles") { @@ -149,8 +188,6 @@ class ExplodeSpec extends TestEnvironment with TestData { val exploded = tinyTiles.select(tinyTiles.spatialKeyColumn, rf_explode_tiles(tinyTiles.tileColumns.head)) - //exploded.printSchema() - val assembled = exploded.groupBy(tinyTiles.spatialKeyColumn) .agg( rf_assemble_tile( diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 1a7174691..f12c639e3 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -120,7 +120,7 @@ def test_rasterize(self): withRaster.show() def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', rf_reproject_geometry('center', 'EPSG:4326', 'EPSG:3857')) + reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) reprojected.show() def test_aggregations(self): diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index b1aae5d84..981cbac32 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -156,7 +156,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_local_unequal_int(col: Column, scalar: Int): Column = rf_local_unequal[Int](col, scalar) - def rf_reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { + def st_reproject(geometryCol: Column, srcName: String, dstName: String): Column = { val src = LazyCRS(srcName) val dst = LazyCRS(dstName) st_reproject(geometryCol, src, dst) From cc77f127c687f82223de0a5d5e445af17cf3c474 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 2 May 2019 10:04:04 -0400 Subject: [PATCH 068/380] Disabled use of GDAL-enabled image in CircleCI until this bug is fixed: https://github.com/geotrellis/gdal-warp-bindings/issues/37 --- .circleci/config.yml | 2 +- project/RFDependenciesPlugin.scala | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index da9f0e538..acf469090 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,7 +5,7 @@ _defaults: &defaults environment: TERM: dumb docker: - - image: s22s/rasterframes-circleci:latest + - image: circleci/openjdk:8-jdk _setenv: &setenv name: set CloudRepo credentials diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index 8beeafa2d..3c1fbd113 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -20,7 +20,7 @@ * */ -import sbt.Keys.resolvers +import sbt.Keys._ import sbt._ object RFDependenciesPlugin extends AutoPlugin { @@ -59,6 +59,7 @@ object RFDependenciesPlugin extends AutoPlugin { // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py rfSparkVersion := "2.3.2", rfGeoTrellisVersion := "2.2.0", - rfGeoMesaVersion := "2.2.1" + rfGeoMesaVersion := "2.2.1", + //dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.bf51177" ) } From 4398a05365979c3f75da9cc2ceecef2421f02fcd Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 2 May 2019 10:42:58 -0400 Subject: [PATCH 069/380] python rastersource reader tests Signed-off-by: Jason T. Brown --- .../RasterSourceDataSourceSpec.scala | 2 +- .../python/tests/PyRasterFramesTests.py | 80 +++++++++++++------ .../rasterframes/py/PyRFContext.scala | 2 +- 3 files changed, 58 insertions(+), 26 deletions(-) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index e21a2472a..25180b1ea 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -140,7 +140,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { val df = spark.read.rastersource .fromTable("pathsTable", "B1", "B2", "B3") -// .withTileDimensions(128, 128) + .withTileDimensions(128, 128) .load() df.schema.size should be(6) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index fc4972bf3..88c336f2a 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -23,7 +23,6 @@ def _rounded_compare(val1, val2): class RasterFunctionsTest(unittest.TestCase): - @classmethod def setUpClass(cls): @@ -120,7 +119,7 @@ def test_rasterize(self): withRaster.show() def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', rf_reproject_geometry('center', 'EPSG:4326', 'EPSG:3857')) + reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) reprojected.show() def test_aggregations(self): @@ -292,40 +291,73 @@ def some_point(g): pandas_df_out.poly_len.values ) + def test_raster_source_reader(self): - # much the same as RasterSourceDataSourceSpec here + import pandas as pd + # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run + def l8path(b): assert b in range(1, 12) - #ok base = "https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/199/026/LC08_L1TP_199026_20180919_20180928_01_T1/LC08_L1TP_199026_20180919_20180928_01_T1_B{}.TIF" - base='s3://s22s-demeter-data-assets-prod/MOD11A1.006/18/06/2018153/MOD11A1.A2018153.h18v06.006.2018154084835_LSTD_B01.TIF' - #ok - # base = 'file:///Users/jbrown/src/rasterframes/core/target/scala-2.11/test-classes/L8-B{}-Elkton-VA.tiff' - - # not ok base = '/Users/jbrown/src/rasterframes/core/target/scala-2.11/test-classes/L8-B{}-Elkton-VA.tiff' return base.format(b) - # band_paths = self.spark.createDataFrame([{'B1': l8path(1), 'B2': l8path(2), 'B3': l8path(3)}]) - # band_paths.createOrReplaceTempView('pathsTable') + path_param = '\n'.join([l8path(b) for b in [1, 2, 3]]) # "http://foo.com/file1.tif,http://foo.com/file2.tif" + tile_size = 512 df = self.spark.read.format('rastersource') \ - .options(tileDimensions='32, 32', #Elkton files are 186 by 169 - path=l8path(1), - ) \ - .load() - #[l8path(b) for b in [1,2,3]]) \ + .options(paths=path_param, tileDimensions='{},{}'.format(tile_size, tile_size)) \ + .load() + # schema is tile_path and tile df.printSchema() + self.assertTrue(len(df.columns) == 2 and 'tile_path' in df.columns and 'tile' in df.columns) - self.assertTrue(len(df.columns) == 2) # tile_path and tile - tile_size_df = df.select(tile_dimensions(df.tile).rows.alias('r'), tile_dimensions(df.tile).cols.alias('c'))\ - .groupby(['r','c']).count().toPandas() + # the most common tile dimensions should be as passed to `options`, showing that options are correctly applied + tile_size_df = df.select(rf_dimensions(df.tile).rows.alias('r'), rf_dimensions(df.tile).cols.alias('c'))\ + .groupby(['r', 'c']).count().toPandas() + most_common_size = tile_size_df.loc[tile_size_df['count'].idxmax()] + self.assertTrue(most_common_size.r == tile_size and most_common_size.c == tile_size) - print(tile_size_df) - # the most common should be as given in options above. - self.assertTrue(tile_size_df.r.value_counts().idxmax() == 32) - self.assertTrue(tile_size_df.c.value_counts().idxmax() == 32) # columns # all rows are from a single source URI - self.assertTrue(df.select(df.tile_path).distinct().count() == 1) + path_count = df.groupby(df.tile_path).count() + print(path_count.toPandas()) + self.assertTrue(path_count.count() == 3) + + ### Similar to the scala side's `fromTable`, read from a table with columns giving URI paths + + scene_dict = { + 1: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/041/LC08_L1TP_015041_20190305_20190309_01_T1/LC08_L1TP_015041_20190305_20190309_01_T1_B{}.TIF', + 2: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/042/LC08_L1TP_015042_20190305_20190309_01_T1/LC08_L1TP_015042_20190305_20190309_01_T1_B{}.TIF', + 3: 'http://landsat-pds.s3.amazonaws.com/c1/L8/016/041/LC08_L1TP_016041_20190224_20190309_01_T1/LC08_L1TP_016041_20190224_20190309_01_T1_B{}.TIF', + } + + def path(scene, band): + assert band in range(1, 12) + p = scene_dict[scene] + return p.format(band) + + path_table_hive_name = 'path_table' + # Create a pandas dataframe (makes it easy to create spark df) + path_pandas = pd.DataFrame([ + {'b1': path(1, 1), 'b2': path(1, 2), 'b3': path(1, 3)}, + {'b1': path(2, 1), 'b2': path(2, 2), 'b3': path(2, 3)}, + {'b1': path(3, 1), 'b2': path(3, 2), 'b3': path(3, 3)}, + ]) + # comma separated list of column names containing URI's to read. + csv_columns = ','.join(path_pandas.columns.tolist()) # 'b1,b2,b3' + path_table = self.spark.createDataFrame(path_pandas) + path_table.createOrReplaceTempView(path_table_hive_name) + + path_df = self.spark.read.format('rastersource') \ + .options(pathTable=path_table_hive_name, pathTableColumns=csv_columns, + tileDimensions='512,512') \ + .load() + + path_df.printSchema() + self.assertTrue(len(path_df.columns) == 6) # three bands times {path, tile} + self.assertTrue(path_df.select('b1_path').distinct().count() == 3) # as per scene_dict + b1_paths_maybe = path_df.select('b1_path').distinct().collect() + b1_paths = [s.format('1') for s in scene_dict.values()] + self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) def suite(): diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index b1aae5d84..981cbac32 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -156,7 +156,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_local_unequal_int(col: Column, scalar: Int): Column = rf_local_unequal[Int](col, scalar) - def rf_reproject_geometry(geometryCol: Column, srcName: String, dstName: String): Column = { + def st_reproject(geometryCol: Column, srcName: String, dstName: String): Column = { val src = LazyCRS(srcName) val dst = LazyCRS(dstName) st_reproject(geometryCol, src, dst) From 550e43fdfcb120a3579d2ca900ca7d6d3d6dcdf1 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 2 May 2019 10:55:32 -0400 Subject: [PATCH 070/380] When GDAL docker image is not used, need to install python setuptools. --- .circleci/config.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index acf469090..1fffd77f6 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -69,6 +69,7 @@ jobs: - restore_cache: <<: *restore_cache + - run: sudo apt-get install python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: *unsetenv @@ -84,6 +85,7 @@ jobs: - restore_cache: <<: *restore_cache + - run: sudo apt-get install python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: cat /dev/null | sbt publish From 7d268a2f0b30fdab00a789e4516a2bbabebcf688 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 2 May 2019 14:29:01 -0400 Subject: [PATCH 071/380] Testing noise elimination. --- core/src/it/resources/log4j.properties | 4 ++-- core/src/test/resources/log4j.properties | 4 ++-- .../scala/org/locationtech/rasterframes/RasterFrameSpec.scala | 1 - .../datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala | 2 +- .../datasource/geotiff/GeoTiffDataSourceSpec.scala | 4 ++-- .../datasource/geotrellis/GeoTrellisDataSourceSpec.scala | 2 +- experimental/src/it/resources/log4j.properties | 2 +- .../datasource/geojson/GeoJsonDataSourceTest.scala | 3 +-- 8 files changed, 10 insertions(+), 12 deletions(-) diff --git a/core/src/it/resources/log4j.properties b/core/src/it/resources/log4j.properties index 8a20b7b7e..1135e4b34 100644 --- a/core/src/it/resources/log4j.properties +++ b/core/src/it/resources/log4j.properties @@ -37,8 +37,8 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.org.locationtech.rasterframes=DEBUG -log4j.logger.org.locationtech.rasterframes.ref=INFO +log4j.logger.org.locationtech.rasterframes=WARN +log4j.logger.org.locationtech.rasterframes.ref=WARN log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/core/src/test/resources/log4j.properties b/core/src/test/resources/log4j.properties index 38dc57f1e..39e791fa3 100644 --- a/core/src/test/resources/log4j.properties +++ b/core/src/test/resources/log4j.properties @@ -37,8 +37,8 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.org.locationtech.rasterframes=DEBUG -log4j.logger.org.locationtech.rasterframes.ref=DEBUG +log4j.logger.org.locationtech.rasterframes=WARN +log4j.logger.org.locationtech.rasterframes.ref=WARN log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala index 98ecd55fa..f8a3c0ac9 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala @@ -113,7 +113,6 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } catch { case NonFatal(ex) ⇒ - rf.printSchema() println(rf.schema.prettyJson) throw ex } diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala index 0ed2deefa..d50ef2b62 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala @@ -43,7 +43,7 @@ class GeoTiffCollectionDataSourceSpec assert(df.select("path").distinct().count() === expected) - df.show(false) + // df.show(false) } } } diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index c24a0765f..04a532503 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -59,8 +59,8 @@ class GeoTiffDataSourceSpec .geotiff .loadRF(nonCogPath) - println(rf.count()) - rf.show(false) + //println(rf.count()) + //rf.show(false) assert(rf.count() > 1) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 23e9283be..6333138aa 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -425,7 +425,7 @@ class GeoTrellisDataSourceSpec .withColumnRenamed(GEOMETRY_COLUMN.columnName, "foobar") assert(numFilters(df) === 1) - assert(df.count > 0, df.printSchema) + assert(df.count > 0, df.schema.treeString) } it("should handle dropped spatial filter columns") { diff --git a/experimental/src/it/resources/log4j.properties b/experimental/src/it/resources/log4j.properties index 5cc16f4db..85cd816dd 100644 --- a/experimental/src/it/resources/log4j.properties +++ b/experimental/src/it/resources/log4j.properties @@ -35,7 +35,7 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.org.locationtech.rasterframes=DEBUG +log4j.logger.org.locationtech.rasterframes=WARN log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala b/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala index 8edab293f..000193085 100644 --- a/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala +++ b/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala @@ -60,8 +60,7 @@ class GeoJsonDataSourceTest extends TestEnvironment { .option(GeoJsonDataSource.INFER_SCHEMA, true) .load(example2) - results.show() + results.count() should be (8) } } - } From b1ebac00475b603777ed87d5c9ca37286d429f37 Mon Sep 17 00:00:00 2001 From: Phil Varner Date: Tue, 30 Apr 2019 16:32:04 -0400 Subject: [PATCH 072/380] Reapplication of MRF test change set --- .../rasterframes/ref/RasterSourceIT.scala | 40 +++++--- core/src/main/resources/reference.conf | 18 ++-- ...4.A2019111.h30v06.006.2019120033434_01.idx | Bin 0 -> 400 bytes ...4.A2019111.h30v06.006.2019120033434_01.lrc | Bin 0 -> 17514 bytes ...4.A2019111.h30v06.006.2019120033434_01.mrf | 12 +++ ...11.h30v06.006.2019120033434_01.mrf.aux.xml | 92 ++++++++++++++++++ .../locationtech/rasterframes/TestData.scala | 12 ++- 7 files changed, 151 insertions(+), 23 deletions(-) create mode 100644 core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.idx create mode 100644 core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.lrc create mode 100644 core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf create mode 100644 core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf.aux.xml diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 591332a5f..33a951853 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -21,13 +21,12 @@ package org.locationtech.rasterframes.ref +import java.lang.Math.ceil import java.net.URI -import org.locationtech.rasterframes.util.time -import org.locationtech.rasterframes.TestData -import geotrellis.vector.Extent import org.locationtech.rasterframes -import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes.util.time +import org.locationtech.rasterframes.{NOMINAL_TILE_SIZE, TestData, TestEnvironment} /** * @@ -35,12 +34,6 @@ import org.locationtech.rasterframes.TestEnvironment * @since 8/22/18 */ class RasterSourceIT extends TestEnvironment with TestData { - def sub(e: Extent) = { - val c = e.center - val w = e.width - val h = e.height - Extent(c.x, c.y, c.x + w * 0.1, c.y + h * 0.1) - } describe("RasterSource.readAll") { it("should return consistently ordered tiles across bands for a given scene") { @@ -70,9 +63,34 @@ class RasterSourceIT extends TestEnvironment with TestData { } describe("GDAL support") { + it("should read JPEG2000 scene") { - val src = RasterSource(localSentinel.toURI) + val src = RasterSource(localSentinel) src.readAll().flatMap(_.tile.statisticsDouble).size should be (64) } + + it("should read small MRF scene with one band converted from MODIS HDF") { + val (expectedTileCount, _) = expectedTileCountAndBands(2400, 2400) + RasterSource(modisConvertedMrfPath).readAll().flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + it("should read remote HTTP MRF scene") { + val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) + RasterSource(remoteHttpMrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + it("should read remote S3 MRF scene") { + val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) + RasterSource(remoteS3MrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + } + + private def expectedTileCountAndBands(x:Int, y:Int, bandCount:Int = 1) = { + val imageDimensions = Seq(x.toDouble, y.toDouble) + val tilesPerBand = imageDimensions.map(x ⇒ ceil(x / NOMINAL_TILE_SIZE)).product + val bands = Range(0, bandCount) + val expectedTileCount = tilesPerBand * bands.length + (expectedTileCount, bands) } } diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index b4ce78b06..77597ab89 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -4,13 +4,13 @@ rasterframes { } vlm.gdal { - options { - // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options - //CPL_DEBUG = "ON" - AWS_REQUEST_PAYER = "requester" - GDAL_DISABLE_READDIR_ON_OPEN = "YES" - CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.jp2" - } - // set this to `false` if CPL_DEBUG is `ON` - //useExceptions = false + options { + // See https://trac.osgeo.org/gdal/wiki/ConfigOptions for options + //CPL_DEBUG = "OFF" + AWS_REQUEST_PAYER = "requester" + GDAL_DISABLE_READDIR_ON_OPEN = "YES" + CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.jp2,.mrf,.idx,.lrc,.mrf.aux.xml" + } + // set this to `false` if CPL_DEBUG is `ON` + useExceptions = true } \ No newline at end of file diff --git a/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.idx b/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.idx new file mode 100644 index 0000000000000000000000000000000000000000..f86df2587247a79736c43c4d5bb2a2c9e554f92a GIT binary patch literal 400 zcmZQzAPL0aPz@F5alj#uCd@MjDzFzq^F~5wW^D*9&;p@}H4ma1LCPF~uo*)kw45Y_ n7N|t1p@gM338EY3KC4Sm)7&7mwFDYJ4voJAjsFV5=V$-`!1N4! literal 0 HcmV?d00001 diff --git a/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.lrc b/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.lrc new file mode 100644 index 0000000000000000000000000000000000000000..75163d4a2e243304fadf5ba87be254d616713531 GIT binary patch literal 17514 zcmeI2KWG$D5XR^2yWE}}e}lTZmwz zjbJILWc>p+f(n8bVlD=;Q9KP|h%wKZZxVBmHG-fRG6(x+_Pu%Y=6?GQ?%Umi$4?*Y zE=9y2Y50iQ6!w42d3H~2$|#Pn*96Tc;uHaGiKeDvqjdG=%WMb}hicuDX?#%)B?$%8O> zf-<701mpGV#0y_%9%}-pqt>eAX-8M_Jcl#WC;BzsiE*?GV}-@4kP(+LqPhn5YhWt^ zTY3=@KgP9n{v-G5?&PAYlD|M*7`s5dY#j*$N6JICQjRNMIMts*ggT@~M|o}|iX9g5 za;-h(H`Lkk=C2{pjZ5HgL)L!y1x($l8zv&Pi@z0RtJgvO5+-#WenwfpbGuJqcRq}O z5ikNqzz7%tBVYuKfDyuHx0-;xiU}A%%|eLG@G|L{EA06R%<2qermo-b#Ot zTEa=K#I?=UP>H(|P9dZiUcts;9@d9|DJ}%nTVXuKjQp923LIZPQR0w@E(R1cwh&l^ zWl^W%)y?6XzDAqxyPYY@Hda{9@%@VtZk9vk0etG^o%Zn79$Xs%BVYuKfDu?D1ir{^ z;i!g}w%C`45tBBN!ODSzXM)-+0bgDT*A^*>90GG*_V837~k-w>dL-}_v@ zam%*t-F;?_!+*OEI$e+Z%?|Bxdz|gzKik9h)_B%kuD|jB$Z{G1BVYuKfDtePM!*Od zfz?hR>uK=f+oT8h0p+hBTIc*A;9&p& literal 0 HcmV?d00001 diff --git a/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf b/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf new file mode 100644 index 000000000..8245c4a7e --- /dev/null +++ b/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf @@ -0,0 +1,12 @@ + + + + + LERC + + + + + PROJCS["unnamed",GEOGCS["Unknown datum based upon the custom spheroid",DATUM["Not specified (based on custom spheroid)",SPHEROID["Custom spheroid",6371007.181,0]],PRIMEM["Greenwich",0],UNIT["degree",0.0174532925199433]],PROJECTION["Sinusoidal"],PARAMETER["longitude_of_center",0],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["Meter",1]] + + diff --git a/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf.aux.xml b/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf.aux.xml new file mode 100644 index 000000000..5a18f6944 --- /dev/null +++ b/core/src/test/resources/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf.aux.xml @@ -0,0 +1,92 @@ + + + LERC + PIXEL + + + 06121997 + MODIS + MODIS + Terra + Aqua + MODIS + MODIS + Passed + Passed was set as a default value. More algorithm will be developed + 0 + AMBRALS_V4.0R1 + v1.0500m + 15.0 + 463.312716527778 + volume + 2400 + 2400 + Day + Mandatory QA: + 0 = processed, good quality (full BRDF inversions) + 1 = processed, see other QA (magnitude BRDF inversions) + + 6.1 + 150.120692476232 + N + False + 75.0 + 86400 + 43200 + 19.9448109058663, 30.0666177912155, 29.9990071837477, 19.8789125843729 + 127.31379517564, 138.161359988435, 150.130532080915, 138.321766284772 + 1, 2, 3, 4 + HDFEOS_V2.19 + 30 + 10.5067/MODIS/MCD43A4.006 + 10.5067/MODIS/MCD43A4.006 + http://dx.doi.org + http://dx.doi.org + MYD09GA.A2019113.h30v06.006.2019115025936.hdf, MYD09GA.A2019114.h30v06.006.2019117021858.hdf, MYD09GA.A2019115.h30v06.006.2019117044251.hdf, MYD09GA.A2019116.h30v06.006.2019118031111.hdf, MYD09GA.A2019117.h30v06.006.2019119025916.hdf, MYD09GA.A2019118.h30v06.006.2019120030848.hdf, MOD09GA.A2019113.h30v06.006.2019115032521.hdf, MOD09GA.A2019114.h30v06.006.2019116030646.hdf, MOD09GA.A2019115.h30v06.006.2019117050730.hdf, MOD09GA.A2019116.h30v06.006.2019118032616.hdf, MOD09GA.A2019117.h30v06.006.2019119032020.hdf, MOD09GA.A2019118.h30v06.006.2019120032257.hdf, MCD43DB.A2019110.6.h30v06.hdf + MCD43A4.A2019111.h30v06.006.2019120033434.hdf + 6.1.34 + MODIS/Terra+Aqua BRDF/Albedo Nadir BRDF-Adjusted Ref Daily L3 Global - 500m + BRDF_Albedo_Band_Mandatory_Quality_Band1 + 0 + 500m + 29.9999999973059 + 1 + NOT SET + 0 + 0 + 0 + 100 + 0 + 6.0.42 + MODAPS + Linux minion7043 3.10.0-957.5.1.el7.x86_64 #1 SMP Fri Feb 1 14:54:57 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux + 2019-04-30T03:34:48.000Z + 0 + 0 + 99 + 0 + 2019-04-13 + 00:00:00.000000 + 2019-04-28 + 23:59:59.999999 + processed once + further update is anticipated + Not Investigated + See http://landweb.nascom/nasa.gov/cgi-bin/QA_WWW/qaFlagPage.cgi?sat=aqua the product Science Quality status. + 06121997 + MCD43A4 + 19.9999999982039 + 2015 + 51030006 + concatenated flags + 0, 254 + 6 + 6 + 127.701332684185 + 255 + + + BRDF_Albedo_Band_Mandatory_Quality_Band1 + concatenated flags + + diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index 5840fe566..7acaea7f1 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -21,11 +21,10 @@ package org.locationtech.rasterframes -import java.net.{URI, URL} +import java.net.URI import java.nio.file.Paths import java.time.ZonedDateTime -import org.locationtech.rasterframes.expressions.tilestats.NoDataCells import geotrellis.proj4.{CRS, LatLng} import geotrellis.raster import geotrellis.raster._ @@ -38,6 +37,7 @@ import org.apache.commons.io.IOUtils import org.apache.spark.SparkContext import org.apache.spark.sql.SparkSession import org.locationtech.jts.geom.{Coordinate, GeometryFactory} +import org.locationtech.rasterframes.expressions.tilestats.NoDataCells import org.locationtech.rasterframes.tiles.ProjectedRasterTile import scala.reflect.ClassTag @@ -138,10 +138,16 @@ trait TestData { lazy val remoteMODIS: URI = URI.create("https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF") lazy val remoteL8: URI = URI.create("https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/017/033/LC08_L1TP_017033_20181010_20181030_01_T1/LC08_L1TP_017033_20181010_20181030_01_T1_B4.TIF") - lazy val localSentinel: URL = getClass.getResource("/B01.jp2") + lazy val remoteHttpMrfPath: URI = URI.create("https://s3.amazonaws.com/s22s-rasterframes-integration-tests/m_3607526_sw_18_1_20160708.mrf") + lazy val remoteS3MrfPath: URI = URI.create("s3://naip-analytic/va/2016/100cm/rgbir/37077/m_3707764_sw_18_1_20160708.mrf") + + lazy val localSentinel: URI = getClass.getResource("/B01.jp2").toURI lazy val cogPath: URI = getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI lazy val nonCogPath: URI = getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI + lazy val l8B1SamplePath: URI = l8SamplePath(1) + lazy val l8samplePath: URI = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI + lazy val modisConvertedMrfPath: URI = getClass.getResource("/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf").toURI object JTS { val fact = new GeometryFactory() From d17f8a487b98204bb0bd63ad7b29925e8e18fa09 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 2 May 2019 20:47:16 -0400 Subject: [PATCH 073/380] Refactor python type Tile for TileUDT Signed-off-by: Jason T. Brown --- .../apache/spark/sql/rf/RasterSourceUDT.scala | 6 +- .../python/pyrasterframes/rasterfunctions.py | 1 + pyrasterframes/python/pyrasterframes/types.py | 105 +++++++++++++----- .../python/tests/PyRasterFramesTests.py | 27 +++-- .../rasterframes/py/PyRFContext.scala | 14 ++- 5 files changed, 112 insertions(+), 41 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala index bbcafec2a..679da36e9 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala @@ -68,6 +68,9 @@ class RasterSourceUDT extends UserDefinedType[RasterSource] { object RasterSourceUDT { UDTRegistration.register(classOf[RasterSource].getName, classOf[RasterSourceUDT].getName) + /** Deserialize a byte array, also used inside the Python API */ + def from(byteArray: Array[Byte]): RasterSource = KryoSupport.deserialize[RasterSource](ByteBuffer.wrap(byteArray)) + implicit val rasterSourceSerializer: CatalystSerializer[RasterSource] = new CatalystSerializer[RasterSource] { override def schema: StructType = StructType(Seq( @@ -80,7 +83,8 @@ object RasterSourceUDT { } override def from[R](row: R, io: CatalystIO[R]): RasterSource = { - KryoSupport.deserialize[RasterSource](ByteBuffer.wrap(io.getByteArray(row, 0))) + RasterSourceUDT.from(io.getByteArray(row, 0)) } + } } diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index c59d1416b..106a9a4a5 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -211,6 +211,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_tile_max': 'Compute the Tile-wise maximum', 'rf_tile_stats': 'Compute the Tile-wise floating point statistics', 'rf_render_ascii': 'Render ASCII art of tile', + 'rf_render_matrix': 'Pretty print a sample of cell values', 'rf_no_data_cells': 'Count of NODATA cells', 'rf_data_cells': 'Count of cells with valid data', 'rf_local_add': 'Add two Tiles', diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index 960f18f62..2f51755a0 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -138,6 +138,59 @@ def deserialize(self, datum): bytes(datum[0]) +class Tile: + + def __init__(self, array, crs=None, extent=None, band_index=None, ): + # this could be more flexible to allow more ways to access TileUDT + # do some checking on dtype and shape + self.array = array + self.crs = crs # what is a CRS? is it a rasterio.crs.CRS? A pyproj CRS? https://pyproj4.github.io/pyproj/html/api/crs.html#pyproj.crs.CRS.from_string + self.extent = extent + self.band_index = band_index + # here may be okay to carry around the kryo serialized bytes so we can at least go back into the JVM world?: + + def __str__(self): + return self.array.__str__() + + @classmethod + def numpy_dtype_to_celltype(cls, dtype): + from pyrasterframes.rasterfunctions import _celltype + # TODO implement something that will work generally + # Also here we should convert to a string representation of the celltype + return _celltype(str(dtype)) + + def get_cell_type(self): + return self.numpy_dtype_to_celltype(self.array.dtype) + + def dimensions(self): + # list of cols, rows as is conventional in GeoTrellis and RasterFrames + return [self.array.shape[1], self.array.shape[0]] + + def to_tile_udt(self): + row = [ + # cell_context + [ + ['float64'], #TODO ! + self.dimensions() + ], + # cell_data + [ + # cells -- still too many copies + bytearray(RFContext.call('list_to_bytearray', self.array.flatten().tolist(), *self.dimensions())), + # ref + [ + # cell_data.ref.source + None, + # cell_data.ref.bandIndex + self.band_index, + # cell_data.ref.subextent + self.extent + ] + ] + ] + return row + + class TileUDT(UserDefinedType): @classmethod def sqlType(cls): @@ -148,8 +201,7 @@ def sqlType(cls): StructField("cell_context", StructType([ StructField("cell_type", StructType([ StructField("cellTypeName", StringType(), False) - ]), False), - # ], False), # life wood be ez if string dough + ]), False), StructField("dimensions", StructType([ StructField("cols", ShortType(), False), StructField("rows", ShortType(), False) @@ -159,11 +211,12 @@ def sqlType(cls): StructField("cells", BinaryType(), True), StructField("ref", StructType([ StructField("source", RasterSourceUDT(), False), + StructField("bandIndex", IntegerType(), False), StructField("subextent", StructType([ - StructField("xmin", DoubleType(), False), - StructField("ymin", DoubleType(), False), - StructField("xmax", DoubleType(), False), - StructField("ymax", DoubleType(), False) + StructField("xmin", DoubleType(), False), + StructField("ymin", DoubleType(), False), + StructField("xmax", DoubleType(), False), + StructField("ymax", DoubleType(), False) ]), True) ]), True) @@ -178,22 +231,8 @@ def module(cls): def scalaUDT(cls): return 'org.apache.spark.sql.rf.TileUDT' - def serialize(self, masked_array): - return_val = [ - # cell_context - [ - [masked_array.dtype.name], - [masked_array.shape[1], masked_array.shape[0]] - ], - # cell_data - [ - # cells - bytearray(RFContext.call('list_to_bytearray', masked_array.flatten().tolist(), masked_array.shape[1], masked_array.shape[0])), - # ref -- TODO implement - None - ] - ] - return return_val + def serialize(self, tile): + return tile.to_tile_udt() def deserialize(self, datum): """ @@ -201,23 +240,31 @@ def deserialize(self, datum): :param datum: :return: A Tile object from row data. """ - cell_type = datum.cell_context.cell_type.cellTypeName + cell_type = datum.cell_context.cellType.cellTypeName cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells cell_value_list = list(RFContext.call('bytearray_to_list', cell_data_bytes, cell_type, cols, rows)) + extent = datum.cell_data.ref.subextent + + crs = None + band_index = None + if 'ref' in datum.cell_data: + band_index = datum.cell_data.ref.bandIndex + if 'source' in datum.cell_data.ref and datum.cell_data.ref.source is not None: + crs = RFContext.call('rastersource_bytearray_to_proj4', datum.cell_data.ref.source) - ma = MaskedArray( + t = Tile( numpy.reshape(cell_value_list, (rows, cols), order='C').astype(cell_type), - numpy.zeros((rows, cols)) + crs, + extent, + band_index, ) - return ma + return t deserialize.__safe_for_unpickling__ = True - -from numpy.ma import MaskedArray -MaskedArray.__UDT__ = TileUDT() +Tile.__UDT__ = TileUDT() class TileExploder(JavaTransformer, JavaMLReadable, JavaMLWritable): """ diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 387fbb34d..627cdd243 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -266,7 +266,6 @@ def some_point(g): ).alias('s')).collect()[0].s self.assertTrue(intersect_total == df.count()) - # Collect to python driver in shapely UDT pandas_df_out = df.toPandas() @@ -297,44 +296,52 @@ def test_tile_udt(self): import numpy as np from numpy.ma import MaskedArray self.assertIsInstance(self.rf.sql_ctx, SQLContext) + from pyrasterframes.types import Tile + + # Try to create a tile from numpy. + a_tile = Tile(np.random.randn(10, 10)) # no extent and crs provided - # Try to create a tile from numpy.ma.MaskedArray to_spark = pd.DataFrame({ - 't': [MaskedArray(np.random.randn(10, 10), np.zeros((10, 10))) for _ in range(3)], + 't': [Tile(np.random.randn(10,12)) for _ in range(3)], 'b': ['a', 'b', 'c'], 'c': [1, 2, 4], }) rf_maybe = self.spark.createDataFrame(to_spark) print("Type of dataframe: ", type(rf_maybe)) rf_maybe.printSchema() - print(rf_maybe.toPandas()) # Try to do something with it. - sums = to_spark.t.apply(lambda a: a.sum()).tolist() - maybe_sums = rf_maybe.select(tile_sum(rf_maybe.t).alias('tsum')) + sums = to_spark.t.apply(lambda a: a.array.sum()).tolist() + maybe_sums = rf_maybe.select(rf_tile_sum(rf_maybe.t).alias('tsum')) print("Schema of tile sum") maybe_sums.printSchema() maybe_sums = [r.tsum for r in maybe_sums.collect()] np.testing.assert_almost_equal(maybe_sums, sums, 12) + # Back to python side. + print(rf_maybe.toPandas()) # Test round trip for an array - simple_array = MaskedArray(np.array([[1, 2], [3, 4]]).astype('float64'), np.zeros((2, 2))) + simple_array = Tile(np.array([[1, 2], [3, 4]]).astype('float64'), ) to_spark_2 = pd.DataFrame({ 't': [simple_array] }) rf_maybe_2 = self.spark.createDataFrame(to_spark_2) print("RasterFrame `show`:") - rf_maybe_2.select(render_matrix(rf_maybe_2.t).alias('t')).show(truncate=False) + rf_maybe_2.select(rf_render_matrix(rf_maybe_2.t).alias('t')).show(truncate=False) pd_2 = rf_maybe_2.toPandas() array_back_2 = pd_2.iloc[0].t print("Array collected from toPandas output\n", array_back_2) - self.assertIsInstance(array_back_2, MaskedArray) - np.testing.assert_equal(array_back_2, simple_array) + self.assertIsInstance(array_back_2, Tile) + np.testing.assert_equal(array_back_2.array, simple_array.array) + + # test CRS and extent correctly make round trips + + # test raster source? def suite(): diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 41dc46b4a..c06f13415 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -20,10 +20,11 @@ */ package org.locationtech.rasterframes.py -import geotrellis.raster.{CellType, MultibandTile} +import geotrellis.raster.{ArrayTile, CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ +import org.apache.spark.sql.rf.RasterSourceUDT import org.locationtech.rasterframes.{RasterFunctions, _} import org.locationtech.rasterframes.model.LazyCRS import spray.json._ @@ -104,6 +105,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_explode_tiles_sample(sampleFraction: Double, seed: Long, cols: Column*): Column = rf_explode_tiles_sample(sampleFraction, Some(seed), cols: _*) + def list_to_bytearray(l: java.util.ArrayList[Double], c: Int, r: Int): Array[Byte] = { geotrellis.raster.ArrayTile(l.asScala.toArray, c, r).toBytes() } @@ -117,6 +119,16 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions ).toListDouble.asJava } + def rastersource_bytearray_to_proj4(bytes: Array[Byte]): String = { + import org.apache.spark.sql.rf.RasterSourceUDT._ + val rasterSource = from(bytes) + return rasterSource.crs.toProj4String + + } + + def generate_tile(cellType: String, cols: Int, rows: Int, bytes: Array[Byte]): ArrayTile = { + ArrayTile.fromBytes(bytes, this.rf_cell_type(cellType), cols, rows) + } def tileColumns(df: DataFrame): Array[Column] = From f332bda8421f64076d6597033fda9febf6d49b76 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 2 May 2019 21:01:01 -0400 Subject: [PATCH 074/380] Add rf_render_matrix back to pyrasterframes.rasterfunctions Signed-off-by: Jason T. Brown --- pyrasterframes/python/pyrasterframes/rasterfunctions.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index f836171b1..559ef690e 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -213,6 +213,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_tile_max': 'Compute the Tile-wise maximum', 'rf_tile_stats': 'Compute the Tile-wise floating point statistics', 'rf_render_ascii': 'Render ASCII art of tile', + 'rf_render_matrix': 'Render Tile cell values as numeric values, for debugging purposes', 'rf_no_data_cells': 'Count of NODATA cells', 'rf_data_cells': 'Count of cells with valid data', 'rf_local_add': 'Add two Tiles', From 4137f94c2fda2636a13a972c56afaf8501c2a13b Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 3 May 2019 11:26:25 -0400 Subject: [PATCH 075/380] Fix python TileUDT deserialize for nullables in cell_data.ref Signed-off-by: Jason T. Brown --- pyrasterframes/python/pyrasterframes/types.py | 9 +++++---- pyrasterframes/python/tests/PyRasterFramesTests.py | 9 +++++++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index 2f51755a0..1252e603a 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -217,7 +217,6 @@ def sqlType(cls): StructField("ymin", DoubleType(), False), StructField("xmax", DoubleType(), False), StructField("ymax", DoubleType(), False) - ]), True) ]), True) ]), False) @@ -245,14 +244,16 @@ def deserialize(self, datum): rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells cell_value_list = list(RFContext.call('bytearray_to_list', cell_data_bytes, cell_type, cols, rows)) - extent = datum.cell_data.ref.subextent crs = None band_index = None - if 'ref' in datum.cell_data: + extent = None + if 'ref' in datum.cell_data and datum.cell_data.ref is not None: band_index = datum.cell_data.ref.bandIndex - if 'source' in datum.cell_data.ref and datum.cell_data.ref.source is not None: + if datum.cell_data.ref.source is not None: crs = RFContext.call('rastersource_bytearray_to_proj4', datum.cell_data.ref.source) + if datum.cell_data.ref.subextent is not None: + extent = datum.cell_data.ref.subextent t = Tile( numpy.reshape(cell_value_list, (rows, cols), order='C').astype(cell_type), diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 247c0e3a9..73c34651c 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -306,10 +306,15 @@ def some_point(g): def test_tile_udt(self): import pandas as pd import numpy as np - from numpy.ma import MaskedArray - self.assertIsInstance(self.rf.sql_ctx, SQLContext) from pyrasterframes.types import Tile + self.assertIsInstance(self.rf.sql_ctx, SQLContext) + + # Try to collect self.rf which is read from a geotiff + rf_collect = self.rf.take(2) + self.assertTrue( + all([isinstance(row.tile.array, np.ndarray) for row in rf_collect])) + # Try to create a tile from numpy. a_tile = Tile(np.random.randn(10, 10)) # no extent and crs provided From c0973acdd3aff20bd9a53cf8142bcf6375db9ad4 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 6 May 2019 09:27:48 -0400 Subject: [PATCH 076/380] Added `withKryoSerialization` extension method to PyRasterFrames. --- project/RFDependenciesPlugin.scala | 2 +- pyrasterframes/python/pyrasterframes/__init__.py | 10 ++++++++++ pyrasterframes/python/tests/PyRasterFramesTests.py | 8 ++++---- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index 3c1fbd113..93e92e79e 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -60,6 +60,6 @@ object RFDependenciesPlugin extends AutoPlugin { rfSparkVersion := "2.3.2", rfGeoTrellisVersion := "2.2.0", rfGeoMesaVersion := "2.2.1", - //dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.bf51177" + dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.3f7a866" ) } diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index fe3f1b9ba..9f4822318 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -24,6 +24,15 @@ def _rf_init(spark_session): return spark_session +def _kryo_init(builder): + """Registers Kryo Serializers for better performance.""" + # NB: These methods need to be kept up-to-date wit those in `org.locationtech.rasterframes.extensions.KryoMethods` + builder \ + .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \ + .config("spark.kryo.registrator", "org.locationtech.rasterframes.util.RFKryoRegistrator") \ + .config("spark.kryoserializer.buffer.max", "500m") + return builder + def _reader(df_reader, format_key, path, **options): """ Loads the file of the given type at the given path.""" @@ -44,6 +53,7 @@ def _convertDF(df, sp_key = None, metadata = None): # Patch new method on SparkSession to mirror Scala approach SparkSession.withRasterFrames = _rf_init +SparkSession.Builder.withKryoSerialization = _kryo_init # Add the 'asRF' method to pyspark DataFrame DataFrame.asRF = _convertDF diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index bbac60981..6ef010301 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -36,9 +36,7 @@ def setUpClass(cls): cls.spark = (SparkSession.builder .config('spark.driver.extraClassPath', jarpath) .config('spark.executor.extraClassPath', jarpath) - .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .config("spark.kryo.registrator", "org.locationtech.rasterframes.util.RFKryoRegistrator") - .config("spark.kryoserializer.buffer.max", "500m") + .withKryoSerialization() .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') print(cls.spark.version) @@ -56,6 +54,8 @@ def setUpClass(cls): .withColumnRenamed('tile2', cls.tileCol).asRF() #cls.rf.show() + def test_setup(self): + self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") def test_identify_columns(self): cols = self.rf.tileColumns() @@ -194,7 +194,7 @@ def test_explode(self): self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room - def test_maskByValue(self): + def test_mask_by_value(self): from pyspark.sql.functions import lit # create an artificial mask for values > 25000; masking value will be 4 From a153d8da37d5fbb8de6dd91fa31de32d7ecc9840 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 6 May 2019 14:32:19 -0400 Subject: [PATCH 077/380] Updated `pysparkCmd` construction. --- pyrasterframes/build.sbt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index f2bacfaad..a8023a406 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -143,11 +143,11 @@ Python / packageBin := { } pysparkCmd := { - val _ = spPublishLocal.value - val id = (projectID in spPublishLocal).value - val args = "pyspark" :: "--packages" :: s"${id.organization}:${id.name}:${id.revision}" :: Nil + val pyBin = (Python / packageBin).value + val jarBin = (spPackage / assembly).value + + val args = "pyspark" :: "--jars" :: jarBin :: "--py-files" :: pyBin :: Nil streams.value.log.info("PySpark Command:\n" + args.mkString(" ")) - // --conf spark.jars.ivy=(ivyPaths in pysparkCmd).value.... } ivyPaths in pysparkCmd := ivyPaths.value.withIvyHome(target.value / "ivy") From af77f4140c1de0c250e7935c83bc29d0d5f4dd19 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 7 May 2019 09:30:30 -0400 Subject: [PATCH 078/380] Use kryo sugar in python examples Signed-off-by: Jason T. Brown --- pyrasterframes/python/examples/__init__.py | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/pyrasterframes/python/examples/__init__.py b/pyrasterframes/python/examples/__init__.py index 3a0b73092..8bbea6d4f 100644 --- a/pyrasterframes/python/examples/__init__.py +++ b/pyrasterframes/python/examples/__init__.py @@ -1,4 +1,4 @@ -#examples_setup +# examples_setup from pathlib import Path from pyspark.sql import SparkSession @@ -7,19 +7,18 @@ jarpath = list(Path('../target').resolve().glob('**/pyrasterframes*.jar')) if len(jarpath) > 0: pyJar = jarpath[0].as_uri() + def example_session(): return (SparkSession.builder - .master("local[*]") - .appName("RasterFrames") - .config('spark.driver.extraClassPath', pyJar) - .config('spark.executor.extraClassPath', pyJar) - .config("spark.ui.enabled", "false") - .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") - .config("spark.kryo.registrator", "org.locationtech.rasterframes.util.RFKryoRegistrator") - .config("spark.kryoserializer.buffer.max", "500m") - .getOrCreate()) + .master("local[*]") + .appName("RasterFrames") + .config('spark.driver.extraClassPath', pyJar) + .config('spark.executor.extraClassPath', pyJar) + .config("spark.ui.enabled", "false") + .withKryoSerialization() + .getOrCreate()) # hard-coded relative path for resources resource_dir = Path('./static').resolve() -#examples_setup +# examples_setup From 15ded729db7c5efae89f9919aa7af050ce06a96a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 8 May 2019 13:17:14 -0400 Subject: [PATCH 079/380] Reworked RasterFrames Jupyter Notebook build for future extensibility. Added `rf_crs`. --- build.sbt | 11 +- .../rasterframes/RasterFunctions.scala | 3 + deployment/README.md | 66 -- deployment/build.sbt | 56 - deployment/docker/jupyter/Dockerfile | 69 -- deployment/docker/jupyter/README.md | 3 - .../jupyter/samples/L8-B1-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B10-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B11-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B2-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B3-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B4-Elkton-VA.tiff | Bin 63376 -> 0 bytes .../jupyter/samples/L8-B5-Elkton-VA.tiff | Bin 63376 -> 0 bytes .../jupyter/samples/L8-B6-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B7-Elkton-VA.tiff | Bin 63292 -> 0 bytes .../jupyter/samples/L8-B8-Elkton-VA.tiff | Bin 250662 -> 0 bytes .../jupyter/samples/L8-B8-Robinson-IL.tiff | Bin 775172 -> 0 bytes .../jupyter/samples/L8-B9-Elkton-VA.tiff | Bin 63292 -> 0 bytes docs/src/main/tut/release-notes.md | 2 + project/RFProjectPlugin.scala | 7 + project/plugins.sbt | 1 + pyrasterframes/build.sbt | 2 - .../python/pyrasterframes/__init__.py | 46 +- .../python/pyrasterframes/context.py | 3 + .../python/pyrasterframes/rasterfunctions.py | 3 +- .../pyrasterframes/{types.py => rf_types.py} | 0 .../python/tests/PyRasterFramesTests.py | 80 +- .../rasterframes/py/PyRFContext.scala | 8 + rf-notebook/README.md | 32 + rf-notebook/build.sbt | 55 + rf-notebook/src/main/docker/Dockerfile | 45 + .../src/main/docker}/docker-compose.yml | 9 +- .../main/docker/jupyter_notebook_config.py | 766 ++++++++++++++ .../src/main/notebooks/Getting Started.ipynb | 964 ++++++++++++++++++ 34 files changed, 1970 insertions(+), 261 deletions(-) delete mode 100644 deployment/README.md delete mode 100644 deployment/build.sbt delete mode 100644 deployment/docker/jupyter/Dockerfile delete mode 100644 deployment/docker/jupyter/README.md delete mode 100644 deployment/docker/jupyter/samples/L8-B1-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B10-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B11-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B2-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B3-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B4-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B5-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B6-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B7-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B8-Elkton-VA.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B8-Robinson-IL.tiff delete mode 100644 deployment/docker/jupyter/samples/L8-B9-Elkton-VA.tiff rename pyrasterframes/python/pyrasterframes/{types.py => rf_types.py} (100%) create mode 100644 rf-notebook/README.md create mode 100644 rf-notebook/build.sbt create mode 100644 rf-notebook/src/main/docker/Dockerfile rename {deployment/docker/jupyter => rf-notebook/src/main/docker}/docker-compose.yml (67%) create mode 100644 rf-notebook/src/main/docker/jupyter_notebook_config.py create mode 100644 rf-notebook/src/main/notebooks/Getting Started.ipynb diff --git a/build.sbt b/build.sbt index 0e21c7f37..81a39a236 100644 --- a/build.sbt +++ b/build.sbt @@ -1,3 +1,4 @@ + addCommandAlias("makeSite", "docs/makeSite") addCommandAlias("console", "datasource/console") @@ -8,8 +9,9 @@ lazy val root = project .enablePlugins(RFReleasePlugin) .settings(publish / skip := true) -lazy val deployment = project - .dependsOn(root) +lazy val `rf-notebook` = project + .dependsOn(pyrasterframes) + .enablePlugins(RFAssemblyPlugin, DockerPlugin) .disablePlugins(SparkPackagePlugin) lazy val IntegrationTest = config("it") extend Test @@ -42,13 +44,14 @@ lazy val core = project scalatest ), buildInfoKeys ++= Seq[BuildInfoKey]( - name, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion + moduleName, version, scalaVersion, sbtVersion, rfGeoTrellisVersion, rfGeoMesaVersion, rfSparkVersion ), buildInfoPackage := "org.locationtech.rasterframes", buildInfoObject := "RFBuildInfo", buildInfoOptions := Seq( BuildInfoOption.ToMap, - BuildInfoOption.BuildTime + BuildInfoOption.BuildTime, + BuildInfoOption.ToJson ) ) diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 769c58bf7..c5caa1c5a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -68,6 +68,9 @@ trait RasterFunctions { /** Extracts the bounding box from a RasterSource or ProjectedRasterTile */ def rf_extent(col: Column): TypedColumn[Any, Extent] = GetExtent(col) + /** Extracts the CRS from a RasterSource or ProjectedRasterTile */ + def rf_crs(col: Column): TypedColumn[Any, CRS] = GetCRS(col) + /** Flattens Tile into a double array. */ def rf_tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) diff --git a/deployment/README.md b/deployment/README.md deleted file mode 100644 index 5e008b8a1..000000000 --- a/deployment/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# RasterFrames Jupyter Notebook Docker Container - -RasterFrames provides a Docker image with a Jupyter Notebook pre-configured with RasterFrames support for Python 3 and Scala Spylon kernels. - -## Quick start - -This will use the [latest image](https://hub.docker.com/r/s22s/rasterframes-notebooks/) published to Docker Hub. - -```bash -# Optionally pull the latest image. -$ docker pull s22s/rasterframes-notebooks - -# from root of the git repo -$ cd deployment/docker/jupyter -$ docker-compose up -``` - -## Custom run - -The `docker-compose` incantation automatically exposes port 8888 for the Jupyter Notebook and ports ports 4040-4044 for the Spark UI. - -The image can equivalently be run with: - - $ docker run -it --rm -p 8888:8888 -p 4040-4044:4040-4044 s22s/rasterframes-notebooks - -The `docker run` command can be changed to quickly customize the container. - -To mount a directory on the host machine (to load or save local files directly from Jupyter) add - - -v /some/host/folder/for/work:/home/jovyan/work - -to the command. - -Attach the notebook server to a different host port with - - -p 8630:8888 - -if you already have a notebook server running on port 8888. - -If you want to use a known password, use - -```bash -docker run -it --rm -p 8888:8888 -p 4040-4044:4040-4044 \ - s22s/rasterframes-notebooks \ - start-notebook.sh --NotebookApp.password='sha1:1c360e8dd3e1:946d17ef9e6b8cbb28c7bb0152329786918cc424' -``` - -Where the password sha is generated with [`notebook.auth.passwd`](https://jupyter-notebook.readthedocs.io/en/stable/public_server.html#preparing-a-hashed-password). - -Please see the `Dockerfile` and the `docker-compose.yml` file on GitHub ([here](https://github.com/locationtech/rasterframes/tree/develop/deployment/docker/jupyter)) as a starting point to customize your image and container. - - -## For Development - -To build the Docker image based on local development changes: - -```bash -# from the root of the repo -sbt deployment/rfDocker -``` - -## Base images - -This image is based on [jupyter/pyspark-notebook](https://hub.docker.com/r/jupyter/pyspark-notebook), with some -portions from [jupyter/all-spark-notebook](https://hub.docker.com/r/jupyter/all-spark-notebook). -Much more extensive instructions can be found at those locations. \ No newline at end of file diff --git a/deployment/build.sbt b/deployment/build.sbt deleted file mode 100644 index c76ef554b..000000000 --- a/deployment/build.sbt +++ /dev/null @@ -1,56 +0,0 @@ -import sbt.{IO, _} - -import scala.sys.process.Process - -moduleName := "rasterframes-deployment" - -val Docker = config("docker") -val Python = config("python") - - -lazy val rfDockerImageName = settingKey[String]("Name to tag Docker image with.") -rfDockerImageName := "s22s/rasterframes-notebooks" - -lazy val rfDocker = taskKey[Unit]("Build Jupyter Notebook Docker image with RasterFrames support.") -rfDocker := (Docker / packageBin).value - -lazy val runRFNotebook = taskKey[String]("Run RasterFrames Jupyter Notebook image") -runRFNotebook := { - val imageName = rfDockerImageName.value - val _ = rfDocker.value - Process(s"docker run -p 8888:8888 -p 4040:4040 $imageName").run() - imageName -} - -Docker / resourceDirectory := baseDirectory.value / "docker"/ "jupyter" - -Docker / target := target.value / "docker" - -Docker / mappings := { - val rezDir = (Docker / resourceDirectory).value - val files = (rezDir ** "*") pair Path.relativeTo(rezDir) - - val jar = (assembly in LocalProject("pyrasterframes")).value - val py = (packageBin in (LocalProject("pyrasterframes"), Python)).value - - files ++ Seq(jar -> jar.getName, py -> py.getName) -} - -def rfFiles = Def.task { - val destDir = (Docker / target).value - val filePairs = (Docker / mappings).value - IO.copy(filePairs.map { case (src, dst) ⇒ (src, destDir / dst) }) -} - -Docker / packageBin := { - val _ = rfFiles.value - val logger = streams.value.log - val staging = (Docker / target).value - val ver = (version in LocalRootProject).value - - logger.info(s"Running docker build in $staging") - val imageName = rfDockerImageName.value - Process("docker-compose build", staging).! - Process(s"docker tag $imageName:latest $imageName:$ver", staging).! - staging -} diff --git a/deployment/docker/jupyter/Dockerfile b/deployment/docker/jupyter/Dockerfile deleted file mode 100644 index ebf52fdac..000000000 --- a/deployment/docker/jupyter/Dockerfile +++ /dev/null @@ -1,69 +0,0 @@ -FROM jupyter/pyspark-notebook:92fe05d1e7e5 - -MAINTAINER Astraea, Inc. - -ENV RF_LIB_LOC /usr/lib -ENV RF_JAR $RF_LIB_LOC/rasterframes.jar -ENV PY_RF_ZIP $RF_LIB_LOC/pyrasterframes.zip - -USER root - -RUN echo "spark.driver.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-defaults.conf && \ - echo "spark.executor.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-defaults.conf - -EXPOSE 4040 4041 4042 4043 4044 - -ENV SPARK_OPTS $SPARK_OPTS \ - --py-files $PY_RF_ZIP \ - --jars $RF_JAR \ - --driver-class-path $RF_JAR \ - --conf spark.executor.extraClassPath=$RF_JAR - -ENV PYTHONPATH $PYTHONPATH:$PY_RF_ZIP - - -#================================ -# Copied from all-spark-notebook -#================================ - -# TODO: resolve the issue that toree has with --py-files, above (it does not like .zips and -# TODO: the kernel will not start) -# Apache Toree kernel -#RUN pip install --no-cache-dir \ -# https://dist.apache.org/repos/dist/dev/incubator/toree/0.2.0-incubating-rc5/toree-pip/toree-0.2.0.tar.gz \ -# && \ -# jupyter toree install --sys-prefix && \ -# rm -rf /home/$NB_USER/.local && \ -# fix-permissions $CONDA_DIR && \ -# fix-permissions /home/$NB_USER - -# Spylon-kernel -RUN conda install --quiet --yes 'spylon-kernel=0.4*' && \ - conda clean -tipsy && \ - python -m spylon_kernel install --sys-prefix - -# Sphinx (for Notebook->html) -RUN conda install --quiet --yes \ - sphinx nbsphinx - -# Cleanup pip residuals -RUN rm -rf /home/$NB_USER/.local && \ - fix-permissions $CONDA_DIR && \ - fix-permissions /home/$NB_USER - -# Do these after the standard environment setup -# since these change more regularly. -COPY *.zip $PY_RF_ZIP -COPY *.jar $RF_JAR - -RUN chown -R $NB_UID:$NB_GID $HOME - -USER $NB_UID - -# RUN pip install guzzle_sphinx_theme - -# TODO: This repo can change regularly without docker knowing that the -# TODO: Layer this command is written in has become stale. Need to either -# TODO: clone a specific revision that we manually update, or keep this -# TODO: last, assuming the prior commends will be detected as stale. -RUN git clone http://github.com/s22s/rasterframes-book && ln -s rasterframes-book/Python/samples diff --git a/deployment/docker/jupyter/README.md b/deployment/docker/jupyter/README.md deleted file mode 100644 index 815b78d8e..000000000 --- a/deployment/docker/jupyter/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# RasterFrames Jupyter Notebook - -Please visit `rasterframe-book` directory for example notebooks. \ No newline at end of file diff --git a/deployment/docker/jupyter/samples/L8-B1-Elkton-VA.tiff b/deployment/docker/jupyter/samples/L8-B1-Elkton-VA.tiff deleted file mode 100644 index 0d5a644eafe7c238c7a1ff991b9e4ae1b2c2f002..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63292 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 diff --git a/deployment/docker/jupyter/samples/L8-B11-Elkton-VA.tiff b/deployment/docker/jupyter/samples/L8-B11-Elkton-VA.tiff deleted file mode 100644 index f570046799bdf0b2f9a2a6c4f8c4aeb0762fd9ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63292 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 diff --git a/deployment/docker/jupyter/samples/L8-B2-Elkton-VA.tiff b/deployment/docker/jupyter/samples/L8-B2-Elkton-VA.tiff deleted file mode 100644 index b287e51808d90a8880942f741ef88247a11c0392..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63292 zcmaI8Wt3D|u&rBAxI2yK@|~Ggg}XHFt__Vljk`wba(@j^oRdsIH4|G;=5 zF}Rc}U12o;OQ`giIlAvA$|s+R zS0cMis0z#V@`MbNy=4rQR%MaB#XZqZobp}v-S9o~B@>;+EOAzx634}PZu`XrjyvL# z2+At*j?5+7a{sDYB?hUKVz^i>XNd%=q*CgxJSaEH^YX2XrasBzvZ?$iu8JKBv)}oW>BSwqkGM4^g-rKi2mCIlr2A}#Tsp(Rxd-AG$B16>%6=JVuxuAyI^{TI~ zYJS&=%pc~mOs(4K!fKz+YwNizCblkX{HCf-XOid+@;>MFyZRuv$!#iBev?B~5jjHq zC+2YmQAC(bqY^63?Ixd7Q$1C0#b9w(x3Hb%pCXM|DGG@^VxcH5a>!|Nhe~L2%9f&* zs31y;Y9h6WC0EJ)vX`u`>nYDX(>YCY+rwlx8B8*>MlaM?)JHX1wNa_nVUgBbUexc*0eAOFoiORUcVde*N{zZlVz$ zQ(rX0?ybcLu}M6Wi}g@@z#6wCtX{;-jK5`+`l&3Ta;s{pw;HT&>*IQyyQmx5iTaYc zY%<%*W`?<<%dk>s&3XIN_H%vgB(uWwxBbn1bwtimGdZ9ABCYBuQ>jCEVKy08ju9C| zO;t#Fe2?E%cHTd$`XaO7r@xs{JoATcz#4Ak+#YhIk`u&wky?(Fu}pH^Q*;wGMLAJ| zb?7bz%RO?l{6{9SnN%xX+_u8jSZQl(8IT}HkZdGNXq zBA(2|D)*Po^d$A0>aGNj9+XezH{V&`C*KpFpY^^kE{Z4Oq&Oq?;^*hYA&$f1u_#Jp z9F$q)P?3#KzbIp>V`k+(%hsnk2UOwN>ZMi{3)IjTOUOYc~y+$ z8%z;PYiGoqN(UaYGYN{dUk^@ zrz314FP}@`7P=m$i2b2j=yURm%Bg4SKh;N8w7488=3^nLHjDPMs>|t(;v7=SIN~3f zPsQbXWK~ARQ8`ovRYJAE-e*-4ok*Vm3u?F`}#k9&s@p;m&v0CfF32KmHA~}P#;$OWpC z-e79zQzoi^W_X#1g%OXuGb*WUFV_$svGjcP42+7UZpdURs=H#wnmcNXPG%1L@t!OK!&vH zwes{I;Ak3iM0dp6Yxy}`57ZO%37yJIpW}gft&+%u*gC#Ugombd6&0h6N zW(NbGfss~alhHW0+W1L(u@S#Mg_lR7_#Hev($B9DBY(-cWP*Njlw2x1>$WPl&LB$3 z0oZ)B{4TG^$=qKAnqI}~FXbV5lh-~KZ^V1?nq#copf<>=GO0SRW~wpjhyoFG7q`>f z>u(ik=1!SZAZ0z(j!ZO5tyd>Z6%byi+BTgnVRoCWrY>vrL|3%4bvnJm{H}5mTMJ}$ zxk#iF*L=^(MCC+f{QQWFB?6+lh%KJ^KKO!sqgNuM1PN7rzV8*WM&?yRRV8&*-_-f+ zTXz`GUu(YEc6z^Dhd=MchS_BY(Lj_HxkWKiSk&ZuEhj_mk~P#h;^T~*F0-mdrkC!` zb9d{jx+Q+GRBtiCz+GKH#+JWH1D2+VoZ*d9p?YnqCCj4PQH-u$dcXVKDn4EF31Y>#m{5$9&6jFfqM(YK^>UQhUklT{F{L=YO$6u(I#^jo7v?5|EIaI0SKS!b#tZS6@%nk!y(xOS$|S~#?4ku{Us$%rmzJmo z@~T>nXWoLP98{Ib5&z&b_0&66QKvNv%nrL7&e2;9BJ!T`+9V>b+9kT_vhp*zp$(7Z z0Mj3<4C;_P0Al7-6Uj6$)H793)lykhaLd?NJlqD%r#)hM5QlyDGA}PIA0Vr#fSgNyN+zd0V|ykJWQ^N!3t0qx z{+3KXvW4A0cDOrW%b9=qq!I9yc;XZ2l#I2DsoTg}GL}3hdWlNl%1hNiodi2Qm|#8i zH>Jc#WO0t$#b(*k zy|B$xn0~DO)2D3`x7KWSy-ga}#1|88*O&vgf~oGBsaV$7?)FvSt~qK>y1&dq^+V;f z@3c_sVME2$Qeyv`s;&M|15^jqkz0Q?RVCIj^?fymZ@iVW-jA<;kWNK4(wk||xLz)` z$*ZeLC##7BB0ib6kdCd-$ZoQREG8?;e6k(5azG}BL%oz8RTtF+`{z=9S-uS-x5|Dv< zi#p=1n(0M%DZNczQQH#6A2i8yG95=Qq$VmvwGd0)CPTJl?Xu_rB7+L55~9Bx%z0%Y zGo6=PWgE_S0dam1>^dzzi};}1Zcx3o4B_$Z+&>80-^^+(6l=vo{kKl7kE*9SSzv_A zt|zJv=C$ms@|!N^o2g)%yOQ>c?W~TOpJuPg;9uz`+A>7NQ(etAg~12a2eC&s)I^**t`PyQvY_@an}A~WphfiGOo@P^pFZlvjM z=IdQXxQ?))5V=Iek&R)4QDF=3WmTeVH*74Ly3gw~faGB+DeLaTkJicgvNVyo1w@K1 z)59)%fIx3W47nJKuMsoA%2n`(UGSl!A{IF@mVP0Vo4z`(3Q?=^t9iOH-ctaZ54BBP zTbs!|!SCDZrrL8$T|@P|N@gyZl%_b@GYdH~M17zJ{D>dV$EPQ#zVMz&dOycHt@RS> zkQr(^sNP!D*L|rVmpkoECJz=+C#Zi0$rUoTdQTOaQ#8_-;k;vctT{Ykr)-FaXUAq~ z`JRqyI}Fw`+Q#-ru?sR)0*8v?dxg|Ul@Dx>Y2d)Ng;&$evWczKX{=|$RAFA9SY3jz z{|VoGh@E^`|Gn=AoFyw+y0*wAYN=LsrB1H4bDp`>7roBq)p@mFPKWok!k>T0^dLzd zvQA=^Rt_UBw@{B{BZ59h>J%J7b&dLS1J*r=rDKy(e0cgtk(_Gx6u)OC>#i5eITn)L zSL#{%2jBgo{$UfVA+n+Dt6u4YcC?$JOPQ&5s~6#Bo2xn%{P{O(kmh!&`iu{05GQS* zu4%8{=pxjfbyW)em+C|G&qXaaRi6Sq~yBjfKtEQI2oZR`mj5Sru4zRnX}US+t|Npc<;LWH2Ll ztAO>vSSp$os+islE+=&_^dY>*uQKD+3E;eg!6L=VWl&O`lgY#l-y2^D*`g7-u9XPW z(oRyLda&ti&ZjvKr=_>_7}G2)h?6Y8-emLLOzo{$?sQG z`N*0HK6yp&Gi^*eeU-eJPM3FIymMy3hZ{7 z?IhM<33cav7{*d?Jhv%gM&eUGR&N3dR}UEa4ERDvR;wlzODpqJB{e_P4K-grX4S)V z67^1h1ywv%5Z!4DL?#!j7ZuL<6_5Ysdri$BgNkUf_z90Ihqd$SVY;gKr|YABH}zd~ z6Wvsj1JEOO$b?ulkvebtgJsjC#8XSb#8-+EL|8J=rG_d_wAGb;#6)m=8^;C|vjybS zW^%ZCkH`3xP&ug4dZTjfH#yBJeTj29$XZSYA*Sfns-l@_I;#2n2LI@{iwgG zzUGdcM_rOuy%e3)Sl7yYlIwVfqj15fu3%VBSyX0H;pi-N^*H@Qmp7SAB9jJ=nS}TF zs2bTg!OH$K?xXIfLgYy?NbY9!d&9zZk=vJ2sSl=R4eCtlgdU`qW6f*wwCbe`qLD1t z4RtOeI1!q`zbb~>D5t_Fnve%-gQH=xfo@Ffr6W6jfkhT4B8scFW|FRhXRo3*&&S$% z+=5@|tftu|JLTbW459-O{)8D^PegTErQd(v>xR z^g&+zM&9)m6n?n>Yf(d$1*ZyPmx)z^4 zUC!1c>}~y%{F7Z>7BAIFkmR^ZiB`DU?3W=rw_OFhxU8|!)?j1JnplqtH3(( z4>dx3>@X8fHdl6*DfkX;MTkgARaqJI?G38GlMkt!_Q7Ks^ZUPKu_;8wVA&U}FGb|$ zkvaK)E)j7J9cqE>fX-F})nJpVsY~cxY8*UqGTb!_TqhxV#4DLVeZ*^(EQ`ugL)5~W z*JWxwPma)=P?2`1_ugpr54z+mHxykWp&W*qxQQ6aXKw0k_{cjH*LS|0)S1QQ1#t#M zFQl5njKjz}%~7y!9sSHbKX}K)Q$8=o!sQ|H}b}s!uAPPooK(ixc0NTY#W%4 zZmb!u@~BVbpbVyr=|HTq0(uF&Xt?>$o#hilP#?nOb5TlU!s72ynqsJJG6Oo$4)Xc$ zXg2TVA6Ok;hz;Ya=W?&gWS+}eRD)gN>{a1j&G7HavM@GpE&ryn9sZY1YeH=v>16x96QgpxLU~XNatStDJN)#XqPL*%aCbRQMKE87nF#QVIat5ff96uk= z&sE}%JPuzTr^bSZY4l?hxZiYT9YUp3LoWn_f749@Dp1O+?mC*^>|6Vu_5P-(`k#lr zaTUDFwki4Zsd}bwn`i1@6U7DX9`l!0Hib)RRtDpH5A+!Q5?mP!1A3)(*WDuL7gbwO$;Ok*s)|q;`YL(~wa|*c;OA$k_{OU5 zYCoBB0rss0*Q+e+^RqrVtTWH(OJ&)R+&7-cc%;wjIbi)%?eqi?c#<58()0~hogS`P zMs2q}MdwI03Vr?t_2V%4Sr%0-Va!&oGkM(@Gf|H;?@b&%6@-04^^*c6YriO^wy=IV zm5+R}M8%T#eJxQNd%#M{fp!_lqoL@pJ~H(ISj&2ReImy)^s;QKBDh!yPamutRYPsE z&NQ>jKH2#;nf+juUnX=pOq$>ybLrvK4@ zQDYC#uVi~Y&)nACgU9SBE%i;?!)CO8+e*jN?^PAO2~=N0ejVt}>CLdKR&*d%qD4gN z;XBDMfAhUd$n88TVdevg<2qu#JR*z1_|m($sxuk6i4LL_uf)c+v2-&s>l(^j1^VPIhCw z17@)~=U&-oW~k21`KILC_tX)_m;z3r4s90id=*h4%7Nr#=~uPqs3VGql;q7jzFJhw zGpN$Wi*ew{N*SWEx>W8ixgper+G}uw(NubW!8i(G_xxCRCb=-XUdCTCquUn4>r;WS zeZbFz;N�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�_zIxNgbMhMbZzUp$Vf4&P%zM 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 YvqX`tA9wAsud+9+3)C@VQen=Seg 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%0A;h7X&F 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

    WhLn4&dnD?bV?16MFyctW;jUiRC9#5WJ( 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­!(cX19x|zZWj%fs+ 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%0A9QG>@eb@EKU3n& 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%0A2bVAMiz4+ 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 f_=@C|zD_XeI==1J$dw*kki!QqEwR^9R+JISrn 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�Gn{S$*yLFn3}PU2f1sv43ZFMbTSh9# z1<=^lq@RoW9espx2mbgc`)lwv+1W&o){aQE@MajruHnMrLhe}YA9(0A(l$xp8Ga^N z_$h0l&6ulBGxGh9qq6|BvRu0`NOyx0`|HlVC+G$N=@98qB&8dXkZu&|?(UZE?hXM# zNoQfA9OmTKBTQ_S!OWo<;rnh5wHgr_K=nVRKYWe5kZGwy3Il z88vn#=@&ldXFTi8tiRQxas%nISPDf?dvT5YT>MLt6m)fnP&z}-BX22^ds^0 zqf_y}-*Z}fza_3H)T;2^BE^b*U1UYUzQr~aUs7Ucp~_)bf0EHhT%~oimXRBgjU0{c z=zC(2>7K$-JLqiJMxf2UOZvz1NOrOk6u1y6g?OPyB)t+kE!}eLem=S}ubejv-&hNu zLftd$RPwjHo4>Nkv(I~O-*VoQ?+U8|XMTP!NBGW>oB^;IAD}_aWIwg~TPC`^%n-eP zaeZ&Cr}<~eMQH7P>Ft9BeZ#YT%`0OTb8-jE-M_3w?pCJR=cxeG_yOK%Id~HDqC5PH zeyuPXRP!hLh5auKS6X5|ayq*kwFJQ@`|YGKNKZt&`it8eKUq8H58R#C>=o`Masqph zP7E2yme4JIwC}oYq9x<91Pk4=-ZXTs%ji}d_a7&jpCeoqOBXwjR_S%{M>sgT2rpI@ zxETw>o6%e0d*;nYotfrM^E4#MU(K^tVdt1rf!+J>-u3A3vFm;f9AwGe)_(8ks#xV< zh}Mu!BVKIyO>_8mJ_bE8mlWyxi&Nhrw*P8K0vZ*aTPP9ogH{>^EY4 zp|%h&w$*CbQ@!tC3{FK+w$mwSZ@~x909E95YdN#+{-_-DTD6&#&g6_O3UPW2s>!qH z3oQ4(GlC@IUCvu;Et|+cp}5BzE=sNJ%&lcoyV8>7K8U?ue=4_lC~kTA@rUY>=a`%x z{+-&E8m^?78`iPS+^z&9kl&d}oZ@UAr?*A-^@O`%fi_b63BULPcG@S5CS?DvvEJ&Z zVOEci)QL2UG>Vjgs`&#u=hR{WltUSrw#2`g$ew(S{Bf7$M%q-S% z=S*QIevwn-FnVMXaP&+1c&gy9*dslqQ~XW28rd%HmUAiN=?vzaMN#muUP zXGb~rubYR==VYqsXvmtw^H7-_ew*?1Vh(n$^Zw86&1Fm0!^mLv6TcPG z;rA^EQ{f+W;sVpG!uo8pijhaZ3xBo-6P;}IQY-bq*ufmOo_Ur^X(4{*B#Ow+DZBhe z8pJzkiILsCh4w2Qch1k8&;`_VN;xyoW3s2`2)mm-q_WZlYUw~KDrJ}c6+<*uTS&B- z$drCE44vk31u+x;X9xWisQ9GjtYTKqW)t#MhqPdIP<1 zfz{hQXV-PdkrPvg`{Ib%h*{e)qlb0VnrUoT(<@J;rBYUP2bqoK<2KtxWLXZCY{nZt z?%7~(*bwLc=x~GI(48)KXYw;c_(A9!87#eGQ$Z@EGEm+wmDd{4p>$V&l}wGDk=8S@5A8jVjsjwU7O1Ih4ENxL-#vFy&~?4oF=EzC;wp= z-GM0Vh&+sR7bZl;%W-Zc_omYT8q2>Zaf*@fchQ^bv_{QaRvKv>HfLHn9L-q`i|cDn zn(9s)Qbi_sorAp2274ii;wK%)P40ZoY1x&@>~?y+>8{NVa)~z{cHJa42JO81UI*wz zAKeZ3&Yzp?A=YCb$RH_rh2+juX6w z{sl>!y(3p6C)DOR6DGRLz0bpruI4R-3>m`Bu8XgtKe?T|ZG+GDsr|tj;1>#i_3qn8 z$s~+JNqE*RiihZXyc-Ln=VP0qv)NET3y(y%MmvO!{LJ3Xur}<7Mcy1!@Fp3@%ymXq zCJwHZ!F%REu!mZM+&C|ic>n@-xe(Ah(LuUu-+JU%} z9j{=tpl34CG?^2XFs}aJSCE;B&ky=a>drlyNiCV3sVOQp&A?HVo0;_(az{#%Ia`ji zr7@F%ne4=Rv4j1M8ze>*SdhVy z^LGUY-9u!s>~hO{!-Ezp&6rQTQYUNe#Ta{m%j^fL%H_BTzLa0W5Pl=4MrVCee#D&UsO-TaS|cxH zTXs(S%eh19s1X+9$8++ex}u?;XAe{72=CCokrV}`v!}g}?q{e!$iK;SHmUOrhu2d0 zDr>BY%(I_ZdC|Z>>Y*5VfKTkaQXHL7CLTeRLfuKR%|UaAU@jWZ#WlLjlh4m3V6>n5C^Hq~0#JM%cUA6|6P4!sX~}wP4~? zfwR3C899c1pWVx8YmHvb+{1Ic3};z!_6hCnoc1H@p;aHEQ&sC1?vgZCDQ3aNq1=4$ z^k61D)r#QqnCs4_+UjGUG8Py;jYnD*v8YfNr`If{uF_Lkr@T@Yt7BomNybFB?SDaE zd4^-=CHt@3bSX)#{@hwWX&JOu>O!Rn9<2$mohPteDoK}8*!`TG=Yw{AqrH39I3XwT zGsoKL?X`)~<@Q4EfGSLX(nzVLo8octwOB$jp$6Jvuks8|>y8sBE^CZz&5& zg*c)X;J&Yk5_}8q>|N@1XI-Jx`L|fQ_LzOT=2wrpv0>2(v23x|{!iXstG;kM^2zs{ zN2nB8FIG}&S_SoHN_F%TR1V4lX#g~$&M;T=Nxh{txFCv)FGP*Ju^EF;V-yo+!iwl`y-#BciRK^7M5fy}4# zg>7QT@Ck>(o^WEAH^}KX@gKt}U#T1ZI_IL^fUKUG%v`4{C7nCmKkK}CL3)3L+lhVk zV#juWv=^{L-oni4FgfSzxH-FdNdmD;5F)I6K z+B?#Wr&HzUqnhla&t+5G4Uh3yen1|h7HowdtuOzz2NR)2OeAV>*1Tf!u$J55BB#bF zw+0H^$-$;ji*5_z(PAa|&v5+hg4QuU91^Au@1X&lz_cggUB{c(Ho7yqIJo5HWo|Uk zzve4`bTFa5!=!W)LUg7IO8*s|#U=+|CWwFxu$Ma)K^ zv8zeRZvM)yffF@R@1k~~8vRDEVWiMZse!m1j(k#MEIWbC@;fDu6q9#DyX^|4qKMp@ zblW7#T{g%U`19?Y{+IbvGE8`?hRVB@0eV$W3RVTXgA2iRlwK$OasKzluXwl83jdJ* z`cNI>rgDerot(4&?%=rppPL5dTq^4?SP`koE7$}h^rarfUqZdqJr`T$ zGH4z{BPafe3ut8f7->j4cJpO zb^8DkC+k@i`1;PHgvg8@_l8l!+6$HODbup1>?%y0N1F4a)6?8y{9`w_dXVXplf8Ti zW~V>kTm98KXBDz!vmq0>N|r_EWjOg0&Rvu+~$#EI-6=GKsT)Jsm<`{Q>X)zMQCA*`M{)*6MRny4=(vP8OI16Q)wSZW_M&N#B(#<&plEI6xhDXX`hPhKhQ!aGokRQYS-O*s3P_?3PO zBFZw-&uR-}gr4GJxrZ9B{2)!l6*5pBs$A0d89B`{);6=hkraR85OPTdnRTqGytbX$ z9nc?W6Ewx>qS2wxicd3)jrD5_|7#?zlB(^Q`yx?wkkA0Q&wd7u0fgg)k zEqSTb#gbBi-q8=v0#wH<*tnz-kLfGSI=D2KS$`T=)m_3F_EfX*yG&&^bcxSo2k*zb zcwCAK9vP(x!UX(yvz5HgD(a?2aD~2f3%MhpF|TqXFdBzJQfxrh%V@i{bA{UfSGT+q zqLtcgUm$Oxx_`}Gl1aMjb01p`#+iMgb{+RrE;e@ z)%9e;YIbiuA{&)eR#vhF$9rzL#;fi$!Si1f7v;ZnvTLmIWVdC7y3yF4>3ri|C;8^N z+tB|bxEM5duQ*@3{EN<7JGZ+wm>NEZoUs=s>OLk|>W@LciYMRuHnZP1Oos9>4Vuo}xisBEFRi`)ke%RsYQi7s1UjJ> zd`AshkV!<9|8K(zQvYepBnoiew4@qruMcIPu+ixpONgzA_KH3YItR`CVR!^mbKiO1 zI&WEUIe6@4bI0H*9phx-H3-9!;l7}`|Gig%1c%=KL8dHw{Z2u16ui0pTsUnzd;L)Z zX7&_6bC@sg+gLpufQNjCk6$;s)5*tND!Z}UoQfwVDWB_I*JT}YV=@7 z^+B(yt{{KF)N5-O;gY)QV|9o;kls1F(jN_d3wa1PKu*qu<*10>;x>4IZ#J`X1{c~O zNEG*_+iJw0;(vjYBx%@+8P`3pgLM_ctPEe|fFh!v%vW9E>$+^zQ>|_NFhOanJ95cVU zmJ_;!(ST{+P(3Niqq=yIOIy2)i>Qt6=#`B>^`C{`BC{jYBRz$5$|!X2dr&?VXD7SM z$Y{PLLt~?{0O!b$^jHf0!7FyuH|aT&QrjEM7W0yox{?iW5^jU%MvT{eB-+x{+GR9| zLnA+P$9zksLoXqlas)=fE~USE#5$(;g7sQcn~C$Hyx|#X%%9o+Rx?xB>#YQ5v3Y?% z>1{qkQThXuo-_PeI_J5y%cTOeviZsy!&mYrleQvIY(BST>!DG?%m%$) zvkO5&F6DgZKCxBf63&&D_INUcE7^0MrQBIJlmS8^p5JQXH(qM{j8;L8ilf9yav}8! zWax8v(*D)T;hZQ)qFQ70W;Jm+JT~5H2eiZLJE&Bt)CS65vZh>=ztSsN{L znw5RfJo?gws2f)D{Jb(tJ5$U_#!QlTno_TgW`2Fy7_Hwn3Ytl*ywoTQl%39`xaTDn z6rNgUMS<4Zcgk#YlfBPTI18^Zd$`Sgu$?W&OdP(ccn3ap@4>cS=(q8g2F=14vuD-o zXeG!mB29$JkrR=YLK*RaTtW@43C1?qEYswF)Mr9|u>fq}onixdhx|J^O~>KGY1{*w zgrQ_z#tDtp%=-Rd3+%Cz-ikz}Sfj%2A;(w=BjUbKTvv2Qu}&q{mnc(6$e%ZOti?el zSfV~t?u+lVo;(G8_|9Hddk8CGbF7c_=W}?@O)#AsVMSza2VsnQBIR4^diNW z$&~g>IfdZiKeG!vHQi3m7tVXz_h&}u#vNkp1|jhcuA)*ES5Z)kBrQ^%+q4jF<$o`}*& zokKtUi(E_&$u#_zEx|f&iVS#<)4^I+*t{j<$@ovsCiPY>y4mq4rU}MF(3r|yUqXGE zuN;ZnCxwk-yxP$H8Ljc;@C8iq&TK9pSt-o=cxkR#!|*rdv|n3y&>l{Q1(6a}WD`>C zlTo+++$8n+`^a-n$xox^SYvQ|qUV;)BZbD3Pjw%)VwFaL9QpxIeV zjtVl=SF265>H0nOijvBhL}hV_nau|CD%k=r^c`#%51K`px}Sq(Lv}p-rKDCo3dNi# zE{7Q@(C;kZb-Jmw5u@-Z-bR{8g|xlwao?fukD1Ml0_=u<*DH`{w$!-JMmh=K+tutY zn=@N1&7`G0yXpauHFhwsOlCgSPZ*h~T6-A_v^#Pgp&n1frN{+RqBcb4^ZJY=`*4$z zsAN&kk#yi|DYTB7Z2V$gFsoSqL8r+8UuiB|-p{S&#u2?YO4A$syVcE>kpJ>os{NmR z9@>oPh)hJQ8!AqN`EcDgn8kQC?{Q~*%7$oXo-r*ZqNmBJ%mbYwon64}tuKbMwbCeM zErS3u2hGn*-ml9^85kyf5Sl8AF-Kb|#e}3Vt4nEvt$Vg^FEG@%;<`m*-_utGBmlLSPZ>SW#c<@sa#hwBnu)% zCDB5^Fdp}NZgDT?XoPgV6A(LZamJk#Z;K6K#Qg}%?^krpX&^FpUkQS6R}jUXYH6dYo5`Q)cK55rFDfV$dQ|X0 z!J+y47Kkrs7tC1TRe>t;7s7kNZR?r(4ZEtlsxChfH|YDJbZsW_wTrxlE%9%W$&qo9 za%}V0N7isJZ0CJbn*6g;f`tomldxSpC1p3VdiC6l?o(&EvzxPWHEilcw>1oh0@f|* zx^V{XVtzIQd(fwDqKg00YGM^|mbni8f}KtQlAK;UeLtz|sjElZC7nKQCe)$3y@lQ# zcF?DpMSETxT|#ACeKcONjfE#nCl2?(n7i{~s>ld{?+7MJnUz0K(fn;4=pTmBk2HWVxMkUVezG3G0 z60s3Mc7Gn*{~B&?GE7gTY3i}3WC0DIB&LL8K z6{`~4*XOt`;-U3?>yE{hKE}Gu%ybc|!%v!n&+P24 zF+v|@0h9c(I9@*`+N8t3-JJe!jsA|gQ3)p3ukZk5GX*j%CG&~#%=nWWn@7fJ<0@Q) zt>{_vo8`@i`ZF|jGhwjJq_R7YBCwtKK^!JOQrfB0oDya+X_Q=@_*_`bGJ2={dEVlygAIn)@c17wYc^rbh>}EUHUV&w;xDxYsT(= zxZckE$vVibR37E;_r^`5gFe~nMovv(ZLs#Q(ii_>UD1WgHWOcXPO+bmPRzrdP+VLM z$6pd>kq(hjXd&znS_@U7zb`-WcZd*4w-EzlBZGQ?0#S&XwGYoc+acPSx_e`Y&PPTnpqdb5PE2 z?nTi|enpM7*LVHe-eBi1YmM=bI6~+vmXhCSyWv}YgCcjgmDk)0WzJO#sprLx!uNQE zm!mamEbNYKW_B;}dH)+pBa{(_3x>AF(9Od5CmZ=&5(XB|R^(}s9fdX~q)1p4mpq*5 z--DOJX^AXbH@?I+*RXJK_|okg9Z#bN{a%4f)7(BU>WLxfgQs z@1z$B3pGSh8X|WyOMA843@9PzIh{!L-iSVapyP7-FVY9n7i6G%mzcS%w)UV!`x&a@ zYSXjFLxF4KuCepl%j_IZYeym_=OVP1RBk7CJyVDte!*a3&?eaGkMSgLr8mRV+}C6t z4Arli@2nekLwwB5AWheIJZFku#Lpf~@W;nBD736#qlA~y3bDLiwqTSwh`M5ow4YA@ zTSF4|M2O^xsn9w?u<-M?Y*WFdOMVl0i#~A3Cy5 zs%n&G3)Do*U<^>plMHZ$+hK{aMj6KT^7*}guIs1%&QY-jmC$&aA$n-Zv|vS%<`{U-R)9Lhu%8xKUL#w zc2xX<=e&mAV)!#@y=87^c0Hewv{%eKU^KU%>0L=Ttf-EGk+4M@W2{&ImY%>+$fmxR z@2K(iELfAnNn@D^m29;28$D`Td#E@@x-YA62#hx{Txwk4bw^ z{hn4CuWkWxilIOX(w$3AFZVyEprh)N_$)G8USKO;O@F!n&cDysb`wAQA@@5Hx(|DW zP{WkBi&Fas&QY>C#^bDO=M3jLFM+zao5N&}IayV9RK2+q1eB7u&9yi^yR#)|&P=AM zp5Dw1qot<(i_?+4$tNcHak~`G+&ad;+|#x3Ek&3(U9`U@NosRY)N5+}qVLhVpe!kF z6~Hyx2<6#Cvm4H|M!2T-nqx@u>TcAbrtip|kj^xWI?7n;u;r0W#DeFX?8bzqw>s6Cej9D2JWzfWUJic#~fxv4cH*0(d%iGl`>+hNK z83jjJ4ri?yl%Kyyhi;{|)a+94qviFCN_R80IhoG07CYu)q=bHBT%&^-h{m>-`v@It z0qB*5ZIndNQBE+|Np4OyQahW?QRc7q9cFFG?9I5~I-y1ijLK$4^EPz4epWr6tfO=S zCAmAsSwAq@UE|cVTfnTH&vbpLUK|z00JoXdABELZWs5M5+_7K9MQCM`sF}s3!aZR+ zS;4)H7DgRZS((t@p3y@yHTr`EY+6!jT}Zh8QQtx@eVL8fCG81n%Un1?T0;NssQpL( z6zb>g(MnBu2r0_{N%8VTwus##>mrtLH?jg{WM(0aFo<61V`O#YA~)qSI;SR)dQ`>x z#D&rgX^%Wt8B8K*qOPJotYn|yrk;F4(M!HHYtZSf!Y5uUDZ!;yI5Kl*cmWuXz>1ykaCZ!GL4 z*{)(9VCyuJ`#Ce3h8j#)X5h~lr|pqDDrGcLJ%tCQJX_;iOo+Bc+S8bQ#aEJyQ~F_K zsgTZ`&5W;~dDdMNEm5d?QLj+nf?pRJRNzAFD>}~MC<;45D@nq0RfhT6d#1~paYlG6 zP7@yr0!r^EXckUWGfd)j$_jU)F&lzsY>^A|{rO7R99b+R&^h@^O6^~6@vUlRxLj{g z)TMx(S(j?{b9%@(+@tV+*(E%2Ug0FzY@Idt;p)83EQb68_@H;3D^!(7+;2D!na{It z_=O3@0(S@6_N>A0?m_F3`ILP5a;PIW=x>cL*k_G~{r}ubMZaFdx@KQs0r? z;I{oUxEY-vO%lY%o)EREFQ#S+2U@*{}DGR?r3-$-BCujgEz=q=DcUq zJRrOiWQfg;bxRZyS0_dilO3JF zWhtq&M5-%y(m&wQG7@Je&WxrY@nLLqh5sXGzk_2qH)rM-K{tOXTaK#kP?G2__z7_d z(Mdrp_%@ggv+rG4AlfsC4@%%bxW=tK)yv7|;E$jkZr>8&ZfJeogVvDk_6KPLE9?<| z9hBwC&#n9@{VJ6tr|_saM=Gy2R89$_1r2t}Hjl2g*bmK+P^KF&4LtX2p1WIwy zl?AOe$()bL>uI9x7mTqaS%@5iNxx7+W>#FQx zXZ$9zTRevwm;n~u%m+USp7!S67U!H-jSWd&OSk7*-_aLne4S71T-K65yIs>1~U^&pfH!pB@&2&@4Ef@%Gtqq&g zP2MDQ43o$Z>>eHsrb11)flF#DPuFDcxf74F@t)Nfm)>D^EDP=ORL&_;5&vS{F&5Dw z4^gw~O{52rA2^p+LbtsW87$6V=RJ|TKo>4X@`-88BzEBR^}U2>G-Kk(qKgV{E8MH# zg~WAMdu=yQQx$Zg*|g;(R$J(z$HTR$sCR<}PzRm&4EQH2dB=Pq4CcSg=5{&4t8#~* zr3F!%s0@dRIET;SnjW*N!>0Py_y8N{FWi)xo)i_`623d-csl2+ZIzX1hDO1exK3ur z1FIW#P-wesr}uh|!e(p&Zu$qPM?=2`ZnYHNP2L^8SDC82H(J>7;$xwya07>PR$*0S zS|lxr%xh)eY;I@t*7~>n);PqfL81FMm=-jR&i0GBSFKrkG9@Cm5+{mJBa0)gNU{1i zV#2??D-@T;p-XwGq=lEe%TD3eM`KdnsqRj4k5LnT#$4*7UCioce@EivpH3?;cl3I+ zj9ZPZX#=l|v&OyQD~@SBvL3KKE@*o&HHx4vJsPZXH@FMKt_k@QTO{62*c4xd8zYBX zme>D3^McXH%H#~CR;UZPa+m!Ltl}X-G$_an`k0^AZ|B^zCwY~EtikkPX{=Lx8|#EV zfQsfnXrswFxzST6y0|Z zp^0dUy``esaJe--`h4+QsSFu{FQxrb3vsegPmUw2vIb1<7q|%iR&L{2?x=nT)B2%O zOI@t~ttQh-!m&Ihi*&?ai^-&Skr=9>yuy3b0=b39ku~BFOZAGPDH`rq^Ow-I)Fg}Y zG*!R~cLiI4t8DLX+A8%(W)jJo@U-njJ6gv{M1|d+A9tLq&K_ZEZEZ#u6O zIt1g2cFss*|76b~`zkqGS<`9;4>&vL?On8+HLd(sQ}cpcfv&$f4zoOws8m)H$cvoo1Z)R-4*8fW60b)W2m|y){JzCJcwiy znnXSq_KN$}S?rXSw4(-ctX%dvGl_aazl8@W z2{-E(Xgd!$Pk44??8&a$ZDAS|rPIC0?CTV2==$7{#C*apJS=^P1XQ*YnB7OksW1+H zpt4TXS{j3`-ON7c;eg9)ROi&$s3k*_TS@<1YlfohC!8!}nIC24YwN53%sul?J)l;B z4dvlf9_IA+AH}{5Hx3DvE1O@$Zet()D7E_Tt z(h2D)gg8~MDXf<|Y4g#H?KP)DqQ3`=<27jvSM_6NQ|B|^^}56Bqp~Nm z3YxpMGP(l8Bat*ORLpJ_|36P)IL zc3FEMId_|!v~*DgofgiI)?K3#J>(QEwepLSL62yki{r^&OCzSC-fbbSmv#ut$v@q~ z{m@OUrVViZ^)p8Y#;x|!ht~?MEjX%x693xW!M;U@h_yuRt>&Q~Sf<4@ff#6X)(a_P zAs;>vE6Qz@by9A+j+bI?Wirp#IHp4t+1k{S9l5Cvb5rUmFT&&WyS3gO;ZJfx=8!3j z^}M6jv!y9*e5KE$j;%)>w?YY=38a~2wO?3|?CbVua+~hr=4Y4a-}XQ94wa#>R5t3G zqCKA}&3m^wEQ73U2@3f=-F50uLPs1HPa|gJ$B2X0*c94HFO1?$wa>bL_^ZMT(LZA) z!eUVDhR1D;+Z8(*d+KG<+l$M%$+q!hKO670k%r*!EA<0pcg%(WuhZ!gBPG19?}uKnr-n1 z+}GxjBT^WGR$A(ul|HRJK&mR0 zhRre)W#)ZpkkV55M#-mavr6dmos<5sFn3sq$-Wab@Ft@LKJTsx(%?uw1GhtXEh+LZa5;S(VEcue;s`w^6&Ls5s}aPkq5%12 z3u)uyg|zZOwVZN@w8fE131x=zn%!nYD4ZG8rOHQT7+RyQY9g5hJEVTl%;MlPJdDWn z%q^HVHy1w&Ova@jnaXwZ_IeLcDQEQWqI~TSJ1Ge?!rJh7|FWvXTq^~2r3(t$IrIgA z^Dj@|D|-Xa?Pi=Y_1(Wwm6qmd{LgA@euPuN29E}Ke07@>JEeBRLr+g&z#WaqCMGbx5qV|%vxx{fV9g% z2R7|(R!d8uHt#GRXR|vaQVd0(r(|G9oCo5>8RHiwW4lodrNwXZDGR$fS^@)_+D$xL zJ;$F>Bk0{x- z{`yj-mC~BM;R8sVZ_JEr)1H|_pfHcpd*B4w!gnqO=g)WOH>*OI8EuX_E3U->HGtZZtlPT6RV>Ms=(&p<&02XKY0@Tx7k`3>CKr+3UD3GFp96U%t~Gv0wg>*b?gL@yg7nH24l-pQ|U zwp2#F+*oa{?qmzQ3?=^y&b*<_h(685pL27bh+GxFm21mApp`ymOWIOvZ0%y_zn4_J z=4=6To5jrTR(<=KC8BNp$UQ#Nw9M*O4r4R>$pg;U)^2XGxn?qFsdJOw`#aBKEAR}e zLMAV{_t3lTXJKcsji;p`@6HkE^@UbwP!}k7j1$&IxJjw>E1F@ib9b7H zwaMyko}#TvbBIkJapb|c)L)sCnad8=H;T6-&jeTcR@3e3as#O5!^I!u>U2{ll^()k zIlvcuML&)UZId!Zo`ioUzqQS2n6` zof0U@#@Geed5od@+UYFtWb>SmN4$d$)?qJFN3YIV96Al1rg&bfQ;qiW)B7cyL*@a} z;H$yaaQ|%^G6H5OB@uoGrkcz@Lk+S zhc_uwJCZNb6_rFSZ55NtM7CB_tvDwQy7-h#FqQ?o{ekWzl>hTM3+A{xgRW5x5AIf~ z-|Eqhv4wF1;|j&4k29kGv2(m1e288TI=P3ftX4_yY;X$x^$P2%-8t4T!AUp+8~k`| zR=CI*5DqbNMU7yYdx80tXD2va;W(Ccu9+b<;!~>#I-Caf8z*hB$=~9gat8!$V%_4) z$FABUn}U1j;vQ=m*%(wrHU2$ZlU3Ah$@HVtIuG!;9-{kw%UzKK?ptBlwjpdCxK^K3Z_t44Z9`|4PKL-B=<>_LJg=3ld)D9oh(|!{c zg#M)Z$34TJsQi5 zllVow0Z=qTzo$2dUED`@P@!!=%&g@!aDFGxb%mYBu4Er#kKD(8WUs`3(u3}?89U^n z_9gS4_00IF)z%m24b6!>5%Zxcl(e$rjp+xmzdQQ4?ewC*;j}z;6R7%5`X7@t@S18g@ z5Y@^gG1rC*XQ3voLbm-=CW?cZ!^}cawgo@xarVbmpz1;7`1CoMg-K$lXYAFBYk8$P z)J3!KiKZmKKGpRDbs0N@tIS&(X{LSB>V{4zsrfrqMkoHY zB;+{0(?6;Mc!hr#4yz^f#&{*l+q3QRc1AqKTi8uLHBFQ=$sl@+famhuDGarvsQ0^@ zN$)B*Af=%^BneY~C*G9vs-sBNys2zbm&-qkmb%f9%mg$@@0<=eRrq#D>~xbhL9(MgOfW)25J9P)WD6si+Hb7|ZpIc;eErweJFOG@a4?GuXceHo7O2AJ)o1yUY4rSzIEwSX{HEGU&j>oZL$C)E*? z2`wXKp+EITbK3ze`fYI^&b420IUFairGr|`Y-JrFqaxnEnDZp;l*hKl5gqC6uYCsQYsc&ZYxh;i7IJx$&tx%{AOPZWcdt@JsMAm=Syl z9c7WXmb_GnM6J-P@vKYF00FVAiM`N2+x+L!eN>(57(+1At@$p?UQIfO5v$%s9u$3kf>G2_|xo< zn|!DF06p+I&j0>!uOy=g{`5C!8fU6^m2?o~H!)9MN#1dG=c)CNRmCnzH~rq-s+M3* z7vKhc%)M*rXL(KA*)7nV1ndkHr?%_BH*nFdNPZPmSC_agTe!8=*=9B8FZ5AGy$V#U z6Uj-K?x*oKdRt?C69y#aPk0?aFHF$SG9O4ze>pCaF;X0sOBzmv(|B|4LC9KUHKo(~ z(tQtQ;SrAKt$3`H;E~8fztP#h7+m+Ol8G?I-ySG&kK!N36^Z{R8t(_59Ha}UM5p@A z+~xL8Gann);_OQAkMs{ z_K86Ki8Xp$%gLRQgU) zgVG*xsn}C~sgBiNs;9`Y&Cc{-r`^F%8Fx5(%S-OYqZZBTHiJZT)jt`O4!z(x@55*Yb%Sv)(TD2D$@8i_zYH@XddQ}|_!?KFjKwT>5Q;Qf)bX)rY zBEcD>l|IraYfaYb2#(!zEeh5SFlUwmCuaFhOd(KSOeH*rYv&ku) z19|Q?B#PW*74C+rtnp-jZ_Tn+p?vBKX>AVmwoV`XJ1(#a_|oQ*;T3+`hLJJ*w_VFV z0?Ao6(&!fmhnv2YLMpLiMVftCwJK@(29(fUZ<*(Q;XV(vF2}~Q7;@4Vh|Ayw` zq&=OFahUUDm$6Q2Lsx6UCSA-Ko?LB6&EE)OUU?HO5d^*IMgf$>m)R#B(eLV+jn2kp z<~n=X$GwK@uwJq_+e+iN+%KHxG@HZ6X&MAdTfF=p%e&nm<$+qNe=B*3io1F8Ee|0R#3| zHJRE@t&K)5jWONIX#T0Kr&p@V-hL4ZQU?u1NjMuz`Bz8k2hr>9k@G1N(CVt_s+Vi$ zWlg${j`WOB6BTJGv5nY;l)a0hEPf~cEi~XBs1g}LvQR^&udk#GkWd=nY2Ki;L-*_9 zo)(=;c2On{wX7%hGn1>%>75)~^4_gO^y^oOnJ+F;-ha8tx|5w@^bSA>Y zT4*-I<$hQDL77I{_c&>vxLo>)iRfAJs5Fro(Fj;UNri!;Wae-xIKSE(tS?MeA4~pg z9W|zqG7hn5klacBAf+Wq;HjC2@<<-~T z6lVFapc~9}1G~R^#+U?2bbve79e{o%@FLziem@mzPSaSf#CtI#`ZAiwtEaCQb>Vg7 zhe%y+_k+y1256`CI;L&Kqly!tW-qWMuThZ0&WEzxq<+uhHbxJ7&W$odF6w6W?O;PN zC6*=OF?qn3V?BJ)Ka8TXUu<0TFaHDSKK}-%bJBGn?xpFM=#!1I4^!eZT{H28H@{W2YZ6uVZU&HSUH+1x(`Ls2dL;7arnOX z8wbMzGt3{34kE!0PTl_g;h+#4!N$Q?%$gcd^)5EXO3kp}(kn=AbJSMpV{ysFo60LxpT9>sMh4;Si3$m2l^HF!S8w#K2k}e9d%z}HdQZ;`sgy!!GMiNIoZgVp^Xri zN6Lx+py$cQlyVJ|h0I1u^DHij^wx2b9uA=q_O03WU}nCBNtiPHH-4os9jdNpcmk4` z2hhr1LU6k&^RV`5ezm_)x;m9cuAA)izURe+y)bP7v2`WAw^@a_>CA`GpSMJ?P3cVKL#lRE2V#gT;gG- z>NN#NOsXG2-Fus^wU0B{E^5u9%4r5&@LMevgsK@bD}CP z#(#ZF&LtNVdy=X)7h-mQDJQkTYEjh>+tZwaR*2T(Yq_V~SQ`aFISpR-YE&Xs&4=`l zGf_1(Bme0yv_E~#f2jfL$*)K>TFG>OA)5775Q~0v7drh=j+)$*H`&TOL^Yj@8u6O; zo+r1w{n75sv{q&>y8#EU;$C&Ldr#d%{20S2-O8S#{$MU}7Lf{>ge_dMphDD+K7y6A z$^X%56LgJ>#t()Nv@$x^y#>W-U68Q?-tIYep>+}!z z#g~t!fL^-_n)%AOZgF`Mi^pejj-w7dz>KXL`?Shz3ASri*uEd+8Bjql$X_UH)ST*9@*1tH-cIXBy``x-RYXmtpwixZ z&kcDj7#W@lUyG9NO;y!3A=9XX3(|#qSfS&S5oUYBI8apk1kCx3A%Sk=tf7Q%-qLi6h zY?d^ajlg?0#y+&S-^e0qif7_e0^uz6Ul=dX@XLOr_j_i4ktB^NGGg zFO8mNxzV5G_ZM2kXie4JfLkIhy_v$F&!>;e4>4TO2dGcgMC}iyrdmmzt{hehsYM}5 zE>lzJ4N%oN8rll{TSe8pRK#OYMAb678)wy_5GVg7nJ|lVi0tQaVhXXoc!uxUZKl6T z(LQVv{u6$JOzZXVlR2=u>SDf*?a4&AB|LjfGafLo(g;Cia zLPGR;ZK_@zj!G$xlQ2F1 z1K(J3yNWZzy#@txi`U1ABNO9;RTf?ycNk~pBx9g46^hRmJvjv0<#_s^@av=2LKcbzYv!jPO#~O#v{i@`sH1nQAFWAb@j%eBjJJaEzv|@`q)4pL} z(pxHj-UdoQ_F4XMaBLh1B~3_om~0L1yMCH=lpk z*)3~UVgFS)&r1j%`M>(5QGGV`Gx_P@p>=aBhh^e_i@O}A@nfE9b&>O;gB`-YU~VLd zctML;%jpTevXa^kjGz3o)>vq#^?%906FKYn%WuCXxeZFP%V675Uc zr{#a|z4eNr9+-_6|0f3mpZ_j4HNlEbcdwH6aygbSPDsd^e_LWK_N5ckEvBA>@Je1K zBkw=0G*9RV6t!`5U1eZfUev~rS6C6p8NM25maoybJE*Vsa2qUFYDk;J+7QOxOAR6K za+OLS#be?cy1X*zcjl3#dr$mPJ|jI8*U9Bn-|D5O@h`@$^Ab=&9=9#n^qK8#OwH4H zjlAg)WGlNrIMwY_&QmXDWKnO~N4=Bev2|oZ)Pv3-O>{#zJggQ*V2A(VXCz0iR9G{t zgxd6QScHtxJ>GHuFVy^{{6?^$23S(?#yDkcQm5gOuP?OcHuzR-DYaxy_%sqP{33SO zpL0)a7ZV{Y4i?uzD_y28G2WtseJFc!Pfq<2BtFG!Ti|G>XQrJQHFO)bnmSx9i>9cB za#mWUons$$+}>|xMThs7wZW>!yd?uuo4#hEoQmBOG`IOb;TQ^1C>T8sgYl!S;WzRuwY12n#60Y5PjwW45!GJ1KdMJ@_X5+%M4!)^|p; zJ>9R>R1~_QrYJvdp`uSErW7O6Yq`D{Clp1ul7%drG(skA9WH{lsE8uQV@MK9sl-0& zLs4L4V7@ikoQ00@JtU(9-r@1uD!jz4#07GojFl(CFPkrXDOFWJf(YlM}Tc8EF<2{_Ide(!u%>RSS(_OiZa)W2==F zM#gElb)E4Or?6hbtIK6~wEm&Hse;Z*V4_}{z55mSgNv@5{HhPmK|Gzq&62py^24RB zZ@%DeEg`RvN}%*Pre0FE{+}+@4$|NYT)vW;MmuR)UT$~2Jwi&wR_Tlo)i+tq*`Ghu zptCx^a|iaqU;RIh&H>D>b8W-1(U`NBt-WVr+qUhbv2CZZ)7VZHDAS7+kShoGiUER5zhcrWBbq3DUv zL;XVQLJfq*VtFa4Jc{Yb8tFAj(HW$(lBRUgW6S-d%TO!6a$DV?Zhy!oFQI)HPSye_ zS!={Xe}3v!sS7 z4`$HA&t--l$K8y^Ey5h5Bt60g`rU|IBLVrJE{zK3pnD?>*t4EsOharqvbY{z`4J@>U)S4?eM!Uq~T+7KchZPTEm^W z;pW*=$8XaNxsoe{E`{Wtp?2r?s%NeUNabFA4u65 zi$`dhRm<#Q_l0BJ(cbEW+zPJZzl%H|Cu_TxpWdb@?%P=W)kIYJm5m?fD<=s=J}DB! zbcw`^ZXG=?ve6tAOtR}`TN2YK(vw8Ac!A^Zz`3;AZfc!ileoaI95XxHxX5(xu@l=n z8oUY5Ad@+N z8(+``?S&ExzsN-1`S;=xrhF0Re2OxX9a1wXJR!w z=V8thxs&Gnf)?u?wR;r%g81yS8hPiv6hS|~H6)P#P~R-_()q>AKs{#1@(1`igE2u4 zw!+E6Ny2m4Cr6-xCL=9$6ceJABnv%rI25Z;d^?(RA&M7=vK^keyd2o8%=O<_Tl_(%RK8Gbb_leB4Xs7p$@_*B`-bB z2BsvtVLlDPog9bSIfXHWUUN9x=I?Yi&6xgZuuI9}f;G_q?|nC1Zx@{fRvNa>JJ?^f zrUuzXF6sbu{KuqGq2-|(VtehUS_Bf_Dg7$b!wc+Ls?Nm=R@_YfBG*&? zR*orI$!aO?c5Il6A-_I`XJ|4GJoHp_Cb>ZB@clj?j+j^$dwe?)w zlZV-O3#5}RVq#OmP7Ph`qnFvaYdnz_P~|TZx{(iGPVO$<6xYK`KPlEm?UV!}MR6&i zbQd~ZWofG%xgjN>UF1_yB6!0551yH@DFo9>p1D zx3WMi$)%O%= zTRqIW#$$CR8-OR$521zBgp(t&yjYwu?mgPQ?@e4$VJV{PWYm?){AGW_IR{H_YG6K?UfDd{zN}kSPtfqMvy2-8Ej;} zUf=Dn$AcDkg<0mS&|{$yY_i*IT9P;woxZN^eun5)%PmNz*)h-eCbBWu=l$!Iby}&j zt!2UKa5c2+%OE$sU>`UQ&gS*-((qHKy*bgH7tWk5Rm}a!|AL}=HD=M%aMgSYotE2~ zFQFt>u_ss~p}e1l1iagcxBrtVZ{w&#R9 z;tk2@UvWCPBgrG4#Jk%CYGWL;t1Y@UoX+m{Ac#&$B3Qymp&*s}H#64CF#`L5+Bl~Z z2l0bm-ca|uEm~3T9Pe}3&h}q)f#`p!y>ED*$Ox61W-(R^A>YxnILlW#UoPF`+V(=ETK>J^z4pO#q zv-iVO^PQBVm12CJ+%c%U?KHP$T=Am<2Hf*|4;5Pr3b3!5BPi6FIH^ zh7uLmUBS~@)m!T2Hp?q#?O5R`lIIx$rdEbPHwP@G@Bv_-um%_sGE zruerwT1+NwgdX{ccX0q(zBuxBwGF=NTxw%_g1Y3jucAubO>zt_7S&P{tBx{5tgRk1 zTiYoeNJ3U?b0HMz)i91H!bH>UGv*b&EZO#@=#pBiMM#0FuMe{Vh;XGzpPWug9rf^^&Z(*M+NYF{nFv}?cd z*6eF_VshOP!pv85GP`ZuHAWI{j_rC`>!Op>JLDe1Yp~H8fk!HdInP*P#?Uh~yd{vYY`+muO4QzflB-$-L$<()mGBoQObIWMXQ)elN;d?lsz z(dbZ1z<`*jpMuL5kA3naZ5l+K`s6%CLGkVdcdH*0w6}e17B}$?Y$}%o~QoDsa65egXffr@9&7%boVyhbNP2FwV@yeX@nlWtFR< zu5TWU@pk!9ky$}1CWH;WLD6fe06O_8y>iq=?@(;+aDQ1poulEqVLyA@=m|l7XQ}-< zND=Kv7W&!g5oddst>(s0wgkoaPf;{PsX0}0=mLplU-_K#a~otPpL-lrqGari_wdy3 z(%_M4`<44lEM8Ob?}W9!R~)H4QYEE})I!`$B~@F@BbFAUar+jPVv!^-OE<)aa!aj+ zf7N>%Ju@;ndarjBPR9i1a~au*lqHp@zn_E7yapcd59sUvb-tNdew&cGv7jmZjfUKIomb z1abu_8@sw|!UZ7*DpMUT(J673mRnlS*S}v(NiSYeN-Z~&HcJJ>TJk9N9`)5)+Cw~& zTj>g_&=-}4Wc(N!zl&_i~jA8~;#(0iex*v|w%1+{i;s|vSL z5+=Q;oF^nYU3R|ULry}?_tNf*m-G+b%_IJ6XQ8%AKEwCCTR6syVtr_zSVWy779qoC zlu%30fPSbV9ZE4YL}!hiOoY~$f8hpxXZ2-nG=k|+2BW=n0bYo%Gn^7_Mv;7qxCZfE2nXHUXZq< z%qb;@WDl0gN2R(vNj1y>PF4j}>Ge<-{^KllJQ(<=Nl~nU1Mvo~y{%qpGLhS`cZ(NR zBU>Vug4O7cs^D!rVqLJ`I)~gYPIB&$#m=AZe@+4Jhy~6+;05(*->f}xjM72 zCPEzY&tA(zrE0<;F-9D$zJZAmn?3eOyEe}GgN}g8{|UJOv%LMJgf(X`z24jI-ErfS z8}O9u&yI$#yuqcAN7^LpXNz({jOd50wstIMjorX%B>&R(@D;DK{&fb~hvWy!I4zBl z%5az?KI1t%iMs2Fal@L%xjE5EMi)5G+(53*&4@oMEb-u?q@5u zgHI=Pi|NgKxJT{96zJ)iFrj&1uR=wX+&#hM{*GH4MfNx*7l*x9-d=cPBc1DVTPt7q zW6T*c<8lRmkYtmCeQ!m-LbzbI-P!iU=-v_h0}yh89Fcm?IWjme)6X>&7Rul7{FSv6 z+vgzXi)Jz0IJxn&EW}YX*=_E%ajUWw&xF6>DVvUMXlLu&C9QeRM|T~Zj4fW3Acf!9 zZQ`7;7rS-Bd+AUzIen}&_H1{Uw~!>dp59Xun&0^|BHhEAjb}k>dsrl!mx0eKj{C-~ z;B9uV`ZqWMy4vr&r{M;XN4O$};!T_cR@@b%cD~Mp*UBnYyxja&S^T~MdwgVgXheyj<& zx?;nC>t!5fRz1u*_3I>9_y)E(k#i&a2tv>aOtiH?I{;G?J#FBeue|iOy0=z zb`A5bJOJn2aq_&jL(WgBu2mDTFDMQlC$UnHTA&&;!~f|8(QRL(-c4m?x6?ZP%nO`R z`Pu#V75?TP_#cx|6q4#Sl*uPx6TZ`?;7cw=<*#yQG(rj0j15RiqctfkE!mO}CE=zc z%$isF8+wP^=oe<%$&76LlPfq$E1>|LMh6m3>+xDhr0!GkfisJVg-W|LTB>xo zx5@B>&DooKp$0nL8|0iVx8tD6xI-F*?e3OY&qngPKY^tQ1jA+-rsT9y42srLLi^Vh`mUYB__6)dzhIzO)aPnsV-X4+Dt~e^569&M|wt%!5wC+M?{0{$W?MRZLDgmZuoj#;QYg;Q5ZttM|XVsrXG!c*47FX27oTiyZj~&;2#8Wehejmw-VA2$mE=d#D)EziK^(6gxJ48QSC? zX7coslP8b6THR<@iCl|$5NVHdcfI?UdxA~$-XaglI|gnmBRIcOV(C8 zkEggcABQrk%r4mt&Lrn!89LZsP%t-H&G|R3#5b|pUQV`i6*_~CY%N}z3#fCtL!dv4 zi}I>{8;|h;v~hpoH?9le^aF0?>YR`ZQ4Zg5k9q%ik4bhZ52^E3@GvsTFJs>I;VyZ( z9MNh{uQ3JU=igKT1=#d_wz9a}{c}M+Pqa%}&-}LG4Bi>oE;pH~HleHOYn;bRP!o4X zCVa*wZnIcyiPv!Q2e7sdXg0mVCA55vpbwN}E}fexX-PFRHS`FnwX{(DAiNXeiO1z( z${ebj??PA{$$d}^U1?Efnq{S)cn*fZVLU13R_5BB!x>_lgp&lrg4pb+V*J>o!p9Gq z`bmQG!DwIhviTxgnO$CW|Cp6hyMijN5Iw_RICd+*q5Hz7rZ-P_&R_@Lyqm#kZw|b_ z>*zIe`hCK?!b#a9PYsU@KMl$TWBf$F9jJ0a`G1O~OUgyjMz1lLxovf^p4gfF@g8v{ zUb$;*3TBCq&9%Vs(OIyAA#5N%ITylXT4Mby$m& zAPi)f~snrZn@LKJ0YQnsHGyo!5F>>q&WS>9%smK^{29e5fy5gL5!V z%Ce_l<+gW2?6}MEM(0%0N%7hGPZfJ=hm<3sa?~@egsxJ0luXy4G97^Ua?cpeOemgR z+diWglZNt~PeFB=R5$`l_%V3|f>cdyMi%o-c1qdtleOUdufTm!fG%eq??5_KNS%yB zkc&KHDzl=w>|Gz~Chnjucn==i+s%I3C#ve-nLBUjPW$PoZuKn6Rah{pFhNPd>6r%Q zQWQS316CQ>zSsWW!Tri=ZRaGX;3ouz|FMVe3*j{>cVG$k4#Zp2DafpOoK>G}wQsnV z%Q8D!2;s7n`WNK!tIVQX;+DCJ@}ZuVN-IpyQPCdC&S$sLQpgAw;jmImAFj^Q2CDtF z&DMM`+FAvVuZ`Xeo>5^KL=~7L7S|S|H%m=7^B%=@Wn+U`!5%?w)@5{Jz2W+#R}QFq zy~M#oEtz^(IW9+-{@fy6WR^M_6&RD>P6A#RT{uMyuDuh_j9*8j{^S`>Wn*}@fagkCaPm?w78 za`TivwJUNq-ct@}51nT82)|WKJIKgB26?1E+pB&s6OZC~f*Z^4%Ucp$v(m6PyD*u% zW2}WhnOI#431Oqsm`%_kC7ya4R`M_Br8P|dpHKn?$-&>=a`B6q#R=?O+&)H{?X%RCg(iqp!Pxc_UoYzhlSi&_>^NhkV`!Obd zIJr}w`HrpE6t<$O{)a@)ztptmK&PNJhPS{oADTr_&G@!Jc0pn&#EY3JHzrHs3GBsj zB$bvkkD%QwKN5j&WU3fLLtBYYAOt&T&>+E-M(W1PxXtpQW`Mpo>ezf4btdyvx z_PTYO|k}SU=T1u2g)3pkEMs=ukp8nZnR zf{p$!uO_3u|A=O#A09|^wqAQ2R zM#2l>9sb6}bZ_~k-s)OunpjrMC#Dhii8-WL@=K;(HAPGI>A}0;D*Hg9)f-Nz^3YCQ zCPW!{>q{}I-=h9h-zvq$@oGv-!~<%Z_1FfzH4Aa~4`;5PmosY}j2qRys1<;AvC(Yn zA16b#ulLF+Zv8SEv7uRsdoQBjN|D z9J?))k!lw5vwrt3AuSN6<0;kugV;91$vr};Nr>NZ*b*!+G!Ob~BUQ8p-lQ_5}3eky|AO-M*lgmBHe5j*c z*Oo{qnZ|n-wyM*!tv6~~L#=8|+xJ4ft%S_uWSyXHY%=GdI~Cu{9d)IelkRD`ao_AkQdJal z!#nJm>;0Yv*wf4$_DZL@*-0;?)K{7)pTs$6L;ES!*&=sD$F%|1`xbF6?)TF$trRH^ zSu(Fe|4KcXK($jJC~2i0p;)1BQA1$ZeG64$hO`t7(lMc;GR(+IedZYz%%^NInpsbs zke$XVi!%JI`N`S`<30pQq8+OG-!6gqd=|SM)f>aiwV&T3_|qSQBXNay5WjItypSop z3uFerv`ywjSx}pGwoa1%af&CdD=9+ToZke=r~Z2Xvv@--=1y=L!3UADlgNu}Kln#I4)PiGH)w`1JOY0&!qOKp>iiTFV{iSw*3);p~T zY|=bbm9wCE{{`o0zOv71;TB~oa>S~FCrx2$)57Kyw=;8pchlZbaV0UTu{|2VjBzAd z+UNAn3|yqZrbBR5mZsqwTE@+D=wI!q6QEuph)qB06Y zB~r1SczEw0+X?u*zB~CzwJgs>Yk^nGd*v?hrbAH9;*E8Z=_~D0ez$NG49$N~zWqdd z`ou|(^0Aebk+hNbUh?RZ(Ngq6r=(@6>A7nLKzOVpbW&5;rTtdCuXo|9k0;-@07+sC zAPp~uHt?7I1aI(Cyl}0_C#V5^(Sb3zluz#;xMWGaZtN_|dc~k=)ivK)U4w$*Q~nh@ zF@MiprvS6I?%_>gCo+|!%X|J1s{FNlY7@N^RujC`ok+>~A00wNbBf)`{AT-{wP~Gn zZc}TV-NN;q@^)9NA3u#f?jmo!Rm{j>?&R62$?2r%m$j?Zb#>{g9y9YTjITRByW~N* z%pTFT-_bI#Q*NziSFfSM>?cOC>zXD%RhRJ2e}O`@Mk*uq#8FcM-&PYe5;Mi5Vs_~q zT)O!93vwzw{956!kxp!axBK&$?L9?p))EiF1L)wXf}^OWUZY@pV()PGLsEMoU4^T) z7S+q|+u*eq*Gou^<9H4I@qTH4Ke~i6R5pJE!_XmRWVd~5Q(&+>!7b38_wot^ zf=krVQl=WkV2l#66l@x@a?Fm<_nN+gB#e)V%BF1`@<-P*8Y@voz$}0_Aqt? zJ$aJ`GA}$vs$)6&+c?yPdpIYvxY;2YEHfKfZOKH)Xst5pC|RXM)-GjVXpT@*N~iwR zP=thXpo_NQ?VS&`Wydy|4&Z^Hij}04QYy%!3z%4R3RPhuniEytjL`kibsT2zaaa}; zZ*n{QE0iazr7k4Sv*LOPZ!egRujgqQE#4RNi>=w)WRe<6Wtk%`f^xfFdaWKOv8M~< zx&zP!EEJpDjiTlSW46*rs7|KNXkoXqo%v)H@+enAC|gQCZE{)7i16NcvsD7LPep5^g=DAy^)HE*@YFM^imb=nb8MgWOKc_wg3-eQtddz z^A9``wpIl9LWC)KGN+c;6awKN_D$}cALf3$iuS_TXnfY*8e_?ss17$hn-~ZGS!}4- z4~4Yi4Kib@;4!O9j(k0)KnX}nzZcppWu)^+peku%A6QBW5ZMhM%r3)VVg6G?Li?D%lDF4%S9E|#M1d+nBVAJDVy z;rttj-|7R~(_iQ;;^~9LN1?v>E5<2*i|K_=p$gIt^AxPccurjVvHZg5%w&G8)zEdE z3`%Wvl=cetP)BC08@L5}>9N>8jYL(N-!98tGs2l>U$Otr@V_&R!OS( zN?}|}Q)N>dC)dDVa2F!%>5wT+gW;Bex*@4!<4+vv6yy%b#tkqShS&p$b-xwxhhT%X zmUr20yz~Av-l+LD9Arp`hQ_i7{Gp?quZg7U zq~P`8zDOeHRk}$-#TC*mWr~}U>b-1u9#qjd;X`-;zBBLf!$bWc-ZVA>1-$q8;}5uy zd)#Q_hZ2vPEg`PS8EzSF$4%^gHak_^X!LN!{R4g@vXdYB?Sm-)me<_f!=@>{mpa@f z{KRjHmN~JXgZzqn=!6PZltLQ8NmUJp;}*6B7w|{c(A$X;ZppUjqSK52QJ*yt z5A!{wl7GnGr2%Syk~FP$R9(kS(3%NAYAvpIgm=Fae&m{JA2qicrBAnxu_In>=3zDi zv&G6t)!3c{#eS&W;+To72l66etZ+xFWSi7e$^Bo!d1o~{nhNv}L!b^bXIP+pxx1#;*f*v+~d?MOhR@>r<>gzjb9%7IF5$I@X4B4 zAFc1?GA*!+A81S0sz}cBnEW z$v}84j*|w86U6K|w=%Uj-6{Hx+I zWtpeOhaeg4Y_UA{=)d$+sHFud@CDPv>@|NwV&+kr0u#xPd=Jd+nEWsYhM0O_BqVl9$U4W@`&S-%H^0e_9 zde7hZb>17djdd`M<{Cfc!SW_0iN48h;(b!HaLc8Jl#m_8=4ZawSD|Nem@~Ek^rBq) zT{Rbss^jWRCWbrMci+%D=}*z~7P79|Gn}~eBv-AYvLtK<& z6 zN;i_ZRL_h4U6{h$t_qa{fp43VUJ2bGq;7f^d%IL+Va!PjNsB@ZZ z=>p(3@h&rbRvPK3DXS>>hN zQ5Mi(50TzTb>#)}06CYoL3&5B(mFhR$;qpj#3!~3QsWxCGn>D=&JcIC_dm3ZKfEvA zHNNUh?kY$vu6;-8XALDMth6_QTEpaxI$^)Hr!YIi?Mp@R2zP?&b_ohZntBVA$J8*z zd1sDo;4|}?Cvdhwl*nw)<&!@LUn?MA?JSA6&+X0JmVfc& z-ezK=`%Q5`*L1s)sMHDn+aR`96P#(@lAvnPjJe+erxje%DbS7=IK#~5{y?+8pM@@? zpPk08V9wTKSv$~GEj89!)ji8g>ZBk&a)-U1G@jZ{E^evhY;r!km8=>}uII5cw&0SE z;g3c6l*e!ngwTU@hB`BbPrQ--5dF{vt$?1EgvGmh8uCfV=8)zv4Jv~w|EkzP+8{l| zt0hV0@XYrUW1)>WE7pL<7$2?1SQMshBwJZ!AIIljlstlm5Kyv0oIV*W3ibu9gG<5i zU^&zcf!h8sHUDRSzxF}tZe?{-yCvKu>`Bs*YfzrOdNxSxXCOQL@Xx~_$`Ca0Z*Yf; z!DVKN)w~ixAG9*BgEjt9@1wa5&dFRHZ@=B~FNHrKhz8XD{|HHV-p&fir3Pv|={C8B zZK0Py*o zr!uRkX*DOyD;Zh4E3BSSBu20ky`_K9w;GqtA?gfV4UL7rr43d!^kEf(RZa>L#cH6k zsYo>wACACbcoW6Q56DbDaTg{YeXV*_0J+R(hJknUhx1#H-I?d+7y2LFo#{>Rmcoar zKpxu%c=c~gf$85xn~4C^pJ?`T)z}gbKsk|)PirxG6@#fQN_&^k=lY&Yck-K;KA0Wb zZjulFaNe1(aJarDQRTnT)u>ic=|hP*e^-a5!`{ut)0_vY#59!HJ-8j3!cChLD$nn} zLfBu8ZbXAVG*%g;B{WJvL~5aDroJy=E+fUjpf_sDM!PtAd(Ws2QKP((9g1B~bXJ2& zYn){kWtSG_UWx}7yAt#N+vG<+G4kaAe>$L4(<`sjCB2=e_kcC@9Wnb4!3hSI^tSu7m?y)%(=qB4t3##=&kE~nLu`f~HM zEgRh+lDOIp^^=;GM4Q3vzT@H+d}aPLU$KX51BZN-ozWU@?cx5dWt@;i=^{JP18jv) zFbUei<~JjiR5__XD&~wROV>)R&@7FEPyLC^g8tH1C=})7^4e>)IfUnPQpS)Ms>&y^ zK^y=Pt2F!2SX2{b*tlfj3|xW}@E@}pT~aZ3pEch8kHka)mTPZ21N(w9?w`Cn&6vn` z@pL>qX<_xt-bbF2jP7pw$FKOXeD^7*5($o0Y@VHXR%^86xvhlGM>CPS6MfTVmlI`Fv3!M z$Xm>UXG?UCa5E2LmTlXWxw|FjrDKg8p-`-fF8u@d z(YR{J%V4BKXkJ z!abbiP~U$V4XIRsE(Tut=<^XyJ+WPD>eeBn}%{MWNBn9ffi4^)a`+Bm2Y<)kiRSCr71n6M8J zzlwrf9S3~1(RKIj?Tz%%d%$u<2U#Mbd< z1ik!A-mxG7>6A0!>GmgoX}sG(%c-QmDHY%ZugAo!BR+&j?!V~Mb~DM_hqAO=kT{6= z@%(*w3|0i$y(qV^e+4(-M!Q}R_CLFW>?_7TJXE*DGU8X^uJ8>H=}uvZa1_$nDmVZ; zq>y@pF1-aFnHqutAEv4JMeL?_kY@1wq>;<3U(|ZqRn&q<)%;p7ZMwQgO+jBU1f_W) zbpTms5jm;<#!f(8e%}1g@XhAz2{TyNNDW=d6WRk$d>V5PF5bWYpWF3D?q|P+Bem4| zh-bbAJwZAqOIys*%uTDnph#erAf@XeyTADK2$xI~?R9;eU5|~Lb~C4ft!5m@_HJhFlEmU=*mHte>i>LA25TVplsxa;~pvmS56as9D=0-x3bb1e$gZpI_MnK}t3P&<5Y zqvUDoe8|58aBI(ny4ceCY1LvwJ{Jel7X0o=a)j?nNmR-mq64J67i}{%)Lq$9hB5_uyvUAu8+da{?^nr3S z#H>NdFTih(o0hLI^g|P3Z&MfnTuHPe_g&hWB1aK15GlRVazq?48;` z>!vnRH%P7M%p!DT1H|?4y=1Mez7N&rXJ$kPd5Ro-cd?kJeucc>(oSkuCUbKj1gi;F zT_zEAor#>qCE*tzazA^2&|i08JJ8FW!{nwXXY>r*Jvpd;yV!-y{_Z7Tck2G`{I%;i z;1kM6(EI1r5U+!dsvKl!X%6oTTlBUP)y-d$y;cdMGn0au?K)Ys1Rx z#81cOr2C89p;l0{SJ08P`JLfGP4n8mX-{WYd(%2aHPhPqs%Muv33x=P( zL}CGBBBxqiXQ-K5E^lUaWv8G$4i8pDp07>Tx3C>+&l^?%>O>~^6NAuEXEbY&y%VM` zI!xDC(F|Z-UywIRf^Uh`|>(%voN?`#h9XmtGgoffQJ%(DMJxO?_ z?PqpXe8EMn5%iP)8gI-(P6p>0_5L2aka0p@ZeH-Yv)OY~7=~1#{WmEOQpPZ;hvRSE|bD{zs=C zwBlB5oBNtq?B7YoDNw{NaV|&ZI&rKhJ2@N3J9NV>jOkWSyPZ|fIl!)BH#hV~Gl4C* z7o4)z2pFDe-T!RKx~s>9`TaqEi!;=Ry8A_MYDB}L9LP>)C<@bU`V@A2vFQvV^ast^ zFK5)_YiE@7WPo*NJ8%jeTzk}`siZW@H~Bc{Lvm?>SV8O~_7Jy=oI}Ey=H~^ZXCYb2w3sx~5N<;?g4SKS^{BJ$IU(Q!+uzc9g22ZLdd{50E z?{(ztitj3JS-OHj=%!Bwcl~wVq(BPK4mXdq43`PU27@3}jKBq0AlT~lvg_(kNi9pk zopqQ^TT&*nBlxvU$OMEh$VFyEE0kCH2-aNtNZ4@)Kz&G@=r4 zCqAjC;gJ0xEh?ebS&Pj~qX~0?sqFN2$qT%LOdf{XBdq;Q?-!bn%}fvxV(@1@<}Hnd z2dci@2jb-d$auBI$y#%#yT8HxZVrT_qL>dkzq&CYf~1AA=I#GG1BO}U=x@_nhs`sn z=6Y~9Pk_!m1SR$v`<0uA8LB|lu>;-1VLWQ@sj*++y(b-+MB57Jq4)AE{lf&H6xB*; z=4}VPySTW^`)|A%|Nl8QgXmn;E#*%3mU#=|w6yi2&7DGH-istWwI}f6orNO=gNJH3 zrO-Q+l$)U(eL@&FeLZGIy+{L2g-a_dzLBO(V1G(~3w23>d%_d67$sUuy&YQEBisdL zjAv|9?@?O_c+7I6EnSBrAt&_fFU-}CT6gR-?0vtGDK>)5${zcfHIH1xm5>|n(`%J7 zx4|6HjjHlBX1d*l%W`FHIc$TbW)U+4U;7tH#%HMIj*?cjmks13_6JQ+IYrTBH$W5l z4G*Vfm!vOP#LT-FC(kA;Oy7{&I<6m+AB19~%I{3}{J+9fX_HiyiA_qWu}}({-fw2~ zBJRB7p`k)CGLCwqkjSdYObI=n{%$Cw4(V&~;^bw5T1Q{R_PY%#y!$Y$tLmn45Or}p zd!IeUJOQ7`Z`T_B9E7Xt)(idr@oEI|bTPYpWps{!Z3Q7MlyEscU{FfT1io|?6jBIop2FxraJ~RiGl7(=Lqxh#3#H>Q6FC|jm( z)EAHGjg~`69BZ$J_OL*2A-|HA%8Rrlz2r~ozBKUl!KO$QhmjY=q9>wSf{3Wn@?BhuH>(X@6AJIo-Nc*q@wY zD0edPlufc*ktH7w??h>@h4;6&UmHM%L2kOtm%<)77ry9z?n-Ae9@G%Nmpkrpe{^8@ zuA9*r<9?_2n1JG{q1)PP?-ll{hKpx^oxNiCvOhgiD#w`I8*^XJuEfmsN80J>VAj|} z^?`08bYL(25ngq8*Xi-R^fL3=8rr7M)`K9Gxi5Uku4C0V-;qR|$sForA?3R~>cO&Z z2KNEl#N*Cc^SiOlPVfB>g6RO~iu=WRZk~lUtun9J!t*^FN7NUdvM*#lC1#7T7EQ#lsa z%DU&>#$FCTLr~0*<>hv-ItB0prXmmXD5*@-P^2agzYWiiq>D}ySr)+w9v%`d#3XZ$ zKf~KW&jaBKw?kSw{!HRLsC3Psy_^((6WMNyt>v?NAF)4a77mH3yT#GcW%<66QClV( zaCI}uua(nke7bZ4`hkj~!zYoihL%;E2D^GW1n#!QR&UF@6e&Gqsq6;Dr5jZ zCHFTCdxMfV1yZR0iuLJ7u7qj{XT*@wR(o$3wP%{wOv5Vc_|{2dHD~8idi^@=4>oXr zzr!Oikd*mS#%R43=c{0@HXUXmx9o9VF86m9$35O+JXBUmbQpcmgx$0sp%C83O`6!3 z>1{v5+I<97tPDG_^IlpgWW{mfSM!VckNxicdHgqzn0jVKLs%Wc`7R@|aEN*IB+?b% zlG&L;$|u)x4oI_@5m{&%dvZ4n=a0Sl-Q-YC@uHkg$)bFcC&=g7t1KrC=!p7AGhs~d zWKdCrah9z_Z}TUgfkRT-WOnIQsPdQNwJU7JfjOPuj^!qCvhk@6r2pxQZzvHel`fFW zrdgGohv5X?82g*qha9N!#(%0ycH;HWU3niI$_(hWH2SZl>;{UESl*AWYz`BnhwQ~9 zD$IM#2r~1wWT8{9Y**(l7;j&)v(b5XpcegrLUOeI8iHkfp}#m(Ual-tpXm9m+Rj$X zu|Dy%Yz_6|b2!Yl`~a+)KjZ}X;9PzZna~s8B+G0Me#@5ZGOoey{fL)B*E^#ph_CIV zTBrpJu#2(DSwn|#9UAHi_(a{=FXXd)NoCSh5vAH@_`NHIo8kbx4K3&q7HBoCH|U

    hoqlh{&{nr9%e_eCxFl%3Qi>pXtt-#f2|&K4BDcex4P*rS=I^dM8O znDr0p=)_76<_m?y)41)j%4JB3&#sJgs=IBR0_HC1oj$}(N;=m~=Y};59mfhbap_QL zyoTT?;W#^_kK@TGWqwCzv&qh3H>A@@C~rZL711ZNub%17@ESn~&g3k`_upT7thbl5 zaZ2B0(wRUwDkeu07@x$hGD=T1jed*w|EOG6`6P9e56au*pE$h>%hlxc_{Ara23^UX z%=eRuolrWbJ6fXy5Mcjg!(JKHf<~np<&AJ>IDHk5{YfI&ce#Zj%6mN%)k{S?AKiw> zy>!bx;Af1;VcC7=#DPNb7EV)sXFh4aWYstq-0%LKAU)HdS>Z7;+p`zSaVBPGc%?tY zInD<7l(W(#aXDBP`5tZ+v_Kv5Hy(|@tt#%l$Q-|`T|H=F=JOWVv8-xF8_t%=OsX^C z4jJV&3a)u^xeJz9@9Z09EmFkOInh+3so7kwwELn$IHHH(eJ5kLu?6?Q0w&$3_3Xxd z)I;@15gkv`Z7*my)%ES%1vgO}mDX!(KjccvHvEsVm=MgvSJsiUb(nMj(qJK+^b=7H zWf6A@L&SaTZqEsi@phG8DNrK_YumtZH* zop<-AT2O9kM?+pJ;mwA$o{er|3vSu&+?}aWM6U~s@SE__@NU=>(;`J8b=gP93uj{c zkb;DRWPVex2=1f2Qha!!YlV)&Nnw{T5c))2@dXpwH|#Uo%0o3>ZY)-3nqN=2CEk&T zkW4T{`H#0!MJrvB{Ib{V3cjgv(2_UOCZZ^Um8o7rH!_ZG!C1AVdKS)0TAqZqa1Mu9 zd*MEhrCZBP)@U_ufdVUu>6Im&3twd%B zmvsl;t*Le*|EU)*+|t<{taVD`lGts$)7y}F=m;mJc2Mz7LM4vJUi}^KL^ZS6}(FIR~LA;IadKG(}T^$wpL?WfkScdI@>!8uY4S=Cq2@MICD!~c1&@4?AIj-0kbYszhRmwj4W{WOH7{irP-p}D(& z)A*zM83k<_jf@YYE-Zxhq^UK5W;&nQYI(geU0(v_Pf1m)%ju+#QchB9+Q`Gy4f0aF znoHyw%4?EcHb5Avht71An#gHQ;%8}XjTm7s)md#Lq3mU1H$GHISRBeFjDR-rQ68?e zQr|;?KO%<|#rx@}(G6vww#L|}^fk-qlg(RpQT76tdBd`E$~f#fPcfPQ;v{olQJr_? zomxd!QUO@``T6sI{2W1Zr>}WIE(kAsCVkkl&`X|$wV@Jp)7_Qn=tX*&TkP$w23t`N z1_xX5r=9Y*phGR|)q|MSSKX)Vk$Z|`aBx17znDqvid07-M->zOq9OpH_U zGuo-d;^aDRC35nx@y=}DaF%(yf){>oJhK^X)hc4oLC1E@UWXSlTE0cz{X%ZlOTu*Z zA5PPYdSbrDYvx8gWX;g6ri`re7TRN+cvQ!)NF18vRQEo6Eg?>v<7b!L9b_5K<=|o@ zeax@uNc3Ofzx=oMcr&n1IbE${R)=6*bX6!srn`uQn&;+RH$k{a^d+x|SKDc9X>LN> zH~(S38)dFTiL%(f>=g^2CXwwG{Jthu8dT~B$n>jjrTo1mVUia(6O297FInJh9b&S( z0T$Xv-sf+S>bB4|)#3af$$vLTO%#_3={UE>2e!(A_Cr}k%Hsj(1z*_7hM5GVf{_v< zFM&YRMM_1EO)m(bRYY6bBwm4YQ(NpUJ(kP6GlGz(p=|$yZB}E{Zu?2}UF)=Rv$+d! zkhk^byA7ODd~J2zl-d-jpRGdYe&Ef83m7k0<4)!|uEF0GqPw`@e+{~Z(?#9}^@D%I zpTe6-%#8Tcyso~2@1l_(-#cc_(j98A!uUM%bKZ|+Za)sKV}4k>!(~xkt9;fvDV$~W z3yXxhQk0xj$)r?5_4JT!UU4~%b{T5*7Bwq3Ky9det>_WH(h*#t1{|hlSI=l~RWAUg~=zNzeP`Z9so}9Gx{!6e^LYB>F5qVP5hw>P}S3P%6|zHABtO-;HHb(O8@!zm-)bE_$Gw zsBDVU`OW3+9F7`i3sar-D7{s)9nQJ=W)&M=JUPPDDOOod=~0%(*B_u`ZDDJER(m=f zN-QTHxeRe&i&XQgMOV&#F}UsNaFz!-38`OBKyJxuG>7+GQT!$6C((8oGxC&{&3>Su z)1Cd}Q_Hst+q0QAMcBI!B>(3i%o4O+4>#!Fytc2awPx|6Bo8r!$bYA8BlOL4?X z%xxaYQThm+Ny(X%rZ(GK5#XaYyUr+jy&U}C44Uw&O zas3Qr>M2@V`hsV;64yhNO>1p|eiThY^K96euk~r{;p%d?FH&Ymwdm}t!k*{~iEgIc zK~13SKy|%GI4s|RkG`8;I*npq+g-UW_tvH=Nj1eN^vhW$XhlIkxJPh4@F$$tz?sTu7+mVVmnVSQhL6n^uZ^1Wb z7mmYL-e9LVs+EPD1O3@Jy|WX$i|s?kFg=U-lO6eM(p~m)>*vKaGFF%)O;I!Jhm0v! zTBnFM~-LTfu6|CXk zlmT_qaqgs6%qdzqVSHng>_Y6gzmhdp7^2lO^{`ShJl4b)Dj$*a2@OJ< zLS2U4KM|e2?{;Np*1&t|jJ6(I=}6m{D;z^5a9l`0ZIcAWX(73$G(_oW$aoOCqxtSC z&y>sIKCL8YM;mut>L8U=PEgx_w-z{~px_R-+p`TH;T`cBz<}-JM9`Ny&Twliy?R?W zq{cw#`oX7oQrN4Mf(7luoGgI5?yDs@McnS*pFuYF4|~4%%`b~)^bfCxchj#IIUjQ` zdTsPWPP;-@l%@Os1rNzHn-l)ZR6LXGLcICI{ccpS+Xu0u^G2TzzoEK{vF13xDNjQK z%k9DrcD_*-7gLmRPHRc($x-W-z0LXR&hh`iA9#To?I5F#r8+Il?$lO?QLMD^Hak=7 zHO60f$BM&3C<&`HwUOAkO_ujBeIL(pH?{{O;SXdX?Yt`9gIc6J#etpqiG6BpwKkPf zDP@4%O3KGZprAOC)Z+zY-K(-Ccb7ffyM57e4iU48KZLPpCMruYavQ&+e~k`l4;|xj zy7*!+0Z!6y&2d^d)17ASb840E_H26Ej&@G2Dz|yTME{LD3m5(Gp7vkr zn1aEQphM8!Z|j$IxA=#nM@8%~ge5dcsr~1q1Wfn#Io0)LVs*9^D1r^_Q&i-VY3W@A4F0+gD z1XJizvuYc-CF)Cxf0lXlE|j|Wm>G6rPPxQ-Z_TjckrO_`Y;H1AG}WdnoJMS z-;WB8z=-@prsEh=E*g8Q{2GuuirTxyT%qLTQTAX?o>3+NnEaOXIl6%CxK!HApgZ zhItHfYFZ}y4N(2ehfcbmTks^QOet`?Wnr@a+D#sQ5;=};qYF7I!`xyhpl7lbe`1y( z%^2o{QB(dNYO55ZdmTv9<$g$WHSE*;Cj)0nPJ1xh!T?2KCwR!!IbXV4d0_o@B^xda zYS9U3?UK2LxI;(VO>p#8MhmYpk7=ef(&o6g;qhnE$C|&K1?nc;)JsCSxb;?to{Mp` z+gfS1W%slt=$Bfcewxizy9zw6F6@ju;6UuGc~l5vpcSsxOOZgmh8cc;I-`?JR}aH` z#FL|cH)qLp#QNrWdp~obfl_^Fbnn=;>?F7BrtnURPvx-_HC`O@b!vO#oY+b>yu{bk z*;)d(i`GZ1CtPQKKa$;S5^0W_My)7SQ_h*^@%ZeLI@yO^!8)d$RW$jY+7%t=B{PpP z$UK5yHkO-?G#15M;f`>xI|rOt-fOoEq%K^m?rf(A&u0nyJ2lK3KEXO>9Bq}D1sC~q zzVqL+^tYkKR7fktYf4(}wVoI%d3J}aGirwyz8}mCHj*p*IsDQqZ03=R$f?zT&{aig zKb0d?25G$WP8&O$eUK-2JDZ#l?D?y}9NmwLt(H?AD%5mzM3wkyO=EZPoNe1!C6Qdi zj3w_fs;S+z=E?yfh1`j=_AwK{WnwZoHq(@5X0$uj{=&Pt9#u{O!$y^so(=9(b2n+N z$Lz_F94;9PmAY(W+G&46RTR>Gm1Ayett~9r*|0nuF)v?z zM`e_9O8KfjQs+s`QB?g*#+ zKa$P@T*`85!yqZ$NbH%fyJmLK-O?r9-Q5CGlF~>?r=)aucZrmAhopq$e{=qe3l9nh z*faCJ?^;hrFGgQSMtBkXhH=2#%AcCVn_+J?d-$o;>ZYexRMYEONs4WNiliXk?{EAY z{t&OGZQ>#vgLhyHtf7#^VmOwQrrb2YJs~fD>sCK zw=52XXg(}*6`Y#wXqYag?ch}G!na&m#|@-ayPlX zymQteJ%aOTFWW$|a6dc*&BFb|PlQ5pFXbNU@J>oeyBE*UWMLM0@*Wu#>4Yu9eKD() zR<5C5lW!dY`~K(nN#hpxeTw- zQ?MHkr@=mBDriPEbC_8Wjm%8E0L4JINlT-*{V@HKY3%bje>ynr$S3?8#`$M3p$YmV zW|>B)u@kH{##ZB|@jKf4kN5@G*!!#z&MAAI^}*@^?wT7{UVZx|Ud+UJhyFly{0}!l zNfaW}NnH=zqV6~ttaE?xzfvoBc=umzov!epd z5lyUCyuLqK>EObyaElnY&$6I4%1Y+f9{UYGi_<7<%Q|W7NoH<&m>_-C4NIvsdeP~% zudiJ-dbsnHGiZp~g(h<+?hXwTN2}9NR9A#E8-p~6aAuvxcR5n*FSZa5 zf%2(L?R{1n z3F)=92}7-2Qew%pBFb=CH7cmH;8Wjek{|D7aR!qpwA6mblywUB=&tkG`JM!?KJahH zoMXlWqaCl!OXd+$arEl)XEeoULW@C&@`Qg0WkhYUNw_XW)eG7sqnR}x|6XRdfVZE! z;HDSHv(_OP9U0-K<(4idR={zZRjaLjr$&{VdWYbelgSpW8u(sXlE>bg`RF`auYbu? z8;gp?hR2CAJC(Nza2GVSW*YCL7Qz{MsW3xaBWUt4ExTAxl*}f09c~!E3!Ok728j=} zgU)F)r(9axA;-~_7r{}{3RTh&&dqjchHvV#mGm$(QKbUiev8<6rkSTL4 z>rWI0iKUT7I;*}T(6e6EfA6jL=D9t2G^+guD)qNmP8!5i zJxH#GYNfoAMVV!EW`{lPjI~o4P5lCI5aOjq;bCT@q@ zH3^*8Zuq~RWZxvExu7=Rl9OV3O`FAj@P<311<5=sl?D1rGqJWw&V;Avys#4%_K-4L zEvsyR`&v)KbxWx!UbCz89jz56es$G|&E?JtH#cob5A6*0QY(>l*R;7M8-b9d;8U^Q zs&4&Yw&wZHN#e~~YnED2+Gq9S{d?ifq{s3wp0tD@uU{HX%uDyS6|23J??@9QQO+by zQ)_I_)iq>E2c@jRrn>t}qOQ6ZKjnz}r@gOpcVIZGvb zbhA=M-jBv(l$cz)ERAnK)u_(&TyqtjXa0IA@LLJ!w#L%ahYPiaB(|}w!R6JB7G%oZXx5aTZ zCauJEG}XP4tAg;ZQaaNxqcHRL`c7kfcxeLc8tM1KN*^8rjK zwNgsmN2Y3CoR`zcIB3bgXF>gY0{8EK=zu$M54fbYq*2c)pMq>OLu_&w#py!E_7kUgw z@nzWCf9=(v2zSZVRcY2P!#CL-iCIEuZIswy_Iyd2%P06 z7)+YwN;lpcO~UaPZ@$0Wf9zKcLauJNqo=HzJYKnhrX&+>N{ZPeI@9ZA@56Q73_X1r z{+R>a^)vGf3AZ!h2rlx8m}MGZcvY-VY}Nl5r{6W)rK^`A*hy=PTaev~rE}=FX$0Ih3C;v zZ9v7f)68$Zw;s?=a}LMuUUuc-JSiE>7h)|s8M_F#*|sc_YG;T#nKPMrUkl3fm0a;@ z^DFXn?t-0CBKZdA*)wr6X*Oq!){fX&wfqb;R6XNtu4JXbH89PPnA~34<^8$z z0v*M@UxF=bQMf~Rh_Xd%Y(BF^^Ni8LPU^1mW_bhs)D9{zv%ixNB&EeTLohXn_jd&w zx#crTF)*6h$AuSj+EeSTw^p}l>(B&LAqDL<8OiVAGEehs`fFv? z!D6842HWcRJH>pOcKRevKp?l7;p`^vL}!QK*k66oXzuck+33!ZQzw5AO+TX5aoYS$&L^PW0D`;n(|H~rIP zXwIrl;_(@MiCHqB zvl@TJ6PV(4_A=TN&!9Uv;P~Y8t#iAB{DevFs|HJ8wsgyZ6766ws0oL-&nze2 z50TBvDZdu9r!grKJ5b8>gg+aOr?x5Qd?}{>j%)@QLb*Z$Kh7E2A0w~})WvO<8<*LX z&``WH--r9s3Yb#3Lz;ddF9G$gF9hlYEveBOHG69N3P^BOaQwfS$ul$czlP`io&WvY zEDth}!7gq+whNQXRo5JAePcDnUERR|QMbmRbzB6uwuL=nBWLO~vlY9`es`Mv3N6YK zvxbo#G+$JTl4;ig?e27vS{EDNf(^YV2dcFB8;v&oIA4-mbGUz|@Q(Dds)0e~f!m*E zuOydgC|w|>-A=Y=jdy8xRe5<7+)1+9q710sIrK zo5hXhwqp!X8gaj9`VZP$r5t*q7wRZ2h4u;u;xy7i=CE&nb;?zw_3S!q<~`c6?FY?dEy94a@AicVAPG8U8 z<|qu-DLg9`t*zw3wXt7=3@jiEr#+0;2=uuxj7nxlx>L3(55ng_h5C@eB!y>if*m8h zb^y)Z8?}F|8z3zEyr@6No8hGZWxC{Lp)u>S|A$`|?DmO$Fz$}tQ~r(|_m*mTeYRox zHT{&dr^NEP9>ILK&wOL1ulf+0=%h{^~74hd-Dx@?m{Mm+44;MDudDdy%u(X z#dH@t2?Mm3c5SDRby5CNC?)Sxf7Uge z2{!4IG1gpT-our?#~h57DGSXFTkJS?=f!Rf5S+1IJGZ;NL0*V%>$I3goC_bY4bSWu zSx~3yHMC6XZevuTJb8}7iDhK>y+S)nBN&6eq9dO+3)^GdP2LoLfLF=w=gflRU5bYF zA}HuZW4wMu-(jS(_j`wf)%p{jlq2}^^>7b-$7St>UTp(MnOEEYI?+C~ZyVp(!`+$w zm*7+IlRq<98A%m67=epdJJGfG6gF;yG#Mx3pR}n=lHN(N3a#Nd+2@*B{0_0(VNZ+r zC4yLYnpw|CW}hWpAfw&YylAI#C$sIPpd0NUy!VSps!Yn0*3&4DvZAuNp7ZLH83i** z3r2XxY_DX(C)gw0Lh5N8+T}Bp6pVnj+c`tvyIQ{VceVb>~!`Qy);RDx5+nb zhJ)ih*(4!nxR=Yl$(|F3Lgc7X-sq0&!!*CA(*b_jZ|N@%UI+91$$lL?3mNIl z`Q1P16>wL(uG8N8UhS?_)wWxm^yS_Zd{SZD*_W-Fu<=*mgf5`kT}Y{JVnsa zqWh4B*K+Vt72W6LHeXOPl9aU>yr)vAT&N6=s%;5&pd8JHTBs`jy;|sa%*L2^ zF<)Y$p)8@>F?3XgKE^zaIfWOwKexgFZj#AtS-;T1I9r${mV`CPEnN;LQTx&Jp2oDS zT`2o|^X`8SMz)Jyo}D;amN2Dt1}8{o9kZW0N6eYH-fzH|XR_9q?akEYO7^EPIqiGx zV@6dJcctt@{7!?|owK@v{f-m<3)4wHY`dAjhbo(4+8U;r zI(P0VYZT|tFQhXr;}d$1Pt#&@zy9N?5YRHVK#x0-d-#KtiFB&ID92mN%hh{YKD@hm z(N$a%^M?wBD{?CS5gH!~$c8&e?#(J%3uYQQq)EyeXRC9UbiTc65zwI*YI_D)D85o-Jk`&>sRG4%I)5IN$sOr4&8BC>164VR1LX>ZZKRiXpr6L)S>5Rx%uSl@y{{!f@I&KF0bgImQ-b^(8UE>gw6 zy7CU7zpaSY^^xA#8)|npj`RCIA_4syvU9W1^?cB*4aTUEi=UR$ag|ledS#G@29~e# z>J>5aXcgc_cZprajN&_~np9UzrOYQG{1u`E=xcjAHS7giPyLSC zK-{Z!19fa_oK-tZndIuESj+6u8}xmgbXjN$pzD**-BysP+vZ5zxZmTloaL7B&U5N! z48AjcW&HpAf30L)>M2YJx0TK*ht&J1fF3CKG`cyBPx2}_bJ_f{*?<_luR$I^}GlolEq8@?C$Q*A8vgyI@b$^#;S2^p$^Cck1W0+u)|QHCnC= zGj~*KDW})=t6Quh!Q#joXP}$P&lgGUHN?-9gU_~u-{CUe%jf=K4*x#MrS1G2 zwCgF}3erH^GB*bF!4#)^eJEMx|9XjCTWd;hN%QbFakNo~X3y2mdYF*9_)&*(6O?g! zphIj3|61Ss!`kY_1#^Q|k;IWnk)pv~GOyP~Bf)W}jXj#(yNjcFW85d&E9<>cgKXQQ zRu=S1lbn8Fl>JahZRK}a>t=A)xR0C>c=I>O`y@l^2pe;SruJ3nQtwC!@=#pie<}Ud zt@0{dJrP*e8Okuyl3S1+*-`t6iD$b}$9%6p(-xU+yx#UXy+2*2XPK+&k*YdN`$?Nb zhTIq!jza1H`pH+Qhm{d@EcRC=#b$E)PP!}P7Z-~KaCknE8j>Jk%fHJ{lv!GKe}gBG zJXOlBOX^@buWaB&Q^hWb)#7)??}#50e=9z7!r|E0k^kJL#sa0NI0Y1Ei(b#JMRM9} zQtZoFwT*~z8(h4-xsEJ^`qmX=Eneb%Xq`VZlie{7nn%n{Ja7G&nn!^1RI_I}E$yH5 z{q#&fU?Lt#(tRWIES&Lcrs5?`iy~T;rEvTMIbmz@^E+_0PB4qWwAZl{lW}|3EXy5x z3GMB1s|f8JYn;BY!3n5De|3uCBK_7K=yn1bLb3avRL(GGia-~%5wegGnmv>?ln?G8V<>5;HOh;) za0b}+N^p1Bqt4lNkv{Rb!WN%~)W3Fgoz;N39e5S>IbD?ceQ7+yR4WHrUC1d(g^g ztM)}JzfM7b7^<<8?+Y< z)2~}8?dK@OW@sh&TR+mal7lpjy)nPF&in&6N)uzDks4HOgqhZu$Z6O}iqU&3+wnlp z!P&6|7xem2o6rxT^dyyL358(zWt#bl0N`fVq_n{N>=T2fyYV>$jNy1{wv8 z7^5l4CJ&7yW(G42jHgGU;VSUASIp8CKu_CPx9pP61zd3_;nv4mV{kX(g+LR0_-oR( z{#5S>_7>r9n$qmVO!L|7%AFb_>t`gdY&zKbWmZSyi@Hv}qU2XwEAy1)YGJ(G^z}0L zAF$flW5_qUWoS%BLyeXCFl!rX;;iKT$J^CuHRx{-cc#K@7jXX|NnJEUI6dA;6T!-M zNu`zC@*q-&ZkZiOo;pG&@)9{SdFUU>?mdGij zjxD^nRfs#UHFLlX5UA#$W7TM?>;}tNl&0h1-p}sjV5!kcJw#4_$hG7k}&=cOMOK zTg@pjfL-WHO6pv8=6YNGT;3rjxWeikv6GZmi;_b>#O&xS_S?Iqnb6Cj==?@UNJ8Mo0`$9%b(c5 z`aLrJ&O7|tF#9G}1oyAE2bF-}vrzSjwU`;Ir) zS!(wHFI;0zl+%m05P&s*?HvC^GS^A`2@8a;v(8>lmX^YOp*3E=8t_q%@G49Z(@Hr| zU6)q|%Uy6b9g_didsub!v)UK<>?OEdUy*oo21a|GmP4;eUdA=lpS$sdeQg}5C}tKC zgJulH^}8?;Rt(ZGFqgDh?(SOYISm-$SCHtu~A;#XBMr1N_S{n)`XZmbMjWm z*D7z5go1JBqP5+0-g>eC2Eqd5bq@y}<*{lp^9YKFw&X^iW3#CQGTH;L({j|LyGSbj zmMrTmYzx^@LJTCa=!0>IyqE-Q(Ek)v>uAOONqeu=16faJJ~Og2N4MtJ4KiyKY zgh9B>%~64$ao8gwoI^!I4Y@&%pp&aj{%8U`-*oW`YGF}4uFM0a&1L>-O@R$B#9ngK zddAk49sEA2eH#}|$fl8rJc0jk&9%Y@{1@!^L+e{O;ITLa8r%Qk$$aK0+-(knPL7sJK=S%VY&2WcGe5C4OFJzVuRtJy??BOOq$8yqc`&Zx(%oF$+)O@Q#uGK z<*LRx`9=6PJWXGGv48$ADRwF7Tx;%xLTG#QbAQh#6>tgf!zOix*~Xqj>P2~L3y9lj zoPC*Kg_qN&yPqD=m$>^Tg3&bN6JFCCYb>XqYMR~EjrU~`AIrZ>HrR(C6jTj5x&=73 zYnhX2&PZ%jGS=I+wG342oSKwG?A-?Z4ryIx zjF0kkl8Q>2jr6JVJhdf#dad-4ASA`j0VrrUn-$1w$zt81U80M|HYpAA$3g z$3@yg?Wqo;@wz36)(4b8pJ8WHm!oOwK`Pr!wFYgYt_@9DzpJ4lHSNUw5G-@Z%=%7HwzQuQ+1_L!a8oGb$@jQS9Cj* zxN{Jf+F%^_huN)D!^-uy9D0K?dv#FTr-`%=I>EG_h2N;^3;r*(RAlwHp`?0COUwc< zrT+&S{1NK7@NOo&VPeQ^!sa)VNiqwLw^hz-^j0UF7`z#&y`(|nKr(*x-}*1v5*mAj zz)@=Y-+RMo)UHGa*>e(3YTHd^~Vsfe3)N*t+{=ody ziL@cW^l*OimE*!S(G2aNHRB4?}js4L>9yYBO9N#w&rYb*puYM zrXw}Z;@L?{Qo=|xWL`3+fncUbL3;!wsfc+U1jr&?XA+LImLMMMjA|$$^MQU}C&hF; zGhSIVzSoT3jA!)X+$Lq|1zql2?VqiNwq$p-4e~f7_PJ+vewqm;qVcHWCMSV19e(yB z?i>8XRbi3iT?0kwaeI$)6kd2Dd2W z7Bo!>b|-TfiP$@=r)&wDz0IoX%(5GqNo~}3_>2OY4`XcC`q$WPUgdP$gv#THQw<(* zi#5TSLif^Vd!m!h3%PCVGv*W8%o2>-dPwqwGHN^h4(&g6(C`=5GmvhPk~4OOQH=DD zp3ITkU>EYj%zQDESQU9Ts#x*dImOLspoEhRkL25@Y76m@_#3lcZ}MvPlk-+iJ7<)^ zquo-uF3y&F$YG_0ct(tuD{IZv+j1?Xg!)M8MxXFLxiET;y|~aLiliKuTgxZubtt0r zkzdhXKVP(@a(HaUN@e9?I9RW%!%$yeRc{+>*=oLVzPEB)$;{?3Z&{2hY&B(Qpj*Yp zTN_uzdr-j>`d;OZkW*?bKfozJ7!_~R&^w%8llb23fB)8ltiXo6S3}ts9-{8;EN#(M zs~$U6XHxnC@Qoel@P>lu^ro}7va^;cya0Z)?e=uLA$b#bjmh#1J>H!UHnGpU;`IRW zUm8q{6!HIchSS)P2Q1I$Jf33Ag~54Y-^W?%X~k$`YsEHtk6Wb^Z1fQ(?{4NVxUruL zZ{*VY&)O1Rg9cNun`kx!6> z4wvOtZk%|}X?%DXJ|I+8-;s^>r#i<_K-Dh_>!lgeOLREx#f|bu-Bd2iN0h!=J7uFV zM0#UR^KOw0w#IMnHT05uJ8@?%*EgsIQRRNLPjem?g(v?9MSltsGYbcI{o2kjqk$zF zyUa&qf_Cv&;||W{93g>1;ug4Mzp^)i&y=!j*dr|w)_$!y$?D@o+>!habKE0j1x_$3 zqpi4QRf5qraJzK3GCOm~3J^&`J>e8^s@gNz{EM)mokNfP8|@6g8~x3_G(edk;n#R) zd!RoW;ocyF{sPLl>o_$^avn6WpMchVCat5pv(U+AKlV1+I$1?SgX=+&pe=jBAAV1N z6x+cvx~Ulqq03*5dqw}#Nb+?IsT(#-o^oJw#9 z3*6rR2-mT?yGiL#uIo;Q!yQGBc1^FIH;ql>K1r_o$?40;JC=~0Zv!%tNNWB8jJpgpSp;^aT{q|0MHp5TIHH53!_ z;Y%or7FENwFh_VuFHRPCvIAlb?t-hrU(zVp?P}T+I+*j)!Rh?Z9o-2PRBv=osZn;^ zP*128)U4`vN)0^4Ey7*V4;3MEC@$=g!e1d=p2X^l;S1qp!Xxg&?f$>Gp>SZ32zu4( zXU#^3y*aoVbdN0%zcryq{NDK2(Y>+jV_oYE&-Y2~K~N z9puH=1%2&|i|jKV{7h^b1(|<7fE|tHE_h)4#8gnz3}9JOSQD9>{?P{0a$K3lf%Hta zJxMM9kJgaOB&`erBT8lbtIZ;xrv_+X9pehS-$l0inIsY=aqi*A*o!;6oBe_(D+6i7 zZF!2GIwAL4_aKbP3ip`1oc#4)NIL%&4llF1N^CFmA}8w_-j@i83!3JcZwFBLyprqEmJKo+Gl-nsUu|8s|X z3WbzWdPWkl7c&{$=R{q{iGPp0p&~GcZ>=iKc&T~+OYxcyb+ch(Mjm6aSfcRhCmJAz48;J0M`HM19>;(?vSDb|*} zww0*0WHX7|((etMn}Fl!xO!Y&p)@qk(sr-}ePJzefi{b*wa*)Bj=$T9;E7FpRDYe`1w~!JLRzXK40U=EA6vUUoKC_PHSN}d+TjffyboTG}aDL zU8NUTQzpywY;O@9_(?B5GA26GA8r;FzY|^w+s)Tr(O?R%%G;oEVs`KO3nOB5bu?S78Cl?$@V0T!)uHLJw|f@O>>JSJN}S2v z?C$uh76d;=W=Ds`we*UZv;C*O3bu5}FCLV1liPu}HPYLAWIy!J#jW=M;bs0^X?GqE{9 zONobnI++n?Z3TBxV{4@y3s2Y4sp)o&^aq9dk+ZC*D@u<^Gi-pPaS}H{9-J8E*b>O$ z;#uktu7qE^Jt?Q2kc%wj2raQg=%1V+6vvBmmBy1&;z#^7i`2bjpuJEXvN5jGE}NfZ zfDrkq!%@FxU$Kkw9>1xLon#}(q9)j7Sb zHR`lp+G)20E|J@ES#>(yGdr1l@{&0%@YB$Ka?P@$x(ULkLecP}a8@yucp{ur98Pb@V3V#oWtrRojhkyP z=5L&nSLZlf?o{Ik^ASi#6fCeW`%MjYgQVb#4e_Q-rr|E5p=)21`{LQqCiwbd+yz}} zV!Q%MSCWnGcXqoWp<&@)rTn;yqjm)*=c@2_O-MGY&8A)i|3oqCZ)+Y&Uz52F{^IU^ zYD*-$^<;t^qyM3lvNOXXHFrz9GrS{ohF{{9Uj`BfH$yIZAv9M_!6UPPeP?sqn!n+F z?{8KIY5VKzEDH89g)FRcb_V;1@du~+26L)9OP(UXMKOLuS)z22HrSW_b(+Tx)db(E zO8?kj+ADdR5J(a3f~+t(?{O-mazaeT$w}r~ii>KFc~1Et6j%FzQNMC7aTDa?e;0yM z6mvh)y!Ob+4zG}(PjkTTdzBuB%}!0nw~Humm?(FliI^WALLX>a)5v?=s*K{OnDmSZ z@~KdPETuPk8s`uBA*ru2O5KUtH2t(W%K6jn>Hf?N)zohg*-nyME%FC)3-k2eUK)I= zh4Y4o?kxQY9-L_h3=nKAnU5u{P7xt++%98Df9&=YZ+o z3-tMMTJfzqmqUovRve|EQfD{yut^ZI|?%G?p&Z+Tw7_Ccg?^>(1dnh>TogyJ<6}o~= z(rZ$ADzF)}2E7T$S&8uD#!T+T$m^*}!%Qh5IjI$&!h(>44C&=`6R)8qZLPS3T*)%x zLgBHHghnS{I}S%&N0UJNzSSP9n_&q&t&bWHKGa2RqrOzq;|k~`^e2I|Qn(6#N{+C~ zcbh+>8@JJPW{Gj+C6!i1x2c!hy2#XC4(0y`PTV<8L4PNnj*daQ*iCVd;>X1O5`7h<`$!@nU#%y7VLm*-r|NSz`S)8 zEN=&l!XOasImTI|56EFFTI?Tb&vh6E&BkH&L9aum=~|LU`=FSSjKXkkv2fGL1$EuAiN^%2G}awslZ z`5fD;4D*uPs=>W9Q<)|fMdhDc{*Juzc9I5T&{K)GYJv-vc2}DTdOaz<+?}&`8(iAE zP&y$tI1twBZp|it6vlwjOVMHYb_K@aZ)- zkLzvp*^FC2Zs!FcbxTNzs3|QpI`gb0C3h;~oZ+*ukqvPu9*UZF zQBtxS+r_}#!f47yp~LCv6m@QrdXUEItWMGYwJ*@T9i<^Woqqw1yyG;*6Enh$VRjp0 z=U|pwLsI-1u#lVNp7<~snMsdGO;ct-=hryi-(mP`o7j)Y%HFJ(RNLUy$%>Nvh16Re zs+N#@SuOKqicXVj(Mvo>(51hWyy^k@dntu7+L!>NT*_Ht=fnrSf!n$h>~1x?DDO~t zdkfY z+b?klcYw=i!sjcQ`42wPPG%Zz%yZ6YJjG?5-|2XP@ANLarIcQLqK1Tj7aO7B7|#B_-+SoPcMJNf+%?WZ`xm@`-O>Bk z@Dm%|ycTW_G7EaTGY z)%cd6>=HV06O4I`EjsW@1xaYdnRP}Q@CNvrgi<1aUMjM9esj$#hxe3~$qUvf6wZGV>V2?Z5BdoMmPTK@!Sr6)((QZsWeJ&JW zg+LO+pqCdNk9O$FZUm00mGhtZ98Z`c%nlz2ou!StPH2a)j141|ibummX2DZ% zC+2=k8e9dJW72W%{1|$T2jRa^3*l*apr~t|*uW-8#lpV|wlGN;LlV(sbB!_-&D{_& zzq(y3VkBZ39!VxkPrIO<9~?EK{nYw~+@q>AZ1x4W*urzM2L^XLiG+b$&c7dAkBkc1 zImgh@95e=_J}UxOl8Y(*7zlV~)QBnAlG^IyQPw5~LG7relval>3BNJR|ECSrOKY3d zZRA+@(W`Q6HXw0q2wBYwwDqL)_666j!Y6w?GpEb@lZ%~owNgNwA}>%D$tT0t#jjaf zfg~$%Fn;2Q8ENLvwR32xNyr`%y2M@3Fw|8_oshZ6qWXDFeb@Coir-f{-qb!TvrT-OXO1$Rj$Bab>IR9xsI`w9;`Az+4K|&<0chev*%8uB{XvsToy|OCP&T_}zYqqr$c@4O`FVY8e!%9nz zR8A1#)Zif}nLR4m=~23k)F*->ZP#z;eT|CT>2G+ielt=PiY-vlE~`wDXGnkY>>VK$ zysz9|JA*d=0C_V#?E$a_1FhTawPiVt--9kkbyd2q#`85D;N&fd68e)fg&(~~A-%y# z%$$CM$tEA0fzB<^!L5#KrjyfH{#F>xo-~hFrcU_J&>HbMxnmbXEofKs#a7aI`7y45 z6=D_nqIg-n#QyqTy{)#=2I`5y%(B^kg4R~FGkP0?>Gpl00~vKQ^fPFiKEqvob|#=D zk9A)=-+;I7_7XYo=^#&P4F*AbNHcOx_KB0;XnU-A2d3{kSc5paG8Ay(G-wtAyk9T8 zEB+r&Myn08NGCr1gOxF;m1~O`jI?$#C)V8_T#l^bgqa`TCZTbBsn}wEM|Y%m)GLOM zucH3~48APhqpvL-YuwmiR%B3IyM+C*E3ILAJ9hu$pkxcJ1Tcq2PAxBLKc(&YxFdjy zZg5<;ZBQ=q%s&_$4>AS&V0_>DH3Nq($-MmY4Y$A#!5=8-4|!MJjW|t9gS2%PCB3@S z9*zEV?%(-%SQCTHb#s2;@9{G|C>NYm)*EtEvp9KB1^q+=O(B0UdZY@p&eSC@|FL88 z9(@D}{?<*Y$Eqcb2juYFA&theTA|;60~e@R`|y*Twg)r6e&;?#gZKo5s2#IZHtvCM z!!r|}- zX)_sd_eu45DXo?#=xOxj@<*wkFoVv)A;uE(d+Rf}@+>CD>)`zDP)9s=SK-iz@&2PN zd?kERXVmH6k)si05vb#!{r*32%&k_NhqOrj>C z;nKn2LBZ+X&*E)%g^=*Oq=6CjlmAt-2L-J?Y!`BPc4%kl*Klzyh4nR!un9N)F4&=M zrb*jub2g*qrlk+DYwNevPwG5vfZo8|V85^)**WQ(8A$VwLPrStWEjE?@U&UjanEWG z^c?yZnoyEx2k;}!H%_bP!$;XncCp3Hpe4(dOPI-U6P|ZYJHI>C&~H4zfz!~v>7>Lf z>Ctli3GUz$e0>%awwp+PPT+}-TD~OdXVJaE+VhLf<2J;Zwd~_$-Ij?c?wm?6pCZs`;&XN1G8@k2Ty7B znjz*f@++|;y=-JAEfm{_vxl>b1=WGZX|R)_G$fz#v2ANA%MIosZ9yv*ZYF!5wLHcQ+3| zf!CQ3S_i&&IJ7I=N=zhw5*rJ{!i`A&YbKtTOOWz?n>>cq`X!L5b@m!k+^aacectiR z#NxQH4S$%H-#<(b;6rDayBR&+Kpg!U$!5LdoKeG83sZHf^LqYldG4>#M$xmL?|dQk z$hQ+Si4CIPYznT`?xw@Ny27^5TAqd<>_d{maN~sbk60~~OGv9VvVJ0$I)^_#comF` z9F1;|dllC^u5I)=SxFt7i{8iJbCAKyj|-YreSQ{(X~>SQ;^y2D5o zt>*kqveQd{MexF_;~$3USm6wE3wj;+CXs!)(fiXmsMGTVZ)$^so;CJ!3*@m|khOEf z+HLf=-k6K*kIq9ewQvx2paS1C?t%<_QY3DJvLuNL{J2_p28meX!pFnuX$QZGFFmbz zTu|5vDoD2_OB^B$6=q1=)hwK)>9sFt*>d65Orag4Z}u@a!8$VJ>XICm37rk3Zf`~R(a;(`NAvlU*R?VH6w(=N)`Hqs#^Kr_xGFatq16S2f~j3=4=ic zMyto|&+}J&TbyS-{AEgI-L)mRPkiEh5B$+M#010PY5fGU@s#YK!p3Z7LK!uSVBTjp z^4a;Tn?D*A@%#LUci<7Nm7nnvx6l_DUA646-6K$dSEMtjJuRclwR8BIYU^LSTl>?3 z)4}YGU$rs$*G*8#$YyQpTW_)dx6{b^hbOACQ`7J3RYF}fj=f+Y9;!H}8A(Lh+%xVS zZ@s$_J(vx~S`0?Vw)4sf;ohNEXixs)&TTJbQOXLXgvH@cU?NQgH(XUrhfZZITGJHh zNmG$Lk&?}zlO#zK;Zi4&D3wq6Q^>(heV9(O+PreDE6e3yF8DM_-esQ_^f_+{K3xVS1j+N!i&*P)pN5Jb)CmOX_5~v2s97rxi7R!+mxT z{zcP^kqf*;e`?I(DHvqf7Z zb`IAAPudY)tj|X$8R8rmL-N4`wxd>dI{4hW)_-^jve@(NEbi0? z*m=N<|8nxXr(j^m!7d6YI?CW~Fzpp2?_{SVe7XGz4n5YYjYG2%)Ap~%S@Dcn9Y5(E zJ|S&`F_9b2kH#cxH5$pUn#QV51Abj{(!%mP&+Jpyw@!NRJ}!h3sIg{R*~v-Y&3ku* z+hPySfi-NRQ+QHpI)~WuPQwCxMFzK9OG%GDl=n&WiZKmO*iHSW@*FJqrdStOMLU!) z75N>8!66Od{@BP4uJc(K&0c;?DJr~IA3GEIx{8AX#r%&InC;Y{*J=~rVKBKJnz1ir z1;-!7k8O91y;q(O!ki~m5PY*MdfPI%=PNVq41--?0LB@mKY45TM5qoqP%FZnOA$V8ZjC;E6M505R{t(O~?d9b@k zeW))s+q*aXM&3u1Tm9UM!B4?O_W+;Yu4aB-!@qG=eeDmbjc)B8^UZv6XNG}Krg1(x zjhz!lVx?L5=TJRaFg9}6240c>^=_pKOw$+2EsC{hb0$O&(1P%L=uHAH`L3E$H& zS`vEs9eLi{Iw$SRc70`)n$)gNX3GQ;TjrXj$Pig;mPZpX$=PS^HY<5)EiFhB6!k|0 znIcVt52U$$py%bCpCb^#jGp+{P)JSpUy%&F+8v?=!d*7u>EtJW0T)>TinoLGs)wXk z(x%{wULCKZz15lQj?sGgzq*U;Ax=Bg$h-XKK^ojyOL58_W4gGHPBo){%L~IKR+k= zmLEe$-blOvGr)*c@-lLW`Q@nigCNi;^pbvwkT?+j;4UdLwY0O`0%^1h%v;CF19(Pm zkU-POLfC>h5Tg(|(>0We!q>!vTX+h3!9_O!?H2j$tP1}ryu>$hN%$nJ5~fS}tyPX^ z&o<}bfcVp@i}!kyH!YYNJsA66+_8k439aLc1{EV&{dP1k=T~W~igt~?X5`jRlgsqb zdS|p`5;z2A-5%XoQW)dDsJY+cA8Twr#|^(3h0uC5rn^7^s)7I9A@$=LXG2LQ+ve;c z%eCfoyjSF`+owI`Tu7{^BwK7Y?aA?mi`wXg{+Z6m%xH&?xUaoe-ZMS}i*R+Ad^$5b z)5+z0X5}PdCN27k0`5xZSCGJzbk*DdC#peX>PZ-`DZ(ty`puzMxGY)=N5s{78F6SR z2a{8JaSYC?RpETXevl$JbTGz2!TueJ(rKaZrF6<3(lbwrMZ_tz0Tl<=i{N~HgVwjJ zv`H59>GBXUjkHGc@cYfgJ#`efxdlIPfho};$G4|jCD<63J+5Xj!HuOYe2L|-)AWXU ztPW;ez%376P{)2uzw*RJYy&G|-GHKnjm zoFETHN6=b4Cv}%Ph_98wq`S@`A$216!Blz=TN$gk(>;*$)^uCllGezp~GuC23^*+0QIy~6!5ofM?k)>v-xKXBz|pl4>J zo>V)hbOqO{gdQ_93}kB4uzs})8_D%`sG{%E9o3&)w3g)Z@74~16m^mhhVSZq?UOLT z^X;GIk2Flj<3D>Kw8nGt2=8WUlp9stY|Qe-os({6zlN6z0~OE^rup&Q1)2G^Eu8x{r;?om6<$|svbIBd?JrRqNEV6x zFO8!5V0nAEJ4)Z7oToP+MH-CEPPv^YdM4K(H)b^92RgsfF6A1Jm zI)x{IdhA3+)P{_e6Y#gG!QgW;@%Zk08hN%`qSRQJ4%5|%dmvrtT+DCe3fBE!^7zT0eSzwlo9or2<#hSBt~ zFJlKpl6nh$EBYY1D-!iR=O6NT%Am102%~k1sXMPb4h8He{j+SEXUKZ#PiN~Ykhjy; zb$sPlodr%$cFvG7#hmDu5BdZrgWbWm!6|<#ee%!nHQ&Q~77uT5-_HkLbU!%b@AclG z_{|17(?l$!x8zR?I7?D+$gzFx(Y~oA=<#MB)H8j^2wQK>XQ#Xl6V(A6JYsIJj!J2T zk91@gMBn*2lnhNz*|5n8-5}f){l5oqFc^*L&Tzb72=~G}h1qoBG$$*hqc}=BAZ-)- zp*Q_aiqra`BeLlkJfohX=V=oeQUD)Vh!Yp9} zr&%n2_Fv&S!e^<65|z5aMsv~`2Wi%Va*2=2Tj{1=@PL#3+P1ZiNnA52yWG7jd5@0C-M5RT^#NJMh~DKaTU=Br;w zl0VDqbBw#-M`0~k$SJV9%W(R=(Mn#BR_dw{BaM^GqM@INLVuJsgo*JdJ4#ncbJ)eB zw1}_uQ%2fEUj)babR~7FFc((G<6Xff)s-CKL8NgEvUi#Dj1+Erua2|Jlu4_ZhF5F_ z-1BX#l{Lcbj?bbLihw7aCEJZ-(yj1bd4iG&ZnBWlQ4qp;$j2N;&fYTZC22J8$cvt< z|6rZ7N~2t;re~JMqA0v6mr!m?3x%+#kn$EQjt|$A@2CgxetfT70fBhLCeellxP@+i z@hY?TO!k0lbUEw{UzNJkhn*fe_w&WDjdvjRds#n&N z(10BQ?d${Q711iGdqam6%c(=A`3751ccNB}4;K;pXkD1tAJF(+mgb^!C}pdlscGt6 z@QOI2t=!ID65T&KM@VN%;^y-XGClilZj>;i?M_NMV=K3UfG)o`8m)%p7XJ$JcpBG_ z2)|IARIpZ@^@I8694FS=YoB)4( z(*;DTt2M|xr6d*=Ylu2Y&cti#TE82cwAoTvXrxq!Q+Q#{0vS5Q{W2KO)gDu)G5DRG z9PGcd8882(?RF}G$nkORt1z zF>{P@_xPdM*KSF&1h&=LF`lV?E%ZGpRo!!>!9dz?z z+&=ah;|}_g=YAr0yVc6DnWg)fnY`ZaClXj1qf<|2ck$Y}Y3%A|7k8g6yLtR?^){%U z7KU1f`|;F0;5oXY^sw6otNh+UmguV3M8SCP@7QATZ{tqJ#s-DFf^2BtIvvqjY;p{L zbtHZ4^7yOqx81SI3*!hWJa6cYyJ{UL1L7pN#wzEKv&Slf#;==knoi|dueZ>O8KVS{2v1(=j&+lEQ$PJx}b zyJj|6mZiI;OQb$p5CxI$?rsniknV1f?(UZE?)p#u!^1?^+1YoV=f1DpNBT@EQq|x+ z(ZD{&6SR+(i;mn3PjuO6k5;ChQPF5@oHPoXPuZnv!_B29eYq?M^gQpkXe%-ht@s6} z1zmcJyyM=VE?!zPd{q2pUBL-{^YVBH$r5?blPPc;+ysrS?ryL)=-Je3Vn5-M+(bGi zbs~vzkaUpN#KBT#rH`1LzKuRO&yt2rFrb`b5**2qkiiXHQz}5-emQB6&>|G@{0lor?ief6xq z86GpUv{P&+Ho?XCj11|d)+%?3ekeE@zH864vO9ZuPSemoca+I;5Q@%oG`UR=oehan z4g6(Sy!OT-cc(br+4yT0!UFiIFOgY z2LBSzz-TWSPLr$FFoo6v^h9}`wKT)!rbD6x=X`CHw-r#HECk^>fWGSmd_g{D?t>&c zt@lIjGJ6Fn9&7D_&Yw7m=Fo&N*8Rn;3&KBwndA_-$P@6Qwak<2K*Xw96V&%|$S>}W z*J6y%@NhG&v3g}~CU@}9d~RNu`Cu6O*hBH&WkId6jaPb|B&x#hMPseh%+TqgEYA** z1*iO8INSQ{9slB@^k9vrdLOwBKDbeAy1PNfZ@NwG!tyFu;vS$vDal-~NH=#{l5|I+ zhbWFi@>XaqlS_MPs92Mqct&BbJeYjgY4p?OwHAaQhx3FF`D56pm-%{ly0e{xyZ+AF zU=Ml7*TP*QzeHw7mx_5GIT>jdlQHITICGFqSIoRH&G*AW@P<~EPEKm(v*YeN=Zf_| z!-*dBlMN*YU?h2FBiw>zDt0%y0USdU~?r z+Mv4l*D34wx9fo7bOK!y-R0J&z;L^QKFtYl3@;>mNev#6hxa{>xdq$<3xj`yF+sj? zPMilx!-xHc`exxlsE+VlJf&v>C%lOwaX1>ZhHgslJ?O$NkgVQ8OmLW|H3WL}#jhMr z7o5RqaLK>zuMXP#Im2mjFq9&tu#|6+deqzBy80E=xjZ9G&a)fb2`llLRic~tsH&^E z#FDrcR?%9plhdv*4F-SUX&ZrpXqQ-nhWmJ>3<<*P6fbBM-NnE9tpm|%?^W~*g#DOg z`Im7MtV(!Wpj!ST(KRBE1IbvWlp?3Jf^pHSWhXc4Xj_yPd;*5yCR;-~S{f89e~^&* z80JC7v46*EYA?4xMBXKIcU)@{-12Jnf}O@W674g=4|X+5TJ@am>^M{O>v*XW>FpbD zl%l~^HHN{4hT#{Im{(wwOQTMS#*f?DO&QcB1MsAK5G1uVN+At>)+YSO@7MCUw*9nDiXtl*3eqAgfey3bl(wd5wU$}(^bsLV4 zRQP_A!&ZJrLb3;MIvJI_%XaV%e!UMK#)Y`cPLXKSnERGi4}SfOorbK4HTE7d24pj@ zcM|vKdlXX-Q89Kzb$QlY0&`AAx@0PG`g)Q*e>NA8rO`-CD^HPgDd*H1!V~F;_66=J ztA0Q$tlie0&^wjLNn^s-t+6_3S!oW=t@c(^s*}Yv!hP|mI9B{!TuF~-JNb^!m~s8*vVFfrGpfng*w}HMCi30K4#k{G#ki44smi+FU3i_70U} zvptDJW3*UY-mL7VpQEMRUF+*~F;^N_mDchA=_Xx%E40E+0W)IE(x&lq96+Aca9H+L zc(hN!{_5Yf`u6YiX#S4F@TKwxF1KvL9B_}@p&Vv!5Sx?E3hSh_I+Rh^A-j5ND?6Pm zRYCtoa1#u07U5g{>aFoXf1Lc`L!^gZLD@ads}!E=zh+wK=Iz2;dfv@vrcr14tz6$8 zX|6Y9Yb-bNdUw71v)cvlPh&FY{y-b_8~NU6onP4u9@zK-{eRp{Y;fPB2eVNv=X7VF z?3wBIbnBq_+{%pcz1xKUrV;lD5-Xx#b_dgR?O0pr=6Y{DA)#%xuvU)8 zJ3gD-@&#yaThQ;-2~=IO$D(nq6Nbb`4txO@rW5;M%Fh4#E`mlv5$t5h)dWKIV^@Lb2Im#)R7h zhoXOo{t`arr8Fkl>#P}WlJM8C5dL4#+r0o&c$D6@>2&Y)r3Z4ZUJhh;i1`Q~-UMTj zk%LoU4{Gv9RwrhmB=%@!8G5i!p;EM;Z-w1h2BP&p>9|$Yo$5dFcL(eJe$mBZU&j`X z+Zx?Bk~#9k@8+cnh6fvI1s?8}2wKL}h-pVc+MYmChvCD?#RNKtt z-1Cq#@!)p^h+^zU`|*c7B50q@!@f!|@&$l@2N&mCh(Z4vA}& z9dv#>`U>{)H(D}%5$QuywZFBGWJhkqX;6!%nFQ^QT3hXh*Y>86Tinj?O~eY~3mk6u z@GcAzzMxTBFWpvOD_f=G(p~3Sbe8a4HxJCsE3XsXnZu(SLfmZidUHi$n1p3k1st;@1maK&v z)+AKPlSm3}PybGPp0EFygHNL$Jix2E3vxKhjd7cygnUTO<8rgG^$ZSi4G9gCLEMg7 ziKMv1FyUthtxjurffaU7%`a0{a zeIK>LdAbocnALTMcBP5Z?`Uf83fsle(g3LuIiJ4R93DBNT2oJ^t#f~lwDUWA(atby zl2{o*CI$wA^fu{!ffbulXrnPWKEeIb$e<*2k& z8Z4(%?x_8(ai}Mj>(8b9=$pT&f0NMnCyds=Y7_F4?vq?$k%za^!lG(7Jddaw~r9ce=-0(b3^V4H!&sf{Q+YP#L*k8U$G zT8)E)k=}l^*FElVq(*px{k>Zq`IY(m zv0DxPxejM~Qg=U2v`g&8DxcH}+z~(8E!}=h%^h$F{^ry{LG+ii-}#oR@R{9Wn)4Ai z%O+5qXY8npoEvNh32tGhF$u_7#K&^T+D9_~8oM6}yW>E>)@WU%Ucwk9Fk?|#ge{55 zDF+!{KhW$ELFY7y*H=Y4qaTK^obGM}sp!VPnL2ODZe+Iqjxm#AVSZH3rj3rZv9D)KUEJ&1TR@U(COSR6?xOSx@gah}?~x9^=KFjpa=Zy5h@H$lx};)nLf& z?L@bB@JqOgGsdi^m88}0q`FcaFTa=jDT|ag^xkx!-EqD0NLvS5`4g>9Kbu+XTI8ph zT4`mncrf%JbcQ*24>Lx0UU|FFa-psM(8|bt+Sh;MO^vM;^Igp3*msdlky+t$AWpf0 z%8{6uwBa%6JTnI6B7RKwxa-jijP2SeG@EpYli`&bk704P#j@T)dhXV^h5i3Ua!0C$ zH-!&`%iuSD=$8oo4yFaC0xkTRTj6n_hxdRO%?cL!SG06uTH$l3lk`9@iAM1?2yc64 zv?n-8Mv`>3++9nX-Fe@2K~h-pSwL z_OJA5Fo=w!`r=1n0^Y)B;6@8^y!|O| zR8DHX(oI}oqSY1 zOxMg3{h+>&)T6)s>`qO$mc5?V;eV|>_zzP#Z8!_tl1+5o>drsw9G)0`(yGbnI2(6q zEPBHa_Cn`A+KfA9WAXv6kb3@%iT7`w(?|SqBF(N6EORG(YnHVY7g8;hMD46Pb{W4K zdHy)ENZTw9zgC0np`>1Ir<8qz8+MPfTL{BMfIrSD;2OTe$qqJ8ncG?nDZ4e+vgm4ixIHHXqfeXbr;Gw^<1 z)#|ImP-*3WlivtiaEv^k8d@r~nDSM5qBg;6_K@yW*Dgc$*duane#aA66-`|ZIAg=z z%&bw~?d1)1M>ql6=zVTFu;2N#ICheaF0$$jtc6?8uCD)68Uy z*Q=8;G|#+F-t%_-oocB=HIGTV70HxqjSG5t81^M#ZBvcGq+%7ZmXq+e3v4YF*$8|}r7aYi0u9VEKa1bZI-$)(yHyTuBB|Zky$eg6or${_J6gb`Hi)#MSf{sL%3gvh zxQ8=_8Fq#<(a%k4eG;5yqiEpE?k0Bw_=X6(LMIf>XPDHZ`6p?~Ju1t&JeozI3u&W^ zg^f}Z%?f|@XPQ;C{zi2s<9&KMWiXmbyRaJH=S@ zJ8u>k)Ijd1&zwT7*ijs}Bx**T8Lc$8LO+n~Ic`4h8LpN0?rUd|oJ0IfEBF1VZ>Z)# zZi8)6b>NR5uoFZ=A3~RD2hA+4q@%zhmswYfxy|h#jfz@kqmLiXY5dPXgU z+!-&;5a9>uxYAl}qv=LFr+MU2@WGoCtb~1i<`uTjYcKTr>_w}XweG2|(1HH96`_W( zowW7Sp$ zk@q!@KI6x5@?}AEws}LnfutZkK`GWQVt{Ku3a5!w4v&Ku8AHF z8>t`cbl=lB?kXkF{I=(PtBe!4D7^6;VZ5lr=^YhU{XbVQ7=H4MuvVA_vR@0`XBMW> ze)tEc%kdzv(>0w8qSsnBbVPUH3(C)FkHmZ^84`Ld(xN51;2-K}f_Q;?5iZxh-gl0aO&+rhgu28vP;JG9jiJi zjX#lHUYE4zHYjS&INAI^@s)PB)3R;!Bm?UrzxoDG)$b@;FO$9S3{`z1tZ7nosY|l00j5;Ld7B_ntd(C22A+xIW5A)nQW4~5I51YMEL%UWh zbWgNS(=O4>5<*uRWb~=q}m~T%eo$2g*NkA$5{6h5P(eJtkwb?XUIFD)M!*aAyy|4^u^Gr&huLdDa`}*4J0zk$EXK)&r{#{ih}Tgy5A+ z@Om&J(f}koQ+O-dQaU@Ff>u|soI6fNZ?m5~_&|PP25&j7$qO|m5VD1u@auWpw6x%! z;=YT~83Nzak#yIqAxk_aG(`u{NVpq{6`JV@ro+4Y zK$xe-`iZ`7P0{1=U|wQcJP$jxjP!$@p|$Ak#?ynGO5CjO(YG0m-Mi+GpuO>WHB$M; zk;Zexxnho#x3Rk|!LgeRrfodz(stb8yFh>nGw-itKZ$1AETd$wO?$I6F?2Ze0%hI- zHkWU&ZE~nASao%F%8~dYrb_+v<5pfWB$5Q1BVD3 zBdkU@jy@Ew5cCa-hMPLKrGk2x9L5W16W-uKZwWe#_6Ob4lAylZB62fQBQiF8oEzW) zF5_6ZgDzo_9E!X2+%^p62J?e7;dIesB7(U}9K`+9QCg}0Yaei`xV!KY=5-Fy{85&h ztblveJ>XZg-Whkjvuv74{LkKLlqv@I)C1>lREj^lpYRXWh83KS*X&nbg$*X0!x>@? z*4luDB;iik?aboyJBOsQUZ|of^U7kJylOFd1xZ82#Zu^maDCwfE{+?lAPJ-caTNRt zK2$<12Y-247)8SLBcYhMLX444O8u3y%53?F+*v88kHTA!9~E|3KT0Q^qm|d{X$5f} z&sCRbjky*2YTwaIUR2F07Qk09)+ja!1Pt0)QeL1u5aUr?4%r&lj=A8 zx-n%U9fFeNcC8H$^v6XO#Z@j4S8!dy-3e(EishGMGlUD%|Cy6>tB+mJa`d!Xyw*>B z?Von5;fdNu`(el^W&Pw#u;1b?t!r*)Zapdghi36BIVhZmD1o9$V(ScMe#&WYXXcYI z!~ULZn&a%u4atU_WVLsz*;nAyGUMY}0>kGiz}FSU<6p2LW|+zw)^YZ+!(G-G&|9Gv)yPwk6%CWvpfQ?U=rmgJ*$1s7@+lJ{#|0!cb|lF#kGk3>~%Bd ztJTDJN_($25z-)q~& zmg)&(6dPB0voRRmPIIu`Ums1M`bGH7OE=~0+GX*$*j+rN?AE4A-Q?p2_5U zZKzUSy{_C;JE@)Z%*IS@f;x^i=6YIdd6YiKUav329ZX^@{Xy+*9mVT#c2^faTAY&u zq%j5QQ2nfT)-t=IQvk-eoL|s8j+?Q)^WLe)4)DgAf!fdniF^Z}JB{waKJ0z-K$RNM zTa^eZ*U-wT6_zH+x0UbIjM^od+NO{$KGwWq^)k08|G?TURZi)p%=&aY#o4dyy>!R# z@Y=#{{$h2I17iVc$t~RXuy$*lE94@L=U(WDpKdIi^?b0R4mevgc&k8*>hUX;oHKG# zbX+Av|3zJnDvCQ$(Qshs96 z7>(L^CMhH#JQUl7J@}Va;sW`OUcA3Zkct;>2m_=x@;KoZ`R}*jpyuLJpGciEwtHud2F9^*S@uEK4dFGS_eY}mQ;kccW9Kk_OCsbwi{4Hh< z-NIdv%3lv>^VR*qZ%GbO1FtQN^^aZwkhGjI1?ByspsmTh7r4_?J7=wB%mNk6(pCcg zl<`g`+KrdNab@vWMXCms?Fs52u{o#y0I?+}{$((tj6xoq1(SpisEU3hD`=E(o&1Sg z_>XT1PlOa=4lx@T?N%wZ{I|SNzCb4Md(|LG_oG&wyWqI?UQ_AXtg6Z27_HS>T3x(m z?Kw}fYVr6BTHsqaKqJ&pPOCWS2XQgXeI{`PzURs)0=MxFsB%rEns&tbA!c1nvzQC; zNj>3bXN2>{{uw_dp>V;G3BMK?lK)NIFX8j}M!Q(+?6cNj^Pv{2UsKa*o85`lJvytd z(_fOHpE4?0ea&{L3R~zywZGM$HdWF!}iEDV=godOFgMky8DfhT!K+kbjaok=(88C%X07H`bBfwg9AdB}$MQ zP6v0q{RtLYguCeF9rUk6Mnp13H_AUE_J{Zp@i}9Q$M%fr8~vN##;uB4`z^Uy#m&kt ztzUXq^5@fwqvQ!jRi})(L986=FPU0zXVsaPkTKob;Qt+)wtyeE*&AuJ zmA@B17-!v0+9+u<9S$4Z1Z|C!TuGE)iYv9uV90^f!}^xe7iUDnl;`79Gzk`5)V*_?!c(j-4U(_fKpTUUAx+ij}J z=wvxe!pHYkDQlE#Y?wsuwU=3{H(-Dy@lQ4MHqv+;#~1( zPXCrXJyYbjVof-$LBeBcx%5OTBMn#T8y#pnSS4LivKi;-_Bp7Gw9dQbrL5-a=ztd6 zU*bkPUzoKsXqox08}ppxpkLsKp4wGfvH>L+{xC#gju@O9DA&gh2jSPS9DGr-6+Mh`j`Jo61F?r-ir98LGxZD-H`k;dL& z|LQDYe<<&l_x{5tvKW6^UJ$+ifzG@{jgZaz*DdSqRGJw3?3$^PwbeT`|s>Z9oq5P@cI#=p#;7n}P$Tw^y(ctf1|RZ2j<hDY)t~(4uqhNavMU2z}eQ(6gu?CECR5cAbC3Wm{eiH?M4)46mztVN#J$c|?@ZJ0+pc;_QNyX)Quv0tLHTq9>D)W$*LOp{QeRt@5=)JH- zwB_^46t#%DT0O0tQw(*cT3!8%Y?fYP5urA1fyp@YKZkmgIeQpYS~Ae8o7^8VKbOhE zw>H6UG>Q%uN2x8Gx!x2o(}85cCG!F|IT%hK8YG+ARot62j82J+jC_gAkG>rfia8sk zwOh%(jI7+i4L}_JwCaO!4#Z#Z7S-@D4=#lBe{k3icflEaA4Tb~@P|Mpfuec1arkR6 zkPN)l{8eQdY8r?)LwiG?#RbN%%=1-nDb>YAQV}GfCpzL9s04O<6D(C-PPf?(FE3op zQxas>hu_1XKliu68Puaa?KBSM|6r%)qhsz2a@g4U-8`UY0_|{7*FUh%+W$jYc!%`u z=6>PGLhrqkPDv^575}2UpoiF4OfUA~9>|O1xDrazZyw&Le%SiVrQg1O@VjvE_E)Xx~%n4>0=MK_k#wKM7~b)U1+T*jVK2lg_x{zh*@&fF|c zv3s0vebrR*R>g1+L<*Z{Q5i((RrG>Jak9Ik>=rbx)FS~VAF7)K;aO(Kl**lx&;@XC2$?$hPA-mGk{!#VXgI?t2j)m%0TYj>1hYFZ^X?E5gawc3Qc z{0vBc8@(!;uz6ZzV~xIBt44mNr$r6Y3L`_pO$9^tS%Us43QG(=< zN74v6i~hzutQS#x>7xwaI6=bOE%N9$s{EJU(5Nt>$v#YvAoEItp7X6(t0DPi6+JJoI32X|b!?lx5 zNKVp=4JZ0koTI!{=Iim!pD1&lp!v<`4Te)5;6A|dH-vxo5`4b2)6zaeLeD09f-}up zWt(0XewvfOYkGnattA~H7n;s-%oMXw*HQzw)(U(gZ_Rto12ZQA)I0D;+rs0r07PXlCltNW|f+5In=M4HgU@Qg^h*xGSc%#EP4x=}TG z&*$TF{*@=@EUJv8+@AGGkf<3Xhi}-xX?-+^4}XVaZcI3D_$(|z+Hh|E>U{Vjs8N6m zd5pPPJW4}GMroWrj@!8o-DeeG<|jDWm_ZMs3%}+*a>2RvPu@&F22Z%^7Y$Z~Q$}xz zeokM`55X3iZOR8FyhmQ0zz#ZiwaCSC?B&*G!z7ue9Vw0Nn0U^BMcOEoZ`o)4dEv&q z&NtE+aT^}s!n7f!L`C$NEU9lvL?Yhf3Ty`gsD23iC{fH!(m|Med>(zTrNuVlD4ar9 zrAD%>4Ab7|h4s&zz3)JFd%+A;XB+s|j5(9L;0JDod|FcNk-9_aM6%aNX1py@6VRjA z>Pl|?&QeuWlY_(~C~71zUWrpCDHD`)dN`6T?r`jd=xShV@zFno>xW-NSI*xz;d0{i z1fxLC_+F7JIM63?nw*D`Tu7&1HZ4&t?rbuDGhCyQ{tsAh4|>!e>Ra)RzR>RBYS}60 zms{!Q)lynv<9{IJ5&e=r%Uo|wBVF_gtU_ayHuYhCo?AEJ5>6VUjI*3!=h32FBM&2k zUC}NF{$GWr=j-73#q^Mqf+ohzFfm=xZp7_D5 zEv)2G_c}$KWhg@*le?rEW64#x#r?R2@2R`CL+Jr7Q$m@nbX0XZCK_>fp4T@q5&uA{ z;5I!cO?3a$DytLJX?jH?)>>gLG1B17ZLJRgOTSQ}Liv@(X6YhLz-7=8^wRd2oxL1- z3M~gbM*{3aad-k8-u&M?lN+2B5Ab?&9{Rz;e<15MjIwJOZ6bH!R0MSF18rHotuD1D z$J{8mu+ZMb>Iu8^e=<%;9rLIeGu2a6( zMxhg|i4XBGx`L+UlUyW`;+Z?qTTR2kFwT(~_A^VflYmN|M;YDP>y74Pz0(a{co+I` zE^(8jN4K1k9Q29qe=Z&7Y??XUtz=nNqKP0I@AX?;fHIwG>8*oiyfM|-Os7RJTOb4V zh26`ptUneHh1N^|p^#qV{^&oYU#)2HYxo7MKzsB}6aA@PcP5&(XbK+D);ET%x+wZ~ z8+&s};H|{Gl7|e@=Ikb9r=ddVryL}2tYPS7RAI7H>Tw?kVEBdc$poCQOXbgcQ=_a} zPdcsjg5ghrw&WPOWhu40=2!1NiOXrtscJ{-mQxVD&S5@rhFzP(b)+-_6>$}5BMC(w zH$qOK7rw(}!b)i_z$SiaXfL;`12RqCz9b#X%GG(2o=bot-@<>1Jhv%lcY{+F|>ng?ULk* ze9ztcPxP`#tk>5zU^IINYlC}!zewZgjggws=j}~WDNCg5Eds8*oD7Pg;CDaU4TGZ2 z&Y(ChxUVEl$HP2i4BrY~1}(W0HUwXSOTi2H@aN%!;l#+U@MH6}lp0UXD{;6!*cs@J z^nHIMnxI^6N;Cq|=-7|atQ`K(pNFLWQ*&- zp3;g-#0g~54^)qbq|aA442=`Yv7G_i@FK? zZ0o=Ywd7NDh6I5g+EY8X`&rYN(`tvN=Np;tLB1EErjj9TQR9PUP7U#{+MA6(qjl52 z!I_+yPQUTs34i*doI!@CE|zvkqPc_g9!p+L<6In$v?`pT_tc-k32mzqeU4|1JoF3n z!#D8?N3e}&teSd+G@nk&A>5zsH5GrYVP59_YM?L0CqBivp*7{_*jL>L+Wke}XpKST zS=&lu-UdmE(>In}U->5|UOpp@7JI41P!mTPo1J>foyByN$6y%0Uz zbE_}j??<@6ds&rfd91;_wGLH%9G-{dZgcaa)?3SCxgQ zm%to(ZwhJ+$u7QQowGL?C|u?4(k|&1oe7I+Z7nUIko$16+!0^EVST}=F`1;jvFZuh zfl}}*YsC!Ga&Vsup?um`99_HZ;v^COspViwIxlt+UXY9013%Sylry{OGiWDd6CX?U zNylhT^67r#wCP!Wj4R6R&=pYcT<~MXrEc02W~NSRZd61q+&O+G9LcY}!r@hZH@vE6 z+$p$QE4rJU*-RhZ;G#&jU@~3m_2iuY<_GM}ZZMDi6NL)%`F0SS1Dx37IgxXr3pwIc zK;3W`SI0*)kDf(o$o{n+&d@XdqJ4Q4OxJau;wTWPuI2{iCm6w{>RB_b+u3jAD|oxw zg&(?q+G}X($l@>b9?)TMlBvHYj<+vhP$%)yweoJ`uKwg+ASdWDf3*YM=^mcvAxc~E zzA!vgl?J|LTGMj!93RpoYY@qusqEy+ zA^n*9oIPhPEDGK+XQq)`t_`+$N_wpQsuz?}iRpx5ApQMeiC=|=NY~6V_H7!in-~|( zN^U9A?oWd@ZPPR8qTWdFL!U-0y&7%I@6B;Em3%|krrI^kO;Qi;sOd1r>u?t&3LisX z(Fo_^%5N=#|3D4_9(Cs#{RMOAu6Yx5rp>HsI2E4Y?!i!4<3ltU z{Kf4%B&dY*ph@_4cysuRc|zI?QZ+!#q3^a2I{n?gcvhzed%SXNXgj@?I55|_smzXg z_TY!$dQdcyHRf1kUG&&U`tXmDQxQLW-#h8maL>R%t+H$3fZl;yv^L$^O;K!V@Inn~ zd*6h=cAq)RJZ+70TKT=ghutYwLp2~d&=&tD3uu-&TAU#+;SQ+JyV8L_j)LV)E(Umu zYv4H;BF+}~h!@2tVh`pmoCP!!Zp4}PFAQ9D{l1ozyI`L-5j=T-HW(dg8tuH=iMt@o zX7E-0q$XEWh;eYl1#me(6>^g-7E-#AQgvT!NLsam(#;fUa_|a^Zmxr zKNa{p;Xr{5WazjtdhD0DJ_WB9x>KNZY!Y`iUw@F%*UW3=*7nOalwl|>wUqMIUYY&MW+pYw%NIB&amwrrtnjxqt+TY+JV1wcnan|v&8-hR_DJ%rV$37)BjY-nt>ioC z+NR{|pRZfKlldO9C!SZ|xlztnnEJr_;?;0`eJrl2sd6_`e>@n@gX$RduG~nPDz^wS z`oH48dV)vr2q{sU#7v+jHJwlPY_mQN>(NGK^z?)Eb7U-KF!~!M^#N)(aJ%73CoMPs zbbx+Q??nUdF1;=&Q9EtFQC0szJxZSFYVf0;dI%+2YrD9!oH;+gHBWEn%qUPVyh`aJ zpW>(1N3Nk}F|!4wV`;_F8`1+X%18x)L-nPx(px+a%cSbk8}!eUq~Ypdd}aB~xq4qC8#x%? z%TdZxxw>44eAEfx)g{@h{$;C@v_eYSO_wrunx?h*< z`?;pAoFtDkC;3@ZLQg|e$x;mqgW(~I%A3@5MkBKjPslFzzrrANuW4bgXf;x#P=%)u>Gd7b=!Mq8 zYaL~G(Y=T6DfsH7{JAjh={8;w(n^!zIos}PUMjbQ6cYQg1>`|Tx}K!n(WJ(Xz=Pa~ zZtfeQqw;WW02Sx{2yTEC>U`q`I^zCXe|<2Co9FFUs;HE+vIghLS z+2^3~o~GvZaBTDJV|<5+UK{sM=?E_4Eu8neQ8#6v`(k(KRVanWmC8A@8RHZii@plov)rmWJ7+fZ5G%V||Yb zV6>Cl-D0KkUO6vt2k&D3&w?AEAc;gD(Ud+226#`+f6?+Cq?_VS@CQgyBUt4Z)-fqU zF6CPBy6Tf2*@s?{1ixK)e^Aj+>o4@x-~@a?b*GM&Dwr8u5C0bV5M3zxpXim5|Ap5D zU84UC?}e{UPmb81_>hFwQ_z_S`C9RWcgtBh1S%P^m~ASz!HxKWGGbZs_SrVdrp(R6y#n-@+KZzN_)_%ps;TsZP3dPwx*m}3PJ z6aOvHFD9S0K$Z~$KTB~lM2=lfE5XWX zt+cYEAll3ZJiqpfHhcdc{d%#IzZ;33AT-5@JR?*O@e6zR>YUJw@HAyI-e5P3; z6*{8K&NEMoMC@WptaJ;0eG~825;<1B1O|VfpGZbp9Lvgw(Ag}L+OxNP7RyN)v`5YX z`!BPBITL^F8uBy_^Ig|4s*$=qN}r`JR&OY|)ETs?U*PUsqOXBjZegS{x}XbtMjJr} zR4>zTH2kbBHjY}G@D#iRLwjnM_WtKqHFg9i^1sjr(V{aoU_HOa9aE@dZ6|EW9|U3zZ37Dt%i|B!NnptTlKkzln?sx2>ulNKd9-}3d2 zswSRfckpn~SErM^wzOZGs|`UH+trLR40D(ELGkp3%4rym-_@yd85;VEDUolPyHYRn zp;TTg0_Ji8HLFC5=3=>~e1qv^o-id;MaqPeAkNKZj@6?iO*j$SBJ>b*pkQw!j0^1& zj!5V9uB3H5u}0wCEOc^ZGG<4!^d4*~{pzb#9^gh;jnnr8KbAH|QJaz+JF|TcIJYvJ)ss zb+kQC$>hvWCh9YLzrBy_v1yzJi$DU(>nYK0C6d`&%{ZWULb0`k-FGSbZ7eOV*Q|L~ zC*zH@HFQh*$5_Wrf5ENkAM)FJ)AejpoRJF8{BeBpb6tZRx@6wp_!%~kic`x=MbFqW z8asR9x9;S{c{|{gefO(4OejtAL@IJ+%iuX44rkI5x7nGfleBwB%k|CL#yVpN8s-gn zpMNo@>wl=Z)$?k!S<~vJS;{B1wo}EQ?;j>_d$)Vg&15H_ULHw;Q4ckhQc!ZG?BWad zjkf$&EmS(xNnY;c3_5yOt$1^e{avuj>xUciTQ*vpzE*#%U(rA7De*+suyb4Yqgw=r zoS5K=SJ`}3YS=xRE0z80Jxjw-dKh7)YZwi;R?};I05t;dqn3qa30X5Xi<0UVQ zkGT&X<9;~N&#)0(4(gIWQP+OWOwx%=tt-kF%L*rkUz1F+-032JMekZdOs76)7youL zRdb{KHGXcMh$`sO?*woBt=1X6r+=NVXh!Oi&6Y7bD*8isa4?;lqJ?w8s$f@v>B_~l zH6KOHQfAX()+Zy2eie0OC6W#MlTbDi-nfC2A7yH~pocx%-7ME2=j@X(A1|>d4PpkH z%xyRVPe^vjBF)+md(m020?xRHxJEpKGb$GwK`nNIjZ#jzp*&g6ras~s+s#&%ffk$X zV1QY;2X^pVA#IU55I<3IZi0jA8?~d-fNZ+zG~=}7w;jSb(54>jBiEz_(q*>vy;KJ@G)orTm%mAB|LsejBb8Sr=Qkz`6XH!?U$0<+|1eb~l$9 zuTGY~$Q4O+UThD-4_43|Y?L=@8Ux56eLz~~Z)9S`f)!0N4jZjtEoDnLzc4f0MOog@ zu8rTnGpf02yg_iORvz=pU&HadzPCHIE z=u)wXWXdkm5$fNnk4v|<@e69ivTWKl ztP)@owVbBbUtzQ4%_7|$Vlmi)~$I?|5=cJ2OZenQLXX&TwM2 zwSKZ1nd7wMa4qLiRM#YFajuyRzUv?=<{frZ^4bodp}k<;*H7YfU9Z%l!)>0s8cq5J zSI|r`kJ*y*J~K|TfnExK9)Eq^i}ek^H2qn*{Sv6DQj%Of9Ht|wx7khNl_85gwa^Y` z;5Sg5&P?3b(UWfZ#wDZn?-I(Utj4=C3cRue?wyIoK;=A6`u+TT4%0{U9gWOY&6M0d zWk_W`@9cChxv27tiFgy6=tY%=oI7cxf?`{AK1XT){trKMYk3aJ&1d*|GTZaqV}5?O zjV9c4jK$NGnMSM{qQhgsq@osE}}4 z?ydc%q!-hOOX2%7iI(o6aQhoC@eQr7bV*1e=1}hIKbWu0ZPpAghqKpA53{q%%kI|+ z5_m@nq4J;Xc9Lfb30hXZ!xpqDDt6esYNZYjwZHmPf~4W0LAl^S&G?Fg5W8_(Q4G3RR|CN2i8p`D5*tc*vx$J+#(4=*+R+*W#edd2wH=GK? zKneHS$(ag{(GRo1Ut}wetTd47DV>eIq zjiU|Mt}Dk#5BrIGraNuQi-nJ*a$Xabfenq8)5@llOe&#N*E*4Ye?^@FuX)dD88foL zi-g32x$@tMZ4jM-?C)0LRngDma>RJf1lWcsb*}!%sD^f>hg?qH3N~7n+hy|s8TZY}yWDJ!#8bTp zJmssxg}gJ)81JRml@q9o+ej@+3idm?8s>@}NGv)a?GW=zCduCAq(7w&WT}t9H-9~< zSX8#Cc~J>qM!k88^U5QnL&9+;jpyPgu^U+PbS=H!4YsTU)1zmsQun!8)D@Df&9?iH zQ1DQBhn{MzR6-qMY?r!fyX^1X*N&?_mY=I8y^yVGWBMwl4z<@>@oZc&&vO%e3_S~_ zMYHOvqe)u%Sve!c39Yo|OzGcd^_Aqx^#@6OKvL{KOc{A_g+1i_eWm?Daz)4-fj%c5 z*07m7AHM6bKPY$*$r}E}sc3aE@3^^WrZVlGc=2i(wQ*qdHG8r%MA_xpH)o*DO37LO z&HpWfCk_Xy=gghP*2aa{#C2;nM|ThF@JTAc(=WpP9J@>R9VmK++c(I(HU;3RyVZn-2Ei8XSH$ofB+^9wm!=m?mrIpgo;+~DX z4E8&Jk@xwtb5_0q#?+lIq7%HrRqO{ll&YxNOf|jOib;5rP)5xHc6^2>c7a{ST5nX> z`imDr3x)s5E7aV2e=Eu>V6A~EjKO!5(K|=~W?yFk4Rdr|2oL2GMnlxn1FSb_PJXfH z1vtn3+4S5Wrh{ic4ad#U4=oH<+kePum2uj4=>AUWgZ)mRNJWB9Zgnj^UdW~5Iz=(E zI^EnIY|y2hj;I2b(uR7)>*g;HiqkzF&%Zw;Xz8Z|GpZFmlfBPG~$s~|xV&>|{ zr*As=M0@)<8sk^!Z1!uT(QQnkVFe5nH2fj1#y8vrbG`14X|K~NDz_9}d9CDUns@Z~ zsw*c-31kBQLmFjUX^3=Ot|*NX%ScV7cWmelQ1_mYy2`a_Pfb+UsojmKdKrtha{V$V z?RWY$ZNI)$A5PyT_qo0ebfG+YlmJc9RZUl8#2cJq2XPaOMNM%+_>Rrvs_;rkha#!J zl$k7mV#-ta=JHB&rGUEHii`BmzdwJAxT>*ZW6j9v@RCUK=rrx6rI&n2 zoucQ^bY&T8q`BNy5A1vn-aqC7#e88Tn2XI1)>!lu|G^qm0|}o=({^WLiqXh;hYHrv zw;Fxz$|$xk;^v5PiqpZk%udI7p4%>uj&z{a8XeIb;|WvoNT!S(bR;LSBe0&6ZH>mB zli))y+>rN<7OPM09%q%E%icvcR#G;z7I--plIAi8oHgVn_cw-rjZST)amELic+T^A z`^k4~3wN-NU3jNHR~p7`+!w^7B+UffQS){Z29pl^L|Q3K2bpdm7DeTw!jQ*E>tOfO z3Rn4j3AlOM2-R_4Wt6UoXH?HkLw@#4dmfncQRf9d^XG01$*bcG51i;U-^oEVcDqp& zWWzyK8W+fFwY$0=pWs0f#!u?Lk-!a}n-hPtc2O^`HBhUnEz}3Js28QvxT;=H6SaN1 zOa{y&Fpg(h0r|1KgAAH4(p%cEuSqYY*V0D0n3~%D!|mgIwP(?*{2z!~Ea*=`GA&Np zML;rEurVD+u{9j-_zhTib9|8H$9<;soiQ zG*A1sAF`FMC>9YL7QN8%f3OIHh)q74*sG9CHfp&ZO2-C7rlLDhxaM*r^1|I+XOD zdt`c?ARBoy-rz1gC%c_rjB?UaC2Zt$Cb}2=){&xq4*RD5(Q4`c8l5Rp)XU(mw~x9V z=}7<8&*FxiOFYLnK`3h*KkBc{6wW1m9qPC#q}T+iReJ4((0-j1I~SIy^6$Z}sOO=l$)Db^+$h4d3*HB=zoK^8L;}VHBlH^t$*= z%Zci|6sZxd!?FJN2V3IE_P?Su>ICP_~QX<;8p>-eDM^RD~v>FRrpzo9Al2Ti<0 zw}xDlxxF)b%r>FAcnemN`1YK0yD~V@)lj1L*szS5<^^+@HAR+%M{E$&n96ITAWSWn zly|DT)aBY_kg{#gAO2r{Q~!y#)~u^0Q3q@1q*lruFyKV-1YfxU7jT}4-`a2PPx6Y| zMU{JCyIx@Yn#Gnf04&&w+&)@|q&NsFT~=!Z#0nMAI4g!fDJ$9n5XLnwmRxH?-B#eodvj6)fz?V?yh@wcbvG%rMo+%yBnlaP`U-_Zb3>~8l^?L zySr0D-r#-jvp{`v&faVNG3S_6FlkUmr!ni%rJwh^g=YJ=t%$i8TEAwj)Y_0@*v%LN zSz;jPL}xTNf06vs9NqP8>wvx3$>ojl%LT*SahHNE>3VZG4c%?_T62ndlkc;HS%8Ge zPt0q^@lVt>e>28v$D{+$j5dkq#4-5W{zkje7nSN8aXlS>XKAs#6$j8zr8;b|uj+B7 zmC@C0Kqg%7m@e`2;!8x%M&89Pj(!#F>CZ%Km>}g;R?1&gHl5l-<&*rg+)_L(T;$v- zXrE$YyTn{Z=1e>57Nm!j%szh6+o2wm^tI?F@9M|&!ulPpvi`{^Z+mDvZ^P`%MmA+R zr#=*zO#B-%+4Ugt3}!-#aD@+lTXpOxJaJuf}!7SiicQ2t* zcwz0fw>in2PR<}VmY=y!y>!hDqRFlm+!GwEt&%wZnD`BjYz_YhH>Lx*;XS;H=341j z=`N|EgQQfl#QA!Vr0@i`G8g0&;tl%jbV6AzGrOM*)SvGIAB4k!D9Ddbs8rsFio992 zJ~iT3g}MA|*(d|Nm2Yhm>!-C-`V zl$c4zz$Z_ZFY{lYTQ05Dz?1rfild&BoA)UVE}2+9S<5NzjAo*-&AyCduN^ziDrmQk zqm}9C-;B)~Y-k;4lJX%qB6>l>^g`jnWs43C$7zFkS9(kNs1+*n=@f>N>(MFf5Qn2* zIw!P58#*=M22Msrgyr%f_E-7jawMe;gm<+KMZ`kb>s6&|+DmVeb4jnQ52Zdez*>Apy{MQ|daL2=Uh*G63D4;M zt{qYwErEGeCa0|1%#R9n^d6h1^&WP!P{n95oHw+A-NFX%UNDEh3}-RBYOAyHBl?At z#u+P}QBo3>M^ZiIqLLQ|lm+eeypmrnsx?tFC?j}V9lpgW>>~>?pKZ--bg=eFUM%J| zr`zq!qij)+GfRO`>qXpwy!U;~KVfcE;YZiQsu%%*X{WRj|66fVlnc85C@F+Zfk~u` zmgY2Xg5qWj+MwK=>&am%-w=}8TmAo_o~6O(+QLiYc1BS&Sh*yWf+(8_{eFG)IDbHU zdqWb@RQAZ%18tSU=1ppmBAl#u#U?^=&f`w_$a)A&9^_`!Ic=orGW-%dv%89%_zwPA zcdt=VoviP0y4j8J2UeEG!0_D2X0;Q_tzQGrXx*74v=Z;CYvdWPbjQ-4O?o*j4ZAKV6i1;&b!vKIo5hE66yi^6{% zM9V+IG0}>*WzXKzT1_TUUU7slNX&tDdnEhL)>2cw4>>6%%#JXAF0oZyX2|gGWLXy! zEdx1PTHsbLcXBEAYytNYwb0Ln5Qk*G1z8l-b(w6dD@qQasEE2_}RIM8+&2$ey+f2 z80A()V>ZFv3peI6+ofNb1)a0%Kp)HS%m`w?x z%1!V9dVYVVMMIz}r_#rvKf4OCr#Q2rI&}0Vn@s~I(L4MiU+Jg6hnG{sbosuwqY}%F zN8>H@u3gM(zq8Nj|H>cGWW+;)8Ra@SgyumRZe`E27vM9v;nYPt`UC8i=R6D1-bQaG zJ26im5ooEl4?c|j94Qz4mw);@cRceW+#fg|{v%PouaVIxsb@#e|Ly;^lbJ&wC-j5m zG9<8HS)u1NcL^zl^g=JSxv(P;BQ}zLVKaJ39<3iz?klOZ&YZjnuxMLSg^wexY(7cm z>EUCyV{_cfxT^Ox${2s>%WzW7(?`LJs;o7~71$pQWj(#J-W9@IN&S&FOzY3-ZyKY? zuFS?(Wj)!(Z?rpXL;Fn;To7|2;c(%! zMV}OnF8(MnPjvd=Zc|pP$?rMW{}SJelC+EemuAup=0)q!LT?wRk<5CK|BYcokR5Jr zPxNpp#P`Bu!KJcKjrx3$a?McP7&D2H$4jn!Q64KPq$s6`KHB|(9FMC?S^XzvlTb&l zLh^11wbW&*<)`wubjB&d3ETqLIWbxVx{2qtx!SL!u#7=_(m_tp zYjKFZ2(}Nu2v_&>*t?ze!QCVvEXHFx+s(l4bCjLN{1=bdRkf&|ja}VLlBDjaf>uhs zOGey#+;@W@N9Kd^RReX0Bc2j6iqC~#_yoqGkco)%wSM{e$n z@>h0FL*zWtBISkllNcaRZ=0;3tgC1H?k1z4loy&q6Ja$8l~)3L(O?dQFtiq*#P~on zG2S$w8)U(I+#Q|cx75xZZVl}rS)|ACSghmo>K&*|#WIk)VLCU%s=zaOj4@Q}j9x9J zyoQbYEoPt}xN9Z}>E!uxQSR~n@OHauOVRE9VHUN{=u;G1&8=2fZmRQe8JuT|P#@ja zN~)lC{C+^7i~Le=09`yU{M2ODBO{xBQ*8tRcC|4UHN;Z()B$>*V|HQhowdzl<6{16 zk8*C>X?00z2KT0kFqeL12A%bzZ;1}#N$HM057)|FWbBT##!SV%j{=!7QNd8EoAi6RNvW{zrG2stfy)`HC_&Nr82|)!GGlZXhxB8vd_I5EE?T1+|A9$ zj5iyk`F8daXQO-1yXM{JtuExB^VbDGKwSMCDjI$q`Vv|iUKZ{cj*5$pZyWbA?pR#f zm>n@GVh6?y4)qGX3SWyp9sO^p4gQIy;jEz>CM*!_(#NNbhP!;V^S=dBJ%zHeYWg+X#v})Mz?f%T- zaD;00)T(xKKJ#JtJx@?=K#!sutw=?23P#jq$fTv{8up{ctLN>cGtA(hQqzlZVn3~t zH!@T-SOa=YTXuDqgUj5IwbA+PJ+{-bRjp*bBXMGZ(*V-TPs+GJ{y+`kW?&lh#H;!T zac`im@Io#ljbe70M!l@0lea0&obkoa5I#|9T%@R(*1&Cq;*j(N!KPLzKHzlV%1RC39YKrgK7t}+g zo1cE5530ur=puBwgnZmo3U$i}{=7E?kn`bQ(F=p~y!oMYu_+QRCw46SrbzZ;{}gJK zm?XZSv0O=zSBM887>1;K;&>@hawJ8%C{*Eu>c@m&iT#~Pae{iRE zgs__uXY@d6h8j}4QenQdQlK|G$$ipSS*4{kTrCNHk+hbs{vr00_i2035r=VjJ=M-i z-ErXm&NDiiDzqjl`D9`;^&b1_8O*}p29`_H?8D&>q2EJaBHu;sczBnktiloTt@<n?#qc}7+<%~ov6+FK6Mi;)@WqLBE zDM^$ccoTmRMk&*cZq`jQ*|zG(w8u(};wq(-`Fyh#xj(MrUg;~fk}oN9@V?zfNnMvY zQEjiVcM09;0xhLtC@FD@zeRWGLl$~0PT~yDD>~>?u8U)sGoKUR@ZF4n3;G9I&7|Zd z{*HR2Gk;f7u{N&kwqiVy_8YKW`;6E3e?5wqB@H<-F2h zcG2s3HvYiJ-cXE1CArHyj7x2UHbs4+T+qts`Lt)sWVwz?nxHs9x-Tx^$va1a$X%wn zKgfOI``;3u$(PiSvQKWo_B69H4Ay69)G^B?Sx%vz(a@K;C%qITq%OvHvRq0p|1M3J za>{Q|IzNQaS5o?3E+LOV_m_dwUX}vVQ}HKZS-=sVp}guyl2tFJlo!|{2I+HO3ZArC zoQ#4??Vk@GsVA(e?do)54C6O=zEc?p_-wIp|mkY zV@F5c;hxY#xygad;wN_-p`mLacEMjzO(;r_6$|5NES~(zeAA8S5;lpi$;X)t*Y2xY zk#zYk5azn-DedI3braSkbS;=YrmQcU8Prnhd$k9f&a3c-s%yKo(OOqDq)W{yb}93b z{?VR=in5h`fSjf+cx?(>PwhkG7XEHjg`c3p&bzG@qxzkxKhXj(7h2+{-EB2Qg*zL) zq=QbQBwCCb_B|X?73e7z*{NWAropYFL-qaLn#jbvC7;hWdpPRl#db$Bq;#^zmy#qo zkc6mf_8@#@=rGxa|xNt_rpZ{}Rd>E)wYwU9MpALh(gHMXMApU#LmkE9I%QNZLgLv;5^eoC~ z9LaCkD1VlU%G>qDW*YWdrIkDo@QR9Y>J+n){Vf^kpt4*#LTb}`)a+xJbBqbhCRyl9 zRAqE5jRX6I@$wdZzxM%+_l|Ieh#6k$R@OwZ67&gEh!Zc6|9%-wWn<=hJ4p5ViIlnr z0hO$<6?CN`<0s~9se%Lig?4k4LzTRtUQ(xp*Bc*7oYxK->;>x`=>?UYpX{ajSo6Bm z04MxT`wsaT8OQME{Fd&MTYH5q+ra1B0SUve9Q%19`<70sa0UXB;e1nLQgmCj~HQnLGNe=vVZ zga(|PEz%UYVjFpTD(SICAw2tqoTT0;Z-jS&OotCRY;A9%y8;DTS-8rjAwqtzK2U=j z#u$ID3RL3^8^`v%FD6-=xiD$6C!i zq*tY~JZ;9a>0WQtL`(4k{nK(|Bm|9-=iZYVGF37hdJ6oHAC zf%^X~+^KDB&YKFloE)8bjM9}^NOFE#Arz5b@Z=?vZ=#)?D|ALf*$vh7TdI>TatAaR zi>2id^*p@4?bwSQW>1p`?&4}`F+1F#{5Lo8RdEHszbL$?3k`a;&?pY~SNs2X+uWs4 zs=Ip^%msQ@eZQ7k+YD)}7 zQ#fn~xpQzcA9sJk7c}1)?fy+VMlSb-GYm)kY-VwNVBpmX{)R8^Uv7dQgDpu>yBI!1 z-shjOR>I}jTG79TlSKAKjK~=B)+YEzgR3HCBBjIELsdib$(?xTFLCEVgzF^M;4VP1 zg_G^DkV#BKzcr8dwT^fam0)V+rP_kKy$&0uznBBIb(R@J)cJPB@byUgaB4S?@j}hY z8}OAx`&ZCaZkb!rCl!RTa@pKrZXofxHQ#h4&gmi$NFC^pTgYuFV;#fY(!%&%zk{~^ zB0YLCp0=WF3;Jj~>G3X^tLX|?;Cy<(9`i@2MD>_3xpY=7Ao!-R>s!y+dL*|ze81Nq z2WNCbP7nphQN!0RIY~*Ey#`63Ig|QY&U=_)C+QM?Lz&c&X?S|(Z)cesKXmiL7r)_W z^p?xpIIT(v#TA&vzUCM64!Re-@_dt{oafs(ofuGV32 zTi&W0;Z}{tl~^YL<69o1oYTfQN7Ox9I<1a8PRnh#=Is9jEv%SZj=k3gdnQ`qHS7w8 z;x$Q5T75I)9+RT6Xid87)9KgeFkO3N++u^0))=f;;oQH>slOXy#|5LZE>USN)FUKQ zydh`6)W)M0ont@omikY;`PLxy2PuU(6uQ(@s+=O^Ul*p+A0dC$-mU^12U2yqxC=u=;$q@Y#Xl{0w&0!k%Zcj>{Zurn z=&-{76wVg6j!tkb`{PT2oVXw73kSuUYyuq8-r59~3pV#edTF^>8g;{T=`iHF)8sHM zqTbpoyK*&nS^1RL@=f_H_tal%j6F-=3tw*;E`GqH(*WBiUj{9WA`nb|A)cr!DgiHM*Dlcf!=oKhWV5v?X_B*y%T@UCnH{dp~RbW z*(Ya@)5QWdGx3orPbriZi&8AivX=uM@ioeC1f$K2F>ENO$Wn+;SzkLHHma)uX?of-Y3^WoN(Qi#+PrDko zSbCHvz0hw>g~l{1a3)Yv7$%){rkLBAdnEO)k%JcUu9IRliynTgQ_HXA{lSD|9}1Zd z{s;d@{|`TNctt2D{MLEF3(z$Ffw?*_{3hnlxYp6dpo#7vngoz5AyV|9%*Xo>Hc-?PV`Wi){U(ZMbW zWlTb6eaYO%^HG(X;0(R_GrTAFxeJa$$~eexeVK}vHnN}s&gh(H3vkcQhZ1wUt)RjZ z?S=TtQahVa6zqqS{ykoe9QGhvBX6ppQ;d3Ng0WvNNmXB;JoHsgCfHqL*b#T}I(qkD zQUuWsq(e<|$4!M|x+uw~N4!4%djBW8gggbB@8!Tq`KH;yzv3(YJvKDO{7L>}lBK5G zH@Jxwk$$_vN`cxU8nwkV&Y@X>qe^-uktt$7PMVhA=CQ&DX+68z>uiB{sjmJ`+D?LF zS>=)TvlZv<X8$%a0GDd1(fjVy;!u>n(Z1l- z{0EBQF*O&I@fBJ{v!VVyJ1$9|sO=}Uw5cYmSCj#I75g$|#I4>fJC&YE-blhlW1jqx zkP7pl1=%dmmTm0>b?zcMlnQQyjlnRq%L#Ci!rTLwo%7CPdkw$Jf^3vGLfij?%=Y1~ z7CIg?GB!`VnYcIcV8M|IxntJErY@K&@l2tXaryN-IOyhxuc`41au>`-BXmTZDIVii z{ltX3jq0lkIS0jXt7o7Znxd{yZ>g%bTOF*9R3E4TC@59fh_6v*XmQayV~gAO&GmQ` zZqQv^A|W%2{0PruXH;`pq`Zm+bz~)4s&)EuZMr-}jD=5A0_{p)Zs3-D7boaHLQr=y z%fFdxytUy$(N1)HbitT8F?U0Q&08``IliFfpx;i^6{Yr-Xwp|5o_YzQ@lN$sjfE!EFRWmbYl7-M8-1Kdq|r&co}re@Yh zbs9}-cMW*$cbR8Svwm|%bCOqaw>Zh|E@pb&6FWj!O)quQCQ8+q^ncR;9b-Q*D3B!J zqYLdDh~YN0g!$r8)UTzyL*y1*abuvQR-gyIZ$4BLQOKQTKG@aE=vVVMd(|QC6>$4| z@7>hSB3$g3?I{0^*VWCXE*C<2Z99uM&G=6Ig~^`83}_9^8?D~@f4r^3QK@W|oAUI=8_)ICBo>OI>m@upKSH&cG46*8zc>qGPQxk3;9L z?76{0!6WS1SDJI|!cOhr+VJk+d%nx6q_aLnPkfiRyBWD`MsQc~`_O_=JU77vdV}V% zmt)t*6bQS)PJS_ZlmInA8_0!{r}_8+y%~OLGKl)3ICy1s)>EO`DkUg%QOTGTl@n^y zCA1}lD1^(olek&VLwA=R+Q9Yt@uD5L`|hFHFJu%P0w1 za0k&xFZ;Qq-ZXs|cZo8Tqjp}ow{ta2^4Dk`G-R88yLI6oYG8%`4LXLJ?n z@jkT)!FQw^fREScf3&W>ubJg5Ip?ANLVCdr44141kD zmN=ft$ZpP>JHjLJtk&7uWlS~KnvJ9`%yIk3%jL{E`4sf{lkuFKWE)bzY|IIA(|Ew| zs~dBT(!CJ>Z-M6s{Xs$N?WDvvu45*Tm<)i0k^|wIQ*03 zJZK3PdEIq$=#nxT+HLX zMQOjqx$CUMS#{6;YA2%K{hOcp7gyCRcMhp=d%gRiRng)2UGZ_T8^e`@La1G2Ra}F( z%j!ugs6*l^dzm|1!NF78WpEv(|* z>Q-o`bv2E5HHZuTKJ0|$)*-cmbXkm|pQxeEK@VMC`$1ldcKw=|PQ9b97E8mEm;xjD z2pw4qZsPV#c#1<(=z$z+@;OXZ$Zduj|Y65nURFt+O}j5)z3PELm$11#yObBxgi)d z!`D|2e`5+VCzcv-j4fzV=36)1gVuUu6I{WXW-h3x1I(-DI+%4cpsRL)IFpHPc@vqL z|M2f0X0%7zbxxlmCkW{zO|NanSedO-OgkT$ldY8a1k&?#67AD`@d{%UWVKhVG9E%y$1a&VFNJNw$&%2o5FH;y`UtFwfScUx;K@7yJQKex^n zPOaQ@V9(e-ui-9r$TIoMX-Xo@B!9a_$~`DP825FQNjO~yT=D-Pg65Yy}1McKmdKu761E1}T0v%5R9NGQJw^JyR) z(b;Y*YS@|Xd?yaiKxvXhM_LQ*lp3K zvuCS83e-U*O8s5#A?{;CQic@s53(ekWy7$LjY@4MM|XL*OQMaQC6`dXz@Pb#EZFlT zkUbV0d5@aIn(MBCYIGp9)!%Jx<;+;bXZeM*zZB2lO!jE2*!wr;Dcr;jFqf_V4%86K znH~O3&w7_{xTH`=f>Li)$HkJ~d+tvOPW450rXjlf?Eb0Hu28D*Iy69KgJLLIFwyVj zHzupOOYl?ZMyOv<3Ox(<50TCgH#)Xj+>D6B?Qq4N>B2wvNZ){T@uz*mY7eUo?u>QH z#FNkM=8Hp6lBw)}K2lq#LM7g-GJ*>ewYsoU=qLT6eP=u~&q7|;%$eqJEuHe07Vnpc z&6r@sXY&Mj2&0*AFG2(Uf{wV2)gR|X877HO^}~=@*BC{dAt>U;+5fUDXw3#zu>PSR zE^78LhU*>lC;H#US~N0^={dTQEHw&hMpmO4ea2aI?xcsHAe-mp;`VQf@}(3>Wo@`2 znv+h^h5Y0^%#V^lu=|ZOt%bAK-lVtCdb>H`lx?(!IyZ57Rq;-sx61C_MM>HiQdn;k zL=CvBRlEmp-1S~5KWC_TNOq*d7XA~Z{yXGE{?tFIuf)kxNS-81N`EyO zG^J^{97=L0p0|p?9-4=GWsCkD8l`qH0J<_|_y=WrFKv-V!W9g!F6;t2L6NGgW#)$b znaNQ!cR>#I4(Y#tEB%y2yz)zAQ*B^wxBoM5L%;8wrutYLJty{Y ze7U$Y(fuORB17U@#f=Fk1|4sVGLyMa7pa2q3|4MIF-AHm_J$*83MB(Kg*Wnh^&=dI z%W6T*;Mb6s8ZDWYh4iFfR8?KA+GwRJkaN63t)!|(Sf7utu@YOukEl&+OLq-3Qq<|7 z?T{~um+?nrh0vsmC8zk9zpZ|GV2?shF-=F-$`b zu+6E*J3HH(3g0fHlh+zxl$VQ9rCm~N?N7R(tM~(kqxgwosxX`Tu?Oc$76_9sg=gkK zXS_R*->n{#|4K6Vfq@T2icg$_VBcR+RWJX^Up?7mhX_I$lv&E4f}HZy1uT{bS# zPqi?8sP^CC_8VkKxHwMRTimO5L%pn#!klNE(}$vJl}K=oGtU3t;XhkXbT?SX*|@Y; z7b}gGcr81m{(qzt$^$aQ8q2q&?&=a_vNBm51+~8~X?f?!h*=IBdWUdGcu(fzB_SZK zP=1q!$fc zw1f_I4)?$!;VwIh5IV29OcxF@!(7GO6aGjbm+(~V1u=4knZ_2qslE`BgMID%)>^w3 zYWbzXW1(!}S>ZR~Zeb~WEI5J<#gyReQ00&u8UT-}c&J|}NqA8B3yz?}F*~FG4z&yi zAafX@zV3EAsheOcRB7DA@i#ilN*W;$zLke$zDfu#bgR|P-WOkL~c4$nF zM}Ip5C)b}mA*-E9_72jkGty7y#SvSMjb}47P_J>!7Gocf+IxnJDiK{|QR8pr4Li`g zIJ(y39jg6pdxqNjHB^ZZPuWQ7kX=p&54w44UEBf#3$>;m=EP- zAKXPNq!-fT;WUS}3!1GL)h=sY_4j%NC-Dz?(@Lfvm=@8G0w%&#Y!(|#8l_FYgm7dW-)3er0V zaL;67!@Zu);IaM285+JEna8s_bXs_#&;P_rgo` zCDWjXb%mGPMtl~y5OrE;Eay|lz)ec4wbPnvjkMBQb_gcvwIDva+iG_@pUE)b3aek$ zmu69CmD*LVE#;6z{K==)!v1Qvt~XLYOCEa@wX#=9GnA@&4B0#-q&ISMy@VhKQvF{; zB=TNOq0=6SyKS}bfNJVxpjIH3PT`((+bCm~hLJWbay`_`&*co1k3{XIJ9km#SB61e zhHAHZz!2uC{mi4x4n`SMjNS0-rjn0P$x+R->{n{|58PY!C4DdH!_T3e#IWh#My~c~ zSdt18&r<9UW_uUynZ`Bd>PvZMbFqhCM=x8!8E(I~*5iy^0~_;+wc1Q-O{PK`Zl0xg zxTP!&7*cV4s@amHL|SU_bl(dYqA`y(IocFPVSRYlsg2nEqD$8px_o zP!0;~aai<6-9fepOxIrY^EZT&aLY22bUVYINhRd_#l4l@KDy!Ys8~FF8#BFm{$Brx z|EE_in45Ix&i=083~z-VYmK2Z9^jW|a-h0~I!7|h4{jg#ww+U}gKFjowb5Xn_OHOY5&S|Xwuo<^!^Dij4bgs+a1x#q=Fvx zkHI!RQF1fTMuzTq!zf%h+$)QEw zwr=amNo+j|6|@#QnvrAxKS9fU4mI3v6qaX%t$43~mAf!oS}C`KS+J>*Z^NgcRIN)ob=7v3^!-aml!x37%w)^7bs8obnDUIZe#A3 zPPmMFWFxbpHlk%$hTk!W?49o3VUpJRIGxQ3Zjp!@4u%5|kG6-hhS~(>;2yuI|ISYz z>JYw0dh^U+DiV5fhpUD6h7+PQ##W3T6wVTA70wba9L^a!15{sIU8+$Ko-Y#dF`#0d|NFzVPdK6`*Cyk3LF+Es{70muw-}AwU0NV^-|_A zyRA`FNWwQJ2)_j`L0HHvy$U=MawP5J7wOX>WsmmC z+3mJPc530^tIMZ|5+=e zUC~nLWsFzq1*UY_A(37q4`95~P%m!GVTU|QD?(cNR&ti-<8K%VA$vVeuqIG69QidK z-DYYTJOyLyRXE+sv0M2@Au55oq=B1)Nl`NxDDSx`ijfylfSvnTr-1Xp-5l;58tj$y z7esd|m^Sfq;q}E&6ungFVf=T|jlGRpJbT}jQfKkLI9Pfu&JlE|C_TlzLZ`qz;Wujh z_R?VGx*ChpWeU52dulc8QO!IjNF6RHw%Lp$9^$`vR#gYj7v;|2*cb6-lIUO~vOpSAKcv8)a&%QQMO zC(6d$`n2&(jkV+4zK}yZ7@PE~2COVn<$~x~Mw&0oeds5c3Ev2T zRZ#l$VUP2#v(l~OUuFNJ1!IHly=>^%rW%uk&FU0wywpPemSnL+%f-B7JCw&}xb;11 zEZGQZCGBlcKey0R3}@q@d#%0xUV8h2I*)1SG=D7VTGRcHZa063-^_pM-|%vg<}xr; zE7;e6=xsK$N@+BYjwGM=+!>^98V6J49C=YF6Jr^9w?))UGsV-`JgH#gqT?)DJZ zvRT}$OlG%KD164Bi-Y5hJb>)x?;ysVM?=)pXl3>{Ye5sJqg(JlS6eNq;buW7YtM{# z6gS^R-tgq^L??^;kbKa`URlUKH{1azCQneo6>!f|4?c6=vKd%mmvGKN@mp#4w$^E{ z)MVO2b-A`*9jA@N1^(FX?3XQkqCu$^`OAGQUd2lZ{e76e!KoenckrE4GV~4(Zw<4( zRhN9-g3b_s6sfSClu=O7yUWXQl>P=K;f-9$B7xdH2?M^NmPt3Mb()hozXo5(8X+I- zXiW^EJ^B;hcQ^4Iw1?C1)hEbtN>(eASx8%}+!rg6Admw>;{&E^-v`PG+r?JGJZj7} zP(RX>BU*uJ{TKev)?K^Rr(P4Oc;rzhM6J{rgb zc&KCDV|MFM@z|Zw2g5l+C;Y+Rc95iXk7V-yJ)Hx)%!B*6~bQRLG)IbZA|0YG@39Uwp7MeCG4^1@n{mwEQOmhLV(fYhgrdb#T(PrNFHK@lLIQ`kFeKFdyT`L2n zE;Wg04earDI%g)t>Lt7vshqFYaw_W7sB4GOVb-$0Lb6WdO3pHfblFk)wR3c968-x_ z?Wnqh>CiWV^*E;BF>Km@cBi|UybWXw3(P}ISar$W8_rOezeC++Y}poY79KKjcyezS z!i$-m8=(NR|3AcJ@@6%oRtFA+DrZ9ZJ4n2Xf~*S}Ad8sKzT!-|EZSOi`iZP)<~s(; z!vofY7;(0ITP%wY_OHMpv64Pksw;MtQ|cYv(q32Rl$B^rVkSHd4^A{byGFbrHz1Lo zqd&T3sBE}O8Xfel+FAT%72#!;&<<&J_4(RHcyMX8%;pW{kTOb1r!19cD4R&QUkImS zF7ucut+lpIKVoLn3gh{TCJiY)E|@Vq>2dNEywYXWI-E{t?B#4xWGAV!%U)?;$7|da zO3w#6gaXcfPOxK^ivMg3Gov2P7gxeNpCKqj>crhoI2qR>p-ADxLUvrg=p=DJ#I4fO z;bWK~-4yaeFP6o$f+kL5M$<}YA9y1CApHy3>a-*)wMpHHX7@c$UBG{TT`iw>k<_BK zYFQ~%SB*rvdNs9sSmqiRJ}jH(&cDk@vx522#^qqWe>9GvO336_sE36}^a zv1{;D*W{ibhNqwxzeO`=q2pHtzc(g*quy5O9|hFld#?25xndl zbbdrT@t;~nxo#d6T53&k$9!e8lg}y7{%0*ZxeRV)=RS^=#^fnkoRGgs)$HfK5?X{Od5FKjDWHBb zQ``NlBvk4y45pFha?}yS@qb-L|JjbIL}7cHWkFs_uyWaN?PpG7cHE8|4;MEVxz%6T zR$Tj?tWEnkXL-RXM!Wc8G}Xr0m0XyvHn)KM^KKQA9KLpj{<0ndhiDR;sTtmsGRWd%H zpW307)o*Ga)ajuu@pTfW#r_(38Pg{6)x4(spp<74uu?0C-l`lOGqg$TF}viP<^eT> zwG~}i7cyNN*yo|rMVooh4tFv-8b{1wOc2ZBT(}HHu!EUMzVUQuk_VX&t>M@Gm~M22 za}M?6c6#n5%-bK)b8Bd8n=$h_KwUe*835a3A#dVLd>kLN^Qy>OSd_D@9z8{4*T8?= zllP(ro$o~S^=J9?+PRCNN)^MA)0Cd!nA?||q>)gHEr5Yev0&h@s1%$t>4kKpH(nF= zM47ODa|H4*pRP}}A7sujD3BTTa+N@HG%j=4`}q8`1q0u7?m2`WazEooWdU!_(m-Wl zB$e~BK&<#y8-wRHsq+fWn`JGq2I>J=u{+R-u3~RljlEYIa(bQ`m)JrE^+atx_km3| z^$T^qmRmo?v?xX$p>1RuJ4gvCv*bkbGv~{xaT}z>gHu8MMcuCsVfS!FNiS8Cs-TyX zrM)EF6_PW^+obt;YbQ{p{^W$+%F#MQ)@0-t!nJ-leri0 zNTy@LcG_DM>KR!S(Fq+(}|@ zK_@w;8L1kxq~gjd?yG#td!-u6v!Ap>>MIh9ilHwWA^imVDg&Oe<8mD>xspLHNxH#P zQksiHc3o%m!C#~*Riw5GkPYLp{820@o|P5pC%%bFY)b=tQ+4>`L?%AF0(+z8L{*Ba z5mh%TQ{YZicG8O{C~2*%{Q0efNXeD-4Z1d>y@-MuD8QI)j!aZt3+Mge2F6>vn zH=96S+hty(78%Wr@YN`Qa&4Yg((L23M*|Qv{)O|Bl)j(@WV(XPiRR)y7|51+ySdF; z>DIHq8tbi*>@kazML*DqrhB~s+v&4?gPF%5cN=<%(y)^Mv;O9M9L|Kay!tpG%lY`H zU)bxML8y%ry_cY>Imnvq4Pvbw2Gr4&twm_vcutAie`3?kqpIL ze(Oi8AkWw`c8AYUM~1Cq))0FTXLboFQ5ztBhPB%xokwmXXi>Ky$^6QWV75CG z?&@u{QNQwQb%Wi^)byDDsaxrq_h~`h@$!@(P~%GCt?1UaA=k6Y`GcIPXfeiGAKiAr z82>OeU=?;HbGUB;;YnVyP+Oe!dW4W^paGN{z_UUWZzLgDS3_Q z;sUCbl2Q%S&XvR|`02Aq$D~b6g*M9b;L1-`XEXmzp_Zp3*aCxbjW}J*AjQ+~u7cm* z8Zu`CF~Dijma`)p_rV0VJ@HJ3>a#WejlH7ESut7dAzl<~>nDs~$q}D~I;D~D3)+;M zfeun9yD{D3HG7(SoF1--Hv`I|>TN<_8;4?5f_yOuz5G8Y-N$&{{7J#Z;R7K%+>#uf zpToDpNh3ufxg%A>ZDLwS9{O2B(y;nG9`apD_V5PA;8a1gR zH}dO{$qoFDz91VDNS!}BC)^dLi>b-B?1hm7eeKi@sb*>1R&(r{Mhf$uU(5 zZiyFSvfHPX%Ov^!tj}UA*upw!Ew&3;!D?woJ@8+6p5ZValYp* zTVTp~&ywL8DGoKN8eO)Fd!RUOtTiay^SUh@ll{ON{%Qx5j(xaz2B1d!nRCB5b-;AL`#@yosq{!A-#J7*X#>Qa=z4O&wn8*5A&isR7E;JQl7WLV{+sLUPj%CdKa}ODk=Nnq9o=n z59nlQ9Sj8d^AT(!iv_Z>(>x=HQX_E$w?=Dvy*T`eW$6ZgQ|8-aVNvw57o!|ZZpRpl z)O4tXvf`?^rbnYWn#?Eh)l3h`_-DM8Asooh*sRW0JCH0ggl$R`)3Z88VXd8VLmn=7 zg!h(5>8*ZIhACOq?hpxc;9Y;J_8_5jDyoO2qR(CMMoPif;DauCrgORtOaG!#TZZ37zOzI{Re?bx95iEit+@o`)vF2!NyE0JzTloXs(_-a! zH4Pi0QEEqdwa|dsXi4EeVUgBBAEMF;OG~7R(kbx|eEglv0$Mq%1zF0Ox$nBl3#G4o zx<3gMxhp!O-g?gW<51UE<-2JS_?0BsF@a7|aZyjAlEN)mLx(#^{7*mPRtZ%ihooH0 z{rI8<_a>Y%^U@R4!IgFj9Z?3}&b=g~+>l$68<`6#zs)pxHCuze=3R7az4fA~>_=IP zsA0MqTa1+WVbYqV%m@n5CRF!j;Cf}W;_M$>sDSvxE?c8Hl~cPbxkqH`Momhf)P-MxX84JjLBf(Y(vsoeLf58aG73@jZW?U%+>~ zLH!t99gmOjq_kMNp=-`D0Axc?rS4~nZj?zN_7XSwO_>C z;#Oe}l;)4ZVp!)1Vl}ZXN{D`9Q7A{<#Zqu}mdIssEM${Up~vX29?^bOuPZuAm%>oJ zC*n)nB<;hOy%Wj^Y8#YB4%@90LN;-!5XG;^$>tK;RadTy_iA(404o4wC!w45uMiB_4fl!lE`Ncff~6oUO%K^Q2^7M6(lAT`ZL zZM#t$s{N%`u*T@0wLa1bJ6EAo3D**8#AJ#4u~6N_@1mpZ+v+H#l(s=ztBo;U=^Knm zcmYqqs6Jzr;H++9#lXx-u>K@7BZX;0_&Lqir@46uU9mw2@jFzRp2iYuGIX?oc0W>~ z%97hUj_-x&J^A;}cMzGK~(hbZu*DFPsFD39J zHTYE?v+e)i2$|3xe52Oaq;Bhn2e=se+WOunHmB>TIW{ zx7B67dY+D=E}E6A(mo~%zgQ>Pi6^x^D6-M?S4pXEeul@X(ihw?M(`ZGM0;37AEuqs z;-O8fL33khl2#CXQCi5=b&VO?OeKYKos5dnay@=-IQ;5y>M~T9<+Z*r1luW+d=5>- z3DJSn(t&yWT)7RJ(tI%TTGAKn=1u#-sqT(JowbWkknyuO2Y4Lb2xp0kLWb_Y41 zWvI_`N9x4-;Z?y~!B8+dQayf3;;~{Ei^L_SNEBnr>8AXc8S5`NWnS>UG=(8HMYtt2 zr~YZj=du}o<|zEDx%8UqZEX{IKpH!!IwZH|5D%fCIEcRbIRu28atq_5Qp|58lRhRD zma52OmG6!8@_UH4l5EIZls;+(d4-riuqR5yGrF7_H8Xc~M(%_j+yqU8H_A4(yI3(W zC+bMlOZkv>S$hQoXp@@GEgUWynI0(@vpA^>OU)m+(Pg{4 zTiRJ-4!4@xtz4CNbsY5Dblz!4a=u61dK4dwMxLSZf9g7Up7ge1E1k9)UtCq~+ZL`9 z8`I@(HZSC+L+ciW=2_&uZp_R)l|L5!+c9^LXEQm8^AeqTZp54+dK(i1e|_MFMx`y~)kJiC$m zonIl8F1(tm>u9haiC~|D4?{2f)BKy)!p~!OhpW@zUaIC^ ztYG5x6kfnlD@3LD94=cGC(IThiI>JNM{09kud0UtmQ7!+Z!<2xVX$m4SFiy$)PMYn zU$_Nu)hhlh=0%&`GTsX3KR9>!LlJ!U`Hb!A7B>IubPGSwuTG*D4vvd_jdTgRP7=P$ zduCUhsiTZx))nuq_OIGrib%C^9?wT7Q%Cs5xjF}e^=NxN`teRuNfKJ3o#&{{@4DyFbN}U3!r!vdy=Go9 zU>pTM`%B%??sA?3!E5fng_Bi3Tr5;DG(1!xbT*g-^-!De-blL0mT>;)U!$`{(nQ)s z)WHFNMpZgNNDr6znly+i^su@`{j7B{FK8uHxFpu+f;S5GODG%LEhbO= z^@MA&6(dW%68a9Mg_gqj0VnZwylB6`9@%L|dn<4U#DCiwnL)g@g-JBO1YND3eo)_U zyfP+PE}g;+y@)zpovTl$K270t^?l~}|9E}vKGuHE^9@&XDx)C1k7^rc1gHH@`zXAk zzi{wIILA^m?f7h$cU~}skEH^e1G%Uyf6o*qA!X>Kf2BWoL&8CM`hr9!3!A95Fse6v zW0~Urx=P;oOzPQkBq?P=bzYpaeMlg`a4YI))bS{ty1oZ`QHy!RK&I5!qN<<@zR&HD zh77IYRH_nc#dN|zlmKbr6zz{X5p^mm!udar4biuIr5f+lEor{}$X)4Vb+@q-tL=Uy z=_#$=UazS4)Njz`9?(1Dyq569v_TCdqPS_Jy+MaxfzL6u)<*54EznNuFU)mXXQiH; z0rlH;xvMH^6V##f7oXLjHd2ddlhyB(9#V0L(#K)O4Zf5od?~Q`vyU1+`foZU_!mk!RF}`VB z%jgb~S~11^U21-Linxh6Y6fvFT$s~R5@{jl?D;5}jY}Omp-K3`S_IY!RitggLh7JD zabRQ>{$?J!hLfdNAeE4pS?h55nh~uW(#kMLdWwVAlRK)Oo>Tr?ikCmg0W}i|Jhj!c z(#^oQsQQ78Vr_9D{dFZi-L7mkhXyVRe`pPjSIP*!zZFq4#H?l)_mH|zxU59%1Hnq+ z+>wV7Gqyp(+C-;NvH16)1IB;qNT_#RQDYwAzp1RW(s1oI%n(}H@7d$`G^(1ftsl&{ znh3k@F#f-buqCo_{#QpobR1v(c*uyqa~ou!PhDoWr=zHAzPBDbw;^0@^S}CSgVDiP z?rD5{2hh>2Lp8RViRB>_8w&H!{J1T98^?r-;$-EtF4;xUwhiMN#{BX0l9)RSvw-0m##yQ zSfgB1vg?c8SlE-fykFc^#zL)@)1Q0b3BAB0HU`6k$-gmI{o$ddeqn#4uN$}Jv40eNy zRxjAjGlJ>e^m;Dli~;w&KPl8Kl+>^9F0?0FE9_D3MXLYIB#SI}W}^@MqcN4*S+^|i|6IXop*f-SA*rZ7QAvm-rD()DZW zvAapztgMrM!X2N9q@0mLd$y)Oa+V*aN9e}%a;)%GT+QkC1oquzxa)Iyiv~(Zq#wu= zI4uj>3ET)N#Gk2{3kr_|^-*&fB0DnZ|F7Vyv?Z6ax|m&DBNPc7j8cSZat}Sq{g%VC zj!EGTvnPqa*Y)+r6}zOdNlRzNxXZKrE{iiiG#w332=gwh=n0@5iU4T1=QbV!FZ(nz-;A|>6@^?rFjd@xYr z*>>*xx_+r0)bqRV$kkQsZ>$dHC_Bm9=j;9unBrAkqvqb;alr>q|YSmYLT3jIdjmBHbbzBP}9D zA}_TclA?}{T~kRmDr!jGcg=~L-!jo?61_0ie@=dw){7Y?&GC~&f%bg7L$ z;udI9Hu8P4!V7$jKH0^szTW7ib_$n8#c&n<_lKPBueC{R=AGCcg6t4oQ6DKJrOzeL z=_NBo53?Lvn%QXU$48fN;@9FX$jmvG13WqgvbQgABe07fNgLEjaNJ54R6ZO&LAK?J zJRL*P9F;-H=>HL?S4zarYqi=>dZM5%vRnkTPBReDou5P8O) z)EO7X_aH>2Kr+@Dso-n@a~a;$tMoH2A~SD4bK7OTH!7^2<~uZ4A6xs4h58!fx;fts z`I8ggCFV%{&n@PeUQ;EX92ScTA9Vly#RA}|!=!Y+y?&2Osqkth8aUJ4$UwoUI6vXeejsFnbQY5NMy&@W4@rf zPOa>~XZ z#ka)9$J-}vOPrT{JT-svFmtO~(9yNB`0LwmQX|xQD7-wmR zz5tdn9xiJV`4ahQqsgce&kOTg6;*T({(cazQ$yXg9?;eOkj#ZDU^2&@Tzoshbo{MZ z0VupcHMoFg6py$zEsMXa@q(0^heHVTlt!z}aF4$2w**Hi(NDQ9zC+jZm z&@y&qyE*Ef8?^J~wr*QdtC(5MtY)=TkBiH}7cProt-IA7l<0fXW#4P6JP77~f!r$8 zH?&2u%|3P$s~qlv_hx(TT=*AryzP^wJdeqJFq*3Nm4%_7 zm5$`cR3~pcM|6tvPw+PH*$U;VuM|JW^oT}GA7WEH&(B2`_>-gI^LmcXctbvS=B@7 zu|$v11NT3&!7~~WHkeVkq&fVw_1$-J$t zRz8u>N&mvD4TUe5jd$WJknw&@z>CmTHbDDOK$=0K*9nxSf5}PmPMRZKX^vQ5YD>G= z9C@acS4@IoEeyNr!?kW?J9rB=`UOq&@8OV7i_64HWH)wTg6twDgulV}R*0whe)I|q z)m6PGNgGYI+p(+8I_(ymQ5T-h+2FWgvmtxZHS|&^v@dPd?!Y8pSM9}Danssqm#_{o zEgZJ@ySE%p4|}j(f}40bSl_4adGEddhj+|h?*Hpm@>lpL{0;FQ3F(r|q_gpwUTv>l zY=OVU?POPB+j?ugv)0)m?^^7?*n?Qwc>dUDu`9;lP*-`T+>CD7Lt=LvLdIrd^D5 z4$o3bD&>{Y%Hr@ryi0#ZcZK?)Vz?>(E9@mdD~G(BiRMGnO0&pFqY~&?1=z+1U}URs z_~e2wNa8L?GB5KgZem|3VARtkBQJlxJt(bakma|R$@Ck}pqbu}$-kCbUAleA&yrUp zS4^rKeoh{dBAp_svZm;xyt_nhWPLgdEKs7t+>|Z25&8$)@tS5oQz#wj+GXj7_&eO5rsM-8gS8SLfa&KK+sLDYs{uXuyC{mC zgO3Bl*tZ(t7t0NH_q!m6D`=bbKGBatb=mM+q9g0z4zdQQKN{b9;}Xv&=1M3Lub8ks zv3K(Plr8bI#;4X%Z*#Pd~3CtoM+G@bl2ij3!C3-L6*j=nH(kHn9e0Mmk~ z?-$b3NZ%g?{#?`(>80<>2K^$ep()MWTNpG8jhBvG}UwR*^kVM&PgL#J84fbcft|0u&$ArR@)wD zU*zun*uGCM<5Kqs{QWa;Q|zo)$m{2A^9+BWzt6wQ>vb)mKw{ayuEEE+7spwg6!y|6 z_CUH-~p?LN9@R*v^C*?+RYd^dCNoZrZF==&cnO9nA zc{S1ehCG%BOs#+8?7S5{h1#?ry)7@uAi5E*LDRu;k_%svCh`;?Yno7Iu%eBj%F#t= zHpEbN>9pFw$PKGjfLBO>kK1Q7H6GwA_=~KfTWpr|K!CO}<=zJe>Y_H3o0A?jCNv+- z;-b)#Pyyw5NJVkE5v}_4(EZRB{_8e5ASJQc*+L#60bfOKJe94Oe;RVelnJ&6^VuDE z7%+lY0;>a;0-e|s27-X!4rUkDkQ%=oj-ZfGK+Y|G1~NE3_%!g2+u$Md@T9=Gz`eju zlw*$qAHh9@c#d*0QN81K=pJk&){Y)lqk34Q5xl42J@0Rg~a@s%GFSsNC(iin(Fe%e@ba(e`sMS z3;9sfBc-C(m0v^K&@i<5pj9S4vMBAABV-lcYgqVyW_R}HV(9m}(j9UN^cJb_A%c&28O`ApCxtw234Rc_^s4HG=ftDLjzX>IpCv@3vq7Ut|);l zUT=r9X+*G&a34>?Lt}#8Jrb0v3WMc7>I6Fwdx$1S^QXp@c-L4szA(Nz;YQMlJz5_ufl7!MB_yCtU3=i`8P5o9z?H2 zOYo{UkAC>PzUD@#p}t_+$!@(NQF9F3aW*3j4aD8y@#c{AkrjsE9ZB^q@jX^F-=Sc* zgeLBYUR%qgUJG3bexgig%l(?EC5^TkEa$xO(kkopri11Y7)dqzl;e0O>??4|U9D*B zH}8(K%HD^{W*MkZf2Dh{Bx#nh@C>7``Haor2Ce09Mb<#d-Z^LIW%bsWN;~Wngd&M;HUeB3>T5{^Y!27g}SNBgo<$s_dnu<5- z-@wg4p5VcN#CFgSwS1*$0Xvg@%?7bB%aWRJqfeTNW--6>g)`m?FqfB8BIFw0vk&=W zk{>5ujCUpXrk544jxclNHAJhalWGk?2WXpF%!8-|`*A}aMO(Clgra2qW4)BI%iLyd z<~}^kHnjycgJL{K^>p1IpRhEkMN;2{2eEG6IexzbPFHTVRJ(_D!g}U?=lZOkJXc{2IfEod0OAIYh;Cy{c9)Ig%00Ehlm_RxCd)NKRt znFGet5p7&v8e22SH>B#^7WYV4e2Qkey!c)ihQIwXjophuhF;Sa_ca`GZu;d8p|9O8 zm$js}_O67=$HX>ZYlW;DOCiZ~sU`XqeNuk6vY z;eVQnes3+$-US%e5?XE2W>509|7agnpO}lRS4Jkh1W#x)%|VV@VJEHgCB3GVofd9W zr-swkZxqYppLQF2b^Ss96~Boe_xr`d3FQ*<#}3olb%k8QN4OCCThoju+HU%ZUgf@yt$D$aA&W651)(<@4d`LMzVwjGXrm>2o~5nUyB^JW!m8Dl=2@KY>J$qO_ck z2IzEt@|5dF@kSb3ZNq)%VkC=iiv1c7CiaZ~&wC4++QXV|ytd-r8Fy>^kJxR0y}jL# z$k=`fs_Gf{@iFaG=P8?T8vGS`A3jL>)*B^(T&-oHa>|VGJunmVPu0p-^lB`f<1L8xsW^2;Z`&+ z@=Ry2uCqN9b4DlpRN`u>$)!%Dj!vDE`cbT#GL=-{R?JFkgd_CbHVIY`P4Oh?m<4On zll+=zfr5eS#j~RLuMk)oXcqV(&?PvZP2jg+JMt4korv9G2)MKTFz{ILCfqbcsJVUkeAqjg%~8#BCQg zgvS~U?Jf2+tAsgVeM45_bx?BwXWvoua2<@h#$#sRf%I^ssE=hZ|L_%B z60hnn(9=DQ=0`K(IHTMqB*f*Sf%iM|?|*hjdUrr}CfQ5Ca+`W5olX21zcgE0JGB~e z99L*vu~D=cNsFiTQp$GG4mrwMIa6qv@?6hNGvibC>SkQ1)3S$ILrRT5(7i`HX z;oO2J_}(sV&KLhh6PH7Hi0`fj49rsU7T4mQ`M~bvBo`-{=VBGlh0B&O9N*b6p?);g zxli^@4f`wWj9tjiY8SOl_=Pq0FuS|)kv-OEuPi35?2UURVP5jQl$3-u_Mc|dx&tHH z+{^!k= z)_!W{z~`|PtZyx>&>w7l)#dff{$-e)o=7S3JLxm-gV~(jojDhliWO;67()ltX6Z-# zMOCC;cqiY15p}^)T!OsEG@>WGV>`2i<;=`4h0P>8OL&g*!#V#YEX0AC30;LPZWZT9 z?S$RZ4Q+w8mTBUgw$7MfPj<3+4V=yPO!vCi)NSr$u=*G-sj@e5S~oX0n{XZU^>ot~ z@M+j)-$M;N8!gOT`yEa0>Dc)m@i|*$Ke27z%biYMy2{SjJFNUL$2nq^y|rEz|Et)U zSl-xb|KE7sSZnX8d&^oy2FcH4bE+ zg9Uv-Pt}K;F9p9@1z{_UN;_dP&&vR|#sm_!W~plSSe_{;?3m)q)Gj#H`4Q>u^z8?)N|=onIj%@ zLM|p_^D-L9@@7q1g?C225FZAQ2`Rk0pUGK63uFZ)SR(z3T{ySqO6mFMpV|9HN;aC| z++<6YCJ${q`$09ff&ZZcssP_vgt_xoV0R#iL&9TR%$DO0mKA*9I6y*mvD~^%J`&Ia% zGLnvn-O6TW+w025ilKzU@yJ+JHWJJik@WIxa@0$Ss+^M!lVx%h`Gwd=Xcd`HmN&VZ zD5tKnV~k)+Jiy&>lD-z1&EPO9^+M>n>yt;+42-B6Ij#dqtGK}~k!)PB7W%Ve&tqQv zqr`*B3rgiH@v$-*mD0y}8Sa24J`c4?^j+iWz6n~Qz@T}#R(uO)mRx5YqhEg52^_fyJIZtRk&cobV7P8M5L=NKf{z*E< z&wP)9Xd6oH?ZK_Q10Ou{(?Ovc273z^L(|dz{GsO3)~l*hU6h1OHWYrLY0ceP8IF@GRId)Y&NNc691n7s)u8p(UuBBi}|p z(yyX{6pcT%HFO-l!Ugk=RJzTiOFyICYp$w9L-fx4$NTj^XNC z1h73Gvl&dgD~xG+2VTcX@TCj%Zu&_rRsA8eYF0u02RbeHY7f8*%evX@ zTr{vJfw}zbO!jKI7pxUl1y_uXa35NAY}FcLUO{2HE1Dukc}54y)6`GQjK*i-;bJlI zBdM;`S{kS{H?LX;tZw*^`k^Y#s7Jwd`lA~v;Ow*8pc+Z*&cdHi*}i8^5XZ3P=0YiQ zh)?n=c7b)A{2z9NIk5k~p`sX$T4Elrdo@tdCBZ2|wdhnP(9L!i`+xQ*XDiy&qcro*M&LAWNajt_zSw9%bMfB$Lf$mG|)K0-SQ1L3RurL%I9Y&Y5TG{94)e>e~)f5uT#LeYwxg++AXcgYEM|6 z2Tmn8f{adS@`mzxy4TLj;Gg$v$A-DN+_U}+w}9{a!~FLASS|K~6h8oCQ^p=d7GXj5 z)y}*UbKtM~nmBp8vN+ysNs z-wi-rG!i@|mAhfKm<7~`2nDN=N1F_?b=^yElW zTA0=dQPM$&qPCgGeg9gz#U}7CKHRU#Ia|df`vV(ZR~+Y`vjrwgDd2tvPP2C831#9O zuftyOH1L!u{|{#Ud>}-*ND+C-iJl*gX+XFrB!p<=3XPULl91Dp8=M1PErFl;K2V+= z;KN1`3}(Q2b{iaH5cfzjyY{2t0eJ;_(MIGR4>8j_iB5C3nXmX`xJ_R>ziPE%CR?av zE$aQuWkzPVk-OKPK&x6_r>*(3zVibcPIk>NY7HD5UvvJ4LA^TRL|dm+QHCi;l`U}Y z&CxwhQs#kx^+LThN2mE_AwuTyF#zl(>He@Xf%vXVS$P3kFq zC1${5zl~SvY@iCS#oa(Z&XHE!pjo&pJA%nIksgaVq`#R#I|#$U@7ALiYQZyCR6HWD z4G)kVbzW!?eLFMcv!rT_RC9#($#tWDhK@@U<&;pA{K!)@z5l@GdXD{lr1*eQG=w-AwWSE^M0r{Q!qgKuOg0AYE#!+UFKh%2K zH0?NeP*v?7*`rppC-;PC4K{0P8fX2-<`YzuUvfebSv`Q{$TfXHo*s)?r6W9x6Pi6i^%rg zxFzu%EHJ(&m-7IBg3pvbq#!I5%gO`7ts|+S0a7=%>ignb=|W@+YW#CN_wC7#D`yok z4#{AB)&M(zmNbEu_EsdB&9f@n2hG{?Tv)FSYybl|_m{#HUq=a_p3{FT?_FIo5_<3n z?#z61CGa*dJa|+{($YKQ?VL_6+jZvA`q{=lU|j~axa9n0*D`~sh7Kql)EoMr_C9|` z;{D`<2^HOgG-8}YE8d*W>O3FReq;&|9FaK{kg|3l|(=>X94#c5yC3@8NgBc z^6Sk+(fzsfjLeF;q6McWhAZg*voG4i?N?yGE9f2j+A9%ry`j!g`&)bzebG8LBq?Dn z{U&|TBlqR?*@)Uc;+(Oz!q1PlU)sHlTIx^s25!L)PC>7`AMs20VSlclJ(fM5Io8bE z>Q6!^vC%K>r}O^84|Ky_L>|#t&_#SIW=|Yyzv^qzFt@;2Sx+4dk9`tuYzX;u)%5M= zMb3gwk(KfqX}f$(+6f{v2hYS$Ou+3(uWrGn(2HHbXD_G;GUB2zIt^O%pHN1s6tRqk z-h=pp*lzE!+s7}RbSkbVeN-}`#IwY26PH>i3~1sQdALvu#7l=L!qURWaqeR+vnAcbt&7vfBDCrDUcVKQ_46K;UpfufvYS;;2|2Uqd=&(3^Xo@Rq9 z_{f6X1`T1A66H%$B`Gex3e*i=3Y7VOM&LqVQXm~%^AS`;RbUFj!9U;)>hp8I;uaZ3 ze^zC=a5Q^#8)=PS<52p<<}_eJX`XSJQx z+@ry1s+HlAmf$_u82(XtMF-RjUw3lEw(5aa?rfF8vxG*N5cLqp?4zHdI_~DIExRkNzE=6nZGH3!PIQ ztLZ_uVxd-Ih*$4Xuo;=21H@!$wzyRIoV%x*R0U^SS#hAajT35Da3WY;N_0Hl-r;&~ zbEW;n*=0=ArkaJkcYY@Cs-4Cy7E6w2N@y9MU^mcLI{&IO#F|Qd<$uZoxt{PzaFlWd zZKUhoG@BWtwKF7BpQdwgfqFCASj}fuG0UT}J+7^%iK#4~->F(=T#tP@S>8muqMN^H zoV04_)xk2hlAB;~7i<9gc!@r62k&EB;|^Iv9?WTO_|kP~-Le?nwJgei!M{V5ahjjj zFI!FQEY`>RhDde&l6BvC#VJ?PX$=N4(5n=y>GyGZ+GXueof2+8=b@9yJb<69jByc_ ze4-K*>qxDH(sJ#{7Nt~Za`-OoaBbv%Y7aY$-I!dW0C_|?tsHvC@L}Ue>sPxz8mCtz z5*@bR*q6bN+MCzpZRowW;E?|Ubm%!akw=p2bUv@A`2Hblu_(TRByw~b!zru?&JcR) zvz+;)Sdhx^tgs8%AK7c|2lkgvN#}~WO}A;^S{PZOr7?3m`{N(cgcnb8{HpeDa}iFl zA?Ud?kPP`FQ~E3vvOl13KEgD&-`K|v^@XvFJL4ZZd^Q^e`Bk4<6|9WbW$;VQ85Eo9 z4ffu9S-nc`4fn0rkCf&{b`fg`TCG0DSu+kJlMQuTarCL%jfHq}b@;bDRwkz4@y1!2 zk2B-*n1PCQ5enay(J#?pWeru5gJiDHqo1Lq_*|^PRyv$bSCO(vOT-J}V3KFnqMn>Y zj!R9t+qy_WX@b-^^oRUJ$jGkSk9%YR`lH>jsvn7W#7*J_*wy+V>0}m3VdkA#(my;S zLHVTgpZb-%)<5hYiBCf&F~9aw%JTS zu0OVpuyd`4+le?i?9SQ-vz%Yuz35!@R>jm+bPE^Vza67>G4(w?xN3`X}qFWMKyoTRSOE?WKk;{Gw7jP3GO zX)NlLxl%eDN{i9iHfAUIgvQ#rOk%Cs6529X+Gwsu3PDs-ounV+`;js*9NWAK{2G=0 z3bEhg2VzGPo+J%Pte=o6v2grxbc;Mu`Bu$j+|s9o(~))Ev)FKU`lDS})#%sc8wXs|l?_HR%dm z0 z)0mY+D`R1%+H~UQBuNcpe$U0X$AJpLn=l25R!kk7v{B!IH>aw2TsX%x`7wM-DUcxnMBx_q;{#zmT7-9E2Fc>=?oSg} zP8wn7k-c(Bn5cgd9V$usB7eJc@PafCxv3c zH-WTl8kOLSyOA65M{t~2N}eQVkamg71=zC*8-+bnlz^)p(QmLN_yB)JpocPy-_SnVIBS8g({JHiv)UK~m_J%Z zhtNOW1;6p3=xyzh)*Odyf>s=SXbs<1;=Dhj4WO4JrskpHY>`pNilb-_neEM=Oc8fz zF{`#Yft|Gkx}gJl4$iqb@GficmAvL|ZE6(L2PyA^rt%{bSxMb8chL%yVm8xSsAbJ; z?pOY15&@sP1KjlPI4^%J#a(SH_9d$>jWG+n($-?`g>5tw)UXB_{X-drrNMuMlHngU z@>n%0Pg?`p&HBMV+_rzQSD;g!XwDHQ<17A| zC+l6H7VqGTKm$(wHgE+s(L#3NMtC4J75kDtxRcDzfuZz~$;Lajf$yxnY>&C@hoqra zfGeo!%(Y1mHM2P*t)V11=CID&t77d-{8Z9S*%2S(p0R$#<$uL2&BnQq8}o0nz zv5N32=!2^NCp00at}txteDu*T`1k(ImE*wLSBW9oL+bN6JtG!H*Vj@Vov=G0U2>n4 zhRJ0T3gP-17jGHUybJbkc5nNPxf0dh0`AMhq-=CSQ`^%@HM6oQ47am5-=G|QU|+HG zI6FwJO#?e@J7KRy?6QB)dq?(M#@M)6V(fSSt{+Y~o186ahkw(%;Qi-6@FsXI{XG6y z=c2RL*<-$-vt^QPe3(1+n&j|?BbOs9qI=c(#$oU8gzWL5Zb5yo)L9;dI^_=#^kd=( zwt^2T+i&@ru7MKOWkYDgb05cV@GZHmkEMHZnb2eXHSa<*Cl{N_48KxLj^BvaOlY6@ z8OoS%lDwp3JDoB&^i!lIzJO5ZiS~|+pshGdx)`63J5@*PMJng-cr82>MH5K22&*s2 zwwAPV>U7$nrmMa5dgKjNCyy!wtFj{8Q(OlEy^+n}BFTP#DL1tOMjF&ah0&w^tIuVY z&1AMwD@n70?}8P@W8^u12^aLc^p>u=FX0R>(xtr`{ObUC^;xkV_xtalM$<$`>LJ#` zKk=84HRv<_gwPSy=R7OKX8a6AMHZ0%Px!t89JMcO<-uUl(1hq+xitS)03Bspw!(Wb zo4HUSl@1o*zL<-eI1#QbnHyjP^YI0Kor9#&#)W>$j>t#Rd?cxVqP|lH>Zs1abe}ml zy<6^Bx0m0```7#18Q@4>Td%ow)wz|>BtF$&W9?w7X@tw^6m#TKbztOZcyPFQ*uabN z6r^aBGK$Wa^V|jVwTZ?lI=q^Jl8qAj(jVRmmsu(4C|}R|;9g;OL^l?j_pLfkRX3{> zLR0XUQ_7jlZg9?gMD|cad!ktdEO$PM9glEd?1RIa<#$Q0P~z*<^QpzkD5d^QnN{Ly z;_mpTzVGA>bt7G4S}+~`kvDnWKI2?gK^hWJ+{So?3zJm(oaZS*a$S%epoLh7&r(^j zM<@{PK^xw5C932JCxH&Omll$8HxU(SC&`dDg=TQ#&WaY5Xa4`~oPobqLf<}vZ0d5s zPicm@OH+9^`G~wwxE83)=b>HbdieXuZ5p()lL?pB9A*#aMsuu3=19A?wVE!TpW-9q z`Ml+3GOa4DqUAx>#qhH5FN&w^0_ioCZZt!d!1IyC{7fwuEdhclf#x-iuAzgtJB)E{ z++{ULWPcWYhxhnb7`IOPUEY&71^9?xpMXgmhLHJ3&L*Hd%{Sdl`eb#$>k=a^ZqCa&$jeX&#pqO0e-a#?` z6$pUqW*}>NE|^S7=Ue*@)BQLY=Hj>ymT7av2yTtLlB-Td7ra5)BIk}?GDh2+(4^I9 z)=Q@9bLv*5fw{ptU>9`;!S)VfD|kiHL>|0MzY4>d|GV%xEy*W8Gn(odsE4{U{glH^ zZwR7tOuax~_(hafV^Jc%H_uw*>@`*!dc*gbtE~stWM1LDs7p^+r_dQZw`-gK;h*Yl zRdOoE&L!6<(KD%d+;NA(@^0t;nqdw!AJfpghROW|4(A4FLe8?4K4rWAon1eSw(=kh z;9MiW*@+*Gk(8yIy{*3fIJb=7!y8OGa|OE(Xx9byuMk$9Qr z?mBF&AB$%t82s;3DuMTPAQyHG5L7BzrP^9Js}bs9I-3fj`JAJRUK~eN@$@hTXpZcNw@=j=NDLmk#-I3PxHKg)UIb|g(qm{@y#z8 z%MweC&53;%Yaf4@cr{^s?3th2ll|!=QoM>~ijDOmFq8MmG_jo-PHm@!wEzzPQS@W_ zn5t+)^~!ep`1r(5@zLHutw^Yod`P}ShFVoI18hJ$_JX;5MJ37N`wJi47<_pD!;d_X zTcVtlUZHPM`2dF*I>NzxA~*Gu+Kotu=9^m9T`r~foOoh-J+ za$Ozuzfnm4n)~}I8C(BTTSw_GL#@|==b<01cN@rjtd3^mW1I(*Xv2%^ozZ3IhSN-I zX{H+8B@BkiT90RG8ve&8vI}R>g%rZ`JoQt+28&ovOgh2Ibh;G0E9MAUa$)BFzvxjf zCqI%lNdMrA{TJs|Ogck;U|d>^BX=yA;2m+CxRJ@Al;E-*KMUj~Lt=j*#++Lmyr&M& zL@Fn#iRyYJSWgCU)TB_g&?=!uFeAQ_i73fN3KemnRRLe>$1{|~uHBZc`U6%}3$Eh~ z?y4l=HH>N|VXRU!Iwkr&Crl<13~p-{J@osml};|Nw5vJS-C8(A{%~tL1HJEI+nPB_ za=L^K&Q5(LXVH3+iVC4I+o2AMG$#Q%P534L(&4y`?Bm8<}EQRwNgo?WV6!wO4UqhlQN~myrgA`cN5NsPop;r;5+Fh}Xpbn299mTkhm6G#6)-Qo&Y-h3bV8A?V zD1*tln++FTNO~4dv9cOT5t15tEx!P9N<}l&nmoY4c%4=UyNQ$0Z(o%ziKCcfBf+d< zM&*3?_sEmT+~{M{#nT%tN$IQ(Gtv=--aYaiw%b|#SMGi@X4KWjsQ-i?p-ugdT#QOe zDJ3Y)4~`9G)}NW5**~H&TBK?u#pa6I(NF1`%SZCi0DNW3)K2tTF6J(%7hR(6QO{`U zXsGK=Iz>}874JnWy$D;?59qZAGTprcrTCx_KTL<+GVX#7dM)_q45T8?qxpTVL#{p z?`o~(v+^|<)hz8I?Vj10G8bD7xksCTLaen`kfSuld=UAc{*_gPd+fJ_SxGPB34S}L zsAb~pyhFmq1XDouDcX5aI@PghJ%DXbZwYu0^3c$-9W`A^aJBg)Qj~^q|DbJaiZ{Nn zTiX5B9q9gsCt@dTmu z8FI4Rl~3<$v8p^3RH;0({%Sbl^=$ekeBnmay|d6*He?$RK^>A{RKFm-eGEOy0conR z4n^b~QPu-VR?3m2tI7A1TPB=xpL_Y^Y5hu0*jeW-w9mMk&|+rs4mxYtuL9in9h^CC zlb9FV{!NA0t`ms(OKjsp9Tqx4-|re-tlq-89nc9jWiK1R1#Y&tJU1?{OBZgy{UlQS9U2)v5N@api~80h zdmUVOegAztF_zYE=?_U9pM0Uzi`1?D9eZ)oC9f&1M$e)rr9wgq8jB739hBQI$R$0; z{(YUEfFzZfmezR)kSFVaQ-2A$ZKuyJj1UXE0s2lw)-r*anW z1tlsMsz{E>AsWJqfNhjF`=H`WXO0M^3ad%hZ6t1z|CP>*L209uAfE=II3=Bs?t>VO zhBH>B3}njoW;19dWs>@d&BUL`#!L~Cm}(_9gS2eRuTWHH2JI=uu3U$d<71pjt6@jK zKyTMgDjcdtw)igLhB%ay@PS-dSWLc7Gkml~g+GIeFaySWd$6#0Ts%QOPj--~C&Itt z-*T~NSlt_47CjMt!93}aa;%dnv%uNyzT)YWT+^TBm!WCmH@B=^Umx$SNIBt6G=|ZG zvK$pl13Ka|X`|FDWVRnCrzjUHn9^WGb~u^Fus`vdbyat1igthotQqj_XM#tBrXXb3 zU<>lom|+Xcl$AyUvzEEW`i?|H+0DvlLw1)swo}ml#LD3AaUas_JK3nklcrnCVG)j6 zGvlw4|4IEcb!_T|QkhFGPOg{IJ9TDiVru?`9FcjnB=n(qJqhJkb72Vl`YFEd#_;bo zQ7L|b)}Vwi2=&=1;ZHc&gAZOW?D`@kX82ON3}=mfk3xwezs~9i-FI zHO`iBTpj`wpTc(4hD?u-c@NTa-&WzSEeWa}B`-LUEDDVctd^)NTf;*mDy^zr*e#!u zgP?mCUCWtf6*QZeW31}VQ}?c&o-<`LJ=sM=Du1dk!WWdI_-xB6gTbz!E(LT|$(ZaM=md0f~oIAmycOX5zy*bpSYEDl0ipEFUF&b|2k!iI;zmM** z2$>0e$dX>n1pQ8rqj|2Y??dT!MJueHS1;g-*`oK>+iMph+vW7Avb(V99o0sWvbfLm z>>SQ9(2TG2UUoY-j(4j#4TaC$x9<0z9}mYax}Dq_aK{I&#nwB}f=1lvH%PlEZ$&~1 zC(=^km9mlS;W9=Gdn*&==RED5$**aLO89^}P-$xZ!+lec7VqiSOP-c~=!G3?k-0~n z7u*leQ<>Y~4hSEYBYW@%r}$hnLsIA;{c_s!?C{xx7>*6IyLG4n=Y5Z zkF3BKcix`PuicYwE!(OUE~!tqbH&=llz5(mQL)9|Q%A9~noo?3B)+spH#yh(iA=~% z<`oj0n$X1jk+lQf{+e0HPPK}f9gSnWax38kU!!Q7Wa`EYv#is?o9P-(8Ow(+-ppt8 zuF(liVq-k}Tj7kaX!T)de#7~_5r;<5+zfv+2*l|j%*}FCMkmzXJb9DVb)bEpt05S> z=6+hMuudkrDnv(+N4O?hAmT*YMw>?KN4i7?L@!4kg&RelMpJ1rcoG?aj@ZU;*n-yU zvf;WQ84Dx7D3!w5qI%?dsJ-$JEvZeET;Yq+kJNm0a~zAljHZT9DhDI8B1b|8LlLV> z!n=gx3G?G_{AR4V>)0CG-8@`V8OQ*ciR#CSjr1LMfI`-Kdo??I1J{ow$Nuy>yJb+t zcC$vF4k>Fq@b4=D6iRckd>tB%d={o6oF^sKGM$gK#trcGl@zBTrCTheGF=lk141 zN$0pMB#OoGSuBwz!WUE)e!z=2TqrIUm($>&?i)F+cQe~3LE1&BnJA#8?(vnx0a#M7+f6l*=Vo zm0X)TCG~Xb^W>jW8YLZ9wsRMZ=T>dWZ4d!3YR!FFTqq3Y`~&x9TX@}ks8K$r-KQj& z*?G|ZY~mwni}ozE6Q$i#5Y?Q@eEmzMcW8!`KSH)4e9mg=fihD)PNvnm@Hg@`u?~04 zLt&-#3fAWm2u2ldnuh_6xgaF8pckrK@QH9+sY-WZs`@3Y?s_Ag)68}JbFq5sf}>!C49^GH|ai8wGa!|INneT9Bf-Hj9SZ|;?w z(YMi@>;vOakuHU;Sq0Blid2x->SGNDywOk3s;?z=u`z1gwt5q@87|*a);aL+B(RMp zuz>5h35pm4jqk{v7^c0~mut;*Q~!e=kf!p-!fW{uZ8%@+zu_j#YGt*XIF+nsMnFx` zGoxv$WcNe4>3je4T6>FPR=lb|)1AnKzRo^n9zu_@;6uusv!2w^cX~7F5wmGgsfF6v z*hHF1H?te5mY;$3?LuK!z&IEg8(w5|vL0H+>`vBIE2llw`q`XptRVq3ZR8jk{H4LP zOG}lxlSj$L<;v0@;O z+uySpykX-IoRvnMNEzd`lQTXlHYPq8RD6Qh+Zj#T-ENeO_sLd><8WETO;wM%?!sc>l04t`RMoS;m*$PJhp#!b~{(`PsU}6{XxYtE+BI^m z`e>hN2cngu&5U>MSFxYH65a@}7s{Vo-dE^?+S4ucHEBY>``^Xp_$9ncZY#E-JN8EF zDH*u?&4@lf@|}LnjN9*Vq5osHvr3zvn>DRob`tacXHGWnA15z~9hqo2>+8;NzqR^B zS1YZRn@V?3`_po-(Du-Ixs*JB9+Xw`WqFs9MDCdpz8`KM?G@Rm>}FcN$aE}6JWOUIj1yIeAS}K*+L*P2|kzy$9$`)jp9o=F`McB|c5M>ZkGZ`sHIq;)~*T z{C?u<5<9&dD8xT@-uafFUYjMCL`5>f3ei;826e4~SEqTjU9?*C57J7vL{CRXL|R3v z(alw#HiOgrm#2|tkvEYl`Y=>zq&CLd?}s04xYawP3sH9 zStRg(Ar^!$h@%UQu??K#w0Rat!)}ns?>Gr0q9%y=y}+TsB+}^0it9*E$UukJBk_iG zAhPX)o*A9ODtN}7T1LGI`NTE&^Y5W^d7m~&D+j}H`Yu|O=xWC6T#?p~bl)=mnM*NYvO3SR~Q|E%Fk&PKG9p0fdr%8C4 z(oS)dgKP#Bz>I2yrAS5fxq2beQ62-E`?=6j*cx0THbViiO?n}8W$t^XEYeFF70Bwo zZ?&@fI9Hvi&d2Uiu>ZN}^788g&=8Fx2P%s-n4Ew`+_H7Omr09~k0oD9%;`@|zR7Jc ztK^;39Esn>mc*wk6Y-+RQeSZo^TR6I8@e*5tGs?~@z*tgNq-2BQi#_s$aa;=thp%I zOS~WcC^A;cLo(zIv4Zq^yNrZ^usj;JPS;7-@v?l6YeAD3mw-VS(8DL=4e?t|5tJTFH>uhD5`5W z&~{bR?$D^wU9b9KrlgA{YJ6g3rIAagi!3Ke=y$c8re_^Nm$#ff^(AhXonRDqwTUQ@ z(wTcn(i(?;<#Kd5jL&&(MD#-FdT^vvK%b&dz>${0u&tfeW13cfx4NU9ct}TVAH5db zY$qIAnMo)54-HOjtF~2_Ea-Q}PEM=7+~!+h48F#9l&Y16&D<)iQ1%!v%(6Jj273wy?QC|x$&op3a_bGDcz z)e=TJ_cRIm17p9%E5w$1a~O^k~uOZ_UAJ zT#(ki&1_YB_4&r1JR7yGS13zEemcK|+nAi9pUw673C8NX$e8<_Ue;OqdfF1(YiIOa z#%kj;tDC*YZVM|u4L16^K8W2x)5d`e<>7t&P1{Hg!fmva4{&R@wDvkDoxh#-PHTI$ zmD|2-e`ybK3geTgZtvlSi!w=6C1>dxZ9n}S%?{bk%(~GIQdM!RuoN%uji8CAiE8dMo_?@#gU>#E!%=$JN;9@tld>lg7lFn2p2pLxVy~@yXSa z-q4zJS1626`Z|rB^~Hb1+v0Mz?4j`7Z)jdP4li&AS8ac|;h~)S^FcPQfcCaP=UJUw zpcx3!Wg(LskJQp$v%&4uW^3Phof9)Ab&XedzjDvIH~k%cTlb{fAT~F-ru{&y6759~ z&tY61dDRt>ib|5V6o1n*8eeDAB$yi{_69jDYiUIt9=Q>|6)w$opt6+@kCu%d#DkVS zT2-HlKc%WUjXn2EPWqnWDU>{WI0?oCa|&Lh1l)tfeDFE{$9JIa8H_yQLL4!1Fl&z% zo^-qu#l$ahmu<&UHXpA@UhaX5(pPXmZ^c2l%^FElNy9G(gYXNQmttZyRG_6e(F&l3 zxyVGDo>{j3|1-&T;RBwb6b;~QS{58A9EC}~53hEDT*5)pAoU*_*rxD_o2f15mDz&I zB#thwf-%h4%jDRVM4Q{uX=+2T{ui`7UqQ+BKuy#JYX?z}Rx!RtRnZl6_dH6(1p9?! z$3FI&YD#!eq>{PEf9d{X<|ZG1e{^584@iTqo(i8))^Z2@uKc7-S7@>!^}1>JmvG_e zaecVeQ5`R@5T>#Bui@PMgtqRr=)Nk8CrM~-t1Q&J^K4(QdIr%VrR6pELc4Fhyj-}6+TAgx-goj~r8evm# zGg{l>!V8pCY;eq@NO?L_Mo-A&d>#!hK z11*D@L?!x>(H=)-)b54$Yy-;0*-j4sH@6O-$UWXlcd4CdPB#webF>Z7E;x;!^9f23 zU&!f|PnA2N{_+f%LOIkr+DWgjFC&HY2@QNZqBBUeyrc?rQ&!UA+Eew7HdbG(O`&ga zo8Fu*vf{>a(!DD(CvP;@;-q=Tsk@0u{CCt5-*CQVB~u`?agf}o1I)sc`D+#9rB2+BY?n*pu24c*&`s6gMy!Pn7iCKH zp5DOz$0>&rXeDa(j;O%`*6qj|PMlxFu@Rri`=T)zWaqpjm`yxXj0Al6fzYqrkMSVWFldV8dG zjO5^aB;k<#WmaG+%>x_R1UGXF*o4buo7P7K|F3=292327cy0kaRR5rS%Hpqw|GGgQ z#y9xn(wU7o{mY#MonDzJT*b#KM@ww#fx1OZi&N{Yi!5X^COlf`jZp2dxC zi{GG>>__5TZkVoS(k8O&c8cZX^Tr9kf#1=4<7}X+Ia=dBsoWyu6Hyce2 zcdGx$AK~5hyC?iyGF?KWNDFNsPeT_{GOjpV?4BsveEW!XNbgFIT9;@YQoi1?i5HFz zi4`Hx=Ajgh7FWuJ=7)NdNyNO%0sJj5+hODlrUbQv1<25_;9g1@RL ztVu7)h_dtoDby#Nc4j{MO!|{aum>#SPh2u9NU+?GLg*W5jM1)o-wr-Ae2DJbY-N^*{+Ls1lG?mZZ|22xQ2 z9(h5qhhU4_WpXFstUSFG>VHeWjCsBX{UKe@hsd$n zPD0hEY`1IlH@eCk>s#f)nFpBo?EMbjJ+&=4O^>6w?3dnF`yZo%{sV4FTOC7BVmCDu z8Lq^`pVRL5Sjo=cD~GFvSB0}gu184UvR8q|iy(VBg(d7WLqLG@3)6-Aphj7RLvpG< z5?%Kiqm?<>dW+Yf2K?kzwVm?4nl6?-cFP;&&2~(u3d-(#)?r$6)5aQ?c%QVN{PSu4 zP^+;sJfU{#MIH!i7gDnKlF_?X< z05|le;2L=q*wJ`-4_Q$KNw=#VoCl5<4K@)rhdz(K(T>sLTiMQrgKmqt#Gd3OlE`?? z`OOL2-OYvI2Zqs5dk`)qb`i!4JJCgaChd_I%6;Trat-`Lk3!FsyWu_&9j$Y=Xd*n; z;Yi8obu~dNMt=N!+>jr*t%+(GxP#BslG+a_AVR7H?$^j@VfLp_LoxC&+nzIiHk-4} z7s9KZpM;lUoJT#t$S0cj*l%sKo{`AASvR~*?61^|n4x^(A0plP)ZdQu5C1LK4gDM% z5SlJFf}5Pr9z30|zbQ#rX@v496%@A%05AsO)fMg{awc+zWY~4@ufE+#PNo_Y~ZH z0_^y6dztzucvegi*U$o4m-D|rikcZD(u^h9ZYnyP=e)90;awY$)blx64bOz@!57@a zuLNg?TZJ!?9^4#t-C1VFTOl!+ps%vFpspQYywN2Tq}Op}{LVI5+CFX`v23!s?>av? z0SgRLZ;s0`rq9-s)%D`J@EyZ+lf2o{ld&XpW~*?L40hK01EMWs6Jqt_$0mG|I5b{~ zjgNoeokbheI@q1;)Q8-*{>Gg+m9L@)-T((R{YRi1B8iaIxFMevPl^+0a?CAeL#=_1=JqOEjrPU%fHFH z<+{oNCA~UJ`G6ee5hR#yR#qEH%$&ZsQeJV3{ZqezzhM^Iw}WKg7Z$(McJm(l)X1go zm&>WoaCd(x?Lhl5kkpi|q&*zt^xj1h=3nAJU=QDtDe_0~4jaN9+$0a_&pHRE+BcYu zooNWE`$5?M9AXAs1?Az3my=L>lQX7p;3~f3hP)R`vLAG1I$Vic&z}?nv9@s#jO5Jg z9;g-6wfE!?B^^w?mi!{= zQmk?O?8KP~Eu$ZJl}s~uo+Ps)fn`j^#;8x)q4WA0&blR!m&7UFiS20xkKRjkrem1j z#hIULm`MYe8cJsoM#Y{{$R<<^{2rIa+o!Ol)kZ^P z2eO3clKYcS$}1RPPVwMGFXJ>k-@5}Daidp}{?jJe`#jO@VV5?)HmBKB?TKh*?~-md z72oe>yp~-xOPVQk2x=tXwN-Yj{gpE~^xnwdDg)&qq?Jw3@@r*{oIDe!VbEl zAG;|CQ)!aMOImY{-FiV&CxbLQ-DOMlyoNwyOb@y>ZkfKFiZ^6B4uh%iE#JbiRx@qT z`f(`kqMToE%%5PBujsAydrIZ-pTZWJ4EHfD4+cKxc`7L^LzgffEl(It@(Uit?hqE{K~H}PkB zUA=&pn;eK^I0#a~p$57Ky%AnbSF{V$L3mjES}$l_COLS3wcc69t+hI*z_YtA*K&K50*13QkjmF1U8=!Y#pyN|8hK7rA{CP=@|!o-o#_ZE2Cu z5nd4<3!?otJW0wKu11p)w?=2QzaNiol=Q}~)g0-!^G;Y992!%Hu9EVG~yTfsEzF<3V^9nihZLm@VfR?mv`SQHFy5G#p~$>v@Y*XI8k>m6~Y;;z9U-;cXWqFgpk zu4*74>*F$UyFG)WEDDQ|kKfMLc~~I8*=Sb^pEo z56Kd?cAWfz$69re%B(mAGU>HIln%4mJkpEP$Clar&3!-KT4Ippr^-$_3*}Din)V{;w}RR z-41SZpMs#ju&aTrR3w)^T!%$3A;HnF?1TTC_#vwm%TIGU8j&g7z{^RM#jklp^XirJ=G?d88aszEkQc%i#r= zs2l0I*-IADUgI{-+WUA#hoTy4uIQm#JlCh0hpUAAFqMT#a~R3(bgxvLQ*D{Mfb;k# z_=3M-jjw8h^cVUGvxD^(EP0tV)b2)d=K<@jA?sDF1MU<15zNC`;~x;X&&-@S77pV! zY3i**y>rreY*luTfMZ?olW<3E@Eg(xQ!4U>-_rZdt>_lzN18X=_S*aR{J2O}e;lmI z2H4{b);*;RH^+;d{6BI_?gE?Ijk|Jhrf(q8gW5UP;BIEh*Dsn|*uBEu7gMFJqfnfZ#FxI3L@Rw45{xV$8%GpObXGn0FW{>36r z5s>0q`XsXh9SnQJIna9+m$#ZN+$p${azvZpQvc8`PfA^SFP?aXgZ|XWpONjPTlTbd zX+?Nra5*T*ALJ&j;qm;4yMGDM6W`#NUdXh%C{z-!(JED)-jhGXuQ@&LlM8x=S@0AE z;7PcVVR)$<3Ev0>#TlUsS^;|jJk>pClK-K%(%bLPCk4B^(}1)7D*Q?-x4ri=dLm&- z%Gi`9-bC$7=e4=rIBU)Hy12{qbfGQiwH*`v+1{Forc~h_mf4so?!jlao6})QzzSD1KDE}G?}9yqp94=h z8NQ@3S|umM6G{n-!G~JH7`zFJc+D;c6L2*3Mo}6_xoGAqOUeiupR7S zcgqd@ab^IFFIe{YFYeQuE~EJXgLH()*0&@pFXdO`4U3N9TTFsEb|x~b524iQ$5}bbT8@|dGm>65 zfsgMrPU@Y^0!A-&XZT8>VHlm6)>MC@|ErE|2DQZaz6MS-tI;8P<9dCD1)Ef=#t3l=$hzT_fPdNeVerfx9m_l@Iv+}=d^n+a*-s}4Y8#7rSa7g z?$}$<-|Dbr>r@RKSXB=ye=8T2j>>7JoHkv1W0WETu|=9vfwqE*G}P8Kni`49Q{4Ol zPNvPgRw|Qt&>T#Ds*pkKDK&MMdyB0p#vghW92>Xc^ApLA-L38B#`qXyZl}@E6i@>F zXSX%4Xt|8_IPH?H5G=$!(7Rj4aPXwL>y&O^tT82zE}EF{hz$Xq}U(QTbYEhFG3N?1RE}?&1lgS^q6%hzarAye9ro zX26%`HR}hG`=>fhqOZ{p?RD;0PpoX-MyHci%q$5HiKYQ}%3kfHDvSF9OGRIuXsz(u zM!H67`W?Z~YWkO={bIYKi=v_Ejz}XI=ti-!-fX3W)GjnWG(7m2Q~exY-vM~eQlvBI z!ZW=YjmapX0aM-wu!O`+2>l3e)d)Xdh zPjzHlB1h*sGdL6O^GCQDM|x|$cswz~5}T%kN@a{?GHTg7*!ybRdDub+>m|frV0tPU zg<#~CtBTrCStw7Cr^#F7=W4-RvY`XJg5v^eVsV|P?&Q(5efwRWu-k+0+u%9zX^3gNw$Leay@ykybGkL2(zFWO}F=O%xniuxQF&O zS!fEb-ke8n3JTK?g~7qP`tNidx3OB-&FykZwcsc?+xm)ya-teu&c>+c?zmNHQ9Va4 zjtV~zEqSWMrqry-vyxh*K1|)6aw}z1>b{gxDHW3P=-YX8MJDPUG6Ub>Ur2%z=!6e= z^#7f!$!rKWab6eVru#YPd48czur7+VgQ1)1)nG;OmH54Wkay4Pz+iE&&=oJ?2^j}yH^}EtI zV>0TREu8W{z#7&@gZ}_k(5LwAa*+VB#vWp|LzUVO6#B50A0>{9$7;Bp4K?nE*0)A7 z`u(9!2PYmUm`KZ41!uoCfj09m?F@WA$!-qEoM;{gt0+TY(?60Sww10aJ5?1;Sq<41 z&(QyTFVqQL%q9-R?I*pC=d3r@M!L(Ydu@Fwa@ITKM9uN?x31_VIE$@P zU|tzOx%1jlT4q*7&4k0Tm+|`(TY4l1z`4}XR;a_22Fg^}z>!L8WhlO(z3N(ZwSJ7I zjA7&9}^{<208Jx8SnB8-7j27@5?MK-%2!^MVa~JjLdh0(JgI`HLZDAzxl~&;^{SjZy z1-AG+RvY)N^@602BDk-fy0iU;k@}!POWktr6Z{+Bfr_>8SNZe&8TdfApy%7>zICSC zf2uXes#d^hrn zrmMa6{lc*e#toCHx7B8X@8VVYk1E*PLvp(LJCF*BlPFS^`XrStoC-f<2 z(0cAy_u<%P&^t4VY|KyanH3GiLZ@jhIKqzuphWFxv`!Tl!5i;q4lEQeh_-lISj&w+ z1K9fgxI>)u7dY|jbDA|nCj)*PSAy-}JzPOrM_D{M)(`0|s|Y5NOFXUi)2DFzm}KN& z-ksppIv54>E%gxHo%QwV`cH7jGqtgrs^`&PsQ1;%_*g-0^{u*Yq#FD64Av2nyXvEj zeJ4E%ho$>cZfR-wC!uX5Q4hnTueUikn~45tt5z(JE;=xulOJpH{e_T!nVH zfwCm)Bw0U}7s_9w6b?&ILv2GQ$Xws3JU@gf?4&3oKdgP98Nb1O5Y2` z=yYwR2xc{_GCGESFjbx1j_8x0(Rww)9v91(8Y(d<^~03=NqbULmT3J_d8s$*_7!p36(IuTY4*ra?UJ4RB(N2PaDXzgPPf{Ch#zmjsa0JTy}X+IYRK zG$lA!`bx_Kf_Vx}PgUV7Zue)&gFGwbA&)LSoJ=-!ycKYom83)BF&Q7}!022QzO}iN zO%py5e-Iimp;v+7_2tL9zziWFv|gQLe4~6WKh)-#lToohwX)*Kaos=dl2MVm=s z`b}dZiC8b-9Sf0=`6KA;6RWeCRZh}}!we|w1mD8M8RP&IwF}x+&^eB`XW@mVzIz+N{+qhyjaz1kFyB~qr9`kp4-JNmPJ@Xv7Iy-UM=738s zN?&muQWXEvhp9`Hr$QZBB~P!4R#*KBt-!lb`QQMhli69Hsgx2IFhdvdoZSu_XAfE* z*a=?r3*YNdc84XrOT(e5T7S=qwPQzL=&fW1|JD$S~HMenS?&1sM^p+IQZnlY`TuL2Q?wpB2|C6}{QD-HeHxnb#!6?- z(}tRR-PJg*Z!sedbKlAccTn1FWasi4`x(9Bwo5+6Fy3|XUZU5`OLD(mKp_5{r`5|k6ZasQK30(n^ZbdBck|k-DIn_e!%F1 zj(ETSb^Mh0iLpPUzeO)bmbh))4Sqg9y?4iGu8mUfq8s=~@2C!zN{YV*wh5bf&1`dj zigroZ6HATM^=k7~&hqy}PkBd3y1nkLiu8<}mh$7VuP2oacL*I4e+R?*om2glFdk00 zE3C$S;aAv$5hzR7iI>D#U`Gb;%1fN7oB6)_gM=mVT^Jx>d&H0BsQJA&+IeFvGc7y6 z)yQ1p-0(a2Uyz3V+NlvK6-`NKnw%#gM>I?FwbW&)70m?t=@yXS+raw5spF-ZyTV;? zTPA6<)WzxxoMZ!(=1O^ZfjPV~Jav~c4|He%Idv^~e*40$*4KW}zc2?_8?6*}f`hyd zztW2Z?|>2g#4MN_C>z|Pd}35LGHLy#$|4EkVsh|%K_?NX6?drK>7M|=QE z^e;T|Q;_J3!9{3jD>411p`scro)+^3Rc@H&gdsd8sp1AY6#pg(?Vq^fZ~+-OXEYdr zPst&wiVLj>Y-Jp{^%)fN?cj{xfMay!9GWMzR<7&S!2H*P{vXkg>g`b`<|Yw*C*7Jo zE$$}f8KXbES~D4H@%rASKX&TGc1P~h>iuhY9x1sw!|y}A<&pL} z|8K7W`IR;F8+tQiAK&j|+;=(jf%0srAIYR8Xr}EVXCsZGiky!mij7Q%`tn;TyE+R^ z^~c&9+-&>Qdf{{EiCXihEW-(wDcDs$qI{!vHXN&maf;;K5rKn3A?-WVhd)8kPDDL) z-1*fhf+FNC4$lQ%p(H8wVMMrEVlEi? zGh!(osc$&RAI2>sJ7@^H&*tn11>skUFg4!<3I_9qYX&=oI){gc?}y*Yd!!BG6!AJa z6}QAUf!~Cc^sF8i{)A;n&)=vFPxBI8SB%FxO{3ZlomUvX=qUN+w}sxp7h-iD{}OmX z(){R40|I$2Hc38FzVKqndqwS{?X6x&JYdMRZ_0rZZJ+#!)~qLSZ& zS&)m}ev^C5UCv3^$}jKjaC$KREBl?ITO+n#+g-tCR0*DBAlY$+oOO14C$qoETcY(= zM!Fa5b!JYmvjI*$uOW`6Ro*=R%Sf%r-pJAT(}@+l&ZIo#U=nmzk0{rbHz)-6D!b82 zd1`as@%N1pv~sS5Z_iA-b3M`!cG13?LoP_;XggF>f1z}6@DgQaXWSe3PN*%-=YEwQ zKfy8M9s1t9T0>e#XR77VbCobIlJb8V-ClE}5&EPb&5=eX{RdsJwxa3&#LS2n;Xj&& z%EFS3aQ^Yi`&+!p?$_pIC%w7FKJG5|e)fKHeHgMoyy4y^x&nrgceD^5_ptW>r{78M zOD{cc(0@=)oh0Qcs1*qgL_=Bvr2RM4_dmgC%;CH_1g27%6Ll#_!#euUc9S|VL3}Rs z;Fh{fNEdn@xBRun@y(bPW_r-=ti z*Dg#NuqfW(zBQN5kXoe1)MO6S|vl`>Tz6xp;FoxPXk7ym<4UL`n zsL3tjMEvF0m}p}1EN+Y$jIQ=*rvy5_9A;r_nv9lRQd!?9BFOcv()^@669ad%5Lo<+Q)ZG$=+- zOKItWR8USI%tnvUd2XHWU~+e&B&rZ7B4iae@(wycN<=>tL}^`S1w&b23zoqcFAwex z{zewX0kSi9q6xOioh>RH;Qr}=`@D*73GZ(HFd`UWN3aGI5O=3iO*y^^~~-$}=%^HL@`Nlq_clXgoraUqwN3doz~l2SW4q@Bf2^GNlz1?1v?BF?pFO~FtQ_{hSox$P zDOyUyOHNV=3zDRM(C9MXc%U^B0i=yg_1B9o{L2?iJ95^1&hm&yDg z?u^g)>4EqZ42%=z2IqypU?vw04-PMof6$JE%Lmh=z#c0W2|f|3idRE{&VYs`ElHFD#J&#<&}M!KTBfvEW_<^Ps}ZC z(u?D@A4yu;Ydk~k?3`vcX=0#))W$dpV?5uOjt;Rfobof+V$^$9Q)Rh!7TsDGk~bQl z@xNnbwfE5ZR+rDQ#7bbIKZAYz&8$jJ(=r^l?QGi~NJeK>X8@aWI#Qet*g^LqeOzT+ z+o@^)fwnaRedbH;@y;t$EBR@2>`%VdMDxC0Rm-6kK>4&-({XODB4u~F^$B^g3Hk-x zbiZ+WpXT{$#5~AAcUf9HG^#4*c|Vw#7WnRMyr7eUWz@{h-spe+_Yv9KXyrCDYw!KO zkuRKk;YXlE>&Qa+SXjqiAqY)n}e@9mwa&MDf9es8I^A4$WCK{Yy%xPv-kipBwK_eM-sekZhA@f=Z=jo z_nLdvo8k3D{Tf60dXSE=md*xTW?S(2q<{~7;-`3*+%0x_RJEg>^seC?(*_6Ii_19C z+r!Cs0`VDx2LCX+oAR(%Ps9z}F`uFpsxMYYr!$V0gM2Wrqe9z*+2FR`;g*lEOI#Fo z@V>badh5-PPK9mtoqOa$Jg2{6e1eyfHMK#~zX=oQWUZN0IO-*INEjaL;Qfpmai}(t zz9y8e+K)mOvJf_~I~`KW#^MvIMT*+#ts8jja$0j7gRTqJ7ElZ1vIa?yq~h{RIYFx? z$I%%nhB}CAx$R#RK8MGC3_ILBm`^du={p*19?FE`D1^gc5q+J*K(q|LgJkxf&&lZ< z86KyL?rU$j`A9wyt}i!I=4f-x#W=KcIsyBLvC4`0wIg5QGw2n$oY*-vHT5s8AZ<$S!zJ>j)7UinQKq!!mi?X4=27%x-W^`W@X- zDXEY2OiG7m`$OdmWs!Ow<;Dx;Nw}ZXgBxZI-c@n*%QWTto5lO<5BWo9m_9fdqYb8o za3-YF%Azo{>VUbvu`k$Hz>7*a^UWsaQ@2cXU&230`BO5b=1V=ETrGKR@~*_g@mge& znl8MV+}GWLfrf4dEL7U|RE>Qq21ZmvNX2h3JTMD3e=akkPM{f#cKKjG7>1GZQ{|ev zOUe)&jHaO@3Wf2(CZTiU3Owo!g_}I)hlLf)UyGByG|$QAxTSH&;yR-t{Uwl>P2xAP zKMuM({69^xJCi>ZT|jMd8@YI!QD62)sWd;dL0u0Hu-Qs;DwT68d(Vx@C=Ifyw@FRE zNz2|0;}mCyZtgZ+6lqD;0A8ETQ4i(E5nB#-<04*te=-xAl65wa)PpT}WjE3Wy~)~- zOW2k8?j<~1^xijSEA|M799(Gw+dH_aj5U=JHL}|u-VRI=O?`uybGP| zQop>JB(HRjk{!JR&Y?BBqgUQH5h3D7#zz`QZ;@I2RpOh(JG4+KB}bZ z>U8A~<#%NfXz)iWsl{ZvCgH{S!TJL)+%X!H-q3n|RlEx_l#woxMSRb@*bJNTe%=`{ z!f#X?jjCr=vRWEvK!_@lQSgiUkyZw$zix!-CHUPCLEy@uIXq`}HOgy^({k-dMs8+i zGOLrZ`py!(F|nEnC*uPN(a01xrbuU~BP&(2vJ8Z7W!a8YdTsPa{x>rMe#DZv}S};XsaqAufrj$K=&x@m7;1h3$8{ljB+wB=Cn$RQVaB8Nc z7WgUJ#%GSd5GfE{5S+<;D|VQ_pArtabn)ZNLqozR*EV@7AMHZoW~GOo#4T zIem^1#?ey5%HfovA+fiTQSK?twCZSvG7vTOE3#wW3$;1#nb`dR&{YM zZa@wB%ntiqBAvaK(RoRqQ8Bxcl*9^-j*g-+8oXuZ4EGbir*TCaO%m`dWvNnLt%B=T zkG=a732s)IIhWRkn{$|H4AQpffSP`5{kJ-@wXXi|#(Rw9Y+z?Vr zyW&AxL`FsWV0TWHO5*1@%{sFSJc+9eKky_j`v0w@5#E1tS8*U-x>12RFQkpsE^_ituMS2FDX~aH`r%gq80TErx%X=y3Ph;vDw3U?iGv;Nm`UL zFJ(YVo8-@u4#m&)!?AS<6|IU=M!Gus^0#*gJ;fb#ptNNIyYMzU;ue9?br(jU-C834 z0)N~l&_6Vi=VGY1C3sprFV9t4hBBaXYAF5|TpxNQpH%CHtAsX*Em2n zGYj$u4#w?@TN}5Gy8n^Btnak_Bses&%8)bK z-CD{vunio1AUdGg)=L_)271nsL zd(rM@b%HC{V$S6>{hVYc(v|6rsX*?lZq?K@(rP|cItv5jDLB?X=f?|F@VQMNr4em? zdWtbLyhq5&D|xQ43SXnlEME}#0cF-9^tID@jn4wj-GoZ+C#kG+jg+2SPLjPVd^I>u z*Zf9aGiQ|cov?=c^#wk*sL)clC9G2|XQ2J9m*^jf3{Di2564>i!`<#q1vluPfHA)6 z?sx0BE8M$Ynb@0HIlrRc!Z`?UKG*r%)NP4wd5esRV}3dPsq`Gz!BVFQNw+(lZPs(A zjsMb*l0#FHPQ}yF4-$qY{0v5vm(9Ra2dSy*CKQ4nsdtsv$^yJY$CNB;#K_Br)e2qD z$JSBv0?83W`Tl#zBgLJtBKO(!HZc>{qate*c+O0_DF(D|WdEJPb^1H1%Bm!{Un1Rj zx;9wPWxh9SSj{cfnnGfWMHBOobkIOm16!)xHZ!AsVfhNtalCBAT4u^HEJ{&v&*ss0C%KmDO_w;kMTAl1d`^t|a* z(c(fTtZ)PIdv492a&P_;v8T|Wb4pkx9rKICKZxHGyO6LbeiP3~E-xIJl~6KiW_)Rq-cI{5zX7deX@hK!;gE2S- z_BBfUK6F0x11*tNLxa>d&TIFCK27>CTr^xGRE@5mq2Z#&cxyB{kR~px%5Dmo)rDgt z6H=14Ca7LfFU6VdgzfC`Z}+WCPJ1`e7^LM_bE-p?(ntYk|=Yjm_k7DQ*8ECg)57wcTQG{lo z5F&o3I`oo!h04npr=ywqfNA{|6JQ@dwzCZcgFlmF(TXhRout=wW6$fs*)%y=o~>w+ zI7}4yEM534dAQf+;8oa-du9W;&;%5u#W|CLoJ}3b$?O!kC!FEcu#O#J5Z>mnGEeV9 z4$)ff?Sr(}YGydI<*)*UaTf>BFh&>3{n3*nx!;WQ{M{1#Ua9BqAEgruOKaZcIvFAf(I;eloJy1xo7!gIs*gTuq4 zrS34~t(X#pg^a;CIVc?qw+;P?3p~PeS)GlbCHWOe;B@tQCT_%S=SLQPw+gr2e)t(a zg!>u*AAXii_jOz*;lt3|(3fPB4+^=#{B$wZM_YDTaHImpXy?<&MsF&d;tl%0E``4^ zYMHrA2XwlO#R}HMN^{urFeMb`AD>G56 zEHqz(T^6(3+K)LQ+uFLboEzCO5_$ydkTcy~;*@rp!ajE()uFj{3I-;DY_*}JW8C0x zG_{wT_qCx)J+zj(*k7v4S5le#v0_EcSNIioSd;BOB<|NX`)Rx6nB0cUu#4gK!E|IU z4q}@tEcC!>Sx)$qhW4+yjV>3*DWjZg?uSkV`(k*3kWZdxm-F-Bq`D*@V?XW&s=9$q ze~55f+2g*p_L8epA$BbOy}v#(GqMMbN`1FCzN!*#X@9gY`wzT>{!rSt6C#E;&KYa3 zBem)j8rp|;C3m)yOrKa=Qr)sRm(hoRY)-O%vEOnN%tWHv)kxN8zqDo*+Pf#jcG~CE z!E6KB)nfEO98%UQN0o=DN^im=cU5*O%Z-QZOb$(sqWP4DhwNldbTQ^j1%hjNcg;af zyM@=wcvzrQsAvmug39`@_I7hKNgk#-8t=|C?H_F;sZs3MdM})71K8~Ppb4fy2>o zHnLG>u#?wkN;PLn5T* z`9$%Q=W;-ekhd8n|M5Ta+cRkkm;$ra@5n!0t~EDq7**KbUl@O(Dec258SvJ{!Z&IodZy0dKUvm&~2BJhNw+^0~C`<}0U6XOy#yTSGpvZWgpojcTxs}!PP>|R}b&TccItZ zuKU5VcHrN$m;}#4b+iU}W&2wx;Vg94=cXGd9K0cQSJvSE%Z1yojgk$-uBnQmceI(Zi8jv6r!Q?w4X&p%4C)#NcJ2Ea%Q@;TdR-2oiNXZcSV!IOJ*| zJXd+#vfvST61M=IV@RQX>x?`jh52zSP??nYtl-~Q!P7emJH+XD02c&Si@n22cv|Qojiw8O{|M9A zop%Pl6S@Rj$W!&t^fgMUZ~*Vg6S1fAub$uRjfyHa*iRFZ5Jp+6tm*jovm1$0X-&o5 zSc1FiMl_FwtPgRiz2jB5oIT+LdqNic1})fj+n}vkXvaBcP*-R49)c8&;`d+B^H|RD z>~&TVT&laBm@|rOr|awlDB9-=Y3Z&*^nBMY?C4XAV`i4wLovr;geJ zCc2AL&k2$Y`nTPm&%eZKXwEPm=nM3=>T@Z*w1V@emr#thxc!0z2e~qIMw{rJC;efF zvRa%FoNE+<{ai!SO+)oCho$4V*&mE1Ge)(w{fdJMaJEXY#J24(jUt zj&>*-ed!nX5Ba}Dok&d*zCR!nwYgK(5$*MMB6_0{Zh`1mZfSM0^{ZXLe5vOqf%Tf1 z7i6oKJ2x^uHY(OJIwpE6mf2tJeQ9MTKdXXTglX^z{J0D?$m`}*u_~Ypn50{1xGJCry8;r{&sj%O#~HJOGsD?w z?{#0$8!*!h(jU{z&Eh?9GrCpW8g6|@py{Wdlhr-w-h@-{f}_Br$FrlC!TpUU(q?Xc zx0rb-_yiB@545Dmqp+y~LOlTG>lp6PEy?<6L)Jr3+=WiF8#k7};SvrB`Nc`3Eshiy za4x-t`QIV_Ck{o=ep|VeI5uTxi3}w^Og)|QluWuWJ#t#jk?5KavV%_Jmhcwe+aa0{ zM{$OXarQeOnE@?}enN=|)7kOQpe^Xiu6O}ANguZwl53r;~r9 zeW$BX0R8I^!cmg@BSDSU+b*Gs;aW7d^(BR+F#QclLQCFL55PP|qPVF_f^(Fq)g8tC zEAddczf?TzhE9b(kniaZ!!F!>pBq@BQUNP$Wvtob5?@P!?n@(46 zgMT}k!p`%C)ZO83bAPN?&dqKgz^%CoN6i@JB}&pilt0M?KCiZ68U(c2>;!MreQcAb z)s}i?a}cLxJDC5Um<1)dpA|*X*THUM^dJXq65sty`fs~&CePrcxx>AuCy3|+bQ5Xn ziPPMFYxAdtg*fpBtnWZ!g!oPH47#Bzbk^JlH>xjuE7oO#WMEczW*hi2xRU;Y6cE0t z;srQ@@;tHu&NLb2&~QFecQ%DjQLkvAMh5uD0Dh%$GOYs39)~uk7HDi)b-ljAs7<=S z0=8DN;WSAbrw=!un}+oV@4x+IL%uM3pha}-;nuH)YBV6P^*-74mGsKS0&|!Bv6ho| zsy4zUG^}%jy~xvDX*Y0MI=_-NlL@6_6}LET>UT&II%vFAOR@_zlz*3gmO4m(NGqil zFv%;!d8AKBwi$u<;Iz_QJA;$qCtQ1F`<@cVu7--?-}rdyoq}s*CVtqB=E?k!Y7XqmWk&? zCD>a#Nyp72n6~F)U*^LZoFTt}4NZ&t9#2_O7~@%BO&{~9?~W5tm!>t1-i@olCRmpZ zr!I4?BPz?IJTq^Y&>4kjPz}dPIV3eaG4y?KAsMIJKp57bM0t+FG9DhLKd+8gfsNuS z=_9o1PvCe4(>buu%#8o_g1J^Nt*r|i(rA4RJisEH9Ix^BWu&cXx|z<3XGi!39@!^z zc^dQMBl{hE3O!NoaL$Zb&Qo@YYGxV=w1g(Uy=HlC%gNpVw+kt7d7SHblvl$W+Sj|KDrUR-V`y+@2_U(|MEWm)Oi{)PURJMOf-1 zG&(kw($PKscN)iqisU5U_s#GatD65Yt@HiF*Wy^^j&;$lLh?%=%MIQSG(vxxkL11X zQY~k;ThE^uDI1xG&grsy%G>Te_d=0l^=UvU&g*)pF;#7^ zC1}T#jmmoM6j?A&ndRw7l~w6_k4NcRLQU2KWWJQLwmM&0yWG5F|Bq+xEpSFTn)A?> z!GUf#bC?M~(N>z5bj=FRZSOnxon4boi8gLQV`Qig?Kj^APvUDz<^EraY=*WlmYMLY z_JuVbNVii4@i4A}qc8<;NK2k89;B(m6%XJ!$-oRTp~OrTwgt@ua$l!Ie0gT z73ai)oD&7r7sgg=llLT+7<=UR^-ue$kzIba$b#s1@n>V_$=dwd+wOmb3vHsa)|}?# zAU*1u_8v89VH5yU)$J;IFr@nrQ_ql6*NUWXQ5%6mKZDuRXkk9nAJP1onR`_oHtyxt zk9r7hupm0Q%glmhYymUC3%)}2)QLyo26J&pU^3rdUGSaJ|L4rEl2!3m*v?()FgH*o zm=tWmO*S_(Z$3$v-G#KKtujpN8{o}_!1vAwc{%wTaP}ABUY;n#cX6JDBVtA+K^9OltyJSkqAmMo1mFL6YTD>y~}m&g6!@7tRm% zRnoHdSiS89c1D_~9dgY|z!fak|1thCH(PzxH6UBJ*;+P{vmmMm^qO#<$3Rp^n76Hu zz1Gee^S%`{o3cxn*G|YScz-m;v3*{yLs!BP8ZLj6j!Ko)i%K;$Uf*suK%G&`oS@bK zG1?Mdh6^>Gd&p1RB)f-hE0gtyMlSMOV(8}T}s9)?glI4ATg9-^_rsPJ8}9QnS(Lp#y2jR|%X`!QE>jl~t^ z(JjOoUkya?3nt5=IFnyJ!1?he?jG~tL-?Gsd`wkXoTB{S(%6Z*_}I#e@u4i?(!tL{ zO+q)(Y!u_(bPd1Bw|sqH@Q(SEY0!^2`+p5DViwO;e7iuxSmYB|HMh)RpY}e zjQ(V$9W!TJy{(n_6V~z1{%jEAP!qjFS5=$Dom(_gb|QUcAa}}+UK=N3PvzDYN6&E~ z`zLFhsThr&S6-?&#C^xzdavEf-b7B(OlyKU)M`u;#Su2hZsJ>6L?ztasz*oTSmP7( zckVvR@hV?2tJq)zu=w4`Q(k5-w$|f)bF9VYK0T|{n!biOF)Z9eId@lR9UK%Ms`e&9 zM>a16R|&VJcQ|q5*g!T|Ta|J`c20w$LQDurRjpO@KJW5sc=fzJ?k2aG-_Mi%&S-!> z_FK7y{9gW8@|(BvdVNIBcPzTy|JBJJx#<3C*Nr~#(($*RMpCSA!gur)<^{W@``&C} z?8Enx!>Q(f5o;1F9W!H_qCfZ#XonlZi97}+$mejzh1JC<2Uma-txMnE*C(6x^|jpm6SSgQbLPq;Hj286t{j$! z$sOfxa&vi!yp7lYBk50Rm3&zls#?Yc-Xr8rp*gCoscL()tnbwW+*#XzNHkJb^P{6; zla&-eIsC$&VM*S5@4UBxGQyH_r%R(GOM%%?ewjME7Ju zT!b|)2{((j69v$;_>4*QlP@NnPb?X8qEATGjrX3ram?PiZY_UYWR?F%v|{W|q^vu{ zdWgbllQGXM=v>w(i|J7K(DlJ zhmt@1I=o&Pt(^}4P2POHU^u9UHia^Tm+SN0C4R<8I2MgmgZ*qqgJ+Ed75!6#q$!DV zk{Vm>mGsK8Lx1DVvKp8*^_}>twv#c@L0zTZfIBFleuJApMQ^hhgh-=j;sANS7mY@w zf-S%YluQbHSJQ%5qWx4&1;dJo60@xUI)mRi_aAf5d(TuDfMfF_-_24Gq)wnj>%o7b z{CP&9G>X}h@B|(36s&kWIAJwfYF= zU}3wF^_mSTo1TkAx)w$U?PGnfF7v`Q)ogcvs6&r0#=p_CvYWh;1#&T zXT?|03XZr4YNd%hI|(5FE+|i0uT2)*vkQW^rF`LmIAlHwZbR*pGnk;n%bDUTAeww^DuW4aTX-kU_pt<#dea@a~PbcxY3;X&bXN9}KD-4!% z$@surYn_B`&1C;-P1g%LA9D+O?CyuLy+|(XEHlVW_**_pfW)>sAR@hk1A}|QL*aPN z%ZtK=g5|b%kH+lbhEzL8^9A_sf zo(G+tR&_IsYVnS<$oUPOR_Vy6{`Y?VNGRGTnqqZVuadDogvP?dN_(6{87Jy#@>fc_bUAHMdP@!ADrj|d4jkRpLAZ*W-{Zb9p>uR8NH95L7%7nhA!!E zDb#V!1-|>3aX|e~uByxcg&wS& z#G4;d((_epQSQiB)B<`N=Zulr$>Dv65Bm?)r02-rtL&6TSKHM2z&UB};U2oo>SnjH zOXIRh@d~=rocs0;JBRsY=m953Q``d2xQXW>39Tqt)(YW6u{ik+UGeRvIeQ0_-mn^k zZUQ=^Wbst6S*Vd%7(Vtixegb(hx{&lAcmD9un{Z$Lh;3tzM)vLWc>B`U+KE675`^! za_pPP!syR2J+d>F-+$wEbVi^fX<%hAx|`+fbXF(fFO=I0!OH)M`<@f84j#{k{7!#f z$)kAnA7&5U%h&e`6n!Pg@FC{KzaY7-gHo^>^Q)L}2Ii?PSVRdn^6P=}pwwAGk>=pi zSrEu4)CyFIYZCWkoCqdf0_FTR?NDfFsIYWJS}TtT6`>dS(_sFPE@hFEr5yIo$XBt2 zkp_|HZeuTNkQL8Qg5gsJ%%W;j3Gu)+ECjJEfoVA|8cf`Vj{4&}yCmlM7& zcgoi6Nkf7~f}e<;Ne`Jwa!5Df4rhLV6Ri@bjm)hx%A?Sl|B7+?n@oXsfrY5Z&Vq~- z6JDn28<_4ZX?iQCEhgJP*}SSpNjX1Z?jsj*q%+U^4<2Z*Gu18bowgPjpE;SM@sST< z{-ncaA7o{@qdWsh3Q?el>Z!QIr*oEut?lJq0gv4uG!Ps6Bm zK#jORq;b>QqK9Dw7a8}$&q8O7%)tV|o}8e&*tbT3&5Va%?~kjuE%-{5srVXtpgHvXWrh14REjr=|Ohy|278-6>`E#+z4^bet__E#qJ7fqRvVhcfmqJ8Cy4 zFJ}pkhB$WKWlZ(9q*jlRg3=r5qTG%2%7;o_W1#-6(q6r%`RY1a>uyPvr843Cay#W) z`KZ!I`%Y`GG$z?lLv8jF4exxiZ$jkfPZoT1jmPxK&Q06Un~H6ue~pUPUudB+fvZjk zjTSbrKYTA#4~;d4IEp*N?dMK*Z8+ogUTyzpvUY~~qrH>PJi67#l0p~9w)3TD`L)Sx zZs4}@k8lD_vk$p7y$ov}mY@XzvHqRMZNbeBsF|O&XGs{|wXqic+A*q@hiv19u zV9&)dx{1E3FlpSK>8h#=3)NAcs$Ap*m`V53Oj4X$*>mykwY2Jy+PB|KF+W$9gWt{q z#dsJPCZ3dcxH%)8-FQ1>Hm3*usxnbIp`=qkM1K;mWK#Yj!R9ck`4LJbH5rwLq-k(2 z``~>`IpwX>#$f%q8lampr*>9ZMw(+ay!q|rLv#REl5(llw9@t=bB%oujpNT`v{vv+ zx)Yr;v`r4C5qcA?audlrSWgP!4!fd}okZ?5J?UuB?#}w;U?*O?#o?{eql0^oiY0`a zL5DBy$4S&z_?Gu_Jt4}rFcQ{#IHyZBaV+R-XPjO2#Vn-qW)j!28*dZ_O0UhRS-hDgWc>ETE(+*f0zTNOuX$+_`t=c1>=wgmiaz zcc%!_N=PFqAt55&Aq`RjQqm~kPj@%`&w4m`1lNs;FW&DBm^HW95xn^E9Pn0vUzwNh zWk1@gYQiM^97}*+34+Lbc{&sEGkhM`3QN50Jf%I;z36#}c#ch5au9ztIv@)?1mIxgW=A#!}jjW10l#n)gd9qRbUdrZ_^@-O* zd)z-jK3h7aLSKdMlKPQV-6IcGMkz~3GW!iSQ7(MiepmiwkK7B>v;+#YQu;q;0W0F1 zf$Mv~tz!@3E|dk`=OXkvE1d53HNBj-7>MUG*{}& z-trq+DO;(37hoZrMQPIsRIHnL91n}v%#Mxd1W_KhuBnr&*owLyb@#7TR_-jgkG=WK6{xh8*#)Mt zS>>kEcIGwMf{!T9GcX+1lEqYdn`>}Edcgy&PanA#0{@t*3 zuYwQ7d&hW+fm(H-_hx3|*+`beCr?%`2G?;6ze29uEzj4mOCN#T1$iDHdJp;z1PtEe8|paNPDAa-&HkAM3H1gcrkGI7f3#pLNpOhi_e1`-UAPkMyfx4tKI0 zcJEs-gj#Q zHOpvd#k<$6sm`BfLu0j5Br+bAd`hsDJ1aUgR@?nnU7~K}IY~z6;;KL6H87f_lIlu; z-5{5`SFg$3{Sv(GGLL3W`saSG1{;-K{A3NNr=R)yh+PAd?1j-D;ViCg6*3N}J(Un$ zr6(GNNlJq9QGP7Hmj5LqZ;-Mm&PM4s+ChLB~cqKzYMHG zk129}I7Ti=hrsvBG#npZIc2N{D5qB7Rb4t*&RydSbUJaJ>BJpqr?U`$5xi)fZ1!?< zCexJ+?)HV<6i#ps@q6aYyy(V0aF6-`avh@^B>l%P4Z|SqfcmKfT+=Yz{2_21x(F`? zxJObiUtj!ghT;KqjDEg^YeIj&ZFNPxJC$ zab;nAS>f}cccJZeRPT-|D@9L_FRN}nCnI>H(%mIp7Vh4C-2boVmjXdd~h#QC2!KzI?~hDc@$4J&lu{# zI8P7HU{Anvt!Q&k1GN4oT&XA0{XhjJuViy2Z!R?mc$C{}X=RkzG?EnlGB}1D(p%vp z(Oj`6alhbSwz^oiV(*HLP8b?a36=x>+UMW^5cV4v^|2&M@8Lr5yW&yX=;!s{3>k;! zq1rmsD3_Id=#K{)zi}fQ>69g5^qn);`V~h9i+qhZ)Q=C~Q+=&`F1I5uY=H3#9&jQ3 zp%x+CYzR)EC$tG%0@s_l)E&|Q-%4u!A|8i<{9X=5@tntF5=`74+%(^N((#^e=$*hM ze8-noEGqtw-K`zi+W$Ny;h$6m&uB%R%FknY!TSJQ;Sm^SMbh2OGODxFL3O#)KEd>cpRm zyd=}3CAaiC#xVHOn@!PPXK(O75~kv{HlEkmO)&>oO&1knQgD;G-N)TSIHFG%vwmEC}Z+ms5ue<`cu~OHH7k21e75$+rYQ z$9>N&?;qkKWwm|)#qC*Rs0jr7X)d@g0vs3jfzY>iJ3-p?+NS zCsI9Qpe{}65{b;w*?GPF3(O<+E1f|4+}wxB$;YAHMD} zt_6j;6>K3>A{#$X9{NM-U7;-Z;L7YeA#FDNgRJ;tJ|jD|6zOEE*_$5u>aqcp02wOG zDJcTVW*hMmaK#o_8LfphT;i)sC#n_IQT>Yvr~C{yYv% zvWt$%0y`3H-5!tY_fi=4OHdgny3O6RAnl6#$-V-z@8E{{#_4A(dQd9`8{R}KxD%hk zd{#O86?OkR^MHQc=;YQi$C8G#iq~zTsTy;&4O$;P2fT^4_$~C*W*aY1K2$O@a7~VP zWMd1;ykTHMCawX`VY9E`@tg=cF&X9PTV=lcz_HYOa!czP>b57=Xb`CyYBl+Z|Ew_H zJ5qWgP4o9P#n6mkVyHo|r~A}x6iN?={*K##jbMrM8Ql7hXso_-hJag~cfJh<(V^`y zH*z8V(wP?Q?;ca@2m{6Us%D(gHyU~D(rz#Q>tZI7LT=aKg3uUJ*LMalMIv!2!5_Hg zE=Lbm7Zi8_)80vC0vT1Cah{xnCj|~==uy)-^X!q}Z68s3pEG|kkEI-o>zx#R!pNML*iK?j%Nh;zfLZLQH1pBJP$JzXF(efTYVK^Qc?5p4Fh z`1RJK7sTNcUJVQ>z`xaoTl$Njh}WcruyUHOc%=3)>f2&ZDi|Xgp_NB~kmDtQrvfDppe=fy6Y?T!6ALxHAO_aVPo7RMZP!s>d zC+y`O=DN$?Q7{tncsF2PBU}L57z5(I`X`BCF z`LsGfyJ)ZAI;MxFN6N>#MdfIQ*s<95_+<&BlL{x^OqQ-K<@9aIJL9>isMKRB9) zoQD=5+9OHfT?oVGXKA@KgB~yrK6`DcyVS^kLmhycECc$!>s96j2;d9 zLnXplB0Jri_9nM+RFAJ69Ai!kZ+4I4$o0k^rl3rD;Wv54`>J{{~4?hpwCW)=TSm zG%)JsQ1aL zkJmopWRjpc@OwuXiOM41PVN}#=qNYXKT7knWZ@@lMTclY$7w--SjWD&gdX9+jcNdh z*cN|j^PIJsoAF9CWjfuU2mGJ?bcfHa%GOrvAM_WuVEuiBFIvg@#?4|E#mi=gYljX8 zYq;;wIj?v3IxU^x(z+oP~aF&Z%gO)v`S!<7Sp-tzynEv96g3Dh8|HV0Gw5tIdmee=;V733DVNGM45 z_BUcdt3{-jvqw*&KV5fjJFlF!!N1fx<^!v-(pji4wZ~a(M_`kE+>Hx8$BlC#E)?5? zMME3iM7J9r+qc|l&QtcBRyecu1@mke+~U5syP%cdWjwGxIxFlv>OSuR(M!hWb?sf? zA89dsOy?6>ywdiS3|0tcC?JiMA?NNiis) z6f?fE3t5}VLlN;gD!@H0D|+u)*0MdHlQjXdU#9&K2XPJ>R_=929CC`XM+QL~jd;%~{DV`$$K)#j{%qTxgwb8BeS- z)=2!!E0C)mZ@d-K;8p#YeIUP(3*0#YrcNAQ6yKrbsKcJtl{-!xdqRk9LE||pKpj0O z_LGLdSoGqTRSTE=*W3#-`qHU)+3O|dfcz0eUpc!HuX}P%BB7Wo@qu9A%*X6 zH}mXeke`C&tJM{EN+baiys_)V^l@NmAY?Gr|r( z!n%yRXL=m88k2V0#2KZHkViZDtUSU=@Q}51yAPZmNh-pz)d?S^W5~M__nDiRu z@-y+ZxLSIm{jJZ@{W#+;)!*qQ4KGdwgRRe;is3l&K;k1WV+Za2YMVe)ZGxP1FeFv|n0~J+6 zyD&rgPHHc`<3ib0uA+YCf5v^O2hV&fZv#(VPi0V@cKlAEKDXfSHZdnJq%(Hmahy+` z?m<0IKbRa)f`VF5a$}6h}7lGn*g_YjZ z;tesMSU@Nbo&=c#tmYp&%3FHOW45whco6O7HgL;R2b}319qBH(P;H)#r#xrb=@O}3 z$Re$DrB1^tS1MLQ%>QeFOPl>?eQ5L>CSOCctPdg1(S3#SO0Zz zOWRv}(Ik{4hkKVb!Ok8mX@Bnw2>C!+?mB(AthvZ}O7v87um{P?lzK_kyJ$zXb@~rRA{DKb++Qq>i@)XjhZ>W^ zHy6cfHrThzablUo-)E!_RbejehD@iyih6!z{6?ikEsMavP3XBsnOY2O`o5SbmD*fEcPI9nYq)fDC_*CTEm|_2chd?K_ z9$pcP&>R1zyk!pD2$Sd;3gr1pQ@v4eku}zQW-b2DA3QJGwX#%%$+3pv%P8_T+Mm?- zQeFQivoPAmYSt><0~_f9O8#lw8&ALmGL?9|u>0b2{Eh0@Vx$GWQ;Qm%;BPF_ny5MX z=qmJqKJs1pEhxkZ<+NNKK)ubt}7LA#W39d7qXp6xPtDJaIq{}?Q>7ZnmcluvSy`?Q& z)rwMi%COBfRWsHpZud0W>Fc$ZdUogimW>QjRLx51kpfs;lI@z2|10h38|pGf`Ev ziQtQytmj_z zbUX-D;U6kZmj4**X}#ybD3ZWMsUoQFL0$A@r>)(Z)~d7h$NPmX#j z;cip`hr6ZX*JNgPg1eZ6+M<}$Q2X5Y!uZYn)+%n6F-D^wFwNG+ZS}Xn5ao>7g!kBX ze>VEG2*#UEaHWdoaFQ68I$4|o{L1cbGUxaY2|K7%7vTDi_bbL}E<`8Q{Qi!Is8*lQa_gl(^vAqC-@Cb>;oLyTj3it)6`%jjwA2kcdLngQ%~coO}!n! zPxsY-%+6ilK#9KFY&9L&X3|S<#KBTt=@(x}3 z`M~P#`{INspQRl4@UvtJr9MYh`EwqAjq_giot8`M(~L!EH%{PE(+y|JPI^aui!n;R z$xfJ`eIp;=rOR_(gdP;&|8(h49r;enu$Ls^c6t(RLvMQFeDAM;!PKS^RDfArVK<{v zdddx8GJAmvL!}emD7)DbI`UtCvkQjs-g1V8V!>|V=8?YP6``t;Y~fCJVVwWZJ7Vw? zT7g?A&!p7ai~s!`dziH!N4nSMATScY-40i{*`$pr12~Ly&R?1Jl?}YijM|zsbKsR$}Vk}Q^PH>p} z#EG(BPI4zZziBz7M$$6xM;vhWsDGFn9Fqj%X?XBFciXtfV1Z6@+XY|XPkRlo(mzOX z`3qguOm~@e7A4FWV?9YCcdgR$k2sAq=O+9+^`pD;lsn!^x~1bT;W7BhNfVtOs~0xH zzGwlb3CK`$wTddM)3^|pP$nxoxd|SkCs=Ahb)$aSzKtJUB~XB)_68o^=2jZ8t@P3P z;TrC3yStOYx~Kdl6_F)ZiCnhvT%e~MQRi}9>56{sKKJM4aMKH^J~RfyQS`jW&AE=T z81YYWwH1t|`*5yxelJs+lCGXh&8Il>6nNLi;KAgV>zUVZ&p8ABW4KCiSFlKE8(NNr zTu3h1+wJ>y4JWtrJ3GtwJRUE|PkzsHxsu;5+}=}KMqIqI@lMV`AIQnCA|OIl=>e&J z6DhDuW^fno&;2-&d$I^ZR23~+OITxT@I#2;2%1YggtzZN@srQ5)`%+|^(UT>9~PIG zkQDQUpIV>n^I!^ZV*g9*o7f?-PGZ_fYQH!V_dc>Uqy(?yco?zKr<+sl5mq}}cL&Mu z*$c+P>YmC>R)g2_MeYKvxg=#5c5yFl47U}x9jUl~eBiEJj_OoM&kyG?lQkez%NQKU zN>+fwOc!bN|0o4DJbcNr%)A_H3nLmE<{h$mt2CF*$H@mcZ zT1W8gg0|01wr8M(SP|(M>mD~f?s(kj_#z2;<4ebSM$Pzx37;kGi7OVLA@Sc>Ir7^s z;n|*9`5@O;dug>%jrYRS`UW|Vi?uI|LE2pPmEu#U<5}8`_j5*j14^4-I0tMp#+$mc z6K}g)_E6<_v$}l*R9v(dgWV?L50=dyYR`m^aKZj$*VCISYqhLs56kF5-v!X^)SF-n zs(T#}pN!N*jXw)i#QmOTOqJQdj9z(GaWQW~{Y$M2H>q}OJgq<@Bx*wu;S`T?BEBPA zycg-GlsJ7x9e>UB)Mw$cg&Up%sT@5wtaB{YOw>Q`= z^EO+r9WZcej(S=u5Bc;z=?DsRi;WRl|j%_#vCXRrbl8JZAZDc@4qQYy-!q z5EVE*T`0yKAvce`021HTKTP<`lNSVUIv+9D0~waey9FF>3197;N8vN)WRp1O`IAZh z8W_?mJfOaS5mzLTf$Yz0!ZRxQNB;ITReiD7@y7+u`Cjl2DC_Mbv=UGHzg5cPg1Ad- zg`O)feor%vT2dX*vA^m0`#qaHnP9FygS%RpuQQFy#s^PX?h*!@%s>1bxtSl5Ndv9t zPlu{3h5JA{-1$@RF3o3&AVpnyq!)r3zv7ON$CgOB^g26(-{MrACwSWpgy)8HhigUN zMM`ju?G&1ey7ie`-0kWd0FT+{o^>0!S?x72ireYk&9tC;?Tn`GtVr8%PUjHWXOr5VPSdE`Zk^|R9|M2r?a;pDcT19Oe+K>3RgjR< z^ny)}-!V`)rg8J5%6(`5>gL1yWte_N&u9%H=iyqQBRMT;0t>~KLL>307H>Y*r|T1q zy|x;v33vKoq-abH*9eUdwRF0uJ-8KQfEDr$JkDaEIb(4nnyK7YUMZKAe#R7>s(UlZ z?1PUr5D&}VR&~^0RinPhpH7lhi+LuO?NusDf2+HKM}vuW1;eNQqYc%!@RHHhzmsIHH@w3QwJOAt?o>m<>0}WRPre&4%QyBOcv)ZCrR?L>o9os< zy%FnBs&{94)Rl$V3M$i=<4B7r&a>8lDqIW4tOe`>L7t;9YTt&`*q&l;|3VVl;(fb( z>BSAcy5ucZ5o>E7BZGoNNguo7)^=vw%bb|I+0jTx{WBC7-z|P+;`8{<;rY?8W8cRD zk(0rHxwh}OQ$l6k0(jFLai)@Sm0cOfwfHNhwY~5>Mlkudf(NLfqrwqSnCrFROD6lb z`qr)ph{{q_a-zCBATt#k_P1@FEl=8*zY395rB)+C?vXH+S@V0whf z3Rw+bZ51q|9>N;&p_1RothZIGX}{qH`;|V~SV=~9f2Nrk?un=#dlMZS%M+~{S3Q10 z+?NqOdNbB5ZhHLigg1%hld{A*qL|yS-&9MIe%e6)gwyzbV-mXiUwE&s*7q|B{RYxo zODn21(@yER&4678#PU~?HU`1uYl8M8k8>SgHqm~^cK*T2X+O0(TSK|!B;q3<=j?VS z2cPnKZ-H|2BM!x{dA6>CH>{=#&Zf?(RKlwK8cf|p*uPlWk*7{ij^oOd@5W;F92Ov?o96g{2&l5a^B% zqAOjNFM+^bRU2D*NyIB_&%#I9;$9%CUkXFmhZ3o^ed%*Wsd&sRViVk?nu{xZ20q@7 zq>%Qu#n*)D-O;LoX+ z%iODXvJGv;;Vadpx-e*EG4Dn4MVEsQiQE*9d#ZYW@#jX*JxELMPe0}8L8^8J%4$}qvdP}qMAq7@dRJYcJNrR`7ZByEIQi}&tWS5J2sg_b_191 zQ($+xutT#=lN>U36db5ML^^edAC+)BlrsUq2k;Ns#5)Haz}1P zf3D1)P?r9X-nW1|<5jXH@1vhs;>#_rz$^KQc*Z;!cPBwiToc!d>+oRQ{ZpJh=-g^s zl5+;9m;LcO;=T_*jCPBzj&_MY3hJ!sPn{Bxm#zu+H!af8PBynHg3uM5w2rrUn*SF%=J| z%H)Laj!cPs9w`#Z9=#IzEix@`T69=UjE#vMiaVXKJF#f7^9em8w!2-A)A}k2>U(%! zhxFN`09Rv|7s1&_>f6zl|D^wlYg>N3prM*qtR>EqVBbjnppRF|DxT$|+VAQY)@v?! z^Kh)|V2k!FF37dO6(>7&+=*l=S63HkP3fqo?0BcORo|D6N1`p4bZQ$Ftr2tK8P5by zekQ;3ToBWP5oPjz4{s_z^{fQ^$oo{DdsLI#bcbh5qNx?FH9JL1?=fceBH{y4mDb~C zF;c3IvxtEU+7|SS^_880(Sb8sP0Mme2G@o(XC@-<=F*zdoj zr!!r&$^ST+gXw}#oO|k0F(TBZy7yrN9PfKanqF1uyIu3h@+&t;xnGpzfj>#5C=-drRG9_p4k`fz&v{80Z-V|A2df}kE#ed zafXX+PkKNSTU1pZk=$TLVepn5bcyun`5sb5b5dnX|F=6-W?wMa1OzzC34CmB>h3M{ zVUIjRyl?%vPLObEOeC$2VS5ytI1dC&t6i@`|E$Z$!SNm%5Av@$^{_&ZNNp|8?O@2wrzx+p(NO_+{;Ol5*of)J&>f^e0KO0{*m@r>Bf02y4(LEac#(9L!eqJybDiNG)&vmYb zM?}(xvXZG@m0wEuVQ4mflW0asvbdnX*V~(??KSr0aLbs--9s){8f&rMRqo-N?e#DZ z$mHd=3;e1s)tcxFv_)D*btZg`r&@Dy38?OUxFLsy2e{#!^-hMn@(jnmIp~*a`A0fc z>@SVA_((5zzaiatnEoXbE_0wSqtcj1s4$rx`Tfh3VtO2Cb7!{)@2>9jfbFOyj@W^FJ$>lVTmR$|?b&3JkqM!e+6Hyp8PQ2g**eRrVS6Q*)Wz zZQ)|!L3F=6;pS!9v~^72OV!G|icdO;nomhfs+Q9aC$&NFiT^oyyz;^8!FHh8u4Fh(;<2b^L+VLJ1`!fq5vt!+kIJJq)(Sl zNaxK_3FYHIMW=>W(35gl&q=bVjNjjCYoyQato9lpEiPh0)t_gX1?Q^h!7s z9h^`$VWFj2GrJyPMO~c&dD3wl*DH!&)*w%!Ic$-Ac=iV1~WQzTq5q_81@JU+mAF zj&@pS3~Aj}aM$=;*oGeYS0>0Xc*P;lIuLD(yJs5S4_{CfGI^JJe)jz9NlVqs&EICk*D8s0l$C=De z2w$_ih*CRa7D<7VakUy|OU@3vxAH3pS1u~sNN|rf++MqSe-?^L56JMjM#7$rSN9@u zHa8C$ukID>J)1n=dn$NpcnVQDufYZ_!egQGSfqgaTWm<(shmExtXa(T8c18J5~C6w zp%4FT!&K6fO`<)u_Dg!JM8&+3$vMZJYl&+r;$q<)}J4f&qx@bwz;tnTLX9$_0P%ogAy zcjqjxf$N@X>^E0H470<6YMsrh0B`FI?`yaKu*N5fM*z!5*tJ8JHXF>o_K6 zC9B|P?yUuIvMlIiAwRKX@D{wB8t~FT3+Kh{Z5-}zMS>rKJA!3{i`|*dY3mMtY{hv_ zbJ^u!l1&T$>FlNkcXuutxnz$oD#TOg9GqWskRkOL*7OACpw;jrm%%XFqQy%$c+Ac- zUgqhYU9KmVwPwDyYvU=9vOzMaN0U=jd9L!E%{o0MJ=92 zs<;veC>P}%O!$Y4O>PQqaYYTo-5>IYDsXje7z|pcm5S;k<$%&uDW!zTFwBP9H<`OZ zbtSWsBBzyVaXDH}2H1TuL48g-mQ3n*TYHfEjD6q1m2IZkmY(~U)y z$X56;{)0Ub7D2?k!~1Wa9ZqvhiJ#1)MViBt`HL+yf9;U(q^B{)Nah2pPAX9p{rCrK~a?=R^)2@7H}@2Ms* ziU#xU?dI(&+Hx^cYM!cV;3Nq8HZ7>7L$z{3&u)~*2d6zw`$vs9e!9s`i-?r&1r71kK5ll6>#_LU|kSbaZle(H7rII>qve22pVx6c8Z@mrND;F zNrjl_*#W0M1GDT7c7c~nhCRGl(c!(}?;3K;w82;AQR7mzBv*YErLC}t`bf9LeQ3@q zg0O89MgJaYjDMZ_hO1XNvM^ZAIc@ADVJU2UW~?+8nC-03+zVkP`b%UN{*aX-S3=+0 zuLFgt^goK-$QW2GeDO|2OTuUf=lJ*kI^+AYN+B?t7%2aj?4Apl{b%s`)6%i?@k~tetl@58@GSg=3a!3(xtLe`1&{BJ z+G6dtR!=_>s3uh4PD>TE^7=(M z*vIkQ*(E%Yt`A{o?x$# z8{T31$wF?f-Uu{P%1XbIkK9LPOq@-S99K17B;$%tpaxk(ZIqp|9}o z`P!-j7Cnrd#7*eY!ioqNKf>&}jn~Lkyn$!pbh8&{q%rDvt)R8p-evYD$@#rwkYI4$ z9f_(U7fAu@d4>z3Ja(P@&S&^hT*DLX4(@{;K?W~b$;LA!QTaWvDXXB1NZmL~*?$W@hOeU)=F zX>-cPVpdX)gqN|!(cW=a+ zz<>SC^vle8brr#Qs?!|iUT6(!H0pR_38SRO8XUP0B~TqOy0cj=niV7-XxHD4M_tp#Q+#joU*M=={+0J|zn?dRt{v5-f_M-<0tpNXok9PzaIKv{ zb*@bPt^`Z-m8YBcUs#-Lz)~`^F_qwVV_sp?c^n^jX7hQwQ#C77(L>w?BsgpnsJQQ# zs#71|Bp&B%cy*lNwK9bHWRx&ZY8&VwsC-NdZt?|$Jm61N(FLSOpV^Vib~nE69WDbE z=^GosY0`q?AeN(A4DiZ9cCA;K=Sb|s}@{=zPvX#ThrYM&JS*t z(Cy$ARACEX%R5|dt4DT3%0?CkGXzTphr%Vw5iA;fhnv3NdShHN4w+HsXFE5H(+=*p zMg?gWyuJ#!4C%1dbHimm<}aze(z57hv~B8X<+_p$=g%E-QE@dH9TUJGX5)VRmR&MW9CyctEccD`-R^FlxoTaxug8Oyi^{f3{*Y^ zRtr;j_M*(Mt%Pav9#nPxob~!vRdoj9`%~MVP3pi6roIa7D7m=OAJ8}XZ*cqGhu>ro z=8I`K_rC=Z`%x=utq9JFEQo##9djkpnGWdLwCd_EB?VlngYr@J;8NFEA5Q*pKmCfP zYh&q9r_{<+$nwrlMrBe-hq^UMwrq_ncPH}8Dm(kw2vjs@6`g#D1{27mXhNpJdFo`U zzj;qO?O8n?lj(UQA5O%bt*dNNZg6a9opS|d`v)|7C*6@wQzy=C;&ipE!Eu>M8dRFt ztN0r6=isCi;77pX;Zw(lM}~9kH!~B+#A;;ZgHfBYufF3 z22w&9$giIQ@-jbE797m$E_713RQ+N9YW{2;bN{hzI|J;R3HDX3hVTPws?@~s8dR}! zq`|$>%NXmm-P$yxFPj%mRd|1jdQsGm@3fitB(EnedNTZ-E?NV<16{Mf-qv_a?v`aQ zcGBb3y4cxl6w%rQG_i!R6c^6*yifjQ=jg`su$xSPW=z{>sSbD0G9GZMB)*6RBX#4y zNL(6CAKYmjbUd+c@x`NR^xOFSaYF3#P?D9y+^4rTw`n7k4@xoZGcITK^#UY-W#d`; z(kNg&;0kr!SZDr;Py0yY2cxqw(LCrh2={YdsW0UuX5wXL73;cvg4b&tEbYH}^+xFh zN3Dr)fiF0pvDcntihE;y1KX;lQz*RHr@{FxEG&X;I2A0VKfjWAl-hxz8DJ4_K%s5# z*Pb7_BxeFE&O_xp%p7X-6Aq$whN%^aRI7E~X1-)Gj-1R2(tN2KH!DH9Ag&`Jvp-#7 zh;&D~Njk(dEvEXHF}!sb}5?R!onG&}Nlv{&5OSjEV9k>kO( zqDn4y0{HF#>A05LoMtqV+6n1B$;{@xypM3{Nh58g7i~kMeoTMHJ!PLfR(UCp6!Qp+ ze6Wywz3InenPv-uoqiC$kj}{!&Dq?y&?Cbn60~%_>QvRz>^4=nk`Dw0o6N7(aFVi1 zx1>F=pIX6Zddy_~9gj!_oZpUke)6R7F(pC&L*AV*np8A-@y!3JS)U%R1ey4oe|fYd zt_6eG4?0rMQyHD*sh|D$ZV%(<`WH9f+hmYs^fnc$`Ti6pfXEm^bGc{06oYtcK4wqp zB&6^;=JWlZ@|N)Llm$F!YJ-go^{)0@@m%!W03rIxQw~I@5}!GnP=HN;4Swbe*$GBcmyQ-lOL==IAOp@(#{`ON`uRSnsaRl3PhX`|kvP#EYgQ zi5=rmzCR`PM+?jf6v6jxq`yv}g?~QJ;g|j|{7=L~Vonke`b)=@++1?nS*rQk$O0aD z)~p0RTgXbsJ8LeQwnI#w7vx$vl&`~Iv9x{wzqX@}4_4wFvJbxGruEpl9()xV8onG( z48C$MI+;L%esBU#QBe6Dc8XcSyaA6zG-u1N{rLh@e7S|Iyr-(NgL+^oHWOy~<_D&b z4{7LzkzYTJbJtBdtx`oE&PPs!-}l!01)S5u+>TQ>gBEC-I;T$T=(_VsL(MaKqHRZB z2Zu*0x$E?sPAmP2Z?0Zd+99S9KQh~$@h%bK{2kS~W&yhdI(X3JPB`e^%0|^-vnG1{vxo@0ZIdj{2R_Lw-WvOD7}?-+4C+`(%c7qbPN= ziK$pujF--o;2Eow{TJ``^*H^tz_)%4&X3pSroPty?W7~v`FDBulgUs)Z)4S>7g*7O zq0#t=erNrn|EwmcJJ?5F%6sKjq$UcaLaxv{lO5F+)=?F8opMZjMYe2Ndo=h%F}EWq zQBilgyN*4$l!g=O`&0M?dlH#7n_!1YfCSZNN!7CiR zG(@+flLl4dGB&*rJc8BOlwR87xil2Q!K9-*F7#LIkNC;)>*)ro;%3Gzi<}F3BSyl< zq+ZFHi)BjsC#gyNsE83f5-kvyCRRBXhz=*4GL9td&Zz&I+0}xUdk1yVBzG8I8P#lm zuyFX3^U*4WGH@;3zMtL09;Y2-W3+@+&CfwP?L1$Ca^5I_BknvL%j%n#@J3PLI5xur zWv{kHU%)%*srD1s|6A}{7U-AtQDF21^;n5$-?0Bs6u=^B&OO>Ze*W8D9?$t#t^c2ewhbZ~gL?Tk)7@XdnEW(RPSoQd!FRZzXjyqdScq!}5i8yV=| z!8@ZDueKXrjVWp#4!@(&Xm^2oRg?Mk3DxQ@eP9zzm$y`~75L$tVyaD|r!L^9od+J> zoT;=pDK9g?_i?e4n$ii5NEPs*$mCBO_#@y4A37%W@$ZHqdfR^MPGpmOZe}(=7;lWC z<{NmW-OO}WoSE7B=#Geb^?ih0IGFnewX3qIupGA9GBov zT<8n1ReV6zHpkaUs0q51$?tM2n8alLP_I_J_6>bU~Its`!-Gw z)AZK-`ipeAANB6W0DOZ^m}99tgV^Z*!9i;nOoeCK9rYg)dJ1dJRau{}Z`Dd`pKCYK z^%mki(4J0mPkVw7+!j-@7u(B%8zP&6d7a^Iu4r!l?I*X8^W3zw=Kgm6axlnzFxG1Y z?n+ISf1C>8&G148Ss%@BaMYS^-LnS-=Y&p$CXusVAD_W|@ZGl9gUCty)+%bW){e?Y z0+*#0!ZCKcp=df+vbTjnUq5))qlPc)yCG_FUc7uN>A6W~E}=Km9x&_f3EUU)D8?Ui zAdl<-wyu$2xDDvB)4BO{q4S^h{>VlBv9ebBOdgMi+cP1bm_G2D?|7yvZ?PP zd)v>v&T11KPcy6>diy4*0GAM2@ zc%Lil-N$G?GjR<&6*Pj=!U~?P%OagZX~Ngt`{W^PH}l{>A>cgu11{0kl+Tr8@)r3H zSp+qey-Fpykxv#5@{Y_5`|%HdlD1#J#TE^*Ex3+nB5dVwdOH?hp*x-e4J^qTg<|Hq z`8x2B31SV~=37w51wsXRiFv}Q9+?~cCcM(^Wls!#uxjh$)wH;o#w*w5BzcE2Lfwmx zuc8egE2Ns1MNLtT%G0#x)S1Ryox52bT*Xb}HbIXkbM;<|gX=0>nXbVh8bmkfg?hZ4 zQKYSw=Tg~ljb`fVFE;$Wg8#e*9ILxJatlh?b zh*Ly=r=DxX3dPTgt%%8ScVfT9&579IMWOE#zAV-;`9X52q_jy56EekTiT)LrIk9#8 z4bs3ehnm`rbz8q^j<=8FH*v^1ZMP#Sa{C=iKG_dS#unuHtFd z7bK(?+|rL+*iZRxsOgNDc9)!q4QPPH-00tu^3x7n<}f(SJ8h?ykv$=YUWgR# z4BT)V=(oV?+vz)vB4$?7J6`D@jIWFoy}kd4X9Lx-1UKo^LRDXS;T^r81+T++v@c(> z>)-U|gvAo|wevr-ljB;)76doiVytnJnOv&a?1XF4HR0sYh;SMAS0mn9ZAS*2dro?eYv(X-OhbHKeZ9N|Jqdg-bA`F67dpdqee0bkd>^Q; z{~`6k3w;cFqUGdmTfSTVQCwc*!D{Y%---j}Qc{Zlrd$l~zd1O57r>XjpqWYeUOEpO z^lSE_uRwHK@GA+`Nm*&HbO^=tbdawys3$uKEpS|H;oaux;Q7kanO=03&N$DLlZtQg ze`lal#c^>7^Uu;Kj30UY>JYWufJ$^M%1NOI{idD<9ZB>M;OO!n~&Ru7R-u#B9_ zrS=|oLAXq?FA12_g4IHwhdP8hM7|5_)>KpkAF2D>l|@QT<(ZsIX-sm-pYmaOD)|F@ z{ZX;I2%lM8EESVWYu$7Um0)KyOPAn(T+}yPPu;%GYpb~Z8g9`=F85uzXpGRG^Zsm! zmP&^=|3XMBU$KU}^}?MZX~J>tNNb2Y$ZoH1Mt!hcse_MccX^JoOD&?W(Y<;8cRs{20r#Clt8a7*4Q=Dwd*a_~0@Rnd(ceEXWZJ*1oX!Wzx+fCJP(Qyvom5_?z zukv2<<<|S7#;9nvHwNfFvzZw)LdIWg&#wL+=4M^E7^j(!E^8OH9Uw-2n4R-*!@8*# z)_aRIwz(iJPhXzmknh%PbfY7FU`@~PNuth{eFmpB!+dJ=G6Pl)dylitt!BmPyXgg|%#loam2e?yL%n~4i;36va5w12 zc97_p&LVn3W1fX2Am&rR&PG}9q+McWF)EPax+$DEdT!Y(TmiJkqN0t@hIo z{s9>&M5Vju$xR2?P7TaQ7ih%{{5MV%&8efc!C~%tUx_-L>?h_1QohcajqD`njaoS{ zP=VD3yY7uSn{BeN9U;;CUv}-@b{6*=n0gM|dS6kYmG5Mr zq12KIvNU`CTB(Y^xp+dXsvI^`$X}Vj^>~97hp*!se_=XC1yHWZ{7kv1)7|*&SxBnh zgYvkBcv2c7Hy2}A)`o@0TucUfda^m>r^Z+0qw9k{T?VZ=&IXX0;}&Fh=mds;hPgdP zm&ne>WOFGfz^;{5xC5i$q*w9G^z5RGl;-0L2|=-dwAh!;-y+c5_dmh(<@4tt9l07V zCS}>GO390*n3Nz^_l@->gS&}nT!sjF(Hy_=9O8~&l2=`6lweaqr5<`qt2+$X;o2;H z3>@VDagQl#R5A{$`gM_kvA(>tD^ZCS%K)EH&eI;$Se3>SiHLRzGK zq-MBTSP4H1RfwqJv8ZATh6ab02D60Q>M444Yb9=Q!)$bh+70C#d4DIhJz80#rVq+LCwYW96lb*|$;4$_#e>HQXr|x4{vmcV;k^r8y z-5%_Sb}q9%HSRNOmcCZ&EbaG}MGHAfyNfF5sj&rSzb7;{wAfu5+7KQUDHGOGQ!>LB zB9+Y)yob&z-C+(r#HD&P+@0$nM19x~+Hya5ppQ42YBkXeudyz{Eu4)9(_W(*?oX#+ zlP59*9(1?6-{bpw9er0}yE&VdYZcUs;X&RB&E$D@sl&pVKn&l$6t@W(Y-L=WPe~)* zVf?NZP)8_vlwI<8d5O|bo1yQbQkq|NaF(@hHwVm7EFW+z8a%hTv(-tRChGDs&efuN1J1FJNmNhH;i` z{em~zUQ`%U@v-{ODsSg-{q93&QLt9nj69{!6eADtQfwS|;2&dGqv^tH!)Dy(_;>LW zl3FHrOa5O{?SwpW=@Y(AoD=IB`CoWgu&9;QET-2s&R8Mb4AvP9%{%5O`)x3j-J$u7zpdRUTK+W#nj^ehEHTS)-b9NiV1OFrFB_P18DHzTjQ;MsMNo4I(sv z`D`JW`WhGrS4jkDLqb4xy7MdVx55N*sBwR9nv94BS=YuNQ=@XEeO)mDN@qi-Hj3g z?`Qw-!$XM6?8LplbI$jC!z>s19wl2LVX2;7t4!wHt`xr>X;IsFX)4fS=1uaTr%pY0!D2o89QLT3M4w(++rJoJ)2il#SD)FQPZ1m;ENVSJ#SVj*bs!7fVT< zrP?@Jgry0jck~ZV4|EUIVGc6fntM1F4>91|)9W`15v0@1vr zp99H(g{TBYi%+bOm=Nk3s-!M4I%&hS_xQX2g9p(lX5yPhHlv|7OJ7DuRn0iA`=EB4 znL0m$ZzM5$&N5fvBzP27-8aTFBdz(su4PxpNnyWp%US2#BsV>cw+}ApQ`d>ri5HEI ziSLS?@w-Kjl7{|c{ImLFQ56VPzV?n&Yql8$w8{ERP?0~?E}%@m>!(1nF2ezvVEmw$ zLG?C~XKiSul>3pd6m#Wsg!H-?fMAh)cr3DM2OJPG7wY zJ^mimV%`a8a6pxyD#m^n0McaKJm7?bHGC{ z$F~^Wm0K`Q+q1#VrF;xZ*IY?LZB|q{BdgQ`#qi89ejBT`)cP03Nj%i|!Tqdep5&Q) z#xB(3e&6mtLf0+Xiv1tGb~4re6ZKc}J?5~lyu#GeMQ9*TGt%IL@s;a&)kv5-#va?T zGU@NgIOwaSAuHi7X|IL!C0YsX1n=z^I9>0RXUlbzwz$|JzBi#xC4BkN{+xe>H&9I5WaFV6o|=8{>T4UL#v~r{?gh& zC76vC*08JErt_CO(Oc@5jpd9hiBIF{{Fi=0V)Mi{iIWp&CuU8|;^&TKPTa?wa6WlZ zvExPWCBKNx@t8#8E&U&yQ#d+w0=pZeuQs|lY)s5ch6r!+jh8;w+fRxX_ByzI*sI^g zF)NuI&a~cxnD6cazw6B8G>m?3Rj{0tO&w!A0vCE@%+r^nDfrVE3*LB%JjGU2g0gt| zF2xt!0vAdoEi1b|giZ1ydZ>VLSHI7;d84ry=l0P5P)$Rg4iCQ~tnt5?2aX0i3J=6t zTn~M5of*Oul3tpqUNvW_ZKX-%3l<3V5fjB#(vr}}p>GALXB6AytCr0BGS<$^?qI&1SzUr6Vlop!F$rnBG)(%O zjLTwD8A+u!tP)Bwo2TT1&g9p0a0{;o{)7$xAyAByrwvnp%o&)Lx#5FQJe(`CJ~C3i zA33T-$kS6~MH zVlpS=^MqFk=MyTy_0&T7)C>6d)s~)ficCeTmPl=@DCL*h$xDsw@E$XmQs)sdf}9c#kLJqT2%2(F(W;nZGA z>KAE6#&l}o0FRi+YkVA(#CG9d#IZP}7YV6$$LRk@9F`41sj6^6K)gzma<#OOogt=4DuoHM)+4=uKlFmRt2W_)p|dY zM$_OBxK-PuRfV5+A2rJ%HVxH{b+C?Fk$<&;31gquN`I&~CdDBe=UrNJfxQqUV6t7! z>Fthm7vMRTlPkI+uZ9;%o`rx9=l*xQ2Hn;p3U zNiwG64A<9KtM7nScuC(+E%=6-{e`u{Zsq3iS30lFZocZag}3#iy_hR|ms!ZXt>h64 z2|KyUg2L8dHKDdLi#aZ*TY?G{c9%M3(L8@{M+{G^%Vcm4=d_keU*5S>?DsF=fALCA zr39!)5gdvRYo19fVEgcL=2Hz+ShVHX9dB_au`w73s#gIGVK=7}fBMMD;V8~}szCwt z2g}Vd^c9KbHq&A^^q7t8D5is1Oalq_S0ES5a0$xoRKhW4O7v~4V|;pidE$(u#)+#E ztH*N1bH-~X?nz9SnBl4jUnx*@F&wKZ<2TO7w4=f1bbnYW!yR%WiX)AoEgda1lM z<`djWJF~Gb?G5&CI3HVIbN@`VM_F^tt+2SeTV2_d3+(f1()&m4wP11$tWtJEG(Cbd znmX*-S9o74IS-wx<_+cB&~dS}l#(J?kMG}GYR9SRN;37}nK)2zIc4&I1cf=zUIzMs ziR^?`dNA-c^>kx^&YTmmINSI=sCn-*wG21%vH>_mlF2CZsCgEQ@Uk&4^aqNP%VIS; z?C&BUjMpe+ZkVm@&)nnDF|i^3S@%cWA02pzf7&J8jL~bp=_a|I+=EVT|NH1ZOAl9; zPLaLYRahMSjkN61!s7qAP#jOVlkhNMLBgVhZ3(*)Rwn$GFg;;Dm7smFPACZ<;|1n0 zEptdGk!^;w6vbG1=AUWOs7MndD{g(Zu@M&2A9NFEmBG~UM7U-9VE^aj&!yNbRuUFS z(y(Qk^cIC-=34&1^cVmKS)^n7&{CW6HvXk9po3v&M7fn_W6KH2bb4+Vzvr<6>{ z%3w)4z1cc>bEKT`mzqcXBe+L6%{%unP?@W+b1P$BipLDwp%-i z@4!+0d;M3ODe9rTT+7a&nQ~Iwhzrhk<0m7@xnHeR1{a+DscQSTB+H<-$uFMyL0@?@w4%?iB%Gd)Bo>Ge3+Cj@k0DcEJN(4SUmoh zzt-y=UzfBf@p964iRF^A7Kb`t_yR^x z@}G76Hfe?%49&>MuJ(;KLFd22xaP6JuVxPikNwg9+rEs8;CS1xKe9`Z^L7PxuY#jsAKS5SSwqQjNewQQ zU9S^r#Fn77v`p#+iqe$snG6@)y$VWykpO#|4P^#i(FPnB-UPY_hl7Hj50nL!s10N0 zD&4P6H`+fqCOiao;zN3Xb!J*{LX}x&0A2qYGqcuLvW3aQWbwH;LVB(|vYv7sRd&ib zvbQ<5B>JDf#DC}QcMjpBcf+3K4D_-^M=&3Z@cP0p&63zQHcNXUED$qDVPPNW_~k(B zVEMqigsg!V2{#jdN$5irIFYb6VM)U3gjor}!0g}yVVzPH_QMqOA7z&`QW_&Q5I+-g zfrFJr!Q3^ROaI8KW&W!#0~^m{6f-ku%kinG&c>qw%z`fbT7vl?7tXViunms?4)HZi z(G+Fx-oO+Xr80if=}}UShIRibQ$Z7|VIfZ9f53b^SoksOz+<)sWtbOEqSe|L>?1AH z_p6Rr3EP~}%o*i{mw_7Kln22kx(e~|1T~{{A~0V_Mjdqyhpef=dT?5Ii>Cvb0}`0j zhrneq68cK%U>7udYx(8j)aY->7mRqdb^)s7pBnL&FwRq=Cf;+=-GQOQ|k4<_Tq^ve4e-KbaJ zFXpv|y;0to2hN$zJ?D>#=XI-?CG79;Mf`^(mF8&9zcmgU=};#1=X4#)X0bN8T~p1| zRA`Crx3GDDud1kh9$COta25~yO_C`8t+rB+$SdUivY~vgKF86wko;Kf&4z8OQbC!< z{`Dq~&$X0Kl&PUlsON=3bKwS`MSs^Oe35zosanN6uJt1Y`8zSHtTAfqqs`k=O2X|h z@lH55r+%~W=SFAJ|29btNEkhfn@SsLAMDg|!QMibP;s@E_?KK93%gp-j^?d^6J@^C(NzxA4V1H58> z4szO7xVRYWrrIA4yT`_TI92u?u5?|Mzmyv44idx{k-F(S_YB{;34>@M6T#=M>w4@C z-jY)L6TJFKuJsx)VC(e6saJ*~c9eRJ6^vdG#wz1i<wu^X z0YOMdC2;B1zTn>cE7(fBBnORc`j$u~l+_WkzHWu4DV=n_pH?x{RQg2BDVCE4hZD{G zPCH|*aopKPM}5tHM@mKwb3J>C0lH$WH%{S+8@86SlO4uBptyCxoM=n|N1SWcG^$x^ zQTy*=D}Rm}fVK?gb2566O?bJSWm~fjhtdlmM^)h1O3qL?vDcaUYlaun|AK?yxDbG` zP=MbZdg&ZI&+mlmIMR3^<418Rehm`xmc4Ni7>w1~jHIU<&Ojfm!^#*eehBweqWS=m z)W);Hcw#g)+nJ`h$Iv6DcqlkTJSgpiuasN8og26`WyhzhJE^$i*g|Hp zKXT5v8N4iZM(tPqKkuBMiqy+P-Xd!Yc?HACOTH6m6UY-dop3+lO~RvuYY7(;eodH> zus&gV!W@2|1U`hz4{q7-$i!U^PB}}-ji=n=(9di`o{BMv{R~ro2KhUEI&M?TjRVGP z6wgV%c|fX^`!K^u3y7uQ6t5Mda>0Ga>j> zAdZ9FMxN0lyz)j;liyM`TClxX6&MiQ6q*rvCl3@KvuD2*cqvrV7IIb3g=6{$DR-Im zj(T@ErNh`Je`zFZkML^mAIYh-rw&|EYpXMqVkv&hY7KZrvhp;tJ5pTg1mC!`JcW*N znVw)q;oO~Zj>8$L>uj}(!K|-`uk-ibPkukIwf`deeYB^$-1ej6;@kYD{_SN#je{t#zrArOu@irN05Bw?#`lti=5xe?^~a`X0)I4hlM|zb;fLAea9wYmia<=A`?);m5=0xuU=d0 z3ieix4S5&iBlmUeCx1-*a&nENzhXZ{kCUDG+*geX=x|djS5O{PIQvK?P>5`nEB*n0rGMP->s~`+(MKDCrl6iW z7AK6_?60RNH>d?O)g*1KGFa)#x&0GeT3&CZ+ru4=cXwT8gEP)XD#2}>Io^R4ZRA== z*%|zWvwStuKXbdEIzL#6`XVEV^KmJ8f@#^X{6PNY9yG}&Jor}jNc>E{w?0^@+-}j4 z@wtgLljbJ{lXAubvG&ml(Sgz9(NCgdy%Tuy@AfmtsS*CNSRxf;cae&p+$q}cllDa? z7M+>oCKgWI=Em$r=1zN(x!O9;)p*oy>YM`~d5S02RoKhZamU(ZJ=8U&Nu+FO3m%UX z>7N?G^Xr1Ixg8<{)4XabJexm_C3-jZ=h=)m=5~^G=fDEXWvKcd9DNsp7Zn28Obgc{ zGqrc0z1PY}C77n=(jJ-f$mGq!ZzX^i^|PPnav{n!!QW;(cMYUWR7#mHTB zGOqZPY|JUaN0ETN%kSaM_b#~^{P~GtE76>Z&fp4OFlXGA-u-9;?`w6G7zq8WE+J1l zyPeudt2P(Yh#pkS_2K*wDp@}q;-+Jm|XAEvW4#6&qzop+)mNJAq2 z6Uj`7o!A!K52SPi$Kk+->CP9itNMy;JaVORLaD~TtqJ37f4Hw!L`uV>wa24zE((>V zq;hW+j%b@;c%>7j1;z-)sLw+}pR4!aETq;4$cOk$rUz8M%MtuQPNV(UM-8aX6_|^8 zq%4oWf%)wbl_w*g+*LLgn?+G+r+T326O{GrSDR`pG#CAs3V*t@(n9Jl25<-~Cd?2@ zi5tXM(ihT7@wGTUyk7nzlv{krPG}msnVCYFa1#)jQuGZ>v6%WC2cMG4&uRvJzWP>qC=U#w|3*1HNJuRXBCD`=q#`V;dN8m*u`Y%eDSPdK zb`wXinsBF=mrAooz8CsEvR)`09wg@z`wFYX;nH?6qIXi~P>E0r+)PFaQL#;EU3j^A z+PF@hOw_7Jdd3suwEl&eXxHTqbp~cjZX3lRFFw#)czXZ02Q8n;wj41+`$0JV)Mv@@t3Gk;vPk3Z5Y;>G-;u?4thoAyxi2gB1}qYIo*!r3>tXJ1v4amG)>bht>JY7THS zIH$c_-a&VnI~S~|4=kcj@fEv6enVPZy9>Dgkq~#%*~Dqn#7*x_^(J|n+-=q_;z{};zVd+&%`~nD4dl>aNE0sV<+RCaSt7KS$A$!OB|N;EU8LT?YI*ACmM@3i@LEu z>=Ahnhh5(*7yCCh!taYd{6KtGQn*;O*i1Yd$|ZFn(XyPo2882`I@W4t2Cdm<8hboD z?U7D`GXWRBv-qK$#);vOHdd+zHuM{bW+}q5d8I zGCV_Gs{E%PBn9Jv{j;&bdW-+j6k|20&;#Qf9I^vOZmY00h^)4|W>Bkkn2%rAi(x>c^E5awuFXfaz6;BEl$VgRojzJu6Qh|scVNcnJO3)J2C^wiy z9=4G!!B*CxbYC6(I21Lu!V1g>j;dQVj5M07{wtTD=e|mWnfMGY6$L6Wkx-$smx~q()L#=?oZX)j;0B zBPM{u374n_`xCZP1I`8J2Kxnu26}PYUJbsNX6SqIZDGHrbdpe?g-3TW~cS-$UrW z#xg&A4PUqoc;HZW#(CjWRpqQ7z(iPsPkS=%RIRBQ8K@rz0~ROQHGGFY<8OSt5ffn= z9SJ@m>!AtPVj*D~z3xzP2AcT4IrA^@sPlq-h4Ny7aHmj0Xg?a{8l?XH82Tw(MJvKi z^)s!!Tt$$Wa6jSuKH|*ZPM*@^KpSdTQD&2Z)RL=Y?QKWZ9Acxq2Y0DUf#m_}F~0G) zm|R|n|AgO$Ka&0x=7h?I%Sfk%_MlqpxpJ=uiZT-&#P8w=ukS#mo4g7ZTq}71b5SH4x>8Rukuu-3u2}=h=(Gx+1uX{T1TdZ-i1C6JHjOt zZ9(A~%D|YE3wOn6XqH$2B)6!rOWLk|Wv+zDZ;;(pi8@%46yO{FAJ$OZ8`ejLbDi%I z-baGQ29i5t`VI4qIYJMEvhDLWM$;u0NFI^cF!nUM(7o+$^R}9W;Sc3f&damprSk9m zdPZ)h)Kh+DU(g=6w0!3G&I(Z1k?dIy;XrpD7T{zvVl=c);TQdueejP?dikIh_iB*v7 zmMQC5)KajR93=?LbtRg`Q)*_IMZa3hoc8boZcqgr_67g&Z=>Kuk6@B!bR(z^GO;z< z&Hku6?h-ZKWxUiCM|rr|Z`$GSxC`BUNzl73ID z8?O-S#rFIqv%p@QV6(&ROoQ?|hi#KWI*&A@<0#MefQ7ubRDG&gSZEHj3g#oZ3LLgkDDV5)2Q6c3YWbC7(XnOak07|gqc zVD+cX+GaO*el+gyM0GyWdZMSdb~xY4xrDE%0Unhg#>vo}&N(AK#2fnoFQb3c-5)LPq;b!a4{@B$&J(w$dCOcxZc}x=ijm#yNKGhb z)__5>37$n;c5O45ChC*&lxQ`F=lr`l#2jOmWM}m;EYq82nEt;z+kk@bOD|f(>{N6Q zYwRiZmv~n#w_D;tVX{kralqdWw$__};LQ9`n#EioNVz~#%1U{qtWsSNjZ-M9QnJnp zfH5qCv2rnBqdQBW5)=d{ufngt!;6g2S2f9q@fqpB7cX2PfgmEm~m|fol*q#bW z(CJ74+6;f=rM$}MVU=aYNQtdL0KqPknX_4=tQcG zi7I*~E;*gW0#YV2ABP1~2OcIopcd?>BJ4@{F5%yVlb|&p=+v)^O~V!CAJuEdWaGK< z%J@pj5*jXzf)RC7`Vv0p330o4Tug;pt6Jz^!MsDs7W9UHtqb$AD+;X~C8zD^Wn30MLs zWCmuc>Rbt3gY$7QI?30y55(vaJ`%Et--Jer4fx7~LMmlN_$nvNjo@9es=Q6w2)p51 zVQZ*mBvttP(6-R2P@d3TsX=I2_=UC>2d6)^O_4V^5*6f;2Xif_;~8h*^XS2(@h&if zyn$gLM+^A844zFv+%Zz>#x^!BIobQ)VYW*K*Gt1QH~IY^bPr9zwJLMce@C^O4BGTG zu!u@GovQGNMB~l;-~Lp9O}xUH!4jlIj*+UU``A5Pv#N3L=fs7el{?>S?0<@9*;{Y7 zH`8h9b&6JwEpWGyTl1N>-o5JO_F~=%|5q>S8b)J$@_)stVGj(9>c$mR&~Nn?pmo#n zt=)>U=_`CVi?cHrV4TxxOY4H;g>+KAa0Pb4-IOhCISVV@m6b|=C5v2J`ABVzc6JSn z%%UW~)KDAX;CKSpfRcJ6`Gn9hH~@c0L#jb$qK4*pgYZg9r;djg+ZCMpnQ)ljKJjiF=U7RHkN3m5;i<|eXTOd2W@!YWz2gLtGOIbPIJ9dCG zTz6G}s*zsFs{AY8mS4*2K!=u-E0at8S@~A(896S$mYaqw z6E^JH%mZcJ{LBNT-HJ>H-Q2I+0MtwkyTD$GNDPAG(0rSvd)Up54cPZpz z|3Xel1M+Hny0@In?3kLsi21^*|#^g}lw(tje5{`s4{9zYLQ>D35 zWwd63R8f3G7uzWifWKY6pv~sl}3!HR@TM zr>mQ<%!X*VB4&orAlTfkg$cqXd;peG4XOwoL{-gde(b2;pI%$?ky?4j*zat21l0Kl zylhDmqxI}c>h{PLvA9?qADN%=5!1oe>wy?o7CMSGrIS(~Q4U;9*qX3~iC`bK;AKMJ zpbgt_h+u{OQ7;?gVJS|8=bhcIV$D|G!H?=8t(A7dl6r_v;3)dt4`MNC1TM$L$WQo- z3f~7FV1L6i-l+-VKKA0DFwF_IfqL!*L0vAR?^?1qbmpNF*Y(ePlUteh)yA~Fm%Oiprs)5zudeoc5L zb*Vgm2kP^wC^%50q|9ZZE^MIl$rU_In%Nz z7ECp9UO_%;T6=n=YbeZrCl6s8+QKzBY@HSFiOr?#p?cCn@n)!Gx=YwRrsx!mu3<{7c}WRjnt7Su2g z!iuSbQ?>^OBV_!mi)4k2hNaY%iJ+_T7yVftI<%jaslxB@WM_vjzzcdKKae{sPuQ^9 z>QuFhth0Amrbb{zRRJL?NIv8ub-va}+ra6*PsXW=KBA%Y0zbO1C0lGD^hYC7Q5*!D zs=c~i?`QmKjMgN4Ha4TYE#MB(TSjh3S;Uv2d`5A7FWSqG#cOZ?YYF@DrO%4<`UTk5 zp9_D%$XX&clQ$d5_7(ddxIvA{cihUv-OfI3Sn_-nBC2p*N>q30>0z0EMk>!rJDW}N zU~F4b*5o4b-O-z|aj|@!M{ga9F47;$r{x>+N%>1QwzuW9IF;IJ9YvG(hBJZH6f+*U z+1(eYWmm&^3|YPHTTTUcmUSweMJZvO@fY}4{iw5=#GJHdLpSb}w&ybK`f&P3Si7x| zhCUPD14XS7UE_JUiuUp^v8_8`A2hK0_KwBU;~Lx|I>v!pmZgde_bPd{NWFi7U+D=a1FYBs%mUfrsX|S32ck$8+?AjZBiJ6aa*KFF zyunUS8lZukv$!5G1{^8DB!KRPASZe(5{JMf)>jxu3mT-MVMCp>-=+EP} zLRmIkJ)(XMDs&8&N0Q~?*R|1RscW?KMtyS#nHnYZ%~~PzOXrX1l?!>ux&cBfQYs>9yY}ZTTPuPakhnAiZ?G27P z-0SDnCT*y@_l4KTD{n54AAkr=XWERC(D*B7S`FN&r?MePj~DP|bGq3N1f~-_+9PZ_ zF5^2?58u(Y)}P^F1kTVOuaBE>Q-&ng4@}T^+>aD$3SE^p&saC-cLrOap7tWNUmCceVT= z6q(tIn8Me_Po``&G;`qFHv=Sij+w{o6wWN}gR_4gPlZXidY5AhyG;C7`OX}TYB7zM z&MV|5I`8ldt%K)45$eK|c$wsj^d6nu=K6Z+3DZ`WeDPIrmjTA9L@p|SKOj8sKRD}99e zsEsfke(CbiQmsA}v8r)(IFQ{^hz|XE;1kgQ3jCZ6dh`pZ z&m;Qn%4`E_a*AgE-!?_2&o~7-)sBDDlT*G4|9Uj%bafD+KAgEpTp6wC5VFy=m*d^L z4DME)EAj&VI3>d`m2To8+{fC19L<#y=wFA6O6XX)ZMby!LU@IIifrOKMoD=7chP>m z*P3g!h4shCd_b~@lSmMnpcreEfp26CDYtH z>UuRk4UhT}pte2ZGpxw-O>x(q!-SIsmE6<79O}ZYVC7H_^?=%0NrkVmpbjM=XNI;? z6ZA_)F*p+;GmqWU>`GEiQKvW^YBoo*%DPwGTWFxFJKb>{J>{am;$n*G}&*=Wh(gH7{{*<&{ZDA(X2jd#b zdAX7nzx}AzLqDNc#V4bs{uXbwNw}+BmD8~EY(vVgl;RPf-IO{qY1Kq)mKx{WlsvO@ z%s5>H9T#0QQc``P?uA8I!Bq5tY8j&l?4lyN%3b%9x?O55A6GA+EZHmN6jQ+qPjMP< zCSI4WOIJ{T|A}5@gpfnZDd#XJ@VX;*R`;CU-Z}spQbfBa78KTlvaJjE&_^)c7d7g5 z-bmRsX&Jx6v7IxO2<|Szv8dR;n}OtOB$DE%HaW z0SWdajrwkq(-%ZyhjY}*=Ji!gs=LIg@wN$0y$2?bh;Ndd;2e_5-H3JFzcfS)v*J@hQHc_-72( zm+0AW@4uui=L}4vSI~A*Z4a9@T)|1@kM;JmHO}mAfGu>}`5m3%1@;4}*&0}GYvzNz z?iA8~z6PuJ-No)V-adPq`Gd8?uJ7cr-~R8E9%R2oe{kLjcp>irJIjpB25Fph%o(@+ z3egPFGts)Z@{8)ox{Wc| zc%f&*_v(T%nyl9uxF~GFe}6W0bprgG8|Dmf*TX413G)JY=tK~-%BahF<4X6p{W~1g zbnw1DpVDhhpeFkY+6f52L3qPNuw)F7C{DjMvK!- zXG74C*Owhfq8#87Z|Rm({JjcLB?bwHA}!IT96~*xPFW}qQrFUL$FzcCQDH{#4GOMq zY|@Y5z|c|X8OdmV3Cp!G*&sjCL)^0j__BxDc7Nv%Oq`Qg$h+<3iXL%)Q7$vxFBE^5 zHsdxo4g9*LkVsd*T3iy$Mu)v6VMoGlD#GT39D$*r;0J>fLlgA0C^Da!u2meq;|1@b zb5R+GlfW2h0Q!kyy&3hd`>U-iz>8kb(%#7ORG@M-zfLLqh8~szUA{}x$xCOgV zueAgDuL$~*G7V)%8CDr&=mFc~4*XX(l-M?}KT7R5iF3g=&e{I>Z~VY1-JExq>fyIgVdC&l9?^YQud5%c;4;kW10!U zPzJS>x>%j0{Ymy#5A|Plv7X*Ir8hNyu>S?&FGWVd2Bz?n?COfSg`DGNYk12Ot)+HH z_>|mxXzxUtn@?Fzy>m;Nlcl zI)q+JA+en>U8;-U>^LE}QUPy-MdY_1SG%HqSg6O1G3Y}p>rdsi;%~xJvV}`a^|*?a zQ0-7dsj`>}7oL{E%fjW*E_^-G3fIxecM|f6jo3fwq4eQ9Ql9V*eDMcGvPAUoC*ii{ ztjI~+Ms{!xrw=#MRJk0i()IKXZ#Xyp3GNY(;kbJk{rhxKvYW8gu88X*i>*3tTdTH{ z$-=-nDa-v9o{5QnMJv0>j_fz|pP`fc z#LMQLW&b0)+3=+J0++h-Dd?cP52C|1*I;Zfp3uGFN@2RnWKVE9oX~s(*0uf26%YU6Do8 z;DYr9H_D{%L#Mxj?X73lHw4qMvw1I^&1QF_jJ3tiY=2}OG+pPelT{lijHA!mN$+zjA|C`7h||ok;x}P}9m7NKcPBkqTGYXRFPfE1j~UVGWHPRaZgM)w zAEYC&Me^%KIrEFzhw${91hRI-Y=esXmOhQ%=>?mC?{FsqheQ8(09UG_JdY>r-+r|c zm>v}J$LHZm)XRE`i(N~51(o1AD5LDWwin`0wAgBGzo2WFk858qt9)cwsC}psS$DiNzFx#-Qg{90FRMJ6vSGjt(FoR3q!&?;h(J2 zrfIkET|1z4(S|C!L>FWzKea1^aPNQfK?(MjDe1oD=(J0sY|g`LJ_p)T6c>tG^xlOz z`&0M=i*YY4!xh$mzuOPvzZq$e$(*!x`FGElEn36GZAeWO>B}pCL64_H>B4!uD4apx zDQp*;N`=VHc_@yNGhk{ofTZ9&IQY(RF2~P#7cAM5Q0KlfT15&8&3Oj3s7!AIrFcf^ znF}7m6eE}ar8>-IV?LH?HW#1Sr($`jiriekjoQX%QtgQI*B54K;~iM@&J;eq(bsy; zMyeuPL)rD659WA~$u3ql=XWaId3*isRmN(&l{;OTYnqgMPnB8j?-e}toQQB(#`ja6{2|A0Zh zz}yJ-osulJ&l%#|&N%y1S6r|emcu&XROy6 zYImF(W-)i8AB*nsYx=4E72XW59PV@nr~}!&iCzt+`Qn`H72WSpvi(M77~>Z3{&Uy3 zF|#8olq7GJ+r?ear0}=9io}Du?i{aR^lDU#_Kr4;4vMynzKJHs>&2$~A^#wor}N$< zW{*c;P5r>I42j7k~R%7#f^KWw{Du^4X-4uNmdWYWR z9ZQyKzqK1XPw4Zf8Y#SnKdipE5oNPClXYJKtz8E=wnykFp0Z8e!A{w;Cz3PK)?SDI z?pyFBIIWRIp-G|op)?^sR4B9rbmxn|NsI^SB+{Lw(PY`l_RAoitS%7Spjjl%RZ--HO;o2mTaf*x;NAn;9teUKQi@f zl}ZTRz)9-Uqo-%zahfcn>TDw#h`)%1*;l8*o%I-J_NUZ>lqBI5bkM!%;8(y9DhEcC zmH(>8>Fa{_{LLBrBG3dzXDLqA_24u2c%K^4RbS@RS<5CRJ7-Z*PUOytO zQ>!~0q&8qk)7U3>2DJ!+0cDbBt5uAr`bjmne${#vt(NpzQge5pwbwc6){7O4{~n#= zzebUl*4ZCQBMhSA^rUl7#q&v-0&-HJwo-S}Gqu!WECW|#>zzzT3wre#iiRr=w@wQYXk_3L7 zLI0rdhTpbZPc$=Fm#huOMf%g~)>QjXaFVz?%qeP>!KprnQ5-ExAumkI`gi`5=yeeF z<7|%W`5RorEeTV*hf&X*fYNx6ISEIH?#2gFPEWy0hp*wJ0LAm5&I? z!YVd68(;ujfMM{MT%aHr=oZ|p=0*yN6Y+wXCoSS6-XgsVFV`00%^4<7_KZAVx`ZNa zE&BmQP^cI0B|Ve`yR;ScVIiO31ffExqEgW6=G?aK7>`0HVQNj_ZqLVtIw$oDfPdpi|m$)9M;@0s?Ns*)<^!Ca&ImXa$*8#mk7zcI(Vd*(c4_<;F2FMB2ugF$TBv>-9vylv4g*V_E~w%c z(xOl%++q8|qS=XOO>*drI9jR`u4+|C+~v-Ng?>?gVy4FbtFklFJP7y2re?hV|W+5wvJ6jrh(Sq(yzi!lsF6I6_DBRe zxOe&Cd(U`o*GWab;+@)u%t$j<%!wsIt zC_O**vcItsU!pwx7-LklHk!%WNUp#l+=)7!+*ERYC+>zR*FivsH{S_`pAyBvfjFqGkjIgF!Ppm08^6j@jw^NbmRuK>H z9dL-Q;?HE;E378CfxKYTFx(n!<%LV}mHa%kJ5(VghN^^ORD=OiGk)08Rd_pSW;i9@ zQU!KX3pV4yaD!~el{g=~W+&2}p7<8$e>c1~Pjlk!!BwFw+?eKI5LNMb-p$r+Gk0M} zc5iorUCENVApEGD)fY3ToN_cb;2P1=(YD?kHjg{;a4f}@bpj^Z2lsF1g7#4CN9w!> z2Xqiw1j~e{Y>s~u?gTprjwNhBRj?*ud_qSQXVvHi??^k;Q81a8Ft<%|U(>Dh^6HSE zd)nyb-}3IDaoTP_(IPyb+H~eaKv&KLd`{&gG?^#h{r`=^>^rL2ZZ-l*ypqz?gj_;Z z(18b3kEZNneb}LCsSxi28R__M1X_auRibXBXwAat&nxb=JiKwCbmwhP;^wWv&EJs&-O>U zZ~Y62@py~qP`{sF*E?q44zGmCJBnFzF5O1X;5=SMj6L^#R0b(*reh=Z@yl0loi8|dHhi~n_X2?zDWQp#Hej6W?v?Tqy{g`Lv_pS;if@tVTo1k1BDXT^qh3sk)1o(G z1Eb5l4AI@u1JSQ=j`%FrCUz`ZHG0G^7R?rKpE#af%KoSktB`alzTV&F9w85+ELitQ z_8e2qHfrF1Suz`$=C5f-NOpOq|Hy9jHtfnt=20t+bIlxOB$MY@)4l_nXqDa8U14R# zH#BdLSH7L z#7_rqR1fdQ_4;Y;32N*zY?F79LBAD*3LQP%=&&KdPU~oG^ecOF^rzhQ$+$Ob%|Z*chj(XHc`^#8)M_EGHn*k(U%o6mijYx$yqsjKIU9Wam1NOe>Ii&I2D|g?aU2N z1K)7YOa~{gBOC<@Sp{?JRL~S_lQj5V*dz8=HW=CLsQYVFA%P;rQXnV@kuwQ5tE=XCuAuoSV=65K-xG=}75r3UQLZ<9iO^)PEc> zx!%@Loy+juJSLhHXQJ<^2nn1{1E^VfIr(?dH$Mn`&TDsr$6y01JlB_jB$5y^@kkCG zZ6hkf2HuSpy#AuW)}d4Ce0Y&LIfYN_iFgFHGk!47@tLKyN`WbqaBf<8xT@CKt;l*j z4721bdXQ{(GxHk0R0mNLr*=AeKhs5yc8|EF=pW~~s@+4E+4@a17PBkf!5;8S(4nS! zQKtP$dO9*f3V|WrRE)@G`nYcdk56g7a9)w=EuV$X zjz1sxP%i3h3S&GeI4v-p%+XB3H&PLy0ZByv!DgEbf;oe_UEVWa$3eyD6wE`|?>e~>Ssqo~W7@h|iLFdX>f^nSBap%vGXQF0xq%bO?RMHFa zyqFb7v{PbSdLqmdMA`T1$Nz~R{wItXt$F zoYkx8N7cvTdNw(2_=JYh1CFC#Xvyclm5xq^f!IuSV3jp9ml`E-60F79ui?&mgA9+s zcu#zy^+Rp2LF=Ng(u--U)nhoVpJz&VqrXG9KS5t*j3-&_W23G)+WOIH;NH_z;XuIV z4%!cTn-(t7b-L%A@V7Nim?}bdshhsWS>)_;`$oIs=Udbd;R}+}|H*&gKl9(j{z}={EfGAJZSEq@7Egh8nM}6ty%1YJ(tWU~6`bFE~jWa4yy3 z4y;Pm_>$dfak}7N@Y6|gY26BwG%r0^e`bQU!i>;3&0_D-({AYf9zE=T>87^-fp_$O zC7lJhRCU+IX{1C#M7cAk=X6Y5LO_x3?oI*eZt3n0rKCX+lm>a}5($xz4nYCw4&nP< zzlTS-!i|}8{%6P9Yp>PZ$?uiJKkr|*fV!hxk>6gdHcp4Rw(u~+SQ)#bn`nn?c#3!pW_eX)03Z)2MWW0vtle+2+jZi)^#!bH41DHg4xy$vKLZl@_Ri*#wKo%<|RF?OtHzMyDH_Qw$*+!y( z@;*F@6;zw1C-{G|Y1#}WvX>ycAA9wfjTUqj*yZP)jrL!tkd8(NFDFV_wLl48c@I4$ z*cy!Vi(0#kWvFEfb~PpiiZznD^O$iO703rXdoi=GJ_!{bPb)5E7m5iFa4=gX-R7BG z#O$sQdk1x_&-tnqW-dI+I~#@MfYX`81pGBMN+Ei>j9j5Zu${M%x3jV(&`XfSOgI}I z0YB*idtnKRP#WsjSMWm4tuB{KN^jA+`UVdPLw~0)L)H6VbGKYdN|K9+9q4@7NfKTN zX{BmZB@?Bq!U3@(Tl!b=*m)06=tJQ(Vk7lOGoQIy8p|COh2z2q>6Wr1@)Me=jqm_^ zk2sRY8sYxyPl+~8bkF}Zek!Pqme?}X7gxkSOYUG5iTt1q*CuO|v}X7SJkq{q(`>0S zUEL05)L+|U>|v*9v)j(qQT|Vl|57G*g7eC)>r})IEF)-e3TLn;%=0gBR!b9G>ZFhS zCcoDD5r4;^P?X+F6MbX9X6N3P9*d`O_6zgT5pk>7MjXIgW{Pk~+veYjy@>aYAMj_f z$M6`JtRB`}ySw+9Kf!Hl6*nY*fK}Sh5&bKA9jtOwbZ>M*baixUv{!UtFaT~*8!-MG z@PAqdPlKA#=J4aIM1P3xk3Nf56_&Y)s@&s0kbWxm9f4 zrDbwp#JeZ@B_{H@yKu$(GRPdf@>avT9fB^n<~4ImM&7i_} za8ho8e_Gr;fcs2Nl<=q6uhGVAY7ao8FYHVZPmUg8%UX zx`8m~i2P-*Ko29c{Q-UfbM)r=_hj+D_?+F~-1)|PMou;h7Nd;Q(fknw>xSr8|H{Tl zTdOMQPziXhD^bE6e|X=h9=R)PL!zyY6xpuy_liL}n_hDP;1^N`ttsl-TokKG8Z zjE|i~DCo^WUjwIF;}_#QYdX6d9f<1lov~I;rWSWC^eA9Em4T(zj!v?Y`c^{Cc zh+9J=Lo3<9IuqKD2Hgf`#w*AL9g}8snBNLPed3_ z+Z>-nSYC4!<{M%f5pKeTyuhD(9 z;-{qaW)f9xpOxQzk#Z1z1@o!-nOs$vHiOq%e!UDASK4K#I zl4(C~XH3oBL!0Gm__x1;?$5SQd;9&m-U(O@d)>F*NEjsVysBP3w+fpqhpqJP8ndq* z=QLiksu(-dkKrsCE7?&@RBX~CE<|JQhpMdA$LHPu`M1)6J%Y})Qcz( z6^=Al3JIsgx%kgbX0G%TcW9ZmR@S2Ti)B97-klZTw>e! zJW8S4*)z+*-f!i|0rjwYiu`a=H566(L+@_Bn3GT=q z_qO}e{mP#mD-p}!9#j_@Ti|5Obg$TTowaUf=d$vaP5x)%Qt_zxkGKOq)inB}AL*06 z6Ps!)yqEq5(R#6mL1*-_|1oD8&8$Xlrf8AipnuBx#8kastz7=eK#VOV#{a{Vvk6+O zLt{ta>3kf$>SvEmiFRhHY|=5@;NRCpkD+v=#7?n;J~)v*{xohU{)zXGXN%{H$Kov$ zUh?V0phUq$nZ&1wyYbHP>9N|;kwF1=jN8PA#|y{ipinc)n~pxkk90vFxl6p+j&GHt zx)?>wFAkH;wc4RKp9M9ZPVPpcaXPCEtg=+(%0fRB@OJ0j9G zCPkHb!kgkaxsZx)(+xlu zsRyd1bEGLKJhw!rU^r+ferGJFw6Zw(aKZ1Dr>2o-)M~OJ*xoLND$JKuNej&RObO?S zbp;=!cpOZhbi|~a!uw)(v5xRV=r48&enFdhC-~4J^ypS4^-MBD2jFaW5z0&dGp1R0 z%r*84kFkdRqg(O~eX)-}x^4GU?jGfp!xyf0% zOU(Y79)A-xaZ~XPCixGI$rD!1J@tWG-gB<;Yt9Avat-I1b2q$lh^~Ra(jf_@|R<#}*)zOgcfOg6v z)I~EH71Q@JO5(PYX6BD*9sKh%$TNh;oNHR`bvLNVzzELj_^xK=_NrpN+plKbJQ!X6w9 z&XNBP2sPmjEs^#}tJ${vK<+C2i*MR6^$3}}xp%5&e+t(pSo8eU9EiucUX@`xqIScweyxdSClZ;`5SE z_|4IF6TJ)W7U!9>H8^Z8WI|jh@>(+@DvYAMk$#cBklv$Vm9fWsED(}N2CJERLRKhSnjuQzeh#kTTt!QC^c;Nx;RDf(U@T#qZ0T4jByw{L7%eO+Qz zb5%Nnvw90X3+@@k^wPLD6oOTqq|av;yFp}eElSIF}jdxKr`G)rN=pF|o8&__5N!IfLHoYX6-7qkkOrkAyc6 z#f??53h^`WjhEzKP;h7duHG*7p_rAfd5Ag4T8S_5Tzj6i7)RN$Rx@-ZOE9V4ZuYS6 zfDXNJy20Q09&XSbd#SlaF9WlFux&W&i2b9%hdQ%WCbQ%G#Hs1tc7BFsx`=#G6>hTc zoP~SZmubNuJSGmR&DgPgA;#D=tATFyII5&sQY#pysilizW}y;$6Gh_`P1q8fWlEWFN)ybrnIDELDXkuVp3rl>gF!GQ%&W=`p&`{koL9JmEY_Q|(38pbZ8Tfff}*5U*0YGIJDD7J7Zx*bJQ?0h7d;C! zWeb@6Sn`Do1HooKoD)9Ly-;Q{eaiOkRwBC#zv_7?1x1UYchykZqdb&1i`Q;FP`T#QU`(Se}Q}X+~>*p}s9#Rc&;X9sSBQl0!+z??K-pwk? zN-KrWxYl#QB9;iBD0{Ulkz!^}yeN7*mz3X`V;3bOpXV!E!B-7&5^Iwenvn~Nb2cSj zcTP^DOMdu*sdgrO&U&GRmPbpi&5g`we_$^s{ZXW zm)$5*3~uGWa4j1d2T_gj@!-s1?lFd~Y}|h@y%Z0KIgOmkFmRzJk>HeJ{pZ5eM*F|dtEg z!awFy6s?w`6W0cx$rn~Cr;iojV{zFirgu^ADcRIVN_Hum&>J@KIM`s@I4Sm6aKM()G< zT^Jbv%k*EfJ$i(PUCTo|(A{aDbC#kpRLp1+DW}vI4)Dw;m>fQ0Mi&83sRJf^5N4^u z#2{JQ9y~#tYbxHpFQ}g~dmX{kj>Vot>%`>5yLhJjH43IJSTFWUUx=3WPP2rgI_H8L z__OUJGk)#qY;Yb)alL0g+>}{!Il2O! z&G$6ynyuyUCO9^T(jq71WW!G=HTmO|-2j)zht|*XZhFSaZ1^sxW+=&%QG-h9cbv}R z;n|^yp*A2AwZIfIlikuVK~5$w^dK6(2BD4eE}w#wETU5G0@J-1`L;1}XbuQcH)d{2 z=%ITGS*4Rw4LPfN%qV2$H=4RPywg!VksG|QWTI2-RP>kFoMa>Umq3qnqyxA_zkd)M zzA8+lqwoV&;U1erS41_uG3m#o@k#S>uNjdvh-tyJq>*HU6-h67TJ6YS>ylN_UGCNJ z#|H)dD@-61cdC&|D{3^;x7t4iMcu2B`SM6%Hj#cdQzV&~U6?;-GZ)Apv;}qfnH;y8 zciVtzvLn3Duh&%5Es35f9I@B*1-)@Jt%6U5LyTOTbb(M(lVlc9VvQoya)D!5s=xsT5>-^;SBk>=okT0ii0sW)B5V z7*Ex*mx}&7uE9)Z+EKwpG`o<{R%n4jUt6IguT%?1)yejH!?3qIC#l3wJGGR%bP7|M ze6$s6@OoSF-X8G!D)ZBZlbgyjK~Shn-h|q5N*l2Uw>UIX91=OAy;C!yfY1}A&(t`; zOpMHre9q~wVmyW0lheFqY&CP*k5EP{i8J{$_ETy*i|sW|G4B8;%YmVO&MVG-Ste8m zJ`S#-QuCv~f{pm4z85?O&)jEM!*`>plixM$Y}RY5h&SDO7daAXq8~=Gh z(HLc1WSjUV9y-;`-c)|M&E0Ig+H8I{*Z+!aij;}u(L?$+qCstXhqPeEJIyK9Yh97L zQhU9mTU&!uL@J)RT};R8QT3e(dF*&D7w+QtD+{%R@nBwsgs)Ly?M<({7>|d8a&IjM z=Y6hJ9)*%-Y*}U@7mN{a7_Fq4Vqvk6*jentTp^8|TG)h&U|YK1`P}O(?Bx4GOR1#1 zOBDEMkZ_t_V-FqMKh&Nbgc@QkB_FT7w!TK6Y3fdUtC86R|J~F6NAdE}8%%*$JB@Lw zI^pfNJG#Faog?)lF?xb8BDo?ZBF)%4?t-h?QSG|6RqLz_l~T(~VX_KvmbS_1)P`Cf zy&-;v+t_y9>Wp@$J9+K1b`f-C>Z0*B20f@U-Zkg4@umM;tU*whTG2*(=!IGrU9Q2> z15_VR;HjD$M~~cMJD63w#j{4X*ooMm(S2T4?|^>_wbLc`k6z{2)_CoNn!MT1XLV#A zIttg5RO}JwkCk?R$KmtWXdckl^8PhAD3V_*D2|@Y&gj-yyI7BCo2V5n8oL=C<6pG@ z1;5{6_>r61S-nieP==@ z57aAK6{EHBJxtQK%#4Stg|sF58#YW1;VCv5C5m(UEGG18^((lZw#B_}fZkr+fGc@~ zEyXM0<-$&?%5^+Rzrf@8iD$_||KJ>0sYR^14ifx~yY_3?5FKs3nHx?>WK=dE0SM;`#*UHb4S%oz-RSdneVmbfih?i^e~mN`Y4JMAYcq(jAU zFRB#fohztc_eUG@rSiM92@lBD;ys}VnsC3dX|_f>!`@T%@K>P*FonLRFRlkll7;wL zk{Rg7E5P(SxdWH#-K?iAL3lju*p&g|zZ4Wm04te7rAp z%ew704GzVQ$EzhTg;7@{f1SjV#I3}@XqISwtF$^=%o27($8hud0*3h^VqqVYoU04% zMM#2DLs0!ZpiW}8vVhH}cTAjy`5lA9!EHCDrvsN6 ziNo|Q_%<^=OVRbtfD z)5&nzdGATg(6_-Dx<>rJ5c-4IaEQ5ZPU7ylkOqQ~4s4=7ePAtIu-Z$*)wISh;tf=4 zN8!XGiLG#{=t7;D!fyV7^H>QSYL@y~o&kDM95!lW_N+$b(@E-3a?FHv94qu&Y0YYVAE zMw1&-kgJ;fzeK)v$kWA{iOv+aDHgt@owbMBm&_#A>dSFA>_HxQgsxA0>o;?O;j&Zn zIokx~oI1`}caJxYO{5uiE6)BM@SuE5kDo9XUWGF57{6`w9sKvlKJFi$7o-m!flt2Y zj&~Y3zd0{qN8f?b{Mcz@R#8tVCDa43C+8Y>^={P8Q}AE5nX!(7DVQDwg%4quQvDiJ z^bvYCqcl}n3H)GM8XuxV^U!$1uk>I=i>+72BJplW0u5RYW8*Bi?A_2xI@gV%G~pHC zMW}+aar^UwX(3S+&V&bv4dq|aWAw$%(k|+rvF!S75jTjh$Q9!wmU3A9 zSDYdC!{=FwvcS>&Ym&dlPbKOtG&T_fGpb#+YXu&8#qIaZ?}MXWdF7_u zKzXCIRX&s7SMO_mA{S5{_y}F`DN1UsqFzrsfjaTS@LSY<^Ad?$(1YJ&g0>CM`I5K> zRCT8r7rl%7cxus{1rbOmJOy3IfPTnkR0m2E17gxqt)FoL&+Piv zMr|>(Zxdbd^UQ;`iffdyilxsHGBRcILG^NQm*-Op{X%3a0%zcBI0Lmo23Nq?=px<{ z@`=;L*5t(2Qf4h9Z0UU{v^Lj%V1hqbmDJK|PbIZdLbQ$Mo(xyc&fJ zWGX$(FZBn?Wv!YnM@DOVb39PNH9^0n=egV1A{dW;MJiwSFL}$|{N7SL!cx1Ptg<|%59}AtA9MvdnYozm zVtA-CoL|@{SdaSoa5x~N@SU#9l&OyM3>Dc&ct{CaS$xgfOVh;yVnNjXo1$H# z7C{qd2qTqx>K|4rEl@71Yt*0Z9YM3$=kZaAL&;Z?H^)mvcf>BopT}+`_W6b2F?3S< zhrv6e&?WOkj3kwj}b4S|J+U*D6ir<@WhXCw@aB4x1dk#PFGNlUU4}m?sM2sKM+gH zkR|HFFD(wk;x{m%6#uZg%!G?Efvri+e-(wFznKG-AOkMq3g9qIcQk>>+ljyX6HT`x z;PFetYlMHr$#PTWlGvABw!cM7Dhqq@vCyAsRb!k0>Ipgd2`7cGv}&*(Gx0uJ2;0G+ z&j@j$0iD$}CNdA1El)tt@3nB9&&O{UUxTA!SE;qoI=ogM=cGrU@u1%#7y!HDu0Dr* zkwXX~v%HqU*UsnCWpdI0s-L~gCmM1t8-N;>q(5lDyJ`p5`5l-_Nf46}aBU_jziF~Q zK>sdM3nWI=>*#l=#GbQx88aHg-AQeygLhVv4X5H>F7F{Mja4oae|w}q74^!_-uF&X z&knZJqQ4)E^?!8Ecn{cQO7hA(7uk1QkBaVEwhcn;kS=ttnQipR+9&E^Wuo>b(pz6j zwi#gL!}YSN`Kg(oed6EDbl{?kVGj!CBEvDy8wJ=neXDOqi|n15$x3GqH0GFltfqDr zbFUDlPb(i@$G&mEHpMY^A*V7wNKId$QK`7X@67RTFe&aKNN5zLA-+^#pZcJ9pFZI# z8@efue(B`*FX zo}j!q3k>2o=+hW-cnNypdgS^!((%YRrrafsiEz9}I;+{|nqw6WezZ%$aL9xA*c!8r zy$PMT&VFyB8G1zNs620Id)Ys}jl-oCsS$Y}ouyXriROvL#5^EZ!(_)C&K!Plq`zK- zJWvA$NzO=%e$4l?*-tVZ6k{8bChFZd$4BusVtxzpHOy~QEPPVCFumfF>8ZfJ{08U|NqCn$D!Qdb1F15>AKHF#`^k1a*LR5b_X+~^Q_yB@Aixrjm`&~^SsafL%}5`Et`WbL1+I9Zzf(MJskt*por6j zc|iwv9XX&WT|rv-SQ}s>XLj$PPxL*LjtuB2&PKs{hx5dKhTp|=tCo6R$|@I@Rv@H|o!2%KP$2rK?>%r~u<&dVG8GcgfM@TJdS|4vG1} z67ty#_o;hJD<+!Z6o-PpllF#w4L9MAG!$O)e18;LOJ8sVFUvVe1C!c=4(;Tufd+&R zYUNR1S&U;+_7sl>?`N+*9L$nVdSkF)pr=t7R@6Q;4LXR6s02O`vVju`oXA?BEhUJU zYdEJnxl01)SLeO{OkF>bO79zTLn$V|g*I>x8r1k z;{5CRP%dKaLNMe3VgX!rZ;8{`l&%K{aRt5B5a}E7IbZpKa9GF*8nIoRB7Li_l6P_U zw+c_iBVsL~18DS8I+TgLim4#f&-rQ7siFko9IsM7?AnhizWJwccF zME8a=9)zpDwA=YJXczl6T8bz+kMs65?=LUeZ9SPhHRrP$nJof3b{np92eN1>`khwc z3*s?la%2n>G8tWty2e#wr&S)V&PV2DoRJT}qwa}|^(XE^GQnY|9qj(hC{e71wKWtC zy4Kz~NA>f;7u|<4U3sqyr|URumz?ld-q?RyqhLo5VM}Z`%;za~IqN2M)H=P8mRa4a z#r49*Z8HPkaWfT9TPvIOp4FWF`rPagWVZ@fmvG=LZtRIHM3c`oj#K+iMT^77HRPau z!0K$2k?t@n#$$-SAOVwmTj+h}>$ky-eh%#jwdTnxCETI^`ics8ka#)#G0*t#MDQ9y zHo@RNlo#Ivho3F}j>5zwX8jdVHLqYaQWh(_=-2)VPY?$f-Hd8xYbC4lv+|q#So#p{ z^-)~gFPK2gB}%mh#hV3(xCbX>63_NjGWHT_T;!thgIUcQ_P5&u$df8bSheJ^B0cKGJeqx7zh1+ z&YzJR(j$=H9=LvgAnoKisEmhUXiDQ^qmA&Rs+tLr%zs0&FS4y6exTlYi73m^T`+uD34`FDfC=zet1kdHnmgMOe z!qphZf9;vscH#N@j7YMUtnoV&x*_3e;w&@amx}!wV_N~2i^I%PKZQB{w^5e5CmX%+ z5A<2>$+9!3-RAIpchOPg5o*azblVwVJb>%A44I5w z&f{UY88tw8@9iMT1#=A z#!ykD;7XZ=Q~G}LejDqZGYbUh3Ygy^YqQGj z+nE}<78PeFBGwb}p4>!!2PdYknnhDJL;Fcx$495+2HF(or)WpKGu}kAC)Z7^k2jCs zi~SLl)IU?IDTn2C(hhNrP&WJ&597m0$CJ8-))1)|g?8Xzc95=MUDC>=lk^4?lWOw& z1tLHLP~j>1DEpT8jeo^03^?y&HxL8p5l9+Of4rDJ^eG$xub-cO(oT;*4SzYNpCXk(43v=O#SBl)` z+|5OoaF?IPD`72{OEYQcCC&4{U=QqRa*VA~6Q0x* zM%0`Crr*WL^NO$rG-|szQ|h49S7yp_ttL#zW9rpNYqVdkn>(#N_62H+^loOSyqyUK zUy}K$RSIXN{;0h+a!dJ>{n98@uJY!fPrQw(UUhRTx>>)Ym*N;_P<}6Geq>*S@4nX@ zhT^Yjexff?b!~s7sQy&%1j{tZK4`6nyB$K$?E|x|(a~gs#vIQSxu9MIZMtSgKl7T^ z(Mk=oZj!kR#`kW$16n+nnHP)<^@r_y2aeRskj0aAjV@s=%2}7fv+!q|1%~j2Fq9{3 z2nwSmghud7%L&c!J3auuvtGO^9tw97wlFE!14{IVFvgexF7vxuM*2ipF7}RGg3Y}^ zzA9%@^C|u0DN;WHhg@b%y@jj%tV~Sn2a#jhWfgv6Ut?PMxR76wP|C3Escs9lFm9r3 zeU0l=KNuF99{T}TF(Y0ow%^a{O!qs*s+oT>Ii4QbOyp0cFNutX4S!54$>!N5{25-U zci8)kiif32Qe$zOctlCakBpD3Vs=lS_p;`3bBB9ddn`Rtel_RYtKFR_bN2A=<0QSu zZ{eiEKcOw0!!g!SeW2D^eJzHA57Xg(hfPTStA`EhZP0W`hP#rGGz3byP~I zOg|z6J7A{^u?mkQ_iC}N)6?E#V}Tzs_}&}DUugYyxvsaU&~Xa*Wxwl zZ`gaeP^Voh?BIzkDFk3jgYh$ZA*MJSomO=9vGR+OQ@I5X>qn`$i6$YMj9pM!4WYMj z3KVpbd)Eos)ub=UgrzwZ^T~hx$OG5e(oGAiy9kxz67pLGVuecQ{svA?6+Wjq*={z! zH-wovg6sK=%BDC`>H{M^3e`oZi;kHOO(rvTM(%zUFKsZ>YwnD8marr6)H&;QrZ?yv z)I$BWji2PEHD@`?gOB~mUK8A>$FQyZKX)gQak=w9_RlK1#l1MS+r#J&L9ZZ_w}(k` zJ*Pc-!)MjqR0xxV51G(*5T6MLg$1}BQkX$+qIxycoJ$z zw5q}TDh7`xKll18@>|MATFTbz#BgePnX*L5qSgg#YX~zgrWMyd=5!ZSr|NZi0=~d; z^H^{zmM#7&b|!Y&FXuFovWi`q6{n)QNC@e|8*nY#NBrNxeK|qDQvzn|DzlFw~UMCif!uTEc4laqQt8WKd^URuvcvTotZ+a+>`SyWZ+Bb4$b zElC@zy}`5O3+-?uePo{gSjkIlx}&gxurQB_U9I> zC(09jm=xSXape+@;7N8)V`pT&@dSM5sovjaj%=l}?pqD)s4-e@sbx_rt0mQ%+J0@h zn&26#V(c|l_o?xn;2^!yAo^S?{FpuldbM3++2epn{0Y0-DEcB z=-DH`N0#d6*)Vw)Sqp-ZPdNv^nggHCPqlNf8rPaF?V?UEa`HZMbrrpxQc}BMJ+=3+ z>+v00fj{EzxD$n$O4iZHn@D+jyQ#W>$J#FItoNmPTnjOAX{x7(Emno8Mlo`If_;x+ zc1aZ9RVS6556zYx?hoFkU=`}g|2l;ezTOw-inU5jb+$T+{fOpfV>PWZ4Ta<4LQ9^e zF0gZ!5i5G~(MqbpPpA(oQ3E$6uAL=jRA;s*{`ZWuBXbU<=iVFMCcZF=xtsh!sMP=C zt;g43g1gywy`zeXui$y=%=|(-PH!#hqa-?xANbDKU;_P*tb0{xAkG)JL{733ozGvw zuF5{twpD#N%JiF=8H@PRWff#$0X_Ot_!Ps%XVPT(r7SDID&6(2MirfjJ=+_0B%~MC z{+1+AgMQ@6LU63|!=0HYUy;5bB9#T(*e1R&S5VF?^VA9IkIE>;m3xVmnO~+gJG)UF zp1<`kqtJbXy~`ZvK>rP^@21?Anz9wo+Xk*maWY{Q@SrB(&&NVJxF$O1?MrxqDcf1i z$X30%R=JqteMYv3QlmEIB(J1uON8^mkw{~eFq4e>?A45E@*SF8JY!WGII)?TG##d%c>~%I=I>K{O4D%1 z>TtT3{dY~~!5E1Nv$@-ah_U@R>&3z2i}3NL@E*CanFj6fdrn4NUJ{9U(SN;fqg`VU zq6z;I9PAN(GiI*c0y&=5>u)xTTvy7-)1{GAGOxp%@v$j}|4webuW9Q2wa@iG_5ONB z{d={YG>ct^{+ytF{Or{7RcDZ2Cpha@@y5d|9~QY3z5|0do0TW=Su_-z>Mt-aiMP3$ z$GD#N=vltw?wNEsL&zt2;TYWygYC{A$W(R`o~=)J9&iVUk8%Bn0qy z8VGYhT;HQRtb1sc?{Hk54k#JMlzdx{1e^$TR02jnaq8_zDWcOqzG|; zCYy6PsSPXOlfK?!Yg#|!RpJrL^0;ch~@$j|mhrv=QA ziFku`aGKiHaaZV#&P`kA0E_U~oT2u`$P}vfK9ME}0*D22A zVGZ686{4+^S0~PRqMOx8g%bKR=cqRkW>Y73tJ~UpL@!a!b6~xmb82adP?}s;j;GHe zn%rZX^Gzrlk>Vt(r3s>>O$A*METb#+>hn+@dWdsy=T}g+RuUwX=Scm+IXwT<~E=ficUOGXC5)sQ-A4kvolcUQL zC%s*AzfgTCtX88l4hw&R7)7Z*T7{Q}%JRC?kPrR{nPj#UPfUf)gAeJlUctU8O2!-b z-&6rbN6}*Qs3}|h2kghxjGsC=*czCC9{O?nq<&Ic<}~)E;nmj$W^-xpXE&QS(EZq` zA-+*Mur|1o)_%-#V zbFWH9wRHy_>T$Sh#Jr*S{8nQ|_pzVFe-1iq(r^C*Qg%ljEEnLq*6_L+b2NeaadEh= zuwVR8NmdTg+kGKi6t|&S@twMn`BjwwwMDPFzbd$fo9)(U?O3m9i{N7LU3508Tw9GY zk!z95&d~Ub0xb%(jeQPwKGyr6kzF0G)pkcZ<;VeByw&br`#bv+E8@+Hrm=6r!tWh5 zL@v%x;AptNXuSw@z|)?_1KA^n_r&2;#%=g!6yX|B_9d4n5pzx>OM6cO4%dKsn&v^ ze_~QFD!#kO@xn8`k!nkMsdSxZb|Ukr31kA3m|a`AMxVV1Y_lQHhXiujf=;wB5&au# z%Su#}4XB*%g<^E&Rlul<;HCH)w)Aco?QO+@Fzr$>^>4Ww8^S$c>#jn8JQ`C~CN+uLzt82cEvz0P1n-RTUf;`;oUP1h=(q>bQR)Fm#C0cUuP zqQ63BEDXZc2lT8w(SIyBW_Myrl-jW^byt4)iKjwo=^XlSHNWNxE$98?DXBj&s_XkA zCnMAK>c&!b-+t3;;=8tmz38mQ6=M*yw}Gf4&1XA04)5+PuFrGzVa5(z&FXuXV^;n{ z`Jchw-yI+3{R0lv7B!;2?lchk4av)r{e&7l?Y%+|JsteE^UkL@+#H9a+6dRos_e37 z^5%lz>~u5hhyT-P=to>A11h=$t>e_>v_j!SXtb4~=X;M%NB*yqsm#;5ox4Aqd%vEU zL1nR|vQI6eo)W*utv0*7Tju$sQ_m?V${_2@SkC0EiCgj1v3o(QXw?E8l1+Q6^iTK| z9>yn$^h=loYy%ToN6g=k-o$2d!!nd7){_Sgqer)szZ=hF`DI8J-xr@SagQ5OCk#_% zoc%p|9naXDv#`#WCndHkobAN^e5#IIuC#M`iW`7o%+W)J?j(M|C*wyvjv)v{1N zVQ%!hi!M5817Nvr@d_pO_|IW{g}im{DmIF4J3m^()Lg=Jy75%PX=w-kx%-2ie%Hj4 z#1u6%I|$8$w91F@l@I$%qVdEnw+kBF9~mpXcBqsbkap57D`fSN;hs!2QZ$}ZypmgT z?n;Gs(j`;?7fQ=KD?R;Pietli>Y1G(Sz2R?&LBHxuSVhIseJ|gsFQZgX^uzq^hkHT zq1(*6frjP{kkj~scW`sCyKr4At*^3bnYV&Y z{?f<>`Hs>+-JuRtPmwXQX?KjfD4!;r_v~p_HR}VXpS6Ya^OBR5hil#t)#Xv*LMr;S z!e#3J7v%6G;pxIccJL~SpNfZt*5rqmAOp#`S(LEA0h|p&U*U^gVTQ>8$oBy&?_y_m@L%FZgT+A!3l&VTS#c{Z;-B;F|rR|?k4!+`E zg-zPpE#cRU=80`Z@$*77bNrL|Xg?n+!q1$tmT1lPcE(Bt$LJiq*w!GsJxhBVDe2t9 z6}qx_-?N;FxU)}ko<$|6puYi6weO=jW0RwUf)jqhXzBRS0{ipti{^G;Fy&8$GTTu1 zmbqU&rH9>~L3z5l^mc;X{8Qk3RqWT1Ld>$}M4Ib+^^WFTcZdIN&?@*R=1KU{>_;hu1HVGUn-kln~ugqQsXHRewN`pHbBf)`s}~*QH_(nsOPCC` zls>^LE1xn#?Sek9trU^toR&VyV;dwaZpy_oO& zt^IG{LFLCC;)U4tgn%&mx^xw$5bL#a@#(dlVd5nIMl zhbeRogQ!Z|P^Y~IQ}cBwU3is|+U$tW_tS`uLicDRq`!*X)f0vXF1tg2q|ZUSr4hTA z=|GWw(~Id(B5gr7N9fGu;u#Vb6X}`p?+bE7|HgENhqwlfrHUclA zf6!st$EHDT5Tu1}GLzOTc+l5(i^0M<36}yJ)BZhZgH)v{+_oj zakSv1{Eeg6J_P$p$5Zd#&eTs3dWM z*K!TI@O39bUlK?7e!- zWOI1woZE7W?!nA(U#XUp*1sH_56;tdJcLW#NT?*uxBB>H;b}jK+VRe2op32>r;{9f z$Q^I1m8RY(Nv%Z+`t^EbhotaGHYW1%ZUf#|P0+6F{L3inxf=8zPfQ%e ztv9$&-n8CYDe6c6voG77odb46+ifgy(|T{%Mjnb5!Xp0b!7l8tMl-Rh+En>M?Whlr zi0a13=HwPd7DZyl45O>wB$8EmYtGgFL~E)8n@4@srRrSOR9~oPjizWOPr?J)jX$QnXMcdBlF#Jy2ks$=+A!^&giD$swt^m_huRy{~q#K3)oG z#mlgL&cPH2j4m; zjZlj!zl$@>Zf@U5L!*Lm+05n4bDyERw}&mRB0&?7!q(IUtMGK}7(E*-3`GBdoz+~9 zmfbEihkkPU`W55Jv4-A9k-A1t+r>@m2nu3P*{&#SZO57Qp|#iP=lA3XGOJ2|{3@x%G+71)rN6O4?{@SAESl%Z~Q?Tj$ZC~f$55w*DfA^T_j z^k3!LXknieIt)o4nb2(cl$_9rXQexla4x7v8JHU1QODF_cjqYg zbTs^n9Ku#M0YAhcdJG6qE2anwIfHYEDAzgB69o(I*JxoHk#emtOueFHlz&$0YZJ^o z_9E*PoOsEq?tL5k#eeIxCD(1USHQy^9~qZ&rnIlMb4q#TYsFV?$z9d8@Ro( z7|E%Z!U5)QBL;>Lm^0KKk}db-DSRQy(hqVmrKNIA?k?{Et*tIUms=>gl-JUiQbVOO zQ=;~$)fP~?DLrM|e&uENEBPD!i+)wm+IH;u+(E7PfY(n`h=Vu5HcP_U%R%(7LWT7* zRFdqFqF?%Fs4CNwS9GMG5j&PJSysVq3lU*Ug0ej3@7r*-)`!xE?;35)hoJYTBNmEl zG4nfpzJ5<%#&+g%BNZxLsg0dRZgjkM!?Md|)YnCQqFz_OqUUuZ!B75z=-^;TVoB_l zZx?6*di4N(!328YMbLt~7yKL4^>27%s6$pbHJChXce;=Trr@8p-u(eq%4nYF&F)?L z1I?-=-TV)c{hZj}n7cU+JYf=9U_AA46f|rpc*P`g!5HpTad486M4KjbJ1GcRcb<$W z*`f_O;~V~OBN*bl@E<~0ofuhQo{Bp0&w``=LvNCoGcLr2`DvVW>i6Wy^GUOCsY&Sr zCb3cW9lgMUq;L7ZMf3x+lE$G(v?6IL(}NR9>xi1!!GSZ93$8>$c4zN~-_~pIuJayw zm;C+o;obcz_9=I0VtFvzsqH>O87sS8n`uH{HnuB9e&?OkBKmJ23rr<BuF!$|dC=I`NCGTC67FZsh#P@M6y@?NKCh}_|`;}#)ZBRw4ZDxZ@w*%MO z+iqU4@Pb}te6-)UKaornm#b)PBcDh5YgddUx0RO~1v7vT7b59 zDsvrv>^YdvH%Fzlqm_sKzhi#(pq~2@?^_RLnk%rDikMX*6O?b6*WXvFnkDQb?%<%D zx7ki*MU9R64X>Gf$eJ7(AlFb<%1=NiHJBc=jdV^qTuNuMVO}NpU*b{n=gB*xh49zf z@91hKJH7F>m`f}txsmQh2|IAVHGk3HQ%tEXIrjqfeFmX9Q};~ZH#5KmDp6yMBu*3{ zyRIe*oDX??+<+Y3fjY4~xZH)%be^co^a*+3OWX~)RFbyvITN$r=(_8Z|2Lr1(v}&| zY$gVK_?qn^?(=qFOwwDKSDBjZvS-4Uf9pKwuKb0r-IU;rJ4Zh&=g}HP;#yy}zLrHg z=!@|WeXCAZ9?SdG2igKNz5c1%M;mK)H8w_);j=VQ1#N(u5zmZ|5c@44s5TN zbb(CJS89N3>H_u-9MP0|D<{;#YD0ErFUsSXo4>YppwK7=KeE?)Hi%MXw*w~%=-6&+ zMd*JLM9qTKi(c;E$iM5v@@ zXsHknh$lor4Y!88dDH3H4m)gz=OMxl&ko0IhaH~BOgr=5%)E80oA2lBOsQVLp>X{F z=YP&Vd#}CrTEF#MYoGt$|NDP?*I(bYYuCT9Yu68cwCe}GI??YBzI**?uYdU6>wmG= zKl<*q^M3QMy#AMd@Z+hKosR#FzjFMyzkB`L9sifVJLi0_|JA>8&OiJsumAb~<+pbI zsLy}c4gTkU{9C(zv)BJhulN7nk9Pf}*Z*;^5B}Z{cl~R<{@;4--#7pI|M%~;zp-oA z&pYp@e{l?fO6d%U!$v*Z*nPuK)2*cJ2D_&+Xdv-#yy3>mU5nKlq#f%!|MC zcmMGZzW&=E?fjj;J2m?M^WVSu_x|3?AO7yY@jHL=&;ExeAN&XZ;CH@1^#_ym{@Six zKTdvrroTVj^}`<@{5|9U!Cyc4dw*@$Z}0le#QlR^|NGzC^;`b_*Z=6p)8BvVZ~Yhl z(LemjzyI(4iDz%zdN(s=eIiJ%FN3? zJzJZ1`@30N*JrNH+^*#dU9-~BrJ0RdS(v#x^K`oJ(#-3bt(k{2m-<=hue;38+^?P0 znKv^pX4bmyQf;sF`(|dRJ3XKI#mw8T+OFN(wfMT9d-d^opFgiZFK2!=^X1Hkjy&y? z+cRIyeB0~gKG~UhQd`&S!Ah+@t(8ah@os&8+9x-=!^3*}WE!D&S7y%ld$}L-S?lkm zK08(au5{Hxe{XlyqyE3r+2piTkKc6UZO2v`*WFsUQ4j9aLlRo6*Dq@8eto&w-{sD^ zpDfOI{^LnT?sK=Z?)P`4v#!)Gsk`@LeZM+$u}@cfz1UUP>-nqRFL&>i+PL0d^Ledz zmuF@h`T1Hh;?sS4slHt4-B$fsucftqZr11X{oLui&Ca-6FR%8$)^2s@jpVtJT;4UN zm;HTMKev1Ryz_Uu{!wy$-;t*?e_2mnOmlI+|9||^M)!Euwac};-QTTb_q5lKJHA>w zPiy~7*KE~?mHKs|9$)XSoAu^&?=DTVbE~sf>f@Epy4}%h{k=Ag@M;nmBO>Yh$;BBP z^?kKh@4K4L+)5&E`nfZ;KqH@a-L3latX66HV&}QyUOiptfAYB5$kzM0(QIF=1sZ&* zqj!3>o`$S6r}sLCl$L7Y)XZG%uhy@lwQ{XjTDjY`D_y1c7rTC8lK0K}=&G%xbicFB z*3Is8sZX~i{rNgs(yAv(=i4Oxbuzm$^BW(n_V=6G{?SJ-8^wo4@L}ec9XsD$UN$H1 zlIrKZr|VC9b$@DQxhrVX#YyH?4B1|-{e{M}+THK=yHG#K*($v@_2y{*(i@m;8U+&cgsXgz$SNq?{Y0PHwSg+mXdi%V-KB%3$jmipR z%`SGHo?6q+{qJ7~@ljnN>yq@dPLSr>DmPZS>k{GLdr>oYREw=89UT@W_r(N}^ zUcYHfZ(GT)`}|qwZukCI&4Io=?97MV^IEOC!}+|<_5RxCYuqY#m-X(v-K*=}_j-B2KU-$PxBV6s+hdyETpH4Go{V#U>Wk39`wKqGnuio;7XX^8vTDD%# z)|)Gnj^FCcwXWg^mb%uQU2Uv)W{%g}6J2?wYZmIogL=**uqjv4fW^s*s^6JKE2+nFICnc6a1u&-9u<-bz0F-J{xHPU1Y^<9^;G zO>%hCdlCFYU`U$ok`Q^-krwHx-4}3a`(U0>qkkChoG7Fy7pP;yYGYA;zM912<3D~Pj%#H z{axs0VIs!$||Sk^c*GWv~v;GrkU<9_mf)m1NQY0Spu>2oLwZW}(7 z6z{kCF4Vi*9k(7~3|G;+&E8pYP})}S7CQ6sq(5u*^Q+G0V@Ti1avnb=>VSl3+h%`R zS&;_63JJgHDC_y8-|N$?Ug+NDiw}i$VX3?6?(zD0WoqShXI}5_Ec?|YvzP?U^VO`^ z<=#Pq^No3<*Zk(CuI5kY`&n<4@RRuzk6fQ*K))2s3VH)AfI&_UQiO&U!i>dDHk_G`^#qV-8MDEj*~r#i`#r-3uD#b=T_^oNfKx zoQ{g{?sUeD?&bgOBnu0QByM#kBm-xBUXPY*{eIWMOK|j?dhx2!ILdmgbq}ceLh?RS zKX_#8P;|1DoaXA$>14aqHR1&pipKJXY#<~uF!_Z(6>VIq6+Ua=tVdmUw5!~M-B|1D z>-kk$dZzPE^uvSkA*Va*>NI|Mg?B$*4>#-2cH@51vDJK|x!>u?%f?{^>?Gx_{(qT{ zt@ig#bMUs&`?=ZZ*q!@bzm~+UU@@=x;2l}bl|CJEy4~HLcm8_!fVo%!GUwOL+%Nk7 zddFD0_nl{*LdJLcYd+y)@$Jh#<*~HOZoTZjq7>M4tvO~rp-dhg@?<5%uIn9#Tv?cl zNoOg&JlbnfFY8DDMFx7o23}2e*J|b3B({hA!TA^paqzuH!LNvAA-|2rBjR|FoZmI#XUW7&Zzc7O$%l%zzU(+Z z0WFJLc>|yGmwd*fjGi$FO18X<^|06{wBUKt6NSKlWV=;Q$aJ;Y{-Qhc z)UUeIEQyA$bk>V{^0>43MUoYB!57<|3wd6s#mD`eDu$K1WP_?G&q)r( zJ8`2H`SpPVp$Q{>*^%K(#G|alTw}eO>}Z?y!Rlh3PSyeoW7ITZtKRbyP_A?IQt!;& zz`EAZQku3rwI&MZ(anPx^!_xnEDav!en)6K%XPJL{-nFp!lT&;@dN4WAqigV%CmiT zsjJqz=5puk?fkXr6NrE&&Q9l?n>7Diy}s7CP9@*vuF&6&{<2h8vMvw1E3EmVw%}cn z?smHRuCuN;D*V99&V3(3{JJr-GGzUEf5kG7yXsvn{Id5ey|&K9jpBu&Ve83{XQVOb zy64sIIienC(0lf0=q|*_LW-E7F6(7A`9Rflg@xEo?_c&8BZYx`QJehvPWRybozJp9 z>?-rVI_dLjV>YJ`ChZ*B3>{$ate{8T7p670<4Qj9WI9cM`I@u6UhJ>AJliq;lucuk zL`-7V`6R&Vimj|jR{wnGi1Ar+qqiDP_xEDwIfGV_4TcY|1BX3MzO2MrTJtPjf7MDC zHDLq(N#lRkJM7rE{eF{lU)1($ugH>Z(yyx>_rK^5dgATj1rd#PzR?x>2b)5>P}Q+| zA<|mPf^Bw0lwg%S$jW`)9cjpBKco)nus-51*zRO^INxVh_*#;nlkUuhz;$fS)#P-& zPxv2w8{8~>0|~ObBeFPMPp|}w>9Upks@4~3ZGN&6ERdG42>0sojXv>ncbcQYDCiM< zf3KsgzPJ`A!P<)6S8M-FEr?jy0_@R?TC&n!H(MVXAFcn*xRzhVVTi>)?~~_A{>LAA zwbJLSNocw8u~gdSWnjsTMhl%m#cYCT7RN;|@Aj7`hJFVpW;7&e73d8<{4Z-6u6)tE zr}YnqORxAkXD#%1skVmA5Hl|Hn$03x_#ApN@8%Is!LvQDmuw%O{-mRD3+6_YsW&VL zYlcZY*O`avuSi-PhfC%!U=^$CSwCV7QSCtgye5lyzW;Gg{GUh2GkBX0@u(N4 z{+#U-nF|uT&=0MD)>-d*1)=a1JnHpi2cPK+-ese4vnf2Ixx6xlUg=j#dE z^Ke2b&??s)dEaIyWT&9lH?^uoOfiXK z8Oi)bEvjsTb)(N$k_!ZVwxc`|-C$F3a-tJ9fu$08 zzHOGE6j9q|6^^O$otU3 zi}e)NarSmn!>F-xUre^>etmjee=xa={XZ~-ydRBWJ>C0K{bV`#ch=}uV}*Pcx{7sx zVdyu1gFR=p#pxnj+?NO*LWDHtlHhWmVX5Gq7Jm5VhMxekPCovk#lvNQT~sw;7IbA8TIu66`|kuepC;gQ}X4_FunY%a`~*zoNn zdko@c5^-m7zLm;yvfy+UlEy{hte}1C))5gf-#C~(3_1TL|H&pn91stUzyq6Eh#ID2 zq1LDVe%=w0rYHxOD^7BEtO=VkKaG}e=jGT`C_;~9kLahEP|U=x8MnK$2B$m9(_7sq zn!#g}w0_q0tUbJWruIdrH#%1qlwW4gun)-#sfoa!~J#-3j8 z-Fz*uqgDk3#9QC$lVLk}-K9nXzs>iV?8VSCY!E&SGlpByGAun1A|Hln6o>OW>>xSt zxMvy>@2Waut@Fl=j=Y{$_2hbO!IgL>{?qy*MYdia)ef+HIO#8w*4CtlP~o}S=M(wI zkr5T&z}05rU9WLTVjNz^dV$q=a(5MR;#EZHkPoC{6@4*j4aXx|%i=LBj=o;% z6A_1%gCRT9-&3sy3_FRkUM!JF!;hSpD^I5pS2_#3veFT#P<$kUfOy1(R*o^dqc~os z2gW8X7Tg-Y-?|(8$~Vc*=c1COKijo=*Xna8=VVjVUW!g zje>!UOJ8U&oMFB4q~>I?Ge%w-&*JAupO^tHSl!r{x4qx&I_rBNAr^prVdLCE6hC4^ z8I8e7kvSiWr#R8sXPXs~pBPN+X4YWR5r@O3{0Eyc&=+=+KN^yKQmbYcC*^8Uo#;}1 z2hVx_yZ(~4-VdhKy&x7ya8wlBZyZl1n7heH(O7(DreYxy~J*?=w})wjDK?Kx$CS5i~!$E=GKLb9&7_W znrpV29T<1V-)UQEvWVt1r5sxf$2*^LXW3cl^`grKdZAuo~| zz7Up#Em$M-hpXa4L;_Xqat%coH)A%)iw3Jq}9K5!S2BZm@xSxAj-PgJ^yu7d9 zGu@m13j%>8{LV0HTZ8z0G$-K^g{>!HqI z_w}9pp;&n%GiVO1ME0GZ;7h~`qOz5)e%0LZ-=o6fO@8T0eAlf>Gp;5baiiSj>5iT6 z6|V#fnPpb~T>6Y#<=e16;-MRpTp<~&{#3o&>KGk`wqzP`W0$)|)tbnNj?fxaHX>JS zuvqC*?LjGg^N`5#u7{|N0fXZ>#Pz8AU<73A+z)D!1N=Txz!71aWmWGbLkz228b(hx zRQ}(r)1GJbNUm1~=&L?iEplbaaZ+j;Z~@jVOT<3XiVNKr+9G)?7mj6njRao3(4F4Z z_ZQsYy1mmfC&q%H~_tIic{CEXC+ zvWsjnB*KEY2iE(06n85xhgtu1pOP#4A;MtuAk2}m;YD#$Ye`x@T~6b99s%-NsSo7N zgW_$U)dPG2TruCh`TF}sUq>3NRk>Cl-gGYHzTG{cUpB@{hu-*g6)op#jUE~~iO?kT zCdz~yAjMHB#EXlQ7A864JVg2U?c+r}aLnM?L@k%QkGbJdS%32}a&A{zyP{0mgn7B% zjGH6!z@BJBKg8r>UTa$|ik1%4XLC(%59-Bc_mv67g2-Cy%Bc7`nXQxXEqc z2p08By~KyyPVTPO2VOxu!%oWtu|%*TIm`Q>P6D!$?4~%^Y+J$f2?8@0FyWYIIz~6t zQe#kHCs-8kp*{=iDYj={*=zn%1O$ge3JKabZV>yc*gT9{&1o=-bH$|_h#c8RG0CxBi@VK^-b3l4lhtA` z`DfPrXk*}iFp{Ek_>RRFOR>Aw)9TD8N&i%`WXbXKI20HKa{)t(Wgm8IKH0$}JU-8= ziq<@AByApo7FctlprzI;MiQ?~Utwp}5QAG*?KGlR9*hn^g)B5JRcpi^-7Raw)`$q@ z-&k(8o8{m!aDZ2OPl|X>XcwNF?|$Tom*vsb89-MM_+Yo_x(thz2d%JCEC4KYt-my1 zRCcl}#FFHvItkvo+Fb@~z1sC6_T&Avb`EwHOi1^h*9u!cpWF}h8V)+ueBc1YIB=RwdL$W&~U(N%aZbk5FumvB&)~)o4Z(+yI^$rGM=U%-+k|-028=C>q0A=S;^3 z!@+XHS^AI+H1z;8Pwy^1snm*$7|6LwPg3w za7@f%effFULwNLxG-xAlEQ%StKJI|Fj~I+DvZ4CK2b^u3q{q96Q8B4+dp~lBD%$XV z@F13YoI`GW&8x1k^4WRyBv7Vah(j@gJ6#74nL&)ICT3|Jw^jh?yebLfa-3#`|0l*HUc68KX!e>wG0jAdacv>s!4CHTMKAyoE zfsW~x`Wtg;oy(Z8Qbt6sI4_b>OFimF?Bp=Vn8D}$h5qrMJGH_?e%>*;@Gtv|n{h72 z1U4jL5sc{6zK0R#@Tu#yay2VLPk4dZ-kqKKv|l`~6|Q1%sWVt~96D=`k72=Bo`cza zj5@5xyB@4{ocP7&MRf3}9>|Em^^3_+<_XfX%8z%KhqZm77Cx&5b(p_sbXE^9CWA@m zXsbE5hE?>8S_QJFb??$-QW<=Je5y?Ka=2Zko6oHb`Z(4gR)1I?IUGC?ow!rG)}Gvn z+^pQ2n$v-hur#s^@cM{kjKUm?=kT^qy7t@phe4zv7qYl8hE;H|cekU`h~t5zfrv$8Ok`<$Ji!y+WBg6*R3A_$e|SG$K;i%*6!*lrAv7>j+m z)?Jo5+gg_gV&~bsQ7s8s(^6G$cyV4=zHDT`&()qt>Pgqq7bt{fz<2!cBf2U__j%Wl zy0}PIL#*<+&uGSourOO#8myaG42lt{IO{`g^CnBpnixv_tVT+lsdAWIKVO~*bM`Px zMLH}H>qbLp6V7lp9W^iF4GgdGTF-OcV_5XTJdB)!k>Hwm3v9u;=16P_&zl8k%gzit zq@YgnrLzx`f+*lfuf-^^w#Z-R6_SQKc?^C;?G;R56|(@4*mg6@qhISDsx8DLPqOTo z4*Fuvv4sy?3wSCS8vd9C+RpC5JAUkSRKrFF>VYw=SVjm%?85etE|kbpkmuw6SLca2 zFSA&%qIzZA58e1a@={eGcLITljr9OuEGNu1@`T45HzZEy%qov?E;-t9B71T= zR%tHjVNYb2Rk_JX;I+?W(-+g=>$OX6>@FToPH5yb&eghDbnNxQ%;Bck$J4ciL&L^d z%a}n?nP}}|cfL?h;S(|c+s7ZH{zEcg| z;cS)&6Y{Y8?cwyAHM^Bu#Bn_Kz{0Y;));>O&yu5T#8asiPz}ZJUP||6fsRjd77K58KC5m2kP2%#TX|;L z;l*^A)x+#ws#R9wT%%p+jP=fii^U&OrDacfvJqHT^_6xuWKA^!QiZ9{zd=h_sisq z#XQw0VG!0|UQ87DtL6{WVAl{fObp60smJ0KarZbi>sM|=MvwmDO+-Slx0*ZN5!R!v zm%A38gGbDR)vw0l^t6}paOdM%L`XOuGd{Ru*&TVD2el*DzEexs1X0;sW58eY{dQ+r zbNr3$;ZCxG7G%;fx9l?9$F8%Yklw}KLA9!L?Ma3I<@Mjx&Q{mzzd8wa$-H1_V5VnD zk41-OpgQ`>c9T5&_EpE(T$SzYoEmI<%HWe<^p1?>MMYK+qdc@<%>L=xfMCT{YHMkb zdR)Bmzyc$)#%EqlKTq`8vB^^KwudKObzC%cY_cOVp@-5(JNX7bz-vG_Y`(Z_u0HZ2 z_ZtHnVGeN!7zeW|2Su)!5Y=_}`u}{Nt4*{&kDuUq>=nj&$@{a!7>+l6Hs4*as4)3p zrtLLTWAvfuTTH7?*68JYpu!i^9OH1j<^iB4$j}oFVxLsD^P@jqXkF+|h75flnT*UBkfSc$Ne1Q=rIc%a)%Cs*fpSK;ss6bAT+(0QN_<7Q@6C7$8l|pJZ z?C^Ts-FQ@4D;18s*~5^bx(RYKeu#gtz%QE1Z<8a~{2Xc|^VteoiN75lMt#w262<_*f!G!P z**d_XW4g3{s9AxESQKo6N(XF#*&~)^nys-P%G`~-4h%2mbzl2uv;^smicYyb zR_RsprTGxGsMdZm=u9Mq!QokXXKXHyF(MM|KE~{9zkJzB$03QgNlV{EqmVcRD#lbR z06CBmI|R+~fN~j|eFly32C_W%jgsKS)(ZLkS@R?&_1u6_6UaC0?i>sXP6(F^52$aH zb+_V-bS~e3xuBb}j@Iz`=8hk=gMmLLLwH2S^Fpt1Wsswc28L=_vWH0ukH#9nj!-In zW_kEYNOD9)Dr}dNgM812NwT;xtiZ@|+bhe@dY%JLSns~7^{3Nlp65I7cO{LWTev0_ z80s6(b`I7K{_}Ibd&}O5#h|&hWG6SrGN=<66`vz>wvg;FS7t-~GaM&QRR4xC;|pbV z4|H_7S^1>ihzL*Antb;0e#|fwf3|b=Y~*^yDX<=n8y-8;%*ok_@D|gT4@vCh)Yf{f z4gC1B-o9u(t1)6f?4vU~Fpd3Hc07p0+0v~>{j1s;jElUHND=0=ZfG_{#Mfd9PEGUk zMcOCx^tg4QEp0mMd6I=vMVepKI%L4IKCZZUt~;4Oald|G8{|$!V{96vd9wCY ziF!R4UA|jHcBmuxLmph@MIT?(E4xQ*yYj2%=~bV2 zYKDk|PQh^SA78+kc9vkY%zOW0JqmSps_WlgdY><$z!n#JeSc9~E+HXhW{ zR{IWUzA-M=e~|}lK%3|mOC=Y`gYXyfoaeiWL@|dWA7Bzp~NP(?@98LPya;+a(F+C$2!vg<0Q7m}kaA4DL=ld)!D$og$}_`KKRxTR)E?KGA_ z#sSW}Td)428DOKH)Hgd|r^(l{a* zLfyhvG8v=8oUsU^tie05Cn81bKwEGh{sbzOvy)|j+htZ{k#NOqh)7jc5&L;FEj434 z_k5@ktI`ELoJvrfvs{!Mgt$=c?9qA%B|JcOr+LuGmpBX zYw$ZTsA?fNg8XEGvCFch>Z4Uds92D*92GxUN^A)(5gYF>WCY2aNFwYK&k5IvXza#- zK425^CcG!EwTB4e+#Mh6EPIVG1){6j^aW>NF9%i=ju%tn_u+5omDY@!3(O$?()_~4 zV^{YtI-6&N{aNw(?C_KN#2Q0^B7Yi6X8H_yZ1Tg4_dWD;i zm0uW#$z{ex<7pcIR;vf~XnA-Q<#|{aRq}(w}t@aBxg@oSq_gA&=X#uJZ z>|s#@VvnRKf?pK}+bu(n*iasDU|g0O&!E1U1;v8!(#uKfSl7zgvp*tW*7Rie!MT#0 zDlfHk*dn!IYy&M8@!(i-?E8`*#DK}f{{u~=Itryh?A4UsS2nGUER zglTvYtTXIBR-OopwyP_l9c(yTF0%oduL+Vi7!dN8~8mr+Q-Sp0Kx? zEy1Qh7@pFiCeGEOu`g;(je&fUioG{Uoz}eW-HUo=MX0I!qF%G=#t&<&xs>S{`Fisy zKdc5zCR+^_uZky>iz7`a13tkOh_=m)JOxj2yz}kC5Xe;H!I z{PIO=`d-%#Eq~i_w#c4-nFTXRj=$)rtj(xrX20>8gJWgaAU}5AZW^cu3bIQNr)h@= z%mU}#%d&}|^}yc6F?@U1?_!Q+7C%dqw%S0FMtm|c;* z7Qgf3_ENI@vRGD^C!5F;>e*@*n2iFmr^jyNJYl|D zlb*@D(tS@&;3u({qBoI@>O@r-BPL}DF$7yI)H#%OowdY`c74?B)Y7j4OVjQZ$0z){j-oa`EBpD-gLcRm*;l3~LF!pNeFZ<8u}h3R5VJTc@=pRx2R zM0pt%2G#`ZEiQmv)Yh^3)*t4BMgP2CvE`}G6fLl1B+GBXD{}BqKPw`Jk$;qDz&Kn^ zyI51Pi+#?p&dtWe-eXYY!%uX^*({N>-P3d5phR`+=F@E1<03zeePn~i{$v>*)_}d0 zQB`&SYLX0;M}zIT9MLic7##VE zFTU)rxL>S)VVZ9^Nrq0$CE|e=@mYGKHFAP~=skPGZi@fmb}WZH?e+8vZ*KHhdI)>$ z^Bw$`N>GvEU}Lf5^!H9SR4!T$RDCWR%NDB@rpqkE?XJP0@YmH?V^4$5YWPXmH>m&k<1B1&MgR zD4Pn|y-Jp<`{d?m``Dvuux4?+HZV(%J4$k2b!08Qv{t_ADE5mF#H^bU+@+cGOgg&(FaPJSQ$=57VbpLz#Wedy=R%g^D1O}fF|%?Lq{jZ?ycb&~B&=4~K65!nwc_jo zgvy^;bI>U+n_o3H+yHw)cA`l3crd~%&B&cR-qHGt(_U)M=6a>Z3ol9k&UFsX-D(pv zYuk=3d!k2FVqcORIXTk{&uuVzdl+Qyta$5&?^9z5vxz5RO-P?L9<}MBp=Vu*$3CA7 z#3ib^JdI$)1lGQt=p^GcZRTnD%18PC58c&%0$Au>_uuFkyr_=J+<6YNCyuHgli`r@ zgC9q29sY+l!;p&|$7I=Sgq?U+A8aXJHO?pm5cAJ=b5}7wf5h9UHFF z4!es{ggX~!{;0djCP9L{vdV6ixpJrcFDuP{nMd}GpJ0h$#Y;(?9btQUis6y2)KB>4 zbaxW@iV0o&sBx;)uy<;w`-zwF0NCmA1U~4%E`Cp0gl;iNVme+GPYwf`KM|#sFMjac zqft}zs9ut}-AJ;g?lX|hFY2SroZJR&$1M#0MP^?e`<?RlZU~!)hC<9TJv8e1 z^zcaMKslJir^!WqgQ{BWp*$#N1$rbmH7shXtRD4sbnjSwV+&a4qahdhAofxev{%}LJrW)?5tx}|phsFc9wJgg0@p9~+=1r;8f&Q~|hB8iRIAJLln zL2(W4oz;Mz*)utz*=gLWQeA};#LI3bZ4Bhs9bsd>>@Ga$&}?(Y77Yvp@7vKKk{YqC z_o5Yhnm*JMR?h0e;gPBQ7XNy_zTtP-I2ITSi2r4sSyEL!WC?q-JhDIb3_-t|& z@sC39FX&Gy(CKSO!Lyv1c=76l6Qq?$YYg<=bN|GcC{b3ZXZ#u&+ z*uB9!idCN`!;u@-6OvviV9eXuRY&5e)z*MR;VVWA313^`Fq@K!T#7SKae`XUY%T zZ7!SfW@;T5%y#mjGFx9a1K2Tk3Qr(DRnxqfgkU>flC{}vtgM<@IN5Qim3FIw5g9;1 zSUx&u{o__3Z2S$KCY>wY3Cpc@$WnGyy$r0sS*t9Ve5~p*(JQ`Dt1Q5&&f^d9$)a(H zQU>1>VQ?*&oJYOF_Op8CR9xh0v*f8rwB=qsRx`rlh@BuHxPsRcw|rB4FW)epq64w> z%+Et1_Pvn22uY0s#7B0xGMR$6-9ugcYO}XetjUh?3i2&4l7L9nn8c-UKfJVFiw_z( z&nIv3wsAeG?<#4bJeXQ6gXxedmC+EVim$}-PzUsKvH#WNs;uObeJ0z%2aKmN9PT~4 zBX11R97u9o$w5VyCn8||?7efwg;oep%^rD%=85JQzo0H^E-7N@c>!F-)goIntS-kc z-!t`c)FRNEwIr?*L9|E{*^LqBiGt_{EX<0&?43L(W=fuIE2)YaW%EdzWxm!dz>8nk zk9X7gB2)D?zwZCfJ3~u6C;Q?#Ch(!S$5oFzi|r({cl|w73!}ziSPZs7{08$u6~<{s zMPO_*oGaqRy?)kRSY)e2{CKZ6Wp|)p(URINJ8H#JctP0;84})^ocZmsuGkjHUJk`- z^5ht-FF#|yH6(N*dm}=HOWAI*1Gb*$kiS*?#JlraVlc4`J{k9+6*D6~S3UHuR~tzX z&;6k*G2p5|Px-ANplZA&KC+|<2O?gt%78R<^G+*o#49UX}W&r*f zc8%upYx+X}AvvCumb3J~NCKbd5$`1njDY9C$z^}hUo~|stJs)VRn_U~6!MSiJH?>ceN<)y^fAD%e1H%&e)y z+ux6j!;P-RPM*$g%yq?F^LMoS^PBDh3tEMGE20qfdsc}WG8JBs6~E69$bLa`tR1eE zf1yRA>Re5s=!V|P06`>due~TN;i$kcuh7OXTMhUEtPI}7ZX+u~WO={ORM5$htV}cd zzI%PyeP!tE2*5hvhsBtpEOCPRA-bRnc&$6C!WV(^-p`|*&#j?N;{plz$lOhOJmi+_#!R)AMjz{?`pI!XjDp&3QMK7 zobUM1wIW>4+4Un%ecz|=y55s3`8jpJKC$o63Q+SR=79ppU2Asj+vTP99%C!E!BC6D zAv|kDEf%?n&7UP7zF55H*)6IjU=$1$?CnXGn`x-nkdDGBvifSbu)=nZlBnl*u{b-m z0%fTCnxEPwVV|(`vLRv)^K_td4z>3Fp!4J~-b@|@vX^IA?wyFubEek%#b~h!p02S| zi?XIX0K87x>^-E8PZ!bP8sFD*c${3nO+DFSqqLTsJ+YNNgdtgE9!no!RUALR11pZ&wDt7Ibt4lhGGc`=ip$C3ldk6- zJ!4|0tJojaMR-B8Bu3>s%^ynui$jhqi)vAbW-tf`n-iHLOtAWPtmg4%aBwMV8tsjg zkK#FH5=Qi;KHbU@&FTm4!u}4Z)9S+|;EQMy*;%WePs|UBmcGae&(~|16OU*&p?K(d zeRYKPzUUmeHxd5xUc)_}{f+4&Yg{GnjWzPT&@cN;8<RTGHK+b^`@VUO{LFJ;z z!M8zS=r8rTr;PHnct{>ky&2sV=hID=K#T!h@m!*4SRKw1kzjA_1QGW+V}2Ut;G=jJ zH7Zzn90yBe9}&E#mUQGn)x4M!IUHVL)auREmr?d#cE8OT{p zr=0_;7kpC?TQ1HS8E#C0SZ*opreQp}RUyYk-t_Qn7T7vrTi9yaEUFw8q-x^WuYt7n znAKFpG0tOk#6#}L#*Lhq9J2}n(x(r4t);`YY6pjY@s`%mcJKJ}OSPb`fp&=Bd12iD z$cy7W_+WhhsOXjL{5%Qcfw!{~Eb^EQ@sxZW$#~Yke1m5S@WCQXvc{&+fbpyddy;Tz zGJKvFbEo;&54=AfLZlAOc+Xp~*CP`w!eD1C z&$BaOYx{-|cD@K#{Wo3+YQ-mvXY-Jm9b${pepuH?K0Mb zZK09;y&d7Rjmk4;X1o4SQo!}e!mGPrL#!LKcf4`fmqD9ENJnbR^EmCr=Vec3RbW*7 zE_;r1Ig}*!^=k*Tr-PG=9S4Vtk=PY@XYBM4DR@$uNJ^x+vS*fNzXR;e{a`;1Zr>d2+3 zyndZTagClIK*sO;>$?TiYvCEODwuQ6FCA6>vfMt!RgJuedI(Ybk@`Gp)8ynxL);-V zHuC4Zr(H5~Es%~ned955Gd9<*tKe{AmXIdq>q;1RVmb6tJ7cUbqc$zElPXz^J0 zJJh+xFCw!_*dq8+oei!4u7rr766`)6PECrOHlNAXh;}z>4I+ia=?ZNyuXaST>2_s$ zY71Q&mdI+h%l{F&M@h(Q1C?YY?1>a}n!Y&s^2GR`zj$IU(vrjhcT(C#h}t?c1h$U z%fFCD*rkNa;ZJ3kAOv_%Tm{?BcV|4J_hNmLrOUK=p(A)kp4lwIRjMH`HgBKSqtU83 zd%nKl<8cQVOLpiEut(aM5*?ZcNmplGNYp!Qbh2oD@0CP)0$mu&arklXlPv>KP}WZ z8Aj*}y7hdIYn_Wvgelh2U$LZk74p&Nm$kFm8GHhL^MoAxSnPOK!DO}K$B#@$AyPAT zVv1oQJ@NVO&cqDxBypu48{Yfk>NqDC(#aGSA8B1P6fV*byNrp48U%vR2 zJ7Rv-*~@zz>F?q0x;JTz=U2f-m`b@)b?w7v;3?U#<<^IaT2=?18Hip^7?PZCJoqpp zJKAeev8aglv7)1HPEHA$6Ca6W2SekS*UrR1!h|f)Lh{DbK)s$%f3@gIu21aryfds0 zF)*KlVHqq4Ya-jdzkb5VP@d-~U|q#xcqA*9&x9c8F9hmI<#f$!}TxqZ=$cnoeadu9sTz{;M; z(y$^IlZ5IES?Go00l8>aOOBs+m9Z9yVS0>9W>!VyvF@c8qpHU4FI+yGs1C#`9u<-p z9em)WWbnRrL=akL-Bc8PTRR)wUFO&1_KJraJMKNd(Klzale{B8B2Lh+Q2}u_sjv$4dvMy~!VBGrMV{+S zthktG-~jdf5a@jE$;u7BL{xLCna8*chH`h;k`VUSzL*oWXGI+Emt^1cm$j0uIG5z1 zOYLDM{bj+_^}>oLYuSF(Q58UkSuv3n`#8Qk$x+C1AOiY2Dx=0~+Uk0hI%bug;0CY- z*s4*3WbKR^-Qg>EQTghDkHq-c2$8pEOprFq#77NYd*DSo8LTu|%dQGLa;?_`-T6Rq zI<`^$J&h8%$`TCzdw9SxYE~A@dbJiv6QU4je%vVJ5$rB-2T{K)9KWn`X3z9a46u-W zpb7H!zByWig*RZE4%MoN9oNgWG-?WRj&BY7#$#d+4*59*1`h};b; zr55z_G{{O-uPn=cxt@Dv=M#@03WV!;4b_9A-fHZy8Z7mA`VvNymml%8DgrDOw7^;| zCTA5F&->-Gu^c3LbQ&o{L}zKOCuNQ&nAppKNtXvX-rmwrx=Q>-I}g`Ol}M^3$w@DH z1xRSFv6w}%4s_{hvZC(Y_3mnV24n7@Ufb8`T9zB;SCfN@gdlMMcyF;0jtWBqX{sy2 zrm1o8B;v9AXxM7|8^x`^=$x1J1fTt+K9~n~Tpok9c${ur?u=7OL8T2Fg&C8}AWb`< zWYOra_y@+pSkWjbf{%mT#N>0ya3!0qrrJAC?cGdjhr15`V6R22%h>>!kt{r=2Xau` zC2oQD>?gHq)WPqoZP-J;)Vlb2zc?UIIEC!Cx~JWnf1bQVmR2lF0Z~B!Vzm)-F4YFC z1SjF?j1bCT(ZvpO@1DcYTaJ1z=#Z5+BQmX4hI&IRF~%1&_My9sC%o8YNW)loPexLq z2Ls7y!;)4co=0AS2UT%~WA^M|Bcu0vgn{FY^-x8W=k$@qu_P)gqLpV`<#6PaTAH6U znLNlq1gqC#VbA)4JjPmqJYg_(S}ME5g;p;fQ~Y->`!${kb};$Ef~*W|E=t;}9c(%6 z#w2?+zLR6NzIe}0$fLrqkgQmYU)Cf3P$tEylsjQHMPBNzN%zHP_m<2bZ*7cbz(8vm)9%mKBgUQn7flv59q{vZ1%wc>8U~r-zb}SPC|# z<1hwXKi7L%B=vLn$Kx|UO{c6X`^Homc?J(lGP1EW&J#A+Hgh&&Ub>FI@Qea?WN~Cg ztgAb%M{F9rCSPqWV*{KIQONUpN{d=|{28WSEya_L!aIB^YhwqDDBn88yg=*&{m2i= zVv0`R*6Zti;%S*MzHcKZW&Pn_#3DT0R{i*-aX?$N+r7ku`|I1yY@EzIzJ+#<=XlW+ z-y{kx$_vQ{Te}dytPqKj?U`1?vtEx%Q1K0)NFtssZLcnrXeBws*k zR~Omyot_z|IuZUIJea2>Ki;K!BjNZ0sxmRv0? zi^$@#)@DflOpP+mPNnA2^xX3fWVnX!8+l{`bNDngOcUX899~$R9<*BU-n2kNeuR{rE zk{!gr`jYCUs{K!gkNC7b-;D*P`Gd|qmR{Q_BPt|w^#VsGmP@V~MrGah^@%;v`@18y zgxHet`P)f~DIc@X+p$ONop#34Nvw993&bv3AZ2+`jGp>? z%&a(G)=2#)~DT2Qw)sxQu?~AH4&vXf{=>CJPh~l<{jx`_J&VbIV}`}1@XWAYa0>pBj`^J3$6oQopY$`= z45}i)qCiU4pG>r;dd*G}7r8+0B#m3P{=__dkA0&jx|bDZB%)ikpAFI{9+Wl>z8~j+ zy<^cmM?m$tY`8qUGcn@ofUHzGH@Y|Ss`6asnOxW%8gC~7rUJ@Q>Fk*R?`uQG0jnh+ z>f6t-KJH4&_%r+3)q~3rz`1MzUkatk2e7CRfK@67bSAxp0DW$Ki#_G!VQuRc*A6pZ z3E|CkhBbus#!{F;0^S!!^#eT?iH#+?S3L5zr1 zV;zhd1E`P>zyZK1Bsbsa$R3&;ITu+FItLGnk3^J@JIBs9*$CCLqn=XaF!onreN~}5 zF2=Mg2&%l7ZGqiANd>!Z_pN92tB5?^|Ee54g=D){jr)Foc|_dTZ1PnH>f0tUxgv1P zCq8+z_b>oXgP&11sLH`O_TXQ z^R?J;IuBXNV&ej6_wm-(;Xc9Kut4GfEQ>lA^T!v`BlBx^JyTY+FQ&9wNB$SLAo7uM zADB)&h)WwRJMSyAqAE#+;n+XzzfkjQc$&M?ETT zP%QMi{)irBbkt>hpMg9&opENmza4FS6MrN!79o)EzBF8|gSKEf$dHelPgnQ#2{h&V z@WfEGnXka>LV~Nc$ui;6tP^{A$(&U*=NNpe=g4#xPkDA)Nmo0@zcp6M1GI3BJU!ZEAFIA7EdKc66Ju66O)sc$d*`rYdC*t6@WTot)6*s-? zO0tw?<7=R3{!MgDTUkIJ^wWN4du1KlWef$FODkNACgOr-@X2z_`=@qbbFH3A4p5qW z!-4eN+A+)UA8oYf6st?iM|Mf}`&c~@dGaXYpZ_z7U#n%$;)T$UH1qZyVBE-D7FN&s zOJ|6JM-~*y)fP0*o{PA}Y*@uUTs2lrVOtemse zt-yUU8-tm_K=P)lCFnD5)2=7qQSNCka3h(!yLw2`=t{D&8^BuH(_Q!)o*mybYU9{Y z{5ktz529zrlaqaO7!Gse>E*QX;B;r>kP8{#KSdt9doLoC8^ZX>W>^8^c}D|xt|#3? ztxhWf$91%GR+84iq{ok1E#h97$v!={h!=t{*dtFI@e0b+zt3u2bjMn4*TRuj&Hc_{ zUys)}-w*|@V_LD}kD6Ef8V_zQuJkGX#7OxI*ofUyTPsKOup=Ya!v~DLN{|c|>&bM6 z{T+0DxxVpHVuhb|27V1@G^;E1Q>1yLPY!n<46NgyreD5^f*0}>DVCLWKG-;57d7T^ zI!#n-f<5u9E%BBahCA#fG!Nu-bMg*iE4lf7ldRP6i2UXHtU}M6qc`jabm@ppkLoVZ ziTTr7WeagIr#gmzWObo%QfGbl)d${i?8TwwJgCTnWfTL^7kLvb@7N(@7mf@k{vD%$ z9m6H!y;R@H+uCOZVTi@-tv;8G?KGD|f>g#cNkp#n63Yl%!n(3)M{DU(BT#uYn@r>j z?4q#8-`)w?8!L-vVt@6(UDuL`8ZOmu$LoQ0ysvvg;NmuwQu8$cv4! z7Q-HkIAxF^1#z-DAVU@&M!%X29(E^d+#Up;2Sd-_;>xk>gcG4f75Z=cMs)x7|R=}31GP8PB#L#S!qGuY) z3yNV5*Degkf{F3168yCY*T~(G@8Ci4XrAkRaGH_DTE{5v?)}vmE*^Y*S0m}DZl(Q) zn+f0KIBHq#I2Gp&6e#D#r?7HxyQ`rCk=2gRI3YSgQlc@o4Ww zo-!N5PqIg}k7bc1RUtdj2>rzu$hyg|$WzN`sO}RzjqiqI%Xk{NaRp=|Ev~SCzXn1$1WW2h#V>wMvj?R;XU2i)w15uiaU?$9G1t^t}qct8l6=r z&X5h?JAE?PjHiuF#=v@8n`A=^*kj{?V(n#t-~5WV%nO9VdWs50W%zjRnCH2??0P;+ zu9PRRuk>Xt*-37Htem2i4oivhcpsdJXWA}=JJh|YOA%?#b*{Z_*!oeoVpiFDa^s01 zixEl4VY1nBdh&nlJ>SN13{L!dR(sS5Vsd@D-Fji!aKQW@oFoR4Nnz2TF#eg>gq5Iv zeLma~_)pc0=aZ_FKik;x59~E;dA?sUl@{!3dS0JM5eDTm@nR!C30YzF$KE@hQYH*b z==(KZH3uS_og~LjsbsmFzQR7Htr+kx^)$7S* z{EwYnydEZCPyMk1>>>AxUGpS=Pq7iL0Ob zw2Qpq9h@;Pf`x?LWoc-!CmmyC#OGrsXp(QvgR5amwn=`|dhx6ZRsQ#?qf=qU8>m&1 zgMkuMvsnjfI@A-1i=laa9lbqJ+faqS>hBNNAIu1BXrwTL?+79*IKuZ-$SNDV{4C}a znp0UqW-4vTRzKK%^|qKM@{rMi3{^w3Ifs(>r_Gv*6gW?eF!q_A?~XDGLkFFK%VUSf z^DxGJfD=fBy9L>deQX{W%sB5i!l2$(?*NsQ}zxz?) zh0ht8YoA~5?wGEFX)|{6(|(Wl8unqq`5=AxqppSISZ^ptOpYb;UB=KQ2E=NXA2aJR zO+34GBY!_|I38nhS~siRja01U3tc03i$B8Ll8o$#`|*_O{zYBpi4VV?l<^06b~|KV zb|>}vS`z<1?m9UGa|KD@kl`R}0Nb>$WAFjK6ze6E^I4y&8kLj8oRS*Lf(wU?X`pHo z5*yfz9pp1v8`5UU%%2^IxEk`Jsd(Cly*N3U$ z0t^F<5{s*}gI9giJjPLs^{VlRNj-JJUSHqHq)zTsGs`xxPxxO?!La++cV%Hr)LIgU=ENiEuonh5a@XnB+j$46aqxu2L8i4-qsT*tW&(N>wGI8giTkyR)wyTR~7s7db(ETNPLY)*qUbN zVXsGZ$jBOAOl$Bd_8efHX(SEtZANesu6nLE@G|lTddI3m8s{1vn+VzaRhvB5duUv& zeXS_wXPt4No_i(>JC40GPi&EvMz))e;9GeBR?eIrt|ha;qQZ&thl8OKHPh4~^OLP% z6{5U1JrKpx6L~~D)|gZ6h}tn_b~p~cnZ1U)$R7ivW>zi>?$$f2#cJl=p{#um#WH+19&jjf4;On(bu|WQxDvXO2;a z7sS+<>&^N^3x|znz4zCz16|7>W<9BZz4 z8vSDT%r1>M*vMf|w#Y7Ne5Pt8vBAKhbG3>~hLC0aR8#6T#5A70BT9JC*<+5aL5NBG z>1i1B1-G`ITxXO0f!@=>kMlZg3C$r7Sbya51`}e&}n1e;t8t*t3NRhZ#jPG+({Vc5OZG2n?h@52jf(b0S|J!~P9BKS!>M4UoAW z%sLNcf1dABgxKXt*ezTI7S?WAXo^j^(Fpe^O&lUNW2JXSuLhm8;2E)!>RPD9GgDN+ z!DlcNt`}D$8zF{*KKUBV5R5*ebPO$du+wJEPTu3q*`Bo5-DZ>JiGF{-Hu>0*4|5#q z(6TwU>Y)*A6kMqSfu@K+SGt#(Wbu8gpNi{|Gm#hI39%9QIJ3fHk~s?@;(*OWJlIK| z!*`a73RI&#Y&Nhi)`NLel_iS8!NB!oyIJor0pcNhSui)AL5K0i8e-aUV`mzn{_Jav zRrD;`oT zN}5mlOs$M3=v@e_Y}YR+lFh;s5B$m&V)Wo^8BlsmpGGB-7)+dv1Mu8(EEfDLvZOh@ z!F+m(J;Dx&_t<{6V|PbM6k3suQ0>dxVqKsd=pPmt@37(!IDhK9Olcx-3!%VccnCF# zY?xgG&SClfy!WzP(6(3uKd8U@4Vz$ScturS_&@&A3a63ki`~)M!`_J^=sw#F_o(y4 zps7)pZ?mT5$<%G(Q{i_rp$?v&d3K4_B=3xMly|dY#vWkTiD+PZs1Rc1pV(#A4B~(~ z`5(T;Dmt2$!>uy^bG;s!t)tz8?_+`Z0bbE_vY>vIB%jq5Zw6zX>{FV^LWm;lY9?Xv zfxC)myyKnmYSt3O0h!1;__h*Pc-p)?#=)v&KCUm~u3P;b{1@)d_c%ay^oZ2e@j_^) z8ZG+{*Q(#vmjCahP4Z1x0{h${{N2qq=210}*`+_$j!HlF$r`~yVRWr_lE)pY3}Acw zuWh~pE)tR1lVN=g`!J$>%qbgSZdFi-Kxiwj!8hk#s~@Z+yze>VHU1x z-!3#6N51fSXQ#N7GPvq*FCkcJ+-B>L)D6C2u5Nz z;9oHoi>CS?ORa((-k=|1Q0+m8Fo|cusw~id2zYnxh>CbsOsnjyb*AF$`qjR1Y1hd@uXgs+ zr1)x*C!QJW0CAG5JSR41f7iPg505RBHxkcaaiK^!>_P31@4E41?D@_T<5(B;hL-7@ zXicW#V&kJNGS1@u&l)3SGVV`4YPNPaOKd$Pjq4&Y>j6_vPO=ln;uY2PT3N@sBhSi@ zTA?r)iSO>bVefpu&tPYv*kir3o>+B#CqJ24$Ux8K^309d<@=8(DfRcUp^!TOaW zFiyESHM@Ki+c0E~544_UYZFrCv+!W_UVez@ zX5DIp0Yrmv5Szc4SLSK>X|`Uit=T7Q8f`szD&ze|WN+l~KVltKF8rg43%kVSZB*ro z((O|6iO5NLp8{if2^V&!xX|nyLaZub6A-NQUP`Q5Xra&UgkngJJjgb`0`o0X)a}M7pDQq%E4} zjXkB}lSv0~E7)2qK)#M05R(AfLf!8Urh4*CW1-k5I9(+W6E!)2FwcD^EotjzXbqrzZ``Nn260PGi7YHH3Dw}b?l&4*%TALpYwlV#iuShP=Xoo*0=gkZ zE7d4B`)ik$8QYUj<(aK&cf-P3frAxRXCcaildx(smEs^P9Cyw>ijhXO#_&b@OScZz z2PxlJ)W8zkQ(qpvPd=2Oh)o+pzZt)ju6m3$(r!-~lFivQV#k<-GN+jE0mp#d@_ zP=@GOtODO!%bxi8|I`-CNi)SCDu(zKIxMfjM?l%Ip1qy&ZJ2B`Z+D!S$0zg^K04Iz zQezm|2VP4J+D8AgJu0t9Z9k1VnymIFRm?pU$^Jo*e1g%_Njy0m%e!imMOm$-f%@1l z>i{Z+&JXrV)I#pi=D+!z;RZUh{2PUv?VUGqYl4rhMhHP0q`sA&On!CBul4@Q>8e%3EM3cZSNe!p?D)HLFgWF{LUL$SZMvH#GT^?IP=>^mzahk?bnmgYKs zq#mwy4MvscCx2cV*Jf`KF4)c^e`)inMq%HZIxYSSrlSKefUKUCa3k%pHt=a8EVWR$ zR(10H-r&VOlfwRAHD&tF_gH&u{6Oze4_q{MvDh0om`mR+ss5d9R-?;?_)81qHb3q< znKL`eh6SPLv{z+46hI^OZ%@Zq5tu|Q=^CRDOY;1KjgTQQ3;MUGK4Vj`@gp-S>iC1k z$A{1zR#t2UyRt!S1#NUMHcUI_d9bnkuc*P3_T7(_pew5TN7flP0+)$0pc&b6b2VFg z106!fDi6%MSOX#${GPa+4)V0_$`|lJVu)d-a37m}vQrCiw-sb9U`JR&sk8`%ngRF)zW7ft~aOCr>9J+faETg_-?7nrE zQAJ_Yth(9&mYJuJCBYleBZyc$pk024{5E=LMI7rmJyda_Vq(k}n=U{6J<`FH!p0ac zS-Vk@0j-Ll#Z&lOGl+AN6&+8|9P=X6G2~$_VRi6JR^Z{-?7hi_pVR8`MksqfYM%}# zQ@j;k>}c(aE9~+bOdU>1-iGxVnO0ui+UASd1=T!d!N zmdhgZsd^>OKUvQPDpYH(q8S!Y{i-Ss=ODhO<>rCK6#dJ9VaxITyquOW6ml1k!1=~7 zvZQb+L`H*--Cw_!UoLvyWWPYn}sI2)TT%Evv8 zDg?6f4S9C2J7-i~$ou=QaQ|b-4mF-*(>&QLM4O>qt&*}eKH^*!TV?2a{p3AGotxA9zGR z>CdPMx32>0E~cWRv}N#mcv&?=R`iJS^FuE6-g$eG9LTH^S2@ESF>%?o~ z3r6Lpck--osThI=i_{M%T{465|Eylj_U>oBgZV@Ukj`iQ&yUd^tI)nNduy@CW{aPf z57QqJ9}D6WR#i+tsx-vU)|iOiiez2JGoNItRm$QzSP}Bs-_=L@HD2>R_Rh+a@(cVH zoPgu8hZLtf_8GBq_EK0A?0{UQ2o2*hWIuLri1n;sH3kEtu<{}T8q81N^HiCS+I-Jj zQ5iI<6823#LnLJNVq&ctY%Nqq1KIMq0NCTr{8P9_9__^q~Lo$}8Ogrocs?&bQs1`iZ&0JG;01vGpl3QEMlk#tyG_ zKe_r-&GGZ@qOySPu`VEE{e{nI2c}jOt?Cq?h6`iYuvDI;W6tRnKFvCn<)R7NVh=DC z*g<{-F7mW_)Kkjrs>L+R02>t~Ns6BGr)uI#eou|4Ot=~4 z#gErdD8t@!=MI}Hy0^~YH)~%d!k+H$TO7ntaHLvcb1C}=Us~Pv?v9=3WY1H=-7h+0 zRJ*A&f!hY}f3$OWSTyeJFe9$k*KKBdV-+YXrA12uudg+`;1hV>&>}ZIFePix{su< zo|b_7z&My4vn$4v2QZIfc>L1%PEz~*#YcDmxRYHOHJnx!nd`O4Th2}-N)zB1ysh;# zc78xAvr~`kI8^@tm+>|*t;&5`?U{ad``fD^M&Ylpe;b{Hg=RyIO69GL8magkLZDlC zjDhU1&sb($ImVWRAUwytm)pVSVj8R)>jm=1NntFpQ0xO{m6b9^9E^2p4+u{J?d|Ve zb3390ObofQJh**XclTu1t#&--#q6-iQLWL9qznCsQq=6L&*O{9Ty!(+levY#M3ZbR zjWS{g(!HRjJ(G0AzgJr8G|JhY_8>C3SbKcVc(M!30@n;)R<41+=L>12qt+KIZgubt zqDKfE`W??pH4F3yF9J2r_8wk^*;Ikhtb4tar)P;|_v8%7%6FcQ9PCPGST*8jo^U8$ae3I>B_Y z2(-pHcK5%P!=tGc!dXG|keWze9R=3#)2^4jp!YBuk7BfNx>!yQ1?HMfCb$=V%y%nT z{UQ*u_1ri{W23P$Jc0_9eIbqm*$LQ#){`DP=G?t~rq0k>FfKec zKX|s|cBsk?s}jOeu~H(uk?}DrLwDJKT#I^W-#UM|{~>L)8t!IK6VBLEV^xjaDoW$u zNd+3^LB|?5Q!JAmA@HK;a@6<3E8^5-Z6==^YmR)2=@;t(1XRM@#_UlRo}}uOuP4Y2O_!8W$IiSO&%y-?J_5^M^?d z{`@Rv4LY=L?1ogQsqSfLJUq0QYPS2GPd_)CDfo=-Q0ZdMtO%ok{a8HSSMJ-o;MF{9PF7Ntzb9CjSvKln zD+-SBOn}q9#-oYwJf+Ar_#qhrG9OhOthHxc4rC!Cfj?5yD5Fj~zVp-BZ2GXqWPwfO z57|8S=hKeBq%6A`QwgD`>$P#XEFgQ13AcaCN*3)y!SJP($U5!mm8wFS5*9-(9^9fD z#mM1jz8)v-`4*nAd8`q^I{0LJWgj<3N0W%TV3q9zQwht?T4R_~bqug6^k@dmgO$s3 z;HJdZ{1`uLgkt+=-OWt1(AR4p_VNrK(lQDdX}!PvzI~zef)&}@I5DJr2Y)T<6LHWa z+QGgTK?SymG zeDam>58jcDR&k&Xjdx`wKbxd*pfd+QBQpfOW5=-R&@@x84bSJTG>C%6L}s?OL<y6|7 zjgF2Oba+HjB(I^~Lasv(Mg;15==2Y3ee5%UA^*I)vXZji@apcVcX)=Q`4CLFy?gpC zd+DxLq1XeTLn@AI&n_KYD-OUq9Y}b#-jK&^zoR;6qZY787#nptxRlk}VNt~QIIXL# z7#zaL56NdiJmwD8#VtTa?Ab;~#1v-5^P_oNdpgh5d(ShlwqV!6E6agEKac`8kT>M% z*Z>vdu%N|M?^rtH*5G7s5lyMc{_dgs|CTEH$*?+LMDu zc81t*HVN`_IB_;{t#feocvBfAKRmPjvpsSEGs5cRiU*d<|POC z;Bx1~7LfPDu9<5E(#?Hc;TSAP=GGxw2SviUG~4QA#jrH?+pxAHCrXPvIm0J`8(gb4x@W| zF7)ZU*~KSV1K%a$`K>rb8ms0^{U?7QyW|+zV~_Aeo|#~;k=)?0;$$k?ko%)|gE7Fz zKnNmNBj?G~0$`|Mz|)gGV!Qb?5ee__yI4of|C#K=U=$D3?uhK!i2t{yd);j+34#Fp z5c}%vZvsoO<0Ot_5)cHzBCW(7aSL(mgj)o>#@08b2$49p&+$1k-PP6AJ!7*`^ihkF z&$oZb4qoP)o$Ksi6(ZO?SFhh#?xvH~swLSuCGtGSs>92IFmx=(_=pXBPxS!aib?pN z<0#(d(>P(X@CYutHV7<-@()|!AM8qOw7LSWz*rfoH80qq>eT1lv+tPGVFAO(4<5~Xe+xa!_*A-byr$TIu#U`FCI$q@`uUZdl!iA`=W{}sY zPpcF8uE6hkpRQw=CCaF^@e`j+hq=g4l{nSFpE=|2yie9=rwWnPj$Zsn$AC=MweMvt z_H)i@?$^pWDvJGXVG$0dGUt5MEw7g6TFWRCUgU4PR?x@q=Ml`-)!PaO&7hj+voN01 z9MN@tlyj&qPRlQFZJ(hU-b|4t>SSP(`WNAbj99(c?Bh4qxgX>%<-&N_GRHp6DDh_f zv(#V}M@P#)s2E}^^ubcGAHDxZQud^)PUnFt5S_*N!zPNNZ*;|*tgqH-WELJ~G$FaO z>Jr$=k#@XTjNWzGmCA&xv; zwx|}TCxAXK?{$qZO%6s)mb0}lMAXx#f*HvHjGb63a#Ip?57^6vg3228FN)=u_s5)1 z2f+K>foi?(XZoo;wyV=A9*e3sY@WyLz$ z0_4zfBR&?<~vx!Ng$FVK3b9OIb$ zk&Ww1&=KZb@--bS?nN{e$0vCYE9M9KPcV|_@ef*8D;T_4-cNakH!R00Bwno-cb3U(G1ES9aV#yF@OsXb$Yj-_eJn{YnQ zxL^Ftc&O@$c-})R(v{>}+WL)WBCz~|K5fok1@rNgX`T}ot(e6OVUN9sw(}gmgL%rp z^?B*^g4spiCplJiQk3c{6`t&z#eUbOo}pg9n=_ah=!4zpn=qnAgMQ2^-CE ztb(X2r#DfJRGpPx=x*5$jo5DdIGwy3<8RNw$6UFY+RrPxZe^~M9PQfZ#mhWHFQ9U{ z8y1VNvsNmiN|+j_xzzboMNH(zOT_~?0q5Z?rsThBR_g;)u*O4ZbduwA390lOO}+U# zLd7HJV3+NBFxqAqbC)s7{V0kuH}|hok7q-481pDz>Yy-%n?=ngBM4j7CJ(PnCEV z#!Zc(f#G%XDVnB{mXXLfWrpUS?a(q|4z5WBQ2AyCKo1KdeTi*zjFSu1vM{IEpcBq3M`MR|7BP zhM0&PSS^Rbiv!w~#GWh|6OIQ3%t|X5s?8Xy*eue@Xs8u>g3Lc#hSzdRIL~)rPAmP^ zSzu!q`AuiRD_}Yd=6S50m*~nn%^mSI9bE3KbIOirBvn(*xA(#_EA;IdKqV0^^s}kn zQFv%g*nymy@2c2~MECNp#vJ^CNAq-7ZLP~Bcc5cA_^2SAh@-p(+-% zmCtZRRvPK&!R+U`D=|PGCbz`tZ3c0Cy~D-^N5G8AfOwZU*-T6h z+3zZYUJqh@>W9_Nb=W(j_}VCB{;RIAI}Kn%u%|u3y25#r zZb{w=t0%dlXQ>{E=LdPkeipElm#CHE8oW&u+|4{v$mF8#-nc>n*&hB4|BOH8r}vlF z8o@=zOAV98VOFpWwGdGOUp0^X8h*gVcGZ~2))1`U6=z|Rinr`VE^(fpJbRPBVIM2U zV5pYXy25R-rpmQmiS{(=01=v(Zjex@7+l$f(J_XSr&l zsdg(z7S&nBqtQDj2Uo9pooMD8lOPb5t(GtIfl}_%^?5YQZ+R1ht$)yGSipKb=h|q% z(A7EUa;m@GLC*EjY-HoAsI-Y&dF)f6o6%A;!oz&09K}YQ5?Szb_)qZ?dk&L#s!_ra zeY$q*b0%4U`TdqpuyS*gV^xpvCkp*h=0QfF6Mz*{pjgr(XAu#2pq>EA0n5kF^gOUS zw$6uPu*x-#xtnJwq^zi{b!(gr{u*_DC63D;*dwI`9#bP0saELA!esFmswA}F_o{W6 zwWIYQy$I&>GS6@47*=S!AQJ|Ao~wkxMnv`3$U!?ea+znG+v-OuFir;-@EMArS`8K? z=Gx!iPP(6hW^B{7iYHyWF6+T8WsX-lJ050su`8D9ll7B|*!o0pELTi7mQl*IaRhg$ zRxFe3iesZJ)brK7U#3=XW#K`_W-tH5GIe~}^l^TxD;A@z zg~Ij3EsE2J9Ho-#2vHTYR5xUyqJ(-aZ=2`*ck>RFCY(jK`8ijIlj6q44ho1j*nk}} zD2OVam=D&+Cs;hR_c?5pPJQxbk{x)M<@t7{e4Hk-?`%BJOgzpVIoC)Xt7Y$ zZP`0M1w~~?{2d>rOwt$aVrq2{Ke@{L^pdJ7eaSuWG5U}A0okohq+6RmTCv)aK5LfY zDqu9T; zS<6n1SNqu1C}l_D9uB0U?p1v+B6zDslo{xSUHD!lyYz|eRF(HRip{dtPh*6zXx?Jx zL>Ww>`=Rp`cFb~(l+S`DA`(Q$=3sQ0GcRdpe>)D1xyT5sd9--QU(J$PfTQNpm{BpS zHmcs!k=zxpzD5nm*$f1FU{*LTmQSH!#j1ks*TkQFZdW;~S3*FUgIQ7~w2K$KpfIpS zcmRQyIh(FpeptOkM5FCmSz-;#EZ3@XPn%^i^vhP#Fl2obbX>kh*)n3{gRV3EZ`PWK z#;%;b>r#g;=7(x%Z0t%yzvDfa3hak;I-|_6Xt2)v;PmZ$;w+D4Upf!Y@+v#EFYD#7 ziPPMt*~0NypG=q~+DC@6!}~-~@qpgpp4h7~l><@}f8;nmC$3aiD?(8o_Jf4|ZWDWE zv%IZXCm$BmKX1sWoolK0d1 zDG!tpJb~Jvb4$L0U9cD<$hvtqT!(2CT;rjpyUK{_&Vze=w0eiE(-@hzn|TM7M}CC+ z>WmcO pythonSource.value / f) -val Python = config("python") - Python / target := target.value / "python-dist" lazy val pyZip = taskKey[File]("Build pyrasterframes zip.") diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index 9f4822318..a05ab5246 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -9,7 +9,7 @@ from pyspark.sql.column import _to_java_column # Import RasterFrame types and functions -from .types import * +from .rf_types import * from . import rasterfunctions from .context import RFContext @@ -24,23 +24,18 @@ def _rf_init(spark_session): return spark_session + def _kryo_init(builder): """Registers Kryo Serializers for better performance.""" # NB: These methods need to be kept up-to-date wit those in `org.locationtech.rasterframes.extensions.KryoMethods` builder \ - .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \ + .config("spark.serializer", "org.apache.spark.serializer.KryoSerializer") \ .config("spark.kryo.registrator", "org.locationtech.rasterframes.util.RFKryoRegistrator") \ .config("spark.kryoserializer.buffer.max", "500m") return builder -def _reader(df_reader, format_key, path, **options): - """ Loads the file of the given type at the given path.""" - df = df_reader.format(format_key).load(path, **options) - return _convertDF(df) - - -def _convertDF(df, sp_key = None, metadata = None): +def _convert_df(df, sp_key=None, metadata=None): ctx = SparkContext._active_spark_context._rf_context if sp_key is None: @@ -51,18 +46,37 @@ def _convertDF(df, sp_key = None, metadata = None): df._jdf, _to_java_column(sp_key), json.dumps(metadata)), ctx._spark_session) +def _layer_reader(df_reader, format_key, path, **options): + """ Loads the file of the given type at the given path.""" + df = df_reader.format(format_key).load(path, **options) + return _convert_df(df) + + +def _rastersource_reader(df_reader, path=None, band_indexes=None, tile_dimensions=(256, 256), **options): + if band_indexes is None: + band_indexes = [0] + + def to_csv(comp): return ','.join(str(v) for v in comp) + # If path is list, convert to newline delimited string and pass as "paths" (plural) + options.update({ + "bandIndexes": to_csv(band_indexes), + "tileDimensions": to_csv(tile_dimensions) + }) + return df_reader \ + .format("rastersource") \ + .load(path, **options) + + # Patch new method on SparkSession to mirror Scala approach SparkSession.withRasterFrames = _rf_init SparkSession.Builder.withKryoSerialization = _kryo_init # Add the 'asRF' method to pyspark DataFrame -DataFrame.asRF = _convertDF +DataFrame.asRF = _convert_df # Add DataSource convenience methods to the DataFrameReader -# TODO: make sure this supports **options -DataFrameReader.geotiff = lambda df_reader, path: _reader(df_reader, "geotiff", path) -DataFrameReader.geotrellis = lambda df_reader, path: _reader(df_reader, "geotrellis", path) -DataFrameReader.rastersource = lambda df_reader, path: _reader(df_reader, "rastersource", path) - - +DataFrameReader.rastersource = _rastersource_reader +# Legacy readers +DataFrameReader.geotiff = lambda df_reader, path: _layer_reader(df_reader, "geotiff", path) +DataFrameReader.geotrellis = lambda df_reader, path: _layer_reader(df_reader, "geotrellis", path) diff --git a/pyrasterframes/python/pyrasterframes/context.py b/pyrasterframes/python/pyrasterframes/context.py index f6d307475..ba28a6bb9 100644 --- a/pyrasterframes/python/pyrasterframes/context.py +++ b/pyrasterframes/python/pyrasterframes/context.py @@ -25,6 +25,9 @@ def list_to_seq(self, py_list): def lookup(self, function_name): return getattr(self._jrfctx, function_name) + def build_info(self): + return self._jrfctx.buildInfo() + @staticmethod def active(): """ diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 559ef690e..102f7e247 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -245,7 +245,8 @@ def _(data_tile, mask_tile, mask_value): 'rf_exp10': 'Compute 10 to the power of cell values', 'rf_expm1': 'Performs cell-wise exponential, then subtract one', 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', - 'st_extent': 'Compute the extent/bbox of a Geometry', + 'rf_crs': 'Get the CRS of a RasterSource or ProjectedRasterTile', + 'st_extent': 'Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)', 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', 'st_geometry': 'Convert the given extent/bbox to a polygon', 'rf_geometry': 'Get the extent of a RasterSource or ProjectdRasterTile as a Geometry', diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/rf_types.py similarity index 100% rename from pyrasterframes/python/pyrasterframes/types.py rename to pyrasterframes/python/pyrasterframes/rf_types.py diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 6ef010301..b0fc2aecc 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -1,4 +1,3 @@ - from pyspark.sql import SparkSession, Column from pyspark.sql.functions import * from pyrasterframes import * @@ -10,6 +9,7 @@ # version-conditional imports import sys + if sys.version_info[0] > 2: import builtins else: @@ -25,7 +25,6 @@ class RasterFunctionsTest(unittest.TestCase): @classmethod def setUpClass(cls): - # gather Scala requirements jarpath = list(Path('../target/scala-2.11').resolve().glob('pyrasterframes-assembly*.jar'))[0] @@ -34,16 +33,18 @@ def setUpClass(cls): # spark session with RF cls.spark = (SparkSession.builder - .config('spark.driver.extraClassPath', jarpath) - .config('spark.executor.extraClassPath', jarpath) - .withKryoSerialization() - .getOrCreate()) + .config('spark.driver.extraClassPath', jarpath) + .config('spark.executor.extraClassPath', jarpath) + .withKryoSerialization() + .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') print(cls.spark.version) cls.spark.withRasterFrames() + cls.img_uri = cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri() + # load something into a rasterframe - rf = cls.spark.read.geotiff(cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri()) \ + rf = cls.spark.read.geotiff(cls.img_uri) \ .withBounds() \ .withCenter() @@ -52,10 +53,11 @@ def setUpClass(cls): cls.rf = rf.withColumn('tile2', rf_convert_cell_type(cls.tileCol, 'float32')) \ .drop(cls.tileCol) \ .withColumnRenamed('tile2', cls.tileCol).asRF() - #cls.rf.show() + # cls.rf.show() def test_setup(self): - self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") + self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), + "org.apache.spark.serializer.KryoSerializer") def test_identify_columns(self): cols = self.rf.tileColumns() @@ -70,7 +72,8 @@ def test_identify_columns(self): def test_tile_creation(self): base = self.spark.createDataFrame([1, 2, 3, 4], 'integer') - tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), rf_make_ones_tile(3, 3, "int32")) + tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), + rf_make_ones_tile(3, 3, "int32")) tiles.show() self.assertEqual(tiles.count(), 4) @@ -89,11 +92,10 @@ def test_tile_operations(self): self.assertTrue(_rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) - - def test_general(self): + def test_tile_functions(self): meta = self.rf.tileLayerMetadata() self.assertIsNotNone(meta['bounds']) - df = self.rf.withColumn('dims', rf_dimensions(self.tileCol)) \ + df = self.rf.withColumn('dims', rf_dimensions(self.tileCol)) \ .withColumn('type', rf_cell_type(self.tileCol)) \ .withColumn('dCells', rf_data_cells(self.tileCol)) \ .withColumn('ndCells', rf_no_data_cells(self.tileCol)) \ @@ -113,6 +115,11 @@ def test_general(self): # a source of ProjectedRasterTiles. df.show() + def test_prt_functions(self): + df = self.spark.read.rastersource(self.img_uri) + df.printSchema + df.show() + def test_rasterize(self): # NB: This test just makes sure rf_rasterize runs, not that the results are correct. withRaster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) @@ -139,12 +146,10 @@ def test_aggregations(self): self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) - def test_sql(self): - self.rf.createOrReplaceTempView("rf") - dims = self.rf.withColumn('dims', rf_dimensions(self.tileCol)).first().dims + dims = self.rf.withColumn('dims', rf_dimensions(self.tileCol)).first().dims dims_str = """{}, {}""".format(dims.cols, dims.rows) self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, @@ -159,11 +164,11 @@ def test_sql(self): ops.printSchema statsRow = ops.select(rf_tile_mean(self.tileCol).alias('base'), - rf_tile_mean("AndOne").alias('plus_one'), - rf_tile_mean("LessOne").alias('minus_one'), - rf_tile_mean("TimesTwo").alias('double'), - rf_tile_mean("OverTwo").alias('half')) \ - .first() + rf_tile_mean("AndOne").alias('plus_one'), + rf_tile_mean("LessOne").alias('minus_one'), + rf_tile_mean("TimesTwo").alias('double'), + rf_tile_mean("OverTwo").alias('half')) \ + .first() self.assertTrue(_rounded_compare(statsRow.base, statsRow.plus_one - 1)) self.assertTrue(_rounded_compare(statsRow.base, statsRow.minus_one + 1)) @@ -178,10 +183,10 @@ def test_explode(self): # +-----------+------------+---------+-------+ # |[2,1] |4 |0 |10150.0| cell = self.rf.select(self.rf.spatialKeyColumn(), rf_explode_tiles(self.rf.tile)) \ - .where(F.col("spatial_key.col")==2) \ - .where(F.col("spatial_key.row")==1) \ - .where(F.col("column_index")==4) \ - .where(F.col("row_index")==0) \ + .where(F.col("spatial_key.col") == 2) \ + .where(F.col("spatial_key.row") == 1) \ + .where(F.col("column_index") == 4) \ + .where(F.col("row_index") == 0) \ .select(F.col("tile")) \ .collect()[0][0] self.assertEqual(cell, 10150.0) @@ -193,7 +198,6 @@ def test_explode(self): self.assertTrue(sample_count > 0) self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room - def test_mask_by_value(self): from pyspark.sql.functions import lit @@ -205,13 +209,12 @@ def test_mask_by_value(self): rf_convert_cell_type( rf_local_greater_int(self.rf.tile, 25000), "uint8"), - lit(mask_value)).alias('mask')) + lit(mask_value)).alias('mask')) rf2 = rf1.select(rf1.tile, rf_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) result = rf2.agg(rf_agg_no_data_cells(rf2.tile) < rf_agg_no_data_cells(rf2.masked)) \ .collect()[0][0] self.assertTrue(result) - def test_resample(self): from pyspark.sql.functions import lit result = self.rf.select( @@ -235,7 +238,6 @@ def test_exists_for_all(self): self.assertTrue(df.select(rf_for_all(df.should_exist).alias('se')).take(1)[0].se) self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) - def test_geomesa_pyspark(self): from pyspark.sql.functions import lit, udf, sum import shapely @@ -278,7 +280,6 @@ def some_point(g): ).alias('s')).collect()[0].s self.assertTrue(intersect_total == df.count()) - # Collect to python driver in shapely UDT pandas_df_out = df.toPandas() @@ -291,7 +292,7 @@ def some_point(g): self.assertTrue(all(xs_correct)) centroid_ys = pandas_df_out.poly_geom.apply(lambda g: - g.centroid.coords[0][1]).tolist() + g.centroid.coords[0][1]).tolist() numpy.testing.assert_almost_equal(centroid_ys, pandas_df.y.tolist()) # Including from UDF's @@ -304,7 +305,6 @@ def some_point(g): pandas_df_out.poly_len.values ) - def test_raster_source_reader(self): import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run @@ -317,15 +317,15 @@ def l8path(b): path_param = '\n'.join([l8path(b) for b in [1, 2, 3]]) # "http://foo.com/file1.tif,http://foo.com/file2.tif" tile_size = 512 df = self.spark.read.format('rastersource') \ - .options(paths=path_param, tileDimensions='{},{}'.format(tile_size, tile_size)) \ - .load() + .options(paths=path_param, tileDimensions='{},{}'.format(tile_size, tile_size)) \ + .load() # schema is tile_path and tile df.printSchema() self.assertTrue(len(df.columns) == 2 and 'tile_path' in df.columns and 'tile' in df.columns) # the most common tile dimensions should be as passed to `options`, showing that options are correctly applied - tile_size_df = df.select(rf_dimensions(df.tile).rows.alias('r'), rf_dimensions(df.tile).cols.alias('c'))\ + tile_size_df = df.select(rf_dimensions(df.tile).rows.alias('r'), rf_dimensions(df.tile).cols.alias('c')) \ .groupby(['r', 'c']).count().toPandas() most_common_size = tile_size_df.loc[tile_size_df['count'].idxmax()] self.assertTrue(most_common_size.r == tile_size and most_common_size.c == tile_size) @@ -360,10 +360,11 @@ def path(scene, band): path_table = self.spark.createDataFrame(path_pandas) path_table.createOrReplaceTempView(path_table_hive_name) - path_df = self.spark.read.format('rastersource') \ - .options(pathTable=path_table_hive_name, pathTableColumns=csv_columns, - tileDimensions='512,512') \ - .load() + path_df = self.spark.read.rastersource( + tile_dimensions=(512, 512), + pathTable=path_table_hive_name, + pathTableColumns=csv_columns, + ) path_df.printSchema() self.assertTrue(len(path_df.columns) == 6) # three bands times {path, tile} @@ -377,4 +378,5 @@ def suite(): function_tests = unittest.TestSuite() return function_tests + unittest.TextTestRunner().run(suite()) diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 981cbac32..660c30e60 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -40,6 +40,14 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions sparkSession.withRasterFrames + def buildInfo(): java.util.HashMap[String, String] = { + val retval = new java.util.HashMap[String, String]() + RFBuildInfo.toMap.foreach { + case (k, v) => retval.put(k, String.valueOf(v)) + } + retval + } + def toSpatialMultibandTileLayerRDD(rf: RasterFrame): MultibandTileLayerRDD[SpatialKey] = rf.toMultibandTileLayerRDD match { case Left(spatial) => spatial diff --git a/rf-notebook/README.md b/rf-notebook/README.md new file mode 100644 index 000000000..5295b9cc5 --- /dev/null +++ b/rf-notebook/README.md @@ -0,0 +1,32 @@ +# RasterFrames Jupyter Notebook Docker Image + +RasterFrames provides a Docker image with a Jupyter Notebook pre-configured with RasterFrames in the PySpark kernel. + +## Launching RasterFrames Notebook from Source + +First, have Docker installed. + +Then, from the source root directory, run + +```bash +sbt rf-notebook/startRFNotebook +``` + +This will build the project, create a Docker image, and start an instance. + +To stop it: + +```bash +sbt rf-notebook/stopRFNotebook +``` + +The above commands are just conveniences. The real work is done by `docker-compose` via the [`docker-compose.yml`](src/main/docker/docker-compose.yml) file in `rf-notebook/src/main/docker/docker-compose.yml`. By default it exposes and binds to ports `8888` and `4040-4044`. + + +## Docker Image Build + +If you just want to build the image: + +```bash +sbt rf-notebook/publishLocal +``` diff --git a/rf-notebook/build.sbt b/rf-notebook/build.sbt new file mode 100644 index 000000000..7c94d8271 --- /dev/null +++ b/rf-notebook/build.sbt @@ -0,0 +1,55 @@ +import sbt.{IO, _} + +import scala.sys.process.Process + +Docker / packageName := "rasterframes-notebook" + +Docker / version := version.value + +Docker / maintainer := organization.value + +Docker / sourceDirectory := baseDirectory.value / "src"/ "main" / "docker" + +Docker / target := target.value / "docker" + +dockerUpdateLatest := true + +Docker / mappings := { + val dockerSrc = (Docker / sourceDirectory).value + val dockerAssets = (dockerSrc ** "*") pair Path.relativeTo(dockerSrc) + + val jar = assembly.value + + val py = (LocalProject("pyrasterframes") / Python / packageBin).value + + dockerAssets ++ Seq(jar -> jar.getName, py -> py.getName) +} + +// This bypasses the standard DockerPlugin DSL-based Dockerfile construction +// and just copies the separate, external one. +Docker / dockerGenerateConfig := (Docker / sourceDirectory).value / "Dockerfile" + +// Save a bit of typing... +publishLocal := (Docker / publishLocal).value + +// -----== Conveniences ==----- + +lazy val startRFNotebook = Def.taskKey[Unit]("Build and run a RasterFrames Notebook Docker container") +lazy val quickStartRFNotebook = Def.taskKey[Unit]("Run RasterFrames Notebook Docker container without building it first") +lazy val stopRFNotebook = Def.taskKey[Unit]("Stop a running RasterFrames Notebook instance") + +startRFNotebook := { + val _ = (Docker / publishLocal).value + val staging = (Docker / stagingDirectory).value + Process("docker-compose up --force-recreate -d", staging).! +} + +quickStartRFNotebook := { + val staging = (Docker / stagingDirectory).value + Process("docker-compose up --force-recreate -d", staging).! +} + +stopRFNotebook := { + val staging = (Docker / stagingDirectory).value + Process("docker-compose down", staging).! +} diff --git a/rf-notebook/src/main/docker/Dockerfile b/rf-notebook/src/main/docker/Dockerfile new file mode 100644 index 000000000..be5a2adeb --- /dev/null +++ b/rf-notebook/src/main/docker/Dockerfile @@ -0,0 +1,45 @@ +FROM s22s/pyspark-notebook:spark-2.3.3-hadoop-2.7 + +MAINTAINER Astraea, Inc. + +ENV RF_LIB_LOC /usr/local/rasterframes +ENV RF_JAR $RF_LIB_LOC/rasterframes.jar +ENV PY_RF_ZIP $RF_LIB_LOC/pyrasterframes.zip + +USER root + +RUN mkdir $RF_LIB_LOC + +RUN echo "spark.driver.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-defaults.conf && \ + echo "spark.executor.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-defaults.conf + +EXPOSE 4040 4041 4042 4043 4044 + +ENV SPARK_OPTS $SPARK_OPTS \ + --py-files $PY_RF_ZIP \ + --jars $RF_JAR \ + --driver-class-path $RF_JAR \ + --conf spark.executor.extraClassPath=$RF_JAR + +ENV PYTHONPATH $PYTHONPATH:$PY_RF_ZIP + +# Sphinx (for Notebook->html) +RUN conda install --quiet --yes \ + anaconda sphinx nbsphinx shapely numpy + +# Cleanup pip residuals +RUN rm -rf /home/$NB_USER/.local && \ + fix-permissions $CONDA_DIR && \ + fix-permissions /home/$NB_USER + +# Do these after the standard environment setup +# since these change more regularly. +COPY *.zip $PY_RF_ZIP +COPY *.jar $RF_JAR + +RUN chown -R $NB_UID:$NB_GID $HOME + +USER $NB_UID + +COPY jupyter_notebook_config.py $HOME/.jupyter + diff --git a/deployment/docker/jupyter/docker-compose.yml b/rf-notebook/src/main/docker/docker-compose.yml similarity index 67% rename from deployment/docker/jupyter/docker-compose.yml rename to rf-notebook/src/main/docker/docker-compose.yml index 29f311c0f..a093ca7fd 100644 --- a/deployment/docker/jupyter/docker-compose.yml +++ b/rf-notebook/src/main/docker/docker-compose.yml @@ -1,9 +1,8 @@ version: '3' services: - rasterframes-notebooks: - build: . - image: s22s/rasterframes-notebooks + rasterframes-notebook: + image: rasterframes-notebook ports: # jupyter notebook port - "8888:8888" @@ -14,5 +13,5 @@ services: - "4043:4043" - "4044:4044" # To save locally at './work' from the container: -# volumes: -# - ./work:/home/jovyan/work \ No newline at end of file + volumes: + - ../../../src/main/notebooks:/home/jovyan/work \ No newline at end of file diff --git a/rf-notebook/src/main/docker/jupyter_notebook_config.py b/rf-notebook/src/main/docker/jupyter_notebook_config.py new file mode 100644 index 000000000..ceb183c50 --- /dev/null +++ b/rf-notebook/src/main/docker/jupyter_notebook_config.py @@ -0,0 +1,766 @@ +# Configuration file for PyRasterFrames-enabled jupyter-notebook. + +#------------------------------------------------------------------------------ +# Application(SingletonConfigurable) configuration +#------------------------------------------------------------------------------ + +## This is an application. + +## The date format used by logging formatters for %(asctime)s +#c.Application.log_datefmt = '%Y-%m-%d %H:%M:%S' + +## The Logging format template +#c.Application.log_format = '[%(name)s]%(highlevel)s %(message)s' + +## Set the log level by value or name. +#c.Application.log_level = 30 + +#------------------------------------------------------------------------------ +# JupyterApp(Application) configuration +#------------------------------------------------------------------------------ + +## Base class for Jupyter applications + +## Answer yes to any prompts. +#c.JupyterApp.answer_yes = False + +## Full path of a config file. +#c.JupyterApp.config_file = '' + +## Specify a config file to load. +#c.JupyterApp.config_file_name = '' + +## Generate default config file. +#c.JupyterApp.generate_config = False + +#------------------------------------------------------------------------------ +# NotebookApp(JupyterApp) configuration +#------------------------------------------------------------------------------ + +## Set the Access-Control-Allow-Credentials: true header +#c.NotebookApp.allow_credentials = False + +## Set the Access-Control-Allow-Origin header +# +# Use '*' to allow any origin to access your server. +# +# Takes precedence over allow_origin_pat. +#c.NotebookApp.allow_origin = '' + +## Use a regular expression for the Access-Control-Allow-Origin header +# +# Requests from an origin matching the expression will get replies with: +# +# Access-Control-Allow-Origin: origin +# +# where `origin` is the origin of the request. +# +# Ignored if allow_origin is set. +#c.NotebookApp.allow_origin_pat = '' + +## Allow password to be changed at login for the notebook server. +# +# While loggin in with a token, the notebook server UI will give the opportunity +# to the user to enter a new password at the same time that will replace the +# token login mechanism. +# +# This can be set to false to prevent changing password from the UI/API. +#c.NotebookApp.allow_password_change = True + +## Allow requests where the Host header doesn't point to a local server +# +# By default, requests get a 403 forbidden response if the 'Host' header shows +# that the browser thinks it's on a non-local domain. Setting this option to +# True disables this check. +# +# This protects against 'DNS rebinding' attacks, where a remote web server +# serves you a page and then changes its DNS to send later requests to a local +# IP, bypassing same-origin checks. +# +# Local IP addresses (such as 127.0.0.1 and ::1) are allowed as local, along +# with hostnames configured in local_hostnames. +#c.NotebookApp.allow_remote_access = False + +## Whether to allow the user to run the notebook as root. +#c.NotebookApp.allow_root = False + +## DEPRECATED use base_url +#c.NotebookApp.base_project_url = '/' + +## The base URL for the notebook server. +# +# Leading and trailing slashes can be omitted, and will automatically be added. +#c.NotebookApp.base_url = '/' + +## Specify what command to use to invoke a web browser when opening the notebook. +# If not specified, the default browser will be determined by the `webbrowser` +# standard library module, which allows setting of the BROWSER environment +# variable to override it. +#c.NotebookApp.browser = '' + +## The full path to an SSL/TLS certificate file. +#c.NotebookApp.certfile = '' + +## The full path to a certificate authority certificate for SSL/TLS client +# authentication. +#c.NotebookApp.client_ca = '' + +## The config manager class to use +#c.NotebookApp.config_manager_class = 'notebook.services.config.manager.ConfigManager' + +## The notebook manager class to use. +#c.NotebookApp.contents_manager_class = 'notebook.services.contents.largefilemanager.LargeFileManager' + +## Extra keyword arguments to pass to `set_secure_cookie`. See tornado's +# set_secure_cookie docs for details. +#c.NotebookApp.cookie_options = {} + +## The random bytes used to secure cookies. By default this is a new random +# number every time you start the Notebook. Set it to a value in a config file +# to enable logins to persist across server sessions. +# +# Note: Cookie secrets should be kept private, do not share config files with +# cookie_secret stored in plaintext (you can read the value from a file). +#c.NotebookApp.cookie_secret = b'' + +## The file where the cookie secret is stored. +#c.NotebookApp.cookie_secret_file = '' + +## Override URL shown to users. +# +# Replace actual URL, including protocol, address, port and base URL, with the +# given value when displaying URL to the users. Do not change the actual +# connection URL. If authentication token is enabled, the token is added to the +# custom URL automatically. +# +# This option is intended to be used when the URL to display to the user cannot +# be determined reliably by the Jupyter notebook server (proxified or +# containerized setups for example). +#c.NotebookApp.custom_display_url = '' + +## The default URL to redirect to from `/` +#c.NotebookApp.default_url = '/tree' + +## Disable cross-site-request-forgery protection +# +# Jupyter notebook 4.3.1 introduces protection from cross-site request +# forgeries, requiring API requests to either: +# +# - originate from pages served by this server (validated with XSRF cookie and +# token), or - authenticate with a token +# +# Some anonymous compute resources still desire the ability to run code, +# completely without authentication. These services can disable all +# authentication and security checks, with the full knowledge of what that +# implies. +#c.NotebookApp.disable_check_xsrf = False + +## Whether to enable MathJax for typesetting math/TeX +# +# MathJax is the javascript library Jupyter uses to render math/LaTeX. It is +# very large, so you may want to disable it if you have a slow internet +# connection, or for offline use of the notebook. +# +# When disabled, equations etc. will appear as their untransformed TeX source. +#c.NotebookApp.enable_mathjax = True + +## extra paths to look for Javascript notebook extensions +#c.NotebookApp.extra_nbextensions_path = [] + +## handlers that should be loaded at higher priority than the default services +#c.NotebookApp.extra_services = [] + +## Extra paths to search for serving static files. +# +# This allows adding javascript/css to be available from the notebook server +# machine, or overriding individual files in the IPython +#c.NotebookApp.extra_static_paths = [] + +## Extra paths to search for serving jinja templates. +# +# Can be used to override templates from notebook.templates. +#c.NotebookApp.extra_template_paths = [] + +## +#c.NotebookApp.file_to_run = '' + +## Extra keyword arguments to pass to `get_secure_cookie`. See tornado's +# get_secure_cookie docs for details. +#c.NotebookApp.get_secure_cookie_kwargs = {} + +## Deprecated: Use minified JS file or not, mainly use during dev to avoid JS +# recompilation +#c.NotebookApp.ignore_minified_js = False + +## (bytes/sec) Maximum rate at which stream output can be sent on iopub before +# they are limited. +#c.NotebookApp.iopub_data_rate_limit = 1000000 + +## (msgs/sec) Maximum rate at which messages can be sent on iopub before they are +# limited. +#c.NotebookApp.iopub_msg_rate_limit = 1000 + +## The IP address the notebook server will listen on. +# c.NotebookApp.ip = 'localhost' + +## Supply extra arguments that will be passed to Jinja environment. +#c.NotebookApp.jinja_environment_options = {} + +## Extra variables to supply to jinja templates when rendering. +#c.NotebookApp.jinja_template_vars = {} + +## The kernel manager class to use. +#c.NotebookApp.kernel_manager_class = 'notebook.services.kernels.kernelmanager.MappingKernelManager' + +## The kernel spec manager class to use. Should be a subclass of +# `jupyter_client.kernelspec.KernelSpecManager`. +# +# The Api of KernelSpecManager is provisional and might change without warning +# between this version of Jupyter and the next stable one. +#c.NotebookApp.kernel_spec_manager_class = 'jupyter_client.kernelspec.KernelSpecManager' + +## The full path to a private key file for usage with SSL/TLS. +#c.NotebookApp.keyfile = '' + +## Hostnames to allow as local when allow_remote_access is False. +# +# Local IP addresses (such as 127.0.0.1 and ::1) are automatically accepted as +# local as well. +#c.NotebookApp.local_hostnames = ['localhost'] + +## The login handler class to use. +#c.NotebookApp.login_handler_class = 'notebook.auth.login.LoginHandler' + +## The logout handler class to use. +#c.NotebookApp.logout_handler_class = 'notebook.auth.logout.LogoutHandler' + +## The MathJax.js configuration file that is to be used. +#c.NotebookApp.mathjax_config = 'TeX-AMS-MML_HTMLorMML-full,Safe' + +## A custom url for MathJax.js. Should be in the form of a case-sensitive url to +# MathJax, for example: /static/components/MathJax/MathJax.js +#c.NotebookApp.mathjax_url = '' + +## Sets the maximum allowed size of the client request body, specified in the +# Content-Length request header field. If the size in a request exceeds the +# configured value, a malformed HTTP message is returned to the client. +# +# Note: max_body_size is applied even in streaming mode. +#c.NotebookApp.max_body_size = 536870912 + +## Gets or sets the maximum amount of memory, in bytes, that is allocated for +# use by the buffer manager. +#c.NotebookApp.max_buffer_size = 536870912 + +## Dict of Python modules to load as notebook server extensions.Entry values can +# be used to enable and disable the loading ofthe extensions. The extensions +# will be loaded in alphabetical order. +#c.NotebookApp.nbserver_extensions = {} + +## The directory to use for notebooks and kernels. +#c.NotebookApp.notebook_dir = '' + +## Whether to open in a browser after starting. The specific browser used is +# platform dependent and determined by the python standard library `webbrowser` +# module, unless it is overridden using the --browser (NotebookApp.browser) +# configuration option. +#c.NotebookApp.open_browser = True + +## Hashed password to use for web authentication. +# +# To generate, type in a python/IPython shell: +# +# from notebook.auth import passwd; passwd() +# +# The string should be of the form type:salt:hashed-password. +#c.NotebookApp.password = '' + +## Forces users to use a password for the Notebook server. This is useful in a +# multi user environment, for instance when everybody in the LAN can access each +# other's machine through ssh. +# +# In such a case, server the notebook server on localhost is not secure since +# any user can connect to the notebook server via ssh. +#c.NotebookApp.password_required = False + +## The port the notebook server will listen on. +#c.NotebookApp.port = 8888 + +## The number of additional ports to try if the specified port is not available. +#c.NotebookApp.port_retries = 50 + +## DISABLED: use %pylab or %matplotlib in the notebook to enable matplotlib. +#c.NotebookApp.pylab = 'disabled' + +## If True, display a button in the dashboard to quit (shutdown the notebook +# server). +#c.NotebookApp.quit_button = True + +## (sec) Time window used to check the message and data rate limits. +#c.NotebookApp.rate_limit_window = 3 + +## Reraise exceptions encountered loading server extensions? +#c.NotebookApp.reraise_server_extension_failures = False + +## DEPRECATED use the nbserver_extensions dict instead +#c.NotebookApp.server_extensions = [] + +## The session manager class to use. +#c.NotebookApp.session_manager_class = 'notebook.services.sessions.sessionmanager.SessionManager' + +## Shut down the server after N seconds with no kernels or terminals running and +# no activity. This can be used together with culling idle kernels +# (MappingKernelManager.cull_idle_timeout) to shutdown the notebook server when +# it's not in use. This is not precisely timed: it may shut down up to a minute +# later. 0 (the default) disables this automatic shutdown. +#c.NotebookApp.shutdown_no_activity_timeout = 0 + +## Supply SSL options for the tornado HTTPServer. See the tornado docs for +# details. +#c.NotebookApp.ssl_options = {} + +## Supply overrides for terminado. Currently only supports "shell_command". +#c.NotebookApp.terminado_settings = {} + +## Set to False to disable terminals. +# +# This does *not* make the notebook server more secure by itself. Anything the +# user can in a terminal, they can also do in a notebook. +# +# Terminals may also be automatically disabled if the terminado package is not +# available. +#c.NotebookApp.terminals_enabled = True + +## Token used for authenticating first-time connections to the server. +# +# When no password is enabled, the default is to generate a new, random token. +# +# Setting to an empty string disables authentication altogether, which is NOT +# RECOMMENDED. +#c.NotebookApp.token = '' +c.NotebookApp.token = '' + +## Supply overrides for the tornado.web.Application that the Jupyter notebook +# uses. +#c.NotebookApp.tornado_settings = {} + +## Whether to trust or not X-Scheme/X-Forwarded-Proto and X-Real-Ip/X-Forwarded- +# For headerssent by the upstream reverse proxy. Necessary if the proxy handles +# SSL +#c.NotebookApp.trust_xheaders = False + +## DEPRECATED, use tornado_settings +#c.NotebookApp.webapp_settings = {} + +## Specify Where to open the notebook on startup. This is the `new` argument +# passed to the standard library method `webbrowser.open`. The behaviour is not +# guaranteed, but depends on browser support. Valid values are: +# +# - 2 opens a new tab, +# - 1 opens a new window, +# - 0 opens in an existing window. +# +# See the `webbrowser.open` documentation for details. +#c.NotebookApp.webbrowser_open_new = 2 + +## Set the tornado compression options for websocket connections. +# +# This value will be returned from +# :meth:`WebSocketHandler.get_compression_options`. None (default) will disable +# compression. A dict (even an empty one) will enable compression. +# +# See the tornado docs for WebSocketHandler.get_compression_options for details. +#c.NotebookApp.websocket_compression_options = None + +## The base URL for websockets, if it differs from the HTTP server (hint: it +# almost certainly doesn't). +# +# Should be in the form of an HTTP origin: ws[s]://hostname[:port] +#c.NotebookApp.websocket_url = '' + +#------------------------------------------------------------------------------ +# ConnectionFileMixin(LoggingConfigurable) configuration +#------------------------------------------------------------------------------ + +## Mixin for configurable classes that work with connection files + +## JSON file in which to store connection info [default: kernel-.json] +# +# This file will contain the IP, ports, and authentication key needed to connect +# clients to this kernel. By default, this file will be created in the security +# dir of the current profile, but can be specified by absolute path. +#c.ConnectionFileMixin.connection_file = '' + +## set the control (ROUTER) port [default: random] +#c.ConnectionFileMixin.control_port = 0 + +## set the heartbeat port [default: random] +#c.ConnectionFileMixin.hb_port = 0 + +## set the iopub (PUB) port [default: random] +#c.ConnectionFileMixin.iopub_port = 0 + +## Set the kernel's IP address [default localhost]. If the IP address is +# something other than localhost, then Consoles on other machines will be able +# to connect to the Kernel, so be careful! +#c.ConnectionFileMixin.ip = '' + +## set the shell (ROUTER) port [default: random] +#c.ConnectionFileMixin.shell_port = 0 + +## set the stdin (ROUTER) port [default: random] +#c.ConnectionFileMixin.stdin_port = 0 + +## +#c.ConnectionFileMixin.transport = 'tcp' + +#------------------------------------------------------------------------------ +# KernelManager(ConnectionFileMixin) configuration +#------------------------------------------------------------------------------ + +## Manages a single kernel in a subprocess on this host. +# +# This version starts kernels with Popen. + +## Should we autorestart the kernel if it dies. +#c.KernelManager.autorestart = True + +## DEPRECATED: Use kernel_name instead. +# +# The Popen Command to launch the kernel. Override this if you have a custom +# kernel. If kernel_cmd is specified in a configuration file, Jupyter does not +# pass any arguments to the kernel, because it cannot make any assumptions about +# the arguments that the kernel understands. In particular, this means that the +# kernel does not receive the option --debug if it given on the Jupyter command +# line. +#c.KernelManager.kernel_cmd = [] + +## Time to wait for a kernel to terminate before killing it, in seconds. +#c.KernelManager.shutdown_wait_time = 5.0 + +#------------------------------------------------------------------------------ +# Session(Configurable) configuration +#------------------------------------------------------------------------------ + +## Object for handling serialization and sending of messages. +# +# The Session object handles building messages and sending them with ZMQ sockets +# or ZMQStream objects. Objects can communicate with each other over the +# network via Session objects, and only need to work with the dict-based IPython +# message spec. The Session will handle serialization/deserialization, security, +# and metadata. +# +# Sessions support configurable serialization via packer/unpacker traits, and +# signing with HMAC digests via the key/keyfile traits. +# +# Parameters ---------- +# +# debug : bool +# whether to trigger extra debugging statements +# packer/unpacker : str : 'json', 'pickle' or import_string +# importstrings for methods to serialize message parts. If just +# 'json' or 'pickle', predefined JSON and pickle packers will be used. +# Otherwise, the entire importstring must be used. +# +# The functions must accept at least valid JSON input, and output *bytes*. +# +# For example, to use msgpack: +# packer = 'msgpack.packb', unpacker='msgpack.unpackb' +# pack/unpack : callables +# You can also set the pack/unpack callables for serialization directly. +# session : bytes +# the ID of this Session object. The default is to generate a new UUID. +# username : unicode +# username added to message headers. The default is to ask the OS. +# key : bytes +# The key used to initialize an HMAC signature. If unset, messages +# will not be signed or checked. +# keyfile : filepath +# The file containing a key. If this is set, `key` will be initialized +# to the contents of the file. + +## Threshold (in bytes) beyond which an object's buffer should be extracted to +# avoid pickling. +#c.Session.buffer_threshold = 1024 + +## Whether to check PID to protect against calls after fork. +# +# This check can be disabled if fork-safety is handled elsewhere. +#c.Session.check_pid = True + +## Threshold (in bytes) beyond which a buffer should be sent without copying. +#c.Session.copy_threshold = 65536 + +## Debug output in the Session +#c.Session.debug = False + +## The maximum number of digests to remember. +# +# The digest history will be culled when it exceeds this value. +#c.Session.digest_history_size = 65536 + +## The maximum number of items for a container to be introspected for custom +# serialization. Containers larger than this are pickled outright. +#c.Session.item_threshold = 64 + +## execution key, for signing messages. +#c.Session.key = b'' + +## path to file containing execution key. +#c.Session.keyfile = '' + +## Metadata dictionary, which serves as the default top-level metadata dict for +# each message. +#c.Session.metadata = {} + +## The name of the packer for serializing messages. Should be one of 'json', +# 'pickle', or an import name for a custom callable serializer. +#c.Session.packer = 'json' + +## The UUID identifying this session. +#c.Session.session = '' + +## The digest scheme used to construct the message signatures. Must have the form +# 'hmac-HASH'. +#c.Session.signature_scheme = 'hmac-sha256' + +## The name of the unpacker for unserializing messages. Only used with custom +# functions for `packer`. +#c.Session.unpacker = 'json' + +## Username for the Session. Default is your system username. +#c.Session.username = 'username' + +#------------------------------------------------------------------------------ +# MultiKernelManager(LoggingConfigurable) configuration +#------------------------------------------------------------------------------ + +## A class for managing multiple kernels. + +## The name of the default kernel to start +#c.MultiKernelManager.default_kernel_name = 'python3' + +## The kernel manager class. This is configurable to allow subclassing of the +# KernelManager for customized behavior. +#c.MultiKernelManager.kernel_manager_class = 'jupyter_client.ioloop.IOLoopKernelManager' + +#------------------------------------------------------------------------------ +# MappingKernelManager(MultiKernelManager) configuration +#------------------------------------------------------------------------------ + +## A KernelManager that handles notebook mapping and HTTP error handling + +## Whether messages from kernels whose frontends have disconnected should be +# buffered in-memory. +# +# When True (default), messages are buffered and replayed on reconnect, avoiding +# lost messages due to interrupted connectivity. +# +# Disable if long-running kernels will produce too much output while no +# frontends are connected. +#c.MappingKernelManager.buffer_offline_messages = True + +## Whether to consider culling kernels which are busy. Only effective if +# cull_idle_timeout > 0. +#c.MappingKernelManager.cull_busy = False + +## Whether to consider culling kernels which have one or more connections. Only +# effective if cull_idle_timeout > 0. +#c.MappingKernelManager.cull_connected = False + +## Timeout (in seconds) after which a kernel is considered idle and ready to be +# culled. Values of 0 or lower disable culling. Very short timeouts may result +# in kernels being culled for users with poor network connections. +#c.MappingKernelManager.cull_idle_timeout = 0 + +## The interval (in seconds) on which to check for idle kernels exceeding the +# cull timeout value. +#c.MappingKernelManager.cull_interval = 300 + +## Timeout for giving up on a kernel (in seconds). +# +# On starting and restarting kernels, we check whether the kernel is running and +# responsive by sending kernel_info_requests. This sets the timeout in seconds +# for how long the kernel can take before being presumed dead. This affects the +# MappingKernelManager (which handles kernel restarts) and the +# ZMQChannelsHandler (which handles the startup). +#c.MappingKernelManager.kernel_info_timeout = 60 + +## +#c.MappingKernelManager.root_dir = '' + +#------------------------------------------------------------------------------ +# ContentsManager(LoggingConfigurable) configuration +#------------------------------------------------------------------------------ + +## Base class for serving files and directories. +# +# This serves any text or binary file, as well as directories, with special +# handling for JSON notebook documents. +# +# Most APIs take a path argument, which is always an API-style unicode path, and +# always refers to a directory. +# +# - unicode, not url-escaped +# - '/'-separated +# - leading and trailing '/' will be stripped +# - if unspecified, path defaults to '', +# indicating the root path. + +## Allow access to hidden files +#c.ContentsManager.allow_hidden = False + +## +#c.ContentsManager.checkpoints = None + +## +#c.ContentsManager.checkpoints_class = 'notebook.services.contents.checkpoints.Checkpoints' + +## +#c.ContentsManager.checkpoints_kwargs = {} + +## handler class to use when serving raw file requests. +# +# Default is a fallback that talks to the ContentsManager API, which may be +# inefficient, especially for large files. +# +# Local files-based ContentsManagers can use a StaticFileHandler subclass, which +# will be much more efficient. +# +# Access to these files should be Authenticated. +#c.ContentsManager.files_handler_class = 'notebook.files.handlers.FilesHandler' + +## Extra parameters to pass to files_handler_class. +# +# For example, StaticFileHandlers generally expect a `path` argument specifying +# the root directory from which to serve files. +#c.ContentsManager.files_handler_params = {} + +## Glob patterns to hide in file and directory listings. +#c.ContentsManager.hide_globs = ['__pycache__', '*.pyc', '*.pyo', '.DS_Store', '*.so', '*.dylib', '*~'] + +## Python callable or importstring thereof +# +# To be called on a contents model prior to save. +# +# This can be used to process the structure, such as removing notebook outputs +# or other side effects that should not be saved. +# +# It will be called as (all arguments passed by keyword):: +# +# hook(path=path, model=model, contents_manager=self) +# +# - model: the model to be saved. Includes file contents. +# Modifying this dict will affect the file that is stored. +# - path: the API path of the save destination +# - contents_manager: this ContentsManager instance +#c.ContentsManager.pre_save_hook = None + +## +#c.ContentsManager.root_dir = '/' + +## The base name used when creating untitled directories. +#c.ContentsManager.untitled_directory = 'Untitled Folder' + +## The base name used when creating untitled files. +#c.ContentsManager.untitled_file = 'untitled' + +## The base name used when creating untitled notebooks. +#c.ContentsManager.untitled_notebook = 'Untitled' + +#------------------------------------------------------------------------------ +# FileManagerMixin(Configurable) configuration +#------------------------------------------------------------------------------ + +## Mixin for ContentsAPI classes that interact with the filesystem. +# +# Provides facilities for reading, writing, and copying both notebooks and +# generic files. +# +# Shared by FileContentsManager and FileCheckpoints. +# +# Note ---- Classes using this mixin must provide the following attributes: +# +# root_dir : unicode +# A directory against against which API-style paths are to be resolved. +# +# log : logging.Logger + +## By default notebooks are saved on disk on a temporary file and then if +# succefully written, it replaces the old ones. This procedure, namely +# 'atomic_writing', causes some bugs on file system whitout operation order +# enforcement (like some networked fs). If set to False, the new notebook is +# written directly on the old one which could fail (eg: full filesystem or quota +# ) +#c.FileManagerMixin.use_atomic_writing = True + +#------------------------------------------------------------------------------ +# FileContentsManager(FileManagerMixin,ContentsManager) configuration +#------------------------------------------------------------------------------ + +## If True (default), deleting files will send them to the platform's +# trash/recycle bin, where they can be recovered. If False, deleting files +# really deletes them. +#c.FileContentsManager.delete_to_trash = True + +## Python callable or importstring thereof +# +# to be called on the path of a file just saved. +# +# This can be used to process the file on disk, such as converting the notebook +# to a script or HTML via nbconvert. +# +# It will be called as (all arguments passed by keyword):: +# +# hook(os_path=os_path, model=model, contents_manager=instance) +# +# - path: the filesystem path to the file just written - model: the model +# representing the file - contents_manager: this ContentsManager instance +#c.FileContentsManager.post_save_hook = None + +## +#c.FileContentsManager.root_dir = '' + +## DEPRECATED, use post_save_hook. Will be removed in Notebook 5.0 +#c.FileContentsManager.save_script = False + +#------------------------------------------------------------------------------ +# NotebookNotary(LoggingConfigurable) configuration +#------------------------------------------------------------------------------ + +## A class for computing and verifying notebook signatures. + +## The hashing algorithm used to sign notebooks. +#c.NotebookNotary.algorithm = 'sha256' + +## The sqlite file in which to store notebook signatures. By default, this will +# be in your Jupyter data directory. You can set it to ':memory:' to disable +# sqlite writing to the filesystem. +#c.NotebookNotary.db_file = '' + +## The secret key with which notebooks are signed. +#c.NotebookNotary.secret = b'' + +## The file where the secret key is stored. +#c.NotebookNotary.secret_file = '' + +## A callable returning the storage backend for notebook signatures. The default +# uses an SQLite database. +#c.NotebookNotary.store_factory = traitlets.Undefined + +#------------------------------------------------------------------------------ +# KernelSpecManager(LoggingConfigurable) configuration +#------------------------------------------------------------------------------ + +## If there is no Python kernelspec registered and the IPython kernel is +# available, ensure it is added to the spec list. +#c.KernelSpecManager.ensure_native_kernel = True + +## The kernel spec class. This is configurable to allow subclassing of the +# KernelSpecManager for customized behavior. +#c.KernelSpecManager.kernel_spec_class = 'jupyter_client.kernelspec.KernelSpec' + +## Whitelist of allowed kernel names. +# +# By default, all installed kernels are allowed. +#c.KernelSpecManager.whitelist = set() diff --git a/rf-notebook/src/main/notebooks/Getting Started.ipynb b/rf-notebook/src/main/notebooks/Getting Started.ipynb new file mode 100644 index 000000000..d5d615664 --- /dev/null +++ b/rf-notebook/src/main/notebooks/Getting Started.ipynb @@ -0,0 +1,964 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Getting Started with RasterFrames Notebook" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Setup Spark Environment" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql import SparkSession\n", + "from pyrasterframes import *\n", + "from pyrasterframes.rasterfunctions import *\n", + "\n", + "spark = SparkSession.builder \\\n", + " .withKryoSerialization() \\\n", + " .getOrCreate() \\\n", + " .withRasterFrames()" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "'{\"builtAtMillis\":\"1557330142297\", \"name\":\"core\", \"rfSparkVersion\":\"2.3.2\", \"moduleName\":\"rasterframes\", \"scalaVersion\":\"2.11.12\", \"rfGeoTrellisVersion\":\"2.2.0\", \"version\":\"0.8.0-SNAPSHOT\", \"sbtVersion\":\"1.2.8\", \"builtAtString\":\"2019-05-08 15:42:22.297\", \"rfGeoMesaVersion\":\"2.2.1\"}'" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pyrasterframes import RFContext\n", + "RFContext.active().build_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Read an image" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "href = \"https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\"\n", + "df = spark.read.rastersource(href)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "root\n", + " |-- tile_path: string (nullable = false)\n", + " |-- tile: struct (nullable = true)\n", + " | |-- tileContext: struct (nullable = false)\n", + " | | |-- extent: struct (nullable = false)\n", + " | | | |-- xmin: double (nullable = false)\n", + " | | | |-- ymin: double (nullable = false)\n", + " | | | |-- xmax: double (nullable = false)\n", + " | | | |-- ymax: double (nullable = false)\n", + " | | |-- crs: struct (nullable = false)\n", + " | | | |-- crsProj4: string (nullable = false)\n", + " | |-- tile: tile (nullable = false)\n", + "\n" + ] + } + ], + "source": [ + "df.printSchema()" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "

    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    rf_extent(tile)crs(tile)
    0(14455356.755667, -2342509.0947641465, 1457396...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    1(14573964.81109804, -2342509.0947641465, 14692...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    2(14692572.86652908, -2342509.0947641465, 14811...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    3(14811180.92196012, -2342509.0947641465, 14929...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    4(14929788.97739116, -2342509.0947641465, 15048...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    5(15048397.0328222, -2342509.0947641465, 151670...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    6(15167005.08825324, -2342509.0947641465, 15285...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    7(15285613.14368428, -2342509.0947641465, 15404...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    8(15404221.199115321, -2342509.0947641465, 1552...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    9(15522829.254546361, -2342509.0947641465, 1556...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    10(14455356.755667, -2461117.150195293, 14573964...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    11(14573964.81109804, -2461117.150195293, 146925...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    12(14692572.86652908, -2461117.150195293, 148111...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    13(14811180.92196012, -2461117.150195293, 149297...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    14(14929788.97739116, -2461117.150195293, 150483...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    15(15048397.0328222, -2461117.150195293, 1516700...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    16(15167005.08825324, -2461117.150195293, 152856...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    17(15285613.14368428, -2461117.150195293, 154042...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    18(15404221.199115321, -2461117.150195293, 15522...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    19(15522829.254546361, -2461117.150195293, 15567...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    20(14455356.755667, -2579725.20562644, 14573964....(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    21(14573964.81109804, -2579725.20562644, 1469257...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    22(14692572.86652908, -2579725.20562644, 1481118...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    23(14811180.92196012, -2579725.20562644, 1492978...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    24(14929788.97739116, -2579725.20562644, 1504839...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    25(15048397.0328222, -2579725.20562644, 15167005...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    26(15167005.08825324, -2579725.20562644, 1528561...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    27(15285613.14368428, -2579725.20562644, 1540422...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    28(15404221.199115321, -2579725.20562644, 155228...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    29(15522829.254546361, -2579725.20562644, 155673...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    .........
    70(14455356.755667, -3172765.482782173, 14573964...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    71(14573964.81109804, -3172765.482782173, 146925...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    72(14692572.86652908, -3172765.482782173, 148111...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    73(14811180.92196012, -3172765.482782173, 149297...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    74(14929788.97739116, -3172765.482782173, 150483...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    75(15048397.0328222, -3172765.482782173, 1516700...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    76(15167005.08825324, -3172765.482782173, 152856...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    77(15285613.14368428, -3172765.482782173, 154042...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    78(15404221.199115321, -3172765.482782173, 15522...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    79(15522829.254546361, -3172765.482782173, 15567...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    80(14455356.755667, -3291373.53821332, 14573964....(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    81(14573964.81109804, -3291373.53821332, 1469257...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    82(14692572.86652908, -3291373.53821332, 1481118...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    83(14811180.92196012, -3291373.53821332, 1492978...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    84(14929788.97739116, -3291373.53821332, 1504839...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    85(15048397.0328222, -3291373.53821332, 15167005...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    86(15167005.08825324, -3291373.53821332, 1528561...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    87(15285613.14368428, -3291373.53821332, 1540422...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    88(15404221.199115321, -3291373.53821332, 155228...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    89(15522829.254546361, -3291373.53821332, 155673...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    90(14455356.755667, -3335851.559, 14573964.81109...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    91(14573964.81109804, -3335851.559, 14692572.866...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    92(14692572.86652908, -3335851.559, 14811180.921...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    93(14811180.92196012, -3335851.559, 14929788.977...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    94(14929788.97739116, -3335851.559, 15048397.032...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    95(15048397.0328222, -3335851.559, 15167005.0882...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    96(15167005.08825324, -3335851.559, 15285613.143...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    97(15285613.14368428, -3335851.559, 15404221.199...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    98(15404221.199115321, -3335851.559, 15522829.25...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    99(15522829.254546361, -3335851.559, 15567307.27...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    \n", + "

    100 rows × 2 columns

    \n", + "
    " + ], + "text/plain": [ + " rf_extent(tile) \\\n", + "0 (14455356.755667, -2342509.0947641465, 1457396... \n", + "1 (14573964.81109804, -2342509.0947641465, 14692... \n", + "2 (14692572.86652908, -2342509.0947641465, 14811... \n", + "3 (14811180.92196012, -2342509.0947641465, 14929... \n", + "4 (14929788.97739116, -2342509.0947641465, 15048... \n", + "5 (15048397.0328222, -2342509.0947641465, 151670... \n", + "6 (15167005.08825324, -2342509.0947641465, 15285... \n", + "7 (15285613.14368428, -2342509.0947641465, 15404... \n", + "8 (15404221.199115321, -2342509.0947641465, 1552... \n", + "9 (15522829.254546361, -2342509.0947641465, 1556... \n", + "10 (14455356.755667, -2461117.150195293, 14573964... \n", + "11 (14573964.81109804, -2461117.150195293, 146925... \n", + "12 (14692572.86652908, -2461117.150195293, 148111... \n", + "13 (14811180.92196012, -2461117.150195293, 149297... \n", + "14 (14929788.97739116, -2461117.150195293, 150483... \n", + "15 (15048397.0328222, -2461117.150195293, 1516700... \n", + "16 (15167005.08825324, -2461117.150195293, 152856... \n", + "17 (15285613.14368428, -2461117.150195293, 154042... \n", + "18 (15404221.199115321, -2461117.150195293, 15522... \n", + "19 (15522829.254546361, -2461117.150195293, 15567... \n", + "20 (14455356.755667, -2579725.20562644, 14573964.... \n", + "21 (14573964.81109804, -2579725.20562644, 1469257... \n", + "22 (14692572.86652908, -2579725.20562644, 1481118... \n", + "23 (14811180.92196012, -2579725.20562644, 1492978... \n", + "24 (14929788.97739116, -2579725.20562644, 1504839... \n", + "25 (15048397.0328222, -2579725.20562644, 15167005... \n", + "26 (15167005.08825324, -2579725.20562644, 1528561... \n", + "27 (15285613.14368428, -2579725.20562644, 1540422... \n", + "28 (15404221.199115321, -2579725.20562644, 155228... \n", + "29 (15522829.254546361, -2579725.20562644, 155673... \n", + ".. ... \n", + "70 (14455356.755667, -3172765.482782173, 14573964... \n", + "71 (14573964.81109804, -3172765.482782173, 146925... \n", + "72 (14692572.86652908, -3172765.482782173, 148111... \n", + "73 (14811180.92196012, -3172765.482782173, 149297... \n", + "74 (14929788.97739116, -3172765.482782173, 150483... \n", + "75 (15048397.0328222, -3172765.482782173, 1516700... \n", + "76 (15167005.08825324, -3172765.482782173, 152856... \n", + "77 (15285613.14368428, -3172765.482782173, 154042... \n", + "78 (15404221.199115321, -3172765.482782173, 15522... \n", + "79 (15522829.254546361, -3172765.482782173, 15567... \n", + "80 (14455356.755667, -3291373.53821332, 14573964.... \n", + "81 (14573964.81109804, -3291373.53821332, 1469257... \n", + "82 (14692572.86652908, -3291373.53821332, 1481118... \n", + "83 (14811180.92196012, -3291373.53821332, 1492978... \n", + "84 (14929788.97739116, -3291373.53821332, 1504839... \n", + "85 (15048397.0328222, -3291373.53821332, 15167005... \n", + "86 (15167005.08825324, -3291373.53821332, 1528561... \n", + "87 (15285613.14368428, -3291373.53821332, 1540422... \n", + "88 (15404221.199115321, -3291373.53821332, 155228... \n", + "89 (15522829.254546361, -3291373.53821332, 155673... \n", + "90 (14455356.755667, -3335851.559, 14573964.81109... \n", + "91 (14573964.81109804, -3335851.559, 14692572.866... \n", + "92 (14692572.86652908, -3335851.559, 14811180.921... \n", + "93 (14811180.92196012, -3335851.559, 14929788.977... \n", + "94 (14929788.97739116, -3335851.559, 15048397.032... \n", + "95 (15048397.0328222, -3335851.559, 15167005.0882... \n", + "96 (15167005.08825324, -3335851.559, 15285613.143... \n", + "97 (15285613.14368428, -3335851.559, 15404221.199... \n", + "98 (15404221.199115321, -3335851.559, 15522829.25... \n", + "99 (15522829.254546361, -3335851.559, 15567307.27... \n", + "\n", + " crs(tile) \n", + "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "10 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "11 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "12 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "13 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "14 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "15 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "16 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "17 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "18 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "19 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "20 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "21 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "22 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "23 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "24 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "25 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "26 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "27 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "28 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "29 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + ".. ... \n", + "70 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "71 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "72 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "73 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "74 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "75 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "76 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "77 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "78 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "79 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "80 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "81 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "82 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "83 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "84 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "85 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "86 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "87 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "88 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "89 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "90 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "91 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "92 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "93 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "94 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "95 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "96 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "97 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "98 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "99 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "\n", + "[100 rows x 2 columns]" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.select(rf_extent(\"tile\"), rf_crs(\"tile\")).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    tile
    0(((14455356.755667, -2342509.0947641465, 14573...
    1(((14573964.81109804, -2342509.0947641465, 146...
    2(((14692572.86652908, -2342509.0947641465, 148...
    3(((14811180.92196012, -2342509.0947641465, 149...
    4(((14929788.97739116, -2342509.0947641465, 150...
    5(((15048397.0328222, -2342509.0947641465, 1516...
    6(((15167005.08825324, -2342509.0947641465, 152...
    7(((15285613.14368428, -2342509.0947641465, 154...
    8(((15404221.199115321, -2342509.0947641465, 15...
    9(((15522829.254546361, -2342509.0947641465, 15...
    10(((14455356.755667, -2461117.150195293, 145739...
    11(((14573964.81109804, -2461117.150195293, 1469...
    12(((14692572.86652908, -2461117.150195293, 1481...
    13(((14811180.92196012, -2461117.150195293, 1492...
    14(((14929788.97739116, -2461117.150195293, 1504...
    15(((15048397.0328222, -2461117.150195293, 15167...
    16(((15167005.08825324, -2461117.150195293, 1528...
    17(((15285613.14368428, -2461117.150195293, 1540...
    18(((15404221.199115321, -2461117.150195293, 155...
    19(((15522829.254546361, -2461117.150195293, 155...
    20(((14455356.755667, -2579725.20562644, 1457396...
    21(((14573964.81109804, -2579725.20562644, 14692...
    22(((14692572.86652908, -2579725.20562644, 14811...
    23(((14811180.92196012, -2579725.20562644, 14929...
    24(((14929788.97739116, -2579725.20562644, 15048...
    25(((15048397.0328222, -2579725.20562644, 151670...
    26(((15167005.08825324, -2579725.20562644, 15285...
    27(((15285613.14368428, -2579725.20562644, 15404...
    28(((15404221.199115321, -2579725.20562644, 1552...
    29(((15522829.254546361, -2579725.20562644, 1556...
    ......
    70(((14455356.755667, -3172765.482782173, 145739...
    71(((14573964.81109804, -3172765.482782173, 1469...
    72(((14692572.86652908, -3172765.482782173, 1481...
    73(((14811180.92196012, -3172765.482782173, 1492...
    74(((14929788.97739116, -3172765.482782173, 1504...
    75(((15048397.0328222, -3172765.482782173, 15167...
    76(((15167005.08825324, -3172765.482782173, 1528...
    77(((15285613.14368428, -3172765.482782173, 1540...
    78(((15404221.199115321, -3172765.482782173, 155...
    79(((15522829.254546361, -3172765.482782173, 155...
    80(((14455356.755667, -3291373.53821332, 1457396...
    81(((14573964.81109804, -3291373.53821332, 14692...
    82(((14692572.86652908, -3291373.53821332, 14811...
    83(((14811180.92196012, -3291373.53821332, 14929...
    84(((14929788.97739116, -3291373.53821332, 15048...
    85(((15048397.0328222, -3291373.53821332, 151670...
    86(((15167005.08825324, -3291373.53821332, 15285...
    87(((15285613.14368428, -3291373.53821332, 15404...
    88(((15404221.199115321, -3291373.53821332, 1552...
    89(((15522829.254546361, -3291373.53821332, 1556...
    90(((14455356.755667, -3335851.559, 14573964.811...
    91(((14573964.81109804, -3335851.559, 14692572.8...
    92(((14692572.86652908, -3335851.559, 14811180.9...
    93(((14811180.92196012, -3335851.559, 14929788.9...
    94(((14929788.97739116, -3335851.559, 15048397.0...
    95(((15048397.0328222, -3335851.559, 15167005.08...
    96(((15167005.08825324, -3335851.559, 15285613.1...
    97(((15285613.14368428, -3335851.559, 15404221.1...
    98(((15404221.199115321, -3335851.559, 15522829....
    99(((15522829.254546361, -3335851.559, 15567307....
    \n", + "

    100 rows × 1 columns

    \n", + "
    " + ], + "text/plain": [ + " tile\n", + "0 (((14455356.755667, -2342509.0947641465, 14573...\n", + "1 (((14573964.81109804, -2342509.0947641465, 146...\n", + "2 (((14692572.86652908, -2342509.0947641465, 148...\n", + "3 (((14811180.92196012, -2342509.0947641465, 149...\n", + "4 (((14929788.97739116, -2342509.0947641465, 150...\n", + "5 (((15048397.0328222, -2342509.0947641465, 1516...\n", + "6 (((15167005.08825324, -2342509.0947641465, 152...\n", + "7 (((15285613.14368428, -2342509.0947641465, 154...\n", + "8 (((15404221.199115321, -2342509.0947641465, 15...\n", + "9 (((15522829.254546361, -2342509.0947641465, 15...\n", + "10 (((14455356.755667, -2461117.150195293, 145739...\n", + "11 (((14573964.81109804, -2461117.150195293, 1469...\n", + "12 (((14692572.86652908, -2461117.150195293, 1481...\n", + "13 (((14811180.92196012, -2461117.150195293, 1492...\n", + "14 (((14929788.97739116, -2461117.150195293, 1504...\n", + "15 (((15048397.0328222, -2461117.150195293, 15167...\n", + "16 (((15167005.08825324, -2461117.150195293, 1528...\n", + "17 (((15285613.14368428, -2461117.150195293, 1540...\n", + "18 (((15404221.199115321, -2461117.150195293, 155...\n", + "19 (((15522829.254546361, -2461117.150195293, 155...\n", + "20 (((14455356.755667, -2579725.20562644, 1457396...\n", + "21 (((14573964.81109804, -2579725.20562644, 14692...\n", + "22 (((14692572.86652908, -2579725.20562644, 14811...\n", + "23 (((14811180.92196012, -2579725.20562644, 14929...\n", + "24 (((14929788.97739116, -2579725.20562644, 15048...\n", + "25 (((15048397.0328222, -2579725.20562644, 151670...\n", + "26 (((15167005.08825324, -2579725.20562644, 15285...\n", + "27 (((15285613.14368428, -2579725.20562644, 15404...\n", + "28 (((15404221.199115321, -2579725.20562644, 1552...\n", + "29 (((15522829.254546361, -2579725.20562644, 1556...\n", + ".. ...\n", + "70 (((14455356.755667, -3172765.482782173, 145739...\n", + "71 (((14573964.81109804, -3172765.482782173, 1469...\n", + "72 (((14692572.86652908, -3172765.482782173, 1481...\n", + "73 (((14811180.92196012, -3172765.482782173, 1492...\n", + "74 (((14929788.97739116, -3172765.482782173, 1504...\n", + "75 (((15048397.0328222, -3172765.482782173, 15167...\n", + "76 (((15167005.08825324, -3172765.482782173, 1528...\n", + "77 (((15285613.14368428, -3172765.482782173, 1540...\n", + "78 (((15404221.199115321, -3172765.482782173, 155...\n", + "79 (((15522829.254546361, -3172765.482782173, 155...\n", + "80 (((14455356.755667, -3291373.53821332, 1457396...\n", + "81 (((14573964.81109804, -3291373.53821332, 14692...\n", + "82 (((14692572.86652908, -3291373.53821332, 14811...\n", + "83 (((14811180.92196012, -3291373.53821332, 14929...\n", + "84 (((14929788.97739116, -3291373.53821332, 15048...\n", + "85 (((15048397.0328222, -3291373.53821332, 151670...\n", + "86 (((15167005.08825324, -3291373.53821332, 15285...\n", + "87 (((15285613.14368428, -3291373.53821332, 15404...\n", + "88 (((15404221.199115321, -3291373.53821332, 1552...\n", + "89 (((15522829.254546361, -3291373.53821332, 1556...\n", + "90 (((14455356.755667, -3335851.559, 14573964.811...\n", + "91 (((14573964.81109804, -3335851.559, 14692572.8...\n", + "92 (((14692572.86652908, -3335851.559, 14811180.9...\n", + "93 (((14811180.92196012, -3335851.559, 14929788.9...\n", + "94 (((14929788.97739116, -3335851.559, 15048397.0...\n", + "95 (((15048397.0328222, -3335851.559, 15167005.08...\n", + "96 (((15167005.08825324, -3335851.559, 15285613.1...\n", + "97 (((15285613.14368428, -3335851.559, 15404221.1...\n", + "98 (((15404221.199115321, -3335851.559, 15522829....\n", + "99 (((15522829.254546361, -3335851.559, 15567307....\n", + "\n", + "[100 rows x 1 columns]" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.select(\"tile\").toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From b84ec181c506dc88c1bc614023d5c47b1688aed2 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 8 May 2019 20:33:13 -0400 Subject: [PATCH 080/380] Removed non-core Tile attributes from Python-side Tile class. Wrapped CellType into a Python-side convenience class for numpy interop. --- .circleci/config.yml | 4 +- .../apache/spark/sql/rf/RasterSourceUDT.scala | 5 +- pyrasterframes/python/pyrasterframes/types.py | 120 ++++++++---------- .../python/tests/PyRasterFramesTests.py | 20 ++- .../rasterframes/py/PyRFContext.scala | 13 +- 5 files changed, 77 insertions(+), 85 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1fffd77f6..125be0bb5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -69,7 +69,7 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get install python-pip pandoc && pip install setuptools # required for pyrasterframes testing + - run: sudo apt-get update && sudo apt-get install -y python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: *unsetenv @@ -85,7 +85,7 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get install python-pip pandoc && pip install setuptools # required for pyrasterframes testing + - run: sudo apt-get update && sudo apt-get install -y python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: cat /dev/null | sbt publish diff --git a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala index 679da36e9..a5d878798 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala @@ -69,7 +69,7 @@ object RasterSourceUDT { UDTRegistration.register(classOf[RasterSource].getName, classOf[RasterSourceUDT].getName) /** Deserialize a byte array, also used inside the Python API */ - def from(byteArray: Array[Byte]): RasterSource = KryoSupport.deserialize[RasterSource](ByteBuffer.wrap(byteArray)) + def from(byteArray: Array[Byte]): RasterSource = CatalystSerializer.CatalystIO.rowIO.create(byteArray).to[RasterSource] implicit val rasterSourceSerializer: CatalystSerializer[RasterSource] = new CatalystSerializer[RasterSource] { @@ -83,8 +83,7 @@ object RasterSourceUDT { } override def from[R](row: R, io: CatalystIO[R]): RasterSource = { - RasterSourceUDT.from(io.getByteArray(row, 0)) + KryoSupport.deserialize[RasterSource](ByteBuffer.wrap(io.getByteArray(row, 0))) } - } } diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index 1252e603a..40699da33 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -138,57 +138,45 @@ def deserialize(self, datum): bytes(datum[0]) -class Tile: +class GTCellType: + def __init__(self, cell_type_name): + self.cell_type_name = cell_type_name - def __init__(self, array, crs=None, extent=None, band_index=None, ): - # this could be more flexible to allow more ways to access TileUDT - # do some checking on dtype and shape - self.array = array - self.crs = crs # what is a CRS? is it a rasterio.crs.CRS? A pyproj CRS? https://pyproj4.github.io/pyproj/html/api/crs.html#pyproj.crs.CRS.from_string - self.extent = extent - self.band_index = band_index - # here may be okay to carry around the kryo serialized bytes so we can at least go back into the JVM world?: + @classmethod + def from_numpy_dtype(cls, np_dtype): + return GTCellType(str(np_dtype)) + + def to_numpy_dtype(self): + import numpy as np + if self.cell_type_name.endswith("raw"): + return GTCellType(self.cell_type_name[:-3]).to_numpy_dtype() + elif "ud" in self.cell_type_name: + raise Exception("Cell types with user-defined NoData values are not yet implemented.") + else: + # The remaining cell types should be compatible with numpy + return np.dtype(self.cell_type_name) + + def __eq__(self, other): + if type(other) is type(self): + return self.cell_type_name == other.cell_type_name + else: + return False def __str__(self): - return self.array.__str__() + return self.cell_type_name - @classmethod - def numpy_dtype_to_celltype(cls, dtype): - from pyrasterframes.rasterfunctions import _celltype - # TODO implement something that will work generally - # Also here we should convert to a string representation of the celltype - return _celltype(str(dtype)) - def get_cell_type(self): - return self.numpy_dtype_to_celltype(self.array.dtype) +class Tile: + def __init__(self, cells): + self.cells = cells + self.cell_type = GTCellType.from_numpy_dtype(cells.dtype) + + def __str__(self): + return self.cells.__str__() def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames - return [self.array.shape[1], self.array.shape[0]] - - def to_tile_udt(self): - row = [ - # cell_context - [ - ['float64'], #TODO ! - self.dimensions() - ], - # cell_data - [ - # cells -- still too many copies - bytearray(RFContext.call('list_to_bytearray', self.array.flatten().tolist(), *self.dimensions())), - # ref - [ - # cell_data.ref.source - None, - # cell_data.ref.bandIndex - self.band_index, - # cell_data.ref.subextent - self.extent - ] - ] - ] - return row + return [self.cells.shape[1], self.cells.shape[0]] class TileUDT(UserDefinedType): @@ -231,42 +219,44 @@ def scalaUDT(cls): return 'org.apache.spark.sql.rf.TileUDT' def serialize(self, tile): - return tile.to_tile_udt() + row = [ + # cell_context + [ + [tile.cell_type.cell_type_name], + tile.dimensions() + ], + # cell_data + [ + # cells + bytearray(RFContext.call('_list_to_bytearray', tile.cells.flatten().tolist(), *tile.dimensions())), + None + ] + ] + return row def deserialize(self, datum): """ - + Convert catalyst representation of Tile to Python version. NB: This is expensive. :param datum: :return: A Tile object from row data. """ - cell_type = datum.cell_context.cellType.cellTypeName + cell_type = GTCellType(datum.cell_context.cellType.cellTypeName) cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells - cell_value_list = list(RFContext.call('bytearray_to_list', cell_data_bytes, cell_type, cols, rows)) - - crs = None - band_index = None - extent = None - if 'ref' in datum.cell_data and datum.cell_data.ref is not None: - band_index = datum.cell_data.ref.bandIndex - if datum.cell_data.ref.source is not None: - crs = RFContext.call('rastersource_bytearray_to_proj4', datum.cell_data.ref.source) - if datum.cell_data.ref.subextent is not None: - extent = datum.cell_data.ref.subextent - - t = Tile( - numpy.reshape(cell_value_list, (rows, cols), order='C').astype(cell_type), - crs, - extent, - band_index, - ) + + # This is incurring a back-and-forth of the data across the gateway... need to fix. + cell_value_list = list(RFContext.call('_bytearray_to_list', cell_data_bytes, cell_type.cell_type_name, cols, rows)) + as_numpy = numpy.reshape(cell_value_list, (rows, cols), order='C').astype(cell_type.to_numpy_dtype()) + t = Tile(as_numpy) return t deserialize.__safe_for_unpickling__ = True + Tile.__UDT__ = TileUDT() + class TileExploder(JavaTransformer, JavaMLReadable, JavaMLWritable): """ Python wrapper for TileExploder.scala @@ -275,6 +265,7 @@ def __init__(self): super(TileExploder, self).__init__() self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.TileExploder", self.uid) + class NoDataFilter(JavaTransformer, JavaMLReadable, JavaMLWritable): """ Python wrapper for NoDataFilter.scala @@ -282,5 +273,6 @@ class NoDataFilter(JavaTransformer, JavaMLReadable, JavaMLWritable): def __init__(self): super(NoDataFilter, self).__init__() self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.NoDataFilter", self.uid) + def setInputCols(self, values): self._java_obj.setInputCols(values) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index e142ba6b2..15a113be4 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -139,7 +139,6 @@ def test_aggregations(self): self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) - def test_sql(self): self.rf.createOrReplaceTempView("rf") @@ -211,7 +210,6 @@ def test_mask_by_value(self): .collect()[0][0] self.assertTrue(result) - def test_resample(self): from pyspark.sql.functions import lit result = self.rf.select( @@ -303,6 +301,18 @@ def some_point(g): pandas_df_out.poly_len.values ) + def test_cell_type(self): + from pyrasterframes.types import GTCellType + for ct in rf_cell_types(): + wrapped = GTCellType(ct) + self.assertEqual(wrapped.to_numpy_dtype(), + GTCellType.from_numpy_dtype(wrapped.to_numpy_dtype()).to_numpy_dtype(), + "dtype comparison for " + ct) + if "raw" not in ct: + self.assertEqual(wrapped, + GTCellType.from_numpy_dtype(wrapped.to_numpy_dtype()), + "GTCellType comparison for " + ct) + def test_tile_udt(self): import pandas as pd import numpy as np @@ -313,7 +323,7 @@ def test_tile_udt(self): # Try to collect self.rf which is read from a geotiff rf_collect = self.rf.take(2) self.assertTrue( - all([isinstance(row.tile.array, np.ndarray) for row in rf_collect])) + all([isinstance(row.tile.cells, np.ndarray) for row in rf_collect])) # Try to create a tile from numpy. a_tile = Tile(np.random.randn(10, 10)) # no extent and crs provided @@ -328,7 +338,7 @@ def test_tile_udt(self): rf_maybe.printSchema() # Try to do something with it. - sums = to_spark.t.apply(lambda a: a.array.sum()).tolist() + sums = to_spark.t.apply(lambda a: a.cells.sum()).tolist() maybe_sums = rf_maybe.select(rf_tile_sum(rf_maybe.t).alias('tsum')) print("Schema of tile sum") maybe_sums.printSchema() @@ -354,7 +364,7 @@ def test_tile_udt(self): print("Array collected from toPandas output\n", array_back_2) self.assertIsInstance(array_back_2, Tile) - np.testing.assert_equal(array_back_2.array, simple_array.array) + np.testing.assert_equal(array_back_2.cells, simple_array.cells) # test CRS and extent correctly make round trips diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index c06f13415..e03f8f801 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -24,7 +24,6 @@ import geotrellis.raster.{ArrayTile, CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ -import org.apache.spark.sql.rf.RasterSourceUDT import org.locationtech.rasterframes.{RasterFunctions, _} import org.locationtech.rasterframes.model.LazyCRS import spray.json._ @@ -106,11 +105,11 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_explode_tiles_sample(sampleFraction: Double, seed: Long, cols: Column*): Column = rf_explode_tiles_sample(sampleFraction, Some(seed), cols: _*) - def list_to_bytearray(l: java.util.ArrayList[Double], c: Int, r: Int): Array[Byte] = { + def _list_to_bytearray(l: java.util.ArrayList[Double], c: Int, r: Int): Array[Byte] = { geotrellis.raster.ArrayTile(l.asScala.toArray, c, r).toBytes() } - def bytearray_to_list(bytes: Array[Byte], cell_type_name: String, cols: Int, rows: Int): java.util.List[Double] = { + def _bytearray_to_list(bytes: Array[Byte], cell_type_name: String, cols: Int, rows: Int): java.util.List[Double] = { geotrellis.raster.ArrayTile.fromBytes( bytes, geotrellis.raster.CellType.fromName(cell_type_name), @@ -119,18 +118,10 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions ).toListDouble.asJava } - def rastersource_bytearray_to_proj4(bytes: Array[Byte]): String = { - import org.apache.spark.sql.rf.RasterSourceUDT._ - val rasterSource = from(bytes) - return rasterSource.crs.toProj4String - - } - def generate_tile(cellType: String, cols: Int, rows: Int, bytes: Array[Byte]): ArrayTile = { ArrayTile.fromBytes(bytes, this.rf_cell_type(cellType), cols, rows) } - def tileColumns(df: DataFrame): Array[Column] = df.asRF.tileColumns.toArray From 6d8727d015e7b22e230bd3593ac865610297e7e1 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 8 May 2019 21:38:33 -0400 Subject: [PATCH 081/380] One-level reduction in byte array copying, relying on numpy.frombuffer for byte array interpretation. NoData handling not yet implemented. --- .../python/pyrasterframes/rasterfunctions.py | 4 +- pyrasterframes/python/pyrasterframes/types.py | 29 +++++++------ .../python/tests/PyRasterFramesTests.py | 43 ++++++++++++------- .../rasterframes/py/PyRFContext.scala | 19 +------- 4 files changed, 46 insertions(+), 49 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 559ef690e..fb7271254 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -9,7 +9,7 @@ from pyspark.sql.types import * from pyspark.sql.column import Column, _to_java_column from .context import RFContext - +from .types import CellType THIS_MODULE = 'pyrasterframes' @@ -154,7 +154,7 @@ def _(data_tile, mask_tile, mask_value): _rf_unique_functions = { 'rf_array_to_tile': _create_arrayToTile(), 'rf_assemble_tile': _create_assembleTile(), - 'rf_cell_types': lambda: _context_call('rf_cell_types'), + 'rf_cell_types': lambda: [CellType(ct) for ct in _context_call('rf_cell_types')], 'rf_convert_cell_type': _create_convertCellType(), 'rf_explode_tiles': _create_explode_tiles(), 'rf_explode_tiles_sample': _create_explode_tiles_sample(), diff --git a/pyrasterframes/python/pyrasterframes/types.py b/pyrasterframes/python/pyrasterframes/types.py index 40699da33..749c22df0 100644 --- a/pyrasterframes/python/pyrasterframes/types.py +++ b/pyrasterframes/python/pyrasterframes/types.py @@ -12,7 +12,7 @@ class here provides the PyRasterFrames entry point. from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable from .context import RFContext -import numpy +import numpy as np __all__ = ['RasterFrame', 'TileUDT', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] @@ -138,18 +138,17 @@ def deserialize(self, datum): bytes(datum[0]) -class GTCellType: +class CellType: def __init__(self, cell_type_name): self.cell_type_name = cell_type_name @classmethod def from_numpy_dtype(cls, np_dtype): - return GTCellType(str(np_dtype)) + return CellType(str(np_dtype)) def to_numpy_dtype(self): - import numpy as np if self.cell_type_name.endswith("raw"): - return GTCellType(self.cell_type_name[:-3]).to_numpy_dtype() + return CellType(self.cell_type_name[:-3]).to_numpy_dtype() elif "ud" in self.cell_type_name: raise Exception("Cell types with user-defined NoData values are not yet implemented.") else: @@ -169,10 +168,16 @@ def __str__(self): class Tile: def __init__(self, cells): self.cells = cells - self.cell_type = GTCellType.from_numpy_dtype(cells.dtype) + self.cell_type = CellType.from_numpy_dtype(cells.dtype) + + def __eq__(self, other): + if type(other) is type(self): + return np.array_equal(self.cells, other.cells) + else: + return False def __str__(self): - return self.cells.__str__() + return "Tile(\n dimensions={}\n cell_type={}\n cells={}\n)".format(self.dimensions(), self.cell_type, self.cells) def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames @@ -187,7 +192,7 @@ def sqlType(cls): """ return StructType([ StructField("cell_context", StructType([ - StructField("cell_type", StructType([ + StructField("cellType", StructType([ StructField("cellTypeName", StringType(), False) ]), False), StructField("dimensions", StructType([ @@ -228,7 +233,7 @@ def serialize(self, tile): # cell_data [ # cells - bytearray(RFContext.call('_list_to_bytearray', tile.cells.flatten().tolist(), *tile.dimensions())), + bytearray(tile.cells.flatten().tobytes()), None ] ] @@ -240,14 +245,12 @@ def deserialize(self, datum): :param datum: :return: A Tile object from row data. """ - cell_type = GTCellType(datum.cell_context.cellType.cellTypeName) + cell_type = CellType(datum.cell_context.cellType.cellTypeName) cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells - # This is incurring a back-and-forth of the data across the gateway... need to fix. - cell_value_list = list(RFContext.call('_bytearray_to_list', cell_data_bytes, cell_type.cell_type_name, cols, rows)) - as_numpy = numpy.reshape(cell_value_list, (rows, cols), order='C').astype(cell_type.to_numpy_dtype()) + as_numpy = np.frombuffer(cell_data_bytes, dtype=cell_type.to_numpy_dtype()).reshape((rows, cols)) t = Tile(as_numpy) return t diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 15a113be4..c175940d8 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -7,6 +7,8 @@ from pathlib import Path import os import unittest +from pyrasterframes.types import Tile +import numpy as np # version-conditional imports import sys @@ -302,21 +304,30 @@ def some_point(g): ) def test_cell_type(self): - from pyrasterframes.types import GTCellType + from pyrasterframes.types import CellType for ct in rf_cell_types(): - wrapped = GTCellType(ct) - self.assertEqual(wrapped.to_numpy_dtype(), - GTCellType.from_numpy_dtype(wrapped.to_numpy_dtype()).to_numpy_dtype(), - "dtype comparison for " + ct) - if "raw" not in ct: - self.assertEqual(wrapped, - GTCellType.from_numpy_dtype(wrapped.to_numpy_dtype()), - "GTCellType comparison for " + ct) - - def test_tile_udt(self): + self.assertEqual(ct.to_numpy_dtype(), + CellType.from_numpy_dtype(ct.to_numpy_dtype()).to_numpy_dtype(), + "dtype comparison for " + str(ct)) + if "raw" not in ct.cell_type_name: + self.assertEqual(ct, + CellType.from_numpy_dtype(ct.to_numpy_dtype()), + "GTCellType comparison for " + str(ct)) + + + def test_tile_udt_serialization(self): + from pyrasterframes.types import TileUDT + udt = TileUDT() + + cell_types = (ct for ct in rf_cell_types() if not ct.cell_type_name.endswith("raw")) + for ct in cell_types: + a_tile = Tile(np.random.randn(3, 3).astype(ct.to_numpy_dtype())) + round_trip = udt.fromInternal(udt.toInternal(a_tile)) + self.assertEquals(a_tile, round_trip, "round-trip serialization for " + str(ct)) + + + def test_tile_udt_general(self): import pandas as pd - import numpy as np - from pyrasterframes.types import Tile self.assertIsInstance(self.rf.sql_ctx, SQLContext) @@ -326,10 +337,10 @@ def test_tile_udt(self): all([isinstance(row.tile.cells, np.ndarray) for row in rf_collect])) # Try to create a tile from numpy. - a_tile = Tile(np.random.randn(10, 10)) # no extent and crs provided + a_tile = Tile(np.random.randn(10, 10)) to_spark = pd.DataFrame({ - 't': [Tile(np.random.randn(10,12)) for _ in range(3)], + 't': [Tile(np.random.randn(10, 12)) for _ in range(3)], 'b': ['a', 'b', 'c'], 'c': [1, 2, 4], }) @@ -371,7 +382,7 @@ def test_tile_udt(self): # test raster source? - def test_raster_source_reader(self): + def test_zraster_source_reader(self): import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index e03f8f801..981cbac32 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -20,7 +20,7 @@ */ package org.locationtech.rasterframes.py -import geotrellis.raster.{ArrayTile, CellType, MultibandTile} +import geotrellis.raster.{CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ @@ -105,23 +105,6 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_explode_tiles_sample(sampleFraction: Double, seed: Long, cols: Column*): Column = rf_explode_tiles_sample(sampleFraction, Some(seed), cols: _*) - def _list_to_bytearray(l: java.util.ArrayList[Double], c: Int, r: Int): Array[Byte] = { - geotrellis.raster.ArrayTile(l.asScala.toArray, c, r).toBytes() - } - - def _bytearray_to_list(bytes: Array[Byte], cell_type_name: String, cols: Int, rows: Int): java.util.List[Double] = { - geotrellis.raster.ArrayTile.fromBytes( - bytes, - geotrellis.raster.CellType.fromName(cell_type_name), - cols, - rows - ).toListDouble.asJava - } - - def generate_tile(cellType: String, cols: Int, rows: Int, bytes: Array[Byte]): ArrayTile = { - ArrayTile.fromBytes(bytes, this.rf_cell_type(cellType), cols, rows) - } - def tileColumns(df: DataFrame): Array[Column] = df.asRF.tileColumns.toArray From 315d747e19ae1f8d6f41a575730f264678d52c3c Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 9 May 2019 16:46:42 -0400 Subject: [PATCH 082/380] Update docs for notebook location and rf_crs function Signed-off-by: Jason T. Brown --- .../rasterframes/expressions/package.scala | 1 + docs/src/main/tut/pyrasterframes.md | 2 +- docs/src/main/tut/reference.md | 22 ++++++++++++------- .../python/tests/PyRasterFramesTests.py | 10 +++++---- 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index bfd1b14e1..c574114d8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -73,6 +73,7 @@ package object expressions { registry.registerExpression[GetGeometry]("rf_geometry") registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[GetExtent]("rf_extent") + registry.registerExpression[GetCRS]("rf_crs") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/docs/src/main/tut/pyrasterframes.md b/docs/src/main/tut/pyrasterframes.md index 35a5169d5..0d7fc8280 100644 --- a/docs/src/main/tut/pyrasterframes.md +++ b/docs/src/main/tut/pyrasterframes.md @@ -6,7 +6,7 @@ in the meantime: * [PyRasterFrames README](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/python/README.rst) * [PyRasterFrames Examples](https://github.com/locationtech/rasterframes/tree/develop/pyrasterframes/python/examples) -* [RasterFrames Jupyter Notebook](https://github.com/locationtech/rasterframes/blob/develop/deployment/README.md) +* [RasterFrames Jupyter Notebook](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook/README.md) * @ref:[PyRasterFrames Functions](reference.md) Most features available in the Scala API are exposed in the Python API, refer to the @ref:[function reference](reference.md). Defining a [udf](http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.udf) using a `Tile` column through the Python API is not yet supported. diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index 8fbb5f524..c24f5d680 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -83,14 +83,7 @@ Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. Struct[String] rf_cell_type(Tile tile) -Get the cell type of the `tile`. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. - -#### rf_convert_cell_type - - Tile rf_convert_cell_type(Tile tileCol, String cellType) - -Convert `tileCol` to a different cell type. - +Get the cell type of the `tile`. The cell type can be changed with @ref:[rf_convert_cell_type](reference.md#rf-convert-cell-type). #### rf_extent @@ -99,6 +92,19 @@ Convert `tileCol` to a different cell type. Fetches the extent (bounding box or envelope) of a `ProjectedRasterTile` or `RasterSource` type tile columns. +#### rf_crs + + Struct[String] rf_crs(ProjectedRasterTile raster) + Struct[String] rf_crs(RasterSource raster) + +Fetch the [proj4](https://proj4.org/) string representation of the coordinate reference system of a `ProjectedRasterTile` or `RasterSource` type tile columns. + +#### rf_convert_cell_type + + Tile rf_convert_cell_type(Tile tileCol, String cellType) + +Convert `tileCol` to a different cell type. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. + #### rf_resample Tile rf_resample(Tile tile, Double factor) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index b0fc2aecc..45874be15 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -38,7 +38,7 @@ def setUpClass(cls): .withKryoSerialization() .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') - print(cls.spark.version) + print("Spark version:", cls.spark.version) cls.spark.withRasterFrames() cls.img_uri = cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri() @@ -111,12 +111,14 @@ def test_tile_functions(self): .withColumn('exp', rf_exp(self.tileCol)) \ .withColumn('expm1', rf_expm1(self.tileCol)) \ .withColumn('round', rf_round(self.tileCol)) - # TODO: add test for rf_extent and rf_geometry once rastersource connector is integrated and we have - # a source of ProjectedRasterTiles. + df.show() def test_prt_functions(self): - df = self.spark.read.rastersource(self.img_uri) + df = self.spark.read.rastersource(self.img_uri) \ + .withColumn('crs', rf_crs(self.tileCol)) \ + .withColumn('ext', rf_extent(self.tileCol)) \ + .withColumn('geom', rf_geometry(self.tileCol)) df.printSchema df.show() From d79a545ad331ce41c0ffbad8295a8b5abbdc1715 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 13 May 2019 10:15:21 -0400 Subject: [PATCH 083/380] Started breaking up unit tests for better organization. --- .../python/tests/PyRasterFramesTests.py | 250 +++++++++--------- 1 file changed, 130 insertions(+), 120 deletions(-) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index c175940d8..f7773bab0 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -1,4 +1,3 @@ - from pyspark.sql import SparkSession, Column, SQLContext from pyspark.sql.functions import * from pyrasterframes import * @@ -12,22 +11,24 @@ # version-conditional imports import sys + if sys.version_info[0] > 2: import builtins else: import __builtin__ as builtins -def _rounded_compare(val1, val2): - print('Comparing {} and {} using round()'.format(val1, val2)) - return builtins.round(val1) == builtins.round(val2) - +class TestEnvironment(unittest.TestCase): + """ + Base class for tests. + """ -class RasterFunctionsTest(unittest.TestCase): + def rounded_compare(self, val1, val2): + print('Comparing {} and {} using round()'.format(val1, val2)) + return builtins.round(val1) == builtins.round(val2) @classmethod def setUpClass(cls): - # gather Scala requirements jarpath = list(Path('../target/scala-2.11').resolve().glob('pyrasterframes-assembly*.jar'))[0] @@ -36,10 +37,10 @@ def setUpClass(cls): # spark session with RF cls.spark = (SparkSession.builder - .config('spark.driver.extraClassPath', jarpath) - .config('spark.executor.extraClassPath', jarpath) - .withKryoSerialization() - .getOrCreate()) + .config('spark.driver.extraClassPath', jarpath) + .config('spark.executor.extraClassPath', jarpath) + .withKryoSerialization() + .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') print(cls.spark.version) cls.spark.withRasterFrames() @@ -54,10 +55,94 @@ def setUpClass(cls): cls.rf = rf.withColumn('tile2', rf_convert_cell_type(cls.tileCol, 'float32')) \ .drop(cls.tileCol) \ .withColumnRenamed('tile2', cls.tileCol).asRF() - #cls.rf.show() + # cls.rf.show() def test_setup(self): - self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") + self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), + "org.apache.spark.serializer.KryoSerializer") + + +class VectorTypes(TestEnvironment): + + def setUp(self): + import pandas as pd + self.pandas_df = pd.DataFrame({ + 'eye': ['a', 'b', 'c', 'd'], + 'x': [0.0, 1.0, 2.0, 3.0], + 'y': [-4.0, -3.0, -2.0, -1.0], + }) + df = self.spark.createDataFrame(self.pandas_df) + df = df.withColumn("point_geom", + st_point(df.x, df.y) + ) + self.df = df.withColumn("poly_geom", st_bufferPoint(df.point_geom, lit(1250.0))) + + def test_spatial_relations(self): + from pyspark.sql.functions import lit, udf, sum + import shapely + import numpy.testing + + # Use python shapely UDT in a UDF + @udf("double") + def area_fn(g): + return g.area + + @udf("double") + def length_fn(g): + return g.length + + df = self.df.withColumn("poly_area", area_fn(self.df.poly_geom)) + df = df.withColumn("poly_len", length_fn(df.poly_geom)) + + # Return UDT in a UDF! + def some_point(g): + return g.representative_point() + + some_point_udf = udf(some_point, PointUDT()) + + df = df.withColumn("any_point", some_point_udf(df.poly_geom)) + # spark-side UDF/UDT are correct + intersect_total = df.agg(sum( + st_intersects(df.poly_geom, df.any_point).astype('double') + ).alias('s')).collect()[0].s + self.assertTrue(intersect_total == df.count()) + + # Collect to python driver in shapely UDT + pandas_df_out = df.toPandas() + + # Confirm we get a shapely type back from st_* function and UDF + self.assertIsInstance(pandas_df_out.poly_geom.iloc[0], shapely.geometry.Polygon) + self.assertIsInstance(pandas_df_out.any_point.iloc[0], shapely.geometry.Point) + + # And our spark-side manipulations were correct + xs_correct = pandas_df_out.point_geom.apply(lambda g: g.coords[0][0]) == self.pandas_df.x + self.assertTrue(all(xs_correct)) + + centroid_ys = pandas_df_out.poly_geom.apply(lambda g: + g.centroid.coords[0][1]).tolist() + numpy.testing.assert_almost_equal(centroid_ys, self.pandas_df.y.tolist()) + + # Including from UDF's + numpy.testing.assert_almost_equal( + pandas_df_out.poly_geom.apply(lambda g: g.area).values, + pandas_df_out.poly_area.values + ) + numpy.testing.assert_almost_equal( + pandas_df_out.poly_geom.apply(lambda g: g.length).values, + pandas_df_out.poly_len.values + ) + + def test_rasterize(self): + # NB: This test just makes sure rf_rasterize runs, not that the results are correct. + withRaster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) + withRaster.show() + + def test_reproject(self): + reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) + reprojected.show() + + +class RasterFunctions(TestEnvironment): def test_identify_columns(self): cols = self.rf.tileColumns() @@ -72,11 +157,12 @@ def test_identify_columns(self): def test_tile_creation(self): base = self.spark.createDataFrame([1, 2, 3, 4], 'integer') - tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), rf_make_ones_tile(3, 3, "int32")) + tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), + rf_make_ones_tile(3, 3, "int32")) tiles.show() self.assertEqual(tiles.count(), 4) - def test_tile_operations(self): + def test_multi_column_operations(self): df1 = self.rf.withColumnRenamed(self.tileCol, 't1').asRF() df2 = self.rf.withColumnRenamed(self.tileCol, 't2').asRF() df3 = df1.spatialJoin(df2).asRF() @@ -89,13 +175,12 @@ def test_tile_operations(self): aggs.show() row = aggs.first() - self.assertTrue(_rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) - + self.assertTrue(self.rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) def test_general(self): meta = self.rf.tileLayerMetadata() self.assertIsNotNone(meta['bounds']) - df = self.rf.withColumn('dims', rf_dimensions(self.tileCol)) \ + df = self.rf.withColumn('dims', rf_dimensions(self.tileCol)) \ .withColumn('type', rf_cell_type(self.tileCol)) \ .withColumn('dCells', rf_data_cells(self.tileCol)) \ .withColumn('ndCells', rf_no_data_cells(self.tileCol)) \ @@ -115,15 +200,6 @@ def test_general(self): # a source of ProjectedRasterTiles. df.show() - def test_rasterize(self): - # NB: This test just makes sure rf_rasterize runs, not that the results are correct. - withRaster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) - withRaster.show() - - def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) - reprojected.show() - def test_aggregations(self): aggs = self.rf.agg( rf_agg_mean(self.tileCol), @@ -135,17 +211,16 @@ def test_aggregations(self): aggs.show() row = aggs.first() - self.assertTrue(_rounded_compare(row['rf_agg_mean(tile)'], 10160)) + self.assertTrue(self.rounded_compare(row['rf_agg_mean(tile)'], 10160)) print(row['rf_agg_data_cells(tile)']) self.assertEqual(row['rf_agg_data_cells(tile)'], 387000) self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) def test_sql(self): - self.rf.createOrReplaceTempView("rf") - dims = self.rf.withColumn('dims', rf_dimensions(self.tileCol)).first().dims + dims = self.rf.withColumn('dims', rf_dimensions(self.tileCol)).first().dims dims_str = """{}, {}""".format(dims.cols, dims.rows) self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, @@ -160,16 +235,16 @@ def test_sql(self): ops.printSchema statsRow = ops.select(rf_tile_mean(self.tileCol).alias('base'), - rf_tile_mean("AndOne").alias('plus_one'), - rf_tile_mean("LessOne").alias('minus_one'), - rf_tile_mean("TimesTwo").alias('double'), - rf_tile_mean("OverTwo").alias('half')) \ - .first() + rf_tile_mean("AndOne").alias('plus_one'), + rf_tile_mean("LessOne").alias('minus_one'), + rf_tile_mean("TimesTwo").alias('double'), + rf_tile_mean("OverTwo").alias('half')) \ + .first() - self.assertTrue(_rounded_compare(statsRow.base, statsRow.plus_one - 1)) - self.assertTrue(_rounded_compare(statsRow.base, statsRow.minus_one + 1)) - self.assertTrue(_rounded_compare(statsRow.base, statsRow.double / 2)) - self.assertTrue(_rounded_compare(statsRow.base, statsRow.half * 2)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.plus_one - 1)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.minus_one + 1)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.double / 2)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.half * 2)) def test_explode(self): import pyspark.sql.functions as F @@ -179,10 +254,10 @@ def test_explode(self): # +-----------+------------+---------+-------+ # |[2,1] |4 |0 |10150.0| cell = self.rf.select(self.rf.spatialKeyColumn(), rf_explode_tiles(self.rf.tile)) \ - .where(F.col("spatial_key.col")==2) \ - .where(F.col("spatial_key.row")==1) \ - .where(F.col("column_index")==4) \ - .where(F.col("row_index")==0) \ + .where(F.col("spatial_key.col") == 2) \ + .where(F.col("spatial_key.row") == 1) \ + .where(F.col("column_index") == 4) \ + .where(F.col("row_index") == 0) \ .select(F.col("tile")) \ .collect()[0][0] self.assertEqual(cell, 10150.0) @@ -194,7 +269,6 @@ def test_explode(self): self.assertTrue(sample_count > 0) self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room - def test_mask_by_value(self): from pyspark.sql.functions import lit @@ -206,7 +280,7 @@ def test_mask_by_value(self): rf_convert_cell_type( rf_local_greater_int(self.rf.tile, 25000), "uint8"), - lit(mask_value)).alias('mask')) + lit(mask_value)).alias('mask')) rf2 = rf1.select(rf1.tile, rf_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) result = rf2.agg(rf_agg_no_data_cells(rf2.tile) < rf_agg_no_data_cells(rf2.masked)) \ .collect()[0][0] @@ -236,72 +310,7 @@ def test_exists_for_all(self): self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) - def test_geomesa_pyspark(self): - from pyspark.sql.functions import lit, udf, sum - import shapely - import pandas as pd - import numpy.testing - - pandas_df = pd.DataFrame({ - 'eye': ['a', 'b', 'c', 'd'], - 'x': [0.0, 1.0, 2.0, 3.0], - 'y': [-4.0, -3.0, -2.0, -1.0], - }) - df = self.spark.createDataFrame(pandas_df) - df = df.withColumn("point_geom", - st_point(df.x, df.y) - ) - df = df.withColumn("poly_geom", st_bufferPoint(df.point_geom, lit(1250.0))) - - # Use python shapely UDT in a UDF - @udf("double") - def area_fn(g): - return g.area - - @udf("double") - def length_fn(g): - return g.length - - df = df.withColumn("poly_area", area_fn(df.poly_geom)) - df = df.withColumn("poly_len", length_fn(df.poly_geom)) - - # Return UDT in a UDF! - def some_point(g): - return g.representative_point() - - some_point_udf = udf(some_point, PointUDT()) - - df = df.withColumn("any_point", some_point_udf(df.poly_geom)) - # spark-side UDF/UDT are correct - intersect_total = df.agg(sum( - st_intersects(df.poly_geom, df.any_point).astype('double') - ).alias('s')).collect()[0].s - self.assertTrue(intersect_total == df.count()) - - # Collect to python driver in shapely UDT - pandas_df_out = df.toPandas() - - # Confirm we get a shapely type back from st_* function and UDF - self.assertIsInstance(pandas_df_out.poly_geom.iloc[0], shapely.geometry.Polygon) - self.assertIsInstance(pandas_df_out.any_point.iloc[0], shapely.geometry.Point) - - # And our spark-side manipulations were correct - xs_correct = pandas_df_out.point_geom.apply(lambda g: g.coords[0][0]) == pandas_df.x - self.assertTrue(all(xs_correct)) - - centroid_ys = pandas_df_out.poly_geom.apply(lambda g: - g.centroid.coords[0][1]).tolist() - numpy.testing.assert_almost_equal(centroid_ys, pandas_df.y.tolist()) - - # Including from UDF's - numpy.testing.assert_almost_equal( - pandas_df_out.poly_geom.apply(lambda g: g.area).values, - pandas_df_out.poly_area.values - ) - numpy.testing.assert_almost_equal( - pandas_df_out.poly_geom.apply(lambda g: g.length).values, - pandas_df_out.poly_len.values - ) +class UDT(TestEnvironment): def test_cell_type(self): from pyrasterframes.types import CellType @@ -314,7 +323,6 @@ def test_cell_type(self): CellType.from_numpy_dtype(ct.to_numpy_dtype()), "GTCellType comparison for " + str(ct)) - def test_tile_udt_serialization(self): from pyrasterframes.types import TileUDT udt = TileUDT() @@ -325,7 +333,6 @@ def test_tile_udt_serialization(self): round_trip = udt.fromInternal(udt.toInternal(a_tile)) self.assertEquals(a_tile, round_trip, "round-trip serialization for " + str(ct)) - def test_tile_udt_general(self): import pandas as pd @@ -382,7 +389,9 @@ def test_tile_udt_general(self): # test raster source? - def test_zraster_source_reader(self): +class RasterSource(TestEnvironment): + + def ignore_test_raster_source_reader(self): import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run @@ -394,15 +403,15 @@ def l8path(b): path_param = '\n'.join([l8path(b) for b in [1, 2, 3]]) # "http://foo.com/file1.tif,http://foo.com/file2.tif" tile_size = 512 df = self.spark.read.format('rastersource') \ - .options(paths=path_param, tileDimensions='{},{}'.format(tile_size, tile_size)) \ - .load() + .options(paths=path_param, tileDimensions='{},{}'.format(tile_size, tile_size)) \ + .load() # schema is tile_path and tile df.printSchema() self.assertTrue(len(df.columns) == 2 and 'tile_path' in df.columns and 'tile' in df.columns) # the most common tile dimensions should be as passed to `options`, showing that options are correctly applied - tile_size_df = df.select(rf_dimensions(df.tile).rows.alias('r'), rf_dimensions(df.tile).cols.alias('c'))\ + tile_size_df = df.select(rf_dimensions(df.tile).rows.alias('r'), rf_dimensions(df.tile).cols.alias('c')) \ .groupby(['r', 'c']).count().toPandas() most_common_size = tile_size_df.loc[tile_size_df['count'].idxmax()] self.assertTrue(most_common_size.r == tile_size and most_common_size.c == tile_size) @@ -438,9 +447,9 @@ def path(scene, band): path_table.createOrReplaceTempView(path_table_hive_name) path_df = self.spark.read.format('rastersource') \ - .options(pathTable=path_table_hive_name, pathTableColumns=csv_columns, - tileDimensions='512,512') \ - .load() + .options(pathTable=path_table_hive_name, pathTableColumns=csv_columns, + tileDimensions='512,512') \ + .load() path_df.printSchema() self.assertTrue(len(path_df.columns) == 6) # three bands times {path, tile} @@ -454,4 +463,5 @@ def suite(): function_tests = unittest.TestSuite() return function_tests + unittest.TextTestRunner().run(suite()) From 9ea577a8beb3c09928871a223b691b1cb0b99265 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 13 May 2019 14:30:26 -0400 Subject: [PATCH 084/380] Fleshed out CellType definition in Python. --- .../org/apache/spark/sql/rf/TileUDT.scala | 3 +- project/RFProjectPlugin.scala | 1 + .../python/pyrasterframes/rf_types.py | 62 ++++++++++++++----- .../python/tests/PyRasterFramesTests.py | 31 +++++++--- 4 files changed, 71 insertions(+), 26 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala index 64507d578..c83d1fbba 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala @@ -20,12 +20,11 @@ */ package org.apache.spark.sql.rf -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.model.TileDataContext import geotrellis.raster._ import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.types.{DataType, _} import org.locationtech.rasterframes.encoders.CatalystSerializer +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.model.{Cells, TileDataContext} import org.locationtech.rasterframes.tiles.InternalRowTile diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 5c641e6d4..288332730 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -35,6 +35,7 @@ object RFProjectPlugin extends AutoPlugin { "-Ywarn-unused-import" ), scalacOptions in (Compile, doc) ++= Seq("-no-link-warnings"), + console / scalacOptions := Seq("-feature"), javacOptions ++= Seq("-source", "1.8", "-target", "1.8"), cancelable in Global := true, publishTo in ThisBuild := sonatypePublishTo.value, diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 09e525aa6..5928c761e 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -7,14 +7,13 @@ class here provides the PyRasterFrames entry point. from pyspark.sql.types import UserDefinedType from pyspark import SparkContext -from pyspark.sql import SparkSession, DataFrame, Column, Row +from pyspark.sql import DataFrame, Column from pyspark.sql.types import * from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable -from .context import RFContext import numpy as np -__all__ = ['RasterFrame', 'TileUDT', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] +__all__ = ['RasterFrame', 'Tile', 'TileUDT', 'CellType', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] class RasterFrame(DataFrame): @@ -138,7 +137,7 @@ def deserialize(self, datum): bytes(datum[0]) -class CellType: +class CellType(object): def __init__(self, cell_type_name): self.cell_type_name = cell_type_name @@ -146,17 +145,51 @@ def __init__(self, cell_type_name): def from_numpy_dtype(cls, np_dtype): return CellType(str(np_dtype)) - def to_numpy_dtype(self): - if self.cell_type_name.endswith("raw"): - return CellType(self.cell_type_name[:-3]).to_numpy_dtype() - elif "ud" in self.cell_type_name: - raise Exception("Cell types with user-defined NoData values are not yet implemented.") + def is_raw(self): + return self.cell_type_name.endswith("raw") + + def is_user_defined_no_data(self): + return "ud" in self.cell_type_name + + def is_default_no_data(self): + return not (self.is_raw() or self.is_user_defined_no_data()) + + def is_floating_point(self): + return self.cell_type_name.startswith("float") + + def base_cell_type_name(self): + if self.is_raw(): + return self.cell_type_name[:-3] + elif self.is_user_defined_no_data(): + return self.cell_type_name.split("ud")[0] else: - # The remaining cell types should be compatible with numpy - return np.dtype(self.cell_type_name) + return self.cell_type_name + + def to_numpy_dtype(self): + return np.dtype(self.base_cell_type_name()) def no_data_value(self): - pass + if self.is_raw(): + return None + elif self.is_user_defined_no_data(): + num_str = self.cell_type_name.split("ud")[1] + if self.is_floating_point(): + return float(num_str) + else: + return int(num_str) + else: + if self.is_floating_point(): + return float('nan') + else: + n = self.base_cell_type_name() + if n is "uint8" or n is "uint16": + return 0 + elif n is "int8": + return -128 + elif n is "int16": + return -32768 + elif n is "int32": + return -2147483648 def __eq__(self, other): if type(other) is type(self): @@ -168,7 +201,7 @@ def __str__(self): return self.cell_type_name -class Tile: +class Tile(object): def __init__(self, cells): self.cells = cells self.cell_type = CellType.from_numpy_dtype(cells.dtype) @@ -180,7 +213,8 @@ def __eq__(self, other): return False def __str__(self): - return "Tile(\n dimensions={}\n cell_type={}\n cells={}\n)".format(self.dimensions(), self.cell_type, self.cells) + return "Tile(\n dimensions={}\n cell_type={}\n cells={}\n)" \ + .format(self.dimensions(), self.cell_type, self.cells) def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 1c803af06..87fe90ed6 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -315,14 +315,32 @@ def test_cell_type_conversion(self): self.assertEqual(ct.to_numpy_dtype(), CellType.from_numpy_dtype(ct.to_numpy_dtype()).to_numpy_dtype(), "dtype comparison for " + str(ct)) - if "raw" not in ct.cell_type_name: + if not ct.is_raw(): self.assertEqual(ct, CellType.from_numpy_dtype(ct.to_numpy_dtype()), "GTCellType comparison for " + str(ct)) + def test_is_raw(self): + self.assertTrue(CellType("float32raw").is_raw()) + self.assertFalse(CellType("float64ud1234").is_raw()) + self.assertFalse(CellType("float32").is_raw()) + self.assertTrue(CellType("int8raw").is_raw()) + self.assertFalse(CellType("uint16d12").is_raw()) + self.assertFalse(CellType("int32").is_raw()) + + def test_is_floating_point(self): + self.assertTrue(CellType("float32raw").is_floating_point()) + self.assertTrue(CellType("float64ud1234").is_floating_point()) + self.assertTrue(CellType("float32").is_floating_point()) + self.assertFalse(CellType("int8raw").is_floating_point()) + self.assertFalse(CellType("uint16d12").is_floating_point()) + self.assertFalse(CellType("int32").is_floating_point()) + def test_cell_type_no_data(self): - # self.assertEqual(CellType("float32ud-98").no_data, - pass + import math + self.assertEqual(CellType("float32ud-98").no_data_value(), -98.0) + self.assertTrue(math.isnan(CellType("float64").no_data_value())) + self.assertEqual(CellType("uint8").no_data_value(), 0) def test_tile_udt_serialization(self): udt = TileUDT() @@ -352,13 +370,10 @@ def test_tile_udt_general(self): 'c': [1, 2, 4], }) rf_maybe = self.spark.createDataFrame(to_spark) - print("Type of dataframe: ", type(rf_maybe)) # Try to do something with it. sums = to_spark.t.apply(lambda a: a.cells.sum()).tolist() maybe_sums = rf_maybe.select(rf_tile_sum(rf_maybe.t).alias('tsum')) - print("Schema of tile sum") - #maybe_sums.printSchema() maybe_sums = [r.tsum for r in maybe_sums.collect()] np.testing.assert_almost_equal(maybe_sums, sums, 12) @@ -383,10 +398,6 @@ def test_tile_udt_general(self): self.assertIsInstance(array_back_2, Tile) np.testing.assert_equal(array_back_2.cells, simple_array.cells) - # test CRS and extent correctly make round trips - - # test raster source? - class RasterSource(TestEnvironment): From 82e2dd37530ebf6b696215f5f56a190222a279ce Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 14 May 2019 12:57:25 -0400 Subject: [PATCH 085/380] Initial encoding of CellType NoData in NumPy array. --- .../python/pyrasterframes/rf_types.py | 31 ++++++++++++++----- .../python/tests/PyRasterFramesTests.py | 12 +++++++ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 5928c761e..d651bdd16 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -165,8 +165,8 @@ def base_cell_type_name(self): else: return self.cell_type_name - def to_numpy_dtype(self): - return np.dtype(self.base_cell_type_name()) + def has_no_data(self): + return not self.is_raw() def no_data_value(self): if self.is_raw(): @@ -179,7 +179,7 @@ def no_data_value(self): return int(num_str) else: if self.is_floating_point(): - return float('nan') + return float('nan') else: n = self.base_cell_type_name() if n is "uint8" or n is "uint16": @@ -191,6 +191,9 @@ def no_data_value(self): elif n is "int32": return -2147483648 + def to_numpy_dtype(self): + return np.dtype(self.base_cell_type_name()) + def __eq__(self, other): if type(other) is type(self): return self.cell_type_name == other.cell_type_name @@ -198,13 +201,25 @@ def __eq__(self, other): return False def __str__(self): - return self.cell_type_name + return "CellType({}, {})".format(self.cell_type_name, self.no_data_value()) class Tile(object): - def __init__(self, cells): - self.cells = cells - self.cell_type = CellType.from_numpy_dtype(cells.dtype) + def __init__(self, cells, cell_type=None): + if cell_type is None: + self.cell_type = CellType.from_numpy_dtype(cells.dtype) + else: + self.cell_type = cell_type + + if self.cell_type.has_no_data(): + if self.cell_type.is_floating_point(): + self.cells = np.ma.masked_invalid(cells) + else: + nd_value = self.cell_type.no_data_value() + # if the value in the array is `nd_value`, it is masked as nodata + self.cells = np.ma.masked_equal(cells, nd_value) + else: + self.cells = cells def __eq__(self, other): if type(other) is type(self): @@ -288,7 +303,7 @@ def deserialize(self, datum): cell_data_bytes = datum.cell_data.cells as_numpy = np.frombuffer(cell_data_bytes, dtype=cell_type.to_numpy_dtype()).reshape((rows, cols)) - t = Tile(as_numpy) + t = Tile(as_numpy, cell_type) return t deserialize.__safe_for_unpickling__ = True diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 87fe90ed6..8ca1141dc 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -342,6 +342,18 @@ def test_cell_type_no_data(self): self.assertTrue(math.isnan(CellType("float64").no_data_value())) self.assertEqual(CellType("uint8").no_data_value(), 0) + def test_mask_no_data(self): + t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) + self.assertTrue(t1.cells.mask[1][0]) + self.assertIsNotNone(t1.cells[1][1]) + self.assertEqual(len(t1.cells.compressed()), 3) + t2 = Tile(np.array([[1.0, 2.0], [float('nan'), 4.0]]), CellType("float32")) + print(t2) + self.assertEqual(len(t2.cells.compressed()), 3) + self.assertTrue(t2.cells.mask[1][0]) + self.assertIsNotNone(t2.cells[1][1]) + + def test_tile_udt_serialization(self): udt = TileUDT() From a47b5de237ef667e10bf1c2d258bf1038c84c84b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 15 May 2019 09:09:12 -0400 Subject: [PATCH 086/380] Fleshing out NoData handling in Python Tiles. --- .../org/apache/spark/sql/rf/TileUDT.scala | 2 +- .../python/pyrasterframes/rf_types.py | 29 ++++++++-- .../python/tests/PyRasterFramesTests.py | 54 ++++++++++++++++--- 3 files changed, 73 insertions(+), 12 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala index c83d1fbba..3a6168d6f 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala @@ -39,7 +39,7 @@ class TileUDT extends UserDefinedType[Tile] { import TileUDT._ override def typeName = TileUDT.typeName - override def pyUDT: String = "pyrasterframes.TileUDT" + override def pyUDT: String = "pyrasterframes.rf_types.TileUDT" def userClass: Class[Tile] = classOf[Tile] diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index d651bdd16..df3744ffa 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -179,7 +179,7 @@ def no_data_value(self): return int(num_str) else: if self.is_floating_point(): - return float('nan') + return np.nan else: n = self.base_cell_type_name() if n is "uint8" or n is "uint16": @@ -194,6 +194,9 @@ def no_data_value(self): def to_numpy_dtype(self): return np.dtype(self.base_cell_type_name()) + def with_no_data_value(self, no_data): + return CellType(self.base_cell_type_name() + "ud" + str(no_data)) + def __eq__(self, other): if type(other) is type(self): return self.cell_type_name == other.cell_type_name @@ -212,10 +215,10 @@ def __init__(self, cells, cell_type=None): self.cell_type = cell_type if self.cell_type.has_no_data(): - if self.cell_type.is_floating_point(): + nd_value = self.cell_type.no_data_value() + if np.isnan(nd_value): self.cells = np.ma.masked_invalid(cells) else: - nd_value = self.cell_type.no_data_value() # if the value in the array is `nd_value`, it is masked as nodata self.cells = np.ma.masked_equal(cells, nd_value) else: @@ -231,6 +234,24 @@ def __str__(self): return "Tile(\n dimensions={}\n cell_type={}\n cells={}\n)" \ .format(self.dimensions(), self.cell_type, self.cells) + def __add__(self, right): + if isinstance(right, Tile): + other = right.cells + else: + other = right + result = np.add(self.cells, other) + ct = CellType.from_numpy_dtype(result.dtype) + if isinstance(result, np.ma.masked_array): + ct = ct.with_no_data_value(result.fill_value) + return Tile(np.add(self.cells, other), ct) + + def __sub__(self, right): + if isinstance(right, Tile): + other = right.cells + else: + other = right + return Tile(np.subtract(self.cells, other), self.cell_type) + def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames return [self.cells.shape[1], self.cells.shape[0]] @@ -269,7 +290,7 @@ def sqlType(cls): @classmethod def module(cls): - return 'pyrasterframes.types' + return 'pyrasterframes.rf_types' @classmethod def scalaUDT(cls): diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 8ca1141dc..fa39c4456 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -308,6 +308,7 @@ def test_exists_for_all(self): self.assertTrue(df.select(rf_for_all(df.should_exist).alias('se')).take(1)[0].se) self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) + class UDT(TestEnvironment): def test_cell_type_conversion(self): @@ -342,28 +343,68 @@ def test_cell_type_no_data(self): self.assertTrue(math.isnan(CellType("float64").no_data_value())) self.assertEqual(CellType("uint8").no_data_value(), 0) + ct = CellType.from_numpy_dtype("int8") + print(ct) + print(ct.to_numpy_dtype()) + print(ct.no_data_value()) + print(ct.base_cell_type_name()) + + a_tile = Tile(np.random.randn(3, 3).astype(ct.to_numpy_dtype()), ct) + print(a_tile) + def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) self.assertTrue(t1.cells.mask[1][0]) self.assertIsNotNone(t1.cells[1][1]) self.assertEqual(len(t1.cells.compressed()), 3) t2 = Tile(np.array([[1.0, 2.0], [float('nan'), 4.0]]), CellType("float32")) - print(t2) self.assertEqual(len(t2.cells.compressed()), 3) self.assertTrue(t2.cells.mask[1][0]) self.assertIsNotNone(t2.cells[1][1]) - def test_tile_udt_serialization(self): udt = TileUDT() - - cell_types = (ct for ct in rf_cell_types() if not ct.cell_type_name.endswith("raw")) + cell_types = (ct for ct in rf_cell_types() if not ct.is_raw()) for ct in cell_types: - a_tile = Tile(np.random.randn(3, 3).astype(ct.to_numpy_dtype())) + cells = (100 + np.random.randn(3, 3) * 100).astype(ct.to_numpy_dtype()) + + if ct.is_floating_point(): + nd = 33.0 + else: + nd = 33 + + cells[1][1] = nd + a_tile = Tile(cells, ct.with_no_data_value(nd)) + print(repr(a_tile.cells)) round_trip = udt.fromInternal(udt.toInternal(a_tile)) self.assertEquals(a_tile, round_trip, "round-trip serialization for " + str(ct)) - def test_tile_udt_general(self): + def test_no_data_udf_handling(self): + t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) + print(t1) + schema = StructType([StructField("tile", TileUDT(), False)]) + df = self.spark.createDataFrame([{"tile": t1}], schema) + + @udf("double") + def increment(t: Tile): + return t + 1 + + print(df.select(increment("tile")).collect()) + + +class TileOps(TestEnvironment): + + def test_addition(self): + t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) + e1 = np.ma.masked_equal(np.array([[5, 6], [7, 8]]), 7) + self.assertTrue(np.array_equal((t1 + 4).cells, e1)) + + t2 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud1")) + e2 = np.ma.masked_equal(np.array([[3, 4], [3, 8]]), 3) + r2 = (t1 + t2).cells + self.assertTrue(np.ma.allequal(r2, e2)) + + def test_tile_ops_general(self): import pandas as pd self.assertIsInstance(self.rf.sql_ctx, SQLContext) @@ -386,7 +427,6 @@ def test_tile_udt_general(self): # Try to do something with it. sums = to_spark.t.apply(lambda a: a.cells.sum()).tolist() maybe_sums = rf_maybe.select(rf_tile_sum(rf_maybe.t).alias('tsum')) - maybe_sums = [r.tsum for r in maybe_sums.collect()] np.testing.assert_almost_equal(maybe_sums, sums, 12) From 24ae2aa0952eda56666ecfb7baa1b980d0f930b8 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 22 May 2019 12:52:45 -0400 Subject: [PATCH 087/380] Incremental backup commit during CellType debugging. --- .../python/pyrasterframes/rasterfunctions.py | 2 +- .../python/pyrasterframes/rf_types.py | 66 ++++++++++-- .../python/tests/PyRasterFramesTests.py | 100 ++++++++++++------ 3 files changed, 121 insertions(+), 47 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index e2102aee3..110a9f25c 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -154,7 +154,7 @@ def _(data_tile, mask_tile, mask_value): _rf_unique_functions = { 'rf_array_to_tile': _create_arrayToTile(), 'rf_assemble_tile': _create_assembleTile(), - 'rf_cell_types': lambda: [CellType(ct) for ct in _context_call('rf_cell_types')], + 'rf_cell_types': lambda: [CellType(str(ct)) for ct in _context_call('rf_cell_types')], 'rf_convert_cell_type': _create_convertCellType(), 'rf_explode_tiles': _create_explode_tiles(), 'rf_explode_tiles_sample': _create_explode_tiles_sample(), diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index df3744ffa..722a6d4f1 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -117,7 +117,7 @@ def withSpatialIndex(self): class RasterSourceUDT(UserDefinedType): @classmethod - def sqlType(self): + def sqlType(cls): return StructType([ StructField("raster_source_kryo", BinaryType(), False)]) @@ -138,11 +138,11 @@ def deserialize(self, datum): class CellType(object): - def __init__(self, cell_type_name): + def __init__(self, cell_type_name: str): self.cell_type_name = cell_type_name @classmethod - def from_numpy_dtype(cls, np_dtype): + def from_numpy_dtype(cls, np_dtype: np.dtype): return CellType(str(np_dtype)) def is_raw(self): @@ -182,17 +182,37 @@ def no_data_value(self): return np.nan else: n = self.base_cell_type_name() - if n is "uint8" or n is "uint16": + if n == "uint8" or n == "uint16": return 0 - elif n is "int8": + elif n == "int8": return -128 - elif n is "int16": + elif n == "int16": return -32768 - elif n is "int32": + elif n == "int32": return -2147483648 + elif n == "bool": + return None + raise Exception("Unable to determine no_data_value from '{}'".format(n)) def to_numpy_dtype(self): - return np.dtype(self.base_cell_type_name()) + n = self.base_cell_type_name() + if n == "uint8": + return np.uint + elif n == "int8": + return np.int + elif n == "uint16": + return np.ushort + elif n == "int16": + return np.short + elif n == "int32": + return np.int + elif n == "float32": + return np.float + elif n == "float64": + return np.double + else: + # Shouldn't happen + return np.dtype(n) def with_no_data_value(self, no_data): return CellType(self.base_cell_type_name() + "ud" + str(no_data)) @@ -206,6 +226,9 @@ def __eq__(self, other): def __str__(self): return "CellType({}, {})".format(self.cell_type_name, self.no_data_value()) + def __repr__(self): + return self.cell_type_name + class Tile(object): def __init__(self, cells, cell_type=None): @@ -234,6 +257,10 @@ def __str__(self): return "Tile(\n dimensions={}\n cell_type={}\n cells={}\n)" \ .format(self.dimensions(), self.cell_type, self.cells) + def __repr__(self): + return "Tile({}, {})" \ + .format(repr(self.cell_type), str(self.cells)) + def __add__(self, right): if isinstance(right, Tile): other = right.cells @@ -297,6 +324,7 @@ def scalaUDT(cls): return 'org.apache.spark.sql.rf.TileUDT' def serialize(self, tile): + #print("in: ", repr(tile.cells.flatten().tobytes())) row = [ # cell_context [ @@ -322,9 +350,23 @@ def deserialize(self, datum): cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells - - as_numpy = np.frombuffer(cell_data_bytes, dtype=cell_type.to_numpy_dtype()).reshape((rows, cols)) - t = Tile(as_numpy, cell_type) + #print("out: ", repr(cell_data_bytes)) + try: + as_numpy = np.frombuffer(cell_data_bytes) + #.astype(dtype=cell_type.to_numpy_dtype()) + #.astype(dtype=np.dtype('B')) \ + reshaped = as_numpy.reshape((rows, cols)) + t = Tile(reshaped, cell_type) + except ValueError as e: + raise ValueError({ + "cell_type": cell_type, + "cols": cols, + "rows": rows, + "cell_data.length": len(cell_data_bytes), + "cell_data.type": type(cell_data_bytes), + "cell_data.values": repr(cell_data_bytes), + "as_numpy.values": repr(as_numpy) + }, e) return t deserialize.__safe_for_unpickling__ = True @@ -337,6 +379,7 @@ class TileExploder(JavaTransformer, JavaMLReadable, JavaMLWritable): """ Python wrapper for TileExploder.scala """ + def __init__(self): super(TileExploder, self).__init__() self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.TileExploder", self.uid) @@ -346,6 +389,7 @@ class NoDataFilter(JavaTransformer, JavaMLReadable, JavaMLWritable): """ Python wrapper for NoDataFilter.scala """ + def __init__(self): super(NoDataFilter, self).__init__() self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.NoDataFilter", self.uid) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index fa39c4456..dd5fa2f58 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -1,5 +1,7 @@ from pyspark.sql import SparkSession, Column, SQLContext from pyspark.sql.functions import * +from pyspark.sql.types import * + from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyrasterframes.rf_types import * @@ -56,11 +58,6 @@ def setUpClass(cls): .withColumnRenamed('tile2', cls.tileCol).asRF() # cls.rf.show() - def test_setup(self): - self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), - "org.apache.spark.serializer.KryoSerializer") - - class VectorTypes(TestEnvironment): def setUp(self): @@ -133,8 +130,8 @@ def some_point(g): def test_rasterize(self): # NB: This test just makes sure rf_rasterize runs, not that the results are correct. - withRaster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) - withRaster.show() + with_raster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) + with_raster.show() def test_reproject(self): reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) @@ -199,19 +196,20 @@ def test_general(self): # a source of ProjectedRasterTiles. df.show() + def test_agg_mean(self): + mean = self.rf.agg(rf_agg_mean(self.tileCol)).first()['rf_agg_mean(tile)'] + self.assertTrue(self.rounded_compare(mean, 10160)) + def test_aggregations(self): aggs = self.rf.agg( - rf_agg_mean(self.tileCol), rf_agg_data_cells(self.tileCol), rf_agg_no_data_cells(self.tileCol), rf_agg_stats(self.tileCol), rf_agg_approx_histogram(self.tileCol) ) - aggs.show() row = aggs.first() - self.assertTrue(self.rounded_compare(row['rf_agg_mean(tile)'], 10160)) - print(row['rf_agg_data_cells(tile)']) + # print(row['rf_agg_data_cells(tile)']) self.assertEqual(row['rf_agg_data_cells(tile)'], 387000) self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) @@ -309,17 +307,7 @@ def test_exists_for_all(self): self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) -class UDT(TestEnvironment): - - def test_cell_type_conversion(self): - for ct in rf_cell_types(): - self.assertEqual(ct.to_numpy_dtype(), - CellType.from_numpy_dtype(ct.to_numpy_dtype()).to_numpy_dtype(), - "dtype comparison for " + str(ct)) - if not ct.is_raw(): - self.assertEqual(ct, - CellType.from_numpy_dtype(ct.to_numpy_dtype()), - "GTCellType comparison for " + str(ct)) +class CellTypeHandling(unittest.TestCase): def test_is_raw(self): self.assertTrue(CellType("float32raw").is_raw()) @@ -339,18 +327,48 @@ def test_is_floating_point(self): def test_cell_type_no_data(self): import math + self.assertIsNone(CellType("bool").no_data_value()) + + self.assertTrue(CellType("int8").has_no_data()) + self.assertEqual(CellType("int8").no_data_value(), -128) + + self.assertTrue(CellType("uint8").has_no_data()) + self.assertEqual(CellType("uint8").no_data_value(), 0) + + self.assertTrue(CellType("int16").has_no_data()) + self.assertEqual(CellType("int16").no_data_value(), -32768) + + self.assertTrue(CellType("uint16").has_no_data()) + self.assertEqual(CellType("uint16").no_data_value(), 0) + + self.assertTrue(CellType("float32").has_no_data()) + self.assertTrue(np.isnan(CellType("float32").no_data_value())) + self.assertEqual(CellType("float32ud-98").no_data_value(), -98.0) self.assertTrue(math.isnan(CellType("float64").no_data_value())) self.assertEqual(CellType("uint8").no_data_value(), 0) - ct = CellType.from_numpy_dtype("int8") - print(ct) - print(ct.to_numpy_dtype()) - print(ct.no_data_value()) - print(ct.base_cell_type_name()) - a_tile = Tile(np.random.randn(3, 3).astype(ct.to_numpy_dtype()), ct) - print(a_tile) +class UDT(TestEnvironment): + def test_cell_type_conversion(self): + for ct in rf_cell_types(): + self.assertEqual(ct.to_numpy_dtype(), + CellType.from_numpy_dtype(ct.to_numpy_dtype()).to_numpy_dtype(), + "dtype comparison for " + str(ct)) + if not ct.is_raw(): + self.assertEqual(ct, + CellType.from_numpy_dtype(ct.to_numpy_dtype()), + "GTCellType comparison for " + str(ct)) + + def test_array_flattening(self): + #a = np.frombuffer(bytearray([1, 0, 0, 0, 0, 0, 0, 0])) + + a = np.array([[1, 2], [0, 4]], dtype=np.dtype("uint8")) + b = np.ma.masked_equal(a, 2) + c = builtins.bytearray(b.flatten().tobytes()) + d = np.frombuffer(c, b.dtype).reshape(2, 2) + e = np.ma.masked_equal(d, 2) + print(repr(e)) def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) @@ -364,7 +382,8 @@ def test_mask_no_data(self): def test_tile_udt_serialization(self): udt = TileUDT() - cell_types = (ct for ct in rf_cell_types() if not ct.is_raw()) + cell_types = (ct for ct in rf_cell_types() if not (ct.is_raw() or ("bool" in ct.base_cell_type_name()))) + for ct in cell_types: cells = (100 + np.random.randn(3, 3) * 100).astype(ct.to_numpy_dtype()) @@ -375,21 +394,27 @@ def test_tile_udt_serialization(self): cells[1][1] = nd a_tile = Tile(cells, ct.with_no_data_value(nd)) - print(repr(a_tile.cells)) round_trip = udt.fromInternal(udt.toInternal(a_tile)) self.assertEquals(a_tile, round_trip, "round-trip serialization for " + str(ct)) + schema = StructType([StructField("tile", TileUDT(), False)]) + df = self.spark.createDataFrame([{"tile": a_tile}], schema) + + long_trip = df.first()["tile"] + self.assertEqual(long_trip, a_tile) + def test_no_data_udf_handling(self): - t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) - print(t1) + t1 = Tile(np.array([[1, 2], [0, 4]]), CellType("uint8")) + e1 = Tile(np.array([[2, 3], [0, 5]]), CellType("uint8")) schema = StructType([StructField("tile", TileUDT(), False)]) df = self.spark.createDataFrame([{"tile": t1}], schema) - @udf("double") + @udf(TileUDT()) def increment(t: Tile): return t + 1 - print(df.select(increment("tile")).collect()) + r1 = df.select(increment(df.tile).alias("inc")).first()["inc"] + self.assertEqual(r1, e1) class TileOps(TestEnvironment): @@ -453,6 +478,11 @@ def test_tile_ops_general(self): class RasterSource(TestEnvironment): + # Putting this here for convenience + def test_setup(self): + self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), + "org.apache.spark.serializer.KryoSerializer") + def test_raster_source_reader(self): import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run From 33e1e32fd20237d75b48796b82f704b4cf8aa911 Mon Sep 17 00:00:00 2001 From: Phil Varner Date: Wed, 15 May 2019 09:40:21 -0400 Subject: [PATCH 088/380] Cherry pick 420eb2e6faabb299d1baff1b8a5852820a21d7d6 --- .circleci/config.yml | 32 +++++++++++++++++-- .../rasterframes/ref/RasterSourceIT.scala | 19 ++++++++--- 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1fffd77f6..5a3de91ae 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,8 +5,8 @@ _defaults: &defaults environment: TERM: dumb docker: - - image: circleci/openjdk:8-jdk - + - image: s22s/rasterframes-circleci:latest + _setenv: &setenv name: set CloudRepo credentials command: |- @@ -111,6 +111,28 @@ jobs: - save_cache: <<: *save_cache + itWithoutGdal: + working_directory: ~/repo + environment: + TERM: dumb + docker: + - image: circleci/openjdk:8-jdk + resource_class: xlarge + steps: + - checkout + - run: *setenv + + - restore_cache: + <<: *restore_cache + + - run: + command: cat /dev/null | sbt it:test + no_output_timeout: 30m + - run: *unsetenv + + - save_cache: + <<: *save_cache + workflows: version: 2 all: @@ -121,6 +143,11 @@ workflows: branches: only: - /astraea\/feature\/.*-its/ + - itWithoutGdal: + filters: + branches: + only: + - /astraea\/feature\/.*-its/ - publish: filters: branches: @@ -136,4 +163,5 @@ workflows: - astraea/develop jobs: - it + - itWithoutGdal - staticAnalysis diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 33a951853..3cfe59371 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -62,11 +62,19 @@ class RasterSourceIT extends TestEnvironment with TestData { } } - describe("GDAL support") { - - it("should read JPEG2000 scene") { - val src = RasterSource(localSentinel) - src.readAll().flatMap(_.tile.statisticsDouble).size should be (64) + if (RasterSource.IsGDAL.hasGDAL) { + describe("GDAL support") { + it("should read JPEG2000 scene") { + RasterSource(localSentinel.toURI).readAll().flatMap(_.tile.statisticsDouble).size should be(64) + } + } + } else { + describe("GDAL missing error support") { + it("should throw exception reading JPEG2000 scene") { + intercept[IllegalArgumentException] { + RasterSource(localSentinel.toURI) + } + } } it("should read small MRF scene with one band converted from MODIS HDF") { @@ -93,4 +101,5 @@ class RasterSourceIT extends TestEnvironment with TestData { val expectedTileCount = tilesPerBand * bands.length (expectedTileCount, bands) } + } From b6dbad14d1fa80288d9918d11cff46f6707fe5c3 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 22 May 2019 13:57:52 -0400 Subject: [PATCH 089/380] Integration test fix. --- .../org/locationtech/rasterframes/ref/RasterSourceIT.scala | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 3cfe59371..7027258ee 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -65,14 +65,14 @@ class RasterSourceIT extends TestEnvironment with TestData { if (RasterSource.IsGDAL.hasGDAL) { describe("GDAL support") { it("should read JPEG2000 scene") { - RasterSource(localSentinel.toURI).readAll().flatMap(_.tile.statisticsDouble).size should be(64) + RasterSource(localSentinel).readAll().flatMap(_.tile.statisticsDouble).size should be(64) } } } else { describe("GDAL missing error support") { it("should throw exception reading JPEG2000 scene") { intercept[IllegalArgumentException] { - RasterSource(localSentinel.toURI) + RasterSource(localSentinel) } } } From cf2cbed7c3c53d61804dadf05c92e3b31820dc5c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 23 May 2019 14:59:37 -0400 Subject: [PATCH 090/380] Draft implementation of RasterJoin. --- .../rasterframes/RasterFunctions.scala | 10 +- .../encoders/StandardEncoders.scala | 3 +- .../encoders/StandardSerializers.scala | 21 +++ .../CellCountAggregate.scala | 2 +- .../CellMeanAggregate.scala | 2 +- .../CellStatsAggregate.scala | 2 +- .../HistogramAggregate.scala | 2 +- .../LocalCountAggregate.scala | 2 +- .../LocalMeanAggregate.scala | 2 +- .../LocalStatsAggregate.scala | 2 +- .../LocalTileOpAggregate.scala | 2 +- .../aggregates/TileRasterizerAggregate.scala | 109 +++++++++++++++ .../rasterframes/expressions/package.scala | 4 +- .../extensions/DataFrameMethods.scala | 3 + .../rasterframes/extensions/RasterJoin.scala | 125 ++++++++++++++++++ .../util/ZeroSevenCompatibilityKit.scala | 2 +- .../test/resources/L8-B4-Elkton-VA-4326.tiff | Bin 0 -> 63934 bytes .../rasterframes/RasterJoinSpec.scala | 57 ++++++++ .../rasterframes/SpatialEncodingSpec.scala | 43 ------ .../rasterframes/encoders/EncodingSpec.scala | 8 ++ 20 files changed, 345 insertions(+), 56 deletions(-) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/CellCountAggregate.scala (98%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/CellMeanAggregate.scala (97%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/CellStatsAggregate.scala (99%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/HistogramAggregate.scala (98%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/LocalCountAggregate.scala (98%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/LocalMeanAggregate.scala (97%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/LocalStatsAggregate.scala (99%) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{aggstats => aggregates}/LocalTileOpAggregate.scala (98%) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala create mode 100644 core/src/test/resources/L8-B4-Elkton-VA-4326.tiff create mode 100644 core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala delete mode 100644 core/src/test/scala/org/locationtech/rasterframes/SpatialEncodingSpec.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index c5caa1c5a..6684cf0a5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -30,7 +30,7 @@ import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.jts.geom.Geometry import org.locationtech.rasterframes.expressions.TileAssembler import org.locationtech.rasterframes.expressions.accessors._ -import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.aggregates._ import org.locationtech.rasterframes.expressions.generators._ import org.locationtech.rasterframes.expressions.localops._ import org.locationtech.rasterframes.expressions.tilestats._ @@ -308,6 +308,14 @@ trait RasterFunctions { def st_reproject(sourceGeom: Column, srcCRS: CRS, dstCRS: CRS): TypedColumn[Any, Geometry] = ReprojectGeometry(sourceGeom, srcCRS, dstCRS) + /** Reproject a column of geometry from one CRS to another. + * @param sourceGeom Geometry column to reproject + * @param srcCRSCol Native CRS of `sourceGeom` as a column + * @param dstCRSCol Destination CRS as a column + */ + def st_reproject(sourceGeom: Column, srcCRSCol: Column, dstCRSCol: Column): TypedColumn[Any, Geometry] = + ReprojectGeometry(sourceGeom, srcCRSCol, dstCRSCol) + /** Render Tile as ASCII string, for debugging purposes. */ def rf_render_ascii(col: Column): TypedColumn[Any, String] = DebugRender.RenderAscii(col) diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala index f9e8d428f..8066265d3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala @@ -28,7 +28,7 @@ import org.locationtech.rasterframes.model._ import org.locationtech.rasterframes.stats.{CellHistogram, CellStatistics, LocalCellStatistics} import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS -import geotrellis.raster.{CellSize, CellType, Tile, TileLayout} +import geotrellis.raster.{CellSize, CellType, Raster, Tile, TileLayout} import geotrellis.spark.tiling.LayoutDefinition import geotrellis.spark.{KeyBounds, SpaceTimeKey, SpatialKey, TemporalKey, TemporalProjectedExtent, TileLayerMetadata} import geotrellis.vector.{Extent, ProjectedExtent} @@ -51,6 +51,7 @@ trait StandardEncoders extends SpatialEncoders { implicit def stkBoundsEncoder: ExpressionEncoder[KeyBounds[SpaceTimeKey]] = ExpressionEncoder() implicit def extentEncoder: ExpressionEncoder[Extent] = ExpressionEncoder[Extent]() implicit def singlebandTileEncoder: ExpressionEncoder[Tile] = ExpressionEncoder() + implicit def rasterEncoder: ExpressionEncoder[Raster[Tile]] = ExpressionEncoder() implicit def tileLayerMetadataEncoder[K: TypeTag]: ExpressionEncoder[TileLayerMetadata[K]] = TileLayerMetadataEncoder() implicit def crsEncoder: ExpressionEncoder[CRS] = CRSEncoder() implicit def projectedExtentEncoder: ExpressionEncoder[ProjectedExtent] = ProjectedExtentEncoder() diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala index 36830c4c0..96815f90b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala @@ -29,6 +29,8 @@ import geotrellis.spark.tiling.LayoutDefinition import geotrellis.vector._ import org.apache.spark.sql.types._ import org.locationtech.jts.geom.Envelope +import org.locationtech.rasterframes +import org.locationtech.rasterframes.TileType import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO import org.locationtech.rasterframes.model.LazyCRS @@ -247,6 +249,25 @@ trait StandardSerializers { ) } + implicit def rasterSerializer: CatalystSerializer[Raster[Tile]] = new CatalystSerializer[Raster[Tile]] { + import org.apache.spark.sql.rf.TileUDT.tileSerializer + + override def schema: StructType = StructType(Seq( + StructField("tile", TileType, false), + StructField("extent", schemaOf[Extent], false) + )) + + override protected def to[R](t: Raster[Tile], io: CatalystIO[R]): R = io.create( + io.to(t.tile), + io.to(t.extent) + ) + + override protected def from[R](t: R, io: CatalystIO[R]): Raster[Tile] = Raster( + io.get[Tile](t, 0), + io.get[Extent](t, 1) + ) + } + implicit val spatialKeyTLMSerializer = tileLayerMetadataSerializer[SpatialKey] implicit val spaceTimeKeyTLMSerializer = tileLayerMetadataSerializer[SpaceTimeKey] diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellCountAggregate.scala similarity index 98% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellCountAggregate.scala index 1e9e7e5e1..82c2d3f93 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellCountAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellCountAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.UnaryRasterAggregate import org.locationtech.rasterframes.expressions.tilestats.{DataCells, NoDataCells} diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellMeanAggregate.scala similarity index 97% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellMeanAggregate.scala index a77c3ee21..009a46cf3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellMeanAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.UnaryRasterAggregate import org.locationtech.rasterframes.expressions.tilestats.{DataCells, Sum} diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellStatsAggregate.scala similarity index 99% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellStatsAggregate.scala index 84ea9632b..95c0bd837 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/CellStatsAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/CellStatsAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.accessors.ExtractTile import org.locationtech.rasterframes.stats.CellStatistics diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/HistogramAggregate.scala similarity index 98% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/HistogramAggregate.scala index cab065e58..44cc1324b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/HistogramAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/HistogramAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import java.nio.ByteBuffer diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalCountAggregate.scala similarity index 98% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalCountAggregate.scala index 8300cfd04..256cd63dd 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalCountAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalCountAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.accessors.ExtractTile import org.locationtech.rasterframes.functions.safeBinaryOp diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala similarity index 97% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala index face1b8a8..e978d21f9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.UnaryRasterAggregate import org.locationtech.rasterframes.expressions.localops.{Add => AddTiles, Divide => DivideTiles} diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalStatsAggregate.scala similarity index 99% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalStatsAggregate.scala index 65267ebc6..86b360dea 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalStatsAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalStatsAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.accessors.ExtractTile import org.locationtech.rasterframes.functions.safeBinaryOp diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalTileOpAggregate.scala similarity index 98% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalTileOpAggregate.scala index 8aacffa9f..b739961c1 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggstats/LocalTileOpAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalTileOpAggregate.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.expressions.aggstats +package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.TileType import org.locationtech.rasterframes.expressions.accessors.ExtractTile diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala new file mode 100644 index 000000000..1f99d0261 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala @@ -0,0 +1,109 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.aggregates + +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import geotrellis.proj4.CRS +import geotrellis.raster.resample.ResampleMethod +import geotrellis.raster.{ArrayTile, CellType, MutableArrayTile, Raster, Tile} +import geotrellis.vector.Extent +import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} +import org.apache.spark.sql.types.{DataType, StructField, StructType} +import org.apache.spark.sql.{Column, Row, TypedColumn} +import geotrellis.raster.reproject.Reproject +import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition + +/** + * Aggregation function for creating a single raster from tiles. + * @param prd settings + */ +class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefinedAggregateFunction { + + val projOpts = Reproject.Options.DEFAULT.copy(method = prd.sampler) + + override def deterministic: Boolean = true + + override def inputSchema: StructType = StructType(Seq( + StructField("crs", schemaOf[CRS], false), + StructField("extent", schemaOf[Extent], false), + StructField("tile", TileType) + )) + + override def bufferSchema: StructType = StructType(Seq( + StructField("tile_buffer", TileType), + StructField("extent_buffer", schemaOf[Extent]) + )) + + override def dataType: DataType = schemaOf[Raster[Tile]] + + override def initialize(buffer: MutableAggregationBuffer): Unit = { + buffer(0) = ArrayTile.empty(prd.cellType, prd.cols, prd.rows) + } + + override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { + val crs = input.getAs[Row](0).to[CRS] + val extent = input.getAs[Row](1).to[Extent] + + val localExtent = extent.reproject(crs, prd.crs) + + if (prd.extent.intersects(localExtent)) { + val localTile = input.getAs[Tile](2).reproject(extent, crs, prd.crs, projOpts) + val bt = buffer.getAs[MutableArrayTile](0) + val merged = bt.merge(prd.extent, localExtent, localTile.tile, prd.sampler) + buffer(0) = merged + if (buffer.isNullAt(1)) + buffer(1) = localExtent.toRow + else { + val curr = buffer.getAs[Row](1).to[Extent] + buffer(1) = curr.combine(localExtent).toRow + } + } + } + + override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { + val leftTile = buffer1.getAs[MutableArrayTile](0) + val rightTile = buffer2.getAs[MutableArrayTile](0) + val leftExtent = buffer1.getAs[Row](1).to[Extent] + val rightExtent = buffer2.getAs[Row](1).to[Extent] + buffer1(0) = leftTile.merge(rightTile) + buffer1(1) = + if (leftExtent == null) rightExtent + else if (rightExtent == null) leftExtent + else leftExtent.combine(rightExtent) + } + + override def evaluate(buffer: Row): Raster[Tile] = { + val t = buffer.getAs[Tile](0) + val e = buffer.getAs[Row](1).to[Extent] + Raster(t, e) + } +} + +object TileRasterizerAggregate { + val nodeName = "tile_rasterizer_aggregate" + /** Convenience grouping of parameters needed for running aggregate. */ + case class ProjectedRasterDefinition(cols: Int, rows: Int, cellType: CellType, crs: CRS, extent: Extent, sampler: ResampleMethod = ResampleMethod.DEFAULT) + + def apply(prd: ProjectedRasterDefinition, crsCol: Column, extentCol: Column, tileCol: Column): TypedColumn[Any, Raster[Tile]] = + new TileRasterizerAggregate(prd)(crsCol, extentCol, tileCol).as(nodeName).as[Raster[Tile]] +} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index c574114d8..a836bed76 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -28,8 +28,8 @@ import org.apache.spark.sql.catalyst.{InternalRow, ScalaReflection} import org.apache.spark.sql.rf.VersionShims._ import org.apache.spark.sql.{SQLContext, rf} import org.locationtech.rasterframes.expressions.accessors._ -import org.locationtech.rasterframes.expressions.aggstats.CellCountAggregate.DataCells -import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.aggregates.CellCountAggregate.DataCells +import org.locationtech.rasterframes.expressions.aggregates._ import org.locationtech.rasterframes.expressions.generators._ import org.locationtech.rasterframes.expressions.localops._ import org.locationtech.rasterframes.expressions.tilestats._ diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 58b1e7e56..373a7f1db 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -168,6 +168,9 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada potentialRF } + /** Performs a jeft join on the dataframe `right` to this one, reprojecting tiles. */ + def rasterJoin(right: DataFrame): DataFrame = RasterJoin(self, right) + /** * Convert DataFrame into a RasterFrame * diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala new file mode 100644 index 000000000..327b51ce6 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -0,0 +1,125 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.extensions +import geotrellis.proj4.CRS +import geotrellis.raster._ +import geotrellis.raster.reproject.Reproject +import geotrellis.raster.resample.ResampleMethod +import geotrellis.vector.Extent +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.util._ +import org.apache.spark.sql._ +import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.model.TileDimensions + +import scala.util.Random +/* + val crs = input.getAs[Row](0).to[CRS] + val extent = input.getAs[Row](1).to[Extent] + + val localExtent = extent.reproject(crs, prd.crs) + + if (prd.extent.intersects(localExtent)) { + val localTile = input.getAs[Tile](2).reproject(extent, crs, prd.crs, projOpts) + val bt = buffer.getAs[MutableArrayTile](0) + val merged = bt.merge(prd.extent, localExtent, localTile.tile, prd.sampler) + buffer(0) = merged + } + + // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. + private def apply_mask = udf((t: Tile, extentStruct: Row, crsStruct: Row, geom: Seq[Geometry]) ⇒ { + val e = extentStruct.to[Extent] + val c = crsStruct.to[CRS] + val reprojectedGeoms = geom.map(g ⇒ GTGeometry(g).reproject(LatLng, c)) + t.mask(e, reprojectedGeoms) + }) + */ + +object RasterJoin { + private val projOpts = Reproject.Options.DEFAULT + + // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. + def reproject_and_merge = udf((leftExtentEnc: Row, leftCRSEnc: Row, tiles: Seq[Tile], rightExtentEnc: Seq[Row], rightCRSEnc: Seq[Row], leftDimsEnc: Row) => { + require(tiles.length == rightExtentEnc.length && tiles.length == rightCRSEnc.length, "size mismatch") + + val leftExtent = leftExtentEnc.to[Extent] + val leftDims = leftDimsEnc.to[TileDimensions] + val leftCRS = leftCRSEnc.to[CRS] + val rightExtents = rightExtentEnc.map(_.to[Extent]) + val rightCRSs = rightCRSEnc.map(_.to[CRS]) + + //is there a GT function to do all this? + val cellType = tiles.map(_.cellType).reduce(_ union _) + + val dest: Tile = ArrayTile.empty(cellType, leftDims.cols, leftDims.rows) + tiles.zip(rightExtents).zip(rightCRSs).map { + case ((tile, extent), crs) => + tile.reproject(extent, crs, leftCRS, projOpts) + }.foldLeft(dest)((d, t) => + d.merge(leftExtent, t.extent, t.tile, projOpts.method) + ) + }).withName("reproject_and_merge") + + def apply(left: DataFrame, right: DataFrame): DataFrame = { + val df = apply(left, right, left("extent"), left("crs"), right("extent"), right("crs")) + df.drop(right("extent")).drop(right("crs")) + } + + def apply(left: DataFrame, right: DataFrame, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = { + apply(left, right, st_intersects( + st_geometry(leftExtent), + st_reproject(st_geometry(rightExtent), rightCRS, leftCRS) + ), leftExtent, leftCRS, rightExtent, rightCRS) + } + def apply(left: DataFrame, right: DataFrame, joinExprs: Column, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = { + // Unique id for temporary columns + val id = Random.alphanumeric.take(5).mkString("_", "", "_") + + // Post aggregation left extent. We preserve the original name. + val leftExtent2 = leftExtent.columnName + // Post aggregation left crs. We preserve the original name. + val leftCRS2 = leftCRS.columnName + // Post aggregation right extent. We create a new name. + val rightExtent2 = id + "extent" + // Post aggregation right crs. We create a new name. + val rightCRS2 = id + "crs" + + // A representative tile from the left + val leftTile = left.tileColumns.headOption.getOrElse(throw new IllegalArgumentException("Need at least one target tile on LHS")) + + + val leftAggCols = left.columns.map(s => first(left(s), true) as s) + val rightAggCtx = Seq(collect_list(rightExtent) as rightExtent2, collect_list(rightCRS) as rightCRS2) + val rightAggTiles = right.tileColumns.map(c => collect_list(c) as c.columnName) + val aggCols = leftAggCols ++ rightAggTiles ++ rightAggCtx + val reprojCols = rightAggTiles.map(t => reproject_and_merge(col(leftExtent2), col(leftCRS2), col(t.columnName), col(rightExtent2), col(rightCRS2), rf_dimensions(leftTile)) as t.columnName) + val finalCols = leftAggCols.map(c => col(c.columnName)) ++ reprojCols + + left + .withColumn(id, monotonically_increasing_id()) + .join(right, joinExprs, joinType = "left") + .groupBy(col(id)) + .agg(aggCols.head, aggCols.tail: _*) + .select(finalCols: _*) + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala index b5e62b42d..d937dd290 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -23,7 +23,7 @@ package org.locationtech.rasterframes.util import org.locationtech.rasterframes.expressions.TileAssembler import org.locationtech.rasterframes.expressions.accessors._ -import org.locationtech.rasterframes.expressions.aggstats._ +import org.locationtech.rasterframes.expressions.aggregates._ import org.locationtech.rasterframes.expressions.generators._ import org.locationtech.rasterframes.expressions.localops._ import org.locationtech.rasterframes.expressions.tilestats._ diff --git a/core/src/test/resources/L8-B4-Elkton-VA-4326.tiff b/core/src/test/resources/L8-B4-Elkton-VA-4326.tiff new file mode 100644 index 0000000000000000000000000000000000000000..df3fe975304cf9072ed2b0f2c89036194e57e456 GIT binary patch literal 63934 zcmeFZWpEtJ)-5PAGgfkDRdow3$sn`LD3fd-v&_uQ%rY|^Gt)6MGcz+YGu!f8?fV_i zogXv5CSJsg81Jyv7PPu6GxuJ5t+lI6nLxj!etv%G{QTl2@Qa5>=kPb)|2&?G$MOH? zaauf1@IQ}z- zz}Fk%7YrPn(l0R{_r&AX!xH!@JYJ5+Ylfxti;u_8@ObU8`2YF6c-((se7{ooJi%k% zpJ4g_{C7CV`@)lC(|&%n3j6sDt>@>ruCJfptyzA4$#?qsMcnZ7D^RLQ>Fp(9Dmn#tJ`)XwJ0-^u+AM^8T zTs!H(8>Mp=`uF4S7x(}2Pr%S(0i%{z*|Y6hfd-{=6~n9h&!2d|S0{;|UqY-8t^h9Q z?~lF<5YO*X+IUIV4#QXd694}H7&}?gHN$*Alj8SBKfmE^I#1yXI~K;b6kc4lMv>~J zs;E3Ud;jOjfBzdm-jN74gg+6JRa?H2tRzw7FOr|+CRs>ZGJwV76j7B`6idZN`Plr| zkN*D;|2JKM&RCDbGy%^dE~pUNfHWY%B!mPZUR!eV8`Wg*wh@vOn3vo~zr7{_35~E<1^HDj#C3ZlKnQWi&HQL`Ty{>;X00@GSgqnvYfH?fDCO zne?J}wqNA{B^kDMWAX)jh%HIlON)|JTKSX zrDMOyYBGd+N zuzhqrJu1?QP*m3cum0>MHP{x>NG_utNfp9L0)$1*6cL`CAB!MzgiNGGD}^*#wrESLAIGL--6H%JR~MWE|;18O_GBv3PU<&QU9p zm0u>=xuceQmV5l1;{GMPKLR_3d<~r*{6wVX$q~occbvu#e3qOhXPK*VqMoP=sZgE9 zEHv9x1yxQy6$x|#tV(&4%Km0IGz)dGDPwogd&C~`j?ELvcxkep-r@aNAirW?vBT_l zv;%!k9+6BmiY&FNv*x@xug)j&Is7j^jTaJ$17$fkRz{>28F*Smb6%L`pzYZ-UYGaeGw2#?jkVD# zjuZPgYSCS+&M)$n_)$Olo_zRyqP~(GGzZqm<~El+C(p{mRkS!D3zMbv31TW~!3OfA zz%zcVFiXZW^CpOyyePj$TahuOCu-YRVqq;;(XYs^&&fPCj8~UI*l{U!N%qxi)ivY)IPXZ(V=Al90MCa>(IPMY)Pt%}g4Glct*Z1AzmK(9 z&-e3Qd^g{TER{;ELHMciawrd=d&xnXk52fnsw{b9GGAymm>wZDNJ5f~v_Ui!Bl%YL zfSq6;`5EDrH)MZVN(6{RBClF*&vbg)37r5pz-{lIb&BdpC#};>gwjarPX{69(meDa zEyRBz_Y~!dr$992LC9wfc^_Vdk7Prv9M%a$WAenhMwTM4-9~nMhg0;Pyu{;Uh%dxT zGh&Z~^Kib6&lO$7BlZ`tO(VLE&Z95!eGOOx9v|l@CEvp4;3RcNd|{htMmiGvat)bD z#**P=3>(Ap$%`x@Tg3aRdvc}RD6b=y>pgZQr=6R}v%v1Dv&!|jZsSCCkze$}%KUKN z@ii=j_ceV@d)->qQ@`X+c|xaSc#n5US1tzElhmkN8pk4{yn) z(cVBLly+i+`Fl2ndHFrIiKXM!ST%MT=Q1xcK|T^mj^o)Yk|wkXt;ut-C!`M5Vv+tL z`^YY)iz)7W^p^2tcgHwaOfz{&yyrD!4LM81$gZD32Exhl# ztU2q?va?ET6e0!xj$KuOKSGwBA_j}b;&1jh8_AQ3Jffp0pqskAoz`Zo9;-(%*SV|f zA%9E|yO7J?&^L4xJ1sJc8N37^$lLI_sN>h^by|olVU2kUzKmrcjjd%?exUv*Bo~Qh z-F2iMB)94Ms=m0+uk-Odgx@8JX#^$g0=vtopdx|XC8x@7B3Nc+O;|n}Ni z^Txass(n{J2>%vm#aSK}#cT6AJd#ef8d)Qe=Pn}hll`Kfr=Zipaop~Dno5EwqBe`o zVl3+ZX8N8^WtBuFu?qXUx*999sQaWGDsr6FnRn)CP^*%0DkrnKOweky1L;8OlZ@nx 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 Date: Fri, 24 May 2019 10:17:03 -0400 Subject: [PATCH 091/380] Added `rf_abs`. --- .../rasterframes/RasterFunctions.scala | 4 ++ .../expressions/localops/Abs.scala | 50 +++++++++++++++++++ .../rasterframes/expressions/package.scala | 1 + .../tiles/ProjectedRasterTile.scala | 1 + .../rasterframes/RasterFunctionsSpec.scala | 9 ++++ .../rasterframes/TestEnvironment.scala | 7 ++- docs/src/main/tut/reference.md | 8 ++- docs/src/main/tut/release-notes.md | 2 +- .../python/pyrasterframes/rasterfunctions.py | 1 + pyrasterframes/python/requirements.txt | 5 ++ pyrasterframes/python/setup.py | 34 ++++--------- .../python/tests/PyRasterFramesTests.py | 5 +- 12 files changed, 97 insertions(+), 30 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala create mode 100644 pyrasterframes/python/requirements.txt diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 6684cf0a5..dc0eca688 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -376,6 +376,10 @@ trait RasterFunctions { def rf_round(tileCol: Column): TypedColumn[Any, Tile] = Round(tileCol) + /** Compute the absolute value of each cell. */ + def rf_abs(tileCol: Column): TypedColumn[Any, Tile] = + Abs(tileCol) + /** Take natural logarithm of cell values. */ def rf_log(tileCol: Column): TypedColumn[Any, Tile] = Log(tileCol) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala new file mode 100644 index 000000000..196bf30b7 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala @@ -0,0 +1,50 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.localops + +import geotrellis.raster.Tile +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryLocalRasterOp} + +@ExpressionDescription( + usage = "_FUNC_(tile) - Compute the absolute value of each cell.", + arguments = """ + Arguments: + * tile - tile column to apply abs""", + examples = """ + Examples: + > SELECT _FUNC_(tile); + ...""" +) +case class Abs(child: Expression) extends UnaryLocalRasterOp with NullToValue with CodegenFallback { + override def nodeName: String = "rf_abs" + override def na: Any = null + override protected def op(child: Tile): Tile = child.localAbs() +} + +object Abs { + def apply(tile: Column): TypedColumn[Any, Tile] = + new Column(Abs(tile.expr)).as[Tile] +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index a836bed76..6ab3a1d10 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -86,6 +86,7 @@ package object expressions { registry.registerExpression[Unequal]("rf_local_unequal") registry.registerExpression[Sum]("rf_tile_sum") registry.registerExpression[Round]("rf_round") + registry.registerExpression[Abs]("rf_abs") registry.registerExpression[Log]("rf_log") registry.registerExpression[Log10]("rf_log10") registry.registerExpression[Log2]("rf_log2") diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala index 59a9f24cb..12e9e201c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala @@ -45,6 +45,7 @@ trait ProjectedRasterTile extends FixedDelegatingTile with ProjectedRasterLike { def crs: CRS def projectedExtent: ProjectedExtent = ProjectedExtent(extent, crs) def projectedRaster: ProjectedRaster[Tile] = ProjectedRaster[Tile](this, extent, crs) + def mapTile(f: Tile => Tile): ProjectedRasterTile = ProjectedRasterTile(f(this), extent, crs) } object ProjectedRasterTile { diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index d82eaec9a..160e01ec8 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -619,6 +619,15 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_round") } + it("should abs cell values") { + val minus = one.mapTile(t => t.convert(IntConstantNoDataCellType) * -1) + val df = Seq((minus, one)).toDF("minus", "one") + + assertEqual(df.select(rf_abs($"minus").as[ProjectedRasterTile]).first(), one) + + checkDocs("rf_abs") + } + it("should take logarithms positive cell values"){ // rf_log10 1000 == 3 val thousand = TestData.projectedRasterTile(cols, rows, 1000, extent, crs, ShortConstantNoDataCellType) diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala index 78ead237e..0600b4745 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala @@ -43,8 +43,11 @@ trait TestEnvironment extends FunSpec with GeoTrellisTestEnvironment //p.setProperty(“spark.driver.allowMultipleContexts”, “true”) lazy val sqlContext: SQLContext = { - val session = SparkSession.builder.config(_sc.getConf).getOrCreate() - org.locationtech.rasterframes.WithSQLContextMethods(session.sqlContext).withRasterFrames + val session = SparkSession.builder + .config(_sc.getConf) + .config("spark.sql.crossJoin.enabled", true) + .getOrCreate() + session.sqlContext.withRasterFrames } lazy val sql: String ⇒ DataFrame = sqlContext.sql diff --git a/docs/src/main/tut/reference.md b/docs/src/main/tut/reference.md index c24f5d680..492773a7d 100644 --- a/docs/src/main/tut/reference.md +++ b/docs/src/main/tut/reference.md @@ -365,7 +365,13 @@ Returns a `tile` column containing the element-wise inequality of `tile1` and `r Round cell values to the nearest integer without changing the cell type. -#### rf_exp +#### rf_abs + + Tile rf_abs(Tile tile) + + Compute the absolute value of cell value. + + #### rf_exp Tile rf_exp(Tile tile) diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 5f40f0f43..2a7cd08fb 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -5,7 +5,7 @@ ### 0.8.0 * Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. -* Added new tile functions `rf_round`, `rf_log`, `rf_log10`, `rf_log2`, `rf_log1p`, `rf_exp`, `rf_exp10`, `rf_exp2`, `rf_expm1`, `rf_resample`. +* Added new tile functions `rf_round`, `rf_abs`, `rf_log`, `rf_log10`, `rf_log2`, `rf_log1p`, `rf_exp`, `rf_exp10`, `rf_exp2`, `rf_expm1`, `rf_resample`. * Support python-side [Shapely](https://pypi.org/project/Shapely/) geometry User-Defined Type. * SQL API support for: `rf_assemble_tile`, `rf_array_to_tile`. * Introduced at the source level the concept of a `RasterSource` and `RasterRef`, enabling lazy/delayed read of sub-scene tiles. diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 102f7e247..95dff69cb 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -236,6 +236,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_local_equal': 'Cellwise equality comparison between two tiles', 'rf_local_unequal': 'Cellwise inequality comparison between two tiles', 'rf_round': 'Round cell values to the nearest integer without changing the cell type', + 'rf_abs': 'Compute the absolute value of each cell', 'rf_log': 'Performs cell-wise natural logarithm', 'rf_log10': 'Performs cell-wise logartithm with base 10', 'rf_log2': 'Performs cell-wise logartithm with base 2', diff --git a/pyrasterframes/python/requirements.txt b/pyrasterframes/python/requirements.txt new file mode 100644 index 000000000..c4bb2804e --- /dev/null +++ b/pyrasterframes/python/requirements.txt @@ -0,0 +1,5 @@ +pytz +shapely +pyspark==2.3.3 +numpy>=1.7 +pandas diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index a0f318008..e3f5fd107 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -2,10 +2,10 @@ The operations in this file are designed for development and testing only. """ - from setuptools import setup, find_packages import distutils.log import importlib +from os import environ def _extract_module(mod): @@ -17,7 +17,6 @@ def _extract_module(mod): globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) - class ExampleCommand(distutils.cmd.Command): """A custom command to run pyrasterframes examples.""" @@ -52,7 +51,6 @@ def finalize_options(self): self.examples = map(lambda x: 'examples.' + x.stem, map(self._check_ex_path, self.examples)) - def run(self): """Run the examples.""" import traceback @@ -98,42 +96,32 @@ def run(self): przip.write('LICENSE.md', 'pyrasterframes/LICENSE.md') - - - with open('README.rst') as f: readme = f.read() -#pyspark_ver = 'pyspark>=2.2.0,<2.3' -pyspark_ver = 'pyspark==2.3.2' +with open('requirements.txt') as f: + requirements = f.read().splitlines() setup_args = dict( name='pyrasterframes', description='Python bindings for RasterFrames', long_description=readme, - version='0.0.1', + version=environ.get('RASTERFRAMES_VERSION', 'SNAPSHOT'), url='http://rasterframes.io', - author='D. Benjamin Guseman', - author_email='guseman@astraea.io', + author='Astraea, Inc.', + author_email='info@astraea.io', license='Apache 2', - setup_requires=['pytest-runner', pyspark_ver, 'pathlib'], - install_requires=[ - 'pytz', 'shapely', - # pyspark_ver, - # 'pathlib' - ], + setup_requires=['pytest-runner', 'pathlib'], + install_requires=requirements, tests_require=[ - pyspark_ver, 'pytest==3.4.2', - 'pypandoc', - 'numpy>=1.7', - 'pandas', + 'pypandoc' ], test_suite="pytest-runner", packages=find_packages(exclude=['tests', 'examples']), include_package_data=True, - package_data={'.':['LICENSE.md'], 'pyrasterframes':['*.jar']}, - exclude_package_data={'.':['setup.*', 'README.*']}, + package_data={'.': ['LICENSE.md'], 'pyrasterframes': ['*.jar']}, + exclude_package_data={'.': ['setup.*', 'README.*']}, classifiers=[ 'Development Status :: 3 - Alpha', 'Environment :: Other Environment', diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 45874be15..faa337010 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -4,7 +4,6 @@ from pyrasterframes.rasterfunctions import * from geomesa_pyspark.types import * from pathlib import Path -import os import unittest # version-conditional imports @@ -110,7 +109,8 @@ def test_tile_functions(self): .withColumn('log', rf_log(self.tileCol)) \ .withColumn('exp', rf_exp(self.tileCol)) \ .withColumn('expm1', rf_expm1(self.tileCol)) \ - .withColumn('round', rf_round(self.tileCol)) + .withColumn('round', rf_round(self.tileCol)) \ + .withColumn('abs', rf_abs(self.tileCol)) df.show() @@ -119,7 +119,6 @@ def test_prt_functions(self): .withColumn('crs', rf_crs(self.tileCol)) \ .withColumn('ext', rf_extent(self.tileCol)) \ .withColumn('geom', rf_geometry(self.tileCol)) - df.printSchema df.show() def test_rasterize(self): From d6234cde1f5a44a282a1d7fc9cd9558fcc8d597f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 24 May 2019 12:39:10 -0400 Subject: [PATCH 092/380] Incremental progress commit. --- .../encoders/StandardSerializers.scala | 4 +- .../aggregates/TileRasterizerAggregate.scala | 18 +---- .../rasterframes/extensions/RasterJoin.scala | 28 +------- .../rasterframes/RasterJoinSpec.scala | 67 ++++++++++++++----- 4 files changed, 56 insertions(+), 61 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala index 96815f90b..affe545b8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardSerializers.scala @@ -21,7 +21,6 @@ package org.locationtech.rasterframes.encoders -import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.spark._ @@ -29,9 +28,8 @@ import geotrellis.spark.tiling.LayoutDefinition import geotrellis.vector._ import org.apache.spark.sql.types._ import org.locationtech.jts.geom.Envelope -import org.locationtech.rasterframes import org.locationtech.rasterframes.TileType -import org.locationtech.rasterframes.encoders.CatalystSerializer.CatalystIO +import org.locationtech.rasterframes.encoders.CatalystSerializer.{CatalystIO, _} import org.locationtech.rasterframes.model.LazyCRS /** Collection of CatalystSerializers for third-party types. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala index 1f99d0261..f8f53a34e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala @@ -50,8 +50,7 @@ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefine )) override def bufferSchema: StructType = StructType(Seq( - StructField("tile_buffer", TileType), - StructField("extent_buffer", schemaOf[Extent]) + StructField("tile_buffer", TileType) )) override def dataType: DataType = schemaOf[Raster[Tile]] @@ -71,31 +70,18 @@ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefine val bt = buffer.getAs[MutableArrayTile](0) val merged = bt.merge(prd.extent, localExtent, localTile.tile, prd.sampler) buffer(0) = merged - if (buffer.isNullAt(1)) - buffer(1) = localExtent.toRow - else { - val curr = buffer.getAs[Row](1).to[Extent] - buffer(1) = curr.combine(localExtent).toRow - } } } override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { val leftTile = buffer1.getAs[MutableArrayTile](0) val rightTile = buffer2.getAs[MutableArrayTile](0) - val leftExtent = buffer1.getAs[Row](1).to[Extent] - val rightExtent = buffer2.getAs[Row](1).to[Extent] buffer1(0) = leftTile.merge(rightTile) - buffer1(1) = - if (leftExtent == null) rightExtent - else if (rightExtent == null) leftExtent - else leftExtent.combine(rightExtent) } override def evaluate(buffer: Row): Raster[Tile] = { val t = buffer.getAs[Tile](0) - val e = buffer.getAs[Row](1).to[Extent] - Raster(t, e) + Raster(t, prd.extent) } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala index 327b51ce6..117676e36 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -23,37 +23,15 @@ package org.locationtech.rasterframes.extensions import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.raster.reproject.Reproject -import geotrellis.raster.resample.ResampleMethod import geotrellis.vector.Extent -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.util._ import org.apache.spark.sql._ import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.util._ import scala.util.Random -/* - val crs = input.getAs[Row](0).to[CRS] - val extent = input.getAs[Row](1).to[Extent] - - val localExtent = extent.reproject(crs, prd.crs) - - if (prd.extent.intersects(localExtent)) { - val localTile = input.getAs[Tile](2).reproject(extent, crs, prd.crs, projOpts) - val bt = buffer.getAs[MutableArrayTile](0) - val merged = bt.merge(prd.extent, localExtent, localTile.tile, prd.sampler) - buffer(0) = merged - } - - // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. - private def apply_mask = udf((t: Tile, extentStruct: Row, crsStruct: Row, geom: Seq[Geometry]) ⇒ { - val e = extentStruct.to[Extent] - val c = crsStruct.to[CRS] - val reprojectedGeoms = geom.map(g ⇒ GTGeometry(g).reproject(LatLng, c)) - t.mask(e, reprojectedGeoms) - }) - */ object RasterJoin { private val projOpts = Reproject.Options.DEFAULT @@ -68,10 +46,10 @@ object RasterJoin { val rightExtents = rightExtentEnc.map(_.to[Extent]) val rightCRSs = rightCRSEnc.map(_.to[CRS]) - //is there a GT function to do all this? val cellType = tiles.map(_.cellType).reduce(_ union _) val dest: Tile = ArrayTile.empty(cellType, leftDims.cols, leftDims.rows) + //is there a GT function to do all this? tiles.zip(rightExtents).zip(rightCRSs).map { case ((tile, extent), crs) => tile.reproject(extent, crs, leftCRS, projOpts) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index b260d50f8..72138c478 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -22,36 +22,69 @@ package org.locationtech.rasterframes import geotrellis.raster.io.geotiff.GeoTiff -import geotrellis.raster.{Raster, Tile} -import geotrellis.raster.render.ColorRamps +import geotrellis.raster.resample.Bilinear +import geotrellis.raster.testkit.RasterMatchers +import geotrellis.raster.{IntConstantNoDataCellType, Raster, Tile} +import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.encoders.serialized_literal import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate -import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition -class RasterJoinSpec extends TestEnvironment with TestData { +class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { + import spark.implicits._ describe("Raster join between two DataFrames") { - it("should join same scene in two projections, same tile size") { - val s1 = readSingleband("L8-B4-Elkton-VA.tiff") - val s2 = readSingleband("L8-B4-Elkton-VA-4326.tiff") + val s1 = readSingleband("L8-B4-Elkton-VA.tiff") + val s2 = readSingleband("L8-B4-Elkton-VA-4326.tiff") + + val r1 = s1.projectedRaster.mapTile(_.convert(IntConstantNoDataCellType)).toRF(10, 10) + .withExtent() + .withColumn("crs", serialized_literal(s1.crs)) + val r2 = s2.projectedRaster.mapTile(_.convert(IntConstantNoDataCellType)).toRF(10, 10) + .withExtent() + .withColumn("crs", serialized_literal(s2.crs)) + .withColumnRenamed("tile", "tile2") + + it("should join the same scene correctly") { + val joined = r1.rasterJoin(r1.withColumnRenamed("tile", "tile2")) + joined.count() should be (joined.count()) - val r1 = s1.projectedRaster.toRF(10, 10).withExtent().withColumn("crs", serialized_literal(s1.crs)) - val r2 = s2.projectedRaster.toRF(10, 10) - .withExtent() - .withColumn("crs", serialized_literal(s2.crs)) - .withColumnRenamed("tile", "tile2") + val measure = joined.select(rf_tile_mean(rf_local_subtract($"tile", $"tile2"))) + + } + + it("should join same scene in two projections, same tile size") { val joined = r1.rasterJoin(r2) + + val result = joined.agg(TileRasterizerAggregate( - ProjectedRasterDefinition(s1.cols, s1.rows, s1.cellType, s1.crs, s1.extent), - col("crs"), col("extent"), col("tile2")) as "raster" + ProjectedRasterDefinition(s1.cols, s1.rows, s1.cellType, s1.crs, s1.extent, Bilinear), + $"crs", $"extent", $"tile2") as "raster" ).select(col("raster").as[Raster[Tile]]).first() - GeoTiff(result, s1.crs).write("target/out.tiff") + // GeoTiff(result, s1.crs).write("target/out.tiff") result.extent shouldBe s1.extent - //result.tile.renderPng(ColorRamps.greyscale(256)).write("target/out.png") - } + + // Not sure what the right test is... here's... something? + import geotrellis.raster.mapalgebra.local._ + val sub = s1.extent.buffer(-s1.extent.width * 0.01) + val diff = Abs( + Subtract( + result.crop(sub).tile.convert(IntConstantNoDataCellType), + s1.raster.crop(sub).tile.convert(IntConstantNoDataCellType) + ) + ) + + diff.statisticsDouble.get.mean should be (0.0 +- 200) + + + GeoTiff(diff, s1.extent, s1.crs).write("target/diff.tiff") + + + //assertEqual(result.crop(subRegion).tile, s1.raster.crop(subRegion).tile, 500) + + } } } From d4df1847c6762d7d554b42cf2d83314040df06e3 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 27 May 2019 09:51:56 -0400 Subject: [PATCH 093/380] Added overloaded rasterJoin method for specifying geolocation columns. --- .../extensions/DataFrameMethods.scala | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 373a7f1db..50d0c65dc 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -168,9 +168,29 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada potentialRF } - /** Performs a jeft join on the dataframe `right` to this one, reprojecting tiles. */ + /** + * Performs a jeft join on the dataframe `right` to this one, reprojecting and merging tiles as necessary. + * The operation is logically a "left outer" join, with the left side also determining the target CRS and extents. + * Right side may have multiple Tile columns. Assumes both dataframes use the column names `extent` and `crs` for + * the Extent and CRS details for each row. + * + * @param right Right side of the join. + * @return joined dataframe + */ def rasterJoin(right: DataFrame): DataFrame = RasterJoin(self, right) + /** + * + * @param leftExtent this (left) dataframe's Extent column + * @param leftCRS this (left) datafrasme's CRS column + * @param right right dataframe + * @param rightExtent right dataframe's CRS extent + * @param rightCRS right dataframe's CRS column + * @return joined dataframe + */ + def rasterJoin(leftExtent: Column, leftCRS: Column, right: DataFrame, rightExtent: Column, rightCRS: Column): DataFrame = + RasterJoin(self, right, leftExtent, leftCRS, rightExtent, rightCRS) + /** * Convert DataFrame into a RasterFrame * From 85510c13e4a7c6a0604980bfcda1c99f93385087 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 10:33:51 -0400 Subject: [PATCH 094/380] Added CRS resolution benchmark --- bench/archive/jmh-results-20190528095237.json | 163 ++++++++++++++++++ bench/archive/jmh-results-20190528102317.json | 163 ++++++++++++++++++ .../rasterframes/bench/CRSBench.scala | 56 ++++++ .../bench/CatalystSerializerBench.scala | 1 - .../rasterframes/model/LazyCRS.scala | 9 +- 5 files changed, 390 insertions(+), 2 deletions(-) create mode 100644 bench/archive/jmh-results-20190528095237.json create mode 100644 bench/archive/jmh-results-20190528102317.json create mode 100644 bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala diff --git a/bench/archive/jmh-results-20190528095237.json b/bench/archive/jmh-results-20190528095237.json new file mode 100644 index 000000000..11d8f15f0 --- /dev/null +++ b/bench/archive/jmh-results-20190528095237.json @@ -0,0 +1,163 @@ +[ + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalEquals", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 421.72586734818816, + "scoreError" : 21.639640737136855, + "scoreConfidence" : [ + 400.0862266110513, + 443.365508085325 + ], + "scorePercentiles" : { + "0.0" : 416.0271304058273, + "50.0" : 420.27062086802925, + "90.0" : 430.09766576285773, + "95.0" : 430.09766576285773, + "99.0" : 430.09766576285773, + "99.9" : 430.09766576285773, + "99.99" : 430.09766576285773, + "99.999" : 430.09766576285773, + "99.9999" : 430.09766576285773, + "100.0" : 430.09766576285773 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 417.8839821936131, + 416.0271304058273, + 430.09766576285773, + 424.349937510613, + 420.27062086802925 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.resolveCRS", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 358.41316103726996, + "scoreError" : 21.21533668234991, + "scoreConfidence" : [ + 337.19782435492004, + 379.6284977196199 + ], + "scorePercentiles" : { + "0.0" : 351.9024799408263, + "50.0" : 356.47836323413975, + "90.0" : 364.61463628732025, + "95.0" : 364.61463628732025, + "99.0" : 364.61463628732025, + "99.9" : 364.61463628732025, + "99.99" : 364.61463628732025, + "99.999" : 364.61463628732025, + "99.9999" : 364.61463628732025, + "100.0" : 364.61463628732025 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 356.47836323413975, + 364.61463628732025, + 355.393162879192, + 363.67716284487153, + 351.9024799408263 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.selfEquals", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 431.7566794354569, + "scoreError" : 27.353383248644004, + "scoreConfidence" : [ + 404.4032961868129, + 459.11006268410085 + ], + "scorePercentiles" : { + "0.0" : 426.33479529843424, + "50.0" : 428.0558107251467, + "90.0" : 443.6223317651236, + "95.0" : 443.6223317651236, + "99.0" : 443.6223317651236, + "99.9" : 443.6223317651236, + "99.99" : 443.6223317651236, + "99.999" : 443.6223317651236, + "99.9999" : 443.6223317651236, + "100.0" : 443.6223317651236 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 443.6223317651236, + 433.04934952339687, + 426.33479529843424, + 427.72110986518294, + 428.0558107251467 + ] + ] + }, + "secondaryMetrics" : { + } + } +] + + diff --git a/bench/archive/jmh-results-20190528102317.json b/bench/archive/jmh-results-20190528102317.json new file mode 100644 index 000000000..20e5712a1 --- /dev/null +++ b/bench/archive/jmh-results-20190528102317.json @@ -0,0 +1,163 @@ +[ + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalEquals", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 7.084784138200969, + "scoreError" : 0.17086123184222066, + "scoreConfidence" : [ + 6.913922906358748, + 7.255645370043189 + ], + "scorePercentiles" : { + "0.0" : 7.044718220088579, + "50.0" : 7.07291741895685, + "90.0" : 7.153508778664247, + "95.0" : 7.153508778664247, + "99.0" : 7.153508778664247, + "99.9" : 7.153508778664247, + "99.99" : 7.153508778664247, + "99.999" : 7.153508778664247, + "99.9999" : 7.153508778664247, + "100.0" : 7.153508778664247 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 7.07291741895685, + 7.044718220088579, + 7.101541478172196, + 7.153508778664247, + 7.051234795122972 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.resolveCRS", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.07204597602344914, + "scoreError" : 0.014595696186190624, + "scoreConfidence" : [ + 0.05745027983725852, + 0.08664167220963977 + ], + "scorePercentiles" : { + "0.0" : 0.067949003349235, + "50.0" : 0.07168162461398803, + "90.0" : 0.07812749538776566, + "95.0" : 0.07812749538776566, + "99.0" : 0.07812749538776566, + "99.9" : 0.07812749538776566, + "99.99" : 0.07812749538776566, + "99.999" : 0.07812749538776566, + "99.9999" : 0.07812749538776566, + "100.0" : 0.07812749538776566 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.0701740653091496, + 0.07812749538776566, + 0.07229769145710743, + 0.07168162461398803, + 0.067949003349235 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.selfEquals", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.04160068241214439, + "scoreError" : 8.000367242705733E-4, + "scoreConfidence" : [ + 0.04080064568787382, + 0.04240071913641496 + ], + "scorePercentiles" : { + "0.0" : 0.0413462799613575, + "50.0" : 0.04153631854728124, + "90.0" : 0.04183927734451199, + "95.0" : 0.04183927734451199, + "99.0" : 0.04183927734451199, + "99.9" : 0.04183927734451199, + "99.99" : 0.04183927734451199, + "99.999" : 0.04183927734451199, + "99.9999" : 0.04183927734451199, + "100.0" : 0.04183927734451199 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.0413462799613575, + 0.04183927734451199, + 0.04153631854728124, + 0.0417885245223439, + 0.0414930116852273 + ] + ] + }, + "secondaryMetrics" : { + } + } +] + + diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala new file mode 100644 index 000000000..3ccce8246 --- /dev/null +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala @@ -0,0 +1,56 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.bench + +import java.util.concurrent.TimeUnit + +import geotrellis.proj4.{CRS, LatLng} +import org.locationtech.proj4j.CoordinateReferenceSystem +import org.locationtech.rasterframes.model.LazyCRS +import org.openjdk.jmh.annotations._ + +@BenchmarkMode(Array(Mode.AverageTime)) +@State(Scope.Benchmark) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +class CRSEncodingBench extends SparkEnv { + + var crs: CRS = _ + + @Setup(Level.Invocation) + def setupData(): Unit = { + crs = LazyCRS("epsg:4326") + } + @Benchmark + def resolveCRS(): CoordinateReferenceSystem = { + crs.proj4jCrs + } + + @Benchmark + def selfEquals(): Boolean = { + crs == crs + } + + @Benchmark + def logicalEquals(): Boolean = { + crs == LatLng + } +} diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala index aff447ac4..12a6b0486 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/CatalystSerializerBench.scala @@ -23,7 +23,6 @@ package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import org.locationtech.rasterframes.encoders.CatalystSerializer import geotrellis.proj4.{CRS, LatLng, Sinusoidal} import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala index d01d49317..611428b22 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala @@ -25,12 +25,19 @@ import LazyCRS.EncodedCRS import geotrellis.proj4.CRS import org.locationtech.proj4j.CoordinateReferenceSystem -class LazyCRS(encoded: EncodedCRS) extends CRS { +class LazyCRS(val encoded: EncodedCRS) extends CRS { private lazy val delegate = LazyCRS.mapper(encoded) override def proj4jCrs: CoordinateReferenceSystem = delegate.proj4jCrs override def toProj4String: String = if (encoded.startsWith("+proj")) encoded else delegate.toProj4String + + override def hashCode(): Int = super.hashCode() + + override def equals(o: Any): Boolean = o match { + case l: LazyCRS => encoded == l.encoded || super.equals(o) + case o => super.equals(o) + } } object LazyCRS { From ff8293c43f596171048171f3d48da77ae7926b6d Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 11:33:47 -0400 Subject: [PATCH 095/380] Added performance enhancements to CRS parsing. Added `toDF` extention methods to SinglebandGeoTiff. --- .../rasterframes/bench/CRSBench.scala | 2 +- build.sbt | 1 + .../rasterframes/extensions/Implicits.scala | 3 ++ .../extensions/ProjectedRasterMethods.scala | 3 +- .../rasterframes/extensions/RasterJoin.scala | 41 ++++++++------- .../extensions/SinglebandGeoTiffMethods.scala | 52 +++++++++++++++++++ .../rasterframes/model/LazyCRS.scala | 7 +-- .../rasterframes/RasterJoinSpec.scala | 4 +- project/RFDependenciesPlugin.scala | 2 + 9 files changed, 91 insertions(+), 24 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala index 3ccce8246..04abc0b2b 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala @@ -31,7 +31,7 @@ import org.openjdk.jmh.annotations._ @BenchmarkMode(Array(Mode.AverageTime)) @State(Scope.Benchmark) @OutputTimeUnit(TimeUnit.MICROSECONDS) -class CRSEncodingBench extends SparkEnv { +class CRSBench extends SparkEnv { var crs: CRS = _ diff --git a/build.sbt b/build.sbt index 81a39a236..90cf92780 100644 --- a/build.sbt +++ b/build.sbt @@ -41,6 +41,7 @@ lazy val core = project ExclusionRule(organization = "org.scalastic"), ExclusionRule(organization = "org.scalatest") ), + scaffeine, scalatest ), buildInfoKeys ++= Seq[BuildInfoKey]( diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala index f97a5dae0..95f24507d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala @@ -24,6 +24,7 @@ package org.locationtech.rasterframes.extensions import org.locationtech.rasterframes.RasterFrame import org.locationtech.rasterframes.util.{WithMergeMethods, WithPrototypeMethods} import geotrellis.raster._ +import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.spark.{Metadata, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.util.MethodExtensions import org.apache.spark.SparkConf @@ -51,6 +52,8 @@ trait Implicits { implicit class WithProjectedRasterMethods[T <: CellGrid: WithMergeMethods: WithPrototypeMethods: TypeTag]( val self: ProjectedRaster[T]) extends ProjectedRasterMethods[T] + implicit class WithSinglebandGeoTiffMethods(val self: SinglebandGeoTiff) extends SinglebandGeoTiffMethods + implicit class WithDataFrameMethods[D <: DataFrame](val self: D) extends DataFrameMethods[D] implicit class WithRasterFrameMethods(val self: RasterFrame) extends RasterFrameMethods diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala index 8edf30b14..917f329d4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala @@ -51,7 +51,8 @@ abstract class ProjectedRasterMethods[T <: CellGrid: WithMergeMethods: WithProto * * @param spark [[SparkSession]] in which to create [[RasterFrame]] */ - def toRF(implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrame = toRF(TILE_COLUMN.columnName) + def toRF(implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrame = + toRF(TILE_COLUMN.columnName) /** * Convert the wrapped [[ProjectedRaster]] into a [[RasterFrame]] with a diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala index 117676e36..a8d821a98 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -36,27 +36,32 @@ import scala.util.Random object RasterJoin { private val projOpts = Reproject.Options.DEFAULT - // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. - def reproject_and_merge = udf((leftExtentEnc: Row, leftCRSEnc: Row, tiles: Seq[Tile], rightExtentEnc: Seq[Row], rightCRSEnc: Seq[Row], leftDimsEnc: Row) => { - require(tiles.length == rightExtentEnc.length && tiles.length == rightCRSEnc.length, "size mismatch") + val reproject_and_merge_f: (Row, Row, Seq[Tile], Seq[Row], Seq[Row], Row) => Tile = (leftExtentEnc: Row, leftCRSEnc: Row, tiles: Seq[Tile], rightExtentEnc: Seq[Row], rightCRSEnc: Seq[Row], leftDimsEnc: Row) => { + if (tiles.isEmpty) null + else { + require(tiles.length == rightExtentEnc.length && tiles.length == rightCRSEnc.length, "size mismatch") + + val leftExtent = leftExtentEnc.to[Extent] + val leftDims = leftDimsEnc.to[TileDimensions] + val leftCRS = leftCRSEnc.to[CRS] + val rightExtents = rightExtentEnc.map(_.to[Extent]) + val rightCRSs = rightCRSEnc.map(_.to[CRS]) - val leftExtent = leftExtentEnc.to[Extent] - val leftDims = leftDimsEnc.to[TileDimensions] - val leftCRS = leftCRSEnc.to[CRS] - val rightExtents = rightExtentEnc.map(_.to[Extent]) - val rightCRSs = rightCRSEnc.map(_.to[CRS]) + val cellType = tiles.map(_.cellType).reduceOption(_ union _).getOrElse(tiles.head.cellType) - val cellType = tiles.map(_.cellType).reduce(_ union _) + val dest: Tile = ArrayTile.empty(cellType, leftDims.cols, leftDims.rows) + //is there a GT function to do all this? + tiles.zip(rightExtents).zip(rightCRSs).map { + case ((tile, extent), crs) => + tile.reproject(extent, crs, leftCRS, projOpts) + }.foldLeft(dest)((d, t) => + d.merge(leftExtent, t.extent, t.tile, projOpts.method) + ) + } + } - val dest: Tile = ArrayTile.empty(cellType, leftDims.cols, leftDims.rows) - //is there a GT function to do all this? - tiles.zip(rightExtents).zip(rightCRSs).map { - case ((tile, extent), crs) => - tile.reproject(extent, crs, leftCRS, projOpts) - }.foldLeft(dest)((d, t) => - d.merge(leftExtent, t.extent, t.tile, projOpts.method) - ) - }).withName("reproject_and_merge") + // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. + def reproject_and_merge = udf(reproject_and_merge_f).withName("reproject_and_merge") def apply(left: DataFrame, right: DataFrame): DataFrame = { val df = apply(left, right, left("extent"), left("crs"), right("extent"), right("crs")) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala new file mode 100644 index 000000000..eaf09eac0 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala @@ -0,0 +1,52 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.extensions + +import geotrellis.raster.io.geotiff.SinglebandGeoTiff +import geotrellis.util.MethodExtensions +import org.apache.spark.sql.{DataFrame, SparkSession} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.tiles.ProjectedRasterTile + +trait SinglebandGeoTiffMethods extends MethodExtensions[SinglebandGeoTiff] { + def toDF(dims: TileDimensions = NOMINAL_TILE_DIMS)(implicit spark: SparkSession): DataFrame = { + + val segmentLayout = self.imageData.segmentLayout + val re = self.rasterExtent + val crs = self.crs + + val windows = segmentLayout.listWindows(256) + val subtiles = self.crop(windows) + + val rows = for { + (gridbounds, tile) ← subtiles.toSeq + } yield { + val extent = re.extentFor(gridbounds, false) + ProjectedRasterTile(tile, extent, crs).toRow + } + + spark.createDataFrame(spark.sparkContext.makeRDD(rows, 1), schemaOf[ProjectedRasterTile]) + .select("tileContext.extent", "tileContext.crs", "tile") + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala index 611428b22..ce95b20ce 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala @@ -22,18 +22,17 @@ package org.locationtech.rasterframes.model import LazyCRS.EncodedCRS +import com.github.blemale.scaffeine.Scaffeine import geotrellis.proj4.CRS import org.locationtech.proj4j.CoordinateReferenceSystem class LazyCRS(val encoded: EncodedCRS) extends CRS { - private lazy val delegate = LazyCRS.mapper(encoded) + private lazy val delegate = LazyCRS.cache.get(encoded) override def proj4jCrs: CoordinateReferenceSystem = delegate.proj4jCrs override def toProj4String: String = if (encoded.startsWith("+proj")) encoded else delegate.toProj4String - override def hashCode(): Int = super.hashCode() - override def equals(o: Any): Boolean = o match { case l: LazyCRS => encoded == l.encoded || super.equals(o) case o => super.equals(o) @@ -50,6 +49,8 @@ object LazyCRS { case w if w.toUpperCase().startsWith("GEOGCS") => CRS.fromWKT(w) //only case-sensitive inside double quotes } + private val cache = Scaffeine().build[String, CRS](mapper) + def apply(value: String): CRS = { if (mapper.isDefinedAt(value)) { new LazyCRS(value.asInstanceOf[EncodedCRS]) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index 72138c478..608c0e19b 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -49,7 +49,9 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { val joined = r1.rasterJoin(r1.withColumnRenamed("tile", "tile2")) joined.count() should be (joined.count()) - val measure = joined.select(rf_tile_mean(rf_local_subtract($"tile", $"tile2"))) + //val measure = joined.select(rf_tile_mean(rf_local_subtract($"tile", $"tile2"))) + + // TODO: test tile comparison } diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index 93e92e79e..b9620e9dc 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -45,6 +45,8 @@ object RFDependenciesPlugin extends AutoPlugin { val `jts-core` = "org.locationtech.jts" % "jts-core" % "1.16.0" val `geotrellis-contrib-vlm` = "com.azavea.geotrellis" %% "geotrellis-contrib-vlm" % "2.11.0" val `geotrellis-contrib-gdal` = "com.azavea.geotrellis" %% "geotrellis-contrib-gdal" % "2.11.0" + + val scaffeine = "com.github.blemale" %% "scaffeine" % "2.5.0" } import autoImport._ From 17beae18f9dcb44439e8cff519c4d2b3bc5e56b5 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 11:59:35 -0400 Subject: [PATCH 096/380] Fixed singleband extension method for Dataframe creation. --- .../extensions/SinglebandGeoTiffMethods.scala | 17 ++++++++++++----- .../rasterframes/model/LazyCRS.scala | 8 +++++--- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala index eaf09eac0..536470c9e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala @@ -21,13 +21,15 @@ package org.locationtech.rasterframes.extensions +import geotrellis.proj4.CRS import geotrellis.raster.io.geotiff.SinglebandGeoTiff import geotrellis.util.MethodExtensions -import org.apache.spark.sql.{DataFrame, SparkSession} +import geotrellis.vector.Extent +import org.apache.spark.sql.types.{StructField, StructType} +import org.apache.spark.sql.{DataFrame, Row, SparkSession} import org.locationtech.rasterframes._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.model.TileDimensions -import org.locationtech.rasterframes.tiles.ProjectedRasterTile trait SinglebandGeoTiffMethods extends MethodExtensions[SinglebandGeoTiff] { def toDF(dims: TileDimensions = NOMINAL_TILE_DIMS)(implicit spark: SparkSession): DataFrame = { @@ -43,10 +45,15 @@ trait SinglebandGeoTiffMethods extends MethodExtensions[SinglebandGeoTiff] { (gridbounds, tile) ← subtiles.toSeq } yield { val extent = re.extentFor(gridbounds, false) - ProjectedRasterTile(tile, extent, crs).toRow + Row(extent.toRow, crs.toRow, tile) } - spark.createDataFrame(spark.sparkContext.makeRDD(rows, 1), schemaOf[ProjectedRasterTile]) - .select("tileContext.extent", "tileContext.crs", "tile") + val schema = StructType(Seq( + StructField("extent", schemaOf[Extent], false), + StructField("crs", schemaOf[CRS], false), + StructField("tile", TileType, false) + )) + + spark.createDataFrame(spark.sparkContext.makeRDD(rows, 1), schema) } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala index ce95b20ce..a63c54ab8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala @@ -35,7 +35,7 @@ class LazyCRS(val encoded: EncodedCRS) extends CRS { override def equals(o: Any): Boolean = o match { case l: LazyCRS => encoded == l.encoded || super.equals(o) - case o => super.equals(o) + case c => delegate.equals(c) } } @@ -43,13 +43,15 @@ object LazyCRS { trait ValidatedCRS type EncodedCRS = String with ValidatedCRS - private val mapper: PartialFunction[String, CRS] = { + @transient + private lazy val mapper: PartialFunction[String, CRS] = { case e if e.toUpperCase().startsWith("EPSG") => CRS.fromName(e) //not case-sensitive case p if p.startsWith("+proj") => CRS.fromString(p) // case sensitive case w if w.toUpperCase().startsWith("GEOGCS") => CRS.fromWKT(w) //only case-sensitive inside double quotes } - private val cache = Scaffeine().build[String, CRS](mapper) + @transient + private lazy val cache = Scaffeine().build[String, CRS](mapper) def apply(value: String): CRS = { if (mapper.isDefinedAt(value)) { From cdbc227d08bfa84cee10b2840f86662b81b887c9 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 12:06:02 -0400 Subject: [PATCH 097/380] Spelling fix. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f9572feb9..c074e0a0e 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ The documentation may be built with sbt makeSite ``` -The `pyrasteframes` build instructions are located [pyrasterframes/python/README.rst](pyrasterframes/python/README.rst) +The `pyrasterframes` build instructions are located [pyrasterframes/python/README.rst](pyrasterframes/python/README.rst) ## Copyright and License From 0a29b8845d2b32d9f6e7349f504d2d0874ded569 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 14:17:24 -0400 Subject: [PATCH 098/380] Incorporated PR feedback. --- .../aggregates/TileRasterizerAggregate.scala | 5 ++-- .../rasterframes/extensions/RasterJoin.scala | 28 +++++++++++++++---- .../rasterframes/RasterJoinSpec.scala | 2 +- 3 files changed, 26 insertions(+), 9 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala index f8f53a34e..a4e048496 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala @@ -34,8 +34,9 @@ import geotrellis.raster.reproject.Reproject import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition /** - * Aggregation function for creating a single raster from tiles. - * @param prd settings + * Aggregation function for creating a single `geotrellis.raster.Raster[Tile]` from + * `Tile`, `CRS` and `Extent` columns. + * @param prd aggregation settings */ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefinedAggregateFunction { diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala index a8d821a98..32d98d621 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -69,11 +69,12 @@ object RasterJoin { } def apply(left: DataFrame, right: DataFrame, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = { - apply(left, right, st_intersects( - st_geometry(leftExtent), - st_reproject(st_geometry(rightExtent), rightCRS, leftCRS) - ), leftExtent, leftCRS, rightExtent, rightCRS) + val leftGeom = st_geometry(leftExtent) + val rightGeomReproj = st_reproject(st_geometry(rightExtent), rightCRS, leftCRS) + val joinExpr = st_intersects(leftGeom, rightGeomReproj) + apply(left, right, joinExpr, leftExtent, leftCRS, rightExtent, rightCRS) } + def apply(left: DataFrame, right: DataFrame, joinExprs: Column, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = { // Unique id for temporary columns val id = Random.alphanumeric.take(5).mkString("_", "", "_") @@ -90,19 +91,34 @@ object RasterJoin { // A representative tile from the left val leftTile = left.tileColumns.headOption.getOrElse(throw new IllegalArgumentException("Need at least one target tile on LHS")) - + // Gathering up various expressions we'll use to construct the result. + // After joining We will be doing a groupBy the LHS. We have to define the aggregations to perform after the groupBy. + // On the LHS we just want the first thing (subsequent ones should be identical. val leftAggCols = left.columns.map(s => first(left(s), true) as s) + // On the RHS we collect result as a list. val rightAggCtx = Seq(collect_list(rightExtent) as rightExtent2, collect_list(rightCRS) as rightCRS2) val rightAggTiles = right.tileColumns.map(c => collect_list(c) as c.columnName) val aggCols = leftAggCols ++ rightAggTiles ++ rightAggCtx - val reprojCols = rightAggTiles.map(t => reproject_and_merge(col(leftExtent2), col(leftCRS2), col(t.columnName), col(rightExtent2), col(rightCRS2), rf_dimensions(leftTile)) as t.columnName) + + // After the aggregation we take all the tiles we've collected and resample + merge into LHS extent/CRS. + val reprojCols = rightAggTiles.map(t => reproject_and_merge( + col(leftExtent2), col(leftCRS2), col(t.columnName), col(rightExtent2), col(rightCRS2), rf_dimensions(leftTile) + ) as t.columnName) val finalCols = leftAggCols.map(c => col(c.columnName)) ++ reprojCols + // Here's the meat: left + // 1. Add a unique ID to each LHS row for subequent grouping. .withColumn(id, monotonically_increasing_id()) + // 2. Perform the left-outer join .join(right, joinExprs, joinType = "left") + // 3. Group by the unique ID, reestablishing the LHS count .groupBy(col(id)) + // 4. Apply aggregation to left and right columns: + // a. LHS just take the first entity + // b. RHS collect all results in a list .agg(aggCols.head, aggCols.tail: _*) + // 5. Perform merge on RHC tile column collections, pass everything else through. .select(finalCols: _*) } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index 608c0e19b..5698ae253 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -47,7 +47,7 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { it("should join the same scene correctly") { val joined = r1.rasterJoin(r1.withColumnRenamed("tile", "tile2")) - joined.count() should be (joined.count()) + joined.count() should be (r1.count()) //val measure = joined.select(rf_tile_mean(rf_local_subtract($"tile", $"tile2"))) From bdbcb76ca66d1977d300fb3fdc5dec8fdde4acda Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 14:47:57 -0400 Subject: [PATCH 099/380] RasterJoin test fixes. --- .../extensions/SinglebandGeoTiffMethods.scala | 2 +- .../rasterframes/RasterJoinSpec.scala | 38 +++++++------------ .../encoders/CatalystSerializerSpec.scala | 7 +--- 3 files changed, 17 insertions(+), 30 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala index 536470c9e..833ba80e3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/SinglebandGeoTiffMethods.scala @@ -38,7 +38,7 @@ trait SinglebandGeoTiffMethods extends MethodExtensions[SinglebandGeoTiff] { val re = self.rasterExtent val crs = self.crs - val windows = segmentLayout.listWindows(256) + val windows = segmentLayout.listWindows(dims.cols, dims.rows) val subtiles = self.crop(windows) val rows = for { diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index 5698ae253..43e027225 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -26,9 +26,9 @@ import geotrellis.raster.resample.Bilinear import geotrellis.raster.testkit.RasterMatchers import geotrellis.raster.{IntConstantNoDataCellType, Raster, Tile} import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.encoders.serialized_literal import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition +import org.locationtech.rasterframes.model.TileDimensions class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { @@ -37,35 +37,33 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { val s1 = readSingleband("L8-B4-Elkton-VA.tiff") val s2 = readSingleband("L8-B4-Elkton-VA-4326.tiff") - val r1 = s1.projectedRaster.mapTile(_.convert(IntConstantNoDataCellType)).toRF(10, 10) - .withExtent() - .withColumn("crs", serialized_literal(s1.crs)) - val r2 = s2.projectedRaster.mapTile(_.convert(IntConstantNoDataCellType)).toRF(10, 10) - .withExtent() - .withColumn("crs", serialized_literal(s2.crs)) + val r1 = s1.toDF(TileDimensions(10, 10)) + val r2 = s2.toDF(TileDimensions(10, 10)) .withColumnRenamed("tile", "tile2") it("should join the same scene correctly") { - val joined = r1.rasterJoin(r1.withColumnRenamed("tile", "tile2")) + val r1prime = s1.toDF(TileDimensions(10, 10)) + .withColumnRenamed("tile", "tile2") + val joined = r1.rasterJoin(r1prime) joined.count() should be (r1.count()) - //val measure = joined.select(rf_tile_mean(rf_local_subtract($"tile", $"tile2"))) - - // TODO: test tile comparison - + val measure = joined + .select(rf_tile_mean(rf_local_subtract($"tile", $"tile2")) as "mean") + .agg(sum($"mean")) + .as[Double] + .first() + measure should be(0.0) } it("should join same scene in two projections, same tile size") { - val joined = r1.rasterJoin(r2) - val result = joined.agg(TileRasterizerAggregate( ProjectedRasterDefinition(s1.cols, s1.rows, s1.cellType, s1.crs, s1.extent, Bilinear), $"crs", $"extent", $"tile2") as "raster" ).select(col("raster").as[Raster[Tile]]).first() - // GeoTiff(result, s1.crs).write("target/out.tiff") + //GeoTiff(result, s1.crs).write("target/out.tiff") result.extent shouldBe s1.extent // Not sure what the right test is... here's... something? @@ -77,16 +75,8 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { s1.raster.crop(sub).tile.convert(IntConstantNoDataCellType) ) ) - diff.statisticsDouble.get.mean should be (0.0 +- 200) - - - GeoTiff(diff, s1.extent, s1.crs).write("target/diff.tiff") - - - //assertEqual(result.crop(subRegion).tile, s1.raster.crop(subRegion).tile, 500) - + //GeoTiff(diff, s1.extent, s1.crs).write("target/diff.tiff") } } - } diff --git a/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala index 39b998201..2b02a5523 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala @@ -23,17 +23,14 @@ package org.locationtech.rasterframes.encoders import java.time.ZonedDateTime -import org.locationtech.rasterframes.encoders.StandardEncoders._ -import org.locationtech.rasterframes.model.{CellContext, TileDataContext, TileDimensions} -import org.locationtech.rasterframes.ref.RasterRef -import org.locationtech.rasterframes.TestData import geotrellis.proj4._ import geotrellis.raster.{CellSize, CellType, TileLayout, UShortUserDefinedNoDataCellType} import geotrellis.spark.tiling.LayoutDefinition import geotrellis.spark.{KeyBounds, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder -import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes.{TestData, TestEnvironment} +import org.locationtech.rasterframes.encoders.StandardEncoders._ import org.locationtech.rasterframes.model.{CellContext, TileContext, TileDataContext, TileDimensions} import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.scalatest.Assertion From 146273c85781bb0ddce3d53cbb200829328ad282 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 28 May 2019 15:23:49 -0400 Subject: [PATCH 100/380] Updated release notes. Cruft removal. --- .../rasterframes/expressions/DynamicExtractors.scala | 3 +-- .../locationtech/rasterframes/tiles/ProjectedRasterTile.scala | 2 +- .../scala/org/locationtech/rasterframes/RasterJoinSpec.scala | 1 - .../scala/org/locationtech/rasterframes/TileStatsSpec.scala | 2 +- docs/src/main/tut/release-notes.md | 2 ++ 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala index 1f263dcea..ecc9698f2 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala @@ -21,13 +21,12 @@ package org.locationtech.rasterframes.expressions -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.ref.{ProjectedRasterLike, RasterRef} import geotrellis.raster.{CellGrid, Tile} import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.rf.{TileUDT, _} import org.apache.spark.sql.types._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.model.TileContext import org.locationtech.rasterframes.ref.{ProjectedRasterLike, RasterRef, RasterSource} import org.locationtech.rasterframes.tiles.ProjectedRasterTile diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala index 12e9e201c..fd61cb88c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala @@ -65,7 +65,7 @@ object ProjectedRasterTile { implicit val serializer: CatalystSerializer[ProjectedRasterTile] = new CatalystSerializer[ProjectedRasterTile] { override def schema: StructType = StructType(Seq( - StructField("tileContext", schemaOf[TileContext], false), + StructField("tile_context", schemaOf[TileContext], false), StructField("tile", TileType, false)) ) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index 43e027225..4f8d132a4 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -21,7 +21,6 @@ package org.locationtech.rasterframes -import geotrellis.raster.io.geotiff.GeoTiff import geotrellis.raster.resample.Bilinear import geotrellis.raster.testkit.RasterMatchers import geotrellis.raster.{IntConstantNoDataCellType, Raster, Tile} diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala index 512a205fe..50920ab1c 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileStatsSpec.scala @@ -137,7 +137,7 @@ class TileStatsSpec extends TestEnvironment with TestData { forAll(means.zip(means2)) { case (l, r) => assert(l === r +- 1e-6) } } withClue("sum") { - val rf = l8Sample(1).projectedRaster.toRF + val rf = l8Sample(1).toDF() val expected = 309149454 // computed with rasterio val result = rf.agg(sum(rf_tile_sum($"tile"))).collect().head.getDouble(0) logger.info(s"L8 sample band 1 grand total: ${result}") diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 2a7cd08fb..f7fc7360d 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -12,6 +12,8 @@ * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. * Added `rf_render_matrix` debugging function. * Added `RasterFrame.withExtent` extension method. +* Added `SinglebandGeoTiff.toDF` extension method. +* Added `DataFrame.rasterJoin` extension method for merging two dataframes with tiles in disparate CRSs. * Added `rf_crs` for `ProjectedRasterTile` columns. * Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` and `RasterSource` columns). * Added `st_geometry` (for `Extent` types) and `rf_geometry` (for `ProjectedRasterTile` and `RasterSource` columns). From 9cf18fb29b757d888e891a8de717db84ef53b515 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 28 May 2019 16:31:41 -0400 Subject: [PATCH 101/380] Update raster join test Signed-off-by: Jason T. Brown --- .../test/resources/L8-B4-Elkton-VA-4326.tiff | Bin 63934 -> 63946 bytes .../rasterframes/RasterJoinSpec.scala | 37 +++++++++++++----- 2 files changed, 27 insertions(+), 10 deletions(-) diff --git a/core/src/test/resources/L8-B4-Elkton-VA-4326.tiff b/core/src/test/resources/L8-B4-Elkton-VA-4326.tiff index df3fe975304cf9072ed2b0f2c89036194e57e456..2bc57e255d792613fbe3fd3c4c47c6ce356fb0f4 100644 GIT binary patch delta 150 zcmdn@nfcUbW=>B}Ed~w-1_q&toUTl4j1vQt7@tinR`$zdWMF7&;bC9{%C!O6>)V+b z6oBk)K=y`q9tI{L`x}tGv7HI5pA9I`u!M=h9Vo5_6mJBwL23+un1Ny91F?zkcx3s2 kB36nF3~3Gw43pv+81~gMFua<}z#z7lfx&6BIOFmk016Bqp8x;= delta 131 zcmX^0nR(x5W=>B}Ed~w-1_r^2oUTm27$ycNG2WV3tZbLW$iUFl!o$D@l&b==*S9k> zC;-{3fb0$JJPb@g_A4NJV>=UA|1TiBVF?q1J5XGTapD6tStg(oJw*nFC Date: Tue, 28 May 2019 16:48:01 -0400 Subject: [PATCH 102/380] Add raster join test on different tile sizes / same gridding Signed-off-by: Jason T. Brown --- .../rasterframes/RasterJoinSpec.scala | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index 9d9a2fe7c..c4c5563b4 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -51,9 +51,25 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { val measure = joined.select( rf_tile_mean(rf_local_subtract($"tile", $"tile2")) as "diff_mean", rf_tile_stats(rf_local_subtract($"tile", $"tile2")).getField("variance") as "diff_var") + .as[(Double, Double)] .collect() - measure.forall(r ⇒ r.getDouble(0) == 0.0) should be (true) - measure.forall(r ⇒ r.getDouble(1) == 0.0) should be (true) + all (measure) should be ((0.0, 0.0)) + } + + it("should join same scene in different tile sizes"){ + val r1prime = s1.toDF(TileDimensions(25, 25)).withColumnRenamed("tile", "tile2") + r1prime.select(rf_dimensions($"tile2").getField("rows")).as[Int].first() should be (25) + val joined = r1.rasterJoin(r1prime) + + joined.count() should be (r1.count()) + + val measure = joined.select( + rf_tile_mean(rf_local_subtract($"tile", $"tile2")) as "diff_mean", + rf_tile_stats(rf_local_subtract($"tile", $"tile2")).getField("variance") as "diff_var") + .as[(Double, Double)] + .collect() + all (measure) should be ((0.0, 0.0)) + } it("should join same scene in two projections, same tile size") { From 279c96fcc17f26f4f684e991371ff6bc7b8ebf8b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 08:20:39 -0400 Subject: [PATCH 103/380] Testing possible TravisCI config with GDAL support. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fbe2823fa..3c6a81ca6 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ scala: - 2.11.11 jdk: - - oraclejdk8 + - daunnc/openjdk-gdal:2.4.0 addons: apt: From a8d339b5b3ac252ff33864798ed75b6b5a8fb9d0 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 29 May 2019 09:18:49 -0400 Subject: [PATCH 104/380] RasterJoinSpec add test case, expanded naming for more bands etc Signed-off-by: Jason T. Brown --- .../rasterframes/RasterJoinSpec.scala | 57 ++++++++++++------- 1 file changed, 36 insertions(+), 21 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index c4c5563b4..b457ca148 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -33,20 +33,21 @@ import org.locationtech.rasterframes.model.TileDimensions class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { import spark.implicits._ describe("Raster join between two DataFrames") { - val s1 = readSingleband("L8-B4-Elkton-VA.tiff") + val b4nativeTif = readSingleband("L8-B4-Elkton-VA.tiff") // Same data, reprojected to EPSG:4326 - val s2 = readSingleband("L8-B4-Elkton-VA-4326.tiff") + val b4warpedTif = readSingleband("L8-B4-Elkton-VA-4326.tiff") - val r1 = s1.toDF(TileDimensions(10, 10)) - val r2 = s2.toDF(TileDimensions(10, 10)) + val b4nativeRf = b4nativeTif.toDF(TileDimensions(10, 10)) + val b4warpedRf = b4warpedTif.toDF(TileDimensions(10, 10)) .withColumnRenamed("tile", "tile2") it("should join the same scene correctly") { - val r1prime = s1.toDF(TileDimensions(10, 10)) + + val b4nativeRfPrime = b4nativeTif.toDF(TileDimensions(10, 10)) .withColumnRenamed("tile", "tile2") - val joined = r1.rasterJoin(r1prime) + val joined = b4nativeRf.rasterJoin(b4nativeRfPrime) - joined.count() should be (r1.count()) + joined.count() should be (b4nativeRf.count()) val measure = joined.select( rf_tile_mean(rf_local_subtract($"tile", $"tile2")) as "diff_mean", @@ -57,11 +58,11 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { } it("should join same scene in different tile sizes"){ - val r1prime = s1.toDF(TileDimensions(25, 25)).withColumnRenamed("tile", "tile2") + val r1prime = b4nativeTif.toDF(TileDimensions(25, 25)).withColumnRenamed("tile", "tile2") r1prime.select(rf_dimensions($"tile2").getField("rows")).as[Int].first() should be (25) - val joined = r1.rasterJoin(r1prime) + val joined = b4nativeRf.rasterJoin(r1prime) - joined.count() should be (r1.count()) + joined.count() should be (b4nativeRf.count()) val measure = joined.select( rf_tile_mean(rf_local_subtract($"tile", $"tile2")) as "diff_mean", @@ -74,34 +75,34 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { it("should join same scene in two projections, same tile size") { - // r2 source data is gdal warped r1 data; join them together. - val joined = r1.rasterJoin(r2) - // create a Raster from tile2 which should be almost equal to s1 + // b4warpedRf source data is gdal warped b4nativeRf data; join them together. + val joined = b4nativeRf.rasterJoin(b4warpedRf) + // create a Raster from tile2 which should be almost equal to b4nativeTif val result = joined.agg(TileRasterizerAggregate( - ProjectedRasterDefinition(s1.cols, s1.rows, s1.cellType, s1.crs, s1.extent, Bilinear), + ProjectedRasterDefinition(b4nativeTif.cols, b4nativeTif.rows, b4nativeTif.cellType, b4nativeTif.crs, b4nativeTif.extent, Bilinear), $"crs", $"extent", $"tile2") as "raster" ).select(col("raster").as[Raster[Tile]]).first() - result.extent shouldBe s1.extent + result.extent shouldBe b4nativeTif.extent // Test the overall local difference of the `result` versus the original import geotrellis.raster.mapalgebra.local._ - val sub = s1.extent.buffer(-s1.extent.width * 0.01) + val sub = b4nativeTif.extent.buffer(-b4nativeTif.extent.width * 0.01) val diff = Abs( Subtract( result.crop(sub).tile.convert(IntConstantNoDataCellType), - s1.raster.crop(sub).tile.convert(IntConstantNoDataCellType) + b4nativeTif.raster.crop(sub).tile.convert(IntConstantNoDataCellType) ) ) // DN's within arbitrary threshold. N.B. the range of values in the source raster is (6396, 27835) diff.statisticsDouble.get.mean should be (0.0 +- 200) // Overall signal is preserved - val s1_stddev = s1.tile.statisticsDouble.get.stddev - val rel_diff = diff.statisticsDouble.get.mean / s1_stddev + val b4nativeStddev = b4nativeTif.tile.statisticsDouble.get.stddev + val rel_diff = diff.statisticsDouble.get.mean / b4nativeStddev rel_diff should be (0.0 +- 0.15) - // Use the tile structure of the `joined` dataframe to argue that the structure of the image is similar between `s1` and `joined.tile2` - val tile_diffs = joined.select((abs(rf_tile_mean($"tile") - rf_tile_mean($"tile2")) / lit(s1_stddev)).alias("z")) + // Use the tile structure of the `joined` dataframe to argue that the structure of the image is similar between `b4nativeTif` and `joined.tile2` + val tile_diffs = joined.select((abs(rf_tile_mean($"tile") - rf_tile_mean($"tile2")) / lit( b4nativeStddev)).alias("z")) // Check the 90%-ile z score; recognize there will be some localized areas of larger error tile_diffs.selectExpr("percentile(z, 0.90)").as[Double].first() should be < 0.10 @@ -109,6 +110,20 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { tile_diffs.selectExpr("percentile(z, 0.50)").as[Double].first() should be < 0.025 } + it("should join multiple RHS tile columns"){ + // join multiple native CRS bands to the EPSG 4326 RF + + val multibandRf = b4nativeRf + .withColumn("t_plus", rf_local_add($"tile", $"tile")) + .withColumn("t_mult", rf_local_multiply($"tile", $"tile")) + multibandRf.tileColumns.length should be (3) + + val multibandJoin = multibandRf.rasterJoin(b4warpedRf) + multibandJoin.printSchema() + + multibandJoin.tileColumns.length should be (4) + multibandJoin.count() should be (multibandRf.count()) + } } } From 29b84f50a892a13979b83358d300f640c6daf1c4 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 09:46:25 -0400 Subject: [PATCH 105/380] Revert "Testing possible TravisCI config with GDAL support." This reverts commit 279c96fcc17f26f4f684e991371ff6bc7b8ebf8b. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c6a81ca6..fbe2823fa 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,7 @@ scala: - 2.11.11 jdk: - - daunnc/openjdk-gdal:2.4.0 + - oraclejdk8 addons: apt: From ee572907b38927a7937b38b9a8c9d7e74ce0f57e Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 10:42:17 -0400 Subject: [PATCH 106/380] Moved GDAL required tests inside environment conditional block, which should help it:test in TravisCI to pass. --- .../rasterframes/ref/RasterSourceIT.scala | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 7027258ee..afa4bfa01 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -67,6 +67,21 @@ class RasterSourceIT extends TestEnvironment with TestData { it("should read JPEG2000 scene") { RasterSource(localSentinel).readAll().flatMap(_.tile.statisticsDouble).size should be(64) } + + it("should read small MRF scene with one band converted from MODIS HDF") { + val (expectedTileCount, _) = expectedTileCountAndBands(2400, 2400) + RasterSource(modisConvertedMrfPath).readAll().flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + it("should read remote HTTP MRF scene") { + val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) + RasterSource(remoteHttpMrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + it("should read remote S3 MRF scene") { + val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) + RasterSource(remoteS3MrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } } } else { describe("GDAL missing error support") { @@ -76,22 +91,6 @@ class RasterSourceIT extends TestEnvironment with TestData { } } } - - it("should read small MRF scene with one band converted from MODIS HDF") { - val (expectedTileCount, _) = expectedTileCountAndBands(2400, 2400) - RasterSource(modisConvertedMrfPath).readAll().flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) - } - - it("should read remote HTTP MRF scene") { - val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) - RasterSource(remoteHttpMrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) - } - - it("should read remote S3 MRF scene") { - val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) - RasterSource(remoteS3MrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) - } - } private def expectedTileCountAndBands(x:Int, y:Int, bandCount:Int = 1) = { From 44b1c2e669d12416644f5b2621089f06c43a54a6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 11:12:41 -0400 Subject: [PATCH 107/380] Added form of rasterJoin where join expression can be provided. --- .../extensions/DataFrameMethods.scala | 34 +++++++++++++++++-- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 50d0c65dc..e38ecee25 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -172,7 +172,11 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada * Performs a jeft join on the dataframe `right` to this one, reprojecting and merging tiles as necessary. * The operation is logically a "left outer" join, with the left side also determining the target CRS and extents. * Right side may have multiple Tile columns. Assumes both dataframes use the column names `extent` and `crs` for - * the Extent and CRS details for each row. + * the Extent and CRS details for each row. The join expression used is: + * + * {{{ + * st_intersects(st_geometry(leftExtent), st_reproject(st_geometry(rightExtent), rightCRS, leftCRS)) + * }}} * * @param right Right side of the join. * @return joined dataframe @@ -180,17 +184,41 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def rasterJoin(right: DataFrame): DataFrame = RasterJoin(self, right) /** + * Performs a jeft join on the dataframe `right` to this one, reprojecting and merging tiles as necessary. + * The operation is logically a "left outer" join, with the left side also determining the target CRS and extents. + * Right side may have multiple Tile columns. This variant allows for the specific geospatial columns to be + * specified. The join expression used is: + * {{{ + * st_intersects(st_geometry(leftExtent), st_reproject(st_geometry(rightExtent), rightCRS, leftCRS)) + * }}} * + * @param right right dataframe * @param leftExtent this (left) dataframe's Extent column * @param leftCRS this (left) datafrasme's CRS column - * @param right right dataframe * @param rightExtent right dataframe's CRS extent * @param rightCRS right dataframe's CRS column * @return joined dataframe */ - def rasterJoin(leftExtent: Column, leftCRS: Column, right: DataFrame, rightExtent: Column, rightCRS: Column): DataFrame = + def rasterJoin(right: DataFrame, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = RasterJoin(self, right, leftExtent, leftCRS, rightExtent, rightCRS) + /** + * Performs a jeft join on the dataframe `right` to this one, reprojecting and merging tiles as necessary. + * The operation is logically a "left outer" join, with the left side also determining the target CRS and extents. + * Right side may have multiple Tile columns. This variant allows for the specific geospatial columns and join + * expression to be specified. + * + * @param right right dataframe + * @param leftExtent this (left) dataframe's Extent column + * @param joinExpr join expression + * @param leftCRS this (left) datafrasme's CRS column + * @param rightExtent right dataframe's CRS extent + * @param rightCRS right dataframe's CRS column + * @return joined dataframe + */ + def rasterJoin(right: DataFrame, joinExpr: Column, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = + RasterJoin(self, right, joinExpr, leftExtent, leftCRS, rightExtent, rightCRS) + /** * Convert DataFrame into a RasterFrame * From ef80f38030e25a679b1fe3e3cf262e45fdb73df3 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 11:10:09 -0400 Subject: [PATCH 108/380] Added rf_inverse_mask_by_value. --- .../rasterframes/RasterFunctions.scala | 4 ++++ .../rasterframes/expressions/package.scala | 1 + .../expressions/transformers/Mask.scala | 20 ++++++++++++++++++ .../rasterframes/RasterFunctionsSpec.scala | 21 +++++++++++++++++++ .../python/pyrasterframes/rasterfunctions.py | 10 +++++++++ .../python/tests/PyRasterFramesTests.py | 6 ++++++ 6 files changed, 62 insertions(+) diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index dc0eca688..3af47dfaf 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -278,6 +278,10 @@ trait RasterFunctions { def rf_inverse_mask(sourceTile: Column, maskTile: Column): TypedColumn[Any, Tile] = Mask.InverseMaskByDefined(sourceTile, maskTile) + /** Where the `maskTile` does **not** equal `maskValue`, replace values in the source tile with `NoData` */ + def rf_inverse_mask_by_value(sourceTile: Column, maskTile: Column, maskValue: Column): TypedColumn[Any, Tile] = + Mask.InverseMaskByValue(sourceTile, maskTile, maskValue) + /** Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value. */ def rf_rasterize(geometry: Column, bounds: Column, value: Column, cols: Int, rows: Int): TypedColumn[Any, Tile] = withTypedAlias("rf_rasterize", geometry)( diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 6ab3a1d10..97d87fc5b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -121,6 +121,7 @@ package object expressions { registry.registerExpression[Mask.MaskByDefined]("rf_mask") registry.registerExpression[Mask.MaskByValue]("rf_mask_by_value") + registry.registerExpression[Mask.InverseMaskByValue]("rf_inverse_mask_by_value") registry.registerExpression[Mask.InverseMaskByDefined]("rf_inverse_mask") registry.registerExpression[DebugRender.RenderAscii]("rf_render_ascii") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala index ac755cb0b..0f0754d97 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala @@ -143,4 +143,24 @@ object Mask { def apply(srcTile: Column, maskingTile: Column, maskValue: Column): TypedColumn[Any, Tile] = new Column(MaskByValue(srcTile.expr, maskingTile.expr, maskValue.expr)).as[Tile] } + + @ExpressionDescription( + usage = "_FUNC_(target, mask, maskValue) - Generate a tile with the values from the data tile, but where cells in the masking tile DO NOT contain the masking value, replace the data value with NODATA.", + arguments = """ + Arguments: + * target - tile to mask + * mask - masking definition""", + examples = """ + Examples: + > SELECT _FUNC_(target, mask, maskValue); + ...""" + ) + case class InverseMaskByValue(leftTile: Expression, rightTile: Expression, maskValue: Expression) + extends Mask(leftTile, rightTile, maskValue, true) { + override def nodeName: String = "rf_inverse_mask_by_value" + } + object InverseMaskByValue { + def apply(srcTile: Column, maskingTile: Column, maskValue: Column): TypedColumn[Any, Tile] = + new Column(InverseMaskByValue(srcTile.expr, maskingTile.expr, maskValue.expr)).as[Tile] + } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 160e01ec8..f000efbfd 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -584,6 +584,27 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_mask_by_value") } + it("should inverse mask tile by another identified by specified value") { + val df = Seq[Tile](randTile).toDF("tile") + val mask_value = 4 + + val withMask = df.withColumn("mask", + rf_local_multiply(rf_convert_cell_type( + rf_local_greater($"tile", 50), + "uint8"), + lit(mask_value) + ) + ) + + val withMasked = withMask.withColumn("masked", + rf_inverse_mask_by_value($"tile", $"mask", lit(mask_value))) + + val result = withMasked.agg(rf_agg_no_data_cells($"tile") < rf_agg_no_data_cells($"masked")).as[Boolean] + + result.first() should be(true) + checkDocs("rf_inverse_mask_by_value") + } + it("should render ascii art") { val df = Seq[Tile](ProjectedRasterTile(TestData.l8Labels)).toDF("tile") val r1 = df.select(rf_render_ascii($"tile")) diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 95dff69cb..17ec25a3f 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -150,6 +150,15 @@ def _(data_tile, mask_tile, mask_value): _.__module__ = THIS_MODULE return _ +def _create_inverseMaskByValue(): + """ Create a function mapping to Scala rf_inverse_mask_by_value function """ + def _(data_tile, mask_tile, mask_value): + jfcn = RFContext.active().lookup('rf_inverse_mask_by_value') + return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) + _.__name__ = 'rf_inverse_mask_by_value' + _.__doc__ = 'Generate a tile with the values from the data tile, but where cells in the masking tile do not contain the masking value, replace the data value with NODATA.' + _.__module__ = THIS_MODULE + return _ _rf_unique_functions = { 'rf_array_to_tile': _create_arrayToTile(), @@ -160,6 +169,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_explode_tiles_sample': _create_explode_tiles_sample(), 'rf_make_constant_tile': _create_makeConstantTile(), 'rf_mask_by_value': _create_maskByValue(), + 'rf_inverse_mask_by_value': _create_inverseMaskByValue(), 'rf_rasterize': _create_rasterize(), 'st_reproject': _create_reproject_geometry(), 'rf_make_ones_tile': _create_tileOnes(), diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index faa337010..4dac724c0 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -216,6 +216,12 @@ def test_mask_by_value(self): .collect()[0][0] self.assertTrue(result) + rf3 = rf1.select(rf1.tile, rf_inverse_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) + result = rf3.agg(rf_agg_no_data_cells(rf3.tile) < rf_agg_no_data_cells(rf3.masked)) \ + .collect()[0][0] + self.assertTrue(result) + + def test_resample(self): from pyspark.sql.functions import lit result = self.rf.select( From 1ec443760d504220b1d4955a642fa5c2dd6252ab Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 29 May 2019 11:05:51 -0400 Subject: [PATCH 109/380] Expose raster_join extension method in pyrasterframes Signed-off-by: Jason T. Brown --- .../python/pyrasterframes/__init__.py | 22 ++++++++++++++++++ .../python/tests/PyRasterFramesTests.py | 23 +++++++++++++++++++ .../rasterframes/py/PyRFContext.scala | 19 +++++++++++++++ 3 files changed, 64 insertions(+) diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index a05ab5246..cd994a89c 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -46,6 +46,25 @@ def _convert_df(df, sp_key=None, metadata=None): df._jdf, _to_java_column(sp_key), json.dumps(metadata)), ctx._spark_session) +def _raster_join(df, other, left_extent=None, left_crs=None, right_extent=None, right_crs=None, join_exprs=None): + ctx = SparkContext._active_spark_context._rf_context + if join_exprs is not None: + assert left_extent is not None and left_crs is not None and right_extent is not None and right_crs is not None + # Note the order of arguments here. + cols = [join_exprs, left_extent, left_crs, right_extent, right_crs] + jdf = ctx._jrfctx.rasterJoin(df._jdf, other._jdf, *[_to_java_column(c) for c in cols]) + + elif left_extent is not None: + assert left_crs is not None and right_extent is not None and right_crs is not None + cols = [left_extent, left_crs, right_extent, right_crs] + jdf = ctx._jrfctx.rasterJoin(df._jdf, other._jdf, *[_to_java_column(c) for c in cols]) + + else: + jdf = ctx._jrfctx.rasterJoin(df._jdf, other._jdf) + + return RasterFrame(jdf, ctx._spark_session) + + def _layer_reader(df_reader, format_key, path, **options): """ Loads the file of the given type at the given path.""" df = df_reader.format(format_key).load(path, **options) @@ -74,6 +93,9 @@ def to_csv(comp): return ','.join(str(v) for v in comp) # Add the 'asRF' method to pyspark DataFrame DataFrame.asRF = _convert_df +# Add `raster_join` method to pyspark DataFrame +DataFrame.raster_join = _raster_join + # Add DataSource convenience methods to the DataFrameReader DataFrameReader.rastersource = _rastersource_reader diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index faa337010..3f0f13ab4 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -34,6 +34,7 @@ def setUpClass(cls): cls.spark = (SparkSession.builder .config('spark.driver.extraClassPath', jarpath) .config('spark.executor.extraClassPath', jarpath) + .config('spark.sql.crossJoin.enabled', 'true') .withKryoSerialization() .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') @@ -374,6 +375,28 @@ def path(scene, band): b1_paths = [s.format('1') for s in scene_dict.values()] self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) + def test_raster_join(self): + rf_prime = self.rf.withColumnRenamed('tile', 'tile2') + rf_joined = self.rf.raster_join(rf_prime) + + self.assertTrue(rf_joined.count(), self.rf.count()) + self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + 1) + + rf_joined_2 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, rf_prime.extent, rf_prime.crs) + self.assertTrue(rf_joined_2.count(), self.rf.count()) + self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + 1) + + # this will bring arbitrary additional data into join; garbage result + join_expression = self.rf.extent.xmin == rf_prime.extent.xmin + rf_joined_3 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, + rf_prime.extent, rf_prime.crs, + join_expression) + self.assertTrue(rf_joined_3.count(), self.rf.count()) + self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + 1) + + # throws if you don't pass in all expected columns + with self.assertRaises(AssertionError): + self.rf.raster_join(rf_prime, join_exprs=self.rf.extent) def suite(): function_tests = unittest.TestSuite() diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 660c30e60..1e93f6347 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -24,6 +24,7 @@ import geotrellis.raster.{CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import org.apache.spark.sql._ +import org.locationtech.rasterframes.extensions.RasterJoin import org.locationtech.rasterframes.{RasterFunctions, _} import org.locationtech.rasterframes.model.LazyCRS import spray.json._ @@ -97,6 +98,24 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions df.asRF(spatialKey, jtlm) } + /** + * Left spatial join managing reprojection and merging of `other` + */ + def rasterJoin(df: DataFrame, other: DataFrame): DataFrame = RasterJoin(df, other) + + /** + * Left spatial join managing reprojection and merging of `other`; uses extent and CRS columns to determine if rows intersect + */ + def rasterJoin(df: DataFrame, other: DataFrame, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = + RasterJoin(df, other, leftExtent, leftCRS, rightExtent, rightCRS) + + /** + * Left spatial join managing reprojection and merging of `other`; uses joinExprs to conduct initial join then extent and CRS columns to determine if rows intersect + */ + def rasterJoin(df: DataFrame, other: DataFrame, joinExprs: Column, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = + RasterJoin(df, other, joinExprs, leftExtent, leftCRS, rightExtent, rightCRS) + + /** * Convenience functions for use in Python */ From 8c2d826402dc2a79ec15b6d51e47b3c94ad5bc47 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 29 May 2019 11:47:10 -0400 Subject: [PATCH 110/380] Pyrasterframes test setup does not need crossjoin config Signed-off-by: Jason T. Brown --- pyrasterframes/python/tests/PyRasterFramesTests.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 3f0f13ab4..6e6705c82 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -34,7 +34,6 @@ def setUpClass(cls): cls.spark = (SparkSession.builder .config('spark.driver.extraClassPath', jarpath) .config('spark.executor.extraClassPath', jarpath) - .config('spark.sql.crossJoin.enabled', 'true') .withKryoSerialization() .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') @@ -376,7 +375,9 @@ def path(scene, band): self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) def test_raster_join(self): - rf_prime = self.rf.withColumnRenamed('tile', 'tile2') + # re-read the same source + rf_prime = self.spark.read.geotiff(self.img_uri) \ + .withColumnRenamed('tile', 'tile2').alias('rf_prime') rf_joined = self.rf.raster_join(rf_prime) self.assertTrue(rf_joined.count(), self.rf.count()) From 7a4e771ad10b44fff96f0b44ad3caf898bb2cd4a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 11:54:44 -0400 Subject: [PATCH 111/380] Update fixed documentation. Co-Authored-By: Jason T Brown --- .../rasterframes/expressions/transformers/Mask.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala index 0f0754d97..106a52a7b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/Mask.scala @@ -149,7 +149,9 @@ object Mask { arguments = """ Arguments: * target - tile to mask - * mask - masking definition""", + * mask - masking definition + * maskValue - value in the `mask` for which to mark `target` as data cells + """, examples = """ Examples: > SELECT _FUNC_(target, mask, maskValue); From 4d14cc25ac8aa06914d8e6d35568d41d745e53d6 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 29 May 2019 14:06:20 -0400 Subject: [PATCH 112/380] Raster join test with heterogeneous LHS Signed-off-by: Jason T. Brown --- core/src/test/resources/README.md | 8 +++++ .../m_3607717_sw_18_1_20160620_subset.tif | Bin 0 -> 360982 bytes .../m_3607824_se_17_1_20160620_subset.tif | Bin 0 -> 360980 bytes core/src/test/resources/m_3607_box.tif | Bin 0 -> 3178 bytes .../rasterframes/RasterJoinSpec.scala | 34 ++++++++++++++++++ 5 files changed, 42 insertions(+) create mode 100644 core/src/test/resources/README.md create mode 100644 core/src/test/resources/m_3607717_sw_18_1_20160620_subset.tif create mode 100644 core/src/test/resources/m_3607824_se_17_1_20160620_subset.tif create mode 100644 core/src/test/resources/m_3607_box.tif diff --git a/core/src/test/resources/README.md b/core/src/test/resources/README.md new file mode 100644 index 000000000..70aa76cd6 --- /dev/null +++ b/core/src/test/resources/README.md @@ -0,0 +1,8 @@ +# Test resources + +## NAIP Virginia UTM overlaps + + 1. `m_3607717_sw_18_1_20160620_subset.tif` the southwest corner of NAIP m_3607717_sw_18_1. It is in its native CRS EPSG:26918 + 2. `m_3607824_se_17_1_20160620_subset.tif` the southeast corner of NAIP m_3607824_se_17_1. Overlaps number 1; It is to the east. It is in its native CRS EPSG:26917. + 3. `m_3607_box.tif` - an aribtrary burned in polygon in EPSG:4326 partially overlapping both of the above NAIP subsets 1 and 2. + diff --git a/core/src/test/resources/m_3607717_sw_18_1_20160620_subset.tif b/core/src/test/resources/m_3607717_sw_18_1_20160620_subset.tif new file mode 100644 index 0000000000000000000000000000000000000000..862c236452121137503544c6b9d08ed716f0573d GIT binary patch literal 360982 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
    VQ1jKU!Yz|;o)2d_n3xfxq$Bc2;IS6j4o;` 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 z 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 z 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

    ^$|Hj=FsoWo2| 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 F{|`H%-mCxs literal 0 HcmV?d00001 diff --git a/core/src/test/resources/m_3607824_se_17_1_20160620_subset.tif b/core/src/test/resources/m_3607824_se_17_1_20160620_subset.tif new file mode 100644 index 0000000000000000000000000000000000000000..2b2a7d497922b6d76c6fa2ecffaf99d5adc5faeb GIT binary patch literal 360980 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 Rq51;<9*w!Diuudw{{sb?FS`H$ literal 0 HcmV?d00001 diff --git a/core/src/test/resources/m_3607_box.tif b/core/src/test/resources/m_3607_box.tif new file mode 100644 index 0000000000000000000000000000000000000000..50570db26b724b34904f714f0e6c4db161f6cb08 GIT binary patch literal 3178 zcmebD)MDUZU|TmcKyLtPpoPEyVPtqFz{s(&9VpAd2IluEb8>8G2g!4TX$FRl+>&Xs zONv0|IV=l_a13`3Rv=bSY;5 literal 0 HcmV?d00001 diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index b457ca148..f00d70393 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -125,5 +125,39 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { multibandJoin.count() should be (multibandRf.count()) } + it("should join with heterogeneous LHS CRS and coverages"){ + + val df17 = readSingleband("m_3607824_se_17_1_20160620_subset.tif") + .toDF(TileDimensions(50, 50)) + .withColumn("utm", lit(17)) + // neighboring and slightly overlapping NAIP scene + val df18 = readSingleband("m_3607717_sw_18_1_20160620_subset.tif") + .toDF(TileDimensions(60, 60)) + .withColumn("utm", lit(18)) + + df17.count() should be (6 * 6) // file is 300 x 300 + df18.count() should be (5 * 5) // file is 300 x 300 + + val df = df17.union(df18) + df.count() should be (6 * 6 + 5 * 5) + val expectCrs = Array("+proj=utm +zone=17 +datum=NAD83 +units=m +no_defs ", "+proj=utm +zone=18 +datum=NAD83 +units=m +no_defs ") + df.select($"crs".getField("crsProj4")).distinct().as[String].collect() should contain theSameElementsAs expectCrs + + // read a third source to join. burned in box that intersects both above subsets; but more so on the df17 + val box = readSingleband("m_3607_box.tif").toDF(TileDimensions(4,4)).withColumnRenamed("tile", "burned") + val joined = df.rasterJoin(box) + + joined.count() should be (df.count) + + val totals = joined.groupBy($"utm").agg(sum(rf_tile_sum($"burned")).alias("burned_total")) + val total18 = totals.where($"utm" === 18).select($"burned_total").as[Double].first() + val total17 = totals.where($"utm" === 17).select($"burned_total").as[Double].first() + + total18 should be > 0.0 + total18 should be < total17 + + + } + } } From deb70f3b6c4a4f2f82ad87a0d37e8fb379432e0d Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 15:43:04 -0400 Subject: [PATCH 113/380] Fixed bug in maintaining RHS ancillary columns. Misc cleanup. --- .../rasterframes/expressions/accessors/GetCRS.scala | 2 +- .../rasterframes/extensions/RasterJoin.scala | 10 ++++++++-- .../org/locationtech/rasterframes/RasterJoinSpec.scala | 6 ++++++ .../datasource/awspds/MODISCatalogRelationTest.scala | 3 --- 4 files changed, 15 insertions(+), 6 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala index 1f1a9d926..00f8f5db4 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala @@ -39,7 +39,7 @@ import org.locationtech.rasterframes.model.TileContext */ case class GetCRS(child: Expression) extends OnTileContextExpression with CodegenFallback { override def dataType: DataType = schemaOf[CRS] - override def nodeName: String = "crs" + override def nodeName: String = "rf_crs" override def eval(ctx: TileContext): InternalRow = ctx.crs.toInternalRow } diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala index 32d98d621..5fba843f9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -98,13 +98,19 @@ object RasterJoin { // On the RHS we collect result as a list. val rightAggCtx = Seq(collect_list(rightExtent) as rightExtent2, collect_list(rightCRS) as rightCRS2) val rightAggTiles = right.tileColumns.map(c => collect_list(c) as c.columnName) - val aggCols = leftAggCols ++ rightAggTiles ++ rightAggCtx + val rightAggOther = right.notTileColumns + .filter(n => n.columnName != rightExtent.columnName && n.columnName != rightCRS.columnName) + .map(c => collect_list(c) as c.columnName) + val aggCols = leftAggCols ++ rightAggTiles ++ rightAggCtx ++ rightAggOther // After the aggregation we take all the tiles we've collected and resample + merge into LHS extent/CRS. val reprojCols = rightAggTiles.map(t => reproject_and_merge( col(leftExtent2), col(leftCRS2), col(t.columnName), col(rightExtent2), col(rightCRS2), rf_dimensions(leftTile) ) as t.columnName) - val finalCols = leftAggCols.map(c => col(c.columnName)) ++ reprojCols + + + def unresolved(c: Column): Column = col(c.columnName) + val finalCols = leftAggCols.map(unresolved) ++ reprojCols ++ rightAggOther.map(unresolved) // Here's the meat: left diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index f00d70393..8dde83515 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -159,5 +159,11 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { } + it("should pass through ancillary columns") { + val left = b4nativeRf.withColumn("left_id", monotonically_increasing_id()) + val right = b4warpedRf.withColumn("right_id", monotonically_increasing_id()) + val joined = left.rasterJoin(right) + joined.columns should contain allElementsOf Seq("left_id", "right_id") + } } } diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala index e882e4edf..a71ec0218 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala @@ -41,13 +41,11 @@ class MODISCatalogRelationTest extends TestEnvironment { .cache() it("should provide a non-empty catalog") { - scenes.show(false) assert(scenes.count() === 1) } it("should construct band specific download URLs") { val b01 = scenes.select($"assets"("B01").as[String]) - b01.show(false) noException shouldBe thrownBy { new URL(b01.first()) } @@ -65,7 +63,6 @@ class MODISCatalogRelationTest extends TestEnvironment { it("should download geotiff as tiles") { val b01 = scenes .select(read_tiles($"assets"("B01") as "B01", $"assets"("B02") as "B02")) - b01.show(false) assert(b01.count() === 100) // val kv = b01.select($"B01_extent", $"B01_tile").as[(Extent, Tile)] From 22ca7d03e510161fc527aa8e04b5effb989358c4 Mon Sep 17 00:00:00 2001 From: Phil Varner Date: Wed, 29 May 2019 16:25:36 -0400 Subject: [PATCH 114/380] fix circleci paths and fix ITs broken by mis-merge Signed-off-by: Phil Varner --- .circleci/config.yml | 8 +-- .../rasterframes/ref/RasterSourceIT.scala | 50 +++++++++++++------ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 5a3de91ae..55d18b941 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -142,17 +142,17 @@ workflows: filters: branches: only: - - /astraea\/feature\/.*-its/ + - /feature\/.*-its/ - itWithoutGdal: filters: branches: only: - - /astraea\/feature\/.*-its/ + - /feature\/.*-its/ - publish: filters: branches: only: - - astraea/develop + - develop nightlyReleaseAstraea: triggers: - schedule: @@ -160,7 +160,7 @@ workflows: filters: branches: only: - - astraea/develop + - develop jobs: - it - itWithoutGdal diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 7027258ee..9372e29ba 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -64,34 +64,52 @@ class RasterSourceIT extends TestEnvironment with TestData { if (RasterSource.IsGDAL.hasGDAL) { describe("GDAL support") { + it("should read JPEG2000 scene") { RasterSource(localSentinel).readAll().flatMap(_.tile.statisticsDouble).size should be(64) } + + it("should read small MRF scene with one band converted from MODIS HDF") { + val (expectedTileCount, _) = expectedTileCountAndBands(2400, 2400) + RasterSource(modisConvertedMrfPath).readAll().flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + it("should read remote HTTP MRF scene") { + val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) + RasterSource(remoteHttpMrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } + + it("should read remote S3 MRF scene") { + val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) + RasterSource(remoteS3MrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + } } } else { describe("GDAL missing error support") { it("should throw exception reading JPEG2000 scene") { - intercept[IllegalArgumentException] { - RasterSource(localSentinel) - } + intercept[IllegalArgumentException] { + RasterSource(localSentinel) + } } - } - it("should read small MRF scene with one band converted from MODIS HDF") { - val (expectedTileCount, _) = expectedTileCountAndBands(2400, 2400) - RasterSource(modisConvertedMrfPath).readAll().flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) - } + it("should throw exception reading MRF scene with one band converted from MODIS HDF") { + intercept[IllegalArgumentException] { + RasterSource(modisConvertedMrfPath) + } + } - it("should read remote HTTP MRF scene") { - val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) - RasterSource(remoteHttpMrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) - } + it("should throw exception reading remote HTTP MRF scene") { + intercept[IllegalArgumentException] { + RasterSource(remoteHttpMrfPath) + } + } - it("should read remote S3 MRF scene") { - val (expectedTileCount, bands) = expectedTileCountAndBands(6257, 7584, 4) - RasterSource(remoteS3MrfPath).readAll(bands = bands).flatMap(_.tile.statisticsDouble).size should be (expectedTileCount) + it("should throw exception reading remote S3 MRF scene") { + intercept[IllegalArgumentException] { + RasterSource(remoteS3MrfPath) + } + } } - } private def expectedTileCountAndBands(x:Int, y:Int, bandCount:Int = 1) = { From 11ec028ae08fb8629b0d4a43193ad45d82b0aa18 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 17:23:37 -0400 Subject: [PATCH 115/380] Fixes to RasterJoin to ensure gathered RHS column names are resolvable/unique. --- .../extensions/DataFrameMethods.scala | 8 ++++---- .../rasterframes/extensions/RasterJoin.scala | 16 +++++++++------- .../python/tests/PyRasterFramesTests.py | 8 ++++---- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index e38ecee25..d7f4af39e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -92,26 +92,26 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def tileColumns: Seq[Column] = self.schema.fields .filter(f => DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) - .map(f ⇒ col(f.name).as[Tile]) + .map(f ⇒ self.col(f.name).as[Tile]) /** Get the columns that are not of type `Tile` */ def notTileColumns: Seq[Column] = self.schema.fields .filter(f => !DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) - .map(f ⇒ col(f.name)) + .map(f ⇒ self.col(f.name)) /** Get the spatial column. */ def spatialKeyColumn: Option[TypedColumn[Any, SpatialKey]] = { val key = findSpatialKeyField key .map(_.name) - .map(col(_).as[SpatialKey]) + .map(self.col(_).as[SpatialKey]) } /** Get the temporal column, if any. */ def temporalKeyColumn: Option[TypedColumn[Any, TemporalKey]] = { val key = findTemporalKeyField - key.map(_.name).map(col(_).as[TemporalKey]) + key.map(_.name).map(self.col(_).as[TemporalKey]) } /** Find the field tagged with the requested `role` */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala index 5fba843f9..83f85fdd0 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -76,6 +76,9 @@ object RasterJoin { } def apply(left: DataFrame, right: DataFrame, joinExprs: Column, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = { + // Convert resolved column into a symbolic one. + def unresolved(c: Column): Column = col(c.columnName) + // Unique id for temporary columns val id = Random.alphanumeric.take(5).mkString("_", "", "_") @@ -88,8 +91,6 @@ object RasterJoin { // Post aggregation right crs. We create a new name. val rightCRS2 = id + "crs" - // A representative tile from the left - val leftTile = left.tileColumns.headOption.getOrElse(throw new IllegalArgumentException("Need at least one target tile on LHS")) // Gathering up various expressions we'll use to construct the result. // After joining We will be doing a groupBy the LHS. We have to define the aggregations to perform after the groupBy. @@ -100,16 +101,17 @@ object RasterJoin { val rightAggTiles = right.tileColumns.map(c => collect_list(c) as c.columnName) val rightAggOther = right.notTileColumns .filter(n => n.columnName != rightExtent.columnName && n.columnName != rightCRS.columnName) - .map(c => collect_list(c) as c.columnName) + .map(c => collect_list(c) as (c.columnName + "_agg")) val aggCols = leftAggCols ++ rightAggTiles ++ rightAggCtx ++ rightAggOther - // After the aggregation we take all the tiles we've collected and resample + merge into LHS extent/CRS. + // After the aggregation we take all the tiles we've collected and resample + merge + // into LHS extent/CRS. + // Use a representative tile from the left for the tile dimensions + val leftTile = left.tileColumns.headOption.getOrElse(throw new IllegalArgumentException("Need at least one target tile on LHS")) val reprojCols = rightAggTiles.map(t => reproject_and_merge( - col(leftExtent2), col(leftCRS2), col(t.columnName), col(rightExtent2), col(rightCRS2), rf_dimensions(leftTile) + col(leftExtent2), col(leftCRS2), col(t.columnName), col(rightExtent2), col(rightCRS2), rf_dimensions(unresolved(leftTile)) ) as t.columnName) - - def unresolved(c: Column): Column = col(c.columnName) val finalCols = leftAggCols.map(unresolved) ++ reprojCols ++ rightAggOther.map(unresolved) // Here's the meat: diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 879632ab5..113faf173 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -373,7 +373,6 @@ def path(scene, band): pathTableColumns=csv_columns, ) - path_df.printSchema() self.assertTrue(len(path_df.columns) == 6) # three bands times {path, tile} self.assertTrue(path_df.select('b1_path').distinct().count() == 3) # as per scene_dict b1_paths_maybe = path_df.select('b1_path').distinct().collect() @@ -384,14 +383,15 @@ def test_raster_join(self): # re-read the same source rf_prime = self.spark.read.geotiff(self.img_uri) \ .withColumnRenamed('tile', 'tile2').alias('rf_prime') + rf_joined = self.rf.raster_join(rf_prime) self.assertTrue(rf_joined.count(), self.rf.count()) - self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + 1) + self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) rf_joined_2 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, rf_prime.extent, rf_prime.crs) self.assertTrue(rf_joined_2.count(), self.rf.count()) - self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + 1) + self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) # this will bring arbitrary additional data into join; garbage result join_expression = self.rf.extent.xmin == rf_prime.extent.xmin @@ -399,7 +399,7 @@ def test_raster_join(self): rf_prime.extent, rf_prime.crs, join_expression) self.assertTrue(rf_joined_3.count(), self.rf.count()) - self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + 1) + self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) # throws if you don't pass in all expected columns with self.assertRaises(AssertionError): From 9053de3cc23351592f9011a9997257de3a8823e6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 29 May 2019 17:42:33 -0400 Subject: [PATCH 116/380] Regression fix. --- .../scala/org/locationtech/rasterframes/RasterJoinSpec.scala | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala index 8dde83515..b2cd5d8ce 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterJoinSpec.scala @@ -119,7 +119,6 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { multibandRf.tileColumns.length should be (3) val multibandJoin = multibandRf.rasterJoin(b4warpedRf) - multibandJoin.printSchema() multibandJoin.tileColumns.length should be (4) multibandJoin.count() should be (multibandRf.count()) @@ -163,7 +162,7 @@ class RasterJoinSpec extends TestEnvironment with TestData with RasterMatchers { val left = b4nativeRf.withColumn("left_id", monotonically_increasing_id()) val right = b4warpedRf.withColumn("right_id", monotonically_increasing_id()) val joined = left.rasterJoin(right) - joined.columns should contain allElementsOf Seq("left_id", "right_id") + joined.columns should contain allElementsOf Seq("left_id", "right_id_agg") } } } From 461c847712a9bb218625caccda9f48e79fbb57bb Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 30 May 2019 13:02:53 -0400 Subject: [PATCH 117/380] Fixes to CellType <-> dtype conversion. --- .../python/pyrasterframes/rf_types.py | 39 ++++-------------- .../python/tests/PyRasterFramesTests.py | 41 ++++++++++++------- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 722a6d4f1..37d4a56e5 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -196,23 +196,7 @@ def no_data_value(self): def to_numpy_dtype(self): n = self.base_cell_type_name() - if n == "uint8": - return np.uint - elif n == "int8": - return np.int - elif n == "uint16": - return np.ushort - elif n == "int16": - return np.short - elif n == "int32": - return np.int - elif n == "float32": - return np.float - elif n == "float64": - return np.double - else: - # Shouldn't happen - return np.dtype(n) + return np.dtype(n) def with_no_data_value(self, no_data): return CellType(self.base_cell_type_name() + "ud" + str(no_data)) @@ -234,18 +218,18 @@ class Tile(object): def __init__(self, cells, cell_type=None): if cell_type is None: self.cell_type = CellType.from_numpy_dtype(cells.dtype) + self.cells = cells else: self.cell_type = cell_type + self.cells = cells.astype(cell_type.to_numpy_dtype()) if self.cell_type.has_no_data(): nd_value = self.cell_type.no_data_value() if np.isnan(nd_value): - self.cells = np.ma.masked_invalid(cells) + self.cells = np.ma.masked_invalid(self.cells) else: # if the value in the array is `nd_value`, it is masked as nodata - self.cells = np.ma.masked_equal(cells, nd_value) - else: - self.cells = cells + self.cells = np.ma.masked_equal(self.cells, nd_value) def __eq__(self, other): if type(other) is type(self): @@ -254,12 +238,12 @@ def __eq__(self, other): return False def __str__(self): - return "Tile(\n dimensions={}\n cell_type={}\n cells={}\n)" \ + return "Tile(dimensions={}, cell_type={}, cells={})" \ .format(self.dimensions(), self.cell_type, self.cells) def __repr__(self): return "Tile({}, {})" \ - .format(repr(self.cell_type), str(self.cells)) + .format(repr(self.cells), repr(self.cell_type)) def __add__(self, right): if isinstance(right, Tile): @@ -324,7 +308,6 @@ def scalaUDT(cls): return 'org.apache.spark.sql.rf.TileUDT' def serialize(self, tile): - #print("in: ", repr(tile.cells.flatten().tobytes())) row = [ # cell_context [ @@ -350,11 +333,8 @@ def deserialize(self, datum): cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells - #print("out: ", repr(cell_data_bytes)) try: - as_numpy = np.frombuffer(cell_data_bytes) - #.astype(dtype=cell_type.to_numpy_dtype()) - #.astype(dtype=np.dtype('B')) \ + as_numpy = np.frombuffer(cell_data_bytes, dtype=cell_type.to_numpy_dtype()) reshaped = as_numpy.reshape((rows, cols)) t = Tile(reshaped, cell_type) except ValueError as e: @@ -364,8 +344,7 @@ def deserialize(self, datum): "rows": rows, "cell_data.length": len(cell_data_bytes), "cell_data.type": type(cell_data_bytes), - "cell_data.values": repr(cell_data_bytes), - "as_numpy.values": repr(as_numpy) + "cell_data.values": repr(cell_data_bytes) }, e) return t diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index fde57ed9c..8e3ef5d66 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -46,8 +46,11 @@ def setUpClass(cls): print("Spark Version: " + cls.spark.version) cls.spark.withRasterFrames() - # load something into a rasterframe - rf = cls.spark.read.geotiff(cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri()) \ + cls.img_uri = cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri() + + + # load something into a rasterframe + rf = cls.spark.read.geotiff(cls.img_uri) \ .withBounds() \ .withCenter() @@ -384,16 +387,6 @@ def test_cell_type_conversion(self): CellType.from_numpy_dtype(ct.to_numpy_dtype()), "GTCellType comparison for " + str(ct)) - def test_array_flattening(self): - #a = np.frombuffer(bytearray([1, 0, 0, 0, 0, 0, 0, 0])) - - a = np.array([[1, 2], [0, 4]], dtype=np.dtype("uint8")) - b = np.ma.masked_equal(a, 2) - c = builtins.bytearray(b.flatten().tobytes()) - d = np.frombuffer(c, b.dtype).reshape(2, 2) - e = np.ma.masked_equal(d, 2) - print(repr(e)) - def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) self.assertTrue(t1.cells.mask[1][0]) @@ -429,6 +422,7 @@ def test_tile_udt_serialization(self): def test_no_data_udf_handling(self): t1 = Tile(np.array([[1, 2], [0, 4]]), CellType("uint8")) + self.assertEqual(t1.cell_type.to_numpy_dtype(), np.dtype("uint8")) e1 = Tile(np.array([[2, 3], [0, 5]]), CellType("uint8")) schema = StructType([StructField("tile", TileUDT(), False)]) df = self.spark.createDataFrame([{"tile": t1}], schema) @@ -453,7 +447,23 @@ def test_addition(self): r2 = (t1 + t2).cells self.assertTrue(np.ma.allequal(r2, e2)) - def test_tile_ops_general(self): + +class PandasInterop(TestEnvironment): + + def test_pandas_conversion(self): + import pandas as pd + pd.options.display.max_colwidth = 256 + cell_types = (ct for ct in rf_cell_types() if not (ct.is_raw() or ("bool" in ct.base_cell_type_name()))) + tiles = [Tile(np.random.randn(10, 12) * 100, ct) for ct in cell_types] + in_pandas = pd.DataFrame({ + 'tile': tiles + }) + + in_spark = self.spark.createDataFrame(in_pandas) + out_pandas = in_spark.select('tile').toPandas() + self.assertTrue(out_pandas.equals(in_pandas)) + + def test_extended_pandas_ops(self): import pandas as pd self.assertIsInstance(self.rf.sql_ctx, SQLContext) @@ -466,13 +476,16 @@ def test_tile_ops_general(self): # Try to create a tile from numpy. self.assertEqual(Tile(np.random.randn(10, 10)).dimensions(), [10, 10]) + tiles = [Tile(np.random.randn(10, 12), CellType("float32")) for _ in range(3)] to_spark = pd.DataFrame({ - 't': [Tile(np.random.randn(10, 12)) for _ in range(3)], + 't': tiles, 'b': ['a', 'b', 'c'], 'c': [1, 2, 4], }) rf_maybe = self.spark.createDataFrame(to_spark) + rf_maybe.select(rf_render_matrix(rf_maybe.t)).show(truncate=False) + # Try to do something with it. sums = to_spark.t.apply(lambda a: a.cells.sum()).tolist() maybe_sums = rf_maybe.select(rf_tile_sum(rf_maybe.t).alias('tsum')) From 4c797f5690ffa0828a276e1198bac1c3897d4804 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 30 May 2019 14:55:35 -0400 Subject: [PATCH 118/380] Fixed serialization issue with handling byte order. Added rf_identity Added class methods to get standard cell types. --- .../rasterframes/RasterFunctions.scala | 3 + .../expressions/localops/Abs.scala | 2 +- .../expressions/localops/Identity.scala | 50 ++++++++++ .../python/pyrasterframes/rasterfunctions.py | 1 + .../python/pyrasterframes/rf_types.py | 92 +++++++++++++------ .../python/tests/PyRasterFramesTests.py | 63 ++++++------- 6 files changed, 151 insertions(+), 60 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Identity.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 3af47dfaf..bcb582632 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -416,4 +416,7 @@ trait RasterFunctions { def rf_expm1(tileCol: Column): TypedColumn[Any, Tile] = ExpM1(tileCol) + def rf_identity(tileCol: Column): TypedColumn[Any, Tile] = + Identity(tileCol) + } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala index 196bf30b7..0fe6cac87 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Abs.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.expressions.{NullToValue, UnaryLocalRasterO case class Abs(child: Expression) extends UnaryLocalRasterOp with NullToValue with CodegenFallback { override def nodeName: String = "rf_abs" override def na: Any = null - override protected def op(child: Tile): Tile = child.localAbs() + override protected def op(t: Tile): Tile = t.localAbs() } object Abs { diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Identity.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Identity.scala new file mode 100644 index 000000000..60e607f8b --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Identity.scala @@ -0,0 +1,50 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.localops + +import geotrellis.raster.Tile +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.{NullToValue, UnaryLocalRasterOp} + +@ExpressionDescription( + usage = "_FUNC_(tile) - Return the given tile or projected raster unchanged. Useful in debugging round-trip serialization across various language and memory boundaries.", + arguments = """ + Arguments: + * tile - tile column to pass through""", + examples = """ + Examples: + > SELECT _FUNC_(tile); + ...""" +) +case class Identity(child: Expression) extends UnaryLocalRasterOp with NullToValue with CodegenFallback { + override def nodeName: String = "rf_identity" + override def na: Any = null + override protected def op(t: Tile): Tile = t +} + +object Identity { + def apply(tile: Column): TypedColumn[Any, Tile] = + new Column(Identity(tile.expr)).as[Tile] +} diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index 0b3c9cdf5..ffcc6c26f 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -255,6 +255,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_exp2': 'Compute 2 to the power of cell values', 'rf_exp10': 'Compute 10 to the power of cell values', 'rf_expm1': 'Performs cell-wise exponential, then subtract one', + 'rf_identity': 'Pass tile through unchanged', 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', 'rf_crs': 'Get the CRS of a RasterSource or ProjectedRasterTile', 'st_extent': 'Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)', diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 37d4a56e5..91fdb66dd 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -143,10 +143,42 @@ def __init__(self, cell_type_name: str): @classmethod def from_numpy_dtype(cls, np_dtype: np.dtype): - return CellType(str(np_dtype)) + return CellType(str(np_dtype.name)) + + @classmethod + def bool(cls): + return CellType('bool') + + @classmethod + def int8(cls): + return CellType('int8') + + @classmethod + def uint8(cls): + return CellType('uint8') + + @classmethod + def int16(cls): + return CellType('int16') + + @classmethod + def uint16(cls): + return CellType('uint16') + + @classmethod + def int32(cls): + return CellType('int32') + + @classmethod + def float32(cls): + return CellType('float32') + + @classmethod + def float64(cls): + return CellType('float64') def is_raw(self): - return self.cell_type_name.endswith("raw") + return self.cell_type_name.endswith('raw') def is_user_defined_no_data(self): return "ud" in self.cell_type_name @@ -155,13 +187,13 @@ def is_default_no_data(self): return not (self.is_raw() or self.is_user_defined_no_data()) def is_floating_point(self): - return self.cell_type_name.startswith("float") + return self.cell_type_name.startswith('float') def base_cell_type_name(self): if self.is_raw(): return self.cell_type_name[:-3] elif self.is_user_defined_no_data(): - return self.cell_type_name.split("ud")[0] + return self.cell_type_name.split('ud')[0] else: return self.cell_type_name @@ -172,7 +204,7 @@ def no_data_value(self): if self.is_raw(): return None elif self.is_user_defined_no_data(): - num_str = self.cell_type_name.split("ud")[1] + num_str = self.cell_type_name.split('ud')[1] if self.is_floating_point(): return float(num_str) else: @@ -182,24 +214,24 @@ def no_data_value(self): return np.nan else: n = self.base_cell_type_name() - if n == "uint8" or n == "uint16": + if n == 'uint8' or n == 'uint16': return 0 - elif n == "int8": + elif n == 'int8': return -128 - elif n == "int16": + elif n == 'int16': return -32768 - elif n == "int32": + elif n == 'int32': return -2147483648 - elif n == "bool": + elif n == 'bool': return None raise Exception("Unable to determine no_data_value from '{}'".format(n)) def to_numpy_dtype(self): n = self.base_cell_type_name() - return np.dtype(n) + return np.dtype(n).newbyteorder('>') def with_no_data_value(self, no_data): - return CellType(self.base_cell_type_name() + "ud" + str(no_data)) + return CellType(self.base_cell_type_name() + 'ud' + str(no_data)) def __eq__(self, other): if type(other) is type(self): @@ -215,13 +247,9 @@ def __repr__(self): class Tile(object): - def __init__(self, cells, cell_type=None): - if cell_type is None: - self.cell_type = CellType.from_numpy_dtype(cells.dtype) - self.cells = cells - else: - self.cell_type = cell_type - self.cells = cells.astype(cell_type.to_numpy_dtype()) + def __init__(self, cells, cell_type): + self.cell_type = cell_type + self.cells = cells.astype(cell_type.to_numpy_dtype()) if self.cell_type.has_no_data(): nd_value = self.cell_type.no_data_value() @@ -233,7 +261,7 @@ def __init__(self, cells, cell_type=None): def __eq__(self, other): if type(other) is type(self): - return np.array_equal(self.cells, other.cells) + return self.cell_type == other.cell_type and np.array_equal(self.cells, other.cells) else: return False @@ -250,11 +278,7 @@ def __add__(self, right): other = right.cells else: other = right - result = np.add(self.cells, other) - ct = CellType.from_numpy_dtype(result.dtype) - if isinstance(result, np.ma.masked_array): - ct = ct.with_no_data_value(result.fill_value) - return Tile(np.add(self.cells, other), ct) + return Tile(np.add(self.cells, other), self.cell_type) def __sub__(self, right): if isinstance(right, Tile): @@ -263,6 +287,21 @@ def __sub__(self, right): other = right return Tile(np.subtract(self.cells, other), self.cell_type) + def __mul__(self, right): + if isinstance(right, Tile): + other = right.cells + else: + other = right + return Tile(np.multiply(self.cells, other), self.cell_type) + + def __truediv__(self, right): + if isinstance(right, Tile): + other = right.cells + else: + other = right + return Tile(np.true_divide(self.cells, other), self.cell_type) + + def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames return [self.cells.shape[1], self.cells.shape[0]] @@ -308,6 +347,7 @@ def scalaUDT(cls): return 'org.apache.spark.sql.rf.TileUDT' def serialize(self, tile): + cells = bytearray(tile.cells.flatten().tobytes()) row = [ # cell_context [ @@ -317,7 +357,7 @@ def serialize(self, tile): # cell_data [ # cells - bytearray(tile.cells.flatten().tobytes()), + cells, None ] ] diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 8e3ef5d66..e875636a4 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -354,26 +354,26 @@ def test_is_floating_point(self): def test_cell_type_no_data(self): import math - self.assertIsNone(CellType("bool").no_data_value()) + self.assertIsNone(CellType.bool().no_data_value()) - self.assertTrue(CellType("int8").has_no_data()) - self.assertEqual(CellType("int8").no_data_value(), -128) + self.assertTrue(CellType.int8().has_no_data()) + self.assertEqual(CellType.int8().no_data_value(), -128) - self.assertTrue(CellType("uint8").has_no_data()) - self.assertEqual(CellType("uint8").no_data_value(), 0) + self.assertTrue(CellType.uint8().has_no_data()) + self.assertEqual(CellType.uint8().no_data_value(), 0) - self.assertTrue(CellType("int16").has_no_data()) - self.assertEqual(CellType("int16").no_data_value(), -32768) + self.assertTrue(CellType.int16().has_no_data()) + self.assertEqual(CellType.int16().no_data_value(), -32768) - self.assertTrue(CellType("uint16").has_no_data()) - self.assertEqual(CellType("uint16").no_data_value(), 0) + self.assertTrue(CellType.uint16().has_no_data()) + self.assertEqual(CellType.uint16().no_data_value(), 0) - self.assertTrue(CellType("float32").has_no_data()) - self.assertTrue(np.isnan(CellType("float32").no_data_value())) + self.assertTrue(CellType.float32().has_no_data()) + self.assertTrue(np.isnan(CellType.float32().no_data_value())) self.assertEqual(CellType("float32ud-98").no_data_value(), -98.0) - self.assertTrue(math.isnan(CellType("float64").no_data_value())) - self.assertEqual(CellType("uint8").no_data_value(), 0) + self.assertTrue(math.isnan(CellType.float64().no_data_value())) + self.assertEqual(CellType.uint8().no_data_value(), 0) class UDT(TestEnvironment): @@ -392,7 +392,7 @@ def test_mask_no_data(self): self.assertTrue(t1.cells.mask[1][0]) self.assertIsNotNone(t1.cells[1][1]) self.assertEqual(len(t1.cells.compressed()), 3) - t2 = Tile(np.array([[1.0, 2.0], [float('nan'), 4.0]]), CellType("float32")) + t2 = Tile(np.array([[1.0, 2.0], [float('nan'), 4.0]]), CellType.float32()) self.assertEqual(len(t2.cells.compressed()), 3) self.assertTrue(t2.cells.mask[1][0]) self.assertIsNotNone(t2.cells[1][1]) @@ -421,9 +421,9 @@ def test_tile_udt_serialization(self): self.assertEqual(long_trip, a_tile) def test_no_data_udf_handling(self): - t1 = Tile(np.array([[1, 2], [0, 4]]), CellType("uint8")) + t1 = Tile(np.array([[1, 2], [0, 4]]), CellType.uint8()) self.assertEqual(t1.cell_type.to_numpy_dtype(), np.dtype("uint8")) - e1 = Tile(np.array([[2, 3], [0, 5]]), CellType("uint8")) + e1 = Tile(np.array([[2, 3], [0, 5]]), CellType.uint8()) schema = StructType([StructField("tile", TileUDT(), False)]) df = self.spark.createDataFrame([{"tile": t1}], schema) @@ -438,11 +438,11 @@ def increment(t: Tile): class TileOps(TestEnvironment): def test_addition(self): - t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) + t1 = Tile(np.array([[1, 2], [3, 4]]), CellType.int8().with_no_data_value(3)) e1 = np.ma.masked_equal(np.array([[5, 6], [7, 8]]), 7) self.assertTrue(np.array_equal((t1 + 4).cells, e1)) - t2 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud1")) + t2 = Tile(np.array([[1, 2], [3, 4]]), CellType.int8().with_no_data_value(1)) e2 = np.ma.masked_equal(np.array([[3, 4], [3, 8]]), 3) r2 = (t1 + t2).cells self.assertTrue(np.ma.allequal(r2, e2)) @@ -452,16 +452,16 @@ class PandasInterop(TestEnvironment): def test_pandas_conversion(self): import pandas as pd - pd.options.display.max_colwidth = 256 + #pd.options.display.max_colwidth = 256 cell_types = (ct for ct in rf_cell_types() if not (ct.is_raw() or ("bool" in ct.base_cell_type_name()))) - tiles = [Tile(np.random.randn(10, 12) * 100, ct) for ct in cell_types] + tiles = [Tile(np.random.randn(5, 5) * 100, ct) for ct in cell_types] in_pandas = pd.DataFrame({ 'tile': tiles }) in_spark = self.spark.createDataFrame(in_pandas) - out_pandas = in_spark.select('tile').toPandas() - self.assertTrue(out_pandas.equals(in_pandas)) + out_pandas = in_spark.select(rf_identity('tile').alias('tile')).toPandas() + self.assertTrue(out_pandas.equals(in_pandas), str(in_pandas) + "\n\n" + str(out_pandas)) def test_extended_pandas_ops(self): import pandas as pd @@ -474,9 +474,9 @@ def test_extended_pandas_ops(self): all([isinstance(row.tile.cells, np.ndarray) for row in rf_collect])) # Try to create a tile from numpy. - self.assertEqual(Tile(np.random.randn(10, 10)).dimensions(), [10, 10]) + self.assertEqual(Tile(np.random.randn(10, 10), CellType.int8()).dimensions(), [10, 10]) - tiles = [Tile(np.random.randn(10, 12), CellType("float32")) for _ in range(3)] + tiles = [Tile(np.random.randn(10, 12), CellType.float64()) for _ in range(3)] to_spark = pd.DataFrame({ 't': tiles, 'b': ['a', 'b', 'c'], @@ -484,7 +484,7 @@ def test_extended_pandas_ops(self): }) rf_maybe = self.spark.createDataFrame(to_spark) - rf_maybe.select(rf_render_matrix(rf_maybe.t)).show(truncate=False) + # rf_maybe.select(rf_render_matrix(rf_maybe.t)).show(truncate=False) # Try to do something with it. sums = to_spark.t.apply(lambda a: a.cells.sum()).tolist() @@ -492,26 +492,23 @@ def test_extended_pandas_ops(self): maybe_sums = [r.tsum for r in maybe_sums.collect()] np.testing.assert_almost_equal(maybe_sums, sums, 12) - # Back to python side. - print(rf_maybe.toPandas()) - # Test round trip for an array - simple_array = Tile(np.array([[1, 2], [3, 4]]).astype('float64'), ) + simple_array = Tile(np.array([[1, 2], [3, 4]]), CellType.float64()) to_spark_2 = pd.DataFrame({ 't': [simple_array] }) rf_maybe_2 = self.spark.createDataFrame(to_spark_2) - print("RasterFrame `show`:") - rf_maybe_2.select(rf_render_matrix(rf_maybe_2.t).alias('t')).show(truncate=False) + #print("RasterFrame `show`:") + #rf_maybe_2.select(rf_render_matrix(rf_maybe_2.t).alias('t')).show(truncate=False) pd_2 = rf_maybe_2.toPandas() array_back_2 = pd_2.iloc[0].t - print("Array collected from toPandas output\n", array_back_2) + #print("Array collected from toPandas output\n", array_back_2) self.assertIsInstance(array_back_2, Tile) np.testing.assert_equal(array_back_2.cells, simple_array.cells) - + np.int8 class RasterSource(TestEnvironment): From 6343ea03d79bef709bdc7a0fe1eb280f815e10a4 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 30 May 2019 17:58:39 -0400 Subject: [PATCH 119/380] Experiment in wrapping GT tiles in wrapper with more useful toString rendering. --- core/src/main/resources/reference.conf | 2 + .../org/apache/spark/sql/rf/TileUDT.scala | 2 +- .../aggregates/TileRasterizerAggregate.scala | 8 +-- .../extensions/DataFrameMethods.scala | 1 - .../rasterframes/model/Cells.scala | 11 +++- .../rasterframes/tiles/InternalRowTile.scala | 4 +- .../tiles/ProjectedRasterTile.scala | 8 ++- .../rasterframes/tiles/ShowableTile.scala | 53 +++++++++++++++++++ .../rasterframes/TileUDTSpec.scala | 12 ++++- 9 files changed, 90 insertions(+), 11 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index 77597ab89..270f122fa 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -1,6 +1,8 @@ rasterframes { nominal-tile-size = 256 prefer-gdal = true + showable-tiles = true + showable-max-cells = 20 } vlm.gdal { diff --git a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala index 3a6168d6f..66c0d98a1 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/TileUDT.scala @@ -56,7 +56,7 @@ class TileUDT extends UserDefinedType[Tile] { case ir: InternalRow ⇒ ir.to[Tile] } .map { - case realIRT: InternalRowTile ⇒ realIRT.toArrayTile() + case realIRT: InternalRowTile ⇒ realIRT.realizedTile case other ⇒ other } .orNull diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala index a4e048496..c68b8aecb 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala @@ -25,7 +25,7 @@ import org.locationtech.rasterframes._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.proj4.CRS import geotrellis.raster.resample.ResampleMethod -import geotrellis.raster.{ArrayTile, CellType, MutableArrayTile, Raster, Tile} +import geotrellis.raster.{ArrayTile, CellType, Raster, Tile} import geotrellis.vector.Extent import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types.{DataType, StructField, StructType} @@ -68,15 +68,15 @@ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefine if (prd.extent.intersects(localExtent)) { val localTile = input.getAs[Tile](2).reproject(extent, crs, prd.crs, projOpts) - val bt = buffer.getAs[MutableArrayTile](0) + val bt = buffer.getAs[Tile](0) val merged = bt.merge(prd.extent, localExtent, localTile.tile, prd.sampler) buffer(0) = merged } } override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { - val leftTile = buffer1.getAs[MutableArrayTile](0) - val rightTile = buffer2.getAs[MutableArrayTile](0) + val leftTile = buffer1.getAs[Tile](0) + val rightTile = buffer2.getAs[Tile](0) buffer1(0) = leftTile.merge(rightTile) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index d7f4af39e..599beb637 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -29,7 +29,6 @@ import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} import geotrellis.util.MethodExtensions import org.apache.spark.sql.catalyst.expressions.Attribute -import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} import spray.json.JsonFormat diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala index 975109f0c..e91bf38ef 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala @@ -24,10 +24,12 @@ package org.locationtech.rasterframes.model import geotrellis.raster.{ArrayTile, ConstantTile, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.types.{BinaryType, StructField, StructType} +import org.locationtech.rasterframes import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.{CatalystSerializer, CatalystSerializerEncoder} import org.locationtech.rasterframes.ref.RasterRef import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes.tiles.ShowableTile import org.locationtech.rasterframes.tiles.ProjectedRasterTile.ConcreteProjectedRasterTile /** Represents the union of binary cell datas or a reference to the data.*/ @@ -37,14 +39,18 @@ case class Cells(data: Either[Array[Byte], RasterRef]) { /** Convert cells into either a RasterRefTile or an ArrayTile. */ def toTile(ctx: TileDataContext): Tile = { data.fold( - bytes => ArrayTile.fromBytes(bytes, ctx.cellType, ctx.dimensions.cols, ctx.dimensions.rows), + bytes => { + val t = ArrayTile.fromBytes(bytes, ctx.cellType, ctx.dimensions.cols, ctx.dimensions.rows) + if (Cells.showableTiles) new ShowableTile(t) + else t + }, ref => RasterRefTile(ref) ) } } object Cells { - + private val showableTiles = rasterframes.rfConfig.getBoolean("showable-tiles") /** Extracts the Cells from a Tile. */ def apply(t: Tile): Cells = { t match { @@ -54,6 +60,7 @@ object Cells { Cells(Right(ref.rr)) case const: ConstantTile => // TODO: Create mechanism whereby constant tiles aren't expanded. + // If we don't, the serialization breaks. Cells(Left(const.toArrayTile().toBytes)) case o => Cells(Left(o.toBytes)) diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala index 2785888d7..98be22446 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/InternalRowTile.scala @@ -40,7 +40,7 @@ class InternalRowTile(val mem: InternalRow) extends FixedDelegatingTile { override def toArrayTile(): ArrayTile = realizedTile.toArrayTile() // TODO: We want to reimplement relevant delegated methods so that they read directly from tungsten storage - protected lazy val realizedTile: Tile = cells.toTile(cellContext) + lazy val realizedTile: Tile = cells.toTile(cellContext) protected override def delegate: Tile = realizedTile @@ -113,6 +113,8 @@ class InternalRowTile(val mem: InternalRow) extends FixedDelegatingTile { case _: DoubleCells ⇒ DoubleCellReader(this) } } + + override def toString: String = ShowableTile.show(this) } object InternalRowTile { diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala index fd61cb88c..92e2d285d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ProjectedRasterTile.scala @@ -59,10 +59,16 @@ object ProjectedRasterTile { case class ConcreteProjectedRasterTile(t: Tile, extent: Extent, crs: CRS) extends ProjectedRasterTile { def delegate: Tile = t + override def convert(cellType: CellType): Tile = ConcreteProjectedRasterTile(t.convert(cellType), extent, crs) - } + override def toString: String = { + val e = s"(${extent.xmin}, ${extent.ymin}, ${extent.xmax}, ${extent.ymax})" + val c = crs.toProj4String + s"[${ShowableTile.show(t)}, $e, $c]" + } + } implicit val serializer: CatalystSerializer[ProjectedRasterTile] = new CatalystSerializer[ProjectedRasterTile] { override def schema: StructType = StructType(Seq( StructField("tile_context", schemaOf[TileContext], false), diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala new file mode 100644 index 000000000..a021febe8 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala @@ -0,0 +1,53 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.tiles +import org.locationtech.rasterframes._ +import geotrellis.raster.Tile + +class ShowableTile(val delegate: Tile) extends FixedDelegatingTile { + override def equals(obj: Any): Boolean = obj match { + case ppt: ShowableTile => delegate.equals(ppt.delegate) + case o => delegate.equals(o) + } + override def hashCode(): Int = delegate.hashCode() + override def toString: String = ShowableTile.show(delegate) +} + +object ShowableTile { + private val maxCells = rfConfig.getInt("showable-max-cells") + def show(tile: Tile): String = { + val ct = tile.cellType + val dims = tile.dimensions + val data = if (tile.cellType.isFloatingPoint) + tile.toArrayDouble() + else tile.toArray() + + val cells = if (data.length <= maxCells) + data.mkString("[", ",", "]") + else { + val front = data.take(maxCells/2).mkString("[", ",", "") + val back = data.takeRight(maxCells/2).mkString("", ",", "]") + front + ",...," + back + } + s"[${ct.name}, $dims, $cells]" + } +} diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala index ceac41f64..88d1e754f 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala @@ -23,7 +23,9 @@ package org.locationtech.rasterframes import geotrellis.raster.{CellType, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf._ +import org.apache.spark.sql.types.StringType import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.tiles.ShowableTile import org.scalatest.Inspectors /** @@ -39,7 +41,7 @@ class TileUDTSpec extends TestEnvironment with TestData with Inspectors { implicit val ser = TileUDT.tileSerializer describe("TileUDT") { - val tileSizes = Seq(2, 64, 128, 222, 511) + val tileSizes = Seq(2, 7, 64, 128, 511) val ct = functions.cellTypes().filter(_ != "bool") def forEveryConfig(test: Tile ⇒ Unit): Unit = { @@ -90,5 +92,13 @@ class TileUDTSpec extends TestEnvironment with TestData with Inspectors { } } } + + it("should provide a pretty-print tile") { + import spark.implicits._ + forEveryConfig { tile => + val stringified = Seq(tile).toDF("tile").select($"tile".cast(StringType)).as[String].first() + stringified should be(ShowableTile.show(tile)) + } + } } } From 2f63d6cee32d837242cf5948e67ef1b92c3596b8 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 30 May 2019 17:59:30 -0400 Subject: [PATCH 120/380] Changing TravisCI distribution in attempt to get Python 3. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fbe2823fa..668aec8ef 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,5 +1,5 @@ sudo: false - +dist: xenial language: scala cache: From 9cc8df20b173f12d545c3d62ba5acb017496bff5 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 31 May 2019 10:12:39 -0400 Subject: [PATCH 121/380] Small tweaks to pyrasterframes tests Signed-off-by: Jason T. Brown --- .../python/tests/PyRasterFramesTests.py | 51 ++++++++++++------- 1 file changed, 32 insertions(+), 19 deletions(-) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index e875636a4..03b29c9bf 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -48,8 +48,7 @@ def setUpClass(cls): cls.img_uri = cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri() - - # load something into a rasterframe + # load something into a rasterframe rf = cls.spark.read.geotiff(cls.img_uri) \ .withBounds() \ .withCenter() @@ -61,6 +60,7 @@ def setUpClass(cls): .withColumnRenamed('tile2', cls.tileCol).asRF() # cls.rf.show() + class VectorTypes(TestEnvironment): def setUp(self): @@ -132,9 +132,33 @@ def some_point(g): ) def test_rasterize(self): - # NB: This test just makes sure rf_rasterize runs, not that the results are correct. - with_raster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) - with_raster.show() + # simple test that raster contents are not invalid + + # create a udf to buffer (the bounds) polygon + def _buffer(g, d): + return g.buffer(d) + + @udf("double") + def area(g): + return g.area + + buffer_udf = udf(_buffer, PolygonUDT()) + + buf_cells = 10 + with_poly = self.rf.withColumn('poly', buffer_udf(self.rf.geometry, lit(-15 * buf_cells))) # cell res is 15x15 + area = with_poly.select(area('poly') < area('geometry')) + area_result = area.collect() + self.assertTrue(all([r[0] for r in area_result])) + + cols = 194 + rows = 250 + with_raster = with_poly.withColumn('rasterized', rf_rasterize('poly', 'geometry', lit(16), cols, rows)) + # expect a 4 by 4 cell + result = with_raster.select(rf_tile_sum(rf_local_equal_int(with_raster.rasterized, 16)), + rf_tile_sum(with_raster.rasterized)) + expected_burned_in_cells = (cols - 2 * buf_cells) * (rows - 2 * buf_cells) + self.assertEqual(result.first()[0], float(expected_burned_in_cells)) + self.assertEqual(result.first()[1], 16. * expected_burned_in_cells) def test_reproject(self): reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) @@ -196,8 +220,7 @@ def test_general(self): .withColumn('expm1', rf_expm1(self.tileCol)) \ .withColumn('round', rf_round(self.tileCol)) \ .withColumn('abs', rf_abs(self.tileCol)) - # TODO: add test for rf_extent and rf_geometry once rastersource connector is integrated and we have - # a source of ProjectedRasterTiles. + df.first() def test_agg_mean(self): @@ -211,16 +234,6 @@ def test_prt_functions(self): .withColumn('geom', rf_geometry(self.tileCol)) df.show() - def test_rasterize(self): - # NB: This test just makes sure rf_rasterize runs, not that the results are correct. - withRaster = self.rf.withColumn('rasterized', rf_rasterize('geometry', 'geometry', lit(42), 10, 10)) - withRaster.first() - - def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) - reprojected.first() - - def test_aggregations(self): aggs = self.rf.agg( rf_agg_data_cells(self.tileCol), @@ -309,7 +322,6 @@ def test_mask_by_value(self): .collect()[0][0] self.assertTrue(result) - def test_resample(self): from pyspark.sql.functions import lit result = self.rf.select( @@ -452,7 +464,7 @@ class PandasInterop(TestEnvironment): def test_pandas_conversion(self): import pandas as pd - #pd.options.display.max_colwidth = 256 + # pd.options.display.max_colwidth = 256 cell_types = (ct for ct in rf_cell_types() if not (ct.is_raw() or ("bool" in ct.base_cell_type_name()))) tiles = [Tile(np.random.randn(5, 5) * 100, ct) for ct in cell_types] in_pandas = pd.DataFrame({ @@ -612,6 +624,7 @@ def test_raster_join(self): with self.assertRaises(AssertionError): self.rf.raster_join(rf_prime, join_exprs=self.rf.extent) + def suite(): function_tests = unittest.TestSuite() return function_tests From 9f7cf89e566908ed7f930d7027e628ee5d943c0b Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 31 May 2019 13:26:21 -0400 Subject: [PATCH 122/380] Add unit test for TileUDT implicit numpy type conversions Signed-off-by: Jason T. Brown --- .../python/tests/PyRasterFramesTests.py | 25 ++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 03b29c9bf..4e0e0136e 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -398,6 +398,12 @@ def test_cell_type_conversion(self): self.assertEqual(ct, CellType.from_numpy_dtype(ct.to_numpy_dtype()), "GTCellType comparison for " + str(ct)) + else: + ct_ud = ct.with_no_data_value(99) + self.assertEqual(ct_ud.base_cell_type_name(), + repr(CellType.from_numpy_dtype(ct_ud.to_numpy_dtype())), + "GTCellType comparison for " + str(ct_ud) + ) def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) @@ -440,12 +446,29 @@ def test_no_data_udf_handling(self): df = self.spark.createDataFrame([{"tile": t1}], schema) @udf(TileUDT()) - def increment(t: Tile): + def increment(t): return t + 1 r1 = df.select(increment(df.tile).alias("inc")).first()["inc"] self.assertEqual(r1, e1) + def test_udf_np_implicit_type_conversion(self): + import math + import pandas + + a1 = np.array([[1, 2], [0, 4]]) + t1 = Tile(a1, CellType.uint8()) + exp_array = a1 * math.pi + + @udf(TileUDT()) + def times_pi(t): + return t * math.pi + + df = self.spark.createDataFrame(pandas.DataFrame([{"tile": t1}])) + r1 = df.select(times_pi(df.tile)).first()[0] + self.assertTrue(np.all(r1.cells, exp_array)) + self.assertEqual(r1.cells.dtype, exp_array.dtype) + class TileOps(TestEnvironment): From 4fc6360d9cfe95123af31b9b55a563e3022d5bd5 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 31 May 2019 13:33:50 -0400 Subject: [PATCH 123/380] Regression fixes. --- .../extensions/RasterFrameMethods.scala | 24 +++++++++++++++++-- .../python/tests/PyRasterFramesTests.py | 2 +- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala index d37404e85..fd4b4f11d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala @@ -42,6 +42,7 @@ import org.locationtech.rasterframes.encoders.StandardEncoders._ import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ import com.typesafe.scalalogging.LazyLogging import org.locationtech.rasterframes.MetadataKeys +import org.locationtech.rasterframes.tiles.ShowableTile import scala.reflect.runtime.universe._ @@ -226,12 +227,31 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] */ def toTileLayerRDD(tileCol: Column): Either[TileLayerRDD[SpatialKey], TileLayerRDD[SpaceTimeKey]] = tileLayerMetadata.fold( - tlm ⇒ Left(ContextRDD(self.select(self.spatialKeyColumn, tileCol.as[Tile]).rdd, tlm)), + tlm ⇒ { + val rdd = self.select(self.spatialKeyColumn, tileCol.as[Tile]) + .rdd + .map { + // Wrapped tiles can break GeoTrellis Avro code. + case (sk, wrapped: ShowableTile) => (sk, wrapped.delegate) + case o => o + } + + Left(ContextRDD(rdd, tlm)) + }, tlm ⇒ { val rdd = self .select(self.spatialKeyColumn, self.temporalKeyColumn.get, tileCol.as[Tile]) .rdd - .map { case (sk, tk, v) ⇒ (SpaceTimeKey(sk, tk), v) } + .map { + case (sk, tk, v) ⇒ + val tile = v match { + // Wrapped tiles can break GeoTrellis Avro code. + case wrapped: ShowableTile => wrapped.delegate + case o => o + } + + (SpaceTimeKey(sk, tk), tile) + } Right(ContextRDD(rdd, tlm)) } ) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index e875636a4..e1634a0c5 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -428,7 +428,7 @@ def test_no_data_udf_handling(self): df = self.spark.createDataFrame([{"tile": t1}], schema) @udf(TileUDT()) - def increment(t: Tile): + def increment(t): return t + 1 r1 = df.select(increment(df.tile).alias("inc")).first()["inc"] From ffd4b4f600ec7bc85f61d906feb7dc16bf1db26f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 31 May 2019 14:21:51 -0400 Subject: [PATCH 124/380] Reconstituting python build rework. --- build.sbt | 16 ++- project/PIPBuildPlugin.scala | 101 +++++++++++++ project/RFProjectPlugin.scala | 9 +- project/plugins.sbt | 2 - pyrasterframes/build.sbt | 231 +----------------------------- pyrasterframes/python/MANIFEST.in | 4 + pyrasterframes/python/setup.cfg | 9 +- pyrasterframes/python/setup.py | 117 ++++++--------- 8 files changed, 170 insertions(+), 319 deletions(-) create mode 100644 project/PIPBuildPlugin.scala create mode 100644 pyrasterframes/python/MANIFEST.in diff --git a/build.sbt b/build.sbt index 90cf92780..a544d6f93 100644 --- a/build.sbt +++ b/build.sbt @@ -12,7 +12,6 @@ lazy val root = project lazy val `rf-notebook` = project .dependsOn(pyrasterframes) .enablePlugins(RFAssemblyPlugin, DockerPlugin) - .disablePlugins(SparkPackagePlugin) lazy val IntegrationTest = config("it") extend Test @@ -21,7 +20,6 @@ lazy val core = project .configs(IntegrationTest) .settings(inConfig(IntegrationTest)(Defaults.testSettings)) .settings(Defaults.itSettings) - .disablePlugins(SparkPackagePlugin) .settings( moduleName := "rasterframes", libraryDependencies ++= Seq( @@ -58,11 +56,18 @@ lazy val core = project lazy val pyrasterframes = project .dependsOn(core, datasource, experimental) - .enablePlugins(RFAssemblyPlugin) + .enablePlugins(RFAssemblyPlugin, PIPBuildPlugin) + .settings( + libraryDependencies ++= Seq( + geotrellis("s3").value, + spark("core").value , + spark("mllib").value, + spark("sql").value + ) + ) lazy val datasource = project .dependsOn(core % "test->test;compile->compile") - .disablePlugins(SparkPackagePlugin) .settings( moduleName := "rasterframes-datasource", libraryDependencies ++= Seq( @@ -83,7 +88,6 @@ lazy val experimental = project .settings(Defaults.itSettings) .dependsOn(core % "test->test;it->test;compile->compile") .dependsOn(datasource % "test->test;it->test;compile->compile") - .disablePlugins(SparkPackagePlugin) .settings( moduleName := "rasterframes-experimental", libraryDependencies ++= Seq( @@ -99,10 +103,8 @@ lazy val experimental = project lazy val docs = project .dependsOn(core, datasource) - .disablePlugins(SparkPackagePlugin) lazy val bench = project .dependsOn(core % "compile->test") - .disablePlugins(SparkPackagePlugin) .settings(publish / skip := true) diff --git a/project/PIPBuildPlugin.scala b/project/PIPBuildPlugin.scala new file mode 100644 index 000000000..c75693b52 --- /dev/null +++ b/project/PIPBuildPlugin.scala @@ -0,0 +1,101 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +import sbt.KeyRanks.ASetting +import sbt.Keys.{`package`, _} +import sbt._ +import complete.DefaultParsers._ +import scala.sys.process.Process +import sbtassembly.AssemblyPlugin.autoImport.assembly + +object PIPBuildPlugin extends AutoPlugin { + override def trigger: PluginTrigger = allRequirements + override def requires = RFAssemblyPlugin + + object autoImport { + val Python = config("python") + val pythonSource = settingKey[File]("Default Python source directory.").withRank(ASetting) + val pythonCommand = settingKey[String]("Python command. Defaults to 'python'") + val pySetup = inputKey[Int]("Run 'python setup.py '. Returns exit code.") + } + import autoImport._ + + val copyPySources = Def.task { + val s = streams.value + val src = (Compile / pythonSource).value + val dest = (Python / target).value + if (!dest.exists()) dest.mkdirs() + s.log(s"Copying '$src' to '$dest'") + IO.copyDirectory(src, dest) + dest + } + + val buildPyDist= Def.task { + val buildDir = (Python / target).value + val pyDist = (packageBin / artifactPath).value + val retcode = pySetup.toTask(" build sdist --formats=zip").value + if(retcode != 0) throw new RuntimeException(s"'python setup.py' returned $retcode") + val art = (Python / packageBin / artifact).value + val ver = version.value + IO.move(buildDir / "dist" / s"${art.name}-$ver.zip", pyDist) + pyDist + } + + override def projectConfigurations: Seq[Configuration] = Seq(Python) + + override def projectSettings = Seq( + assembly / test := {}, + pythonCommand := "python", + pySetup := { + val s = streams.value + val wd = copyPySources.value + val args = spaceDelimited("").parsed + val cmd = Seq(pythonCommand.value, "setup.py") ++ args + val ver = version.value + s.log.info(s"Running '${cmd.mkString(" ")}' in $wd") + Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! + }, + Compile / pythonSource := (Compile / sourceDirectory).value / "python", + Test / pythonSource := (Test / sourceDirectory).value / "python", + Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value + ) ++ + inConfig(Python)(Seq( + target := target.value / "python", + packageBin := Def.sequential( + Compile / packageBin, + buildPyDist + ).value, + packageBin / artifact := { + val java = (Compile / packageBin / artifact).value + java.withType("zip").withClassifier(Some("python")).withExtension("zip") + }, + packageBin / artifactPath := { + val dest = (Compile / packageBin / artifactPath).value.getParentFile + val art = (Python / packageBin / artifact).value + val ver = version.value + dest / s"${art.name}-python-$ver.zip" + }, + test := { + pySetup.toTask(" test").value + } + )) ++ + addArtifact(Python / packageBin / artifact, Python / packageBin) +} diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 288332730..b7c904416 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -11,13 +11,6 @@ object RFProjectPlugin extends AutoPlugin { override def trigger: PluginTrigger = allRequirements override def requires = GitPlugin - object autoImport { - val Python = config("python") - } - import autoImport._ - - override def projectConfigurations: Seq[Configuration] = Seq(Python) - override def projectSettings = Seq( organization := "org.locationtech.rasterframes", organizationName := "LocationTech RasterFrames", @@ -25,7 +18,7 @@ object RFProjectPlugin extends AutoPlugin { homepage := Some(url("http://rasterframes.io")), git.remoteRepo := "git@github.com:locationtech/rasterframes.git", scmInfo := Some(ScmInfo(url("https://github.com/locationtech/rasterframes"), "git@github.com:locationtech/rasterframes.git")), - description := "RasterFrames brings the power of Spark DataFrames to geospatial raster data, empowered by the map algebra and tile layer operations of GeoTrellis", + description := "RasterFrames brings the power of Spark DataFrames to geospatial raster data.", licenses += ("Apache-2.0", url("https://www.apache.org/licenses/LICENSE-2.0.html")), scalaVersion := "2.11.12", scalacOptions ++= Seq( diff --git a/project/plugins.sbt b/project/plugins.sbt index 783f50a06..fa474439a 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -1,6 +1,5 @@ logLevel := sbt.Level.Error -resolvers += Resolver.bintrayIvyRepo("s22s", "sbt-plugins") addSbtCoursier addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0") @@ -12,7 +11,6 @@ addSbtPlugin("com.lightbend.paradox" % "sbt-paradox" % "0.5.0") addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.4") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.1") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") -addSbtPlugin("org.spark-packages" % "sbt-spark-package" % "0.2.7-astraea.1") addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.1") addSbtPlugin("net.vonbuchholtz" % "sbt-dependency-check" % "0.2.10") addSbtPlugin("com.github.gseitz" %% "sbt-release" % "1.0.9") diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 9648b7a22..4d78e61fc 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,229 +1,2 @@ -import scala.sys.process.Process -import sbt.Keys.`package` -import sbt.Tests.Summary - -enablePlugins(SparkPackagePlugin, AssemblyPlugin) - -lazy val assemblyHasGeoTrellis = settingKey[Boolean]("If false, GeoTrellis libraries are excluded from assembly.") -assemblyHasGeoTrellis := true - -assembly / assemblyExcludedJars ++= { - val cp = (fullClasspath in assembly).value - val gt = assemblyHasGeoTrellis.value - if(gt) Seq.empty - else cp.filter(_.data.getName.contains("geotrellis")) -} - -assembly / test := {} - -//-------------------------------------------------------------------- -// Spark Packages Plugin -//-------------------------------------------------------------------- - -spName := "io.astraea/pyrasterframes" -sparkVersion := rfSparkVersion.value -sparkComponents ++= Seq("sql", "mllib") -spAppendScalaVersion := false -spIncludeMaven := false -spIgnoreProvided := true -spShade := true -spPackage := { - val dist = spDist.value - val extracted = IO.unzip(dist, (target in spPackage).value, GlobFilter("*.jar")) - if(extracted.size != 1) sys.error("Didn't expect to find multiple .jar files in distribution.") - extracted.head -} -spShortDescription := description.value -spHomepage := homepage.value.get.toString -spDescription := """ - |RasterFrames brings the power of Spark DataFrames to geospatial raster data, - |empowered by the map algebra and tile layer operations of GeoTrellis. - | - |The underlying purpose of RasterFrames is to allow data scientists and software - |developers to process and analyze geospatial-temporal raster data with the - |same flexibility and ease as any other Spark Catalyst data type. At its core - |is a user-defined type (UDT) called TileUDT, which encodes a GeoTrellis Tile - |in a form the Spark Catalyst engine can process. Furthermore, we extend the - |definition of a DataFrame to encompass some additional invariants, allowing - |for geospatial operations within and between RasterFrames to occur, while - |still maintaining necessary geo-referencing constructs. - """.stripMargin - -spPublishLocal := { - // This unfortunate override is necessary because - // the ivy resolver in pyspark defaults to the cache more - // frequently than we'd like. - val id = (projectID in spPublishLocal).value - val home = ivyPaths.value.ivyHome - .getOrElse(io.Path.userHome / ".ivy2") - val cacheDir = home / "cache" / id.organization / id.name - IO.delete(cacheDir) - spPublishLocal.value -} - -//-------------------------------------------------------------------- -// Python Build -//-------------------------------------------------------------------- - -lazy val pythonSource = settingKey[File]("Default Python source directory.") -pythonSource := baseDirectory.value / "python" - -def sparkFiles(dir: File):Seq[File] = Seq("metastore_db", - "spark-warehouse", - "derby.log").map(f => dir / f) - -cleanFiles ++= - sparkFiles(baseDirectory.value) ++ - sparkFiles(pythonSource.value) ++ - Seq( - ".eggs", - ".pytest_cache", - "build", - "dist", - "pyrasterframes.egg-info" - ).map(f => pythonSource.value / f) - -Python / target := target.value / "python-dist" - -lazy val pyZip = taskKey[File]("Build pyrasterframes zip.") - -// Alias -pyZip := (Python / packageBin).value - -Python / packageBin / artifact := { - val java = (Compile / packageBin / artifact).value - java.withType("zip").withClassifier(Some("python")).withExtension("zip") -} - -Python / packageBin / artifactPath := { - val dir = (Python / target).value - val art = (Python / packageBin / artifact).value - val ver = version.value - dir / s"${art.name}-python-$ver.zip" -} - -addArtifact(Python / packageBin / artifact, Python / packageBin) - -val pysparkCmd = taskKey[Unit]("Builds pyspark package and emits command string for running pyspark with package") - -lazy val pyTest = taskKey[Int]("Run pyrasterframes tests. Return result code.") - -lazy val pyTestQuick = taskKey[Int]("Run pyrasterframes tests, skipping build and assembly. Return result code.") - -lazy val pyExamples = taskKey[Unit]("Run pyrasterframes examples.") - -lazy val pyWheel = taskKey[Unit]("Creates a Python .whl file") - -lazy val spJarFile = Def.taskDyn { - if (spShade.value) { - Def.task((assembly in spPackage).value) - } else { - Def.task(spPackage.value) - } -} - -def gatherFromDir(root: sbt.File, dirName: String) = { - val pyDir = root / dirName - IO.listFiles(pyDir, GlobFilter("*.py") | GlobFilter("*.rst")) - .map(f => (f, s"$dirName/${f.getName}")) -} - -Python / packageBin := { - val jar = (`package` in Compile).value - val root = pythonSource.value - val license = root / "LICENSE.md" - val files = gatherFromDir(root, "pyrasterframes") ++ - gatherFromDir(root, "geomesa_pyspark") ++ - Seq(jar, license).map(f => (f, "pyrasterframes/" + f.getName)) - val zipFile = (Python / packageBin / artifactPath).value - IO.zip(files, zipFile) - zipFile -} - -pysparkCmd := { - val pyBin = (Python / packageBin).value - val jarBin = (spPackage / assembly).value - - val args = "pyspark" :: "--jars" :: jarBin :: "--py-files" :: pyBin :: Nil - streams.value.log.info("PySpark Command:\n" + args.mkString(" ")) -} - -ivyPaths in pysparkCmd := ivyPaths.value.withIvyHome(target.value / "ivy") - -pyTest := { - val _ = assembly.value - val s = streams.value - s.log.info("Running python tests...") - val wd = pythonSource.value - Process("python setup.py test", wd).! -} - -pyTestQuick := { - val s = streams.value - s.log.info("Running python tests...") - val wd = pythonSource.value - Process("python setup.py test", wd).! -} - -Test / executeTests := { - val standard = (Test / executeTests).value - standard.overall match { - case TestResult.Passed ⇒ - val resultCode = pyTest.value - val msg = resultCode match { - case 1 ⇒ "There are Python test failures." - case 2 ⇒ "Python test execution was interrupted." - case 3 ⇒ "Internal error during Python test execution." - case 4 ⇒ "PyTest usage error." - case 5 ⇒ "No Python tests found." - case x if (x != 0) ⇒ "Unknown error while running Python tests." - case _ ⇒ "PyRasterFrames tests successfully completed." - } - val pySummary = Summary("pyrasterframes", msg) - val summaries = standard.summaries ++ Iterable(pySummary) - // Would be cool to derive this from the python output... - val result = if(resultCode == 0) { - new SuiteResult( - TestResult.Passed, - passedCount = 1, - failureCount = 0, - errorCount = 0, - skippedCount = 0, - ignoredCount = 0, - canceledCount = 0, - pendingCount = 0 - ) - } - else { - new SuiteResult( - TestResult.Failed, - passedCount = 0, - failureCount = 1, - errorCount = 0, - skippedCount = 0, - ignoredCount = 0, - canceledCount = 0, - pendingCount = 0 - ) - } - standard.copy(overall = result.result, summaries = summaries, events = standard.events + ("PyRasterFramesTests" -> result)) - case _ ⇒ - val pySummary = Summary("pyrasterframes", "tests skipped due to scalatest failures") - standard.copy(summaries = standard.summaries ++ Iterable(pySummary)) - } -} - -pyWheel := { - val s = streams.value - val wd = pythonSource.value - Process("python setup.py bdist_wheel", wd) ! s.log - val whl = IO.listFiles(pythonSource.value / "dist", GlobFilter("*.whl"))(0) - IO.move(whl, (Python / target).value / whl.getName) -} - -pyExamples := { - val _ = spPublishLocal.value - val s = streams.value - val wd = pythonSource.value - Process("python setup.py examples", wd) ! s.log -} +Compile / pythonSource := baseDirectory.value / "python" +Test / pythonSource := baseDirectory.value / "python" / "tests" \ No newline at end of file diff --git a/pyrasterframes/python/MANIFEST.in b/pyrasterframes/python/MANIFEST.in new file mode 100644 index 000000000..cf48af02c --- /dev/null +++ b/pyrasterframes/python/MANIFEST.in @@ -0,0 +1,4 @@ +include LICENSE.txt +include README.rst +recursive-include pyrasterframes *.jar +exclude *.in diff --git a/pyrasterframes/python/setup.cfg b/pyrasterframes/python/setup.cfg index d8fb59953..ffdc900ea 100644 --- a/pyrasterframes/python/setup.cfg +++ b/pyrasterframes/python/setup.cfg @@ -1,8 +1,13 @@ +[metadata] +license_files = LICENSE.txt + +[bdist_wheel] +universal=1 [aliases] test=pytest [tool:pytest] addopts = --verbose -testpaths = tests -python_files = *.py \ No newline at end of file +testpaths = src/test/python +python_files = *.py diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index e3f5fd107..faf6743df 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -1,23 +1,22 @@ -""" -The operations in this file are designed for development and testing only. -""" - +# Always prefer setuptools over distutils from setuptools import setup, find_packages -import distutils.log +from os import path, environ +from io import open +from pathlib import Path +import distutils.cmd import importlib -from os import environ +here = path.abspath(path.dirname(__file__)) -def _extract_module(mod): - module = importlib.import_module(mod) +# Get the long description from the README file +with open(path.join(here, 'README.rst'), encoding='utf-8') as f: + readme = f.read() - if hasattr(module, '__all__'): - globals().update({n: getattr(module, n) for n in module.__all__}) - else: - globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) +with open(path.join(here, 'requirements.txt')) as f: + requirements = f.read().splitlines() -class ExampleCommand(distutils.cmd.Command): +class RunExamples(distutils.cmd.Command): """A custom command to run pyrasterframes examples.""" description = 'run pyrasterframes examples' @@ -26,15 +25,22 @@ class ExampleCommand(distutils.cmd.Command): ('examples=', 'e', 'examples to run'), ] + @staticmethod + def _extract_module(mod): + module = importlib.import_module(mod) + + if hasattr(module, '__all__'): + globals().update({n: getattr(module, n) for n in module.__all__}) + else: + globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) + def initialize_options(self): - from pathlib import Path """Set default values for options.""" # Each user option must be listed here with their default value. self.examples = filter(lambda x: not x.name.startswith('_'), list(Path('./examples').resolve().glob('*.py'))) def _check_ex_path(self, ex): - from pathlib import Path file = Path(ex) if not file.suffix: file = file.with_suffix('.py') @@ -57,73 +63,45 @@ def run(self): for ex in self.examples: print(('-' * 50) + '\nRunning %s' % ex + '\n' + ('-' * 50)) try: - _extract_module(ex) + self._extract_module(ex) except Exception: print(('-' * 50) + '\n%s Failed:' % ex + '\n' + ('-' * 50)) print(traceback.format_exc()) -class ZipCommand(distutils.cmd.Command): - """A custom command to create a minimal zip distribution.""" - - description = 'create a minimal pyrasterframes source zip file' - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - """Create the zip.""" - import zipfile - from pathlib import Path - import os - zfile = 'pyrasterframes.zip' - - if os.path.isfile(zfile): - os.remove(zfile) - with zipfile.ZipFile(zfile, 'w') as przip: - przip.write('pyrasterframes') - # Bring in source files and readme - patterns = ['*.py', '*.rst', '*.jar'] - root = Path('.').resolve() - for pattern in patterns: - for file in list(root.glob('pyrasterframes/' + pattern)): - przip.write(str(file.relative_to(root))) - # Put a copy of the license in the zip - przip.write('LICENSE.md', 'pyrasterframes/LICENSE.md') - - -with open('README.rst') as f: - readme = f.read() - -with open('requirements.txt') as f: - requirements = f.read().splitlines() - -setup_args = dict( +setup( name='pyrasterframes', - description='Python bindings for RasterFrames', + description='RasterFrames for PySpark', long_description=readme, + long_description_content_type='text/x-rst', version=environ.get('RASTERFRAMES_VERSION', 'SNAPSHOT'), - url='http://rasterframes.io', author='Astraea, Inc.', - author_email='info@astraea.io', + author_email='info@astraea.earth', license='Apache 2', - setup_requires=['pytest-runner', 'pathlib'], + url='https://rasterframes.io', + project_urls={ + 'Bug Reports': 'https://github.com/locationtech/rasterframes/issues', + 'Source': 'https://github.com/locationtech/rasterframes', + }, + setup_requires=[ + 'pytest-runner', + 'setuptools >= 0.8', + 'pathlib2' + ], install_requires=requirements, tests_require=[ 'pytest==3.4.2', - 'pypandoc' + 'pypandoc', + 'numpy>=1.7', + 'pandas', + ], + packages=[ + 'pyrasterframes', + 'geomesa_pyspark' ], - test_suite="pytest-runner", - packages=find_packages(exclude=['tests', 'examples']), include_package_data=True, - package_data={'.': ['LICENSE.md'], 'pyrasterframes': ['*.jar']}, - exclude_package_data={'.': ['setup.*', 'README.*']}, classifiers=[ - 'Development Status :: 3 - Alpha', + 'Development Status :: 4 - Beta', 'Environment :: Other Environment', 'License :: OSI Approved :: Apache Software License', 'Natural Language :: English', @@ -132,14 +110,11 @@ def run(self): 'Topic :: Software Development :: Libraries' ], zip_safe=False, + test_suite="pytest-runner", cmdclass={ - 'examples': ExampleCommand, - 'minzip': ZipCommand + 'examples': RunExamples } # entry_points={ # "console_scripts": ['pyrasterframes=pyrasterframes:console'] # } ) - -if __name__ == "__main__": - setup(**setup_args) From 1212c3f6ea6164864774b9e62af0013580e610d3 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 31 May 2019 15:48:07 -0400 Subject: [PATCH 125/380] `pyrasterframes/test` now works with new python build configuration. --- build.sbt | 6 ++--- project/PIPBuildPlugin.scala | 13 +++++++--- pyrasterframes/python/setup.cfg | 2 +- .../python/tests/PyRasterFramesTests.py | 25 +++++++++++-------- 4 files changed, 28 insertions(+), 18 deletions(-) diff --git a/build.sbt b/build.sbt index a544d6f93..3015085b0 100644 --- a/build.sbt +++ b/build.sbt @@ -60,9 +60,9 @@ lazy val pyrasterframes = project .settings( libraryDependencies ++= Seq( geotrellis("s3").value, - spark("core").value , - spark("mllib").value, - spark("sql").value + spark("core").value % Provided, + spark("mllib").value % Provided, + spark("sql").value % Provided ) ) diff --git a/project/PIPBuildPlugin.scala b/project/PIPBuildPlugin.scala index c75693b52..84a2db3d2 100644 --- a/project/PIPBuildPlugin.scala +++ b/project/PIPBuildPlugin.scala @@ -75,7 +75,11 @@ object PIPBuildPlugin extends AutoPlugin { }, Compile / pythonSource := (Compile / sourceDirectory).value / "python", Test / pythonSource := (Test / sourceDirectory).value / "python", - Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value + Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value, + Test / test := Def.sequential( + Test / test, + Python / test + ).value ) ++ inConfig(Python)(Seq( target := target.value / "python", @@ -93,9 +97,10 @@ object PIPBuildPlugin extends AutoPlugin { val ver = version.value dest / s"${art.name}-python-$ver.zip" }, - test := { - pySetup.toTask(" test").value - } + test := Def.sequential( + assembly, + pySetup.toTask(" test") + ).value )) ++ addArtifact(Python / packageBin / artifact, Python / packageBin) } diff --git a/pyrasterframes/python/setup.cfg b/pyrasterframes/python/setup.cfg index ffdc900ea..8088676c6 100644 --- a/pyrasterframes/python/setup.cfg +++ b/pyrasterframes/python/setup.cfg @@ -9,5 +9,5 @@ test=pytest [tool:pytest] addopts = --verbose -testpaths = src/test/python +testpaths = tests python_files = *.py diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index e1634a0c5..8d0a13322 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -1,14 +1,12 @@ from pyspark.sql import SparkSession, Column, SQLContext from pyspark.sql.functions import * -from pyspark.sql.types import * - -from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyrasterframes.rf_types import * from geomesa_pyspark.types import * -from pathlib import Path import unittest import numpy as np +import os +import glob # version-conditional imports import sys @@ -18,6 +16,7 @@ else: import __builtin__ as builtins +HERE = os.path.dirname(os.path.realpath(__file__)) class TestEnvironment(unittest.TestCase): """ @@ -31,23 +30,29 @@ def rounded_compare(self, val1, val2): @classmethod def setUpClass(cls): # gather Scala requirements - jarpath = list(Path('../target/scala-2.11').resolve().glob('pyrasterframes-assembly*.jar'))[0] + + jarpath = glob.glob(os.path.join(HERE, '..', '..', 'scala-2.11', 'pyrasterframes-assembly*.jar')) + + if not len(jarpath) == 1: + raise RuntimeError("Expected to find exactly one assembly. Found: ", jarpath) # hard-coded relative path for resources - cls.resource_dir = Path('./static').resolve() + cls.resource_dir = os.path.realpath(os.path.join(HERE, '..', 'static')) # spark session with RF cls.spark = (SparkSession.builder - .config('spark.driver.extraClassPath', jarpath) - .config('spark.executor.extraClassPath', jarpath) + .config('spark.driver.extraClassPath', jarpath[0]) + .config('spark.executor.extraClassPath', jarpath[0]) .withKryoSerialization() .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') + + print(cls.spark.sparkContext._conf.getAll()) + print("Spark Version: " + cls.spark.version) cls.spark.withRasterFrames() - cls.img_uri = cls.resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri() - + cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') # load something into a rasterframe rf = cls.spark.read.geotiff(cls.img_uri) \ From 0048ffe4a9fb386df7381eeb929c3325f72131fc Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 31 May 2019 16:22:30 -0400 Subject: [PATCH 126/380] Moved test resources to canonical sbt/maven location. Worked (but failed) trying to get `examples` to work again. --- build.sbt | 2 +- ...ldPlugin.scala => PythonBuildPlugin.scala} | 2 +- pyrasterframes/build.sbt | 4 +- pyrasterframes/python/examples/__init__.py | 25 +++++--- pyrasterframes/python/setup.py | 33 +++++----- .../python/tests/PyRasterFramesTests.py | 60 +++++++++--------- .../test/resources}/L8-B1-Elkton-VA.tiff | Bin .../test/resources}/L8-B10-Elkton-VA.tiff | Bin .../test/resources}/L8-B11-Elkton-VA.tiff | Bin .../test/resources}/L8-B2-Elkton-VA.tiff | Bin .../test/resources}/L8-B3-Elkton-VA.tiff | Bin .../test/resources}/L8-B4-Elkton-VA.tiff | Bin .../test/resources}/L8-B5-Elkton-VA.tiff | Bin .../test/resources}/L8-B6-Elkton-VA.tiff | Bin .../test/resources}/L8-B7-Elkton-VA.tiff | Bin .../test/resources}/L8-B8-Elkton-VA.tiff | Bin .../test/resources}/L8-B8-Robinson-IL.tiff | Bin .../test/resources}/L8-B9-Elkton-VA.tiff | Bin 18 files changed, 68 insertions(+), 58 deletions(-) rename project/{PIPBuildPlugin.scala => PythonBuildPlugin.scala} (98%) rename pyrasterframes/{python/static => src/test/resources}/L8-B1-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B10-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B11-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B2-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B3-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B4-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B5-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B6-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B7-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B8-Elkton-VA.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B8-Robinson-IL.tiff (100%) rename pyrasterframes/{python/static => src/test/resources}/L8-B9-Elkton-VA.tiff (100%) diff --git a/build.sbt b/build.sbt index 3015085b0..e322a6591 100644 --- a/build.sbt +++ b/build.sbt @@ -56,7 +56,7 @@ lazy val core = project lazy val pyrasterframes = project .dependsOn(core, datasource, experimental) - .enablePlugins(RFAssemblyPlugin, PIPBuildPlugin) + .enablePlugins(RFAssemblyPlugin, PythonBuildPlugin) .settings( libraryDependencies ++= Seq( geotrellis("s3").value, diff --git a/project/PIPBuildPlugin.scala b/project/PythonBuildPlugin.scala similarity index 98% rename from project/PIPBuildPlugin.scala rename to project/PythonBuildPlugin.scala index 84a2db3d2..7a409b233 100644 --- a/project/PIPBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -26,7 +26,7 @@ import complete.DefaultParsers._ import scala.sys.process.Process import sbtassembly.AssemblyPlugin.autoImport.assembly -object PIPBuildPlugin extends AutoPlugin { +object PythonBuildPlugin extends AutoPlugin { override def trigger: PluginTrigger = allRequirements override def requires = RFAssemblyPlugin diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 4d78e61fc..6810e01fa 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,2 +1,4 @@ Compile / pythonSource := baseDirectory.value / "python" -Test / pythonSource := baseDirectory.value / "python" / "tests" \ No newline at end of file +Test / pythonSource := baseDirectory.value / "python" / "tests" + +addCommandAlias("pyExamples", "pySetup examples") \ No newline at end of file diff --git a/pyrasterframes/python/examples/__init__.py b/pyrasterframes/python/examples/__init__.py index 8bbea6d4f..c7d2a9fa8 100644 --- a/pyrasterframes/python/examples/__init__.py +++ b/pyrasterframes/python/examples/__init__.py @@ -1,15 +1,24 @@ # examples_setup -from pathlib import Path +import os +import glob from pyspark.sql import SparkSession __all__ = ["resource_dir", "example_session"] -jarpath = list(Path('../target').resolve().glob('**/pyrasterframes*.jar')) -if len(jarpath) > 0: - pyJar = jarpath[0].as_uri() +HERE = os.path.dirname(os.path.realpath(__file__)) - def example_session(): - return (SparkSession.builder +scala_target = os.path.realpath(os.path.join(HERE, '..', '..', 'scala-2.11')) +resource_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) +jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) + +if not len(jarpath) == 1: + raise RuntimeError("Expected to find exactly one assembly. Found: ", jarpath) + +pyJar = jarpath[0] + + +def example_session(): + return (SparkSession.builder .master("local[*]") .appName("RasterFrames") .config('spark.driver.extraClassPath', pyJar) @@ -18,7 +27,3 @@ def example_session(): .withKryoSerialization() .getOrCreate()) - -# hard-coded relative path for resources -resource_dir = Path('./static').resolve() -# examples_setup diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index faf6743df..0c4905b8a 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -16,6 +16,15 @@ requirements = f.read().splitlines() +def _extract_module(mod): + module = importlib.import_module(mod) + + if hasattr(module, '__all__'): + globals().update({n: getattr(module, n) for n in module.__all__}) + else: + globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) + + class RunExamples(distutils.cmd.Command): """A custom command to run pyrasterframes examples.""" @@ -26,21 +35,7 @@ class RunExamples(distutils.cmd.Command): ] @staticmethod - def _extract_module(mod): - module = importlib.import_module(mod) - - if hasattr(module, '__all__'): - globals().update({n: getattr(module, n) for n in module.__all__}) - else: - globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) - - def initialize_options(self): - """Set default values for options.""" - # Each user option must be listed here with their default value. - self.examples = filter(lambda x: not x.name.startswith('_'), - list(Path('./examples').resolve().glob('*.py'))) - - def _check_ex_path(self, ex): + def _check_ex_path(ex): file = Path(ex) if not file.suffix: file = file.with_suffix('.py') @@ -49,6 +44,12 @@ def _check_ex_path(self, ex): assert file.is_file(), ('Invalid example %s' % file) return file + def initialize_options(self): + """Set default values for options.""" + # Each user option must be listed here with their default value. + self.examples = filter(lambda x: not x.name.startswith('_'), + list(Path('./examples').resolve().glob('*.py'))) + def finalize_options(self): """Post-process options.""" import re @@ -63,7 +64,7 @@ def run(self): for ex in self.examples: print(('-' * 50) + '\nRunning %s' % ex + '\n' + ('-' * 50)) try: - self._extract_module(ex) + _extract_module(ex) except Exception: print(('-' * 50) + '\n%s Failed:' % ex + '\n' + ('-' * 50)) print(traceback.format_exc()) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 8d0a13322..6fd2c0f3e 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -31,13 +31,15 @@ def rounded_compare(self, val1, val2): def setUpClass(cls): # gather Scala requirements - jarpath = glob.glob(os.path.join(HERE, '..', '..', 'scala-2.11', 'pyrasterframes-assembly*.jar')) + scala_target = os.path.realpath(os.path.join(HERE, '..', '..', 'scala-2.11')) + + jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) if not len(jarpath) == 1: raise RuntimeError("Expected to find exactly one assembly. Found: ", jarpath) # hard-coded relative path for resources - cls.resource_dir = os.path.realpath(os.path.join(HERE, '..', 'static')) + cls.resource_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) # spark session with RF cls.spark = (SparkSession.builder @@ -47,9 +49,9 @@ def setUpClass(cls): .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') + print("Spark Version: " + cls.spark.version) print(cls.spark.sparkContext._conf.getAll()) - print("Spark Version: " + cls.spark.version) cls.spark.withRasterFrames() cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') @@ -522,6 +524,32 @@ def test_setup(self): self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") + def test_raster_join(self): + # re-read the same source + rf_prime = self.spark.read.geotiff(self.img_uri) \ + .withColumnRenamed('tile', 'tile2').alias('rf_prime') + + rf_joined = self.rf.raster_join(rf_prime) + + self.assertTrue(rf_joined.count(), self.rf.count()) + self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) + + rf_joined_2 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, rf_prime.extent, rf_prime.crs) + self.assertTrue(rf_joined_2.count(), self.rf.count()) + self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) + + # this will bring arbitrary additional data into join; garbage result + join_expression = self.rf.extent.xmin == rf_prime.extent.xmin + rf_joined_3 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, + rf_prime.extent, rf_prime.crs, + join_expression) + self.assertTrue(rf_joined_3.count(), self.rf.count()) + self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) + + # throws if you don't pass in all expected columns + with self.assertRaises(AssertionError): + self.rf.raster_join(rf_prime, join_exprs=self.rf.extent) + def test_raster_source_reader(self): import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run @@ -591,35 +619,9 @@ def path(scene, band): b1_paths = [s.format('1') for s in scene_dict.values()] self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) - def test_raster_join(self): - # re-read the same source - rf_prime = self.spark.read.geotiff(self.img_uri) \ - .withColumnRenamed('tile', 'tile2').alias('rf_prime') - - rf_joined = self.rf.raster_join(rf_prime) - - self.assertTrue(rf_joined.count(), self.rf.count()) - self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) - - rf_joined_2 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, rf_prime.extent, rf_prime.crs) - self.assertTrue(rf_joined_2.count(), self.rf.count()) - self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) - - # this will bring arbitrary additional data into join; garbage result - join_expression = self.rf.extent.xmin == rf_prime.extent.xmin - rf_joined_3 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, - rf_prime.extent, rf_prime.crs, - join_expression) - self.assertTrue(rf_joined_3.count(), self.rf.count()) - self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) - - # throws if you don't pass in all expected columns - with self.assertRaises(AssertionError): - self.rf.raster_join(rf_prime, join_exprs=self.rf.extent) def suite(): function_tests = unittest.TestSuite() return function_tests - unittest.TextTestRunner().run(suite()) diff --git a/pyrasterframes/python/static/L8-B1-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B1-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B1-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B1-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B10-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B10-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B10-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B10-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B11-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B11-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B11-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B11-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B2-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B2-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B2-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B2-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B3-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B3-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B3-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B3-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B4-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B4-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B4-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B4-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B5-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B5-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B5-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B5-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B6-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B6-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B6-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B6-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B7-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B7-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B7-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B7-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B8-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B8-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B8-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B8-Elkton-VA.tiff diff --git a/pyrasterframes/python/static/L8-B8-Robinson-IL.tiff b/pyrasterframes/src/test/resources/L8-B8-Robinson-IL.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B8-Robinson-IL.tiff rename to pyrasterframes/src/test/resources/L8-B8-Robinson-IL.tiff diff --git a/pyrasterframes/python/static/L8-B9-Elkton-VA.tiff b/pyrasterframes/src/test/resources/L8-B9-Elkton-VA.tiff similarity index 100% rename from pyrasterframes/python/static/L8-B9-Elkton-VA.tiff rename to pyrasterframes/src/test/resources/L8-B9-Elkton-VA.tiff From 785cc0dddf6e6d324fc47ce06fc9da2650497560 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sat, 1 Jun 2019 20:57:48 -0400 Subject: [PATCH 127/380] Misc PR feedback tweaks. --- .../extensions/DataFrameMethods.scala | 1 - .../python/pyrasterframes/rf_types.py | 4 +- .../python/tests/PyRasterFramesTests.py | 71 ++++++++++--------- 3 files changed, 39 insertions(+), 37 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index d7f4af39e..599beb637 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -29,7 +29,6 @@ import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} import geotrellis.util.MethodExtensions import org.apache.spark.sql.catalyst.expressions.Attribute -import org.apache.spark.sql.functions._ import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} import spray.json.JsonFormat diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 91fdb66dd..98fd10023 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -130,7 +130,9 @@ def scalaUDT(cls): return 'org.apache.spark.sql.rf.RasterSourceUDT' def serialize(self, obj): - # Not yet implemented. Kryo serialized bytes? + # RasterSource is opaque in the Python context. + # Any thing passed in by a UDF return value couldn't be validated. + # Therefore obj is dropped None is passed to Catalyst. return None def deserialize(self, datum): diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 4e0e0136e..3febaca46 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -227,13 +227,6 @@ def test_agg_mean(self): mean = self.rf.agg(rf_agg_mean(self.tileCol)).first()['rf_agg_mean(tile)'] self.assertTrue(self.rounded_compare(mean, 10160)) - def test_prt_functions(self): - df = self.spark.read.rastersource(self.img_uri) \ - .withColumn('crs', rf_crs(self.tileCol)) \ - .withColumn('ext', rf_extent(self.tileCol)) \ - .withColumn('geom', rf_geometry(self.tileCol)) - df.show() - def test_aggregations(self): aggs = self.rf.agg( rf_agg_data_cells(self.tileCol), @@ -543,7 +536,35 @@ def test_extended_pandas_ops(self): self.assertIsInstance(array_back_2, Tile) np.testing.assert_equal(array_back_2.cells, simple_array.cells) - np.int8 + +class RasterJoin(TestEnvironment): + + def test_raster_join(self): + # re-read the same source + rf_prime = self.spark.read.geotiff(self.img_uri) \ + .withColumnRenamed('tile', 'tile2').alias('rf_prime') + + rf_joined = self.rf.raster_join(rf_prime) + + self.assertTrue(rf_joined.count(), self.rf.count()) + self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) + + rf_joined_2 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, rf_prime.extent, rf_prime.crs) + self.assertTrue(rf_joined_2.count(), self.rf.count()) + self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) + + # this will bring arbitrary additional data into join; garbage result + join_expression = self.rf.extent.xmin == rf_prime.extent.xmin + rf_joined_3 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, + rf_prime.extent, rf_prime.crs, + join_expression) + self.assertTrue(rf_joined_3.count(), self.rf.count()) + self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) + + # throws if you don't pass in all expected columns + with self.assertRaises(AssertionError): + self.rf.raster_join(rf_prime, join_exprs=self.rf.extent) + class RasterSource(TestEnvironment): @@ -552,6 +573,13 @@ def test_setup(self): self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") + def test_prt_functions(self): + df = self.spark.read.rastersource(self.img_uri) \ + .withColumn('crs', rf_crs(self.tileCol)) \ + .withColumn('ext', rf_extent(self.tileCol)) \ + .withColumn('geom', rf_geometry(self.tileCol)) + df.first() + def test_raster_source_reader(self): import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run @@ -621,33 +649,6 @@ def path(scene, band): b1_paths = [s.format('1') for s in scene_dict.values()] self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) - def test_raster_join(self): - # re-read the same source - rf_prime = self.spark.read.geotiff(self.img_uri) \ - .withColumnRenamed('tile', 'tile2').alias('rf_prime') - - rf_joined = self.rf.raster_join(rf_prime) - - self.assertTrue(rf_joined.count(), self.rf.count()) - self.assertTrue(len(rf_joined.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) - - rf_joined_2 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, rf_prime.extent, rf_prime.crs) - self.assertTrue(rf_joined_2.count(), self.rf.count()) - self.assertTrue(len(rf_joined_2.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) - - # this will bring arbitrary additional data into join; garbage result - join_expression = self.rf.extent.xmin == rf_prime.extent.xmin - rf_joined_3 = self.rf.raster_join(rf_prime, self.rf.extent, self.rf.crs, - rf_prime.extent, rf_prime.crs, - join_expression) - self.assertTrue(rf_joined_3.count(), self.rf.count()) - self.assertTrue(len(rf_joined_3.columns) == len(self.rf.columns) + len(rf_prime.columns) - 2) - - # throws if you don't pass in all expected columns - with self.assertRaises(AssertionError): - self.rf.raster_join(rf_prime, join_exprs=self.rf.extent) - - def suite(): function_tests = unittest.TestSuite() return function_tests From 61ea1f06b8021ab0a90c03dd0aa17e11b77662e7 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sat, 1 Jun 2019 21:10:25 -0400 Subject: [PATCH 128/380] Test tweak due to RasterRefs not getting resolved before collect. --- pyrasterframes/python/tests/PyRasterFramesTests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 3febaca46..8c6b903f6 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -578,7 +578,7 @@ def test_prt_functions(self): .withColumn('crs', rf_crs(self.tileCol)) \ .withColumn('ext', rf_extent(self.tileCol)) \ .withColumn('geom', rf_geometry(self.tileCol)) - df.first() + df.select('crs', 'ext', 'geom').first() def test_raster_source_reader(self): import pandas as pd From 28625516de369315a139b4b23460d9aef88837e4 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 3 Jun 2019 10:24:50 -0400 Subject: [PATCH 129/380] Built in Tile __add__ etc follows numpy dtype conversions Signed-off-by: Jason T. Brown --- .../python/pyrasterframes/__init__.py | 1 + .../python/pyrasterframes/rf_types.py | 26 ++++++++++++++++--- .../python/tests/PyRasterFramesTests.py | 21 ++++++++++++--- 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index cd994a89c..bc3d12b33 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -13,6 +13,7 @@ from . import rasterfunctions from .context import RFContext + __all__ = ['RasterFrame', 'TileExploder'] diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 98fd10023..f0f946a01 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -280,20 +280,36 @@ def __add__(self, right): other = right.cells else: other = right - return Tile(np.add(self.cells, other), self.cell_type) + + _sum = np.add(self.cells, other) + ct = CellType.from_numpy_dtype(_sum.dtype) + if isinstance(_sum, np.ma.MaskedArray): + ct = ct.with_no_data_value(_sum.fill_value) + + return Tile(_sum, ct) def __sub__(self, right): if isinstance(right, Tile): other = right.cells else: other = right - return Tile(np.subtract(self.cells, other), self.cell_type) + _diff = np.subtract(self.cells, other) + ct = CellType.from_numpy_dtype(_diff.dtype) + if isinstance(_diff, np.ma.MaskedArray): + ct = ct.with_no_data_value(_diff.fill_value) + + return Tile(_diff, ct) def __mul__(self, right): if isinstance(right, Tile): other = right.cells else: other = right + prod = np.multiply(self.cells, other) + ct = CellType.from_numpy_dtype(prod.dtype) + if isinstance(prod, np.ma.MaskedArray): + ct = ct.with_no_data_value(prod.fill_value) + return Tile(np.multiply(self.cells, other), self.cell_type) def __truediv__(self, right): @@ -301,7 +317,11 @@ def __truediv__(self, right): other = right.cells else: other = right - return Tile(np.true_divide(self.cells, other), self.cell_type) + quot = np.true_divide(self.cells, other) + ct = CellType.from_numpy_dtype(quot.dtype) + if isinstance(quot, np.ma.MaskedArray): + ct = ct.with_no_data_value(quot.fill_value) + return Tile(quot, ct) def dimensions(self): diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 8c6b903f6..fcea16612 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -451,15 +451,30 @@ def test_udf_np_implicit_type_conversion(self): a1 = np.array([[1, 2], [0, 4]]) t1 = Tile(a1, CellType.uint8()) - exp_array = a1 * math.pi + exp_array = a1.astype('>f8') @udf(TileUDT()) def times_pi(t): return t * math.pi + @udf(TileUDT()) + def divide_pi(t): + return t / math.pi + + @udf(TileUDT()) + def plus_pi(t): + return t + math.pi + + @udf(TileUDT()) + def less_pi(t): + return t - math.pi + df = self.spark.createDataFrame(pandas.DataFrame([{"tile": t1}])) - r1 = df.select(times_pi(df.tile)).first()[0] - self.assertTrue(np.all(r1.cells, exp_array)) + r1 = df.select( + less_pi(divide_pi(times_pi(plus_pi(df.tile)))) + ).first()[0] + + self.assertTrue(np.all(r1.cells == exp_array)) self.assertEqual(r1.cells.dtype, exp_array.dtype) From e9371ef166518e66c4118595656e611ae3625051 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 3 Jun 2019 12:42:08 -0400 Subject: [PATCH 130/380] PR feedback. --- .../scala/org/locationtech/rasterframes/model/Cells.scala | 2 +- .../org/locationtech/rasterframes/tiles/ShowableTile.scala | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala index e91bf38ef..1f7ae4d75 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/Cells.scala @@ -59,7 +59,7 @@ object Cells { case ref: RasterRefTile => Cells(Right(ref.rr)) case const: ConstantTile => - // TODO: Create mechanism whereby constant tiles aren't expanded. + // Need to expand constant tiles so they can be interpreted properly in catalyst and Python. // If we don't, the serialization breaks. Cells(Left(const.toArrayTile().toBytes)) case o => diff --git a/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala b/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala index a021febe8..00872ff6c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/tiles/ShowableTile.scala @@ -25,7 +25,7 @@ import geotrellis.raster.Tile class ShowableTile(val delegate: Tile) extends FixedDelegatingTile { override def equals(obj: Any): Boolean = obj match { - case ppt: ShowableTile => delegate.equals(ppt.delegate) + case st: ShowableTile => delegate.equals(st.delegate) case o => delegate.equals(o) } override def hashCode(): Int = delegate.hashCode() @@ -37,12 +37,14 @@ object ShowableTile { def show(tile: Tile): String = { val ct = tile.cellType val dims = tile.dimensions + val data = if (tile.cellType.isFloatingPoint) tile.toArrayDouble() else tile.toArray() - val cells = if (data.length <= maxCells) + val cells = if(tile.size <= maxCells) { data.mkString("[", ",", "]") + } else { val front = data.take(maxCells/2).mkString("[", ",", "") val back = data.takeRight(maxCells/2).mkString("", ",", "]") From 6b36b7ca0e4d1e23900bef4c8d56c7b8f2b31c2a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 3 Jun 2019 14:52:48 -0400 Subject: [PATCH 131/380] Experiment with read retries to handle BufferUnderflowExceptions. --- .../rasterframes/ref/RasterSource.scala | 47 ++++++++++++++++--- 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 7cba2a590..4e7e10ac5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -226,16 +226,49 @@ object RasterSource extends LazyLogging { case _ => EMPTY_TAGS } override def tags: Tags = info.tags + + private def readWithRetry[R >: Null](f: () => R): R = { + val retryLimit = 10 + var result: R = null + var cnt = 0 + while(result == null && cnt < retryLimit) { + cnt = cnt + 1 + try { + result = f() + } + catch { + case be: java.nio.BufferUnderflowException => + if (cnt == 1) + logger.warn("Retrying read to " + source) + if (cnt == retryLimit) { + logger.warn(s"Failed to read '$source' after $cnt tries") + throw be + } + else Thread.sleep(100) + () + } + } + result + } + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = - delegate.readBounds(bounds, bands) + readWithRetry(() => + delegate.readBounds(bounds, bands) + ) + override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = - delegate - .read(bounds, bands) - .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) + readWithRetry(() => + delegate + .read(bounds, bands) + .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) + ) + override def read(extent: Extent, bands: Seq[Int]): Raster[MultibandTile] = - delegate - .read(extent, bands) - .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) + readWithRetry(() => + delegate + .read(extent, bands) + .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) + ) } case class JVMGeoTiffRasterSource(source: URI) extends DelegatingRasterSource(source, () => GeoTiffRasterSource(source.toASCIIString)) From 7618c0b7b32224a97d8db22da998891987619451 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 3 Jun 2019 15:57:20 -0400 Subject: [PATCH 132/380] python CellType ignore user defined nodata if same as default nodata. Signed-off-by: Jason T. Brown --- pyrasterframes/python/pyrasterframes/rf_types.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index f0f946a01..6e3db164f 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -233,6 +233,8 @@ def to_numpy_dtype(self): return np.dtype(n).newbyteorder('>') def with_no_data_value(self, no_data): + if self.has_no_data() and self.no_data_value() == no_data: + return self return CellType(self.base_cell_type_name() + 'ud' + str(no_data)) def __eq__(self, other): From b55ff3dfe5a54a69f5ce50e800cf05ecae990c3b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 4 Jun 2019 10:59:14 -0400 Subject: [PATCH 133/380] Fixed `pyExamples`. Incorporated PR feedback --- project/PythonBuildPlugin.scala | 11 +- pyrasterframes/build.sbt | 11 +- pyrasterframes/python/README.rst | 6 +- pyrasterframes/python/examples/Clustering.py | 12 +- .../python/examples/CreatingRasterFrames.py | 19 +- pyrasterframes/python/examples/MeanValue.py | 19 +- pyrasterframes/python/examples/NDVI.py | 20 +-- pyrasterframes/python/examples/__init__.py | 4 +- .../python/pyrasterframes/README.md | 0 .../python/pyrasterframes/README.rst | 15 -- .../python/pyrasterframes/__init__.py | 20 +++ .../python/pyrasterframes/context.py | 20 +++ .../python/pyrasterframes/rasterfunctions.py | 22 ++- .../python/pyrasterframes/rf_types.py | 20 +++ pyrasterframes/python/setup.py | 6 +- .../python/tests/PyRasterFramesTests.py | 165 +++++++----------- pyrasterframes/python/tests/__init__.py | 88 ++++++++++ 17 files changed, 272 insertions(+), 186 deletions(-) delete mode 100644 pyrasterframes/python/pyrasterframes/README.md delete mode 100644 pyrasterframes/python/pyrasterframes/README.rst create mode 100644 pyrasterframes/python/tests/__init__.py diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 7a409b233..c6a669413 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -69,7 +69,10 @@ object PythonBuildPlugin extends AutoPlugin { val wd = copyPySources.value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args - val ver = version.value + val ver = version.value match { + case "SNAPSHOT" => "dev" + case o => o + } s.log.info(s"Running '${cmd.mkString(" ")}' in $wd") Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! }, @@ -79,7 +82,8 @@ object PythonBuildPlugin extends AutoPlugin { Test / test := Def.sequential( Test / test, Python / test - ).value + ).value, + Test / testQuick := (Python / testQuick).evaluated ) ++ inConfig(Python)(Seq( target := target.value / "python", @@ -100,7 +104,8 @@ object PythonBuildPlugin extends AutoPlugin { test := Def.sequential( assembly, pySetup.toTask(" test") - ).value + ).value, + testQuick := pySetup.toTask(" test").value )) ++ addArtifact(Python / packageBin / artifact, Python / packageBin) } diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 6810e01fa..8e3732269 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,4 +1,13 @@ +import PythonBuildPlugin.autoImport.pySetup + Compile / pythonSource := baseDirectory.value / "python" Test / pythonSource := baseDirectory.value / "python" / "tests" -addCommandAlias("pyExamples", "pySetup examples") \ No newline at end of file +lazy val pyExamples = taskKey[Unit]("Run examples") + +pyExamples := Def.sequential( + assembly, + pySetup.toTask(" examples") +).value + +addCommandAlias("pyTest", "pyrasterframes/test") \ No newline at end of file diff --git a/pyrasterframes/python/README.rst b/pyrasterframes/python/README.rst index 8c80fb496..20e557cc8 100644 --- a/pyrasterframes/python/README.rst +++ b/pyrasterframes/python/README.rst @@ -10,7 +10,7 @@ SBT Commands Build the shaded JAR: - ``$ sbt pyrasterframes/spPublishLocal`` + ``$ sbt pyrasterframes/assembly`` Run tests: @@ -52,7 +52,9 @@ Run examples: Spark Usage ----------- -Get a Spark REPL (after running ``$ sbt pyrasterframes/spPublishLocal``): +*TODO: The following may be out of date.* + +Get a Spark REPL (after running ``$ sbt pyrasterframes/assembly``): ``$ pyspark --packages io.astraea:pyrasterframes:$VERSION --master local[2]`` diff --git a/pyrasterframes/python/examples/Clustering.py b/pyrasterframes/python/examples/Clustering.py index 84e30c027..2fceeb5c9 100644 --- a/pyrasterframes/python/examples/Clustering.py +++ b/pyrasterframes/python/examples/Clustering.py @@ -1,20 +1,13 @@ - -#examples_setup from . import example_session, resource_dir -#examples_setup - -#py_cl_imports from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyspark.sql import * from pyspark.ml.feature import VectorAssembler from pyspark.ml.clustering import KMeans from pyspark.ml import Pipeline -#py_cl_imports -#py_cl_create_session + spark = example_session().withRasterFrames() -#py_cl_create_session # The first step is to load multiple bands of imagery and construct # a single RasterFrame from them. @@ -32,13 +25,11 @@ # We should see a single spatial_key column along with columns of tiles. joinedRF.printSchema() - # SparkML requires that each observation be in its own row, and those # observations be packed into a single `Vector`. The first step is to # "explode" the tiles into a single row per cell/pixel exploder = TileExploder() - # To "vectorize" the the band columns we use the SparkML `VectorAssembler` assembler = VectorAssembler() \ .setInputCols(bandColNames) \ @@ -51,7 +42,6 @@ # Combine the two stages pipeline = Pipeline().setStages([exploder, assembler, kmeans]) - # Compute clusters model = pipeline.fit(joinedRF) diff --git a/pyrasterframes/python/examples/CreatingRasterFrames.py b/pyrasterframes/python/examples/CreatingRasterFrames.py index 429bb0f48..5c018fee8 100644 --- a/pyrasterframes/python/examples/CreatingRasterFrames.py +++ b/pyrasterframes/python/examples/CreatingRasterFrames.py @@ -1,27 +1,13 @@ - -#examples_setup from . import resource_dir, example_session -#examples_setup - -#py_crf_imports from pyrasterframes import * from pyspark.sql import * -#py_crf_imports +import os -#py_crf_create_session spark = example_session().withRasterFrames() -#py_crf_create_session - -#py_crf_more_imports -# No additional imports needed for Python. -#py_crf_more_imports -#py_crf_create_rasterframe -rf = spark.read.geotiff(resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri()) +rf = spark.read.geotiff(os.path.join(resource_dir, 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) -#py_crf_create_rasterframe -#py_crf_metadata rf.tileColumns() rf.spatialKeyColumn() @@ -29,4 +15,3 @@ rf.temporalKeyColumn() rf.tileLayerMetadata() -#py_crf_metadata diff --git a/pyrasterframes/python/examples/MeanValue.py b/pyrasterframes/python/examples/MeanValue.py index 2f02f0bac..1bec83c64 100644 --- a/pyrasterframes/python/examples/MeanValue.py +++ b/pyrasterframes/python/examples/MeanValue.py @@ -1,25 +1,12 @@ - -#examples_setup from . import resource_dir, example_session -#examples_setup - - -#py_mv_imports from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyspark.sql import * -#py_mv_imports +import os -#py_mv_create_session spark = example_session().withRasterFrames() -#py_mv_create_session -#py_mv_create_rasterframe -rf = spark.read.geotiff(resource_dir.joinpath('L8-B8-Robinson-IL.tiff').as_uri()) +rf = spark.read.geotiff(os.path.join(resource_dir, 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) -#py_mv_create_rasterframe -#py_mv_find_mean -tileCol = 'tile' -rf.agg(rf_agg_no_data_cells(tileCol), rf_agg_data_cells(tileCol), rf_agg_mean(tileCol)).show(5, False) -#py_mv_find_mean \ No newline at end of file +rf.agg(rf_agg_no_data_cells('tile'), rf_agg_data_cells('tile'), rf_agg_mean('tile')).show(5, False) diff --git a/pyrasterframes/python/examples/NDVI.py b/pyrasterframes/python/examples/NDVI.py index fc6594bb6..7fb4d28d2 100644 --- a/pyrasterframes/python/examples/NDVI.py +++ b/pyrasterframes/python/examples/NDVI.py @@ -1,30 +1,16 @@ - - -#examples_setup from . import resource_dir, example_session -#examples_setup - -#py_nvdi_imports from pyrasterframes import * from pyrasterframes.rasterfunctions import * -from pyspark.sql import * -from pyspark.sql.functions import udf -#py_nvdi_imports +import os -#py_nvdi_create_session spark = example_session().withRasterFrames() -#py_nvdi_create_session -#py_ndvi_create_rasterframe -redBand = spark.read.geotiff(resource_dir.joinpath('L8-B4-Elkton-VA.tiff').as_uri()).withColumnRenamed('tile', 'red_band') -nirBand = spark.read.geotiff(resource_dir.joinpath('L8-B5-Elkton-VA.tiff').as_uri()).withColumnRenamed('tile', 'nir_band') -#py_ndvi_create_rasterframe +redBand = spark.read.geotiff(os.path.join(resource_dir, 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') +nirBand = spark.read.geotiff(os.path.join(resource_dir, 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') -#py_ndvi_column rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) rf.printSchema() rf.show(20) -#py_ndvi_column spark.stop() \ No newline at end of file diff --git a/pyrasterframes/python/examples/__init__.py b/pyrasterframes/python/examples/__init__.py index c7d2a9fa8..8bd561d0a 100644 --- a/pyrasterframes/python/examples/__init__.py +++ b/pyrasterframes/python/examples/__init__.py @@ -12,7 +12,9 @@ jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) if not len(jarpath) == 1: - raise RuntimeError("Expected to find exactly one assembly. Found: ", jarpath) + raise RuntimeError(""" +Expected to find exactly one assembly. Found '{}' instead. +Try running 'sbt pyrasterframes/clean' first. """.format(jarpath)) pyJar = jarpath[0] diff --git a/pyrasterframes/python/pyrasterframes/README.md b/pyrasterframes/python/pyrasterframes/README.md deleted file mode 100644 index e69de29bb..000000000 diff --git a/pyrasterframes/python/pyrasterframes/README.rst b/pyrasterframes/python/pyrasterframes/README.rst deleted file mode 100644 index cf9330217..000000000 --- a/pyrasterframes/python/pyrasterframes/README.rst +++ /dev/null @@ -1,15 +0,0 @@ -PyRasterFrames --------------- - -PyRasterFrames provides a Python API for RasterFrames! - -To initialize PyRasterFrames: - - >>> from pyrasterframes import * - >>> spark = SparkSession.builder \ - ... .master("local[*]") \ - ... .appName("Using RasterFrames") \ - ... .config("spark.some.config.option", "some-value") \ - ... .getOrCreate() \ - ... .withRasterFrames() - diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/python/pyrasterframes/__init__.py index cd994a89c..a1ec30b83 100644 --- a/pyrasterframes/python/pyrasterframes/__init__.py +++ b/pyrasterframes/python/pyrasterframes/__init__.py @@ -1,3 +1,23 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + """ Module initialization for PyRasterFrames. This is where much of the cool stuff is appended to PySpark classes. diff --git a/pyrasterframes/python/pyrasterframes/context.py b/pyrasterframes/python/pyrasterframes/context.py index 08cd81701..18940aaab 100644 --- a/pyrasterframes/python/pyrasterframes/context.py +++ b/pyrasterframes/python/pyrasterframes/context.py @@ -1,3 +1,23 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + """ This module contains access to the jvm SparkContext with RasterFrame support. """ diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/python/pyrasterframes/rasterfunctions.py index ffcc6c26f..9d8ceff7a 100644 --- a/pyrasterframes/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/python/pyrasterframes/rasterfunctions.py @@ -1,10 +1,28 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + """ This module creates explicit Python functions that map back to the existing Scala implementations. Most functions are standard Column functions, but those with unique signatures are handled here as well. """ - - from __future__ import absolute_import from pyspark.sql.types import * from pyspark.sql.column import Column, _to_java_column diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/python/pyrasterframes/rf_types.py index 98fd10023..850809bce 100644 --- a/pyrasterframes/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/python/pyrasterframes/rf_types.py @@ -1,3 +1,23 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + """ This module contains all types relevant to PyRasterFrames. Classes in this module are meant to provide smoother pathways between the jvm and Python, and whenever possible, diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index 0c4905b8a..a7ced91c4 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -75,7 +75,7 @@ def run(self): description='RasterFrames for PySpark', long_description=readme, long_description_content_type='text/x-rst', - version=environ.get('RASTERFRAMES_VERSION', 'SNAPSHOT'), + version=environ.get('RASTERFRAMES_VERSION', 'dev'), author='Astraea, Inc.', author_email='info@astraea.earth', license='Apache 2', @@ -84,12 +84,12 @@ def run(self): 'Bug Reports': 'https://github.com/locationtech/rasterframes/issues', 'Source': 'https://github.com/locationtech/rasterframes', }, + install_requires=requirements, setup_requires=[ 'pytest-runner', 'setuptools >= 0.8', 'pathlib2' - ], - install_requires=requirements, + ] + requirements, tests_require=[ 'pytest==3.4.2', 'pypandoc', diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/python/tests/PyRasterFramesTests.py index 931c228a8..e49eedca2 100644 --- a/pyrasterframes/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/python/tests/PyRasterFramesTests.py @@ -1,77 +1,38 @@ -from pyspark.sql import SparkSession, Column, SQLContext -from pyspark.sql.functions import * -from pyrasterframes.rasterfunctions import * -from pyrasterframes.rf_types import * -from geomesa_pyspark.types import * -import unittest -import numpy as np -import os -import glob - -# version-conditional imports -import sys - -if sys.version_info[0] > 2: - import builtins -else: - import __builtin__ as builtins - -HERE = os.path.dirname(os.path.realpath(__file__)) - -class TestEnvironment(unittest.TestCase): - """ - Base class for tests. - """ - - def rounded_compare(self, val1, val2): - print('Comparing {} and {} using round()'.format(val1, val2)) - return builtins.round(val1) == builtins.round(val2) - - @classmethod - def setUpClass(cls): - # gather Scala requirements - - scala_target = os.path.realpath(os.path.join(HERE, '..', '..', 'scala-2.11')) - - jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) - - if not len(jarpath) == 1: - raise RuntimeError("Expected to find exactly one assembly. Found: ", jarpath) - - # hard-coded relative path for resources - cls.resource_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# - # spark session with RF - cls.spark = (SparkSession.builder - .config('spark.driver.extraClassPath', jarpath[0]) - .config('spark.executor.extraClassPath', jarpath[0]) - .withKryoSerialization() - .getOrCreate()) - cls.spark.sparkContext.setLogLevel('ERROR') - - print("Spark Version: " + cls.spark.version) - print(cls.spark.sparkContext._conf.getAll()) - - cls.spark.withRasterFrames() - - cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') - - # load something into a rasterframe - rf = cls.spark.read.geotiff(cls.img_uri) \ - .withBounds() \ - .withCenter() - - # convert the tile cell type to provide for other operations - cls.tileCol = 'tile' - cls.rf = rf.withColumn('tile2', rf_convert_cell_type(cls.tileCol, 'float32')) \ - .drop(cls.tileCol) \ - .withColumnRenamed('tile2', cls.tileCol).asRF() - # cls.rf.show() +import unittest +import numpy as np +from geomesa_pyspark.types import * +from pyrasterframes.rasterfunctions import * +from pyrasterframes.rf_types import * +from pyspark.sql import SQLContext, Column +from pyspark.sql.functions import * +from pyspark.sql.types import * +from . import TestEnvironment class VectorTypes(TestEnvironment): def setUp(self): + self.create_rasterframe() import pandas as pd self.pandas_df = pd.DataFrame({ 'eye': ['a', 'b', 'c', 'd'], @@ -85,7 +46,7 @@ def setUp(self): self.df = df.withColumn("poly_geom", st_bufferPoint(df.point_geom, lit(1250.0))) def test_spatial_relations(self): - from pyspark.sql.functions import lit, udf, sum + from pyspark.sql.functions import udf, sum import shapely import numpy.testing @@ -175,6 +136,9 @@ def test_reproject(self): class RasterFunctions(TestEnvironment): + def setUp(self): + self.create_rasterframe() + def test_identify_columns(self): cols = self.rf.tileColumns() self.assertEqual(len(cols), 1, '`tileColumns` did not find the proper number of columns.') @@ -194,8 +158,8 @@ def test_tile_creation(self): self.assertEqual(tiles.count(), 4) def test_multi_column_operations(self): - df1 = self.rf.withColumnRenamed(self.tileCol, 't1').asRF() - df2 = self.rf.withColumnRenamed(self.tileCol, 't2').asRF() + df1 = self.rf.withColumnRenamed('tile', 't1').asRF() + df2 = self.rf.withColumnRenamed('tile', 't2').asRF() df3 = df1.spatialJoin(df2).asRF() df3 = df3.withColumn('norm_diff', rf_normalized_difference('t1', 't2')) # df3.printSchema() @@ -211,36 +175,36 @@ def test_multi_column_operations(self): def test_general(self): meta = self.rf.tileLayerMetadata() self.assertIsNotNone(meta['bounds']) - df = self.rf.withColumn('dims', rf_dimensions(self.tileCol)) \ - .withColumn('type', rf_cell_type(self.tileCol)) \ - .withColumn('dCells', rf_data_cells(self.tileCol)) \ - .withColumn('ndCells', rf_no_data_cells(self.tileCol)) \ - .withColumn('min', rf_tile_min(self.tileCol)) \ - .withColumn('max', rf_tile_max(self.tileCol)) \ - .withColumn('mean', rf_tile_mean(self.tileCol)) \ - .withColumn('sum', rf_tile_sum(self.tileCol)) \ - .withColumn('stats', rf_tile_stats(self.tileCol)) \ + df = self.rf.withColumn('dims', rf_dimensions('tile')) \ + .withColumn('type', rf_cell_type('tile')) \ + .withColumn('dCells', rf_data_cells('tile')) \ + .withColumn('ndCells', rf_no_data_cells('tile')) \ + .withColumn('min', rf_tile_min('tile')) \ + .withColumn('max', rf_tile_max('tile')) \ + .withColumn('mean', rf_tile_mean('tile')) \ + .withColumn('sum', rf_tile_sum('tile')) \ + .withColumn('stats', rf_tile_stats('tile')) \ .withColumn('extent', st_extent('geometry')) \ .withColumn('extent_geom1', st_geometry('extent')) \ - .withColumn('ascii', rf_render_ascii(self.tileCol)) \ - .withColumn('log', rf_log(self.tileCol)) \ - .withColumn('exp', rf_exp(self.tileCol)) \ - .withColumn('expm1', rf_expm1(self.tileCol)) \ - .withColumn('round', rf_round(self.tileCol)) \ - .withColumn('abs', rf_abs(self.tileCol)) + .withColumn('ascii', rf_render_ascii('tile')) \ + .withColumn('log', rf_log('tile')) \ + .withColumn('exp', rf_exp('tile')) \ + .withColumn('expm1', rf_expm1('tile')) \ + .withColumn('round', rf_round('tile')) \ + .withColumn('abs', rf_abs('tile')) df.first() def test_agg_mean(self): - mean = self.rf.agg(rf_agg_mean(self.tileCol)).first()['rf_agg_mean(tile)'] + mean = self.rf.agg(rf_agg_mean('tile')).first()['rf_agg_mean(tile)'] self.assertTrue(self.rounded_compare(mean, 10160)) def test_aggregations(self): aggs = self.rf.agg( - rf_agg_data_cells(self.tileCol), - rf_agg_no_data_cells(self.tileCol), - rf_agg_stats(self.tileCol), - rf_agg_approx_histogram(self.tileCol) + rf_agg_data_cells('tile'), + rf_agg_no_data_cells('tile'), + rf_agg_stats('tile'), + rf_agg_approx_histogram('tile') ) row = aggs.first() @@ -252,7 +216,7 @@ def test_aggregations(self): def test_sql(self): self.rf.createOrReplaceTempView("rf") - dims = self.rf.withColumn('dims', rf_dimensions(self.tileCol)).first().dims + dims = self.rf.withColumn('dims', rf_dimensions('tile')).first().dims dims_str = """{}, {}""".format(dims.cols, dims.rows) self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, @@ -266,7 +230,7 @@ def test_sql(self): FROM r3""") # ops.printSchema - statsRow = ops.select(rf_tile_mean(self.tileCol).alias('base'), + statsRow = ops.select(rf_tile_mean('tile').alias('base'), rf_tile_mean("AndOne").alias('plus_one'), rf_tile_mean("LessOne").alias('minus_one'), rf_tile_mean("TimesTwo").alias('double'), @@ -280,7 +244,7 @@ def test_sql(self): def test_explode(self): import pyspark.sql.functions as F - self.rf.select('spatial_key', rf_explode_tiles(self.tileCol)).show() + self.rf.select('spatial_key', rf_explode_tiles('tile')).show() # +-----------+------------+---------+-------+ # |spatial_key|column_index|row_index|tile | # +-----------+------------+---------+-------+ @@ -296,7 +260,7 @@ def test_explode(self): # Test the sample version frac = 0.01 - sample_count = self.rf.select(rf_explode_tiles_sample(frac, 1872, self.tileCol)).count() + sample_count = self.rf.select(rf_explode_tiles_sample(frac, 1872, 'tile')).count() print('Sample count is {}'.format(sample_count)) self.assertTrue(sample_count > 0) self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room @@ -485,6 +449,8 @@ def test_addition(self): class PandasInterop(TestEnvironment): + def setUp(self): + self.create_rasterframe() def test_pandas_conversion(self): import pandas as pd @@ -547,6 +513,9 @@ def test_extended_pandas_ops(self): class RasterJoin(TestEnvironment): + def setUp(self): + self.create_rasterframe() + def test_raster_join(self): # re-read the same source rf_prime = self.spark.read.geotiff(self.img_uri) \ @@ -583,9 +552,9 @@ def test_setup(self): def test_prt_functions(self): df = self.spark.read.rastersource(self.img_uri) \ - .withColumn('crs', rf_crs(self.tileCol)) \ - .withColumn('ext', rf_extent(self.tileCol)) \ - .withColumn('geom', rf_geometry(self.tileCol)) + .withColumn('crs', rf_crs('tile')) \ + .withColumn('ext', rf_extent('tile')) \ + .withColumn('geom', rf_geometry('tile')) df.select('crs', 'ext', 'geom').first() def test_raster_source_reader(self): diff --git a/pyrasterframes/python/tests/__init__.py b/pyrasterframes/python/tests/__init__.py new file mode 100644 index 000000000..275612087 --- /dev/null +++ b/pyrasterframes/python/tests/__init__.py @@ -0,0 +1,88 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import glob +import os +import unittest + +from pyspark.sql import SparkSession +from pyrasterframes.rasterfunctions import * + +import sys + +if sys.version_info[0] > 2: + import builtins +else: + import __builtin__ as builtins + + +class TestEnvironment(unittest.TestCase): + """ + Base class for tests. + """ + + def rounded_compare(self, val1, val2): + print('Comparing {} and {} using round()'.format(val1, val2)) + return builtins.round(val1) == builtins.round(val2) + + @classmethod + def setUpClass(cls): + # gather Scala requirements + here = os.path.dirname(os.path.realpath(__file__)) + target_dir = os.path.dirname(os.path.dirname(here)) + + scala_target = os.path.realpath(os.path.join(target_dir, 'scala-2.11')) + + jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) + + if not len(jarpath) == 1: + raise RuntimeError(""" +Expected to find exactly one assembly. Found '{}' instead. +Try running 'sbt pyrasterframes/clean' first.""".format(jarpath)) + + # hard-coded relative path for resources + cls.resource_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) + + # spark session with RF + cls.spark = (SparkSession.builder + .config('spark.driver.extraClassPath', jarpath[0]) + .config('spark.executor.extraClassPath', jarpath[0]) + .withKryoSerialization() + .getOrCreate()) + cls.spark.sparkContext.setLogLevel('ERROR') + + print("Spark Version: " + cls.spark.version) + print(cls.spark.sparkContext._conf.getAll()) + + cls.spark.withRasterFrames() + + cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') + + def create_rasterframe(self): + # load something into a rasterframe + rf = self.spark.read.geotiff(self.img_uri) \ + .withBounds() \ + .withCenter() + + # convert the tile cell type to provide for other operations + self.rf = rf.withColumn('tile2', rf_convert_cell_type('tile', 'float32')) \ + .drop('tile') \ + .withColumnRenamed('tile2', 'tile').asRF() + # cls.rf.show() \ No newline at end of file From 635cf66ab22ee4b229ff31784f901cf12b672166 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 4 Jun 2019 14:18:02 -0400 Subject: [PATCH 134/380] Step toward building an assembly with python source included. --- project/PythonBuildPlugin.scala | 2 +- project/RFAssemblyPlugin.scala | 2 +- pyrasterframes/build.sbt | 22 +++++++++++++++++++++- 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index c6a669413..692970348 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -48,7 +48,7 @@ object PythonBuildPlugin extends AutoPlugin { dest } - val buildPyDist= Def.task { + val buildPyDist = Def.task { val buildDir = (Python / target).value val pyDist = (packageBin / artifactPath).value val retcode = pySetup.toTask(" build sdist --formats=zip").value diff --git a/project/RFAssemblyPlugin.scala b/project/RFAssemblyPlugin.scala index 90f344b78..8f69776f6 100644 --- a/project/RFAssemblyPlugin.scala +++ b/project/RFAssemblyPlugin.scala @@ -55,7 +55,7 @@ object RFAssemblyPlugin extends AutoPlugin { "org.apache.http", "com.google.guava" ) - shadePrefixes.map(p ⇒ ShadeRule.rename(s"$p.**" -> s"aee.shaded.$p.@1").inAll) + shadePrefixes.map(p ⇒ ShadeRule.rename(s"$p.**" -> s"rf.shaded.$p.@1").inAll) }, assemblyOption in assembly := (assemblyOption in assembly).value.copy(includeScala = false), diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 8e3732269..1c66443d0 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -3,7 +3,27 @@ import PythonBuildPlugin.autoImport.pySetup Compile / pythonSource := baseDirectory.value / "python" Test / pythonSource := baseDirectory.value / "python" / "tests" -lazy val pyExamples = taskKey[Unit]("Run examples") +// This setting adds relevant python source to the JVM artifact +// where pyspark can pick it up from the `--packages` setting. + +Python / sourceDirectories := Seq( + (Compile / pythonSource).value / "pyrasterframes", + (Compile / pythonSource).value / "geomesa_pyspark" +) + +Compile / packageBin / mappings ++= { + val pybase = (Compile / pythonSource).value + val dirs = (Python / sourceDirectories).value + for { + d <- dirs + p <- d ** "*.py" --- d pair (f => IO.relativize(pybase, f)) + } yield p +} + +// This is needed for the above to get included properly in the assembly. +exportJars := true + +lazy val pyExamples = taskKey[Unit]("Run python examples") pyExamples := Def.sequential( assembly, From 30254704d600363d3e5eedb0c601908cbacf07fd Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 4 Jun 2019 16:17:44 -0400 Subject: [PATCH 135/380] Created `pySpark` sbt command. Updated PyRasterFrames README. --- project/PythonBuildPlugin.scala | 26 ++++---- pyrasterframes/build.sbt | 31 +++++----- pyrasterframes/python/README.md | 101 +++++++++++++++++++++++++++++++ pyrasterframes/python/README.rst | 77 ----------------------- pyrasterframes/python/setup.py | 4 +- 5 files changed, 131 insertions(+), 108 deletions(-) create mode 100644 pyrasterframes/python/README.md delete mode 100644 pyrasterframes/python/README.rst diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 692970348..07584005d 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -48,15 +48,20 @@ object PythonBuildPlugin extends AutoPlugin { dest } - val buildPyDist = Def.task { + val buildWhl = Def.task { val buildDir = (Python / target).value - val pyDist = (packageBin / artifactPath).value - val retcode = pySetup.toTask(" build sdist --formats=zip").value + val retcode = pySetup.toTask(" build bdist_wheel").value if(retcode != 0) throw new RuntimeException(s"'python setup.py' returned $retcode") - val art = (Python / packageBin / artifact).value - val ver = version.value - IO.move(buildDir / "dist" / s"${art.name}-$ver.zip", pyDist) - pyDist + val whls = (buildDir / "dist" ** "pyrasterframes*.whl").get() + require(whls.length == 1, "Running setup.py should have produced a single .whl file. Try running `clean` first.") + whls.head + } + + val pyDistAsZip = Def.task { + val pyDest = (packageBin / artifactPath).value + val whl = buildWhl.value + IO.copyFile(whl, pyDest) + pyDest } override def projectConfigurations: Seq[Configuration] = Seq(Python) @@ -69,10 +74,7 @@ object PythonBuildPlugin extends AutoPlugin { val wd = copyPySources.value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args - val ver = version.value match { - case "SNAPSHOT" => "dev" - case o => o - } + val ver = version.value s.log.info(s"Running '${cmd.mkString(" ")}' in $wd") Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! }, @@ -89,7 +91,7 @@ object PythonBuildPlugin extends AutoPlugin { target := target.value / "python", packageBin := Def.sequential( Compile / packageBin, - buildPyDist + pyDistAsZip, ).value, packageBin / artifact := { val java = (Compile / packageBin / artifact).value diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 1c66443d0..bf08614de 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -3,26 +3,23 @@ import PythonBuildPlugin.autoImport.pySetup Compile / pythonSource := baseDirectory.value / "python" Test / pythonSource := baseDirectory.value / "python" / "tests" -// This setting adds relevant python source to the JVM artifact -// where pyspark can pick it up from the `--packages` setting. - -Python / sourceDirectories := Seq( - (Compile / pythonSource).value / "pyrasterframes", - (Compile / pythonSource).value / "geomesa_pyspark" -) +exportJars := true -Compile / packageBin / mappings ++= { - val pybase = (Compile / pythonSource).value - val dirs = (Python / sourceDirectories).value - for { - d <- dirs - p <- d ** "*.py" --- d pair (f => IO.relativize(pybase, f)) - } yield p +lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") +pySparkCmd := { + val s = streams.value + val jvm = assembly.value + val py = (Python / packageBin).value + val script = IO.createTemporaryDirectory / "pyrf_init.py" + IO.write(script, """ +from pyrasterframes import * +from pyrasterframes.rasterfunctions import * +""") + val msg = s"PYTHONSTARTUP=$script pyspark --jars $jvm --py-files $py" + s.log.debug(msg) + println(msg) } -// This is needed for the above to get included properly in the assembly. -exportJars := true - lazy val pyExamples = taskKey[Unit]("Run python examples") pyExamples := Def.sequential( diff --git a/pyrasterframes/python/README.md b/pyrasterframes/python/README.md new file mode 100644 index 000000000..9fb8b16e2 --- /dev/null +++ b/pyrasterframes/python/README.md @@ -0,0 +1,101 @@ +# PyRasterFrames + +PyRasterFrames is the Python API for Spark RasterFrames. + +Building RasterFrames requires [`sbt`](https://www.scala-sbt.org/), and all `sbt` commands referenced below must be +run from the root source directory, i.e. the parent of the `pyrasterframes` directory. Know that `sbt` is much +faster if run in "interactive" mode, where you launch `sbt` with no arguments, and subsequent commands are invoked +via an interactive shell. But for context clarity, we'll prefix each command example below with `sbt`. + +## Quickstart + +The quickest way to run a `pyspark` shell with the latest RasterFrames enabled is to run: + +```bash +sbt pySparkCmd +``` + +This will: + +1. Compile all the Scala/JVM code. +1. Merge all JVM code and dependencies into a single "assembly" JAR file. +1. Create the PyRasterFrames `.whl` package +1. Construct a temporary initialization script +1. Emit a `bash` command with requiesite arguments to load RasterFrames and import PyRasterFrames + +You then copy/paste the emitted command into your `bash` shell to start up a spark shell. It assumes you have +`pyspark` >= 2.3.2 installed in your environment. + +## Running Tests and Examples + +The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: + +```bash +sbt pyTests +``` + +Similarly, to run the examples in `pyrasterframes/python/examples`: + +```bash +sbt pyExamples +``` + +## Creating and Using a Build + +Assuming that `$SCALA_VER` is the major verison of Scala in use, and `$VER` is the version of RasterFrames, +the primary build artifacts are: + +* JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` +* Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` + +You build them with" + +```bash +sbt pyrasterframes/package +``` + +Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy "GAV" coordinates +`org.locationtech.rasterframes:pyrasterframes_$SCALA_VER:$VER`. + +Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). +The Python package is published under the `python` classifier, `zip` extension. + + +## Build Internals + +### Running `setup.py` + +Before a build is initiated, the Python sources are copied to `pyrasterframes/target/python`. This ensures the +version controlled source directories are not polluted by `setuptools` residuals, better ensuring repeatable builds. To +simplify the process of working with `setup.py` in this context, a `pySetup` sbt interactive command is available. To +illustrate its usage, suppose we want to run a subset of the Python unit test. Instead of running `sbt pyTests` you can: + +```bash +sbt pySetup test --addopts "-k test_tile_creation" +``` + +Or to run a specific example: + +```bash +sbt pySetup examples "--e NDVI.py" +``` + +*Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* + + +### `SparkSession` Setup + +To initialize PyRasterFrames in a generic Python shell: + +```python +# pyspark imports here... +from pyrasterframes import * +from pyrasterframes.rasterfunctions import * +spark = SparkSession.builder \ + .master("local[*]") \ + .appName("Using RasterFrames") \ + .config("spark.some.config.option", "some-value") \ + .getOrCreate() \ + .withRasterFrames() +``` + diff --git a/pyrasterframes/python/README.rst b/pyrasterframes/python/README.rst deleted file mode 100644 index 20e557cc8..000000000 --- a/pyrasterframes/python/README.rst +++ /dev/null @@ -1,77 +0,0 @@ -============== -PyRasterFrames -============== - -PyRasterFrames provides a Python API for RasterFrames! - ------------- -SBT Commands ------------- - -Build the shaded JAR: - - ``$ sbt pyrasterframes/assembly`` - -Run tests: - - ``$ sbt pyrasterframes/pyTest`` - -Run examples: - - ``$ sbt pyrasterframes/pyExamples`` - - ---------------- -Python Commands ---------------- - -Install the python package (for development / local use): - - ``$ pip install -e python`` - - -To run tests and examples, ``$ cd python``, then: - -Run tests (if no Scala code has changed): - - ``$ python setup.py test`` - - To run verbosely: - ``$ python setup.py test --addopts -s`` - - To run a specific test: - ``$ python setup.py test --addopts "-k my_test_name"`` - - -Run examples: - - ``$ python setup.py examples [--e EXAMPLENAME,EXAMPLENAME]`` - - ------------ -Spark Usage ------------ - -*TODO: The following may be out of date.* - -Get a Spark REPL (after running ``$ sbt pyrasterframes/assembly``): - - ``$ pyspark --packages io.astraea:pyrasterframes:$VERSION --master local[2]`` - -You can then try some of the commands in ``python/tests/PyRasterFramesTests.py``. - -Submit a script (from the ``python`` directory): - - ``$ spark-submit --packages io.astraea:pyrasterframes:$VERSION --master local[2] \`` - ``examples/CreatingRasterFrames.py`` - -To initialize PyRasterFrames: - - >>> from pyrasterframes import * - >>> spark = SparkSession.builder \ - ... .master("local[*]") \ - ... .appName("Using RasterFrames") \ - ... .config("spark.some.config.option", "some-value") \ - ... .getOrCreate() \ - ... .withRasterFrames() - diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/python/setup.py index a7ced91c4..2ab4b7ebb 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/python/setup.py @@ -9,7 +9,7 @@ here = path.abspath(path.dirname(__file__)) # Get the long description from the README file -with open(path.join(here, 'README.rst'), encoding='utf-8') as f: +with open(path.join(here, 'README.md'), encoding='utf-8') as f: readme = f.read() with open(path.join(here, 'requirements.txt')) as f: @@ -74,7 +74,7 @@ def run(self): name='pyrasterframes', description='RasterFrames for PySpark', long_description=readme, - long_description_content_type='text/x-rst', + long_description_content_type='text/markdown', version=environ.get('RASTERFRAMES_VERSION', 'dev'), author='Astraea, Inc.', author_email='info@astraea.earth', From 9beb22afa6277ef55048d1325ee692be716856c5 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 4 Jun 2019 11:34:40 -0400 Subject: [PATCH 136/380] Reorganized Python sources to match sbt conventions. --- project/PythonBuildPlugin.scala | 11 +++ .../{ => src/main}/python/.gitignore | 0 .../main/python/LICENSE.txt} | 5 +- .../{ => src/main}/python/MANIFEST.in | 0 pyrasterframes/src/main/python/README.rst | 77 +++++++++++++++++++ .../{ => src/main}/python/coverage-report.sh | 0 .../main}/python/examples/Clustering.py | 0 .../python/examples/CreatingRasterFrames.py | 0 .../main}/python/examples/MeanValue.py | 0 .../{ => src/main}/python/examples/NDVI.py | 0 .../main}/python/examples/__init__.py | 0 .../main}/python/geomesa_pyspark/__init__.py | 0 .../main}/python/geomesa_pyspark/types.py | 0 .../main}/python/pyrasterframes/__init__.py | 0 .../main}/python/pyrasterframes/context.py | 0 .../python/pyrasterframes/rasterfunctions.py | 0 .../main}/python/pyrasterframes/rf_types.py | 0 .../{ => src/main}/python/requirements.txt | 0 .../{ => src/main}/python/setup.cfg | 0 pyrasterframes/{ => src/main}/python/setup.py | 3 +- .../test/python}/PyRasterFramesTests.py | 0 .../tests => src/test/python}/__init__.py | 0 22 files changed, 93 insertions(+), 3 deletions(-) rename pyrasterframes/{ => src/main}/python/.gitignore (100%) rename pyrasterframes/{python/LICENSE.md => src/main/python/LICENSE.txt} (82%) rename pyrasterframes/{ => src/main}/python/MANIFEST.in (100%) create mode 100644 pyrasterframes/src/main/python/README.rst rename pyrasterframes/{ => src/main}/python/coverage-report.sh (100%) rename pyrasterframes/{ => src/main}/python/examples/Clustering.py (100%) rename pyrasterframes/{ => src/main}/python/examples/CreatingRasterFrames.py (100%) rename pyrasterframes/{ => src/main}/python/examples/MeanValue.py (100%) rename pyrasterframes/{ => src/main}/python/examples/NDVI.py (100%) rename pyrasterframes/{ => src/main}/python/examples/__init__.py (100%) rename pyrasterframes/{ => src/main}/python/geomesa_pyspark/__init__.py (100%) rename pyrasterframes/{ => src/main}/python/geomesa_pyspark/types.py (100%) rename pyrasterframes/{ => src/main}/python/pyrasterframes/__init__.py (100%) rename pyrasterframes/{ => src/main}/python/pyrasterframes/context.py (100%) rename pyrasterframes/{ => src/main}/python/pyrasterframes/rasterfunctions.py (100%) rename pyrasterframes/{ => src/main}/python/pyrasterframes/rf_types.py (100%) rename pyrasterframes/{ => src/main}/python/requirements.txt (100%) rename pyrasterframes/{ => src/main}/python/setup.cfg (100%) rename pyrasterframes/{ => src/main}/python/setup.py (98%) rename pyrasterframes/{python/tests => src/test/python}/PyRasterFramesTests.py (100%) rename pyrasterframes/{python/tests => src/test/python}/__init__.py (100%) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 07584005d..387c523e3 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -48,6 +48,16 @@ object PythonBuildPlugin extends AutoPlugin { dest } + val copyPyTestSources = Def.task { + val s = streams.value + val src = (Test / pythonSource).value + val dest = (Python / target).value / "tests" + if (!dest.exists()) dest.mkdirs() + s.log(s"Copying '$src' to '$dest'") + IO.copyDirectory(src, dest) + dest + } + val buildWhl = Def.task { val buildDir = (Python / target).value val retcode = pySetup.toTask(" build bdist_wheel").value @@ -105,6 +115,7 @@ object PythonBuildPlugin extends AutoPlugin { }, test := Def.sequential( assembly, + copyPyTestSources, pySetup.toTask(" test") ).value, testQuick := pySetup.toTask(" test").value diff --git a/pyrasterframes/python/.gitignore b/pyrasterframes/src/main/python/.gitignore similarity index 100% rename from pyrasterframes/python/.gitignore rename to pyrasterframes/src/main/python/.gitignore diff --git a/pyrasterframes/python/LICENSE.md b/pyrasterframes/src/main/python/LICENSE.txt similarity index 82% rename from pyrasterframes/python/LICENSE.md rename to pyrasterframes/src/main/python/LICENSE.txt index 0dd8f3f8c..e7ca21e70 100644 --- a/pyrasterframes/python/LICENSE.md +++ b/pyrasterframes/src/main/python/LICENSE.txt @@ -1,12 +1,12 @@ This software is licensed under the Apache 2 license, quoted below. -Copyright 2017-2018 Astraea. Inc. +Copyright 2017-2019 Astraea, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - [http://www.apache.org/licenses/LICENSE-2.0] +[http://www.apache.org/licenses/LICENSE-2.0] Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT @@ -14,3 +14,4 @@ WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. +SPDX-License-Identifier: Apache-2.0 diff --git a/pyrasterframes/python/MANIFEST.in b/pyrasterframes/src/main/python/MANIFEST.in similarity index 100% rename from pyrasterframes/python/MANIFEST.in rename to pyrasterframes/src/main/python/MANIFEST.in diff --git a/pyrasterframes/src/main/python/README.rst b/pyrasterframes/src/main/python/README.rst new file mode 100644 index 000000000..20e557cc8 --- /dev/null +++ b/pyrasterframes/src/main/python/README.rst @@ -0,0 +1,77 @@ +============== +PyRasterFrames +============== + +PyRasterFrames provides a Python API for RasterFrames! + +------------ +SBT Commands +------------ + +Build the shaded JAR: + + ``$ sbt pyrasterframes/assembly`` + +Run tests: + + ``$ sbt pyrasterframes/pyTest`` + +Run examples: + + ``$ sbt pyrasterframes/pyExamples`` + + +--------------- +Python Commands +--------------- + +Install the python package (for development / local use): + + ``$ pip install -e python`` + + +To run tests and examples, ``$ cd python``, then: + +Run tests (if no Scala code has changed): + + ``$ python setup.py test`` + + To run verbosely: + ``$ python setup.py test --addopts -s`` + + To run a specific test: + ``$ python setup.py test --addopts "-k my_test_name"`` + + +Run examples: + + ``$ python setup.py examples [--e EXAMPLENAME,EXAMPLENAME]`` + + +----------- +Spark Usage +----------- + +*TODO: The following may be out of date.* + +Get a Spark REPL (after running ``$ sbt pyrasterframes/assembly``): + + ``$ pyspark --packages io.astraea:pyrasterframes:$VERSION --master local[2]`` + +You can then try some of the commands in ``python/tests/PyRasterFramesTests.py``. + +Submit a script (from the ``python`` directory): + + ``$ spark-submit --packages io.astraea:pyrasterframes:$VERSION --master local[2] \`` + ``examples/CreatingRasterFrames.py`` + +To initialize PyRasterFrames: + + >>> from pyrasterframes import * + >>> spark = SparkSession.builder \ + ... .master("local[*]") \ + ... .appName("Using RasterFrames") \ + ... .config("spark.some.config.option", "some-value") \ + ... .getOrCreate() \ + ... .withRasterFrames() + diff --git a/pyrasterframes/python/coverage-report.sh b/pyrasterframes/src/main/python/coverage-report.sh similarity index 100% rename from pyrasterframes/python/coverage-report.sh rename to pyrasterframes/src/main/python/coverage-report.sh diff --git a/pyrasterframes/python/examples/Clustering.py b/pyrasterframes/src/main/python/examples/Clustering.py similarity index 100% rename from pyrasterframes/python/examples/Clustering.py rename to pyrasterframes/src/main/python/examples/Clustering.py diff --git a/pyrasterframes/python/examples/CreatingRasterFrames.py b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py similarity index 100% rename from pyrasterframes/python/examples/CreatingRasterFrames.py rename to pyrasterframes/src/main/python/examples/CreatingRasterFrames.py diff --git a/pyrasterframes/python/examples/MeanValue.py b/pyrasterframes/src/main/python/examples/MeanValue.py similarity index 100% rename from pyrasterframes/python/examples/MeanValue.py rename to pyrasterframes/src/main/python/examples/MeanValue.py diff --git a/pyrasterframes/python/examples/NDVI.py b/pyrasterframes/src/main/python/examples/NDVI.py similarity index 100% rename from pyrasterframes/python/examples/NDVI.py rename to pyrasterframes/src/main/python/examples/NDVI.py diff --git a/pyrasterframes/python/examples/__init__.py b/pyrasterframes/src/main/python/examples/__init__.py similarity index 100% rename from pyrasterframes/python/examples/__init__.py rename to pyrasterframes/src/main/python/examples/__init__.py diff --git a/pyrasterframes/python/geomesa_pyspark/__init__.py b/pyrasterframes/src/main/python/geomesa_pyspark/__init__.py similarity index 100% rename from pyrasterframes/python/geomesa_pyspark/__init__.py rename to pyrasterframes/src/main/python/geomesa_pyspark/__init__.py diff --git a/pyrasterframes/python/geomesa_pyspark/types.py b/pyrasterframes/src/main/python/geomesa_pyspark/types.py similarity index 100% rename from pyrasterframes/python/geomesa_pyspark/types.py rename to pyrasterframes/src/main/python/geomesa_pyspark/types.py diff --git a/pyrasterframes/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py similarity index 100% rename from pyrasterframes/python/pyrasterframes/__init__.py rename to pyrasterframes/src/main/python/pyrasterframes/__init__.py diff --git a/pyrasterframes/python/pyrasterframes/context.py b/pyrasterframes/src/main/python/pyrasterframes/context.py similarity index 100% rename from pyrasterframes/python/pyrasterframes/context.py rename to pyrasterframes/src/main/python/pyrasterframes/context.py diff --git a/pyrasterframes/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py similarity index 100% rename from pyrasterframes/python/pyrasterframes/rasterfunctions.py rename to pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py diff --git a/pyrasterframes/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py similarity index 100% rename from pyrasterframes/python/pyrasterframes/rf_types.py rename to pyrasterframes/src/main/python/pyrasterframes/rf_types.py diff --git a/pyrasterframes/python/requirements.txt b/pyrasterframes/src/main/python/requirements.txt similarity index 100% rename from pyrasterframes/python/requirements.txt rename to pyrasterframes/src/main/python/requirements.txt diff --git a/pyrasterframes/python/setup.cfg b/pyrasterframes/src/main/python/setup.cfg similarity index 100% rename from pyrasterframes/python/setup.cfg rename to pyrasterframes/src/main/python/setup.cfg diff --git a/pyrasterframes/python/setup.py b/pyrasterframes/src/main/python/setup.py similarity index 98% rename from pyrasterframes/python/setup.py rename to pyrasterframes/src/main/python/setup.py index 2ab4b7ebb..038675a18 100644 --- a/pyrasterframes/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -88,7 +88,8 @@ def run(self): setup_requires=[ 'pytest-runner', 'setuptools >= 0.8', - 'pathlib2' + 'pathlib2', + 'jupytext' ] + requirements, tests_require=[ 'pytest==3.4.2', diff --git a/pyrasterframes/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/test/python/PyRasterFramesTests.py similarity index 100% rename from pyrasterframes/python/tests/PyRasterFramesTests.py rename to pyrasterframes/src/test/python/PyRasterFramesTests.py diff --git a/pyrasterframes/python/tests/__init__.py b/pyrasterframes/src/test/python/__init__.py similarity index 100% rename from pyrasterframes/python/tests/__init__.py rename to pyrasterframes/src/test/python/__init__.py From 222779e025c179988d3b71708253cfd741daae69 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 4 Jun 2019 11:57:13 -0400 Subject: [PATCH 137/380] Defined separate setting for Python tests target directory. --- project/PythonBuildPlugin.scala | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 387c523e3..6a24dc0f3 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -51,7 +51,7 @@ object PythonBuildPlugin extends AutoPlugin { val copyPyTestSources = Def.task { val s = streams.value val src = (Test / pythonSource).value - val dest = (Python / target).value / "tests" + val dest = (Python / test / target).value if (!dest.exists()) dest.mkdirs() s.log(s"Copying '$src' to '$dest'") IO.copyDirectory(src, dest) @@ -98,7 +98,8 @@ object PythonBuildPlugin extends AutoPlugin { Test / testQuick := (Python / testQuick).evaluated ) ++ inConfig(Python)(Seq( - target := target.value / "python", + target := (Compile / target).value / "python", + test / target := (Compile / target).value / "python" / "tests", packageBin := Def.sequential( Compile / packageBin, pyDistAsZip, From b98b42f2aa507850e2b001037aff58947f131d55 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 5 Jun 2019 09:26:36 -0400 Subject: [PATCH 138/380] Yet another Travis Tweak (YATT). --- .travis.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 668aec8ef..81febf1a2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -12,7 +12,10 @@ scala: - 2.11.11 jdk: - - oraclejdk8 + - openjdk8 + +python: + - "3.7" addons: apt: From 2d6f60c51bbf5e1f1e1ecc6c212b42a6cf19433e Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 5 Jun 2019 10:18:36 -0400 Subject: [PATCH 139/380] Fixes to running python examples. --- project/PythonBuildPlugin.scala | 23 ++--- pyrasterframes/{python => }/README.md | 0 pyrasterframes/build.sbt | 3 - pyrasterframes/src/main/python/MANIFEST.in | 4 - pyrasterframes/src/main/python/README.md | 99 ++++++++++++++++++++++ pyrasterframes/src/main/python/README.rst | 77 ----------------- pyrasterframes/src/main/python/setup.py | 6 +- 7 files changed, 111 insertions(+), 101 deletions(-) rename pyrasterframes/{python => }/README.md (100%) delete mode 100644 pyrasterframes/src/main/python/MANIFEST.in create mode 100644 pyrasterframes/src/main/python/README.md delete mode 100644 pyrasterframes/src/main/python/README.rst diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 6a24dc0f3..beb7af513 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -38,25 +38,20 @@ object PythonBuildPlugin extends AutoPlugin { } import autoImport._ - val copyPySources = Def.task { + def copySources(srcDir: SettingKey[File], destDir: SettingKey[File]) = Def.task { val s = streams.value - val src = (Compile / pythonSource).value - val dest = (Python / target).value - if (!dest.exists()) dest.mkdirs() - s.log(s"Copying '$src' to '$dest'") + val src = srcDir.value + val dest = destDir.value + IO.delete(dest) + dest.mkdirs() + s.log.info(s"Copying '$src' to '$dest'") IO.copyDirectory(src, dest) dest } - val copyPyTestSources = Def.task { - val s = streams.value - val src = (Test / pythonSource).value - val dest = (Python / test / target).value - if (!dest.exists()) dest.mkdirs() - s.log(s"Copying '$src' to '$dest'") - IO.copyDirectory(src, dest) - dest - } + val copyPySources = copySources(Compile / pythonSource, Python / target) + + val copyPyTestSources = copySources(Test / pythonSource, Python / test / target) val buildWhl = Def.task { val buildDir = (Python / target).value diff --git a/pyrasterframes/python/README.md b/pyrasterframes/README.md similarity index 100% rename from pyrasterframes/python/README.md rename to pyrasterframes/README.md diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index bf08614de..570dc1385 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,8 +1,5 @@ import PythonBuildPlugin.autoImport.pySetup -Compile / pythonSource := baseDirectory.value / "python" -Test / pythonSource := baseDirectory.value / "python" / "tests" - exportJars := true lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") diff --git a/pyrasterframes/src/main/python/MANIFEST.in b/pyrasterframes/src/main/python/MANIFEST.in deleted file mode 100644 index cf48af02c..000000000 --- a/pyrasterframes/src/main/python/MANIFEST.in +++ /dev/null @@ -1,4 +0,0 @@ -include LICENSE.txt -include README.rst -recursive-include pyrasterframes *.jar -exclude *.in diff --git a/pyrasterframes/src/main/python/README.md b/pyrasterframes/src/main/python/README.md new file mode 100644 index 000000000..7daf8ed64 --- /dev/null +++ b/pyrasterframes/src/main/python/README.md @@ -0,0 +1,99 @@ +# PyRasterFrames + +PyRasterFrames is the Python API for Spark RasterFrames. + +Building RasterFrames requires [`sbt`](https://www.scala-sbt.org/), and all `sbt` commands referenced below must be +run from the root source directory, i.e. the parent of the `pyrasterframes` directory. Know that `sbt` is much +faster if run in "interactive" mode, where you launch `sbt` with no arguments, and subsequent commands are invoked +via an interactive shell. But for context clarity, we'll prefix each command example below with `sbt`. + +## Quickstart + +The quickest way to run a `pyspark` shell with the latest RasterFrames enabled is to run: + +```bash +sbt pySparkCmd +``` + +This will: + +1. Compile all the Scala/JVM code. +1. Merge all JVM code and dependencies into a single "assembly" JAR file. +1. Create the PyRasterFrames `.whl` package +1. Construct a temporary initialization script +1. Emit a `bash` command with requiesite arguments to load RasterFrames and import PyRasterFrames + +You then copy/paste the emitted command into your `bash` shell to start up a spark shell. It assumes you have +`pyspark` >= 2.3.2 installed in your environment. + +## Running Tests and Examples + +The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: + +```bash +sbt pyTests +``` + +Similarly, to run the examples in `pyrasterframes/python/examples`: + +```bash +sbt pyExamples +``` + +## Creating and Using a Build + +Assuming that `$SCALA_VER` is the major verison of Scala in use, and `$VER` is the version of RasterFrames, +the primary build artifacts are: + +* JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` +* Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` + +You build them with" + +```bash +sbt pyrasterframes/package +``` + +Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy "GAV" coordinates +`org.locationtech.rasterframes:pyrasterframes_$SCALA_VER:$VER`. + +Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). +The Python package is published under the `python` classifier, `zip` extension. + +## Build Internals + +### Running `setup.py` + +Before a build is initiated, the Python sources are copied to `pyrasterframes/target/python`. This ensures the +version controlled source directories are not polluted by `setuptools` residuals, better ensuring repeatable builds. To +simplify the process of working with `setup.py` in this context, a `pySetup` sbt interactive command is available. To +illustrate its usage, suppose we want to run a subset of the Python unit test. Instead of running `sbt pyTests` you can: + +```bash +sbt 'pySetup test --addopts "-k test_tile_creation"' +``` + +Or to run a specific example: + +```bash +sbt 'pySetup examples -e NDVI' +``` + +*Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* + +### `SparkSession` Setup + +To initialize PyRasterFrames in a generic Python shell: + +```python +from pyspark.sql import SparkSession +from pyrasterframes import * +from pyrasterframes.rasterfunctions import * +spark = SparkSession.builder \ + .master("local[*]") \ + .appName("Using RasterFrames") \ + .config("spark.some.config.option", "some-value") \ + .getOrCreate() \ + .withRasterFrames() +``` + diff --git a/pyrasterframes/src/main/python/README.rst b/pyrasterframes/src/main/python/README.rst deleted file mode 100644 index 20e557cc8..000000000 --- a/pyrasterframes/src/main/python/README.rst +++ /dev/null @@ -1,77 +0,0 @@ -============== -PyRasterFrames -============== - -PyRasterFrames provides a Python API for RasterFrames! - ------------- -SBT Commands ------------- - -Build the shaded JAR: - - ``$ sbt pyrasterframes/assembly`` - -Run tests: - - ``$ sbt pyrasterframes/pyTest`` - -Run examples: - - ``$ sbt pyrasterframes/pyExamples`` - - ---------------- -Python Commands ---------------- - -Install the python package (for development / local use): - - ``$ pip install -e python`` - - -To run tests and examples, ``$ cd python``, then: - -Run tests (if no Scala code has changed): - - ``$ python setup.py test`` - - To run verbosely: - ``$ python setup.py test --addopts -s`` - - To run a specific test: - ``$ python setup.py test --addopts "-k my_test_name"`` - - -Run examples: - - ``$ python setup.py examples [--e EXAMPLENAME,EXAMPLENAME]`` - - ------------ -Spark Usage ------------ - -*TODO: The following may be out of date.* - -Get a Spark REPL (after running ``$ sbt pyrasterframes/assembly``): - - ``$ pyspark --packages io.astraea:pyrasterframes:$VERSION --master local[2]`` - -You can then try some of the commands in ``python/tests/PyRasterFramesTests.py``. - -Submit a script (from the ``python`` directory): - - ``$ spark-submit --packages io.astraea:pyrasterframes:$VERSION --master local[2] \`` - ``examples/CreatingRasterFrames.py`` - -To initialize PyRasterFrames: - - >>> from pyrasterframes import * - >>> spark = SparkSession.builder \ - ... .master("local[*]") \ - ... .appName("Using RasterFrames") \ - ... .config("spark.some.config.option", "some-value") \ - ... .getOrCreate() \ - ... .withRasterFrames() - diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 038675a18..959fd8d7b 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -39,7 +39,7 @@ def _check_ex_path(ex): file = Path(ex) if not file.suffix: file = file.with_suffix('.py') - file = (Path('./examples') / file).resolve() + file = (Path(here) / 'examples' / file).resolve() assert file.is_file(), ('Invalid example %s' % file) return file @@ -48,13 +48,13 @@ def initialize_options(self): """Set default values for options.""" # Each user option must be listed here with their default value. self.examples = filter(lambda x: not x.name.startswith('_'), - list(Path('./examples').resolve().glob('*.py'))) + list((Path(here) / 'examples').resolve().glob('*.py'))) def finalize_options(self): """Post-process options.""" import re if isinstance(self.examples, str): - self.examples = re.split('\W+', self.examples) + self.examples = filter(lambda s: len(s) > 0, re.split('\W+', self.examples)) self.examples = map(lambda x: 'examples.' + x.stem, map(self._check_ex_path, self.examples)) From 36b963a82fd768a101f4eebef7dd58e207d78bf7 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 5 Jun 2019 11:48:11 -0400 Subject: [PATCH 140/380] Straggling PR feedback from #125. --- pyrasterframes/README.md | 100 +----------------- pyrasterframes/src/main/python/README.md | 27 +++-- .../src/main/python/examples/Clustering.py | 6 +- 3 files changed, 23 insertions(+), 110 deletions(-) diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index 9fb8b16e2..70b448567 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -1,101 +1,3 @@ # PyRasterFrames -PyRasterFrames is the Python API for Spark RasterFrames. - -Building RasterFrames requires [`sbt`](https://www.scala-sbt.org/), and all `sbt` commands referenced below must be -run from the root source directory, i.e. the parent of the `pyrasterframes` directory. Know that `sbt` is much -faster if run in "interactive" mode, where you launch `sbt` with no arguments, and subsequent commands are invoked -via an interactive shell. But for context clarity, we'll prefix each command example below with `sbt`. - -## Quickstart - -The quickest way to run a `pyspark` shell with the latest RasterFrames enabled is to run: - -```bash -sbt pySparkCmd -``` - -This will: - -1. Compile all the Scala/JVM code. -1. Merge all JVM code and dependencies into a single "assembly" JAR file. -1. Create the PyRasterFrames `.whl` package -1. Construct a temporary initialization script -1. Emit a `bash` command with requiesite arguments to load RasterFrames and import PyRasterFrames - -You then copy/paste the emitted command into your `bash` shell to start up a spark shell. It assumes you have -`pyspark` >= 2.3.2 installed in your environment. - -## Running Tests and Examples - -The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: - -```bash -sbt pyTests -``` - -Similarly, to run the examples in `pyrasterframes/python/examples`: - -```bash -sbt pyExamples -``` - -## Creating and Using a Build - -Assuming that `$SCALA_VER` is the major verison of Scala in use, and `$VER` is the version of RasterFrames, -the primary build artifacts are: - -* JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` -* Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` - -You build them with" - -```bash -sbt pyrasterframes/package -``` - -Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy "GAV" coordinates -`org.locationtech.rasterframes:pyrasterframes_$SCALA_VER:$VER`. - -Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). -The Python package is published under the `python` classifier, `zip` extension. - - -## Build Internals - -### Running `setup.py` - -Before a build is initiated, the Python sources are copied to `pyrasterframes/target/python`. This ensures the -version controlled source directories are not polluted by `setuptools` residuals, better ensuring repeatable builds. To -simplify the process of working with `setup.py` in this context, a `pySetup` sbt interactive command is available. To -illustrate its usage, suppose we want to run a subset of the Python unit test. Instead of running `sbt pyTests` you can: - -```bash -sbt pySetup test --addopts "-k test_tile_creation" -``` - -Or to run a specific example: - -```bash -sbt pySetup examples "--e NDVI.py" -``` - -*Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* - - -### `SparkSession` Setup - -To initialize PyRasterFrames in a generic Python shell: - -```python -# pyspark imports here... -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -spark = SparkSession.builder \ - .master("local[*]") \ - .appName("Using RasterFrames") \ - .config("spark.some.config.option", "some-value") \ - .getOrCreate() \ - .withRasterFrames() -``` - +See [here](src/main/python/README.md) for details. \ No newline at end of file diff --git a/pyrasterframes/src/main/python/README.md b/pyrasterframes/src/main/python/README.md index 7daf8ed64..333910afc 100644 --- a/pyrasterframes/src/main/python/README.md +++ b/pyrasterframes/src/main/python/README.md @@ -1,11 +1,20 @@ # PyRasterFrames -PyRasterFrames is the Python API for Spark RasterFrames. +PyRasterFrames is the Python API for Spark RasterFrames. -Building RasterFrames requires [`sbt`](https://www.scala-sbt.org/), and all `sbt` commands referenced below must be -run from the root source directory, i.e. the parent of the `pyrasterframes` directory. Know that `sbt` is much -faster if run in "interactive" mode, where you launch `sbt` with no arguments, and subsequent commands are invoked -via an interactive shell. But for context clarity, we'll prefix each command example below with `sbt`. + +## Prerequisites + +1. [`sbt`](https://www.scala-sbt.org/) +2. ['pyspark`](https://pypi.org/project/pyspark/) > 2.3.2 + +RasterFrames is primarily implmented in Scala, and as such uses the Scala build tool [`sbt`](https://www.scala-sbt.org/). +All `sbt` commands referenced below must be run from the root source directory, i.e. the parent of the `pyrasterframes` +directory, including Python-related build steps. + +As a tip, know that `sbt` is much faster if run in "interactive" mode, where you launch `sbt` with no arguments, +and subsequent commands are invoked via an interactive shell. But for context clarity, we'll prefix each command +example below with `sbt`. ## Quickstart @@ -21,7 +30,7 @@ This will: 1. Merge all JVM code and dependencies into a single "assembly" JAR file. 1. Create the PyRasterFrames `.whl` package 1. Construct a temporary initialization script -1. Emit a `bash` command with requiesite arguments to load RasterFrames and import PyRasterFrames +1. Emit a `bash` command with requisite arguments to start a pyspark interpreter with RasterFrames imports. You then copy/paste the emitted command into your `bash` shell to start up a spark shell. It assumes you have `pyspark` >= 2.3.2 installed in your environment. @@ -34,6 +43,8 @@ The PyRasterFrames unit tests can found in `/pyrasterframes/python/tes sbt pyTests ``` +*See also the below discussion of running `setup.py` for more options to run unit tests.* + Similarly, to run the examples in `pyrasterframes/python/examples`: ```bash @@ -42,13 +53,13 @@ sbt pyExamples ## Creating and Using a Build -Assuming that `$SCALA_VER` is the major verison of Scala in use, and `$VER` is the version of RasterFrames, +Assuming that `$SCALA_VER` is the major verison of Scala in use (e.g. 2.11) , and `$VER` is the version of RasterFrames, the primary build artifacts are: * JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` * Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` -You build them with" +You build them with: ```bash sbt pyrasterframes/package diff --git a/pyrasterframes/src/main/python/examples/Clustering.py b/pyrasterframes/src/main/python/examples/Clustering.py index 2fceeb5c9..2b6a99218 100644 --- a/pyrasterframes/src/main/python/examples/Clustering.py +++ b/pyrasterframes/src/main/python/examples/Clustering.py @@ -5,7 +5,7 @@ from pyspark.ml.feature import VectorAssembler from pyspark.ml.clustering import KMeans from pyspark.ml import Pipeline - +import os spark = example_session().withRasterFrames() @@ -18,9 +18,9 @@ # For each identified band, load the associated image file from functools import reduce joinedRF = reduce(lambda rf1, rf2: rf1.asRF().spatialJoin(rf2.drop('bounds').drop('metadata').drop('extent').drop('crs')), - map(lambda bf: spark.read.geotiff(bf[1]) \ + map(lambda bf: spark.read.geotiff(bf[1]) .withColumnRenamed('tile', 'band_{}'.format(bf[0])), - map(lambda b: (b, resource_dir.joinpath(filenamePattern.format(b)).as_uri()), bandNumbers))) + map(lambda b: (b, os.path.join(resource_dir, filenamePattern.format(b))), bandNumbers))) # We should see a single spatial_key column along with columns of tiles. joinedRF.printSchema() From 72dc48d00c889f4f196825437278d2b632f341a6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 5 Jun 2019 21:43:23 -0400 Subject: [PATCH 141/380] Another attempt at reattempting reads after BufferUnderflowException. --- .../rasterframes/ref/RasterSource.scala | 101 ++++++++++-------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 4e7e10ac5..1d5844b28 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -191,7 +191,25 @@ object RasterSource extends LazyLogging { /** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ abstract class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRasterSource) extends RasterSource with URIRasterSource { @transient - lazy val delegate = delegateBuilder() + @volatile + private var _delRef: GTRasterSource = _ + + private def retryableRead[R >: Null](f: GTRasterSource => R): R = synchronized { + try { + if (_delRef == null) + _delRef = delegateBuilder() + f(_delRef) + } + catch { + // On this exeception we attempt to recreate the delegate and read again. + case be: java.nio.BufferUnderflowException => + _delRef = null + val newDel = delegateBuilder() + val result = f(newDel) + _delRef = newDel + result + } + } // Bad, bad, bad? override def equals(obj: Any): Boolean = obj match { @@ -201,16 +219,16 @@ object RasterSource extends LazyLogging { override def hashCode(): Int = source.hashCode() // This helps reduce header reads between serializations - lazy val info: SimpleGeoTiffInfo = { + lazy val info: SimpleGeoTiffInfo = retryableRead { rs => SimpleGeoTiffInfo( - delegate.cols, - delegate.rows, - delegate.cellType, - delegate.extent, - delegate.rasterExtent, - delegate.crs, + rs.cols, + rs.rows, + rs.cellType, + rs.extent, + rs.rasterExtent, + rs.crs, fetchTags, - delegate.bandCount, + rs.bandCount, None ) } @@ -221,53 +239,48 @@ object RasterSource extends LazyLogging { override def extent: Extent = info.extent override def cellType: CellType = info.cellType override def bandCount: Int = info.bandCount - private def fetchTags: Tags = delegate match { + private def fetchTags: Tags = retryableRead { case rs: GeoTiffRasterSource => rs.tiff.tags case _ => EMPTY_TAGS } override def tags: Tags = info.tags - private def readWithRetry[R >: Null](f: () => R): R = { - val retryLimit = 10 - var result: R = null - var cnt = 0 - while(result == null && cnt < retryLimit) { - cnt = cnt + 1 - try { - result = f() - } - catch { - case be: java.nio.BufferUnderflowException => - if (cnt == 1) - logger.warn("Retrying read to " + source) - if (cnt == retryLimit) { - logger.warn(s"Failed to read '$source' after $cnt tries") - throw be - } - else Thread.sleep(100) - () - } - } - result - } +// private def readWithRetry[R >: Null](f: () => R): R = { +// val retryLimit = 10 +// var result: R = null +// var cnt = 0 +// while(result == null && cnt < retryLimit) { +// cnt = cnt + 1 +// try { +// result = f() +// } +// catch { +// case be: java.nio.BufferUnderflowException => +// if (cnt == 1) +// logger.warn("Retrying read to " + source) +// if (cnt == retryLimit) { +// logger.warn(s"Failed to read '$source' after $cnt tries") +// throw be +// } +// else Thread.sleep(100) +// () +// } +// } +// result +// } + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = - readWithRetry(() => - delegate.readBounds(bounds, bands) - ) + retryableRead(_.readBounds(bounds, bands)) override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = - readWithRetry(() => - delegate - .read(bounds, bands) - .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) + retryableRead(_.read(bounds, bands) + .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) ) override def read(extent: Extent, bands: Seq[Int]): Raster[MultibandTile] = - readWithRetry(() => - delegate - .read(extent, bands) - .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) + retryableRead(_.read(extent, bands) + .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) ) } From dc561dc9ad49eca043a6a0465f11d18d09566db1 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 6 Jun 2019 09:54:07 -0400 Subject: [PATCH 142/380] Another round of CRS comparision improvements. --- bench/archive/jmh-results-20190606082738.json | 269 ++++++++++++++++++ bench/archive/jmh-results-20190606094001.json | 269 ++++++++++++++++++ .../rasterframes/bench/CRSBench.scala | 29 +- .../rasterframes/expressions/package.scala | 4 + .../transformers/ReprojectGeometry.scala | 30 +- .../rasterframes/functions/package.scala | 2 +- .../rasterframes/model/LazyCRS.scala | 14 +- .../rasterframes/ref/RasterSource.scala | 25 -- ...Spec.scala => GeometryFunctionsSpec.scala} | 41 ++- .../rasterframes/GeometryOperationsSpec.scala | 77 ----- .../locationtech/rasterframes/TestData.scala | 19 +- .../rasterframes/model/LazyCRSSpec.scala | 43 +++ .../geotrellis/GeoTrellisDataSourceSpec.scala | 2 +- project/BenchmarkPlugin.scala | 4 +- project/plugins.sbt | 2 +- 15 files changed, 700 insertions(+), 130 deletions(-) create mode 100644 bench/archive/jmh-results-20190606082738.json create mode 100644 bench/archive/jmh-results-20190606094001.json rename core/src/test/scala/org/locationtech/rasterframes/{JTSSpec.scala => GeometryFunctionsSpec.scala} (77%) delete mode 100644 core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala create mode 100644 core/src/test/scala/org/locationtech/rasterframes/model/LazyCRSSpec.scala diff --git a/bench/archive/jmh-results-20190606082738.json b/bench/archive/jmh-results-20190606082738.json new file mode 100644 index 000000000..b8e7467b1 --- /dev/null +++ b/bench/archive/jmh-results-20190606082738.json @@ -0,0 +1,269 @@ +[ + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalEqualsFalse", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 13.115296907959536, + "scoreError" : 2.5400077963191556, + "scoreConfidence" : [ + 10.57528911164038, + 15.655304704278691 + ], + "scorePercentiles" : { + "0.0" : 12.590614558661818, + "50.0" : 12.853830352008682, + "90.0" : 14.25982363939229, + "95.0" : 14.25982363939229, + "99.0" : 14.25982363939229, + "99.9" : 14.25982363939229, + "99.99" : 14.25982363939229, + "99.999" : 14.25982363939229, + "99.9999" : 14.25982363939229, + "100.0" : 14.25982363939229 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 12.853830352008682, + 12.590614558661818, + 12.829707376038487, + 14.25982363939229, + 13.042508613696407 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalEqualsTrue", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 6.5973550106567345, + "scoreError" : 0.1946737881542353, + "scoreConfidence" : [ + 6.402681222502499, + 6.7920287988109695 + ], + "scorePercentiles" : { + "0.0" : 6.523477357639692, + "50.0" : 6.6063669572343695, + "90.0" : 6.648688182671118, + "95.0" : 6.648688182671118, + "99.0" : 6.648688182671118, + "99.9" : 6.648688182671118, + "99.99" : 6.648688182671118, + "99.999" : 6.648688182671118, + "99.9999" : 6.648688182671118, + "100.0" : 6.648688182671118 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 6.635409622463296, + 6.523477357639692, + 6.648688182671118, + 6.572832933275196, + 6.6063669572343695 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalLazyEqualsFalse", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 13.265730662256157, + "scoreError" : 1.915211216125259, + "scoreConfidence" : [ + 11.350519446130898, + 15.180941878381416 + ], + "scorePercentiles" : { + "0.0" : 12.850610015459289, + "50.0" : 13.13459015560355, + "90.0" : 14.120588306765669, + "95.0" : 14.120588306765669, + "99.0" : 14.120588306765669, + "99.9" : 14.120588306765669, + "99.99" : 14.120588306765669, + "99.999" : 14.120588306765669, + "99.9999" : 14.120588306765669, + "100.0" : 14.120588306765669 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 13.215365538647765, + 13.13459015560355, + 13.007499294804513, + 12.850610015459289, + 14.120588306765669 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalLazyEqualsTrue", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.040409137130485946, + "scoreError" : 0.007586963982726796, + "scoreConfidence" : [ + 0.03282217314775915, + 0.047996101113212744 + ], + "scorePercentiles" : { + "0.0" : 0.03867633630965359, + "50.0" : 0.04003336568127626, + "90.0" : 0.04377238392008154, + "95.0" : 0.04377238392008154, + "99.0" : 0.04377238392008154, + "99.9" : 0.04377238392008154, + "99.99" : 0.04377238392008154, + "99.999" : 0.04377238392008154, + "99.9999" : 0.04377238392008154, + "100.0" : 0.04377238392008154 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.03867633630965359, + 0.04003336568127626, + 0.04016005719940341, + 0.03940354254201491, + 0.04377238392008154 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.resolveCRS", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.06507083680791029, + "scoreError" : 0.003209489715829842, + "scoreConfidence" : [ + 0.061861347092080445, + 0.06828032652374012 + ], + "scorePercentiles" : { + "0.0" : 0.06425209212071442, + "50.0" : 0.06461825090771647, + "90.0" : 0.06612649264562556, + "95.0" : 0.06612649264562556, + "99.0" : 0.06612649264562556, + "99.9" : 0.06612649264562556, + "99.99" : 0.06612649264562556, + "99.999" : 0.06612649264562556, + "99.9999" : 0.06612649264562556, + "100.0" : 0.06612649264562556 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.06612649264562556, + 0.06579754694820603, + 0.06461825090771647, + 0.06425209212071442, + 0.06455980141728893 + ] + ] + }, + "secondaryMetrics" : { + } + } +] + + diff --git a/bench/archive/jmh-results-20190606094001.json b/bench/archive/jmh-results-20190606094001.json new file mode 100644 index 000000000..02cdd3194 --- /dev/null +++ b/bench/archive/jmh-results-20190606094001.json @@ -0,0 +1,269 @@ +[ + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalEqualsFalse", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 13.076857373851485, + "scoreError" : 1.6593497203225103, + "scoreConfidence" : [ + 11.417507653528975, + 14.736207094173995 + ], + "scorePercentiles" : { + "0.0" : 12.633328785860648, + "50.0" : 13.200439575276704, + "90.0" : 13.659196200240215, + "95.0" : 13.659196200240215, + "99.0" : 13.659196200240215, + "99.9" : 13.659196200240215, + "99.99" : 13.659196200240215, + "99.999" : 13.659196200240215, + "99.9999" : 13.659196200240215, + "100.0" : 13.659196200240215 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 13.659196200240215, + 12.665249239331997, + 13.200439575276704, + 13.226073068547855, + 12.633328785860648 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalEqualsTrue", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.2775587837304895, + "scoreError" : 0.015896893581796353, + "scoreConfidence" : [ + 0.2616618901486931, + 0.29345567731228583 + ], + "scorePercentiles" : { + "0.0" : 0.2724269842972383, + "50.0" : 0.2775487008943729, + "90.0" : 0.2816631615036355, + "95.0" : 0.2816631615036355, + "99.0" : 0.2816631615036355, + "99.9" : 0.2816631615036355, + "99.99" : 0.2816631615036355, + "99.999" : 0.2816631615036355, + "99.9999" : 0.2816631615036355, + "100.0" : 0.2816631615036355 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.28157426698598376, + 0.2816631615036355, + 0.27458080497121706, + 0.2775487008943729, + 0.2724269842972383 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalLazyEqualsFalse", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 13.143184640034391, + "scoreError" : 0.6865674500293741, + "scoreConfidence" : [ + 12.456617190005018, + 13.829752090063765 + ], + "scorePercentiles" : { + "0.0" : 12.925994808467195, + "50.0" : 13.17768387931118, + "90.0" : 13.341295384511856, + "95.0" : 13.341295384511856, + "99.0" : 13.341295384511856, + "99.9" : 13.341295384511856, + "99.99" : 13.341295384511856, + "99.999" : 13.341295384511856, + "99.9999" : 13.341295384511856, + "100.0" : 13.341295384511856 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 13.341295384511856, + 13.17768387931118, + 12.925994808467195, + 12.995056782282637, + 13.27589234559909 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.logicalLazyEqualsTrue", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.03659740987415034, + "scoreError" : 0.0011385555881718446, + "scoreConfidence" : [ + 0.035458854285978496, + 0.037735965462322184 + ], + "scorePercentiles" : { + "0.0" : 0.036314017083098636, + "50.0" : 0.0364980924818408, + "90.0" : 0.03691511396572689, + "95.0" : 0.03691511396572689, + "99.0" : 0.03691511396572689, + "99.9" : 0.03691511396572689, + "99.99" : 0.03691511396572689, + "99.999" : 0.03691511396572689, + "99.9999" : 0.03691511396572689, + "100.0" : 0.03691511396572689 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.036314017083098636, + 0.03635019813669222, + 0.0364980924818408, + 0.03691511396572689, + 0.03690962770339316 + ] + ] + }, + "secondaryMetrics" : { + } + }, + { + "jmhVersion" : "1.21", + "benchmark" : "org.locationtech.rasterframes.bench.CRSBench.resolveCRS", + "mode" : "avgt", + "threads" : 1, + "forks" : 1, + "jvm" : "/Library/Java/JavaVirtualMachines/jdk1.8.0_171.jdk/Contents/Home/jre/bin/java", + "jvmArgs" : [ + "-Xmx2048M", + "-Xmx4g" + ], + "jdkVersion" : "1.8.0_171", + "vmName" : "Java HotSpot(TM) 64-Bit Server VM", + "vmVersion" : "25.171-b11", + "warmupIterations" : 8, + "warmupTime" : "10 s", + "warmupBatchSize" : 1, + "measurementIterations" : 5, + "measurementTime" : "10 s", + "measurementBatchSize" : 1, + "primaryMetric" : { + "score" : 0.06517305542168148, + "scoreError" : 0.005310236878903678, + "scoreConfidence" : [ + 0.05986281854277779, + 0.07048329230058516 + ], + "scorePercentiles" : { + "0.0" : 0.06355938701044708, + "50.0" : 0.06512777854120488, + "90.0" : 0.06700762802360496, + "95.0" : 0.06700762802360496, + "99.0" : 0.06700762802360496, + "99.9" : 0.06700762802360496, + "99.99" : 0.06700762802360496, + "99.999" : 0.06700762802360496, + "99.9999" : 0.06700762802360496, + "100.0" : 0.06700762802360496 + }, + "scoreUnit" : "us/op", + "rawData" : [ + [ + 0.06700762802360496, + 0.06512777854120488, + 0.06418521981870606, + 0.06598526371444442, + 0.06355938701044708 + ] + ] + }, + "secondaryMetrics" : { + } + } +] + + diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala index 04abc0b2b..424533b58 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/CRSBench.scala @@ -23,7 +23,7 @@ package org.locationtech.rasterframes.bench import java.util.concurrent.TimeUnit -import geotrellis.proj4.{CRS, LatLng} +import geotrellis.proj4.{CRS, LatLng, WebMercator} import org.locationtech.proj4j.CoordinateReferenceSystem import org.locationtech.rasterframes.model.LazyCRS import org.openjdk.jmh.annotations._ @@ -33,24 +33,37 @@ import org.openjdk.jmh.annotations._ @OutputTimeUnit(TimeUnit.MICROSECONDS) class CRSBench extends SparkEnv { - var crs: CRS = _ + var crs1: CRS = _ + var crs2: CRS = _ @Setup(Level.Invocation) def setupData(): Unit = { - crs = LazyCRS("epsg:4326") + crs1 = LazyCRS("epsg:4326") + crs2 = LazyCRS(WebMercator.toProj4String) } + @Benchmark def resolveCRS(): CoordinateReferenceSystem = { - crs.proj4jCrs + crs1.proj4jCrs + } + + @Benchmark + def logicalEqualsTrue(): Boolean = { + crs1 == LatLng + } + + @Benchmark + def logicalEqualsFalse(): Boolean = { + crs1 == WebMercator } @Benchmark - def selfEquals(): Boolean = { - crs == crs + def logicalLazyEqualsTrue(): Boolean = { + crs1 == crs1 } @Benchmark - def logicalEquals(): Boolean = { - crs == LatLng + def logicalLazyEqualsFalse(): Boolean = { + crs1 == crs2 } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 97d87fc5b..432c66888 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -126,5 +126,9 @@ package object expressions { registry.registerExpression[DebugRender.RenderAscii]("rf_render_ascii") registry.registerExpression[DebugRender.RenderMatrix]("rf_render_matrix") + + // TODO: Replace registration in `org.locationtech.rasterframes.functions.register` + // TODO: with this once String columns are supported as well. + // registry.registerExpression[transformers.ReprojectGeometry]("st_reproject") } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala index 1b85ffc59..89ad88fae 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -34,15 +34,26 @@ import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.rasterframes.encoders.CatalystSerializer import org.locationtech.rasterframes.jts.ReprojectionTransformer +import org.locationtech.rasterframes.model.LazyCRS -/** - * - * - * @since 11/29/18 - */ +@ExpressionDescription( + usage = "_FUNC_(geom, srcCRS, dstCRS) - Reprojects the given `geom` from `srcCRS` to `dstCRS", + arguments = """ + Arguments: + * geom - the geometry column to reproject + * srcCRS - the CRS of the `geom` column + * dstCRS - the CRS to project geometry into""", + examples = """ + Examples: + > SELECT _FUNC_(geom, srcCRS, dstCRS); + ...""" +) case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: Expression) extends Expression with CodegenFallback with ExpectsInputTypes { + // TODO: Replace registration in `org.locationtech.rasterframes.functions.register` + // TODO: with proper Expression supporting String columns as well. + override def nodeName: String = "st_reproject" override def dataType: DataType = JTSTypes.GeometryTypeInstance override def nullable: Boolean = geometry.nullable || srcCRS.nullable || dstCRS.nullable @@ -60,10 +71,15 @@ case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: E } override def eval(input: InternalRow): Any = { - val geom = JTSTypes.GeometryTypeInstance.deserialize(geometry.eval(input)) val src = srcCRS.eval(input).asInstanceOf[InternalRow].to[CRS] val dst = dstCRS.eval(input).asInstanceOf[InternalRow].to[CRS] - JTSTypes.GeometryTypeInstance.serialize(reproject(geom, src, dst)) + (src, dst) match { + // Optimized pass-through case. + case (s: LazyCRS, r: LazyCRS) if s.encoded == r.encoded => geometry.eval(input) + case _ => + val geom = JTSTypes.GeometryTypeInstance.deserialize(geometry.eval(input)) + JTSTypes.GeometryTypeInstance.serialize(reproject(geom, src, dst)) + } } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index c72efb52d..427dc504c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -149,8 +149,8 @@ package object functions { sqlContext.udf.register("rf_cell_types", cellTypes) sqlContext.udf.register("rf_rasterize", rasterize) + // TODO: replace this with full ReprojectGeometry with String handling. sqlContext.udf.register("st_reproject", reprojectGeometryCRSName) sqlContext.udf.register("rf_array_to_tile", arrayToTile) - } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala index a63c54ab8..66352e258 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/LazyCRS.scala @@ -34,8 +34,14 @@ class LazyCRS(val encoded: EncodedCRS) extends CRS { else delegate.toProj4String override def equals(o: Any): Boolean = o match { - case l: LazyCRS => encoded == l.encoded || super.equals(o) - case c => delegate.equals(c) + case l: LazyCRS => + encoded == l.encoded || + toProj4String == l.toProj4String || + super.equals(o) + case c: CRS => + toProj4String == c.toProj4String || + delegate.equals(c) + case _ => false } } @@ -53,7 +59,9 @@ object LazyCRS { @transient private lazy val cache = Scaffeine().build[String, CRS](mapper) - def apply(value: String): CRS = { + def apply(crs: CRS): LazyCRS = apply(crs.toProj4String) + + def apply(value: String): LazyCRS = { if (mapper.isDefinedAt(value)) { new LazyCRS(value.asInstanceOf[EncodedCRS]) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 1d5844b28..2d07bb129 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -245,31 +245,6 @@ object RasterSource extends LazyLogging { } override def tags: Tags = info.tags -// private def readWithRetry[R >: Null](f: () => R): R = { -// val retryLimit = 10 -// var result: R = null -// var cnt = 0 -// while(result == null && cnt < retryLimit) { -// cnt = cnt + 1 -// try { -// result = f() -// } -// catch { -// case be: java.nio.BufferUnderflowException => -// if (cnt == 1) -// logger.warn("Retrying read to " + source) -// if (cnt == retryLimit) { -// logger.warn(s"Failed to read '$source' after $cnt tries") -// throw be -// } -// else Thread.sleep(100) -// () -// } -// } -// result -// } - - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = retryableRead(_.readBounds(bounds, bands)) diff --git a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala similarity index 77% rename from core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala rename to core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala index 92bd42b4d..5a7c0b813 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/JTSSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala @@ -24,14 +24,17 @@ package org.locationtech.rasterframes import geotrellis.proj4.{LatLng, Sinusoidal, WebMercator} import geotrellis.vector.{Extent, Point => GTPoint} import org.locationtech.jts.geom._ +import spray.json.JsNumber /** * Test rig for operations providing interop with JTS types. * * @since 12/16/17 */ -class JTSSpec extends TestEnvironment with TestData with StandardColumns { - describe("JTS interop") { +class GeometryFunctionsSpec extends TestEnvironment with TestData with StandardColumns { + import spark.implicits._ + + describe("Vector geometry operations") { val rf = l8Sample(1).projectedRaster.toRF(10, 10).withGeometry() it("should allow joining and filtering of tiles based on points") { import spark.implicits._ @@ -70,7 +73,7 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { } it("should allow construction of geometry literals") { - import JTS._ + import GeomData._ assert(dfBlank.select(geomLit(point)).first === point) assert(dfBlank.select(geomLit(line)).first === line) assert(dfBlank.select(geomLit(poly)).first === poly) @@ -128,6 +131,38 @@ class JTSSpec extends TestEnvironment with TestData with StandardColumns { val wm4 = sql("SELECT st_reproject(ll, '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', 'EPSG:3857') AS wm4 from geom") .as[Geometry].first() wm4 should matchGeom(webMercator, 0.00001) + + // TODO: See comment in `org.locationtech.rasterframes.expressions.register` for + // TODO: what needs to happen to support this. + //checkDocs("st_reproject") } } + + it("should rasterize geometry") { + val rf = l8Sample(1).projectedRaster.toRF.withGeometry() + val df = GeomData.features.map(f ⇒ ( + f.geom.reproject(LatLng, rf.crs).jtsGeom, + f.data.fields("id").asInstanceOf[JsNumber].value.intValue() + )).toDF("geom", "__fid__") + + val toRasterize = rf.crossJoin(df) + + val tlm = rf.tileLayerMetadata.merge + + val (cols, rows) = tlm.layout.tileLayout.tileDimensions + + val rasterized = toRasterize.withColumn("rasterized", rf_rasterize($"geom", GEOMETRY_COLUMN, $"__fid__", cols, rows)) + + assert(rasterized.count() === df.count() * rf.count()) + assert(rasterized.select(rf_dimensions($"rasterized")).distinct().count() === 1) + val pixelCount = rasterized.select(rf_agg_data_cells($"rasterized")).first() + assert(pixelCount < cols * rows) + + + toRasterize.createOrReplaceTempView("stuff") + val viaSQL = sql(s"select rf_rasterize(geom, geometry, __fid__, $cols, $rows) as rasterized from stuff") + assert(viaSQL.select(rf_agg_data_cells($"rasterized")).first === pixelCount) + + //rasterized.select($"rasterized".as[Tile]).foreach(t ⇒ t.renderPng(ColorMaps.IGBP).write("target/" + t.hashCode() + ".png")) + } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala deleted file mode 100644 index 0da6035a0..000000000 --- a/core/src/test/scala/org/locationtech/rasterframes/GeometryOperationsSpec.scala +++ /dev/null @@ -1,77 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package org.locationtech.rasterframes - -import java.nio.file.{Files, Paths} - -import geotrellis.proj4.LatLng -import geotrellis.vector.io._ -import geotrellis.vector.io.json.JsonFeatureCollection -import spray.json.DefaultJsonProtocol._ -import spray.json._ - -import scala.collection.JavaConversions._ - -/** - * - * - * @since 5/30/18 - */ -class GeometryOperationsSpec extends TestEnvironment with TestData { - val geoJson = { - val p = Paths.get(getClass.getResource("/L8-Labels-Elkton-VA.geojson").toURI) - Files.readAllLines(p).mkString("\n") - } - - describe("Geometery operations") { - import spark.implicits._ - it("should rasterize geometry") { - val rf = l8Sample(1).projectedRaster.toRF.withGeometry() - - val features = geoJson.parseGeoJson[JsonFeatureCollection].getAllPolygonFeatures[JsObject]() - val df = features.map(f ⇒ ( - f.geom.reproject(LatLng, rf.crs).jtsGeom, - f.data.fields("id").asInstanceOf[JsNumber].value.intValue() - )).toDF("geom", "__fid__") - - val toRasterize = rf.crossJoin(df) - - val tlm = rf.tileLayerMetadata.merge - - val (cols, rows) = tlm.layout.tileLayout.tileDimensions - - val rasterized = toRasterize.withColumn("rasterized", rf_rasterize($"geom", GEOMETRY_COLUMN, $"__fid__", cols, rows)) - - assert(rasterized.count() === df.count() * rf.count()) - assert(rasterized.select(rf_dimensions($"rasterized")).distinct().count() === 1) - val pixelCount = rasterized.select(rf_agg_data_cells($"rasterized")).first() - assert(pixelCount < cols * rows) - - - toRasterize.createOrReplaceTempView("stuff") - val viaSQL = sql(s"select rf_rasterize(geom, geometry, __fid__, $cols, $rows) as rasterized from stuff") - assert(viaSQL.select(rf_agg_data_cells($"rasterized")).first === pixelCount) - - //rasterized.select($"rasterized".as[Tile]).foreach(t ⇒ t.renderPng(ColorMaps.IGBP).write("target/" + t.hashCode() + ".png")) - } - } -} diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index 7acaea7f1..a149f6b2a 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -22,7 +22,7 @@ package org.locationtech.rasterframes import java.net.URI -import java.nio.file.Paths +import java.nio.file.{Files, Paths} import java.time.ZonedDateTime import geotrellis.proj4.{CRS, LatLng} @@ -32,6 +32,7 @@ import geotrellis.raster.io.geotiff.{MultibandGeoTiff, SinglebandGeoTiff} import geotrellis.spark._ import geotrellis.spark.testkit.TileLayerRDDBuilders import geotrellis.spark.tiling.LayoutDefinition +import geotrellis.vector.io.json.JsonFeatureCollection import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.commons.io.IOUtils import org.apache.spark.SparkContext @@ -39,6 +40,7 @@ import org.apache.spark.sql.SparkSession import org.locationtech.jts.geom.{Coordinate, GeometryFactory} import org.locationtech.rasterframes.expressions.tilestats.NoDataCells import org.locationtech.rasterframes.tiles.ProjectedRasterTile +import spray.json.JsObject import scala.reflect.ClassTag @@ -149,7 +151,7 @@ trait TestData { lazy val l8samplePath: URI = getClass.getResource("/L8-B1-Elkton-VA.tiff").toURI lazy val modisConvertedMrfPath: URI = getClass.getResource("/MCD43A4.A2019111.h30v06.006.2019120033434_01.mrf").toURI - object JTS { + object GeomData { val fact = new GeometryFactory() val c1 = new Coordinate(1, 2) val c2 = new Coordinate(3, 4) @@ -162,6 +164,19 @@ trait TestData { val mpoly = fact.createMultiPolygon(Array(poly, poly, poly)) val coll = fact.createGeometryCollection(Array(point, line, poly, mpoint, mline, mpoly)) val all = Seq(point, line, poly, mpoint, mline, mpoly, coll) + lazy val geoJson = { + import scala.collection.JavaConversions._ + val p = Paths.get(TestData.getClass + .getResource("/L8-Labels-Elkton-VA.geojson").toURI) + Files.readAllLines(p).mkString("\n") + } + lazy val features = { + import geotrellis.vector.io._ + import geotrellis.vector.io.json.JsonFeatureCollection + import spray.json.DefaultJsonProtocol._ + import spray.json._ + GeomData.geoJson.parseGeoJson[JsonFeatureCollection].getAllPolygonFeatures[JsObject]() + } } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/model/LazyCRSSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/model/LazyCRSSpec.scala new file mode 100644 index 000000000..1762c402e --- /dev/null +++ b/core/src/test/scala/org/locationtech/rasterframes/model/LazyCRSSpec.scala @@ -0,0 +1,43 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.model + +import geotrellis.proj4.{CRS, LatLng, Sinusoidal, WebMercator} +import org.scalatest._ + +class LazyCRSSpec extends FunSpec with Matchers { + val sinPrj = "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs" + val llPrj = "epsg:4326" + describe("LazyCRS") { + it("should implement equals") { + LazyCRS(WebMercator) should be(LazyCRS(WebMercator)) + LazyCRS(WebMercator) should be(WebMercator) + WebMercator should be(LazyCRS(WebMercator)) + LazyCRS(sinPrj) should be (Sinusoidal) + CRS.fromString(sinPrj) should be (LazyCRS(Sinusoidal)) + LazyCRS(llPrj) should be(LatLng) + LazyCRS(LatLng) should be(LatLng) + LatLng should be(LazyCRS(llPrj)) + LatLng should be(LazyCRS(LatLng)) + } + } +} diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index 6333138aa..aefe01f07 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -298,7 +298,7 @@ class GeoTrellisDataSourceSpec it("should support query with multiple geometry types") { // Mostly just testing that these evaluate without catalyst type errors. - forEvery(JTS.all) { g ⇒ + forEvery(GeomData.all) { g ⇒ val query = layerReader.loadRF(layer).where(GEOMETRY_COLUMN.intersects(g)) .persist(StorageLevel.OFF_HEAP) assert(query.count() === 0) diff --git a/project/BenchmarkPlugin.scala b/project/BenchmarkPlugin.scala index f795fe536..e4f1d1acc 100644 --- a/project/BenchmarkPlugin.scala +++ b/project/BenchmarkPlugin.scala @@ -70,7 +70,7 @@ object BenchmarkPlugin extends AutoPlugin { val pat = (".*" + file + ".*").r jmhRun(pat) }.evaluated, - libraryDependencies += "org.openjdk.jmh" % "jmh-generator-annprocess" % "1.19" + libraryDependencies += "org.openjdk.jmh" % "jmh-generator-annprocess" % "1.21" ) def jmhRun(filePattern: Regex) = Def.taskDyn { @@ -94,7 +94,7 @@ object BenchmarkPlugin extends AutoPlugin { (run in Jmh).toTask(args) } - val benchFilesParser: Def.Initialize[State => Parser[File]] = Def.setting { (state: State) => + val benchFilesParser: Def.Initialize[State => Parser[File]] = Def.setting { state: State => val extracted = Project.extract(state) val pat = new PatternFilter( extracted.getOpt(jmhFileRegex).getOrElse(".*".r).pattern diff --git a/project/plugins.sbt b/project/plugins.sbt index 783f50a06..2aeb87262 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -9,7 +9,7 @@ addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.6.10") addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.2") addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.3.2") addSbtPlugin("com.lightbend.paradox" % "sbt-paradox" % "0.5.0") -addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.4") +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.6") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.1") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") addSbtPlugin("org.spark-packages" % "sbt-spark-package" % "0.2.7-astraea.1") From 7e71fcd36df73c6079cf10b517a4ed880bc911bb Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 6 Jun 2019 13:30:30 -0400 Subject: [PATCH 143/380] Initial pweave framework. --- project/PythonBuildPlugin.scala | 16 ++--- .../src/main/python/examples/Clustering.py | 2 +- .../python/examples/CreatingRasterFrames.py | 2 +- .../src/main/python/examples/MeanValue.py | 2 +- .../src/main/python/examples/NDVI.py | 4 +- .../src/main/python/examples/__init__.py | 6 +- pyrasterframes/src/main/python/setup.py | 62 +++++++++++++++++-- 7 files changed, 74 insertions(+), 20 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index beb7af513..63febc115 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -38,20 +38,22 @@ object PythonBuildPlugin extends AutoPlugin { } import autoImport._ - def copySources(srcDir: SettingKey[File], destDir: SettingKey[File]) = Def.task { + def copySources(srcDir: SettingKey[File], destDir: SettingKey[File], deleteFirst: Boolean) = Def.task { val s = streams.value val src = srcDir.value val dest = destDir.value - IO.delete(dest) + if (deleteFirst) + IO.delete(dest) dest.mkdirs() s.log.info(s"Copying '$src' to '$dest'") IO.copyDirectory(src, dest) dest } - val copyPySources = copySources(Compile / pythonSource, Python / target) - - val copyPyTestSources = copySources(Test / pythonSource, Python / test / target) + val copyPySources = Def.sequential( + copySources(Compile / pythonSource, Python / target, true), + copySources(Test / pythonSource, Python / test / target, false) + ) val buildWhl = Def.task { val buildDir = (Python / target).value @@ -76,7 +78,8 @@ object PythonBuildPlugin extends AutoPlugin { pythonCommand := "python", pySetup := { val s = streams.value - val wd = copyPySources.value + val _ = copyPySources.value + val wd = (Python / target).value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args val ver = version.value @@ -111,7 +114,6 @@ object PythonBuildPlugin extends AutoPlugin { }, test := Def.sequential( assembly, - copyPyTestSources, pySetup.toTask(" test") ).value, testQuick := pySetup.toTask(" test").value diff --git a/pyrasterframes/src/main/python/examples/Clustering.py b/pyrasterframes/src/main/python/examples/Clustering.py index 2b6a99218..be66b7b38 100644 --- a/pyrasterframes/src/main/python/examples/Clustering.py +++ b/pyrasterframes/src/main/python/examples/Clustering.py @@ -1,4 +1,4 @@ -from . import example_session, resource_dir +from examples import example_session, resource_dir from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyspark.sql import * diff --git a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py index 5c018fee8..a0a0d7fa5 100644 --- a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py +++ b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py @@ -1,4 +1,4 @@ -from . import resource_dir, example_session +from examples import resource_dir, example_session from pyrasterframes import * from pyspark.sql import * import os diff --git a/pyrasterframes/src/main/python/examples/MeanValue.py b/pyrasterframes/src/main/python/examples/MeanValue.py index 1bec83c64..976adc3fe 100644 --- a/pyrasterframes/src/main/python/examples/MeanValue.py +++ b/pyrasterframes/src/main/python/examples/MeanValue.py @@ -1,4 +1,4 @@ -from . import resource_dir, example_session +from examples import resource_dir, example_session from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyspark.sql import * diff --git a/pyrasterframes/src/main/python/examples/NDVI.py b/pyrasterframes/src/main/python/examples/NDVI.py index 7fb4d28d2..a3549cc84 100644 --- a/pyrasterframes/src/main/python/examples/NDVI.py +++ b/pyrasterframes/src/main/python/examples/NDVI.py @@ -1,4 +1,4 @@ -from . import resource_dir, example_session +from examples import resource_dir, example_session from pyrasterframes import * from pyrasterframes.rasterfunctions import * import os @@ -13,4 +13,4 @@ rf.printSchema() rf.show(20) -spark.stop() \ No newline at end of file +spark.stop() diff --git a/pyrasterframes/src/main/python/examples/__init__.py b/pyrasterframes/src/main/python/examples/__init__.py index 8bd561d0a..190f8712b 100644 --- a/pyrasterframes/src/main/python/examples/__init__.py +++ b/pyrasterframes/src/main/python/examples/__init__.py @@ -14,13 +14,13 @@ if not len(jarpath) == 1: raise RuntimeError(""" Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/clean' first. """.format(jarpath)) +Try running 'sbt pyrasterframes/pyTest' first. """.format(jarpath)) pyJar = jarpath[0] def example_session(): - return (SparkSession.builder + spark = (SparkSession.builder .master("local[*]") .appName("RasterFrames") .config('spark.driver.extraClassPath', pyJar) @@ -28,4 +28,6 @@ def example_session(): .config("spark.ui.enabled", "false") .withKryoSerialization() .getOrCreate()) + spark.sparkContext.setLogLevel("ERROR") + return spark diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 959fd8d7b..84c9a319a 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -1,5 +1,6 @@ # Always prefer setuptools over distutils from setuptools import setup, find_packages +import os from os import path, environ from io import open from pathlib import Path @@ -25,10 +26,15 @@ def _extract_module(mod): globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) +def _divided(msg): + divider = ('-' * 50) + return divider + '\n' + msg + '\n' + divider + + class RunExamples(distutils.cmd.Command): """A custom command to run pyrasterframes examples.""" - description = 'run pyrasterframes examples' + description = 'Run PyRasterFrames examples' user_options = [ # The format is (long option, short option, description). ('examples=', 'e', 'examples to run'), @@ -61,17 +67,60 @@ def finalize_options(self): def run(self): """Run the examples.""" import traceback + for ex in self.examples: - print(('-' * 50) + '\nRunning %s' % ex + '\n' + ('-' * 50)) + print(_divided('Running %s' % ex)) try: _extract_module(ex) except Exception: - print(('-' * 50) + '\n%s Failed:' % ex + '\n' + ('-' * 50)) + print(_divided('%s Failed:' % ex)) print(traceback.format_exc()) +class PweaveDocs(distutils.cmd.Command): + """A custom command to run documentation scripts through pweave.""" + + description = 'Pweave PyRasterFrames examples' + user_options = [ + # The format is (long option, short option, description). + ('files=', 'f', 'Specific files to pweave. Defaults to all in `examples` directory.'), + ] + + def initialize_options(self): + """Set default values for options.""" + # Each user option must be listed here with their default value. + self.files = filter(lambda x: not x.name.startswith('_'), + list((Path(here) / 'examples').resolve().glob('*.py'))) + + def finalize_options(self): + """Post-process options.""" + import re + if isinstance(self.files, str): + self.files = filter(lambda s: len(s) > 0, re.split('\W+', self.files)) + + def run(self): + """Run pweave.""" + import traceback + import pweave + dest = path.join(here, 'docs-md') + os.mkdir(dest) + + for ex in self.files: + name = path.splitext(path.basename(ex))[0] + print(_divided('Running %s' % ex)) + try: + pweave.weave( + file=str(ex), + doctype='markdown', + output=path.join(dest, name + ".md"), + figdir=path.join(dest, "figures") + ) + except Exception: + print(_divided('%s Failed:' % ex)) + print(traceback.format_exc()) + setup( - name='pyrasterframes', + name='PyRasterFrames', description='RasterFrames for PySpark', long_description=readme, long_description_content_type='text/markdown', @@ -89,7 +138,7 @@ def run(self): 'pytest-runner', 'setuptools >= 0.8', 'pathlib2', - 'jupytext' + 'Pweave' ] + requirements, tests_require=[ 'pytest==3.4.2', @@ -114,7 +163,8 @@ def run(self): zip_safe=False, test_suite="pytest-runner", cmdclass={ - 'examples': RunExamples + 'examples': RunExamples, + 'pweave': PweaveDocs } # entry_points={ # "console_scripts": ['pyrasterframes=pyrasterframes:console'] From 4b453bbdac32ee7b35e06e0ee2287d00d13d1350 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 6 Jun 2019 14:26:25 -0400 Subject: [PATCH 144/380] Example pweave-able document. --- pyrasterframes/build.sbt | 11 +++++ .../src/main/python/docs/Background.md | 8 ++++ .../src/main/python/docs/GettingStarted.md | 10 ++++ .../python/docs/InitializingEnvironment.py | 46 +++++++++++++++++++ .../src/main/python/docs/__init__.py | 30 ++++++++++++ pyrasterframes/src/main/python/docs/index.md | 5 ++ pyrasterframes/src/main/python/setup.py | 13 ++---- 7 files changed, 114 insertions(+), 9 deletions(-) create mode 100644 pyrasterframes/src/main/python/docs/Background.md create mode 100644 pyrasterframes/src/main/python/docs/GettingStarted.md create mode 100644 pyrasterframes/src/main/python/docs/InitializingEnvironment.py create mode 100644 pyrasterframes/src/main/python/docs/__init__.py create mode 100644 pyrasterframes/src/main/python/docs/index.md diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 570dc1385..d6050a4d8 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -2,6 +2,17 @@ import PythonBuildPlugin.autoImport.pySetup exportJars := true +Python / doc / target := (Python / target).value / "docs" +Python / doc := { + val _ = Def.sequential( + assembly, + pySetup.toTask(" pweave") + ).value + (Python / doc / target).value +} + +doc := (Python / doc).value + lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") pySparkCmd := { val s = streams.value diff --git a/pyrasterframes/src/main/python/docs/Background.md b/pyrasterframes/src/main/python/docs/Background.md new file mode 100644 index 000000000..36ec0b32d --- /dev/null +++ b/pyrasterframes/src/main/python/docs/Background.md @@ -0,0 +1,8 @@ +# What is a RasterFrame? + +_This is a work in progress_ + + +1. Conceptual model +2. Data model +3. Compute model diff --git a/pyrasterframes/src/main/python/docs/GettingStarted.md b/pyrasterframes/src/main/python/docs/GettingStarted.md new file mode 100644 index 000000000..33a1a6716 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/GettingStarted.md @@ -0,0 +1,10 @@ +# Getting Started + +_This is a work in progress_ + +Outline: + +1. Introduction +1. Accessing the published artifacts (TODO) +1. Running from a build (See README.md) + diff --git a/pyrasterframes/src/main/python/docs/InitializingEnvironment.py b/pyrasterframes/src/main/python/docs/InitializingEnvironment.py new file mode 100644 index 000000000..0832b5143 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/InitializingEnvironment.py @@ -0,0 +1,46 @@ +#' # Initializing PySpark + +#' There are a number of ways to use PyRasterFrames: +#' +#' 1. Standalone Script +#' 2. `pyspark` shell +#' 3. Notebook Environment +#' + +#' ## Initializing a Python Script + +#+ echo=False +from docs import * + +#' Most of RasterFrames is implemented in Scala, and compiled to a Java Virtual Machine (JVM) +#' library file called a '.jar' file. The RasterFrames build provides a special `.jar` file, +#' called an "assembly", containing all of RasterFrames as well as the libraries that RasterFrames +#' rquires outside of Spark +#' Let's assume we can locate the PyRasterFrames "assembly" `.jar` file with a function named +#' `find_pyrasterframes_assembly`. + +#' The first step is to set up a `SparkSession`: + +from pyspark.sql import SparkSession +from pyrasterframes import * +jar = find_pyrasterframes_assembly() +spark = (SparkSession.builder + .master("local[*]") + .appName("RasterFrames") + .config('spark.driver.extraClassPath', jar) + .config('spark.executor.extraClassPath', jar) + .withKryoSerialization() + .getOrCreate()) +spark.withRasterFrames() + +#' Now we have a standard Spark session with RasterFrames enabled in it. +#' To import RasterFrames functions into the environment, use: +from pyrasterframes.rasterfunctions import * + +#' Functions starting with `rf_` (raster-oriented) or `st_` (vector geometry-oriented) are +#' become available for use with DataFrames. + +list(filter(lambda x: x.startswith("rf_") or x.startswith("st_"), dir())) + +#+ echo=False +spark.stop() diff --git a/pyrasterframes/src/main/python/docs/__init__.py b/pyrasterframes/src/main/python/docs/__init__.py new file mode 100644 index 000000000..d08030799 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/__init__.py @@ -0,0 +1,30 @@ +import os +import glob +from pyspark.sql import SparkSession + +__all__ = ["create_spark_session", "find_pyrasterframes_assembly"] + +def find_pyrasterframes_assembly(): + here = os.path.dirname(os.path.realpath(__file__)) + scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) + jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) + if not len(jarpath) == 1: + raise RuntimeError(""" +Expected to find exactly one assembly. Found '{}' instead. +Try running 'sbt pyrasterframes/package' first. """.format(jarpath)) + return jarpath[0] + +def create_spark_session(): + pyJar = find_pyrasterframes_assembly() + spark = (SparkSession.builder + .master("local[*]") + .appName("RasterFrames") + .config('spark.driver.extraClassPath', pyJar) + .config('spark.executor.extraClassPath', pyJar) + .config("spark.ui.enabled", "false") + .withKryoSerialization() + .getOrCreate()) + spark.withRasterFrames() + spark.sparkContext.setLogLevel("ERROR") + return spark + diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md new file mode 100644 index 000000000..0ebe3f623 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/index.md @@ -0,0 +1,5 @@ +# PyRasterFrames Users' Manual + +1. [What is a RasterFrame?](Background.md) +2. [Getting Started](GettingStarted.md) +3. [Initializing a RasterFrames Environment](InitializingEnvironment.md) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 84c9a319a..60902fe76 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -79,18 +79,17 @@ def run(self): class PweaveDocs(distutils.cmd.Command): """A custom command to run documentation scripts through pweave.""" - - description = 'Pweave PyRasterFrames examples' + description = 'Pweave PyRasterFrames documentation scripts' user_options = [ # The format is (long option, short option, description). - ('files=', 'f', 'Specific files to pweave. Defaults to all in `examples` directory.'), + ('files=', 'f', 'Specific files to pweave. Defaults to all in `docs` directory.'), ] def initialize_options(self): """Set default values for options.""" # Each user option must be listed here with their default value. self.files = filter(lambda x: not x.name.startswith('_'), - list((Path(here) / 'examples').resolve().glob('*.py'))) + list((Path(here) / 'docs').resolve().glob('*.py'))) def finalize_options(self): """Post-process options.""" @@ -102,8 +101,6 @@ def run(self): """Run pweave.""" import traceback import pweave - dest = path.join(here, 'docs-md') - os.mkdir(dest) for ex in self.files: name = path.splitext(path.basename(ex))[0] @@ -111,9 +108,7 @@ def run(self): try: pweave.weave( file=str(ex), - doctype='markdown', - output=path.join(dest, name + ".md"), - figdir=path.join(dest, "figures") + doctype='markdown' ) except Exception: print(_divided('%s Failed:' % ex)) From 896e09eea2a7a2a70ee0e8af8ac924d6d9b8dfd7 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 6 Jun 2019 14:58:43 -0400 Subject: [PATCH 145/380] Disabled `tut` and started simplification of Scala-based docs. --- build.sbt | 24 ++++++++++- docs/build.sbt | 40 ------------------ docs/src/main/{tut => paradox}/CNAME | 0 .../{tut => paradox}/RasterFramePipeline.svg | 0 .../{tut => paradox}/apps/geotrellis-ops.md | 0 docs/src/main/{tut => paradox}/apps/index.md | 0 docs/src/main/{tut => paradox}/apps/ndvi.md | 0 .../{tut => paradox}/creating-rasterframes.md | 0 .../exporting-rasterframes.md | 3 +- .../main/{tut => paradox}/getting-started.md | 0 docs/src/main/{tut => paradox}/index.md | 0 .../main/{tut => paradox}/ml/L8-RGB-VA.png | Bin .../{tut => paradox}/ml/classification.md | 0 .../main/{tut => paradox}/ml/clustering.md | 0 docs/src/main/{tut => paradox}/ml/index.md | 0 .../main/{tut => paradox}/ml/statistics.md | 0 .../main/{tut => paradox}/pyrasterframes.md | 0 docs/src/main/{tut => paradox}/reference.md | 0 .../main/{tut => paradox}/release-notes.md | 0 .../main/{tut => paradox}/spatial-queries.md | 0 project/plugins.sbt | 3 +- 21 files changed, 25 insertions(+), 45 deletions(-) delete mode 100644 docs/build.sbt rename docs/src/main/{tut => paradox}/CNAME (100%) rename docs/src/main/{tut => paradox}/RasterFramePipeline.svg (100%) rename docs/src/main/{tut => paradox}/apps/geotrellis-ops.md (100%) rename docs/src/main/{tut => paradox}/apps/index.md (100%) rename docs/src/main/{tut => paradox}/apps/ndvi.md (100%) rename docs/src/main/{tut => paradox}/creating-rasterframes.md (100%) rename docs/src/main/{tut => paradox}/exporting-rasterframes.md (97%) rename docs/src/main/{tut => paradox}/getting-started.md (100%) rename docs/src/main/{tut => paradox}/index.md (100%) rename docs/src/main/{tut => paradox}/ml/L8-RGB-VA.png (100%) rename docs/src/main/{tut => paradox}/ml/classification.md (100%) rename docs/src/main/{tut => paradox}/ml/clustering.md (100%) rename docs/src/main/{tut => paradox}/ml/index.md (100%) rename docs/src/main/{tut => paradox}/ml/statistics.md (100%) rename docs/src/main/{tut => paradox}/pyrasterframes.md (100%) rename docs/src/main/{tut => paradox}/reference.md (100%) rename docs/src/main/{tut => paradox}/release-notes.md (100%) rename docs/src/main/{tut => paradox}/spatial-queries.md (100%) diff --git a/build.sbt b/build.sbt index e322a6591..6158b5335 100644 --- a/build.sbt +++ b/build.sbt @@ -102,7 +102,29 @@ lazy val experimental = project ) lazy val docs = project - .dependsOn(core, datasource) + .dependsOn(core, datasource, pyrasterframes) + .enablePlugins(SiteScaladocPlugin, ParadoxPlugin, GhpagesPlugin, ScalaUnidocPlugin) + .settings( + apiURL := Some(url("http://rasterframes.io/latest/api")), + autoAPIMappings := true, + ghpagesNoJekyll := true, + ScalaUnidoc / siteSubdirName := "latest/api", + paradox / siteSubdirName := ".", + paradoxProperties ++= Map( + "github.base_url" -> "https://github.com/locationtech/rasterframes", + "version" -> version.value, + "scaladoc.org.apache.spark.sql.rf" -> "http://rasterframes.io/latest" + ), + paradoxTheme := Some(builtinParadoxTheme("generic")), + makeSite := makeSite.dependsOn(Compile / unidoc).dependsOn(Compile / paradox).value, + Compile / paradox / sourceDirectories += (pyrasterframes / Python / doc / target).value + ) + .settings( + addMappingsToSiteDir(ScalaUnidoc / packageDoc / mappings, ScalaUnidoc / siteSubdirName) + ) + .settings( + addMappingsToSiteDir(Compile / paradox / mappings, paradox / siteSubdirName) + ) lazy val bench = project .dependsOn(core % "compile->test") diff --git a/docs/build.sbt b/docs/build.sbt deleted file mode 100644 index d7bb66c61..000000000 --- a/docs/build.sbt +++ /dev/null @@ -1,40 +0,0 @@ -import com.typesafe.sbt.SbtGit.git - -enablePlugins(SiteScaladocPlugin, ParadoxPlugin, TutPlugin, GhpagesPlugin, ScalaUnidocPlugin) - -name := "rasterframes-docs" - -libraryDependencies ++= Seq( - spark("mllib").value % Tut, - spark("sql").value % Tut -) - -apiURL := Some(url("http://rasterframes.io/latest/api")) -autoAPIMappings := true -ghpagesNoJekyll := true - -ScalaUnidoc / siteSubdirName := "latest/api" -paradox / siteSubdirName := "." - -addMappingsToSiteDir(ScalaUnidoc / packageDoc / mappings, ScalaUnidoc / siteSubdirName) -addMappingsToSiteDir(Compile / paradox / mappings, paradox / siteSubdirName) - -paradoxProperties ++= Map( - "github.base_url" -> "https://github.com/locationtech/rasterframes", - "version" -> version.value, - "scaladoc.org.apache.spark.sql.gt" -> "http://rasterframes.io/latest" - //"scaladoc.geotrellis.base_url" -> "https://geotrellis.github.io/scaladocs/latest", - // "snip.pyexamples.base_dir" -> (baseDirectory.value + "/../pyrasterframes/python/test/examples") -) -paradoxTheme := Some(builtinParadoxTheme("generic")) -//paradoxTheme / sourceDirectory := sourceDirectory.value / "main" / "paradox" / "_template" - -Compile / doc / scalacOptions++= Seq( "-J-Xmx6G", "-no-link-warnings") - -Tut / run / fork := true - -Tut / run / javaOptions := Seq("-Xmx8G", "-Dspark.ui.enabled=false") - -Compile / paradox := (Compile / paradox).dependsOn(tutQuick).value -Compile / paradox / sourceDirectory := tutTargetDirectory.value -makeSite := makeSite.dependsOn(Compile / unidoc).dependsOn(Compile / paradox).value diff --git a/docs/src/main/tut/CNAME b/docs/src/main/paradox/CNAME similarity index 100% rename from docs/src/main/tut/CNAME rename to docs/src/main/paradox/CNAME diff --git a/docs/src/main/tut/RasterFramePipeline.svg b/docs/src/main/paradox/RasterFramePipeline.svg similarity index 100% rename from docs/src/main/tut/RasterFramePipeline.svg rename to docs/src/main/paradox/RasterFramePipeline.svg diff --git a/docs/src/main/tut/apps/geotrellis-ops.md b/docs/src/main/paradox/apps/geotrellis-ops.md similarity index 100% rename from docs/src/main/tut/apps/geotrellis-ops.md rename to docs/src/main/paradox/apps/geotrellis-ops.md diff --git a/docs/src/main/tut/apps/index.md b/docs/src/main/paradox/apps/index.md similarity index 100% rename from docs/src/main/tut/apps/index.md rename to docs/src/main/paradox/apps/index.md diff --git a/docs/src/main/tut/apps/ndvi.md b/docs/src/main/paradox/apps/ndvi.md similarity index 100% rename from docs/src/main/tut/apps/ndvi.md rename to docs/src/main/paradox/apps/ndvi.md diff --git a/docs/src/main/tut/creating-rasterframes.md b/docs/src/main/paradox/creating-rasterframes.md similarity index 100% rename from docs/src/main/tut/creating-rasterframes.md rename to docs/src/main/paradox/creating-rasterframes.md diff --git a/docs/src/main/tut/exporting-rasterframes.md b/docs/src/main/paradox/exporting-rasterframes.md similarity index 97% rename from docs/src/main/tut/exporting-rasterframes.md rename to docs/src/main/paradox/exporting-rasterframes.md index b2b806fbd..5a855db53 100644 --- a/docs/src/main/tut/exporting-rasterframes.md +++ b/docs/src/main/paradox/exporting-rasterframes.md @@ -27,8 +27,7 @@ The cell values within a `Tile` are encoded internally as an array. There may be where the additional context provided by the `Tile` construct is no longer needed and one would prefer to work with the underlying array data. -The @scaladoc[`rf_tile_to_array_int`][rf_tile_to_array_int] and @scaladoc[`rf_tile_to_array_double`][rf_tile_to_array_double] -provide this facility. +The `rf_tile_to_array_int` and `rf_tile_to_array_double` functions provide this facility. ```tut val withArrays = rf.withColumn("tileData", rf_tile_to_array_int($"tile")).drop("tile") diff --git a/docs/src/main/tut/getting-started.md b/docs/src/main/paradox/getting-started.md similarity index 100% rename from docs/src/main/tut/getting-started.md rename to docs/src/main/paradox/getting-started.md diff --git a/docs/src/main/tut/index.md b/docs/src/main/paradox/index.md similarity index 100% rename from docs/src/main/tut/index.md rename to docs/src/main/paradox/index.md diff --git a/docs/src/main/tut/ml/L8-RGB-VA.png b/docs/src/main/paradox/ml/L8-RGB-VA.png similarity index 100% rename from docs/src/main/tut/ml/L8-RGB-VA.png rename to docs/src/main/paradox/ml/L8-RGB-VA.png diff --git a/docs/src/main/tut/ml/classification.md b/docs/src/main/paradox/ml/classification.md similarity index 100% rename from docs/src/main/tut/ml/classification.md rename to docs/src/main/paradox/ml/classification.md diff --git a/docs/src/main/tut/ml/clustering.md b/docs/src/main/paradox/ml/clustering.md similarity index 100% rename from docs/src/main/tut/ml/clustering.md rename to docs/src/main/paradox/ml/clustering.md diff --git a/docs/src/main/tut/ml/index.md b/docs/src/main/paradox/ml/index.md similarity index 100% rename from docs/src/main/tut/ml/index.md rename to docs/src/main/paradox/ml/index.md diff --git a/docs/src/main/tut/ml/statistics.md b/docs/src/main/paradox/ml/statistics.md similarity index 100% rename from docs/src/main/tut/ml/statistics.md rename to docs/src/main/paradox/ml/statistics.md diff --git a/docs/src/main/tut/pyrasterframes.md b/docs/src/main/paradox/pyrasterframes.md similarity index 100% rename from docs/src/main/tut/pyrasterframes.md rename to docs/src/main/paradox/pyrasterframes.md diff --git a/docs/src/main/tut/reference.md b/docs/src/main/paradox/reference.md similarity index 100% rename from docs/src/main/tut/reference.md rename to docs/src/main/paradox/reference.md diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/paradox/release-notes.md similarity index 100% rename from docs/src/main/tut/release-notes.md rename to docs/src/main/paradox/release-notes.md diff --git a/docs/src/main/tut/spatial-queries.md b/docs/src/main/paradox/spatial-queries.md similarity index 100% rename from docs/src/main/tut/spatial-queries.md rename to docs/src/main/paradox/spatial-queries.md diff --git a/project/plugins.sbt b/project/plugins.sbt index fa474439a..5ccdcda08 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -4,10 +4,9 @@ addSbtCoursier addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.14.6") addSbtPlugin("com.eed3si9n" % "sbt-buildinfo" % "0.7.0") addSbtPlugin("de.heikoseeberger" % "sbt-header" % "3.0.2") -addSbtPlugin("org.tpolecat" % "tut-plugin" % "0.6.10") addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.2") addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.3.2") -addSbtPlugin("com.lightbend.paradox" % "sbt-paradox" % "0.5.0") +addSbtPlugin("com.lightbend.paradox" % "sbt-paradox" % "0.5.5") addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.4") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.1") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") From 01b7e6360865dc0d16300eda40cdd59488274f8c Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 6 Jun 2019 16:58:41 -0400 Subject: [PATCH 146/380] Ability to run unit tests on python 2 Signed-off-by: Jason T. Brown --- .../main/python/pyrasterframes/rf_types.py | 4 ++-- pyrasterframes/src/main/python/setup.py | 20 ++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index b3a930af0..22f842b35 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -160,11 +160,11 @@ def deserialize(self, datum): class CellType(object): - def __init__(self, cell_type_name: str): + def __init__(self, cell_type_name): self.cell_type_name = cell_type_name @classmethod - def from_numpy_dtype(cls, np_dtype: np.dtype): + def from_numpy_dtype(cls, np_dtype): return CellType(str(np_dtype.name)) @classmethod diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 959fd8d7b..60b2894e1 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -1,8 +1,8 @@ # Always prefer setuptools over distutils from setuptools import setup, find_packages from os import path, environ +from glob import glob from io import open -from pathlib import Path import distutils.cmd import importlib @@ -36,26 +36,28 @@ class RunExamples(distutils.cmd.Command): @staticmethod def _check_ex_path(ex): - file = Path(ex) - if not file.suffix: - file = file.with_suffix('.py') - file = (Path(here) / 'examples' / file).resolve() - assert file.is_file(), ('Invalid example %s' % file) + file = ex + suffix = path.splitext(ex)[1] + if suffix == '': + file += '.py' + file = path.join(here, 'examples', file) + + assert path.isfile(file), ('Invalid example %s' % file) return file def initialize_options(self): """Set default values for options.""" # Each user option must be listed here with their default value. - self.examples = filter(lambda x: not x.name.startswith('_'), - list((Path(here) / 'examples').resolve().glob('*.py'))) + self.examples = filter(lambda x: not x[:1] == '_', + glob(path.join(here, 'examples', '*'))) def finalize_options(self): """Post-process options.""" import re if isinstance(self.examples, str): self.examples = filter(lambda s: len(s) > 0, re.split('\W+', self.examples)) - self.examples = map(lambda x: 'examples.' + x.stem, + self.examples = map(lambda x: 'examples.' + path.basename(x), map(self._check_ex_path, self.examples)) def run(self): From 3a03193241121631abeedf92c893b3abcfb66705 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 6 Jun 2019 17:43:49 -0400 Subject: [PATCH 147/380] pyrasterframes setup examples parsing fix Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/examples/__init__.py | 2 +- pyrasterframes/src/main/python/setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/examples/__init__.py b/pyrasterframes/src/main/python/examples/__init__.py index 8bd561d0a..27f2b589f 100644 --- a/pyrasterframes/src/main/python/examples/__init__.py +++ b/pyrasterframes/src/main/python/examples/__init__.py @@ -14,7 +14,7 @@ if not len(jarpath) == 1: raise RuntimeError(""" Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/clean' first. """.format(jarpath)) +Try running 'sbt pyrasterframes/clean && sbt pyrasterframes/test' first. """.format(jarpath)) pyJar = jarpath[0] diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 60b2894e1..5c892c913 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -49,7 +49,7 @@ def _check_ex_path(ex): def initialize_options(self): """Set default values for options.""" # Each user option must be listed here with their default value. - self.examples = filter(lambda x: not x[:1] == '_', + self.examples = filter(lambda x: not path.basename(x)[:1] == '_', glob(path.join(here, 'examples', '*'))) def finalize_options(self): @@ -57,7 +57,7 @@ def finalize_options(self): import re if isinstance(self.examples, str): self.examples = filter(lambda s: len(s) > 0, re.split('\W+', self.examples)) - self.examples = map(lambda x: 'examples.' + path.basename(x), + self.examples = map(lambda x: 'examples.' + path.splitext(path.basename(x))[0], map(self._check_ex_path, self.examples)) def run(self): From f6366a50ab83b71cfedff55361fbd13c2a5c7dbf Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 7 Jun 2019 11:32:43 -0400 Subject: [PATCH 148/380] Prototype merging python and scala docs. --- build.sbt | 4 ++- docs/src/main/paradox/index.md | 2 +- docs/src/main/paradox/pyrasterframes.md | 14 ---------- project/PythonBuildPlugin.scala | 23 ++++++++--------- pyrasterframes/build.sbt | 17 ++++++++---- pyrasterframes/src/main/python/docs/index.md | 10 +++++--- pyrasterframes/src/main/python/setup.py | 27 ++++++++++++-------- 7 files changed, 51 insertions(+), 46 deletions(-) delete mode 100644 docs/src/main/paradox/pyrasterframes.md diff --git a/build.sbt b/build.sbt index 6158b5335..1b0b224da 100644 --- a/build.sbt +++ b/build.sbt @@ -1,5 +1,6 @@ addCommandAlias("makeSite", "docs/makeSite") +addCommandAlias("previewSite", "docs/previewSite") addCommandAlias("console", "datasource/console") lazy val root = project @@ -117,7 +118,8 @@ lazy val docs = project ), paradoxTheme := Some(builtinParadoxTheme("generic")), makeSite := makeSite.dependsOn(Compile / unidoc).dependsOn(Compile / paradox).value, - Compile / paradox / sourceDirectories += (pyrasterframes / Python / doc / target).value + Compile / paradox / sourceDirectories += (pyrasterframes / Python / doc / target).value.getParentFile, + Compile / paradox := (Compile / paradox).dependsOn(pyrasterframes / doc).value ) .settings( addMappingsToSiteDir(ScalaUnidoc / packageDoc / mappings, ScalaUnidoc / siteSubdirName) diff --git a/docs/src/main/paradox/index.md b/docs/src/main/paradox/index.md index 7351536be..84dadce2f 100644 --- a/docs/src/main/paradox/index.md +++ b/docs/src/main/paradox/index.md @@ -39,7 +39,7 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi @@@ index * [Getting Started](getting-started.md) -* [PyRasterFrames](pyrasterframes.md) +* [PyRasterFrames](pyrasterframes/index.md) * [Creating RasterFrames](creating-rasterframes.md) * [Spatial Queries](spatial-queries.md) * [Applications](apps/index.md) diff --git a/docs/src/main/paradox/pyrasterframes.md b/docs/src/main/paradox/pyrasterframes.md deleted file mode 100644 index 0d7fc8280..000000000 --- a/docs/src/main/paradox/pyrasterframes.md +++ /dev/null @@ -1,14 +0,0 @@ -# RasterFrames in Python - -RasterFrames includes Python bindings for using the library from within [PySpark](https://spark.apache.org/docs/latest/api/python/pyspark.html). -While creating Python documentation on parity with Scala is forthcoming, these resources should help -in the meantime: - -* [PyRasterFrames README](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/python/README.rst) -* [PyRasterFrames Examples](https://github.com/locationtech/rasterframes/tree/develop/pyrasterframes/python/examples) -* [RasterFrames Jupyter Notebook](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook/README.md) -* @ref:[PyRasterFrames Functions](reference.md) - -Most features available in the Scala API are exposed in the Python API, refer to the @ref:[function reference](reference.md). Defining a [udf](http://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.functions.udf) using a `Tile` column through the Python API is not yet supported. - -If there's a specific feature that appears to be missing in the Python version [please submit an issue](https://github.com/locationtech/rasterframes/issues) so that we might address it for you. diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 63febc115..a21fb117e 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -35,21 +35,20 @@ object PythonBuildPlugin extends AutoPlugin { val pythonSource = settingKey[File]("Default Python source directory.").withRank(ASetting) val pythonCommand = settingKey[String]("Python command. Defaults to 'python'") val pySetup = inputKey[Int]("Run 'python setup.py '. Returns exit code.") + def copySources(srcDir: SettingKey[File], destDir: SettingKey[File], deleteFirst: Boolean) = Def.task { + val s = streams.value + val src = srcDir.value + val dest = destDir.value + if (deleteFirst) + IO.delete(dest) + dest.mkdirs() + s.log.info(s"Copying '$src' to '$dest'") + IO.copyDirectory(src, dest) + dest + } } import autoImport._ - def copySources(srcDir: SettingKey[File], destDir: SettingKey[File], deleteFirst: Boolean) = Def.task { - val s = streams.value - val src = srcDir.value - val dest = destDir.value - if (deleteFirst) - IO.delete(dest) - dest.mkdirs() - s.log.info(s"Copying '$src' to '$dest'") - IO.copyDirectory(src, dest) - dest - } - val copyPySources = Def.sequential( copySources(Compile / pythonSource, Python / target, true), copySources(Test / pythonSource, Python / test / target, false) diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index d6050a4d8..d91bf8ab7 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,12 +1,20 @@ -import PythonBuildPlugin.autoImport.pySetup +import PythonBuildPlugin.autoImport._ -exportJars := true +addCommandAlias("pyTest", "pyrasterframes/test") +addCommandAlias("pyDocs", "pyrasterframes/doc") -Python / doc / target := (Python / target).value / "docs" +exportJars := true +Python / doc / sourceDirectory := (Python / target).value / "docs" +Python / doc / target := (Python / target).value / "markdown" / "pyrasterframes" Python / doc := { val _ = Def.sequential( assembly, - pySetup.toTask(" pweave") + pySetup.toTask(" pweave"), + copySources( + Python / doc / sourceDirectory, + Python / doc / target, + deleteFirst = true + ) ).value (Python / doc / target).value } @@ -35,4 +43,3 @@ pyExamples := Def.sequential( pySetup.toTask(" examples") ).value -addCommandAlias("pyTest", "pyrasterframes/test") \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index 0ebe3f623..c1e07ef97 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -1,5 +1,9 @@ # PyRasterFrames Users' Manual -1. [What is a RasterFrame?](Background.md) -2. [Getting Started](GettingStarted.md) -3. [Initializing a RasterFrames Environment](InitializingEnvironment.md) +@@@ index + +* [What is a RasterFrame?](Background.md) +* [Getting Started](GettingStarted.md) +* [Initializing a RasterFrames Environment](InitializingEnvironment.html) + +@@@ \ No newline at end of file diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 60902fe76..4b27ac914 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -60,9 +60,14 @@ def finalize_options(self): """Post-process options.""" import re if isinstance(self.examples, str): - self.examples = filter(lambda s: len(s) > 0, re.split('\W+', self.examples)) - self.examples = map(lambda x: 'examples.' + x.stem, - map(self._check_ex_path, self.examples)) + self.examples = filter( + lambda s: len(s) > 0, + re.split('\W+', self.examples) + ) + self.examples = map( + lambda x: 'examples.' + x.stem, + map(self._check_ex_path, self.examples) + ) def run(self): """Run the examples.""" @@ -88,8 +93,10 @@ class PweaveDocs(distutils.cmd.Command): def initialize_options(self): """Set default values for options.""" # Each user option must be listed here with their default value. - self.files = filter(lambda x: not x.name.startswith('_'), - list((Path(here) / 'docs').resolve().glob('*.py'))) + self.files = filter( + lambda x: not x.name.startswith('_'), + list((Path(here) / 'docs').resolve().glob('*.py')) + ) def finalize_options(self): """Post-process options.""" @@ -102,16 +109,16 @@ def run(self): import traceback import pweave - for ex in self.files: - name = path.splitext(path.basename(ex))[0] - print(_divided('Running %s' % ex)) + for file in self.files: + name = path.splitext(path.basename(file))[0] + print(_divided('Running %s' % name)) try: pweave.weave( - file=str(ex), + file=str(file), doctype='markdown' ) except Exception: - print(_divided('%s Failed:' % ex)) + print(_divided('%s Failed:' % file)) print(traceback.format_exc()) setup( From 0acadda44c9ee75763ffbeb341ed258af0bafa48 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 7 Jun 2019 11:58:55 -0400 Subject: [PATCH 149/380] Fixed issue with copying Python test directory before run. --- project/PythonBuildPlugin.scala | 16 +++++++++------- .../src/main/python/examples/__init__.py | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index beb7af513..63febc115 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -38,20 +38,22 @@ object PythonBuildPlugin extends AutoPlugin { } import autoImport._ - def copySources(srcDir: SettingKey[File], destDir: SettingKey[File]) = Def.task { + def copySources(srcDir: SettingKey[File], destDir: SettingKey[File], deleteFirst: Boolean) = Def.task { val s = streams.value val src = srcDir.value val dest = destDir.value - IO.delete(dest) + if (deleteFirst) + IO.delete(dest) dest.mkdirs() s.log.info(s"Copying '$src' to '$dest'") IO.copyDirectory(src, dest) dest } - val copyPySources = copySources(Compile / pythonSource, Python / target) - - val copyPyTestSources = copySources(Test / pythonSource, Python / test / target) + val copyPySources = Def.sequential( + copySources(Compile / pythonSource, Python / target, true), + copySources(Test / pythonSource, Python / test / target, false) + ) val buildWhl = Def.task { val buildDir = (Python / target).value @@ -76,7 +78,8 @@ object PythonBuildPlugin extends AutoPlugin { pythonCommand := "python", pySetup := { val s = streams.value - val wd = copyPySources.value + val _ = copyPySources.value + val wd = (Python / target).value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args val ver = version.value @@ -111,7 +114,6 @@ object PythonBuildPlugin extends AutoPlugin { }, test := Def.sequential( assembly, - copyPyTestSources, pySetup.toTask(" test") ).value, testQuick := pySetup.toTask(" test").value diff --git a/pyrasterframes/src/main/python/examples/__init__.py b/pyrasterframes/src/main/python/examples/__init__.py index 27f2b589f..8bd561d0a 100644 --- a/pyrasterframes/src/main/python/examples/__init__.py +++ b/pyrasterframes/src/main/python/examples/__init__.py @@ -14,7 +14,7 @@ if not len(jarpath) == 1: raise RuntimeError(""" Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/clean && sbt pyrasterframes/test' first. """.format(jarpath)) +Try running 'sbt pyrasterframes/clean' first. """.format(jarpath)) pyJar = jarpath[0] From a78fbc72864db4b1afe4d078ea0c74194870952b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 7 Jun 2019 13:45:04 -0400 Subject: [PATCH 150/380] Fixes #136 and #140. --- .circleci/config.yml | 10 +-- project/PythonBuildPlugin.scala | 66 ++++++++++++++++--- .../main/python/pyrasterframes/rf_types.py | 2 + 3 files changed, 63 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 36fa49821..c9ca203b0 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -148,11 +148,11 @@ workflows: branches: only: - /feature\/.*-its/ - - publish: - filters: - branches: - only: - - develop +# - publish: +# filters: +# branches: +# only: +# - develop nightlyReleaseAstraea: triggers: - schedule: diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 63febc115..b88b4cd70 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -23,6 +23,8 @@ import sbt.KeyRanks.ASetting import sbt.Keys.{`package`, _} import sbt._ import complete.DefaultParsers._ +import sbt.Tests.Summary + import scala.sys.process.Process import sbtassembly.AssemblyPlugin.autoImport.assembly @@ -83,17 +85,23 @@ object PythonBuildPlugin extends AutoPlugin { val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args val ver = version.value - s.log.info(s"Running '${cmd.mkString(" ")}' in $wd") + s.log.info(s"Running '${cmd.mkString(" ")}' in '$wd'") Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! }, Compile / pythonSource := (Compile / sourceDirectory).value / "python", Test / pythonSource := (Test / sourceDirectory).value / "python", Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value, - Test / test := Def.sequential( - Test / test, - Python / test - ).value, - Test / testQuick := (Python / testQuick).evaluated + Test / testQuick := (Python / testQuick).evaluated, + Test / executeTests := { + val standard = (Test / executeTests).value + standard.overall match { + case TestResult.Passed => + (Python / executeTests).value + case _ ⇒ + val pySummary = Summary("pyrasterframes", "tests skipped due to scalatest failures") + standard.copy(summaries = standard.summaries ++ Iterable(pySummary)) + } + } ) ++ inConfig(Python)(Seq( target := (Compile / target).value / "python", @@ -112,11 +120,49 @@ object PythonBuildPlugin extends AutoPlugin { val ver = version.value dest / s"${art.name}-python-$ver.zip" }, - test := Def.sequential( + testQuick := pySetup.toTask(" test").value, + executeTests := Def.sequential( assembly, - pySetup.toTask(" test") - ).value, - testQuick := pySetup.toTask(" test").value + Def.task { + val resultCode = pySetup.toTask(" test").value + val msg = resultCode match { + case 1 ⇒ "There are Python test failures." + case 2 ⇒ "Python test execution was interrupted." + case 3 ⇒ "Internal error during Python test execution." + case 4 ⇒ "PyTest usage error." + case 5 ⇒ "No Python tests found." + case x if x != 0 ⇒ "Unknown error while running Python tests." + case _ ⇒ "PyRasterFrames tests successfully completed." + } + val pySummary = Summary("pyrasterframes", msg) + // Would be cool to derive this from the python output... + val result = if (resultCode == 0) { + new SuiteResult( + TestResult.Passed, + passedCount = 1, + failureCount = 0, + errorCount = 0, + skippedCount = 0, + ignoredCount = 0, + canceledCount = 0, + pendingCount = 0 + ) + } + else { + new SuiteResult( + TestResult.Failed, + passedCount = 0, + failureCount = 1, + errorCount = 0, + skippedCount = 0, + ignoredCount = 0, + canceledCount = 0, + pendingCount = 0 + ) + } + result + Tests.Output(result.result, Map("PyRasterFramesTests" -> result), Iterable(pySummary)) + }).value )) ++ addArtifact(Python / packageBin / artifact, Python / packageBin) } diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 22f842b35..41b5c0efb 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -345,6 +345,8 @@ def __truediv__(self, right): ct = ct.with_no_data_value(quot.fill_value) return Tile(quot, ct) + def __div__(self, right): + return self.__truediv__(right) def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames From 029c220c3db035cfe0804f5135ce0e95417b021b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 7 Jun 2019 20:55:17 -0400 Subject: [PATCH 151/380] Fix for #142. --- pyrasterframes/src/main/python/docs/GettingStarted.md | 10 ---------- pyrasterframes/src/main/python/docs/index.md | 4 +--- pyrasterframes/src/main/python/setup.py | 6 ++++-- 3 files changed, 5 insertions(+), 15 deletions(-) delete mode 100644 pyrasterframes/src/main/python/docs/GettingStarted.md diff --git a/pyrasterframes/src/main/python/docs/GettingStarted.md b/pyrasterframes/src/main/python/docs/GettingStarted.md deleted file mode 100644 index 33a1a6716..000000000 --- a/pyrasterframes/src/main/python/docs/GettingStarted.md +++ /dev/null @@ -1,10 +0,0 @@ -# Getting Started - -_This is a work in progress_ - -Outline: - -1. Introduction -1. Accessing the published artifacts (TODO) -1. Running from a build (See README.md) - diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index c1e07ef97..ff5669d78 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -2,8 +2,6 @@ @@@ index -* [What is a RasterFrame?](Background.md) -* [Getting Started](GettingStarted.md) -* [Initializing a RasterFrames Environment](InitializingEnvironment.html) +* [Initializing a RasterFrames Environment](InitializingEnvironment.md) @@@ \ No newline at end of file diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 4b27ac914..545cb14c0 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -138,9 +138,11 @@ def run(self): install_requires=requirements, setup_requires=[ 'pytest-runner', - 'setuptools >= 0.8', + 'setuptools>=0.8', 'pathlib2', - 'Pweave' + 'ipython==6.2.1', + "ipykernel==4.8.0", + 'Pweave==0.30.3' ] + requirements, tests_require=[ 'pytest==3.4.2', From 57539e77679598dacf5ace0795a6f33e2703d419 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 10 Jun 2019 17:03:49 -0400 Subject: [PATCH 152/380] Partial implementation of pip enabled installation Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/MANIFEST.in | 4 + pyrasterframes/src/main/python/README.md | 78 +++++++++++++------ .../src/main/python/deps/jars/README.md | 4 + .../main/python/pyrasterframes/__init__.py | 33 ++++++++ pyrasterframes/src/main/python/setup.py | 73 ++++++++++++++--- 5 files changed, 161 insertions(+), 31 deletions(-) create mode 100644 pyrasterframes/src/main/python/MANIFEST.in create mode 100644 pyrasterframes/src/main/python/deps/jars/README.md diff --git a/pyrasterframes/src/main/python/MANIFEST.in b/pyrasterframes/src/main/python/MANIFEST.in new file mode 100644 index 000000000..a97911543 --- /dev/null +++ b/pyrasterframes/src/main/python/MANIFEST.in @@ -0,0 +1,4 @@ + +global-exclude *.py[cod] __pycache__ .DS_Store +recursive-include deps/jars *.jar + diff --git a/pyrasterframes/src/main/python/README.md b/pyrasterframes/src/main/python/README.md index 333910afc..15a0637dc 100644 --- a/pyrasterframes/src/main/python/README.md +++ b/pyrasterframes/src/main/python/README.md @@ -1,39 +1,49 @@ # PyRasterFrames -PyRasterFrames is the Python API for Spark RasterFrames. +PyRasterFrames is a library for distributed processing of geospatial raster data with Spark. ## Prerequisites -1. [`sbt`](https://www.scala-sbt.org/) +1. [`pip`](https://pip.pypa.io/en/stable/installing/) 2. ['pyspark`](https://pypi.org/project/pyspark/) > 2.3.2 -RasterFrames is primarily implmented in Scala, and as such uses the Scala build tool [`sbt`](https://www.scala-sbt.org/). -All `sbt` commands referenced below must be run from the root source directory, i.e. the parent of the `pyrasterframes` -directory, including Python-related build steps. - -As a tip, know that `sbt` is much faster if run in "interactive" mode, where you launch `sbt` with no arguments, -and subsequent commands are invoked via an interactive shell. But for context clarity, we'll prefix each command -example below with `sbt`. - ## Quickstart -The quickest way to run a `pyspark` shell with the latest RasterFrames enabled is to run: +The quickest way to get started is to `pip` install the pyrasterframes package. ```bash -sbt pySparkCmd +pip install pyrasterframes +``` + +You can then access a [`pyspark SparkSession`]() using the [`local[*]` master](https://spark.apache.org/docs/latest/submitting-applications.html#master-urls) as follows. + +```python +import pyrasterframes +spark = pyrasterframes.get_spark_session() +``` + +Then you can read a raster and do some simple processing on it. + +```python +from pyrasterframes.rasterfunctions import * +from pyspark.sql.functions import lit +# Read a Landsat 8 L1TP PDS scene +df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/038/037/LC08_L1TP_038037_20190322_20190403_01_T1/LC08_L1TP_038037_20190322_20190403_01_T1_B4.TIF') +# Add 3 to every cell, show some rows of the dataframe +df.select(rf_local_add(df.tile, lit(3))).show(6, False) ``` -This will: +## Development -1. Compile all the Scala/JVM code. -1. Merge all JVM code and dependencies into a single "assembly" JAR file. -1. Create the PyRasterFrames `.whl` package -1. Construct a temporary initialization script -1. Emit a `bash` command with requisite arguments to start a pyspark interpreter with RasterFrames imports. +RasterFrames is primarily implemented in Scala, and as such uses the Scala build tool [`sbt`](https://www.scala-sbt.org/). +All `sbt` commands referenced below must be run from the root source directory, i.e. the parent of the `pyrasterframes` +directory, including Python-related build steps. + +As a tip, know that `sbt` is much faster if run in "interactive" mode, where you launch `sbt` with no arguments, +and subsequent commands are invoked via an interactive shell. But for context clarity, we'll prefix each command +example below with `sbt`. -You then copy/paste the emitted command into your `bash` shell to start up a spark shell. It assumes you have -`pyspark` >= 2.3.2 installed in your environment. ## Running Tests and Examples @@ -65,7 +75,7 @@ You build them with: sbt pyrasterframes/package ``` -Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy "GAV" coordinates +Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy groupId:artifactId:version (GAV) coordinates `org.locationtech.rasterframes:pyrasterframes_$SCALA_VER:$VER`. Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). @@ -92,7 +102,9 @@ sbt 'pySetup examples -e NDVI' *Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* -### `SparkSession` Setup +## `SparkSession` Setup + +### Python shell To initialize PyRasterFrames in a generic Python shell: @@ -104,7 +116,29 @@ spark = SparkSession.builder \ .master("local[*]") \ .appName("Using RasterFrames") \ .config("spark.some.config.option", "some-value") \ + .withKryoSerialization() \ .getOrCreate() \ .withRasterFrames() ``` +### Pyspark shell + +To initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the pyton source zip. + +```bash + pyspark \ + --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ + --conf spark.kryo.registrator=org.locationtech.rasterframes.util.RFKryoRegistrator \ + --conf spark.kryoserializer.buffer.max=500m \ + --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ + --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip + +``` + +Then in the pyspark shell import the module and call `withRasterFrames`. + +```python +import pyrasterframes +spark = spark.withRasterFrames() +df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') +``` diff --git a/pyrasterframes/src/main/python/deps/jars/README.md b/pyrasterframes/src/main/python/deps/jars/README.md new file mode 100644 index 000000000..693a02cb2 --- /dev/null +++ b/pyrasterframes/src/main/python/deps/jars/README.md @@ -0,0 +1,4 @@ +# pyrasterframes.jars + +Submodule containing JARs needed for pyrasterframe + diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index cc56a659c..252f0e9e5 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -56,6 +56,39 @@ def _kryo_init(builder): return builder +def get_spark_session(): + from pyspark.sql import SparkSession + import os + import sys + + if sys.version < "3": + import imp + try: + module_home = imp.find_module("pyrasterframes")[1] # path + jar_path = os.path.join(module_home, 'jars') + except ImportError: + print("pyrasterframes was not pip installed. See documentation for initialization instructions.") + return None + else: + from importlib.util import find_spec + try: + module_home = find_spec("pyrasterframes").origin + jar_path = os.path.join(os.path.dirname(module_home), 'jars') + except ImportError: + print("pyrasterframes was not pip installed. See documentation for initialization instructions.") + return None + + jars_cp = ','.join([f.path for f in os.scandir(jar_path) if f.name[-3:] == 'jar']) + spark = (SparkSession.builder + .master("local[*]") + .appName("RasterFrames") + .config('spark.jars', jars_cp) + .withKryoSerialization() + .getOrCreate() + ).withRasterFrames() + return spark + + def _convert_df(df, sp_key=None, metadata=None): ctx = SparkContext._active_spark_context._rf_context diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 5c892c913..e05985a2d 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -12,9 +12,6 @@ with open(path.join(here, 'README.md'), encoding='utf-8') as f: readme = f.read() -with open(path.join(here, 'requirements.txt')) as f: - requirements = f.read().splitlines() - def _extract_module(mod): module = importlib.import_module(mod) @@ -72,6 +69,60 @@ def run(self): print(traceback.format_exc()) +class PweaveDocs(distutils.cmd.Command): + from pathlib import Path + """A custom command to run documentation scripts through pweave.""" + description = 'Pweave PyRasterFrames documentation scripts' + user_options = [ + # The format is (long option, short option, description). + ('files=', 'f', 'Specific files to pweave. Defaults to all in `docs` directory.'), + ] + + def initialize_options(self): + """Set default values for options.""" + # Each user option must be listed here with their default value. + self.files = filter( + lambda x: not x.name.startswith('_'), + list((Path(here) / 'docs').resolve().glob('*.py')) + ) + + def finalize_options(self): + """Post-process options.""" + import re + if isinstance(self.files, str): + self.files = filter(lambda s: len(s) > 0, re.split('\W+', self.files)) + + def run(self): + """Run pweave.""" + import traceback + import pweave + + for file in self.files: + name = path.splitext(path.basename(file))[0] + print(_divided('Running %s' % name)) + try: + pweave.weave( + file=str(file), + doctype='markdown' + ) + except Exception: + print(_divided('%s Failed:' % file)) + print(traceback.format_exc()) + + +try: + with open(path.join(here, 'requirements.txt')) as f: + requirements = f.read().splitlines() +except: + print("couldn't open requirements.txt") + requirements = [ + 'pytz', + 'shapely', + 'pyspark>=2.3', + 'numpy>=1.7', + 'pandas', + ] + setup( name='pyrasterframes', description='RasterFrames for PySpark', @@ -89,9 +140,9 @@ def run(self): install_requires=requirements, setup_requires=[ 'pytest-runner', - 'setuptools >= 0.8', + 'setuptools>=0.8', 'pathlib2', - 'jupytext' + 'jupytext', ] + requirements, tests_require=[ 'pytest==3.4.2', @@ -101,8 +152,15 @@ def run(self): ], packages=[ 'pyrasterframes', - 'geomesa_pyspark' + 'geomesa_pyspark', + 'pyrasterframes.jars', ], + package_dir={ + 'pyrasterframes.jars': 'deps/jars' + }, + package_data={ + 'pyrasterframes.jars': ['*.jar'] + }, include_package_data=True, classifiers=[ 'Development Status :: 4 - Beta', @@ -118,7 +176,4 @@ def run(self): cmdclass={ 'examples': RunExamples } - # entry_points={ - # "console_scripts": ['pyrasterframes=pyrasterframes:console'] - # } ) From f6d965bdba17766f36f6170661beeae62382823d Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 10 Jun 2019 17:27:52 -0400 Subject: [PATCH 153/380] Tweak to pass CI & unit tests Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/setup.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index e05985a2d..0aecab504 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -70,7 +70,6 @@ def run(self): class PweaveDocs(distutils.cmd.Command): - from pathlib import Path """A custom command to run documentation scripts through pweave.""" description = 'Pweave PyRasterFrames documentation scripts' user_options = [ @@ -83,7 +82,7 @@ def initialize_options(self): # Each user option must be listed here with their default value. self.files = filter( lambda x: not x.name.startswith('_'), - list((Path(here) / 'docs').resolve().glob('*.py')) + glob(path.join(here, 'docs', '*.py')) ) def finalize_options(self): @@ -141,7 +140,6 @@ def run(self): setup_requires=[ 'pytest-runner', 'setuptools>=0.8', - 'pathlib2', 'jupytext', ] + requirements, tests_require=[ From 0d9f131e2e72e6d76f37598a1bc7f6a91d970718 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 12 Jun 2019 12:14:46 -0400 Subject: [PATCH 154/380] Add unit tests using python TileUDT in UDF's. Signed-off-by: Jason T. Brown --- .../src/test/python/PyRasterFramesTests.py | 68 ++++++++++++++++++- pyrasterframes/src/test/python/__init__.py | 1 + 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/src/test/python/PyRasterFramesTests.py b/pyrasterframes/src/test/python/PyRasterFramesTests.py index f98eb0b3d..42936268f 100644 --- a/pyrasterframes/src/test/python/PyRasterFramesTests.py +++ b/pyrasterframes/src/test/python/PyRasterFramesTests.py @@ -352,8 +352,6 @@ def test_cell_type_no_data(self): self.assertTrue(math.isnan(CellType.float64().no_data_value())) self.assertEqual(CellType.uint8().no_data_value(), 0) - -class UDT(TestEnvironment): def test_cell_type_conversion(self): for ct in rf_cell_types(): self.assertEqual(ct.to_numpy_dtype(), @@ -370,11 +368,19 @@ def test_cell_type_conversion(self): "GTCellType comparison for " + str(ct_ud) ) + +class UDT(TestEnvironment): + + def setUp(self): + self.create_rasterframe() + + def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) self.assertTrue(t1.cells.mask[1][0]) self.assertIsNotNone(t1.cells[1][1]) self.assertEqual(len(t1.cells.compressed()), 3) + t2 = Tile(np.array([[1.0, 2.0], [float('nan'), 4.0]]), CellType.float32()) self.assertEqual(len(t2.cells.compressed()), 3) self.assertTrue(t2.cells.mask[1][0]) @@ -403,6 +409,64 @@ def test_tile_udt_serialization(self): long_trip = df.first()["tile"] self.assertEqual(long_trip, a_tile) + def test_udf_on_tile_type_input(self): + import numpy.testing + # rf_local_add(t, 0) is to force lazy eval; accessing tile.tile is to get at the actual Tile type vs PRT struct + df = self.spark.read.rastersource(self.img_uri).withColumn('tile2', rf_local_add_int(col('tile.tile'), 0)) + rf = self.rf + + # create trivial UDF that does something we already do with raster_Functions + @udf('integer') + def my_udf(t): + a = t.cells + return a.size # same as rf_dimensions.cols * rf_dimensions.rows + + rf_result = rf.select( + (rf_dimensions('tile').cols.cast('int') * rf_dimensions('tile').rows.cast('int')).alias('expected'), + my_udf('tile').alias('result')).toPandas() + + numpy.testing.assert_array_equal( + rf_result.expected.tolist(), + rf_result.result.tolist() + ) + + df_result = df.select( + (rf_dimensions(df.tile).cols.cast('int') * rf_dimensions(df.tile).rows.cast('int') - + my_udf(df.tile2)).alias('result') + ).toPandas() + + numpy.testing.assert_array_equal( + np.zeros(len(df_result)), + df_result.result.tolist() + ) + + def test_udf_on_tile_type_output(self): + import numpy.testing + + rf = self.rf + + # create a trivial UDF that does something we already do with a raster_functions + @udf(TileUDT()) + def my_udf(t): + import numpy as np + a = np.log1p(t.cells) + return Tile(a, CellType.from_numpy_dtype(a.dtype)) + + rf_result = rf.select( + rf_tile_max( + rf_local_subtract( + my_udf(rf.tile), + rf_log1p(rf.tile) + ) + ).alias('expect_zeros') + ).collect() + + numpy.testing.assert_almost_equal( + [r['expect_zeros'] for r in rf_result], + [0.0 for _ in rf_result], + decimal=6 + ) + def test_no_data_udf_handling(self): t1 = Tile(np.array([[1, 2], [0, 4]]), CellType.uint8()) self.assertEqual(t1.cell_type.to_numpy_dtype(), np.dtype("uint8")) diff --git a/pyrasterframes/src/test/python/__init__.py b/pyrasterframes/src/test/python/__init__.py index 275612087..5dac30274 100644 --- a/pyrasterframes/src/test/python/__init__.py +++ b/pyrasterframes/src/test/python/__init__.py @@ -64,6 +64,7 @@ def setUpClass(cls): cls.spark = (SparkSession.builder .config('spark.driver.extraClassPath', jarpath[0]) .config('spark.executor.extraClassPath', jarpath[0]) + .config('spark.ui.enabled', False) .withKryoSerialization() .getOrCreate()) cls.spark.sparkContext.setLogLevel('ERROR') From 0a99e29b66d9834815b4f6b67ded1c77c19b4d80 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 12 Jun 2019 15:51:07 -0400 Subject: [PATCH 155/380] Python Tile type improvements: optional cell_type on declaration; equality correctly handles no_data; add __matmul__ operator Signed-off-by: Jason T. Brown --- .../main/python/pyrasterframes/rf_types.py | 49 ++++++------- .../src/test/python/PyRasterFramesTests.py | 68 ++++++++++++++++--- 2 files changed, 81 insertions(+), 36 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 41b5c0efb..2849642ac 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -271,9 +271,16 @@ def __repr__(self): class Tile(object): - def __init__(self, cells, cell_type): - self.cell_type = cell_type - self.cells = cells.astype(cell_type.to_numpy_dtype()) + def __init__(self, cells, cell_type=None): + if cell_type is None: + # infer cell type from the cells dtype and whether or not it is masked + ct = CellType.from_numpy_dtype(cells.dtype) + if isinstance(cells, np.ma.MaskedArray): + ct = ct.with_no_data_value(cells.fill_value) + self.cell_type = ct + else: + self.cell_type = cell_type + self.cells = cells.astype(self.cell_type.to_numpy_dtype()) if self.cell_type.has_no_data(): nd_value = self.cell_type.no_data_value() @@ -285,7 +292,7 @@ def __init__(self, cells, cell_type): def __eq__(self, other): if type(other) is type(self): - return self.cell_type == other.cell_type and np.array_equal(self.cells, other.cells) + return self.cell_type == other.cell_type and np.ma.allequal(self.cells, other.cells) else: return False @@ -303,51 +310,39 @@ def __add__(self, right): else: other = right - _sum = np.add(self.cells, other) - ct = CellType.from_numpy_dtype(_sum.dtype) - if isinstance(_sum, np.ma.MaskedArray): - ct = ct.with_no_data_value(_sum.fill_value) - - return Tile(_sum, ct) + return Tile(np.add(self.cells, other)) def __sub__(self, right): if isinstance(right, Tile): other = right.cells else: other = right - _diff = np.subtract(self.cells, other) - ct = CellType.from_numpy_dtype(_diff.dtype) - if isinstance(_diff, np.ma.MaskedArray): - ct = ct.with_no_data_value(_diff.fill_value) - - return Tile(_diff, ct) + return Tile(np.subtract(self.cells, other)) def __mul__(self, right): if isinstance(right, Tile): other = right.cells else: other = right - prod = np.multiply(self.cells, other) - ct = CellType.from_numpy_dtype(prod.dtype) - if isinstance(prod, np.ma.MaskedArray): - ct = ct.with_no_data_value(prod.fill_value) - - return Tile(np.multiply(self.cells, other), self.cell_type) + return Tile(np.multiply(self.cells, other)) def __truediv__(self, right): if isinstance(right, Tile): other = right.cells else: other = right - quot = np.true_divide(self.cells, other) - ct = CellType.from_numpy_dtype(quot.dtype) - if isinstance(quot, np.ma.MaskedArray): - ct = ct.with_no_data_value(quot.fill_value) - return Tile(quot, ct) + return Tile(np.true_divide(self.cells, other)) def __div__(self, right): return self.__truediv__(right) + def __matmul__(self, right): + if isinstance(right, Tile): + other = right.cells + else: + other = right + return Tile(np.matmul(self.cells, other)) + def dimensions(self): # list of cols, rows as is conventional in GeoTrellis and RasterFrames return [self.cells.shape[1], self.cells.shape[0]] diff --git a/pyrasterframes/src/test/python/PyRasterFramesTests.py b/pyrasterframes/src/test/python/PyRasterFramesTests.py index 42936268f..3729d313c 100644 --- a/pyrasterframes/src/test/python/PyRasterFramesTests.py +++ b/pyrasterframes/src/test/python/PyRasterFramesTests.py @@ -29,6 +29,7 @@ from pyspark.sql.types import * from . import TestEnvironment + class VectorTypes(TestEnvironment): def setUp(self): @@ -374,7 +375,6 @@ class UDT(TestEnvironment): def setUp(self): self.create_rasterframe() - def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) self.assertTrue(t1.cells.mask[1][0]) @@ -449,8 +449,7 @@ def test_udf_on_tile_type_output(self): @udf(TileUDT()) def my_udf(t): import numpy as np - a = np.log1p(t.cells) - return Tile(a, CellType.from_numpy_dtype(a.dtype)) + return Tile(np.log1p(t.cells)) rf_result = rf.select( rf_tile_max( @@ -461,6 +460,7 @@ def my_udf(t): ).alias('expect_zeros') ).collect() + # almost equal because of different implemenations under the hoods: C (numpy) versus Java (rf_) numpy.testing.assert_almost_equal( [r['expect_zeros'] for r in rf_result], [0.0 for _ in rf_result], @@ -516,16 +516,63 @@ def less_pi(t): class TileOps(TestEnvironment): + def setUp(self): + # convenience so we can assert around Tile() == Tile() + self.t1 = Tile(np.array([[1, 2], + [3, 4]]), CellType.int8().with_no_data_value(3)) + self.t2 = Tile(np.array([[1, 2], + [3, 4]]), CellType.int8().with_no_data_value(1)) + def test_addition(self): - t1 = Tile(np.array([[1, 2], [3, 4]]), CellType.int8().with_no_data_value(3)) - e1 = np.ma.masked_equal(np.array([[5, 6], [7, 8]]), 7) - self.assertTrue(np.array_equal((t1 + 4).cells, e1)) + e1 = np.ma.masked_equal(np.array([[5, 6], + [7, 8]]), 7) + self.assertTrue(np.array_equal((self.t1 + 4).cells, e1)) + + e2 = np.ma.masked_equal(np.array([[3, 4], + [3, 8]]), 3) + r2 = (self.t1 + self.t2).cells + self.assertTrue(np.ma.allequal(r2, e2)) - t2 = Tile(np.array([[1, 2], [3, 4]]), CellType.int8().with_no_data_value(1)) - e2 = np.ma.masked_equal(np.array([[3, 4], [3, 8]]), 3) - r2 = (t1 + t2).cells + def test_multiplication(self): + e1 = np.ma.masked_equal(np.array([[4, 8], + [12, 16]]), 12) + + self.assertTrue(np.array_equal((self.t1 * 4).cells, e1)) + + e2 = np.ma.masked_equal(np.array([[3, 4], [3, 16]]), 3) + r2 = (self.t1 * self.t2).cells self.assertTrue(np.ma.allequal(r2, e2)) + def test_subtraction(self): + t3 = self.t1 * 4 + r1 = t3 - self.t1 + # note careful construction of mask value and dtype above + e1 = Tile(np.ma.masked_equal(np.array([[4 - 1, 8 - 2], + [3, 16 - 4]], dtype='int8'), + 3, ) + ) + self.assertTrue(r1 == e1, + "{} does not equal {}".format(r1, e1)) + # put another way + self.assertTrue(r1 == self.t1 * 3, + "{} does not equal {}".format(r1, self.t1 * 3)) + + def test_division(self): + t3 = self.t1 * 9 + r1 = t3 / 9 + self.assertTrue(np.array_equal(r1.cells, self.t1.cells), + "{} does not equal {}".format(r1, self.t1)) + + r2 = (self.t1 / self.t1).cells + self.assertTrue(np.array_equal(r2, np.array([[1,1], [1, 1]], dtype=r2.dtype))) + + def test_matmul(self): + r1 = self.t1 @ self.t2 + nd = r1.cell_type.no_data_value() + e1 = Tile(np.ma.masked_equal(np.array([[nd, 10], + [nd, nd]], dtype=r1.cell_type.to_numpy_dtype()), nd)) + self.assertTrue(r1 == e1) + class PandasInterop(TestEnvironment): def setUp(self): @@ -590,6 +637,7 @@ def test_extended_pandas_ops(self): self.assertIsInstance(array_back_2, Tile) np.testing.assert_equal(array_back_2.cells, simple_array.cells) + class RasterJoin(TestEnvironment): def setUp(self): @@ -705,8 +753,10 @@ def path(scene, band): b1_paths = [s.format('1') for s in scene_dict.values()] self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) + def suite(): function_tests = unittest.TestSuite() return function_tests + unittest.TextTestRunner().run(suite()) From 636252c99ada17bf5483a9096b3e0ec1b6ad0df6 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 12 Jun 2019 16:27:32 -0400 Subject: [PATCH 156/380] matmul test python 2 compatibility. Signed-off-by: Jason T. Brown --- .../test/scala/org/locationtech/rasterframes/TestData.scala | 1 - pyrasterframes/src/test/python/PyRasterFramesTests.py | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index a149f6b2a..7e1acda1d 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -32,7 +32,6 @@ import geotrellis.raster.io.geotiff.{MultibandGeoTiff, SinglebandGeoTiff} import geotrellis.spark._ import geotrellis.spark.testkit.TileLayerRDDBuilders import geotrellis.spark.tiling.LayoutDefinition -import geotrellis.vector.io.json.JsonFeatureCollection import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.commons.io.IOUtils import org.apache.spark.SparkContext diff --git a/pyrasterframes/src/test/python/PyRasterFramesTests.py b/pyrasterframes/src/test/python/PyRasterFramesTests.py index 3729d313c..b424979d9 100644 --- a/pyrasterframes/src/test/python/PyRasterFramesTests.py +++ b/pyrasterframes/src/test/python/PyRasterFramesTests.py @@ -567,7 +567,10 @@ def test_division(self): self.assertTrue(np.array_equal(r2, np.array([[1,1], [1, 1]], dtype=r2.dtype))) def test_matmul(self): - r1 = self.t1 @ self.t2 + # if sys.version >= '3.5': # per https://docs.python.org/3.7/library/operator.html#operator.matmul new in 3.5 + # r1 = self.t1 @ self.t2 + r1 = self.t1.__matmul__(self.t2) + nd = r1.cell_type.no_data_value() e1 = Tile(np.ma.masked_equal(np.array([[nd, 10], [nd, nd]], dtype=r1.cell_type.to_numpy_dtype()), nd)) From 4d42d11346eb5dcb5a7c5e62bb18a10527314478 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 13 Jun 2019 17:13:35 -0400 Subject: [PATCH 157/380] Initial prototype of pretty IPython rendering rf_types.Tile Signed-off-by: Jason T. Brown --- .../pretty_rendering_rf_types.tile.ipynb | 870 ++++++++++++++++++ 1 file changed, 870 insertions(+) create mode 100644 rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb diff --git a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb new file mode 100644 index 000000000..cf90008bd --- /dev/null +++ b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb @@ -0,0 +1,870 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Pretty rendering of `rf_type.Tile` " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Setup Spark Environment" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql import SparkSession\n", + "from pyrasterframes import *\n", + "from pyrasterframes.rasterfunctions import *\n", + "\n", + "spark = SparkSession.builder \\\n", + " .withKryoSerialization() \\\n", + " .getOrCreate() \\\n", + " .withRasterFrames()" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'scalaVersion': '2.11.12', 'builtAtMillis': '1560432286838', 'sbtVersion': '1.2.8', 'name': 'core', 'rfSparkVersion': '2.3.2', 'moduleName': 'rasterframes', 'rfGeoMesaVersion': '2.2.1', 'rfGeoTrellisVersion': '2.2.0', 'version': '0.8.0-SNAPSHOT', 'builtAtString': '2019-06-13 13:24:46.838'}" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from pyrasterframes import RFContext\n", + "RFContext.active().build_info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Read an EO raster source " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "href1 = \"https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\"\n", + "\n", + "from pyspark.sql.functions import col\n", + "# this here contortion is to force the RasterRef to evaluate; and to get the tile type \n", + "df = spark.read.rastersource(href1).withColumn('tile2', \n", + " rf_local_add_int(col('tile').tile, 0))" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "root\n", + " |-- tile_path: string (nullable = false)\n", + " |-- tile: struct (nullable = true)\n", + " | |-- tile_context: struct (nullable = false)\n", + " | | |-- extent: struct (nullable = false)\n", + " | | | |-- xmin: double (nullable = false)\n", + " | | | |-- ymin: double (nullable = false)\n", + " | | | |-- xmax: double (nullable = false)\n", + " | | | |-- ymax: double (nullable = false)\n", + " | | |-- crs: struct (nullable = false)\n", + " | | | |-- crsProj4: string (nullable = false)\n", + " | |-- tile: tile (nullable = false)\n", + " |-- tile2: tile (nullable = true)\n", + "\n" + ] + } + ], + "source": [ + "df.printSchema()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Boo!" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+\n", + "|tile_path |tile |tile2 |\n", + "+--------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF|[[[1.4455356755667E7, -2342509.0947641465, 1.4573964811098041E7, -2223901.039333], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], RasterRefTile(RasterRef(JVMGeoTiffRasterSource(https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF),0,Some(Extent(1.4455356755667E7, -2342509.0947641465, 1.4573964811098041E7, -2223901.039333))))] |[int16ud32767, (256,256), [1225,1244,1247,1222,1189,1216,1206,1185,1132,1040,...,1575,1489,1281,1189,1202,1145,1171,1189,1297,1382]]|\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF|[[[1.457396481109804E7, -2342509.0947641465, 1.4692572866529081E7, -2223901.039333], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], RasterRefTile(RasterRef(JVMGeoTiffRasterSource(https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF),0,Some(Extent(1.457396481109804E7, -2342509.0947641465, 1.4692572866529081E7, -2223901.039333))))]|[int16ud32767, (257,256), [1206,1140,1227,1147,1106,1026,994,1047,1020,1174,...,1793,1743,1685,1688,1706,1727,1766,1689,1561,1515]] |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF|[[[1.469257286652908E7, -2342509.0947641465, 1.4811180921960121E7, -2223901.039333], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], RasterRefTile(RasterRef(JVMGeoTiffRasterSource(https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF),0,Some(Extent(1.469257286652908E7, -2342509.0947641465, 1.4811180921960121E7, -2223901.039333))))]|[int16ud32767, (257,256), [1558,1546,1445,1329,1539,1653,1576,1533,1603,1610,...,1399,1434,1330,1429,1470,1451,1422,1407,1369,1310]]|\n", + "+--------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 3 rows\n", + "\n" + ] + } + ], + "source": [ + "df.show(3, False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Make it pretty\n", + "\n", + "To add this to the Tile class we can override `_repr_png_` (or `_repr_svg_` or others) to accomplish this." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "def tile_to_png(t):\n", + " # https://gist.github.com/rduplain/1641344\n", + " import io\n", + " from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas\n", + " from matplotlib.figure import Figure\n", + " from matplotlib.pyplot import imshow\n", + "\n", + " fig=Figure()\n", + " canvas=FigureCanvas(fig)\n", + " \n", + " axis = fig.add_subplot(1,1,1)\n", + " array = t.cells\n", + "\n", + " axis.imshow(array)\n", + " \n", + " output = io.BytesIO()\n", + " canvas.print_png(output)\n", + " return output.getvalue()" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [], + "source": [ + "# https://ipython.readthedocs.io/en/stable/config/integrating.html#integrating-rich-display\n", + "# https://ipython.readthedocs.io/en/stable/config/integrating.html#formatters-for-third-party-types\n", + "import pyrasterframes.rf_types\n", + "png_formatter = get_ipython().display_formatter.formatters['image/png']\n", + "png_formatter.for_type(pyrasterframes.rf_types.Tile, tile_to_png)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Get a tile, I'm from Missouri!" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "tile = df.select(df.tile2).first().tile2" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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OnRIli5dKvPmzQtFfN544w1JJpNy+PBhGRgYCD7y+XxwTtj7z3QxCnsfopljAki35MMPP5T29naJRqPy8MMPV21BECZr1qyRdDotpmlKJpOR1atXy6lTp4LjnufJli1bJJVKSSwWk6efflp6e3tr2OLb79ChQwLguo+1a9eKyMxiUigUZMOGDdLS0iLxeFxWrVolFy5cqMHV/P2mik8+n5euri6ZM2eOmKYp999/v6xdu/a6a79X4zNZXADIzp07g3PC3n+mi1HY+xDNnCYicufGG4mIiIio1ngPIBEREVHIMAEkIiIiChkmgEREREQhwwSQiIiIKGSYABIRERGFDBNAIiIiopBhAkhEREQUMkwAiYiIiEKGCSARERFRyDABJCIiIgoZJoBEREREIcMEkIiIiChkmAASERERhQwTQCIiIqKQYQJIREREFDJMAImIiIhChgkgERERUcgwASQiIiIKGSaARERERCHDBJCIiIgoZJgAEhEREYUME0AiIiKikGECSERERBQyTACJiIiIQoYJIBEREVHIMAEkIiIiChkmgEREREQhwwSQiIiIKGSYABIRERGFDBNAIiIiopBhAkhEREQUMv8HmitVNmKy8hUAAAAASUVORK5CYII=\n", + "text/plain": [ + "Tile(masked_array(\n", + " data=[[1225, 1244, 1247, ..., 1305, 1245, 1206],\n", + " [1166, 1188, 1190, ..., 1381, 1251, 1193],\n", + " [1156, 1110, 1122, ..., 1248, 1245, 1270],\n", + " ...,\n", + " [1485, 1749, 1761, ..., 1034, 996, 998],\n", + " [1780, 1777, 1663, ..., 1008, 1027, 1174],\n", + " [1728, 1647, 1562, ..., 1189, 1297, 1382]],\n", + " mask=False,\n", + " fill_value=32767,\n", + " dtype=int16), int16ud32767)" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tile" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Boom!\n", + "\n", + "# Now do it with Pandas DF" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "pandas_df = df.select(rf_crs(df.tile), \n", + " rf_extent(df.tile), \n", + " df.tile2).limit(10).toPandas()" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "metadata": {}, + "outputs": [], + "source": [ + "def tile_to_html(t):\n", + " import base64\n", + " b64_img_html = ''\n", + " \n", + " bitz = tile_to_png(t)\n", + " b64_img = base64.b64encode(bitz).decode('utf-8').replace('\\n', '')\n", + " return b64_img_html.format(b64_img)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is less general as we have to construct this call each time... Also need to enforce this max col width option." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    rf_crs(tile)rf_extent(tile)tile2
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)
    " + ], + "text/plain": [ + "" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from IPython.display import HTML\n", + "import pandas as pd\n", + "pd.options.display.max_colwidth = -1\n", + "HTML(pandas_df.to_html(escape=False, formatters=dict(tile2=tile_to_html)))" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "

    \n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    rf_crs(tile)rf_extent(tile)tile2
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]])
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]])
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]])
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]])
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]])
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]])
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]])
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]])
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]])
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]])
    \n", + "
    " + ], + "text/plain": [ + " rf_crs(tile) \\\n", + "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "\n", + " rf_extent(tile) \\\n", + "0 (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333) \n", + "1 (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333) \n", + "2 (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333) \n", + "3 (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333) \n", + "4 (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333) \n", + "5 (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333) \n", + "6 (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333) \n", + "7 (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333) \n", + "8 (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333) \n", + "9 (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333) \n", + "\n", + " tile2 \n", + "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]]) \n", + "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]]) \n", + "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]]) \n", + "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]]) \n", + "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]]) \n", + "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]]) \n", + "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]]) \n", + "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]]) \n", + "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]]) \n", + "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]]) " + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Default viz remains\n", + "pandas_df" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "def pd_tile_to_html(dataframe):\n", + " from IPython.display import HTML\n", + " import pandas as pd\n", + " pd.options.display.max_colwidth = -1\n", + " \n", + " tile_cols = []\n", + " for c in dataframe.columns:\n", + " if isinstance(dataframe.iloc[0][c], pyrasterframes.rf_types.Tile):\n", + " tile_cols.append(c)\n", + " # dict keyed by column with custome rendering function\n", + " formatter = {c: tile_to_html for c in tile_cols}\n", + " return dataframe.to_html(escape=False, formatters=formatter)" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 28, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# this would possibly be able to be in an import scenario?\n", + "html_formatter = get_ipython().display_formatter.formatters['text/html']\n", + "html_formatter.for_type(pd.DataFrame, pd_tile_to_html)" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    rf_crs(tile)rf_extent(tile)tile2
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)
    " + ], + "text/plain": [ + " rf_crs(tile) \\\n", + "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "\n", + " rf_extent(tile) \\\n", + "0 (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333) \n", + "1 (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333) \n", + "2 (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333) \n", + "3 (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333) \n", + "4 (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333) \n", + "5 (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333) \n", + "6 (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333) \n", + "7 (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333) \n", + "8 (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333) \n", + "9 (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333) \n", + "\n", + " tile2 \n", + "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]]) \n", + "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]]) \n", + "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]]) \n", + "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]]) \n", + "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]]) \n", + "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]]) \n", + "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]]) \n", + "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]]) \n", + "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]]) \n", + "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]]) " + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pandas_df" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
    rf_crs(tile)rf_extent(tile)tile2threex
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)
    " + ], + "text/plain": [ + " rf_crs(tile) \\\n", + "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + "\n", + " rf_extent(tile) \\\n", + "0 (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333) \n", + "1 (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333) \n", + "2 (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333) \n", + "3 (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333) \n", + "4 (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333) \n", + "5 (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333) \n", + "6 (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333) \n", + "7 (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333) \n", + "8 (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333) \n", + "9 (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333) \n", + "\n", + " tile2 \\\n", + "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]]) \n", + "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]]) \n", + "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]]) \n", + "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]]) \n", + "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]]) \n", + "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]]) \n", + "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]]) \n", + "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]]) \n", + "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]]) \n", + "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]]) \n", + "\n", + " threex \n", + "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3675 3732 3741 ... 3915 3735 3618]\\n [3498 3564 3570 ... 4143 3753 3579]\\n [3468 3330 3366 ... 3744 3735 3810]\\n ...\\n [4455 5247 5283 ... 3102 2988 2994]\\n [5340 5331 4989 ... 3024 3081 3522]\\n [5184 4941 4686 ... 3567 3891 4146]]) \n", + "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3618 3420 3681 ... 5199 4830 4674]\\n [3579 3474 3345 ... 4806 5277 5472]\\n [3810 3462 3210 ... 5445 5259 5535]\\n ...\\n [2994 3255 3498 ... 5274 5265 5103]\\n [3522 3906 3876 ... 5268 5046 4806]\\n [4146 3864 3627 ... 5067 4683 4545]]) \n", + "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[4674 4638 4335 ... 5070 5073 5145]\\n [5472 5349 5286 ... 5445 5388 5337]\\n [5535 5319 4968 ... 5151 5235 5508]\\n ...\\n [5103 4869 4860 ... 4206 4056 4326]\\n [4806 4890 4881 ... 4122 4251 4260]\\n [4545 4569 4455 ... 4221 4107 3930]]) \n", + "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[5145 5295 5025 ... 3303 3420 3447]\\n [5337 5400 5442 ... 3543 3636 3720]\\n [5508 5403 5337 ... 3186 3639 3690]\\n ...\\n [4326 4434 4338 ... 5367 5244 5220]\\n [4260 4152 4059 ... 5235 5190 5223]\\n [3930 3684 3828 ... 5184 5202 5052]]) \n", + "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3447 3513 3816 ... 1839 1851 1866]\\n [3720 3822 3852 ... 2055 1917 1953]\\n [3690 3678 3519 ... 2007 1947 1902]\\n ...\\n [5220 5328 5058 ... 3648 3507 3348]\\n [5223 4998 4608 ... 3555 3198 3282]\\n [5052 4581 4731 ... 3255 3306 3273]]) \n", + "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1866 1878 1881 ... 1092 849 744]\\n [1953 2019 2106 ... 792 738 744]\\n [1902 2325 2313 ... 738 780 795]\\n ...\\n [3348 3294 3303 ... 2913 2778 2817]\\n [3282 3279 3342 ... 3039 3063 2700]\\n [3273 3294 3381 ... 3138 2853 2442]]) \n", + "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 744 684 753 ... 3168 3237 3138]\\n [ 744 741 810 ... 3372 3438 3564]\\n [ 795 837 840 ... 3138 3534 3870]\\n ...\\n [2817 2958 3291 ... 3246 3198 3243]\\n [2700 3045 3789 ... 3090 3027 2883]\\n [2442 2988 4287 ... 2964 2694 2400]]) \n", + "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3138 3264 3720 ... 2238 2481 2628]\\n [3564 3846 3900 ... 2502 2298 1995]\\n [3870 3798 3672 ... 1989 2052 1929]\\n ...\\n [3243 3027 3000 ... 1881 1740 1584]\\n [2883 2823 2805 ... 1821 1722 1830]\\n [2400 2595 2514 ... 1359 1341 1572]]) \n", + "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[2238 2250 2226 ... 432 351 336]\\n [1875 1899 2067 ... 312 552 429]\\n [1878 2022 1998 ... 483 441 513]\\n ...\\n [1758 1779 1779 ... 198 141 168]\\n [1755 1629 1548 ... 159 132 201]\\n [1545 1362 1347 ... 162 153 150]]) \n", + "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[402 531 543 ... 138 99 75]\\n [438 372 462 ... 129 156 114]\\n [525 507 483 ... 141 75 114]\\n ...\\n [162 147 192 ... 132 141 138]\\n [159 156 129 ... 171 147 129]\\n [138 138 144 ... 150 147 90]]) " + ] + }, + "execution_count": 31, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pandas_df['threex'] = pandas_df.tile2.apply(lambda t: t * 3)\n", + "pandas_df" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} From 9d1b2f4a9d7355ffd60d2c14fb04aaf69faf2ba6 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 14 Jun 2019 14:27:13 -0400 Subject: [PATCH 158/380] Add Python Tile png and html display methods for IPython Signed-off-by: Jason T. Brown --- .../main/python/pyrasterframes/rf_types.py | 95 +- .../src/main/python/requirements.txt | 1 + .../pretty_rendering_rf_types.tile.ipynb | 1434 +++++++++++------ 3 files changed, 1034 insertions(+), 496 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 41b5c0efb..1637c551a 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -349,9 +349,102 @@ def __div__(self, right): return self.__truediv__(right) def dimensions(self): - # list of cols, rows as is conventional in GeoTrellis and RasterFrames + """ Return a list of cols, rows as is conventional in GeoTrellis and RasterFrames.""" return [self.cells.shape[1], self.cells.shape[0]] + def to_png(self): + """ Provide image of Tile.""" + if self.cells is None: + return None + + import io + from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas + from matplotlib.figure import Figure + + # Set up matplotlib objects + [width, height] = self.dimensions() + dpi = 300 + nominal_size = 5.5 # approx full size for a 256x256 tile + fig = Figure(figsize=(nominal_size * width / dpi, nominal_size * height / dpi)) + canvas = FigureCanvas(fig) + axis = fig.add_subplot(1, 1, 1) + + axis.imshow(self.cells) + axis.set_aspect('equal') + axis.xaxis.set_ticks([]) + axis.yaxis.set_ticks([]) + + axis.set_title('{}, {})'.format(self.dimensions(), self.cell_type.__repr__())) # compact metadata as title + + with io.BytesIO() as output: + canvas.print_png(output) + return output.getvalue() + + def to_html(self): + """ Provide HTML string representation of Tile image.""" + import base64 + b64_img_html = '' + png_bits = self.to_png() + b64_png = base64.b64encode(png_bits).decode('utf-8').replace('\n', '') + return b64_img_html.format(b64_png) + + def _repr_png_(self): + """Provide default PNG rendering in IPython and Jupyter""" + return self.to_png() + + @classmethod + def pandas_df_to_html(cls, df): + """ + Provide HTML formatting for pandas.DataFrame or pandas.Series of Tile + """ + import pandas as pd + # honor the existing options on display + if not pd.get_option("display.notebook_repr_html"): + return None + + if len(df) == 0: + return df._repr_html_() + + + tile_cols = [] + for c in df.columns: + if isinstance(df.iloc[0][c], cls): # if the first is a Tile try formatting + tile_cols.append(c) + + def tile_to_html(t): + if isinstance(t, Tile): + return t.to_html() + else: + return t.__repr__() + + # dict keyed by column with custom rendering function + formatter = {c: tile_to_html for c in tile_cols} + + # This is needed to avoid our tile being rendered as `=1.7 pandas +matplotlib diff --git a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb index cf90008bd..dd13f9af1 100644 --- a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb +++ b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb @@ -11,7 +11,9 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Setup Spark Environment" + "### Setup Spark Environment\n", + "\n", + "Minimal imports" ] }, { @@ -21,8 +23,7 @@ "outputs": [], "source": [ "from pyspark.sql import SparkSession\n", - "from pyrasterframes import *\n", - "from pyrasterframes.rasterfunctions import *\n", + "import pyrasterframes\n", "\n", "spark = SparkSession.builder \\\n", " .withKryoSerialization() \\\n", @@ -30,27 +31,6 @@ " .withRasterFrames()" ] }, - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "{'scalaVersion': '2.11.12', 'builtAtMillis': '1560432286838', 'sbtVersion': '1.2.8', 'name': 'core', 'rfSparkVersion': '2.3.2', 'moduleName': 'rasterframes', 'rfGeoMesaVersion': '2.2.1', 'rfGeoTrellisVersion': '2.2.0', 'version': '0.8.0-SNAPSHOT', 'builtAtString': '2019-06-13 13:24:46.838'}" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "from pyrasterframes import RFContext\n", - "RFContext.active().build_info()" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -60,21 +40,22 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "href1 = \"https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\"\n", "\n", "from pyspark.sql.functions import col\n", + "from pyrasterframes.rasterfunctions import rf_local_add_int\n", "# this here contortion is to force the RasterRef to evaluate; and to get the tile type \n", - "df = spark.read.rastersource(href1).withColumn('tile2', \n", - " rf_local_add_int(col('tile').tile, 0))" + "df = spark.read.rastersource(href1)\\\n", + " .withColumn('tile2', rf_local_add_int(col('tile').tile, 0))" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [ { @@ -106,92 +87,16 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Boo!" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "+--------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+\n", - "|tile_path |tile |tile2 |\n", - "+--------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+\n", - "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF|[[[1.4455356755667E7, -2342509.0947641465, 1.4573964811098041E7, -2223901.039333], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], RasterRefTile(RasterRef(JVMGeoTiffRasterSource(https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF),0,Some(Extent(1.4455356755667E7, -2342509.0947641465, 1.4573964811098041E7, -2223901.039333))))] |[int16ud32767, (256,256), [1225,1244,1247,1222,1189,1216,1206,1185,1132,1040,...,1575,1489,1281,1189,1202,1145,1171,1189,1297,1382]]|\n", - "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF|[[[1.457396481109804E7, -2342509.0947641465, 1.4692572866529081E7, -2223901.039333], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], RasterRefTile(RasterRef(JVMGeoTiffRasterSource(https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF),0,Some(Extent(1.457396481109804E7, -2342509.0947641465, 1.4692572866529081E7, -2223901.039333))))]|[int16ud32767, (257,256), [1206,1140,1227,1147,1106,1026,994,1047,1020,1174,...,1793,1743,1685,1688,1706,1727,1766,1689,1561,1515]] |\n", - "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF|[[[1.469257286652908E7, -2342509.0947641465, 1.4811180921960121E7, -2223901.039333], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], RasterRefTile(RasterRef(JVMGeoTiffRasterSource(https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF),0,Some(Extent(1.469257286652908E7, -2342509.0947641465, 1.4811180921960121E7, -2223901.039333))))]|[int16ud32767, (257,256), [1558,1546,1445,1329,1539,1653,1576,1533,1603,1610,...,1399,1434,1330,1429,1470,1451,1422,1407,1369,1310]]|\n", - "+--------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------------------------------------------------------------------------------------------------------------------+\n", - "only showing top 3 rows\n", - "\n" - ] - } - ], - "source": [ - "df.show(3, False)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Make it pretty\n", + "# Rendering of python object in Jupyter / IPython \n", "\n", - "To add this to the Tile class we can override `_repr_png_` (or `_repr_svg_` or others) to accomplish this." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "def tile_to_png(t):\n", - " # https://gist.github.com/rduplain/1641344\n", - " import io\n", - " from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas\n", - " from matplotlib.figure import Figure\n", - " from matplotlib.pyplot import imshow\n", + "A `pyrasterframes.rf_types.Tile` will automatically render nicely in Jupyter or IPython.\n", "\n", - " fig=Figure()\n", - " canvas=FigureCanvas(fig)\n", - " \n", - " axis = fig.add_subplot(1,1,1)\n", - " array = t.cells\n", - "\n", - " axis.imshow(array)\n", - " \n", - " output = io.BytesIO()\n", - " canvas.print_png(output)\n", - " return output.getvalue()" + "A `pandas.DataFrame` containing a `Tile` column will automatically render nicely in Jupyter or IPython." ] }, { "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [], - "source": [ - "# https://ipython.readthedocs.io/en/stable/config/integrating.html#integrating-rich-display\n", - "# https://ipython.readthedocs.io/en/stable/config/integrating.html#formatters-for-third-party-types\n", - "import pyrasterframes.rf_types\n", - "png_formatter = get_ipython().display_formatter.formatters['image/png']\n", - "png_formatter.for_type(pyrasterframes.rf_types.Tile, tile_to_png)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Get a tile, I'm from Missouri!" - ] - }, - { - "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -200,12 +105,12 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 5, "metadata": {}, "outputs": [ { "data": { - "image/png": "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OnRIli5dKvPmzQtFfN544w1JJpNy+PBhGRgYCD7y+XxwTtj7z3QxCnsfopljAki35MMPP5T29naJRqPy8MMPV21BECZr1qyRdDotpmlKJpOR1atXy6lTp4LjnufJli1bJJVKSSwWk6efflp6e3tr2OLb79ChQwLguo+1a9eKyMxiUigUZMOGDdLS0iLxeFxWrVolFy5cqMHV/P2mik8+n5euri6ZM2eOmKYp999/v6xdu/a6a79X4zNZXADIzp07g3PC3n+mi1HY+xDNnCYicufGG4mIiIio1ngPIBEREVHIMAEkIiIiChkmgEREREQhwwSQiIiIKGSYABIRERGFDBNAIiIiopBhAkhEREQUMkwAiYiIiEKGCSARERFRyDABJCIiIgoZJoBEREREIcMEkIiIiChkmAASERERhQwTQCIiIqKQYQJIREREFDJMAImIiIhChgkgERERUcgwASQiIiIKGSaARERERCHDBJCIiIgoZJgAEhEREYUME0AiIiKikGECSERERBQyTACJiIiIQoYJIBEREVHIMAEkIiIiChkmgEREREQhwwSQiIiIKGSYABIRERGFDBNAIiIiopBhAkhEREQUMv8HmitVNmKy8hUAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdUAAAHVCAYAAACnuWH3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXmwZVV5Nv6stfbeZz733r739tx0g6gERIFKKH7GT9tYgoKlUkYFjYIgZTSaREVM4dQIRomKUlYlDiCaSCUiFXCIiCKgqJgvTijOCD1Aj3c+4x7Wen9/rGkfummmm0/bXk8VRd9z9tl77bXXXu/0vO/LiIgQEBAQEBAQ8LjBf98DCAgICAgI+GNBEKoBAQEBAQHLhCBUAwICAgIClglBqAYEBAQEBCwTglANCAgICAhYJgShGhAQEBAQsEwIQjUgICAgIGCZEIRqQEBAQEDAMiEI1YCAgICAgGVCEKoBAQEBAQHLhCBUAwICAgIClglBqAYEBAQEBCwTglANCAgICAhYJgShGhAQEBAQsEwIQjUgICAgIGCZEIRqQEBAQEDAMiEI1YCAgICAgGVCEKoBAQEBAQHLhCBUAwICAgIClglBqAYEBAQEBCwTglANCAgICAhYJgShGhAQEBAQsEwIQjUgICAgIGCZEIRqQEBAQEDAMiEI1YCAgICAgGVCEKoBAQEBAQHLhCBUAwICAgIClglBqAYEBAQEBCwTglANCAgICAhYJgShGhAQEBAQsEwIQjUgICAgIGCZEIRqQEBAQEDAMiEI1YCAgICAgGVCEKoBAQEBAQHLhCBUAwICAgIClglBqAY4nHvuuWCMgTGGpzzlKe7zpaUlvO9978PmzZuxevVqNJtNHH/88bj88ssxHA5HzrF161Z3jgf/9x//8R/7XZOIcM011+Dkk09Go9FAu93GSSedhC9+8YuP6R5uvfVWnHfeeTjmmGPQaDSwbt06vOhFL8IPf/jDg95v+b9jjjnmgOfetm0bzjvvPKxduxaVSgXr1q3DmWeeOXLMRz/60ZFzzczMPOp7uP3228EYw+233/6of9vv97Fly5YD/rbT6eCiiy7CqaeeiunpaTDGsGXLloc8V57nuOKKK3D88cejVqthfHwcT3/60/G9733vUY/rYNi8eTM2b97s/u71ejjrrLPw5Cc/Ga1WC41GA8cddxwuu+wy9Hq9kd/+53/+J84++2wcffTRqNVq2LRpE175ylfit7/97chxB1uXjDE873nP229cd999N1760pdienoalUoFmzZtwhve8IaRYzZt2vSQ56xWq+64+fl5jI+P48Ybb1yGGQv4Q0b0+x5AwB8WVq9ejRtuuAH1et19tn37dnz0ox/Fq171KrzlLW9Bs9nEHXfcgS1btuAb3/gGvvGNb4AxNnKeN73pTXjFK14x8tkTn/jE/a73+te/Hp/5zGfw5je/Ge9///tRFAV+9rOfod/vP6bx/8u//AtmZ2fxd3/3dzj22GOxb98+fPjDH8Ypp5yCm2++GX/xF38xcnytVsOtt96632cPxt13343NmzfjqKOOwoc+9CGsX78eu3btws033zxy3FlnnYVTTjkFV111Fa6++urHdA8nnXQS7rzzThx77LGP+rf9fh+XXHIJAIwIKgCYnZ3FJz/5STztaU/Di1/8Ylx11VUPeR4pJc4880x85zvfwUUXXYSnP/3p6PV6+OEPf7ifYFtu5HkOIsJb3vIWHHnkkeCc49vf/jbe+9734vbbb8ctt9zijr388suxevVqvOMd78BRRx2FHTt24B//8R9x0kkn4fvf/z6OO+44AMCaNWtw55137netG2+8EZdffvl+ytFtt92GM844A//n//wffPzjH8fU1BS2b9+OH//4xyPH3XDDDUjTdOSz7du34+Uvf/nIOScmJvDmN78Zb3vb23D66acjSZLHPU8Bf6CggACDc845hzZu3Ljf591ul7rd7n6ff/CDHyQAdMcdd7jP7rvvPgJAH/zgBx/2ejfccAMBoM9//vOPa9xl7NmzZ7/POp0OrVq1ip7znOeMfH7OOedQo9F42HMqpeiEE06gE044gYbD4SMax3ve8x4CQPv27XtkA18m7Nu3jwDQe97znv2+U0qRUuphjyMi+shHPkKcc7rzzjv/F0er8axnPYue9axnPexxF110EQGg3/3ud+6zAz3vBx54gOI4pvPPP/9hz7l582aq1+u0uLjoPuv1erRmzRo644wz3Hw9GmzZsoUA0C233DLy+e7duymKIrr22msf9TkDDh0E92/Aw6LRaKDRaOz3+cknnwwA2LFjx2M675VXXolNmzbhZS972eMaXxkrV67c77Nms4ljjz32MY/z29/+Nn7yk5/g7//+71GpVB7vEB8WB3L/nnvuuWg2m7jnnntw+umno9lsYsOGDXjrW9/qLKWtW7dienoaAHDJJZc4N+S5554LAO7vR4Irr7wSz3zmM3HKKacc9LjPfOYzYIxh69atD3sPRIR/+qd/wsaNG1GtVnHSSSfhpptuekTjAeDuLYq8g+1Az3vt2rVYv379wz7v3/3ud/jWt76Fl73sZWi32+7zL3zhC9i1axfe9ra3PeL5siATzjjqqKP284qsWrUKz33uc/Hxj3/8UZ0z4NBCEKoBjxnWbWpdbGV84AMfQJIkqNfreMYznoEvfelLI98XRYE777wTJ554Iq644gps3LgRQgjnXiWiZRvn4uIifvSjHx1wnIPBAKtXr4YQAuvXr8cb3/hGzM3NjRzz7W9/GwDQarVw+umno1qtotls4gUveAF+9atfLds4Hw55nuOFL3whnvOc5+CLX/wizjvvPHzkIx/B5ZdfDkC7OL/2ta8BAM4//3zceeeduPPOO/Gud73rUV1nx44d2Lp1K44//nhcfPHFWLVqFaIownHHHYfPfvazj3n8l1xyCd7+9rfjuc99Lm688Ua8/vWvxwUXXIBf//rXBzyeiFAUBZaWlvC1r30NH/7wh3H22WfjiCOOOOh17r33Xmzbtu2Az7uMT3/60yAivPa1rx353D5vKSWe8YxnIEkSTExM4Oyzz8bOnTsPes5bbrnFxd4PJJA3b96M7373u1hYWDjoeQIOYfxe7eSAPyg8lPv3QLjrrruoVqvRmWeeOfL5zp076YILLqDrrruO7rjjDrr22mvplFNOIQD0qU99yh23a9cuAkDtdpvWr19Pn/3sZ+mb3/wm/fVf/zUBoIsvvnjZ7uuVr3wlRVFEP/jBD0Y+v+KKK+iKK66gr3/96/T1r3+d3vGOd1C9XqdjjjmGOp2OO+51r3udG+v5559Pt9xyC/3bv/0bbdy4kaampmjnzp37XfPxuH9vu+02AkC33Xab++ycc84hAHTdddeNHHv66afTk5/8ZPf3w7l1H8lxd955p7vfY489lq677jq6+eab6S//8i8JAH3yk590x15zzTUEgO67776D3sP8/DxVq9X91st3v/tdAnBA9++///u/EwD332te8xrK8/yg95XnOW3evJna7TZt3779IY8rioLWrVtHxxxzzH7fnXbaaQSAxsfH6aKLLqJbb72VPv7xj9Pk5CQdffTR1Ov1HvK8L3/5y0kIQffff/8Bv//GN75BAOimm2466H0EHLoIQjXA4ZEK1fvuu482bNhAT3rSk2h2dvZhj8+yjE488USanJx0m+IDDzzgNssHx+1e/OIXU7VaHRFsjxXvfOc7CQB97GMfe0THX3/99QSArrjiCvfZBRdcQADotNNOGzn2xz/+MQGgd7zjHfud539DqDLGaDAYjBz7D//wD1StVt3fyyFUraBLkoS2bt3qPldK0UknnUTr1693nz1SofrVr36VAND111+/3/U2btx4QKE6NzdH//M//0O33norve9976N2u00vfOELSUp5wHtSStGrX/1qEkLQjTfeeND7/8pXvvKQsf/nPve5BIBe97rXjXx+44037qccljE7O0uVSoXOOOOMh7zuXXfdRQDoqquuOuj4Ag5dBPdvwKPCtm3b8OxnPxtRFOGb3/wmVqxY8bC/ieMYL3/5yzE7O+tSHSYmJsAYQ7vd3i9u9/znPx/D4RC/+MUvHtdYL7nkElx22WV43/vehze+8Y2P6DdnnnkmGo0Gvv/977vPJicnAQCnnXbayLEnnHAC1qxZgx/96EePa5yPFPV6fSRNAwAqlcp+aU2PF/Z+jznmGGzcuNF9zhjDaaedhvvvvx979+59VOecnZ0FoNnlD8aBPgP0GvnTP/1TPPvZz8bFF1+MT37yk/jSl750wHQrMm7cz33uc/jMZz6DF73oRQcdz9VXX404jvHqV796v+8e6nmfdtppYIw95PP+3Oc+hzRN93Mnl2Gf32AwOOj4Ag5dBKEa8Iixbds2bN68GUSE2267DevXr3/EvyUTI+VcL7larXbAFJsDHftYcMkll2DLli3YsmULLr744kf1WyIaufZTn/rUR3zsHwOe8IQnjKRUlfHgZ2OFxIPTSh6cn2sF1e7du/c754E+OxAsMe43v/nNfmN67Wtfi2uuuQZXXXUV/uqv/uqg59m7dy++8pWv4IUvfOEBiU4He97AQ6/Lq6++GqtWrcILXvCCh/ytjddPTU0d9BoBhy7+uHaDgP81bN++HZs3b4aUErfeeuuIBfNwyPMcn//85zE1NYWjjz7aff6Sl7wES0tL+xUT+OpXv4pms/mwRJOHwqWXXootW7bgne98J97znvc8qt9ef/316Pf7I9bz85//fNTr9f2Yqj/60Y+we/fuh2XI/r+E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\n", "text/plain": [ "Tile(masked_array(\n", " data=[[1225, 1244, 1247, ..., 1305, 1245, 1206],\n", @@ -220,7 +125,7 @@ " dtype=int16), int16ud32767)" ] }, - "execution_count": 9, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -233,146 +138,60 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Boom!\n", - "\n", - "# Now do it with Pandas DF" + "You can also still access the string representation easily." ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 6, "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "'Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]])'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ - "pandas_df = df.select(rf_crs(df.tile), \n", - " rf_extent(df.tile), \n", - " df.tile2).limit(10).toPandas()" + "str(tile)" ] }, { - "cell_type": "code", - "execution_count": 11, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "def tile_to_html(t):\n", - " import base64\n", - " b64_img_html = ''\n", - " \n", - " bitz = tile_to_png(t)\n", - " b64_img = base64.b64encode(bitz).decode('utf-8').replace('\\n', '')\n", - " return b64_img_html.format(b64_img)" + "## `pandas.DataFrame` example" ] }, { - "cell_type": "markdown", + "cell_type": "code", + "execution_count": 7, "metadata": {}, + "outputs": [], "source": [ - "This is less general as we have to construct this call each time... Also need to enforce this max col width option." + "from pyrasterframes.rasterfunctions import rf_crs, rf_extent\n", + "pandas_df = df.select(df.tile_path,\n", + " rf_crs(df.tile), \n", + " rf_extent(df.tile), \n", + " df.tile2\n", + " ).limit(10).toPandas()" ] }, { - "cell_type": "code", - "execution_count": 12, - "metadata": { - "scrolled": true - }, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    rf_crs(tile)rf_extent(tile)tile2
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)
    " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "cell_type": "markdown", + "metadata": {}, "source": [ - "from IPython.display import HTML\n", - "import pandas as pd\n", - "pd.options.display.max_colwidth = -1\n", - "HTML(pandas_df.to_html(escape=False, formatters=dict(tile2=tile_to_html)))" + "In this output you may like to double-click a cell in the `tile2` column to \"expand\" the rows to full size rendering of the tile image." ] }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 8, "metadata": { "scrolled": true }, @@ -398,6 +217,7 @@ " \n", " \n", " \n", + " tile_path\n", " rf_crs(tile)\n", " rf_extent(tile)\n", " tile2\n", @@ -406,436 +226,1060 @@ " \n", " \n", " 0\n", + "
    https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)\n", - " Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]])\n", + " \n", " \n", " \n", " 1\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]])\n", + " \n", " \n", " \n", " 2\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]])\n", + " \n", " \n", " \n", " 3\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]])\n", + " \n", " \n", " \n", " 4\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]])\n", + " \n", " \n", " \n", " 5\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]])\n", + " \n", " \n", " \n", " 6\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]])\n", + " \n", " \n", " \n", " 7\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)\n", - " Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]])\n", + " \n", " \n", " \n", " 8\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)\n", - " Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]])\n", + " \n", " \n", " \n", " 9\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)\n", - " Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]])\n", + " \n", " \n", " \n", "\n", "" ], "text/plain": [ - " rf_crs(tile) \\\n", - "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", + " tile_path \\\n", + "0 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "1 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "2 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "3 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "4 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "5 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "6 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "7 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "8 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "9 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "\n", + " rf_crs(tile) \\\n", + "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", + "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", "\n", - " rf_extent(tile) \\\n", - "0 (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333) \n", - "1 (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333) \n", - "2 (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333) \n", - "3 (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333) \n", - "4 (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333) \n", - "5 (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333) \n", - "6 (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333) \n", - "7 (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333) \n", - "8 (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333) \n", - "9 (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333) \n", + " rf_extent(tile) \\\n", + "0 (14455356.755667, -2342509.0947641465, 1457396... \n", + "1 (14573964.81109804, -2342509.0947641465, 14692... \n", + "2 (14692572.86652908, -2342509.0947641465, 14811... \n", + "3 (14811180.92196012, -2342509.0947641465, 14929... \n", + "4 (14929788.97739116, -2342509.0947641465, 15048... \n", + "5 (15048397.0328222, -2342509.0947641465, 151670... \n", + "6 (15167005.08825324, -2342509.0947641465, 15285... \n", + "7 (15285613.14368428, -2342509.0947641465, 15404... \n", + "8 (15404221.199115321, -2342509.0947641465, 1552... \n", + "9 (15522829.254546361, -2342509.0947641465, 1556... \n", "\n", - " tile2 \n", - "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]]) \n", - "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]]) \n", - "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]]) \n", - "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]]) \n", - "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]]) \n", - "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]]) \n", - "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]]) \n", - "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]]) \n", - "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]]) \n", - "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]]) " + " tile2 \n", + "0 Tile(dimensions=[256, 256], cell_type=CellType... \n", + "1 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "2 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "3 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "4 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "5 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "6 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "7 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "8 Tile(dimensions=[256, 256], cell_type=CellType... \n", + "9 Tile(dimensions=[96, 256], cell_type=CellType(... " ] }, - "execution_count": 13, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# Default viz remains\n", "pandas_df" ] }, { - "cell_type": "code", - "execution_count": 27, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "def pd_tile_to_html(dataframe):\n", - " from IPython.display import HTML\n", - " import pandas as pd\n", - " pd.options.display.max_colwidth = -1\n", - " \n", - " tile_cols = []\n", - " for c in dataframe.columns:\n", - " if isinstance(dataframe.iloc[0][c], pyrasterframes.rf_types.Tile):\n", - " tile_cols.append(c)\n", - " # dict keyed by column with custome rendering function\n", - " formatter = {c: tile_to_html for c in tile_cols}\n", - " return dataframe.to_html(escape=False, formatters=formatter)" + "You still get the default string representatation of a `pandas.Series`" ] }, { "cell_type": "code", - "execution_count": 28, - "metadata": {}, + "execution_count": 9, + "metadata": { + "scrolled": true + }, "outputs": [ { "data": { "text/plain": [ - "" + "tile_path https://modis-pds.s3.amazonaws.com/MCD43A4.006...\n", + "rf_crs(tile) (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...\n", + "rf_extent(tile) (15404221.199115321, -2342509.0947641465, 1552...\n", + "tile2 Tile(dimensions=[256, 256], cell_type=CellType...\n", + "Name: 8, dtype: object" ] }, - "execution_count": 28, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "# this would possibly be able to be in an import scenario?\n", - "html_formatter = get_ipython().display_formatter.formatters['text/html']\n", - "html_formatter.for_type(pd.DataFrame, pd_tile_to_html)" + "pandas_df.iloc[8]" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 10, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "0 Tile(dimensions=[256, 256], cell_type=CellType...\n", + "1 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "2 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "3 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "4 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "5 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "6 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "7 Tile(dimensions=[257, 256], cell_type=CellType...\n", + "8 Tile(dimensions=[256, 256], cell_type=CellType...\n", + "9 Tile(dimensions=[96, 256], cell_type=CellType(...\n", + "Name: tile2, dtype: object" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "pandas_df.tile2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And nothing different happens for a `pandas.DataFrame` that doesn't have a `Tile` in it." + ] + }, + { + "cell_type": "code", + "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/html": [ + "
    \n", + "\n", "\n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - "
    rf_crs(tile)rf_extent(tile)tile2iataairportcitystatecountrylatlongcnt
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)ORDChicago O'Hare InternationalChicagoILUSA41.979595-87.90446425129
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)ATLWilliam B Hartsfield-Atlanta IntlAtlantaGAUSA33.640444-84.42694421925
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)DFWDallas-Fort Worth InternationalDallas-Fort WorthTXUSA32.895951-97.03720020662
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)PHXPhoenix Sky Harbor InternationalPhoenixAZUSA33.434167-112.00805617290
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)DENDenver IntlDenverCOUSA39.858408-104.66700213781
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)IAHGeorge Bush IntercontinentalHoustonTXUSA29.980472-95.33972213223
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)SFOSan Francisco InternationalSan FranciscoCAUSA37.619002-122.37484312016
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)LAXLos Angeles InternationalLos AngelesCAUSA33.942536-118.40807411797
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)MCOOrlando InternationalOrlandoFLUSA28.428889-81.31602810536
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)CLTCharlotte/Douglas InternationalCharlotteNCUSA35.214011-80.94312610490
    " - ], - "text/plain": [ - " rf_crs(tile) \\\n", - "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "\n", - " rf_extent(tile) \\\n", - "0 (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333) \n", - "1 (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333) \n", - "2 (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333) \n", - "3 (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333) \n", - "4 (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333) \n", - "5 (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333) \n", - "6 (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333) \n", - "7 (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333) \n", - "8 (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333) \n", - "9 (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333) \n", - "\n", - " tile2 \n", - "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]]) \n", - "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]]) \n", - "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]]) \n", - "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]]) \n", - "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]]) \n", - "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]]) \n", - "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]]) \n", - "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]]) \n", - "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]]) \n", - "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]]) " - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "pandas_df" - ] - }, - { - "cell_type": "code", - "execution_count": 31, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", - " \n", - " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - " \n", - " \n", - " \n", - " \n", - " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", " \n", " \n", - "
    rf_crs(tile)rf_extent(tile)tile2threex
    10SLCSalt Lake City IntlSalt Lake CityUTUSA40.788388-111.9777739898
    0(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)11TPATampa InternationalTampaFLUSA27.975472-82.5332509182
    1(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)12EWRNewark IntlNewarkNJUSA40.692497-74.1686618678
    2(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)13LASMcCarran InternationalLas VegasNVUSA36.080361-115.1523338523
    3(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)14PHLPhiladelphia IntlPhiladelphiaPAUSA39.871953-75.2411417965
    4(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)15MSPMinneapolis-St Paul IntlMinneapolisMNUSA44.880547-93.2169227690
    5(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)16SEASeattle-Tacoma IntlSeattleWAUSA47.448982-122.3093137541
    6(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)17LGALaGuardiaNew YorkNYUSA40.777243-73.8726097392
    7(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)18MDWChicago MidwayChicagoILUSA41.785983-87.7524246979
    8(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)19IADWashington Dulles InternationalChantillyVAUSA38.944532-77.4558106779
    9(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)20SANSan Diego International-LindberghSan DiegoCAUSA32.733556-117.1896576233
    21STLLambert-St Louis InternationalSt LouisMOUSA38.747687-90.3599906204
    22DTWDetroit Metropolitan-Wayne CountyDetroitMIUSA42.212059-83.3488366044
    23JFKJohn F Kennedy IntlNew YorkNYUSA40.639751-73.7789265945
    24MIAMiami InternationalMiamiFLUSA25.793250-80.2905565907
    25BOSGen Edw L Logan IntlBostonMAUSA42.364348-71.0051795627
    26SMFSacramento InternationalSacramentoCAUSA38.695422-121.5907674943
    27BWIBaltimore-Washington InternationalBaltimoreMDUSA39.175402-76.6681984749
    28SNAJohn Wayne /Orange CoSanta AnaCAUSA33.675659-117.8682234616
    29MSYNew Orleans InternationalNew OrleansLAUSA29.993389-90.2580284432
    ...........................
    191GTFGreat Falls IntlGreat FallsMTUSA47.482002-111.370685108
    192MEIKeyMeridianMSUSA32.333133-88.751206104
    193MQTMarquette County AirportNaNNaNUSA46.353639-87.395361104
    194TEXTelluride RegionalTellurideCOUSA37.953759-107.908480104
    195CHALovellChattanoogaTNUSA35.035268-85.203788104
    196LWSLewiston-Nez Perce CountyLewistonIDUSA46.374498-117.015394102
    197CDCCedar City MuniCedar CityUTUSA37.700970-113.09857596
    198ALBAlbany CtyAlbanyNYUSA42.748119-73.80297993
    199BTVBurlington InternationalBurlingtonVTUSA44.473004-73.15031291
    200FCAGlacier Park IntlKalispellMTUSA48.311405-114.25506990
    201MLBMelbourne InternationalMelbourneFLUSA28.102750-80.64580674
    202DABDaytona Beach InternationalDaytona BeachFLUSA29.179917-81.05805672
    203ABELehigh Valley InternationalAllentownPAUSA40.652363-75.44040260
    204DLHDuluth InternationalDuluthMNUSA46.842090-92.19364958
    205CYSCheyenneCheyenneWYUSA41.155722-104.81183856
    206RKSRock Springs-Sweetwater CountyRock SpringsWYUSA41.594217-109.06519356
    207LWBGreenbrier ValleyLewisburgWVUSA37.858306-80.39947256
    208CRWYeagerCharlestonWVUSA38.373151-81.59319056
    209BLIBellingham IntlBellinghamWAUSA48.792750-122.53752856
    210MMHMammoth YosemiteMammoth LakesCAUSA37.624049-118.83777256
    211ATWOutagamie County RegionalAppletonWIUSA44.257408-88.51947656
    212BKGBranson AirportHollisterMOUSA36.385913-92.54882856
    213PIESt. Petersburg-Clearwater InternationalSt. PetersburgFLUSA27.910763-82.68743952
    214SPSSheppard AFB/Wichita Falls MunicipalWichita FallsTXUSA33.988796-98.49189350
    215FAYFayetteville MunicipalFayettevilleNCUSA34.991472-78.88000050
    216EAUChippewa Valley RegionalEau ClaireWIUSA44.865257-91.48507248
    217DBQDubuque MunicipalDubuqueIAUSA42.402959-90.70916748
    218RSTRochester InternationalRochesterMNUSA43.908826-92.49798737
    219UTMTunica Municipal AirportTunicaMSUSA34.681499-90.34881632
    220BILBillings Logan IntlBillingsMTUSA45.807662-108.54286123
    " + "\n", + "

    221 rows × 8 columns

    \n", + "
    " ], "text/plain": [ - " rf_crs(tile) \\\n", - "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,) \n", - "\n", - " rf_extent(tile) \\\n", - "0 (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333) \n", - "1 (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333) \n", - "2 (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333) \n", - "3 (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333) \n", - "4 (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333) \n", - "5 (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333) \n", - "6 (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333) \n", - "7 (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333) \n", - "8 (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333) \n", - "9 (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333) \n", + " iata airport city state \\\n", + "0 ORD Chicago O'Hare International Chicago IL \n", + "1 ATL William B Hartsfield-Atlanta Intl Atlanta GA \n", + "2 DFW Dallas-Fort Worth International Dallas-Fort Worth TX \n", + "3 PHX Phoenix Sky Harbor International Phoenix AZ \n", + "4 DEN Denver Intl Denver CO \n", + "5 IAH George Bush Intercontinental Houston TX \n", + "6 SFO San Francisco International San Francisco CA \n", + "7 LAX Los Angeles International Los Angeles CA \n", + "8 MCO Orlando International Orlando FL \n", + "9 CLT Charlotte/Douglas International Charlotte NC \n", + "10 SLC Salt Lake City Intl Salt Lake City UT \n", + "11 TPA Tampa International Tampa FL \n", + "12 EWR Newark Intl Newark NJ \n", + "13 LAS McCarran International Las Vegas NV \n", + "14 PHL Philadelphia Intl Philadelphia PA \n", + "15 MSP Minneapolis-St Paul Intl Minneapolis MN \n", + "16 SEA Seattle-Tacoma Intl Seattle WA \n", + "17 LGA LaGuardia New York NY \n", + "18 MDW Chicago Midway Chicago IL \n", + "19 IAD Washington Dulles International Chantilly VA \n", + "20 SAN San Diego International-Lindbergh San Diego CA \n", + "21 STL Lambert-St Louis International St Louis MO \n", + "22 DTW Detroit Metropolitan-Wayne County Detroit MI \n", + "23 JFK John F Kennedy Intl New York NY \n", + "24 MIA Miami International Miami FL \n", + "25 BOS Gen Edw L Logan Intl Boston MA \n", + "26 SMF Sacramento International Sacramento CA \n", + "27 BWI Baltimore-Washington International Baltimore MD \n", + "28 SNA John Wayne /Orange Co Santa Ana CA \n", + "29 MSY New Orleans International New Orleans LA \n", + ".. ... ... ... ... \n", + "191 GTF Great Falls Intl Great Falls MT \n", + "192 MEI Key Meridian MS \n", + "193 MQT Marquette County Airport NaN NaN \n", + "194 TEX Telluride Regional Telluride CO \n", + "195 CHA Lovell Chattanooga TN \n", + "196 LWS Lewiston-Nez Perce County Lewiston ID \n", + "197 CDC Cedar City Muni Cedar City UT \n", + "198 ALB Albany Cty Albany NY \n", + "199 BTV Burlington International Burlington VT \n", + "200 FCA Glacier Park Intl Kalispell MT \n", + "201 MLB Melbourne International Melbourne FL \n", + "202 DAB Daytona Beach International Daytona Beach FL \n", + "203 ABE Lehigh Valley International Allentown PA \n", + "204 DLH Duluth International Duluth MN \n", + "205 CYS Cheyenne Cheyenne WY \n", + "206 RKS Rock Springs-Sweetwater County Rock Springs WY \n", + "207 LWB Greenbrier Valley Lewisburg WV \n", + "208 CRW Yeager Charleston WV \n", + "209 BLI Bellingham Intl Bellingham WA \n", + "210 MMH Mammoth Yosemite Mammoth Lakes CA \n", + "211 ATW Outagamie County Regional Appleton WI \n", + "212 BKG Branson Airport Hollister MO \n", + "213 PIE St. Petersburg-Clearwater International St. Petersburg FL \n", + "214 SPS Sheppard AFB/Wichita Falls Municipal Wichita Falls TX \n", + "215 FAY Fayetteville Municipal Fayetteville NC \n", + "216 EAU Chippewa Valley Regional Eau Claire WI \n", + "217 DBQ Dubuque Municipal Dubuque IA \n", + "218 RST Rochester International Rochester MN \n", + "219 UTM Tunica Municipal Airport Tunica MS \n", + "220 BIL Billings Logan Intl Billings MT \n", "\n", - " tile2 \\\n", - "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1225 1244 1247 ... 1305 1245 1206]\\n [1166 1188 1190 ... 1381 1251 1193]\\n [1156 1110 1122 ... 1248 1245 1270]\\n ...\\n [1485 1749 1761 ... 1034 996 998]\\n [1780 1777 1663 ... 1008 1027 1174]\\n [1728 1647 1562 ... 1189 1297 1382]]) \n", - "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1206 1140 1227 ... 1733 1610 1558]\\n [1193 1158 1115 ... 1602 1759 1824]\\n [1270 1154 1070 ... 1815 1753 1845]\\n ...\\n [ 998 1085 1166 ... 1758 1755 1701]\\n [1174 1302 1292 ... 1756 1682 1602]\\n [1382 1288 1209 ... 1689 1561 1515]]) \n", - "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1558 1546 1445 ... 1690 1691 1715]\\n [1824 1783 1762 ... 1815 1796 1779]\\n [1845 1773 1656 ... 1717 1745 1836]\\n ...\\n [1701 1623 1620 ... 1402 1352 1442]\\n [1602 1630 1627 ... 1374 1417 1420]\\n [1515 1523 1485 ... 1407 1369 1310]]) \n", - "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1715 1765 1675 ... 1101 1140 1149]\\n [1779 1800 1814 ... 1181 1212 1240]\\n [1836 1801 1779 ... 1062 1213 1230]\\n ...\\n [1442 1478 1446 ... 1789 1748 1740]\\n [1420 1384 1353 ... 1745 1730 1741]\\n [1310 1228 1276 ... 1728 1734 1684]]) \n", - "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1149 1171 1272 ... 613 617 622]\\n [1240 1274 1284 ... 685 639 651]\\n [1230 1226 1173 ... 669 649 634]\\n ...\\n [1740 1776 1686 ... 1216 1169 1116]\\n [1741 1666 1536 ... 1185 1066 1094]\\n [1684 1527 1577 ... 1085 1102 1091]]) \n", - "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 622 626 627 ... 364 283 248]\\n [ 651 673 702 ... 264 246 248]\\n [ 634 775 771 ... 246 260 265]\\n ...\\n [1116 1098 1101 ... 971 926 939]\\n [1094 1093 1114 ... 1013 1021 900]\\n [1091 1098 1127 ... 1046 951 814]]) \n", - "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 248 228 251 ... 1056 1079 1046]\\n [ 248 247 270 ... 1124 1146 1188]\\n [ 265 279 280 ... 1046 1178 1290]\\n ...\\n [ 939 986 1097 ... 1082 1066 1081]\\n [ 900 1015 1263 ... 1030 1009 961]\\n [ 814 996 1429 ... 988 898 800]]) \n", - "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1046 1088 1240 ... 746 827 876]\\n [1188 1282 1300 ... 834 766 665]\\n [1290 1266 1224 ... 663 684 643]\\n ...\\n [1081 1009 1000 ... 627 580 528]\\n [ 961 941 935 ... 607 574 610]\\n [ 800 865 838 ... 453 447 524]]) \n", - "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[746 750 742 ... 144 117 112]\\n [625 633 689 ... 104 184 143]\\n [626 674 666 ... 161 147 171]\\n ...\\n [586 593 593 ... 66 47 56]\\n [585 543 516 ... 53 44 67]\\n [515 454 449 ... 54 51 50]]) \n", - "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[134 177 181 ... 46 33 25]\\n [146 124 154 ... 43 52 38]\\n [175 169 161 ... 47 25 38]\\n ...\\n [ 54 49 64 ... 44 47 46]\\n [ 53 52 43 ... 57 49 43]\\n [ 46 46 48 ... 50 49 30]]) \n", + " country lat long cnt \n", + "0 USA 41.979595 -87.904464 25129 \n", + "1 USA 33.640444 -84.426944 21925 \n", + "2 USA 32.895951 -97.037200 20662 \n", + "3 USA 33.434167 -112.008056 17290 \n", + "4 USA 39.858408 -104.667002 13781 \n", + "5 USA 29.980472 -95.339722 13223 \n", + "6 USA 37.619002 -122.374843 12016 \n", + "7 USA 33.942536 -118.408074 11797 \n", + "8 USA 28.428889 -81.316028 10536 \n", + "9 USA 35.214011 -80.943126 10490 \n", + "10 USA 40.788388 -111.977773 9898 \n", + "11 USA 27.975472 -82.533250 9182 \n", + "12 USA 40.692497 -74.168661 8678 \n", + "13 USA 36.080361 -115.152333 8523 \n", + "14 USA 39.871953 -75.241141 7965 \n", + "15 USA 44.880547 -93.216922 7690 \n", + "16 USA 47.448982 -122.309313 7541 \n", + "17 USA 40.777243 -73.872609 7392 \n", + "18 USA 41.785983 -87.752424 6979 \n", + "19 USA 38.944532 -77.455810 6779 \n", + "20 USA 32.733556 -117.189657 6233 \n", + "21 USA 38.747687 -90.359990 6204 \n", + "22 USA 42.212059 -83.348836 6044 \n", + "23 USA 40.639751 -73.778926 5945 \n", + "24 USA 25.793250 -80.290556 5907 \n", + "25 USA 42.364348 -71.005179 5627 \n", + "26 USA 38.695422 -121.590767 4943 \n", + "27 USA 39.175402 -76.668198 4749 \n", + "28 USA 33.675659 -117.868223 4616 \n", + "29 USA 29.993389 -90.258028 4432 \n", + ".. ... ... ... ... \n", + "191 USA 47.482002 -111.370685 108 \n", + "192 USA 32.333133 -88.751206 104 \n", + "193 USA 46.353639 -87.395361 104 \n", + "194 USA 37.953759 -107.908480 104 \n", + "195 USA 35.035268 -85.203788 104 \n", + "196 USA 46.374498 -117.015394 102 \n", + "197 USA 37.700970 -113.098575 96 \n", + "198 USA 42.748119 -73.802979 93 \n", + "199 USA 44.473004 -73.150312 91 \n", + "200 USA 48.311405 -114.255069 90 \n", + "201 USA 28.102750 -80.645806 74 \n", + "202 USA 29.179917 -81.058056 72 \n", + "203 USA 40.652363 -75.440402 60 \n", + "204 USA 46.842090 -92.193649 58 \n", + "205 USA 41.155722 -104.811838 56 \n", + "206 USA 41.594217 -109.065193 56 \n", + "207 USA 37.858306 -80.399472 56 \n", + "208 USA 38.373151 -81.593190 56 \n", + "209 USA 48.792750 -122.537528 56 \n", + "210 USA 37.624049 -118.837772 56 \n", + "211 USA 44.257408 -88.519476 56 \n", + "212 USA 36.385913 -92.548828 56 \n", + "213 USA 27.910763 -82.687439 52 \n", + "214 USA 33.988796 -98.491893 50 \n", + "215 USA 34.991472 -78.880000 50 \n", + "216 USA 44.865257 -91.485072 48 \n", + "217 USA 42.402959 -90.709167 48 \n", + "218 USA 43.908826 -92.497987 37 \n", + "219 USA 34.681499 -90.348816 32 \n", + "220 USA 45.807662 -108.542861 23 \n", "\n", - " threex \n", - "0 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3675 3732 3741 ... 3915 3735 3618]\\n [3498 3564 3570 ... 4143 3753 3579]\\n [3468 3330 3366 ... 3744 3735 3810]\\n ...\\n [4455 5247 5283 ... 3102 2988 2994]\\n [5340 5331 4989 ... 3024 3081 3522]\\n [5184 4941 4686 ... 3567 3891 4146]]) \n", - "1 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3618 3420 3681 ... 5199 4830 4674]\\n [3579 3474 3345 ... 4806 5277 5472]\\n [3810 3462 3210 ... 5445 5259 5535]\\n ...\\n [2994 3255 3498 ... 5274 5265 5103]\\n [3522 3906 3876 ... 5268 5046 4806]\\n [4146 3864 3627 ... 5067 4683 4545]]) \n", - "2 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[4674 4638 4335 ... 5070 5073 5145]\\n [5472 5349 5286 ... 5445 5388 5337]\\n [5535 5319 4968 ... 5151 5235 5508]\\n ...\\n [5103 4869 4860 ... 4206 4056 4326]\\n [4806 4890 4881 ... 4122 4251 4260]\\n [4545 4569 4455 ... 4221 4107 3930]]) \n", - "3 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[5145 5295 5025 ... 3303 3420 3447]\\n [5337 5400 5442 ... 3543 3636 3720]\\n [5508 5403 5337 ... 3186 3639 3690]\\n ...\\n [4326 4434 4338 ... 5367 5244 5220]\\n [4260 4152 4059 ... 5235 5190 5223]\\n [3930 3684 3828 ... 5184 5202 5052]]) \n", - "4 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3447 3513 3816 ... 1839 1851 1866]\\n [3720 3822 3852 ... 2055 1917 1953]\\n [3690 3678 3519 ... 2007 1947 1902]\\n ...\\n [5220 5328 5058 ... 3648 3507 3348]\\n [5223 4998 4608 ... 3555 3198 3282]\\n [5052 4581 4731 ... 3255 3306 3273]]) \n", - "5 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[1866 1878 1881 ... 1092 849 744]\\n [1953 2019 2106 ... 792 738 744]\\n [1902 2325 2313 ... 738 780 795]\\n ...\\n [3348 3294 3303 ... 2913 2778 2817]\\n [3282 3279 3342 ... 3039 3063 2700]\\n [3273 3294 3381 ... 3138 2853 2442]]) \n", - "6 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[ 744 684 753 ... 3168 3237 3138]\\n [ 744 741 810 ... 3372 3438 3564]\\n [ 795 837 840 ... 3138 3534 3870]\\n ...\\n [2817 2958 3291 ... 3246 3198 3243]\\n [2700 3045 3789 ... 3090 3027 2883]\\n [2442 2988 4287 ... 2964 2694 2400]]) \n", - "7 Tile(dimensions=[257, 256], cell_type=CellType(int16ud32767, 32767), cells=[[3138 3264 3720 ... 2238 2481 2628]\\n [3564 3846 3900 ... 2502 2298 1995]\\n [3870 3798 3672 ... 1989 2052 1929]\\n ...\\n [3243 3027 3000 ... 1881 1740 1584]\\n [2883 2823 2805 ... 1821 1722 1830]\\n [2400 2595 2514 ... 1359 1341 1572]]) \n", - "8 Tile(dimensions=[256, 256], cell_type=CellType(int16ud32767, 32767), cells=[[2238 2250 2226 ... 432 351 336]\\n [1875 1899 2067 ... 312 552 429]\\n [1878 2022 1998 ... 483 441 513]\\n ...\\n [1758 1779 1779 ... 198 141 168]\\n [1755 1629 1548 ... 159 132 201]\\n [1545 1362 1347 ... 162 153 150]]) \n", - "9 Tile(dimensions=[96, 256], cell_type=CellType(int16ud32767, 32767), cells=[[402 531 543 ... 138 99 75]\\n [438 372 462 ... 129 156 114]\\n [525 507 483 ... 141 75 114]\\n ...\\n [162 147 192 ... 132 141 138]\\n [159 156 129 ... 171 147 129]\\n [138 138 144 ... 150 147 90]]) " + "[221 rows x 8 columns]" ] }, - "execution_count": 31, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pandas_df['threex'] = pandas_df.tile2.apply(lambda t: t * 3)\n", - "pandas_df" + "import pandas\n", + "pandas.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv')" ] }, { From 6efd952faf90b884b90e503076095a3167164343 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 14 Jun 2019 14:56:17 -0400 Subject: [PATCH 159/380] matplotlib requirement to accomodate Python 2.7 support Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/requirements.txt b/pyrasterframes/src/main/python/requirements.txt index 44ea6904b..b715f2f7e 100644 --- a/pyrasterframes/src/main/python/requirements.txt +++ b/pyrasterframes/src/main/python/requirements.txt @@ -3,4 +3,4 @@ shapely pyspark==2.3.3 numpy>=1.7 pandas -matplotlib +matplotlib<3.0.0 # no python 2.7 support after v2.x.x From 720635e0f8fbeb48746e776597bc418a4e1db583 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 17 Jun 2019 15:04:38 -0400 Subject: [PATCH 160/380] Fixed JMH plugin. --- project/plugins.sbt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/plugins.sbt b/project/plugins.sbt index 5ccdcda08..5835c4f93 100644 --- a/project/plugins.sbt +++ b/project/plugins.sbt @@ -7,7 +7,7 @@ addSbtPlugin("de.heikoseeberger" % "sbt-header" % "3.0.2") addSbtPlugin("com.typesafe.sbt" % "sbt-ghpages" % "0.6.2") addSbtPlugin("com.typesafe.sbt" % "sbt-site" % "1.3.2") addSbtPlugin("com.lightbend.paradox" % "sbt-paradox" % "0.5.5") -addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.4") +addSbtPlugin("pl.project13.scala" % "sbt-jmh" % "0.3.6") addSbtPlugin("org.xerial.sbt" % "sbt-sonatype" % "2.1") addSbtPlugin("com.jsuereth" % "sbt-pgp" % "1.1.1") addSbtPlugin("com.eed3si9n" % "sbt-unidoc" % "0.4.1") From 3392a82632289d51a586973941102cb0ec4b0861 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 17 Jun 2019 19:37:32 -0400 Subject: [PATCH 161/380] Moved Python tests back into main Python source directory (keep it pythonic). --- pyrasterframes/build.sbt | 3 +++ .../{test/python => main/python/tests}/PyRasterFramesTests.py | 0 .../src/{test/python => main/python/tests}/__init__.py | 0 pyrasterframes/src/main/python/{ => tests}/coverage-report.sh | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) rename pyrasterframes/src/{test/python => main/python/tests}/PyRasterFramesTests.py (100%) rename pyrasterframes/src/{test/python => main/python/tests}/__init__.py (100%) rename pyrasterframes/src/main/python/{ => tests}/coverage-report.sh (86%) diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 570dc1385..2e9e31f42 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,5 +1,8 @@ import PythonBuildPlugin.autoImport.pySetup + +Test / pythonSource := (Compile / sourceDirectory).value / "tests" + exportJars := true lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") diff --git a/pyrasterframes/src/test/python/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py similarity index 100% rename from pyrasterframes/src/test/python/PyRasterFramesTests.py rename to pyrasterframes/src/main/python/tests/PyRasterFramesTests.py diff --git a/pyrasterframes/src/test/python/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py similarity index 100% rename from pyrasterframes/src/test/python/__init__.py rename to pyrasterframes/src/main/python/tests/__init__.py diff --git a/pyrasterframes/src/main/python/coverage-report.sh b/pyrasterframes/src/main/python/tests/coverage-report.sh similarity index 86% rename from pyrasterframes/src/main/python/coverage-report.sh rename to pyrasterframes/src/main/python/tests/coverage-report.sh index 8cde233a1..6b547e026 100755 --- a/pyrasterframes/src/main/python/coverage-report.sh +++ b/pyrasterframes/src/main/python/tests/coverage-report.sh @@ -4,6 +4,6 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -cd "$( dirname "${BASH_SOURCE[0]}" )" +cd "$( dirname "${BASH_SOURCE[0]}" )"/.. coverage run setup.py test && coverage html --omit='.eggs/*,setup.py' && open htmlcov/index.html \ No newline at end of file From f6aa775c217d1217ad8e75138b1641ce11944b21 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 17 Jun 2019 20:02:12 -0400 Subject: [PATCH 162/380] Reproduced lazy-read error condition in simple test. --- .../src/main/python/tests/PyRasterFramesTests.py | 14 ++++++++++---- pyrasterframes/src/main/python/tests/__init__.py | 10 +++++++--- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index f98eb0b3d..416b4815a 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -139,6 +139,10 @@ class RasterFunctions(TestEnvironment): def setUp(self): self.create_rasterframe() + def test_setup(self): + self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), + "org.apache.spark.serializer.KryoSerializer") + def test_identify_columns(self): cols = self.rf.tileColumns() self.assertEqual(len(cols), 1, '`tileColumns` did not find the proper number of columns.') @@ -560,10 +564,12 @@ def test_raster_join(self): class RasterSource(TestEnvironment): - # Putting this here for convenience - def test_setup(self): - self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), - "org.apache.spark.serializer.KryoSerializer") + def test_handle_lazy_eval(self): + import numpy.testing + # rf_local_add(t, 0) is to force lazy eval; accessing tile.tile is to get at the actual Tile type vs PRT struct + df = self.spark.read.rastersource(self.img_uri) + t = df.select('tile.tile').first() + print(t) def test_prt_functions(self): df = self.spark.read.rastersource(self.img_uri) \ diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 275612087..1dcb13afe 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -44,10 +44,14 @@ def rounded_compare(self, val1, val2): @classmethod def setUpClass(cls): + def pdir(curr): + return os.path.dirname(curr) # gather Scala requirements - here = os.path.dirname(os.path.realpath(__file__)) - target_dir = os.path.dirname(os.path.dirname(here)) - + here = pdir(os.path.realpath(__file__)) + target_dir = pdir(pdir(here)) + # See if we're running outside of sbt build and adjust + if os.path.basename(target_dir) != "target": + target_dir = os.path.join(pdir(pdir(target_dir)), 'target') scala_target = os.path.realpath(os.path.join(target_dir, 'scala-2.11')) jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) From ec37b8344d27a4b768e14c9abfc8c9e99b8f55f7 Mon Sep 17 00:00:00 2001 From: Tom Schroeder Date: Tue, 18 Jun 2019 12:27:51 -0400 Subject: [PATCH 163/380] Upgrade to GDAL 2.4.1 Correct permissions on gdal installation delete Signed-off-by: Tom Schroeder --- build/circleci/Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/circleci/Dockerfile b/build/circleci/Dockerfile index da964c32a..0eb8bb522 100644 --- a/build/circleci/Dockerfile +++ b/build/circleci/Dockerfile @@ -1,7 +1,7 @@ FROM circleci/openjdk:8-jdk ENV OPENJPEG_VERSION 2.3.0 -ENV GDAL_VERSION 2.3.3 +ENV GDAL_VERSION 2.4.1 ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ # most of these libraries required for @@ -64,4 +64,4 @@ RUN cd /tmp && \ cd swig/java && \ sudo make install && \ sudo ldconfig && \ - cd /tmp && rm -Rf gdal* + cd /tmp && sudo rm -Rf gdal* From b9568fafeae66c1c347cb2af5f7543fb1edce4bb Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 18 Jun 2019 12:34:42 -0400 Subject: [PATCH 164/380] Address PR comments Signed-off-by: Jason T. Brown --- pyrasterframes/README.md | 118 ++++++++++++++++- pyrasterframes/src/main/python/MANIFEST.in | 1 - pyrasterframes/src/main/python/README.md | 123 ++---------------- .../main/python/pyrasterframes/__init__.py | 2 +- .../src/main/python/pyrasterframes/version.py | 23 ++++ pyrasterframes/src/main/python/setup.py | 107 +++++++-------- 6 files changed, 203 insertions(+), 171 deletions(-) create mode 100644 pyrasterframes/src/main/python/pyrasterframes/version.py diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index 70b448567..71622e8fb 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -1,3 +1,119 @@ # PyRasterFrames -See [here](src/main/python/README.md) for details. \ No newline at end of file +## Using PyRasterFrames + +See [here](src/main/python/README.md) for user facing details. + +## Deployment + +The pip installation focuses on local mode operation of spark. To deploy spark applications you will need to consider a few configurations. + +### `SparkSession` Setup + +#### Python shell + +To initialize PyRasterFrames in a generic Python shell follow the pattern below, substituting configs as needed. + +```python +from pyspark.sql import SparkSession +from pyrasterframes import * +from pyrasterframes.rasterfunctions import * +spark = SparkSession.builder \ + .master("local[*]") \ + .appName("Using RasterFrames") \ + .config("spark.some.config.option", "some-value") \ + .withKryoSerialization() \ + .getOrCreate() \ + .withRasterFrames() +``` + +#### Pyspark shell or app + +To initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. See below for how to build or download those artifacts. + +```bash + pyspark \ + --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ + --conf spark.kryo.registrator=org.locationtech.rasterframes.util.RFKryoRegistrator \ + --conf spark.kryoserializer.buffer.max=500m \ + --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ + --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip + +``` + +Then in the pyspark shell or app, import the module and call `withRasterFrames` on the SparkSession. + +```python +import pyrasterframes +spark = spark.withRasterFrames() +df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') +``` + + +## Development + +RasterFrames is primarily implemented in Scala, and as such uses the Scala build tool [`sbt`](https://www.scala-sbt.org/). +All `sbt` commands referenced below must be run from the root source directory, i.e. the parent of the `pyrasterframes` +directory, including Python-related build steps. + +As a tip, know that `sbt` is much faster if run in "interactive" mode, where you launch `sbt` with no arguments, +and subsequent commands are invoked via an interactive shell. But for context clarity, we'll prefix each command +example below with `sbt`. + + +## Running Tests and Examples + +The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: + +```bash +sbt pyTests +``` + +*See also the below discussion of running `setup.py` for more options to run unit tests.* + +Similarly, to run the examples in `pyrasterframes/python/examples`: + +```bash +sbt pyExamples +``` + +## Creating and Using a Build + +Assuming that `$SCALA_VER` is the major verison of Scala in use (e.g. 2.11) , and `$VER` is the version of RasterFrames, +the primary build artifacts are: + +* JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` +* Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` + +You build them with: + +```bash +sbt pyrasterframes/package +``` + +Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy groupId:artifactId:version (GAV) coordinates +`org.locationtech.rasterframes:pyrasterframes_$SCALA_VER:$VER`. + +Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). +The Python package is published under the `python` classifier, `zip` extension. + +## Build Internals + +### Running `setup.py` + +Before a build is initiated, the Python sources are copied to `pyrasterframes/target/python`. This ensures the +version controlled source directories are not polluted by `setuptools` residuals, better ensuring repeatable builds. To +simplify the process of working with `setup.py` in this context, a `pySetup` sbt interactive command is available. To +illustrate its usage, suppose we want to run a subset of the Python unit test. Instead of running `sbt pyTests` you can: + +```bash +sbt 'pySetup test --addopts "-k test_tile_creation"' +``` + +Or to run a specific example: + +```bash +sbt 'pySetup examples -e NDVI' +``` + +*Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* diff --git a/pyrasterframes/src/main/python/MANIFEST.in b/pyrasterframes/src/main/python/MANIFEST.in index a97911543..68903bdfe 100644 --- a/pyrasterframes/src/main/python/MANIFEST.in +++ b/pyrasterframes/src/main/python/MANIFEST.in @@ -1,4 +1,3 @@ global-exclude *.py[cod] __pycache__ .DS_Store recursive-include deps/jars *.jar - diff --git a/pyrasterframes/src/main/python/README.md b/pyrasterframes/src/main/python/README.md index 15a0637dc..9b6688656 100644 --- a/pyrasterframes/src/main/python/README.md +++ b/pyrasterframes/src/main/python/README.md @@ -1,144 +1,49 @@ # PyRasterFrames -PyRasterFrames is a library for distributed processing of geospatial raster data with Spark. +PyRasterFrames enables access and processing of geospatial raster data in PySpark DataFrames. +## Getting started -## Prerequisites +### Prerequisites 1. [`pip`](https://pip.pypa.io/en/stable/installing/) 2. ['pyspark`](https://pypi.org/project/pyspark/) > 2.3.2 -## Quickstart - The quickest way to get started is to `pip` install the pyrasterframes package. ```bash pip install pyrasterframes ``` -You can then access a [`pyspark SparkSession`]() using the [`local[*]` master](https://spark.apache.org/docs/latest/submitting-applications.html#master-urls) as follows. +You can then access a [`pyspark SparkSession`](https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.SparkSession) using the [`local[*]` master](https://spark.apache.org/docs/latest/submitting-applications.html#master-urls) in your python interpreter as follows. ```python import pyrasterframes spark = pyrasterframes.get_spark_session() ``` -Then you can read a raster and do some simple processing on it. +Then you can read a raster and do some work with it. ```python from pyrasterframes.rasterfunctions import * from pyspark.sql.functions import lit -# Read a Landsat 8 L1TP PDS scene -df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/038/037/LC08_L1TP_038037_20190322_20190403_01_T1/LC08_L1TP_038037_20190322_20190403_01_T1_B4.TIF') -# Add 3 to every cell, show some rows of the dataframe -df.select(rf_local_add(df.tile, lit(3))).show(6, False) -``` - -## Development - -RasterFrames is primarily implemented in Scala, and as such uses the Scala build tool [`sbt`](https://www.scala-sbt.org/). -All `sbt` commands referenced below must be run from the root source directory, i.e. the parent of the `pyrasterframes` -directory, including Python-related build steps. - -As a tip, know that `sbt` is much faster if run in "interactive" mode, where you launch `sbt` with no arguments, -and subsequent commands are invoked via an interactive shell. But for context clarity, we'll prefix each command -example below with `sbt`. - - -## Running Tests and Examples - -The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: - -```bash -sbt pyTests -``` - -*See also the below discussion of running `setup.py` for more options to run unit tests.* - -Similarly, to run the examples in `pyrasterframes/python/examples`: - -```bash -sbt pyExamples -``` - -## Creating and Using a Build - -Assuming that `$SCALA_VER` is the major verison of Scala in use (e.g. 2.11) , and `$VER` is the version of RasterFrames, -the primary build artifacts are: - -* JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` -* Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` - -You build them with: - -```bash -sbt pyrasterframes/package +# Read a MODIS surface reflectance granule +df = spark.read.rastersource('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF') +# Add 3 element-wise, show some rows of the dataframe +df.select(rf_local_add(df.tile, lit(3))).show(5, False) ``` -Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy groupId:artifactId:version (GAV) coordinates -`org.locationtech.rasterframes:pyrasterframes_$SCALA_VER:$VER`. - -Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). -The Python package is published under the `python` classifier, `zip` extension. -## Build Internals +## Support -### Running `setup.py` +Reach out to us on [gitter](https://gitter.im/s22s/raster-frames)! -Before a build is initiated, the Python sources are copied to `pyrasterframes/target/python`. This ensures the -version controlled source directories are not polluted by `setuptools` residuals, better ensuring repeatable builds. To -simplify the process of working with `setup.py` in this context, a `pySetup` sbt interactive command is available. To -illustrate its usage, suppose we want to run a subset of the Python unit test. Instead of running `sbt pyTests` you can: +Issue tracking is through [github](https://github.com/locationtech/rasterframes/issues). -```bash -sbt 'pySetup test --addopts "-k test_tile_creation"' -``` +## Contributing -Or to run a specific example: +Community contributions are always welcome. To get started, please review our [contribution guidelines](https://github.com/locationtech/rasterframes/blob/develop/CONTRIBUTING.md), [code of conduct](https://github.com/locationtech/rasterframes/blob/develop/CODE_OF_CONDUCT.md), and [developer's guide](../../../README.md). Reach out to us on [gitter](https://gitter.im/s22s/raster-frames) so the community can help you get started! -```bash -sbt 'pySetup examples -e NDVI' -``` -*Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* -## `SparkSession` Setup -### Python shell - -To initialize PyRasterFrames in a generic Python shell: - -```python -from pyspark.sql import SparkSession -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -spark = SparkSession.builder \ - .master("local[*]") \ - .appName("Using RasterFrames") \ - .config("spark.some.config.option", "some-value") \ - .withKryoSerialization() \ - .getOrCreate() \ - .withRasterFrames() -``` - -### Pyspark shell - -To initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the pyton source zip. - -```bash - pyspark \ - --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ - --conf spark.kryo.registrator=org.locationtech.rasterframes.util.RFKryoRegistrator \ - --conf spark.kryoserializer.buffer.max=500m \ - --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ - --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip - -``` - -Then in the pyspark shell import the module and call `withRasterFrames`. - -```python -import pyrasterframes -spark = spark.withRasterFrames() -df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') -``` diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 252f0e9e5..fc5c14c1b 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -32,7 +32,7 @@ from .rf_types import * from . import rasterfunctions from .context import RFContext - +from .version import __version__ __all__ = ['RasterFrame', 'TileExploder'] diff --git a/pyrasterframes/src/main/python/pyrasterframes/version.py b/pyrasterframes/src/main/python/pyrasterframes/version.py new file mode 100644 index 000000000..ce58048ae --- /dev/null +++ b/pyrasterframes/src/main/python/pyrasterframes/version.py @@ -0,0 +1,23 @@ +#!/usr/bin/env python + +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +# Translating Java version from version.sbt to PEP440 norms +__version__ = '0.8.0.dev0' diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 0aecab504..16a189e94 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -1,11 +1,41 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + # Always prefer setuptools over distutils from setuptools import setup, find_packages from os import path, environ +import sys from glob import glob from io import open import distutils.cmd import importlib +try: + exec(open('pyrasterframes/version.py').read()) # executable python script contains __version__; credit pyspark +except IOError: + print("Run setup via `sbt 'pySetup arg1 arg2'` to ensure correct access to all source files and binaries.") + sys.exit(-1) + + +VERSION = __version__ + here = path.abspath(path.dirname(__file__)) # Get the long description from the README file @@ -69,65 +99,12 @@ def run(self): print(traceback.format_exc()) -class PweaveDocs(distutils.cmd.Command): - """A custom command to run documentation scripts through pweave.""" - description = 'Pweave PyRasterFrames documentation scripts' - user_options = [ - # The format is (long option, short option, description). - ('files=', 'f', 'Specific files to pweave. Defaults to all in `docs` directory.'), - ] - - def initialize_options(self): - """Set default values for options.""" - # Each user option must be listed here with their default value. - self.files = filter( - lambda x: not x.name.startswith('_'), - glob(path.join(here, 'docs', '*.py')) - ) - - def finalize_options(self): - """Post-process options.""" - import re - if isinstance(self.files, str): - self.files = filter(lambda s: len(s) > 0, re.split('\W+', self.files)) - - def run(self): - """Run pweave.""" - import traceback - import pweave - - for file in self.files: - name = path.splitext(path.basename(file))[0] - print(_divided('Running %s' % name)) - try: - pweave.weave( - file=str(file), - doctype='markdown' - ) - except Exception: - print(_divided('%s Failed:' % file)) - print(traceback.format_exc()) - - -try: - with open(path.join(here, 'requirements.txt')) as f: - requirements = f.read().splitlines() -except: - print("couldn't open requirements.txt") - requirements = [ - 'pytz', - 'shapely', - 'pyspark>=2.3', - 'numpy>=1.7', - 'pandas', - ] - setup( name='pyrasterframes', - description='RasterFrames for PySpark', + description='Access and process geospatial raster data in PySpark DataFrames', long_description=readme, long_description_content_type='text/markdown', - version=environ.get('RASTERFRAMES_VERSION', 'dev'), + version=VERSION, author='Astraea, Inc.', author_email='info@astraea.earth', license='Apache 2', @@ -136,12 +113,22 @@ def run(self): 'Bug Reports': 'https://github.com/locationtech/rasterframes/issues', 'Source': 'https://github.com/locationtech/rasterframes', }, - install_requires=requirements, + install_requires=[ + 'pytz', + 'shapely', + 'pyspark', + 'numpy', + 'pandas', + ], setup_requires=[ + 'pytz', + 'shapely', + 'pyspark', + 'numpy', + 'pandas', 'pytest-runner', 'setuptools>=0.8', - 'jupytext', - ] + requirements, + ], tests_require=[ 'pytest==3.4.2', 'pypandoc', @@ -167,7 +154,9 @@ def run(self): 'Natural Language :: English', 'Operating System :: Unix', 'Programming Language :: Python', - 'Topic :: Software Development :: Libraries' + 'Topic :: Software Development :: Libraries', + 'Topic :: Scientific/Engineering :: GIS', + 'Topic :: Multimedia :: Graphics :: Graphics Conversion', ], zip_safe=False, test_suite="pytest-runner", From 3b8e7564aca80fafa6e97d1152c9cca61440a3a4 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 18 Jun 2019 13:06:32 -0400 Subject: [PATCH 165/380] Added `rf_realize_tile`. --- .../rasterframes/RasterFunctions.scala | 25 ++++---- .../expressions/accessors/ExtractTile.scala | 5 +- .../expressions/accessors/RealizeTile.scala | 55 +++++++++++++++++ .../rasterframes/expressions/package.scala | 1 + .../transformers/URIToRasterSource.scala | 2 +- .../rasterframes/RasterFunctionsSpec.scala | 61 ++++++++++++------- docs/src/main/tut/release-notes.md | 1 + .../python/pyrasterframes/rasterfunctions.py | 1 + .../main/python/pyrasterframes/rf_types.py | 17 ++++-- .../main/python/tests/PyRasterFramesTests.py | 7 +-- 10 files changed, 130 insertions(+), 45 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/RealizeTile.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index bcb582632..e0a5cd60d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -48,17 +48,6 @@ trait RasterFunctions { import util._ // format: off - /** Create a row for each cell in Tile. */ - def rf_explode_tiles(cols: Column*): Column = rf_explode_tiles_sample(1.0, None, cols: _*) - - /** Create a row for each cell in Tile with random sampling and optional seed. */ - def rf_explode_tiles_sample(sampleFraction: Double, seed: Option[Long], cols: Column*): Column = - ExplodeTiles(sampleFraction, seed, cols) - - /** Create a row for each cell in Tile with random sampling (no seed). */ - def rf_explode_tiles_sample(sampleFraction: Double, cols: Column*): Column = - ExplodeTiles(sampleFraction, None, cols) - /** Query the number of (cols, rows) in a Tile. */ def rf_dimensions(col: Column): TypedColumn[Any, TileDimensions] = GetDimensions(col) @@ -71,6 +60,9 @@ trait RasterFunctions { /** Extracts the CRS from a RasterSource or ProjectedRasterTile */ def rf_crs(col: Column): TypedColumn[Any, CRS] = GetCRS(col) + /** Extracts the Tile component of a RasterSource, ProjectedRasterTile (or Tile) and ensures the cells are fully fetched. */ + def rf_realize_tile(col: Column): TypedColumn[Any, Tile] = RealizeTile(col) + /** Flattens Tile into a double array. */ def rf_tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) @@ -416,7 +408,18 @@ trait RasterFunctions { def rf_expm1(tileCol: Column): TypedColumn[Any, Tile] = ExpM1(tileCol) + /** Return the incoming tile untouched. */ def rf_identity(tileCol: Column): TypedColumn[Any, Tile] = Identity(tileCol) + /** Create a row for each cell in Tile. */ + def rf_explode_tiles(cols: Column*): Column = rf_explode_tiles_sample(1.0, None, cols: _*) + + /** Create a row for each cell in Tile with random sampling and optional seed. */ + def rf_explode_tiles_sample(sampleFraction: Double, seed: Option[Long], cols: Column*): Column = + ExplodeTiles(sampleFraction, seed, cols) + + /** Create a row for each cell in Tile with random sampling (no seed). */ + def rf_explode_tiles_sample(sampleFraction: Double, cols: Column*): Column = + ExplodeTiles(sampleFraction, None, cols) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala index cc01b1f8f..4fc0a0374 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/ExtractTile.scala @@ -32,12 +32,13 @@ import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.rasterframes.model.TileContext import org.locationtech.rasterframes.tiles.InternalRowTile +import org.locationtech.rasterframes._ /** Expression to extract at tile from several types that contain tiles.*/ case class ExtractTile(child: Expression) extends UnaryRasterOp with CodegenFallback { - override def dataType: DataType = new TileUDT() + override def dataType: DataType = TileType - override def nodeName: String = "extract_tile" + override def nodeName: String = "rf_extract_tile" implicit val tileSer = TileUDT.tileSerializer override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = tile match { case irt: InternalRowTile => irt.mem diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/RealizeTile.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/RealizeTile.scala new file mode 100644 index 000000000..8e7cee24f --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/RealizeTile.scala @@ -0,0 +1,55 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.accessors + +import geotrellis.raster.Tile +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} +import org.apache.spark.sql.rf.TileUDT +import org.apache.spark.sql.types.DataType +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.UnaryRasterOp +import org.locationtech.rasterframes.model.TileContext + +@ExpressionDescription( + usage = "_FUNC_(raster) - Extracts the Tile component of a RasterSource, ProjectedRasterTile (or Tile) and ensures the cells are fully fetched.", + examples = """ + Examples: + > SELECT _FUNC_(raster); + .... + """) +case class RealizeTile(child: Expression) extends UnaryRasterOp with CodegenFallback { + override def dataType: DataType = TileType + + override def nodeName: String = "rf_realize_tile" + implicit val tileSer = TileUDT.tileSerializer + + override protected def eval(tile: Tile, ctx: Option[TileContext]): Any = + (tile.toArrayTile(): Tile).toInternalRow +} + +object RealizeTile { + def apply(col: Column): TypedColumn[Any, Tile] = + new Column(new RealizeTile(col.expr)).as[Tile] +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 432c66888..b169e79d7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -74,6 +74,7 @@ package object expressions { registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[GetExtent]("rf_extent") registry.registerExpression[GetCRS]("rf_crs") + registry.registerExpression[RealizeTile]("rf_realize_tile") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala index 4a9c2659c..ab138ec91 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.ref.RasterSource case class URIToRasterSource(override val child: Expression) extends UnaryExpression with ExpectsInputTypes with CodegenFallback with LazyLogging { - override def nodeName: String = "uri_to_raster_source" + override def nodeName: String = "rf_read_raster_source" override def dataType: DataType = RasterSourceType diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index f000efbfd..1aa1325cf 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -30,6 +30,8 @@ import org.apache.spark.sql.Encoders import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.expressions.accessors.ExtractTile import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.locationtech.rasterframes.stats._ import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.scalatest.{FunSpec, Matchers} @@ -52,8 +54,8 @@ class RasterFunctionsSpec extends FunSpec lazy val three = TestData.projectedRasterTile(cols, rows, 3, extent, crs, ct) lazy val six = ProjectedRasterTile(three * two, three.extent, three.crs) lazy val nd = TestData.projectedRasterTile(cols, rows, -2, extent, crs, ct) - lazy val randTile = TestData.projectedRasterTile(cols, rows, scala.util.Random.nextInt(), extent, crs, ct) - lazy val randNDTile = TestData.injectND(numND)(randTile) + lazy val randPRT = TestData.projectedRasterTile(cols, rows, scala.util.Random.nextInt(), extent, crs, ct) + lazy val randNDPRT = TestData.injectND(numND)(randPRT) lazy val randDoubleTile = TestData.projectedRasterTile(cols, rows, scala.util.Random.nextGaussian(), extent, crs, DoubleConstantNoDataCellType) lazy val randDoubleNDTile = TestData.injectND(numND)(randDoubleTile) @@ -65,6 +67,8 @@ class RasterFunctionsSpec extends FunSpec TestData.randomTile(cols, rows, UByteConstantNoDataCellType) )).map(ProjectedRasterTile(_, extent, crs)) :+ null + def lazyPRT = RasterRef(RasterSource(TestData.l8samplePath), 0, None).tile + implicit val pairEnc = Encoders.tuple(ProjectedRasterTile.prtEncoder, ProjectedRasterTile.prtEncoder) implicit val tripEnc = Encoders.tuple(ProjectedRasterTile.prtEncoder, ProjectedRasterTile.prtEncoder, ProjectedRasterTile.prtEncoder) @@ -287,21 +291,36 @@ class RasterFunctionsSpec extends FunSpec describe("raster metadata") { it("should get the TileDimensions of a Tile") { - val t = Seq(randTile).toDF("tile").select(rf_dimensions($"tile")).first() - t should be (TileDimensions(randTile.dimensions)) + val t = Seq(randPRT).toDF("tile").select(rf_dimensions($"tile")).first() + t should be (TileDimensions(randPRT.dimensions)) checkDocs("rf_dimensions") } it("should get the Extent of a ProjectedRasterTile") { - val e = Seq(randTile).toDF("tile").select(rf_extent($"tile")).first() + val e = Seq(randPRT).toDF("tile").select(rf_extent($"tile")).first() e should be (extent) checkDocs("rf_extent") } + it("should get the CRS of a ProjectedRasterTile") { + val e = Seq(randPRT).toDF("tile").select(rf_crs($"tile")).first() + e should be (crs) + checkDocs("rf_crs") + } + it("should get the Geometry of a ProjectedRasterTile") { - val g = Seq(randTile).toDF("tile").select(rf_geometry($"tile")).first() + val g = Seq(randPRT).toDF("tile").select(rf_geometry($"tile")).first() g should be (extent.jtsGeom) checkDocs("rf_geometry") } + + it("should realize a delayed load tile") { + val df = Seq(lazyPRT).toDF("prt").as[ProjectedRasterTile] + val lazyTile = df.select(col("prt.tile").as[Tile]).first() + lazyTile shouldBe a[RasterRefTile] + + val realized = df.select(rf_realize_tile(col("prt"))).first() + realized should not be a [RasterRefTile] + } } describe("per-tile stats") { @@ -353,33 +372,33 @@ class RasterFunctionsSpec extends FunSpec checkDocs("rf_for_all") } it("should find the minimum cell value") { - val min = randNDTile.toArray().filter(c => raster.isData(c)).min.toDouble - val df = Seq(randNDTile).toDF("rand") + val min = randNDPRT.toArray().filter(c => raster.isData(c)).min.toDouble + val df = Seq(randNDPRT).toDF("rand") df.select(rf_tile_min($"rand")).first() should be(min) df.selectExpr("rf_tile_min(rand)").as[Double].first() should be(min) checkDocs("rf_tile_min") } it("should find the maximum cell value") { - val max = randNDTile.toArray().filter(c => raster.isData(c)).max.toDouble - val df = Seq(randNDTile).toDF("rand") + val max = randNDPRT.toArray().filter(c => raster.isData(c)).max.toDouble + val df = Seq(randNDPRT).toDF("rand") df.select(rf_tile_max($"rand")).first() should be(max) df.selectExpr("rf_tile_max(rand)").as[Double].first() should be(max) checkDocs("rf_tile_max") } it("should compute the tile mean cell value") { - val values = randNDTile.toArray().filter(c => raster.isData(c)) + val values = randNDPRT.toArray().filter(c => raster.isData(c)) val mean = values.sum.toDouble / values.length - val df = Seq(randNDTile).toDF("rand") + val df = Seq(randNDPRT).toDF("rand") df.select(rf_tile_mean($"rand")).first() should be(mean) df.selectExpr("rf_tile_mean(rand)").as[Double].first() should be(mean) checkDocs("rf_tile_mean") } it("should compute the tile summary statistics") { - val values = randNDTile.toArray().filter(c => raster.isData(c)) + val values = randNDPRT.toArray().filter(c => raster.isData(c)) val mean = values.sum.toDouble / values.length - val df = Seq(randNDTile).toDF("rand") + val df = Seq(randNDPRT).toDF("rand") val stats = df.select(rf_tile_stats($"rand")).first() stats.mean should be (mean +- 0.00001) @@ -406,7 +425,7 @@ class RasterFunctionsSpec extends FunSpec } it("should compute the tile histogram") { - val df = Seq(randNDTile).toDF("rand") + val df = Seq(randNDPRT).toDF("rand") val h1 = df.select(rf_tile_histogram($"rand")).first() val h2 = df.selectExpr("rf_tile_histogram(rand) as hist") @@ -487,7 +506,7 @@ class RasterFunctionsSpec extends FunSpec } it("should compute local data cell counts") { - val df = Seq(two, randNDTile, nd).toDF("tile") + val df = Seq(two, randNDPRT, nd).toDF("tile") val t1 = df.select(rf_agg_local_data_cells($"tile")).first() val t2 = df.selectExpr("rf_agg_local_data_cells(tile) as cnt").select($"cnt".as[Tile]).first() t1 should be (t2) @@ -495,7 +514,7 @@ class RasterFunctionsSpec extends FunSpec } it("should compute local no-data cell counts") { - val df = Seq(two, randNDTile, nd).toDF("tile") + val df = Seq(two, randNDPRT, nd).toDF("tile") val t1 = df.select(rf_agg_local_no_data_cells($"tile")).first() val t2 = df.selectExpr("rf_agg_local_no_data_cells(tile) as cnt").select($"cnt".as[Tile]).first() t1 should be (t2) @@ -522,7 +541,7 @@ class RasterFunctionsSpec extends FunSpec } it("should mask one tile against another") { - val df = Seq[Tile](randTile).toDF("tile") + val df = Seq[Tile](randPRT).toDF("tile") val withMask = df.withColumn("mask", rf_convert_cell_type( @@ -541,7 +560,7 @@ class RasterFunctionsSpec extends FunSpec } it("should inverse mask one tile against another") { - val df = Seq[Tile](randTile).toDF("tile") + val df = Seq[Tile](randPRT).toDF("tile") val baseND = df.select(rf_agg_no_data_cells($"tile")).first() @@ -564,7 +583,7 @@ class RasterFunctionsSpec extends FunSpec } it("should mask tile by another identified by specified value") { - val df = Seq[Tile](randTile).toDF("tile") + val df = Seq[Tile](randPRT).toDF("tile") val mask_value = 4 val withMask = df.withColumn("mask", @@ -585,7 +604,7 @@ class RasterFunctionsSpec extends FunSpec } it("should inverse mask tile by another identified by specified value") { - val df = Seq[Tile](randTile).toDF("tile") + val df = Seq[Tile](randPRT).toDF("tile") val mask_value = 4 val withMask = df.withColumn("mask", diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index f7fc7360d..39025f78e 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -15,6 +15,7 @@ * Added `SinglebandGeoTiff.toDF` extension method. * Added `DataFrame.rasterJoin` extension method for merging two dataframes with tiles in disparate CRSs. * Added `rf_crs` for `ProjectedRasterTile` columns. +* Added `rf_realize_tile` for cases where you want to ensure no lazy tile loading is happening. * Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` and `RasterSource` columns). * Added `st_geometry` (for `Extent` types) and `rf_geometry` (for `ProjectedRasterTile` and `RasterSource` columns). * _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 9d8ceff7a..5eb0c51b4 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -275,6 +275,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_expm1': 'Performs cell-wise exponential, then subtract one', 'rf_identity': 'Pass tile through unchanged', 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', + 'rf_realize_tile': 'Extracts the Tile component of a RasterSource, ProjectedRasterTile (or Tile) and ensures the cells are fully fetched.', 'rf_crs': 'Get the CRS of a RasterSource or ProjectedRasterTile', 'st_extent': 'Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)', 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 41b5c0efb..1ce5d55d1 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -143,20 +143,22 @@ def sqlType(cls): @classmethod def module(cls): - return 'pyrasterframes.types' + return 'pyrasterframes.rf_types' @classmethod def scalaUDT(cls): return 'org.apache.spark.sql.rf.RasterSourceUDT' + def needConversion(self): + return False + + # The contents of a RasterSource is opaque in the Python context. + # Just pass data through unmodified. def serialize(self, obj): - # RasterSource is opaque in the Python context. - # Any thing passed in by a UDF return value couldn't be validated. - # Therefore obj is dropped None is passed to Catalyst. - return None + return obj def deserialize(self, datum): - bytes(datum[0]) + return datum class CellType(object): @@ -419,6 +421,9 @@ def deserialize(self, datum): cols = datum.cell_context.dimensions.cols rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells + if cell_data_bytes is None: + raise Exception("Null cell data: " + str(datum)) + try: as_numpy = np.frombuffer(cell_data_bytes, dtype=cell_type.to_numpy_dtype()) reshaped = as_numpy.reshape((rows, cols)) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 416b4815a..4c1dbd493 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -565,11 +565,10 @@ def test_raster_join(self): class RasterSource(TestEnvironment): def test_handle_lazy_eval(self): - import numpy.testing - # rf_local_add(t, 0) is to force lazy eval; accessing tile.tile is to get at the actual Tile type vs PRT struct df = self.spark.read.rastersource(self.img_uri) - t = df.select('tile.tile').first() - print(t) + tdf = df.select(rf_realize_tile('tile')) + self.assertGreater(tdf.count(), 0) + self.assertIsNotNone(tdf.first()) def test_prt_functions(self): df = self.spark.read.rastersource(self.img_uri) \ From d59055f068d36c4dc8109a85395c5490cf2c43dd Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 18 Jun 2019 16:02:14 -0400 Subject: [PATCH 166/380] Refactor python Tile viz to rf_ipython Signed-off-by: Jason T. Brown --- .../main/python/pyrasterframes/rf_ipython.py | 110 ++++++++++++++++++ .../main/python/pyrasterframes/rf_types.py | 93 +-------------- 2 files changed, 113 insertions(+), 90 deletions(-) create mode 100644 pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py b/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py new file mode 100644 index 000000000..771b8b19e --- /dev/null +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py @@ -0,0 +1,110 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import pyrasterframes.rf_types + + +def tile_to_png(tile): + """ Provide image of Tile.""" + if tile.cells is None: + return None + + import io + from matplotlib.backends.backend_agg import FigureCanvasAgg as FigureCanvas + from matplotlib.figure import Figure + + # Set up matplotlib objects + [width, height] = tile.dimensions() + dpi = 300 + nominal_size = 5.5 # approx full size for a 256x256 tile + fig = Figure(figsize=(nominal_size * width / dpi, nominal_size * height / dpi)) + canvas = FigureCanvas(fig) + axis = fig.add_subplot(1, 1, 1) + + axis.imshow(tile.cells) + axis.set_aspect('equal') + axis.xaxis.set_ticks([]) + axis.yaxis.set_ticks([]) + + axis.set_title('{}, {})'.format(tile.dimensions(), tile.cell_type.__repr__())) # compact metadata as title + + with io.BytesIO() as output: + canvas.print_png(output) + return output.getvalue() + + +def tile_to_html(tile): + """ Provide HTML string representation of Tile image.""" + import base64 + b64_img_html = '' + png_bits = tile_to_png(tile) + b64_png = base64.b64encode(png_bits).decode('utf-8').replace('\n', '') + return b64_img_html.format(b64_png) + + +def pandas_df_to_html(df): + """Provide HTML formatting for pandas.DataFrame with rf_types.Tile in the columns. """ + import pandas as pd + # honor the existing options on display + if not pd.get_option("display.notebook_repr_html"): + return None + + if len(df) == 0: + return df._repr_html_() + + tile_cols = [] + for c in df.columns: + if isinstance(df.iloc[0][c], pyrasterframes.rf_types.Tile): # if the first is a Tile try formatting + tile_cols.append(c) + + def _safe_tile_to_html(t): + if isinstance(t, pyrasterframes.rf_types.Tile): + return tile_to_html(t) + else: + # handles case where objects in a column are not all Tile type + return t.__repr__() + + # dict keyed by column with custom rendering function + formatter = {c: _safe_tile_to_html for c in tile_cols} + + # This is needed to avoid our tile being rendered as ` Date: Wed, 19 Jun 2019 14:50:51 -0400 Subject: [PATCH 167/380] Properly addressed resolving RasterRef in Python TileUDT. --- .../apache/spark/sql/rf/RasterSourceUDT.scala | 2 +- .../rules/SpatialUDFSubstitutionRules.scala | 4 ++-- .../src/main/python/pyrasterframes/context.py | 12 ++++++++++++ .../src/main/python/pyrasterframes/rf_types.py | 10 +++++++++- .../main/python/tests/PyRasterFramesTests.py | 5 +++++ .../rasterframes/py/PyRFContext.scala | 17 ++++++++++++++++- 6 files changed, 45 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala index a5d878798..772bde6fe 100644 --- a/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala +++ b/core/src/main/scala/org/apache/spark/sql/rf/RasterSourceUDT.scala @@ -40,7 +40,7 @@ class RasterSourceUDT extends UserDefinedType[RasterSource] { import RasterSourceUDT._ override def typeName = "rf_rastersource" - override def pyUDT: String = "pyrasterframes.RasterSourceUDT" + override def pyUDT: String = "pyrasterframes.rf_types.RasterSourceUDT" def userClass: Class[RasterSource] = classOf[RasterSource] diff --git a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala index e2ee23b1f..d6fea76b0 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rules/SpatialUDFSubstitutionRules.scala @@ -34,8 +34,8 @@ import org.apache.spark.sql.catalyst.rules.Rule object SpatialUDFSubstitutionRules extends Rule[LogicalPlan] { def apply(plan: LogicalPlan): LogicalPlan = { plan.transform { - case q: LogicalPlan ⇒ q.transformExpressions { - case s: ScalaUDF ⇒ SpatialRelation.fromUDF(s).getOrElse(s) + case q: LogicalPlan => q.transformExpressions { + case s: ScalaUDF => SpatialRelation.fromUDF(s).getOrElse(s) } } } diff --git a/pyrasterframes/src/main/python/pyrasterframes/context.py b/pyrasterframes/src/main/python/pyrasterframes/context.py index 18940aaab..ce7904474 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/context.py +++ b/pyrasterframes/src/main/python/pyrasterframes/context.py @@ -48,6 +48,18 @@ def lookup(self, function_name): def build_info(self): return self._jrfctx.buildInfo() + # NB: Tightly coupled to `org.locationtech.rasterframes.py.PyRFContext._resolveRasterRef` + def _resolve_raster_ref(self, ref): + f = self.lookup("_resolveRasterRef") + return f( + ref.source.raster_source_kryo, + ref.bandIndex, + ref.subextent.xmin, + ref.subextent.ymin, + ref.subextent.xmax, + ref.subextent.ymax, + ) + @staticmethod def active(): """ diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 1ce5d55d1..5a30cb60d 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -31,6 +31,7 @@ class here provides the PyRasterFrames entry point. from pyspark.sql.types import * from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable +from pyrasterframes.context import RFContext import numpy as np __all__ = ['RasterFrame', 'Tile', 'TileUDT', 'CellType', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] @@ -422,7 +423,14 @@ def deserialize(self, datum): rows = datum.cell_context.dimensions.rows cell_data_bytes = datum.cell_data.cells if cell_data_bytes is None: - raise Exception("Null cell data: " + str(datum)) + if datum.cell_data.ref is None: + raise Exception("Invalid Tile structure. Missing cells and reference") + else: + payload = datum.cell_data.ref + cell_data_bytes = RFContext.active().resolve_raster_ref(payload) + + if cell_data_bytes is None: + raise Exception("Unable to fetch cell data from: " + repr(datum)) try: as_numpy = np.frombuffer(cell_data_bytes, dtype=cell_type.to_numpy_dtype()) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 4c1dbd493..2588e4524 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -570,6 +570,11 @@ def test_handle_lazy_eval(self): self.assertGreater(tdf.count(), 0) self.assertIsNotNone(tdf.first()) + ltdf = df.select('tile') + self.assertGreater(ltdf.count(), 0) + self.assertIsNotNone(ltdf.first()) + + def test_prt_functions(self): df = self.spark.read.rastersource(self.img_uri) \ .withColumn('crs', rf_crs('tile')) \ diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 1e93f6347..31ee5107a 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -20,13 +20,18 @@ */ package org.locationtech.rasterframes.py +import java.nio.ByteBuffer + import geotrellis.raster.{CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} +import geotrellis.vector.Extent import org.apache.spark.sql._ import org.locationtech.rasterframes.extensions.RasterJoin -import org.locationtech.rasterframes.{RasterFunctions, _} import org.locationtech.rasterframes.model.LazyCRS +import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} +import org.locationtech.rasterframes.util.KryoSupport +import org.locationtech.rasterframes.{RasterFunctions, _} import spray.json._ import scala.collection.JavaConverters._ @@ -215,4 +220,14 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions //----------------------------Support Routines----------------------------------------- def _listToSeq(cols: java.util.ArrayList[AnyRef]): Seq[AnyRef] = cols.asScala + + type jInt = java.lang.Integer + type jDouble = java.lang.Double + // NB: Tightly coupled to the `RFContext.resolve_raster_ref` method in `pyrasterframes.context`. */ + def _resolveRasterRef(srcBin: Array[Byte], bandIndex: jInt, xmin: jDouble, ymin: jDouble, xmax: jDouble, ymax: jDouble): AnyRef = { + val src = KryoSupport.deserialize[RasterSource](ByteBuffer.wrap(srcBin)) + val extent = Extent(xmin, ymin, xmax, ymax) + val ref = RasterRef(src, bandIndex, Some(extent)) + ref.tile.toArrayTile().toBytes() + } } From a05d6f227abb29c3ea90506a1016161ca6e6fdb2 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 19 Jun 2019 15:26:41 -0400 Subject: [PATCH 168/380] Removed `rf_realize_tile` until we're fully sure it's needed. --- .../locationtech/rasterframes/RasterFunctions.scala | 3 --- .../rasterframes/expressions/accessors/GetCRS.scala | 7 +++++++ .../rasterframes/expressions/package.scala | 1 - .../rasterframes/RasterFunctionsSpec.scala | 10 ---------- docs/src/main/tut/release-notes.md | 1 - .../src/main/python/pyrasterframes/rasterfunctions.py | 1 - .../src/main/python/pyrasterframes/rf_types.py | 2 +- .../src/main/python/tests/PyRasterFramesTests.py | 4 ---- 8 files changed, 8 insertions(+), 21 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index e0a5cd60d..5ca8e0748 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -60,9 +60,6 @@ trait RasterFunctions { /** Extracts the CRS from a RasterSource or ProjectedRasterTile */ def rf_crs(col: Column): TypedColumn[Any, CRS] = GetCRS(col) - /** Extracts the Tile component of a RasterSource, ProjectedRasterTile (or Tile) and ensures the cells are fully fetched. */ - def rf_realize_tile(col: Column): TypedColumn[Any, Tile] = RealizeTile(col) - /** Flattens Tile into a double array. */ def rf_tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala index 00f8f5db4..10efc40b7 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/accessors/GetCRS.scala @@ -37,6 +37,13 @@ import org.locationtech.rasterframes.model.TileContext * * @since 9/9/18 */ +@ExpressionDescription( + usage = "_FUNC_(raster) - Fetches the CRS of a ProjectedRasterTile or RasterSource.", + examples = """ + Examples: + > SELECT _FUNC_(raster); + .... + """) case class GetCRS(child: Expression) extends OnTileContextExpression with CodegenFallback { override def dataType: DataType = schemaOf[CRS] override def nodeName: String = "rf_crs" diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index b169e79d7..432c66888 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -74,7 +74,6 @@ package object expressions { registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[GetExtent]("rf_extent") registry.registerExpression[GetCRS]("rf_crs") - registry.registerExpression[RealizeTile]("rf_realize_tile") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 1aa1325cf..84f00d30b 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -30,7 +30,6 @@ import org.apache.spark.sql.Encoders import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.expressions.accessors.ExtractTile import org.locationtech.rasterframes.model.TileDimensions -import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.locationtech.rasterframes.stats._ import org.locationtech.rasterframes.tiles.ProjectedRasterTile @@ -312,15 +311,6 @@ class RasterFunctionsSpec extends FunSpec g should be (extent.jtsGeom) checkDocs("rf_geometry") } - - it("should realize a delayed load tile") { - val df = Seq(lazyPRT).toDF("prt").as[ProjectedRasterTile] - val lazyTile = df.select(col("prt.tile").as[Tile]).first() - lazyTile shouldBe a[RasterRefTile] - - val realized = df.select(rf_realize_tile(col("prt"))).first() - realized should not be a [RasterRefTile] - } } describe("per-tile stats") { diff --git a/docs/src/main/tut/release-notes.md b/docs/src/main/tut/release-notes.md index 39025f78e..f7fc7360d 100644 --- a/docs/src/main/tut/release-notes.md +++ b/docs/src/main/tut/release-notes.md @@ -15,7 +15,6 @@ * Added `SinglebandGeoTiff.toDF` extension method. * Added `DataFrame.rasterJoin` extension method for merging two dataframes with tiles in disparate CRSs. * Added `rf_crs` for `ProjectedRasterTile` columns. -* Added `rf_realize_tile` for cases where you want to ensure no lazy tile loading is happening. * Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` and `RasterSource` columns). * Added `st_geometry` (for `Extent` types) and `rf_geometry` (for `ProjectedRasterTile` and `RasterSource` columns). * _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 5eb0c51b4..9d8ceff7a 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -275,7 +275,6 @@ def _(data_tile, mask_tile, mask_value): 'rf_expm1': 'Performs cell-wise exponential, then subtract one', 'rf_identity': 'Pass tile through unchanged', 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', - 'rf_realize_tile': 'Extracts the Tile component of a RasterSource, ProjectedRasterTile (or Tile) and ensures the cells are fully fetched.', 'rf_crs': 'Get the CRS of a RasterSource or ProjectedRasterTile', 'st_extent': 'Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)', 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 5a30cb60d..d27bdcc7c 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -427,7 +427,7 @@ def deserialize(self, datum): raise Exception("Invalid Tile structure. Missing cells and reference") else: payload = datum.cell_data.ref - cell_data_bytes = RFContext.active().resolve_raster_ref(payload) + cell_data_bytes = RFContext.active()._resolve_raster_ref(payload) if cell_data_bytes is None: raise Exception("Unable to fetch cell data from: " + repr(datum)) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 2588e4524..569fe95e5 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -566,10 +566,6 @@ class RasterSource(TestEnvironment): def test_handle_lazy_eval(self): df = self.spark.read.rastersource(self.img_uri) - tdf = df.select(rf_realize_tile('tile')) - self.assertGreater(tdf.count(), 0) - self.assertIsNotNone(tdf.first()) - ltdf = df.select('tile') self.assertGreater(ltdf.count(), 0) self.assertIsNotNone(ltdf.first()) From d90f576f1a327d345c5243ba9fbe144976685c91 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 19 Jun 2019 16:55:11 -0400 Subject: [PATCH 169/380] Added copying of assembly jar to Python deps/jars directory. --- project/PythonBuildPlugin.scala | 26 ++++++++++++++++++-------- pyrasterframes/README.md | 3 ++- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index b88b4cd70..24a34c6e7 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -57,19 +57,29 @@ object PythonBuildPlugin extends AutoPlugin { copySources(Test / pythonSource, Python / test / target, false) ) - val buildWhl = Def.task { - val buildDir = (Python / target).value - val retcode = pySetup.toTask(" build bdist_wheel").value - if(retcode != 0) throw new RuntimeException(s"'python setup.py' returned $retcode") - val whls = (buildDir / "dist" ** "pyrasterframes*.whl").get() - require(whls.length == 1, "Running setup.py should have produced a single .whl file. Try running `clean` first.") - whls.head - } + val buildWhl = Def.sequential( + (Compile / assembly), // Needed because SBT will try to parallelize this step out of sequence. + Def.task { + val log = streams.value.log + val buildDir = (Python / target).value + val asmbl = (Compile / assembly).value + val dest = buildDir / "deps" / "jars" / asmbl.getName + IO.copyFile(asmbl, dest) + val retcode = pySetup.toTask(" build bdist_wheel").value + if(retcode != 0) throw new RuntimeException(s"'python setup.py' returned $retcode") + val whls = (buildDir / "dist" ** "pyrasterframes*.whl").get() + require(whls.length == 1, "Running setup.py should have produced a single .whl file. Try running `clean` first.") + log.info(s"Python .whl file written to '${whls.head}'") + whls.head + } + ) val pyDistAsZip = Def.task { + val log = streams.value.log val pyDest = (packageBin / artifactPath).value val whl = buildWhl.value IO.copyFile(whl, pyDest) + log.info(s"Maven Python .zip artifact written to '$pyDest'") pyDest } diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index 71622e8fb..d81df2918 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -83,7 +83,8 @@ Assuming that `$SCALA_VER` is the major verison of Scala in use (e.g. 2.11) , an the primary build artifacts are: * JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` -* Python package: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` +* Python .whl package with assembly: `pyrasterframes/target/python/dist/pyrasterframes-$VER-py2.py3-none-any.whl` +* Python package as Maven .zip artifact: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` You build them with: From a8464aa744434cd9c31d4ea3c42166ce123ce245 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 20 Jun 2019 10:00:26 -0400 Subject: [PATCH 170/380] Fixed issue with assembly not being available before whl is built. --- project/PythonBuildPlugin.scala | 43 ++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 24a34c6e7..6fcfedf6d 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -56,28 +56,32 @@ object PythonBuildPlugin extends AutoPlugin { copySources(Compile / pythonSource, Python / target, true), copySources(Test / pythonSource, Python / test / target, false) ) + + val pyWhlJar = Def.task { + val log = streams.value.log + val buildDir = (Python / target).value + val asmbl = (Compile / assembly).value + val dest = buildDir / "deps" / "jars" / asmbl.getName + IO.copyFile(asmbl, dest) + log.info(s"PyRasterFrames assembly written to '$dest'") + dest + } - val buildWhl = Def.sequential( - (Compile / assembly), // Needed because SBT will try to parallelize this step out of sequence. - Def.task { - val log = streams.value.log - val buildDir = (Python / target).value - val asmbl = (Compile / assembly).value - val dest = buildDir / "deps" / "jars" / asmbl.getName - IO.copyFile(asmbl, dest) - val retcode = pySetup.toTask(" build bdist_wheel").value - if(retcode != 0) throw new RuntimeException(s"'python setup.py' returned $retcode") - val whls = (buildDir / "dist" ** "pyrasterframes*.whl").get() - require(whls.length == 1, "Running setup.py should have produced a single .whl file. Try running `clean` first.") - log.info(s"Python .whl file written to '${whls.head}'") - whls.head - } - ) + val pyWhl = Def.task { + val log = streams.value.log + val buildDir = (Python / target).value + val retcode = pySetup.toTask(" build bdist_wheel").value + if(retcode != 0) throw new RuntimeException(s"'python setup.py' returned $retcode") + val whls = (buildDir / "dist" ** "pyrasterframes*.whl").get() + require(whls.length == 1, "Running setup.py should have produced a single .whl file. Try running `clean` first.") + log.info(s"Python .whl file written to '${whls.head}'") + whls.head + }.dependsOn(pyWhlJar) - val pyDistAsZip = Def.task { + val pyWhlAsZip = Def.task { val log = streams.value.log val pyDest = (packageBin / artifactPath).value - val whl = buildWhl.value + val whl = pyWhl.value IO.copyFile(whl, pyDest) log.info(s"Maven Python .zip artifact written to '$pyDest'") pyDest @@ -118,7 +122,8 @@ object PythonBuildPlugin extends AutoPlugin { test / target := (Compile / target).value / "python" / "tests", packageBin := Def.sequential( Compile / packageBin, - pyDistAsZip, + pyWhl, + pyWhlAsZip, ).value, packageBin / artifact := { val java = (Compile / packageBin / artifact).value From cf774a8d5b3b47eedcbb5501b914f7d2b32745bc Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 20 Jun 2019 10:20:37 -0400 Subject: [PATCH 171/380] Version of pyspark must be anchored to same version in `RFDependenciesPlugin`. --- pyrasterframes/src/main/python/setup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 16a189e94..5d0d8bc2c 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -116,15 +116,15 @@ def run(self): install_requires=[ 'pytz', 'shapely', - 'pyspark', - 'numpy', + 'pyspark==2.3.3', + 'numpy>=1.7', 'pandas', ], setup_requires=[ 'pytz', 'shapely', - 'pyspark', - 'numpy', + 'pyspark==2.3.3', + 'numpy>=1.7', 'pandas', 'pytest-runner', 'setuptools>=0.8', From 6146f0890fc85a6e024843ecd84f284463ae0626 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 17 Jun 2019 19:37:32 -0400 Subject: [PATCH 172/380] Moved Python tests back into main Python source directory (keep it pythonic). --- pyrasterframes/build.sbt | 3 +++ .../{test/python => main/python/tests}/PyRasterFramesTests.py | 0 .../src/{test/python => main/python/tests}/__init__.py | 0 pyrasterframes/src/main/python/{ => tests}/coverage-report.sh | 2 +- 4 files changed, 4 insertions(+), 1 deletion(-) rename pyrasterframes/src/{test/python => main/python/tests}/PyRasterFramesTests.py (100%) rename pyrasterframes/src/{test/python => main/python/tests}/__init__.py (100%) rename pyrasterframes/src/main/python/{ => tests}/coverage-report.sh (86%) diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 570dc1385..2e9e31f42 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,5 +1,8 @@ import PythonBuildPlugin.autoImport.pySetup + +Test / pythonSource := (Compile / sourceDirectory).value / "tests" + exportJars := true lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") diff --git a/pyrasterframes/src/test/python/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py similarity index 100% rename from pyrasterframes/src/test/python/PyRasterFramesTests.py rename to pyrasterframes/src/main/python/tests/PyRasterFramesTests.py diff --git a/pyrasterframes/src/test/python/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py similarity index 100% rename from pyrasterframes/src/test/python/__init__.py rename to pyrasterframes/src/main/python/tests/__init__.py diff --git a/pyrasterframes/src/main/python/coverage-report.sh b/pyrasterframes/src/main/python/tests/coverage-report.sh similarity index 86% rename from pyrasterframes/src/main/python/coverage-report.sh rename to pyrasterframes/src/main/python/tests/coverage-report.sh index 8cde233a1..6b547e026 100755 --- a/pyrasterframes/src/main/python/coverage-report.sh +++ b/pyrasterframes/src/main/python/tests/coverage-report.sh @@ -4,6 +4,6 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -cd "$( dirname "${BASH_SOURCE[0]}" )" +cd "$( dirname "${BASH_SOURCE[0]}" )"/.. coverage run setup.py test && coverage html --omit='.eggs/*,setup.py' && open htmlcov/index.html \ No newline at end of file From 2c67c3aa07721b4ac403bcce116c8dea5a1deb6a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 20 Jun 2019 15:29:12 -0400 Subject: [PATCH 173/380] Efforts to unify creatation of RasterFrames-enabled SparkSession in Python. --- LICENSE | 2 +- build.sbt | 27 +++++- project/PythonBuildPlugin.scala | 30 +++--- project/RFProjectPlugin.scala | 4 + pyrasterframes/README.md | 18 +++- pyrasterframes/build.sbt | 14 +-- .../src/main/python/examples/Clustering.py | 7 +- .../python/examples/CreatingRasterFrames.py | 7 +- .../src/main/python/examples/MeanValue.py | 7 +- .../src/main/python/examples/NDVI.py | 9 +- .../src/main/python/examples/__init__.py | 31 +------ .../main/python/pyrasterframes/__init__.py | 30 +----- .../src/main/python/pyrasterframes/utils.py | 91 +++++++++++++++++++ .../main/python/tests/PyRasterFramesTests.py | 2 +- .../src/main/python/tests/__init__.py | 46 ++++------ 15 files changed, 200 insertions(+), 125 deletions(-) create mode 100644 pyrasterframes/src/main/python/pyrasterframes/utils.py diff --git a/LICENSE b/LICENSE index 152d8c948..53d10c005 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ This software is licensed under the Apache 2 license, quoted below. -Copyright 2017-2018 Astraea, Inc. +Copyright 2017-2019 Astraea, Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of diff --git a/build.sbt b/build.sbt index e322a6591..ada00bf4b 100644 --- a/build.sbt +++ b/build.sbt @@ -1,7 +1,30 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2017-2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ addCommandAlias("makeSite", "docs/makeSite") addCommandAlias("console", "datasource/console") +// Prefer our own IntegrationTest config definition, which inherits from Test. +val IntegrationTest = RFProjectPlugin.IntegrationTest + lazy val root = project .in(file(".")) .withId("RasterFrames") @@ -13,8 +36,6 @@ lazy val `rf-notebook` = project .dependsOn(pyrasterframes) .enablePlugins(RFAssemblyPlugin, DockerPlugin) -lazy val IntegrationTest = config("it") extend Test - lazy val core = project .enablePlugins(BuildInfoPlugin) .configs(IntegrationTest) @@ -67,6 +88,8 @@ lazy val pyrasterframes = project ) lazy val datasource = project + .configs(IntegrationTest) + .settings(Defaults.itSettings) .dependsOn(core % "test->test;compile->compile") .settings( moduleName := "rasterframes-datasource", diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 6fcfedf6d..e9280a617 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -136,21 +136,19 @@ object PythonBuildPlugin extends AutoPlugin { dest / s"${art.name}-python-$ver.zip" }, testQuick := pySetup.toTask(" test").value, - executeTests := Def.sequential( - assembly, - Def.task { - val resultCode = pySetup.toTask(" test").value - val msg = resultCode match { - case 1 ⇒ "There are Python test failures." - case 2 ⇒ "Python test execution was interrupted." - case 3 ⇒ "Internal error during Python test execution." - case 4 ⇒ "PyTest usage error." - case 5 ⇒ "No Python tests found." - case x if x != 0 ⇒ "Unknown error while running Python tests." - case _ ⇒ "PyRasterFrames tests successfully completed." - } - val pySummary = Summary("pyrasterframes", msg) - // Would be cool to derive this from the python output... + executeTests := Def.task { + val resultCode = pySetup.toTask(" test").value + val msg = resultCode match { + case 1 ⇒ "There are Python test failures." + case 2 ⇒ "Python test execution was interrupted." + case 3 ⇒ "Internal error during Python test execution." + case 4 ⇒ "PyTest usage error." + case 5 ⇒ "No Python tests found." + case x if x != 0 ⇒ "Unknown error while running Python tests." + case _ ⇒ "PyRasterFrames tests successfully completed." + } + val pySummary = Summary("pyrasterframes", msg) + // Would be cool to derive this from the python output... val result = if (resultCode == 0) { new SuiteResult( TestResult.Passed, @@ -177,7 +175,7 @@ object PythonBuildPlugin extends AutoPlugin { } result Tests.Output(result.result, Map("PyRasterFramesTests" -> result), Iterable(pySummary)) - }).value + }.dependsOn(assembly).value )) ++ addArtifact(Python / packageBin / artifact, Python / packageBin) } diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index b7c904416..9f50f3fda 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -11,6 +11,10 @@ object RFProjectPlugin extends AutoPlugin { override def trigger: PluginTrigger = allRequirements override def requires = GitPlugin + lazy val IntegrationTest = config("it") extend Test + + override def projectConfigurations: Seq[Configuration] = Seq(IntegrationTest) + override def projectSettings = Seq( organization := "org.locationtech.rasterframes", organizationName := "LocationTech RasterFrames", diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index d81df2918..00f5b7069 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -29,7 +29,17 @@ spark = SparkSession.builder \ #### Pyspark shell or app -To initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. See below for how to build or download those artifacts. +To quickly get the command to run a `pyspark` shell with PyRasterFrames enabled, run + +```bash +sbt pySparkCmd + +# > PYTHONSTARTUP=/var/foo/pyrf_init.py pyspark --jars /somewhere/rasterframes/pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar --py-files /somewhere/rasterframes/pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip +``` + +The runtime dependencies will be created and the command to run printed to the console. + +To manually initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. See below for how to build or download those artifacts. ```bash pyspark \ @@ -66,7 +76,7 @@ example below with `sbt`. The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: ```bash -sbt pyTests +sbt pyrasterframes/test # alias 'pyTest' ``` *See also the below discussion of running `setup.py` for more options to run unit tests.* @@ -74,7 +84,7 @@ sbt pyTests Similarly, to run the examples in `pyrasterframes/python/examples`: ```bash -sbt pyExamples +sbt pyrasterframes/run # alias 'pyExamples' ``` ## Creating and Using a Build @@ -89,7 +99,7 @@ the primary build artifacts are: You build them with: ```bash -sbt pyrasterframes/package +sbt pyrasterframes/package # alias 'pyBuild' ``` Release versions of these artifacts are published to https://central.sonatype.org/ under the Maven/Ivy groupId:artifactId:version (GAV) coordinates diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 2e9e31f42..57af72f7e 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,8 +1,14 @@ -import PythonBuildPlugin.autoImport.pySetup +addCommandAlias("pyTest", "pyrasterframes/test") +addCommandAlias("pyBuild", "pyrasterframes/package") +addCommandAlias("pyExamples", "pyrasterframes/run") Test / pythonSource := (Compile / sourceDirectory).value / "tests" +Compile / run := pySetup.toTask(" examples").dependsOn(assembly).value + +//RFProjectPlugin.IntegrationTest / test := (Compile / run).inputTaskValue + exportJars := true lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") @@ -20,11 +26,5 @@ from pyrasterframes.rasterfunctions import * println(msg) } -lazy val pyExamples = taskKey[Unit]("Run python examples") -pyExamples := Def.sequential( - assembly, - pySetup.toTask(" examples") -).value -addCommandAlias("pyTest", "pyrasterframes/test") \ No newline at end of file diff --git a/pyrasterframes/src/main/python/examples/Clustering.py b/pyrasterframes/src/main/python/examples/Clustering.py index 2b6a99218..3825ede28 100644 --- a/pyrasterframes/src/main/python/examples/Clustering.py +++ b/pyrasterframes/src/main/python/examples/Clustering.py @@ -1,4 +1,5 @@ -from . import example_session, resource_dir +from . import test_resource_dir +from pyrasterframes.utils import create_rf_spark_session from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyspark.sql import * @@ -7,7 +8,7 @@ from pyspark.ml import Pipeline import os -spark = example_session().withRasterFrames() +spark = create_rf_spark_session() # The first step is to load multiple bands of imagery and construct # a single RasterFrame from them. @@ -20,7 +21,7 @@ joinedRF = reduce(lambda rf1, rf2: rf1.asRF().spatialJoin(rf2.drop('bounds').drop('metadata').drop('extent').drop('crs')), map(lambda bf: spark.read.geotiff(bf[1]) .withColumnRenamed('tile', 'band_{}'.format(bf[0])), - map(lambda b: (b, os.path.join(resource_dir, filenamePattern.format(b))), bandNumbers))) + map(lambda b: (b, os.path.join(test_resource_dir(), filenamePattern.format(b))), bandNumbers))) # We should see a single spatial_key column along with columns of tiles. joinedRF.printSchema() diff --git a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py index 5c018fee8..99ae32b05 100644 --- a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py +++ b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py @@ -1,11 +1,12 @@ -from . import resource_dir, example_session +from . import test_resource_dir +from pyrasterframes.utils import create_rf_spark_session from pyrasterframes import * from pyspark.sql import * import os -spark = example_session().withRasterFrames() +spark = create_rf_spark_session().withRasterFrames() -rf = spark.read.geotiff(os.path.join(resource_dir, 'L8-B8-Robinson-IL.tiff')) +rf = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) rf.tileColumns() diff --git a/pyrasterframes/src/main/python/examples/MeanValue.py b/pyrasterframes/src/main/python/examples/MeanValue.py index 1bec83c64..06960b7fc 100644 --- a/pyrasterframes/src/main/python/examples/MeanValue.py +++ b/pyrasterframes/src/main/python/examples/MeanValue.py @@ -1,12 +1,13 @@ -from . import resource_dir, example_session +from . import test_resource_dir +from pyrasterframes.utils import create_rf_spark_session from pyrasterframes import * from pyrasterframes.rasterfunctions import * from pyspark.sql import * import os -spark = example_session().withRasterFrames() +spark = create_rf_spark_session().withRasterFrames() -rf = spark.read.geotiff(os.path.join(resource_dir, 'L8-B8-Robinson-IL.tiff')) +rf = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) rf.agg(rf_agg_no_data_cells('tile'), rf_agg_data_cells('tile'), rf_agg_mean('tile')).show(5, False) diff --git a/pyrasterframes/src/main/python/examples/NDVI.py b/pyrasterframes/src/main/python/examples/NDVI.py index 7fb4d28d2..94e7fe031 100644 --- a/pyrasterframes/src/main/python/examples/NDVI.py +++ b/pyrasterframes/src/main/python/examples/NDVI.py @@ -1,12 +1,13 @@ -from . import resource_dir, example_session +from . import test_resource_dir +from pyrasterframes.utils import create_rf_spark_session from pyrasterframes import * from pyrasterframes.rasterfunctions import * import os -spark = example_session().withRasterFrames() +spark = create_rf_spark_session().withRasterFrames() -redBand = spark.read.geotiff(os.path.join(resource_dir, 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') -nirBand = spark.read.geotiff(os.path.join(resource_dir, 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') +redBand = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') +nirBand = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) diff --git a/pyrasterframes/src/main/python/examples/__init__.py b/pyrasterframes/src/main/python/examples/__init__.py index 8bd561d0a..795a3bd62 100644 --- a/pyrasterframes/src/main/python/examples/__init__.py +++ b/pyrasterframes/src/main/python/examples/__init__.py @@ -1,31 +1,10 @@ # examples_setup import os -import glob -from pyspark.sql import SparkSession -__all__ = ["resource_dir", "example_session"] +__all__ = ["test_resource_dir"] -HERE = os.path.dirname(os.path.realpath(__file__)) - -scala_target = os.path.realpath(os.path.join(HERE, '..', '..', 'scala-2.11')) -resource_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) -jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) - -if not len(jarpath) == 1: - raise RuntimeError(""" -Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/clean' first. """.format(jarpath)) - -pyJar = jarpath[0] - - -def example_session(): - return (SparkSession.builder - .master("local[*]") - .appName("RasterFrames") - .config('spark.driver.extraClassPath', pyJar) - .config('spark.executor.extraClassPath', pyJar) - .config("spark.ui.enabled", "false") - .withKryoSerialization() - .getOrCreate()) +def test_resource_dir(): + here = os.path.dirname(os.path.realpath(__file__)) + scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) + return os.path.realpath(os.path.join(scala_target, 'test-classes')) diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index fc5c14c1b..884538630 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -59,35 +59,9 @@ def _kryo_init(builder): def get_spark_session(): from pyspark.sql import SparkSession import os - import sys - - if sys.version < "3": - import imp - try: - module_home = imp.find_module("pyrasterframes")[1] # path - jar_path = os.path.join(module_home, 'jars') - except ImportError: - print("pyrasterframes was not pip installed. See documentation for initialization instructions.") - return None - else: - from importlib.util import find_spec - try: - module_home = find_spec("pyrasterframes").origin - jar_path = os.path.join(os.path.dirname(module_home), 'jars') - except ImportError: - print("pyrasterframes was not pip installed. See documentation for initialization instructions.") - return None - - jars_cp = ','.join([f.path for f in os.scandir(jar_path) if f.name[-3:] == 'jar']) - spark = (SparkSession.builder - .master("local[*]") - .appName("RasterFrames") - .config('spark.jars', jars_cp) - .withKryoSerialization() - .getOrCreate() - ).withRasterFrames() - return spark + from pyrasterframes.utils import create_rf_spark_session + return create_rf_spark_session() def _convert_df(df, sp_key=None, metadata=None): ctx = SparkContext._active_spark_context._rf_context diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py new file mode 100644 index 000000000..155ce0f46 --- /dev/null +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -0,0 +1,91 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import glob +from pyspark.sql import SparkSession +import os +import sys + +__all__ = ["create_rf_spark_session", "find_pyrasterframes_jar_dir", "find_pyrasterframes_assembly"] + + +def find_pyrasterframes_jar_dir(): + """ + Locates the directory where JVM libraries for Spark are stored. + :return: path to jar director as a string + """ + jar_dir = None + + if sys.version < "3": + import imp + try: + module_home = imp.find_module("pyrasterframes")[1] # path + jar_dir = os.path.join(module_home, 'jars') + except ImportError: + pass + + else: + from importlib.util import find_spec + try: + module_home = find_spec("pyrasterframes").origin + jar_dir = os.path.join(os.path.dirname(module_home), 'jars') + except ImportError: + pass + + # Case for when we're running from source build + if jar_dir is None or not os.path.exists(jar_dir): + def pdir(curr): + return os.path.dirname(curr) + + here = pdir(os.path.realpath(__file__)) + target_dir = pdir(pdir(here)) + # See if we're running outside of sbt build and adjust + if os.path.basename(target_dir) != "target": + target_dir = os.path.join(pdir(pdir(target_dir)), 'target') + jar_dir = os.path.join(target_dir, 'scala-2.11') + + return os.path.realpath(jar_dir) + + +def find_pyrasterframes_assembly(): + jar_dir = find_pyrasterframes_jar_dir() + jarpath = glob.glob(os.path.join(jar_dir, 'pyrasterframes-assembly*.jar')) + + if not len(jarpath) == 1: + raise RuntimeError(""" +Expected to find exactly one assembly. Found '{}' instead. +Try running 'sbt pyrasterframes/package' first. """.format(jarpath)) + return jarpath[0] + + +def create_rf_spark_session(): + jar_path = find_pyrasterframes_jar_dir() + + jars_cp = ','.join([f.path for f in os.scandir(jar_path) if f.name[-3:] == 'jar']) + + spark = (SparkSession.builder + .master("local[*]") + .appName("RasterFrames") + .config('spark.jars', jars_cp) + .config("spark.ui.enabled", "false") + .withKryoSerialization() + .getOrCreate()) + spark.withRasterFrames() + return spark diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index b424979d9..35ab325f8 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -574,7 +574,7 @@ def test_matmul(self): nd = r1.cell_type.no_data_value() e1 = Tile(np.ma.masked_equal(np.array([[nd, 10], [nd, nd]], dtype=r1.cell_type.to_numpy_dtype()), nd)) - self.assertTrue(r1 == e1) + self.assertEqual(r1, e1) class PandasInterop(TestEnvironment): diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 5dac30274..267701f34 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -24,6 +24,7 @@ from pyspark.sql import SparkSession from pyrasterframes.rasterfunctions import * +from pyrasterframes.utils import create_rf_spark_session import sys @@ -33,6 +34,22 @@ import __builtin__ as builtins +def test_resource_dir(): + here = os.path.dirname(os.path.realpath(__file__)) + scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) + return os.path.realpath(os.path.join(scala_target, 'test-classes')) + + +def testing_spark_session(): + spark = create_rf_spark_session() + spark.sparkContext.setLogLevel('ERROR') + + print("Spark Version: " + spark.version) + print("Spark Config: " + str(spark.sparkContext._conf.getAll())) + + return spark + + class TestEnvironment(unittest.TestCase): """ Base class for tests. @@ -44,35 +61,10 @@ def rounded_compare(self, val1, val2): @classmethod def setUpClass(cls): - # gather Scala requirements - here = os.path.dirname(os.path.realpath(__file__)) - target_dir = os.path.dirname(os.path.dirname(here)) - - scala_target = os.path.realpath(os.path.join(target_dir, 'scala-2.11')) - - jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) - - if not len(jarpath) == 1: - raise RuntimeError(""" -Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/clean' first.""".format(jarpath)) - # hard-coded relative path for resources - cls.resource_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) - - # spark session with RF - cls.spark = (SparkSession.builder - .config('spark.driver.extraClassPath', jarpath[0]) - .config('spark.executor.extraClassPath', jarpath[0]) - .config('spark.ui.enabled', False) - .withKryoSerialization() - .getOrCreate()) - cls.spark.sparkContext.setLogLevel('ERROR') - - print("Spark Version: " + cls.spark.version) - print(cls.spark.sparkContext._conf.getAll()) + cls.resource_dir = test_resource_dir() - cls.spark.withRasterFrames() + cls.spark = testing_spark_session() cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') From ac0e0d9c9fdb9dc28b08ce554fd75bd881649a90 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 20 Jun 2019 19:38:19 -0400 Subject: [PATCH 174/380] Switched from .py to .pymd as the source for IPython-evaluated docs. --- build.sbt | 2 +- docs/src/main/paradox/apps/geotrellis-ops.md | 44 ---- docs/src/main/paradox/apps/index.md | 12 - docs/src/main/paradox/apps/ndvi.md | 61 ----- .../src/main/paradox/creating-rasterframes.md | 212 ---------------- .../main/paradox/exporting-rasterframes.md | 189 --------------- docs/src/main/paradox/getting-started.md | 56 ----- docs/src/main/paradox/index.md | 51 ---- docs/src/main/paradox/ml/L8-RGB-VA.png | Bin 75390 -> 0 bytes docs/src/main/paradox/ml/classification.md | 229 ------------------ docs/src/main/paradox/ml/clustering.md | 152 ------------ docs/src/main/paradox/ml/index.md | 18 -- docs/src/main/paradox/ml/statistics.md | 95 -------- docs/src/main/paradox/spatial-queries.md | 7 - .../src/main/python/docs/Background.md | 8 - .../python/docs/InitializingEnvironment.py | 46 ---- .../src/main/python/docs/__init__.py | 29 +-- .../src/main/python/docs/getting-started.pymd | 41 ++++ pyrasterframes/src/main/python/docs/index.md | 46 +++- .../src/main/python/pyrasterframes/utils.py | 91 +++++++ pyrasterframes/src/main/python/setup.py | 4 +- 21 files changed, 178 insertions(+), 1215 deletions(-) delete mode 100644 docs/src/main/paradox/apps/geotrellis-ops.md delete mode 100644 docs/src/main/paradox/apps/index.md delete mode 100644 docs/src/main/paradox/apps/ndvi.md delete mode 100644 docs/src/main/paradox/creating-rasterframes.md delete mode 100644 docs/src/main/paradox/exporting-rasterframes.md delete mode 100644 docs/src/main/paradox/getting-started.md delete mode 100644 docs/src/main/paradox/index.md delete mode 100644 docs/src/main/paradox/ml/L8-RGB-VA.png delete mode 100644 docs/src/main/paradox/ml/classification.md delete mode 100644 docs/src/main/paradox/ml/clustering.md delete mode 100644 docs/src/main/paradox/ml/index.md delete mode 100644 docs/src/main/paradox/ml/statistics.md delete mode 100644 docs/src/main/paradox/spatial-queries.md delete mode 100644 pyrasterframes/src/main/python/docs/Background.md delete mode 100644 pyrasterframes/src/main/python/docs/InitializingEnvironment.py create mode 100644 pyrasterframes/src/main/python/docs/getting-started.pymd create mode 100644 pyrasterframes/src/main/python/pyrasterframes/utils.py diff --git a/build.sbt b/build.sbt index 1b0b224da..34a99934e 100644 --- a/build.sbt +++ b/build.sbt @@ -118,7 +118,7 @@ lazy val docs = project ), paradoxTheme := Some(builtinParadoxTheme("generic")), makeSite := makeSite.dependsOn(Compile / unidoc).dependsOn(Compile / paradox).value, - Compile / paradox / sourceDirectories += (pyrasterframes / Python / doc / target).value.getParentFile, + Compile / paradox / sourceDirectories += (pyrasterframes / Python / doc / target).value, Compile / paradox := (Compile / paradox).dependsOn(pyrasterframes / doc).value ) .settings( diff --git a/docs/src/main/paradox/apps/geotrellis-ops.md b/docs/src/main/paradox/apps/geotrellis-ops.md deleted file mode 100644 index 56ccbbabb..000000000 --- a/docs/src/main/paradox/apps/geotrellis-ops.md +++ /dev/null @@ -1,44 +0,0 @@ -# GeoTrellis Operations - -```tut:invisible -import org.locationtech.rasterframes._ -import geotrellis.raster._ -import geotrellis.raster.render._ -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ - -implicit val spark = SparkSession.builder(). - withKryoSerialization. - master("local[*]").appName("RasterFrames").getOrCreate().withRasterFrames -spark.sparkContext.setLogLevel("ERROR") -import spark.implicits._ -val scene = SinglebandGeoTiff("../core/src/test/resources/L8-B8-Robinson-IL.tiff") -val rf = scene.projectedRaster.toRF(128, 128) -``` - - -GeoTrellis provides a [rich set of Map Algebra operations](https://docs.geotrellis.io/en/latest/guide/core-concepts.html#map-algebra) and other tile processing features that can be used with RasterFrames via Spark's UDF support. - -Here's an example creating a UDFs to invoke the `equalize` transformation on each tile in a RasterFrame, and then compute the resulting per-tile mean of it. - -```tut -import geotrellis.raster.equalization._ -val equalizer = udf((t: Tile) => t.equalize()) -val equalized = rf.select(equalizer($"tile") as "equalized") -equalized.select(rf_tile_mean($"equalized") as "equalizedMean").show(5, false) -``` - -Here's an example downsampling a tile and rendering each tile as a matrix of numerical values. - -```tut -val downsample = udf((t: Tile) => t.resample(4, 4)) -val downsampled = rf.where(rf_no_data_cells($"tile") === 0).select(downsample($"tile") as "minime") -downsampled.select(rf_tile_to_array_double($"minime") as "cell_values").limit(2).show(false) -``` - - -```tut:invisible -spark.stop() -``` - diff --git a/docs/src/main/paradox/apps/index.md b/docs/src/main/paradox/apps/index.md deleted file mode 100644 index c0f7bc28e..000000000 --- a/docs/src/main/paradox/apps/index.md +++ /dev/null @@ -1,12 +0,0 @@ -# Applications - -In this section we outline a few use cases for using *RasterFrames* in your own applications. - -@@ toc { depth=2 } - -@@@ index - -* [GeoTrellis Operations](geotrellis-ops.md) -* [Calculating NDVI](ndvi.md) - -@@@ diff --git a/docs/src/main/paradox/apps/ndvi.md b/docs/src/main/paradox/apps/ndvi.md deleted file mode 100644 index 85c59f2b2..000000000 --- a/docs/src/main/paradox/apps/ndvi.md +++ /dev/null @@ -1,61 +0,0 @@ -# Computing NDVI - -```tut:invisible -import org.locationtech.rasterframes._ -import geotrellis.raster._ -import geotrellis.raster.render._ -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.spark._ -import geotrellis.spark.io._ -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ - -implicit val spark = SparkSession.builder(). - withKryoSerialization. - master("local[*]").appName("RasterFrames").getOrCreate().withRasterFrames -spark.sparkContext.setLogLevel("ERROR") -import spark.implicits._ -val scene = SinglebandGeoTiff("../core/src/test/resources/L8-B8-Robinson-IL.tiff") -val rf = scene.projectedRaster.toRF(128, 128).cache() -``` - -Here's an example of computing the Normalized Differential Vegetation Index (NDVI) is a -standardized vegetation index which allows us to generate an image highlighting differences in -relative biomass. - -> “An NDVI is often used worldwide to monitor drought, monitor and predict agricultural production, assist in predicting hazardous fire zones, and map desert encroachment. The NDVI is preferred for global vegetation monitoring because it helps to compensate for changing illumination conditions, surface slope, aspect, and other extraneous factors” (Lillesand. *Remote sensing and image interpretation*. 2004). - -```tut:silent -def redBand = SinglebandGeoTiff("../core/src/test/resources/L8-B4-Elkton-VA.tiff").projectedRaster.toRF("red_band") -def nirBand = SinglebandGeoTiff("../core/src/test/resources/L8-B5-Elkton-VA.tiff").projectedRaster.toRF("nir_band") - -// We use `asRF` to indicate we know the structure still conforms to RasterFrame constraints -val rf = redBand.spatialJoin(nirBand).withColumn("ndvi", rf_normalized_difference($"red_band", $"nir_band")).asRF - -val pr = rf.toRaster($"ndvi", 466, 428) - -val brownToGreen = ColorRamp( - RGBA(166,97,26,255), - RGBA(223,194,125,255), - RGBA(245,245,245,255), - RGBA(128,205,193,255), - RGBA(1,133,113,255) -).stops(128) - -val colors = ColorMap.fromQuantileBreaks(pr.tile.histogramDouble(), brownToGreen) -pr.tile.color(colors).renderPng().write("target/scala-2.11/tut/apps/rf-ndvi.png") -``` - -![](rf-ndvi.png) - -For a georefrenced singleband greyscale image, we could have done this instead: - -```scala -GeoTiff(pr).write("ndvi.tiff") -``` - - -```tut:invisible -spark.stop() -``` - diff --git a/docs/src/main/paradox/creating-rasterframes.md b/docs/src/main/paradox/creating-rasterframes.md deleted file mode 100644 index 75b65f869..000000000 --- a/docs/src/main/paradox/creating-rasterframes.md +++ /dev/null @@ -1,212 +0,0 @@ -# Creating RasterFrames - -## Initialization - -There are a couple of setup steps necessary anytime you want to work with RasterFrames. the first is to import the API symbols into scope: - - - -```tut:silent -import org.locationtech.rasterframes._ -import org.apache.spark.sql._ -``` - - -Next, initialize the `SparkSession`, and call the `withRasterFrames` method on it: - - -```tut:silent -implicit val spark = SparkSession.builder(). - master("local").appName("RasterFrames"). - config("spark.ui.enabled", "false"). - withKryoSerialization. - getOrCreate(). - withRasterFrames -``` - -And, as is standard Spark SQL practice, we import additional DataFrame support: - -```tut:silent -import spark.implicits._ -``` - -```tut:invisible -spark.sparkContext.setLogLevel("ERROR") -``` - -Now we are ready to create a RasterFrame. - -## Reading a GeoTIFF - -The most straightforward way to create a `RasterFrame` is to read a [GeoTIFF](https://en.wikipedia.org/wiki/GeoTIFF) -file using a RasterFrame [`DataSource`](https://spark.apache.org/docs/latest/sql-programming-guide.html#data-sources) -designed for this purpose. [Cloud Optimized GeoTIFF](http://www.cogeo.org/) files are preferred, as they don't require re-tiling and can be read in a more memory-efficient way. - -First add the following import: - - -```tut:silent -import org.locationtech.rasterframes.datasource.geotiff._ -import java.io.File -``` - -(This is what adds the `.geotiff` method to `spark.read` below.) - -Then we use the `DataFrameReader` provided by `spark.read` to read the GeoTIFF: - - -```tut:book -val samplePath = new File("../core/src/test/resources/LC08_RGB_Norfolk_COG.tiff") -val tiffRF = spark.read. - geotiff. - loadRF(samplePath.toURI) -``` - - -Let's inspect the structure of what we get back: - - -```tut -tiffRF.printSchema() -``` - -As reported by Spark, RasterFrames extracts 6 columns from the GeoTIFF we selected. Some of these columns are dependent -on the contents of the source data, and some are are always available. Let's take a look at these in more detail. - -* `spatial_key`: GeoTrellis assigns a `SpatialKey` or a `SpaceTimeKey` to each tile, mapping it to the layer grid from -which it came. If it has a `SpaceTimeKey`, RasterFrames will split it into a `SpatialKey` and a `TemporalKey` (the -latter with column name `temporal_key`). -* `extent`: The bounding box of the tile in the tile's native CRS. -* `metadata`: The TIFF format header tags found in the file. -* `tile` or `tile_n` (where `n` is a band number): For singleband GeoTIFF files, the `tile` column contains the cell -data split into tiles. For multiband tiles, each column with `tile_` prefix contains each of the sources bands, -in the order they were stored. - -See the section [Inspecting a `RasterFrame`](#inspecting-a--code-rasterframe--code-) (below) for more details on accessing the RasterFrame's metadata. - -## Reading a GeoTrellis Layer - -If your imagery is already ingested into a [GeoTrellis layer](https://docs.geotrellis.io/en/latest/guide/spark.html#writing-layers), -you can use the RasterFrames GeoTrellis DataSource. There are two parts to this GeoTrellis Layer support. The first -is the GeoTrellis Catalog DataSource, which lists the GeoTrellis layers available at a URI. The second part is the actual -RasterFrame reader for pulling a layer into a RasterFrame. - -Before we show how all of this works we need to have a GeoTrellis layer to work with. We can create one with the RasterFrame we constructed above. - - -```tut:silent -import org.locationtech.rasterframes.datasource.geotrellis._ -import java.nio.file.Files - -val base = Files.createTempDirectory("rf-").toUri -val layer = Layer(base, "sample", 0) -tiffRF.write.geotrellis.asLayer(layer).save() -``` - -Now we can point our catalog reader at the base directory and see what was saved: - -```tut -val cat = spark.read.geotrellisCatalog(base) -cat.printSchema -cat.show() -``` - -As you can see, there's a lot of information stored in each row of the catalog. Most of this is associated with how the -layer is discretized. However, there may be other application specific metadata serialized with a layer that can be use -to filter the catalog entries or select a specific one. But for now, we're just going to load a RasterFrame in from the -catalog using a convenience function. - -```tut -val firstLayer = cat.select(geotrellis_layer).first -val rfAgain = spark.read.geotrellis.loadRF(firstLayer) -rfAgain.show() -``` - -If you already know the `LayerId` of what you're wanting to read, you can bypass working with the catalog: - -```tut -val anotherRF = spark.read.geotrellis.loadRF(layer) -``` - -## Writing a GeoTrellis Layer - -See @ref:[Exporting to a GeoTrellis Layer](creating-rasterframes.md#exporting-to-a-geotrellis-layer). - -## Using GeoTrellis APIs - -If you are used to working directly with the GeoTrellis APIs, there are a number of additional ways to create a `RasterFrame`, as enumerated in the sections below. - -First, some more `import`s: - -```tut:silent -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.spark.io._ -``` - - -### From `ProjectedExtent` - -The simplest mechanism for getting a RasterFrame is to use the `toRF(tileCols, tileRows)` extension method on `ProjectedRaster`. - - -```tut -val scene = SinglebandGeoTiff("../core/src/test/resources/L8-B8-Robinson-IL.tiff") -val rf = scene.projectedRaster.toRF(128, 128) -rf.show(5, false) -``` - - -### From `TileLayerRDD` - -Another option is to use a GeoTrellis [`LayerReader`](https://docs.geotrellis.io/en/latest/guide/tile-backends.html), -to get a `TileLayerRDD` for which there's also a `toRF` extension method. - - -```scala -import geotrellis.spark._ -val tiledLayer: TileLayerRDD[SpatialKey] = ??? -val rf = tiledLayer.toRF -``` - - -## Inspecting a `RasterFrame` - -`RasterFrame` has a number of methods providing access to metadata about the contents of the RasterFrame. - -### Tile Column Names - - -```tut:book -rf.tileColumns.map(_.toString) -``` - - -### Spatial Key Column Name - - -```tut:book -rf.spatialKeyColumn.toString -``` - -### Temporal Key Column - -Returns an `Option[Column]` since not all RasterFrames have an explicit temporal dimension. - -```tut:book -rf.temporalKeyColumn.map(_.toString) -``` - -### Tile Layer Metadata - -The Tile Layer Metadata defines how the spatial/spatiotemporal domain is discretized into tiles, and what the key bounds are. - -```tut -import spray.json._ -// NB: The `fold` is required because an `Either` is returned, depending on the key type. -rf.tileLayerMetadata.fold(_.toJson, _.toJson).prettyPrint -``` - -```tut:invisible -spark.stop() -``` - diff --git a/docs/src/main/paradox/exporting-rasterframes.md b/docs/src/main/paradox/exporting-rasterframes.md deleted file mode 100644 index 5a855db53..000000000 --- a/docs/src/main/paradox/exporting-rasterframes.md +++ /dev/null @@ -1,189 +0,0 @@ -# Exporting RasterFrames - -```tut:invisible -import org.locationtech.rasterframes._ -import geotrellis.spark._ -import geotrellis.raster._ -import geotrellis.raster.render._ -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ - -implicit val spark = SparkSession.builder().config("spark.ui.enabled", "false"). - withKryoSerialization. - master("local[*]").appName("RasterFrames").getOrCreate().withRasterFrames -spark.sparkContext.setLogLevel("ERROR") -import spark.implicits._ -val scene = SinglebandGeoTiff("../core/src/test/resources/L8-B8-Robinson-IL.tiff") -val rf = scene.projectedRaster.toRF(128, 128).cache() -``` - -While the goal of RasterFrames is to make it as easy as possible to do your geospatial analysis with a single -construct, it is helpful to be able to transform it into other representations for various use cases. - -## Converting to Array - -The cell values within a `Tile` are encoded internally as an array. There may be use cases -where the additional context provided by the `Tile` construct is no longer needed and one would -prefer to work with the underlying array data. - -The `rf_tile_to_array_int` and `rf_tile_to_array_double` functions provide this facility. - -```tut -val withArrays = rf.withColumn("tileData", rf_tile_to_array_int($"tile")).drop("tile") -withArrays.show(5, 40) -``` - -You can convert the data back to an array, but you have to specify the target tile dimensions. - -```tut -val tileBack = withArrays.withColumn("tileAgain", arrayToTile($"tileData", 128, 128)) -tileBack.drop("tileData").show(5, 40) -``` - -Note that the created tile will not have a `NoData` value associated with it. Here's how you can do that: - -```tut -val tileBackAgain = withArrays.withColumn("tileAgain", rf_with_no_data(rf_array_to_tile($"tileData", 128, 128), 3)) -tileBackAgain.drop("tileData").show(5, 50) -``` - -## Writing to Parquet - -It is often useful to write Spark results in a form that is easily reloaded for subsequent analysis. -The [Parquet](https://parquet.apache.org/)columnar storage format, native to Spark, is ideal for this. RasterFrames -work just like any other DataFrame in this scenario as long as @scaladoc[`rfInit`][rfInit] is called to register -the imagery types. - - -Let's assume we have a RasterFrame we've done some fancy processing on: - -```tut:silent -import geotrellis.raster.equalization._ -val equalizer = udf((t: Tile) => t.equalize()) -val equalized = rf.withColumn("equalized", equalizer($"tile")).asRF -``` - -```tut -equalized.printSchema -equalized.select(aggStats($"tile")).show(false) -equalized.select(aggStats($"equalized")).show(false) -``` - -We write it out just like any other DataFrame, including the ability to specify partitioning: - -```tut:silent -val filePath = "/tmp/equalized.parquet" -equalized.select("*", "spatial_key.*").write.partitionBy("col", "row").mode(SaveMode.Overwrite).parquet(filePath) -``` - -Let's confirm partitioning happened as expected: - -```tut -import java.io.File -new File(filePath).list.filter(f => !f.contains("_")) -``` - -Now we can load the data back in and check it out: - -```tut:silent -val rf2 = spark.read.parquet(filePath) -``` - -```tut -rf2.printSchema -equalized.select(aggStats($"tile")).show(false) -equalized.select(aggStats($"equalized")).show(false) -``` - - -## Exporting a Raster - -For the purposes of debugging, the RasterFrame tiles can be reassembled back into a raster for viewing. However, -keep in mind that this will download all the data to the driver, and reassemble it in-memory. So it's not appropriate -for very large coverages. - -Here's how one might render the image to a georeferenced GeoTIFF file: - -```tut:silent -import geotrellis.raster.io.geotiff.GeoTiff -val image = equalized.toRaster($"equalized", 774, 500) -GeoTiff(image).write("target/scala-2.11/tut/rf-raster.tiff") -``` - -[*Download GeoTIFF*](rf-raster.tiff) - -Here's how one might render a raster frame to a false color PNG file: - -```tut:silent -val colors = ColorMap.fromQuantileBreaks(image.tile.histogram, ColorRamps.BlueToOrange) -image.tile.color(colors).renderPng().write("target/scala-2.11/tut/rf-raster.png") -``` - -![](rf-raster.png) - -## Exporting to a GeoTrellis Layer - -For future analysis it is helpful to persist a RasterFrame as a [GeoTrellis layer](http://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html). - -First, convert the RasterFrame into a TileLayerRDD. The return type is an Either; -the `left` side is for spatial-only keyed data - -```tut:book -val tlRDD = equalized.toTileLayerRDD($"equalized").left.get -``` - -Then create a GeoTrellis layer writer: - -```tut:silent -import java.nio.file.Files -import spray.json._ -import DefaultJsonProtocol._ -import geotrellis.spark.io._ -val p = Files.createTempDirectory("gt-store") -val writer: LayerWriter[LayerId] = LayerWriter(p.toUri) - -val layerId = LayerId("equalized", 0) -writer.write(layerId, tlRDD, index.ZCurveKeyIndexMethod) -``` - -Take a look at the metadata in JSON format: -```tut -AttributeStore(p.toUri).readMetadata[JsValue](layerId).prettyPrint -``` - -## Converting to `RDD` and `TileLayerRDD` - -Since a `RasterFrame` is just a `DataFrame` with extra metadata, the method -@scaladoc[`DataFrame.rdd`][rdd] is available for simple conversion back to `RDD` space. The type returned -by `.rdd` is dependent upon how you select it. - - -```tut -import scala.reflect.runtime.universe._ -def showType[T: TypeTag](t: T) = println(implicitly[TypeTag[T]].tpe.toString) - -showType(rf.rdd) - -showType(rf.select(rf.spatialKeyColumn, $"tile".as[Tile]).rdd) - -showType(rf.select(rf.spatialKeyColumn, $"tile").as[(SpatialKey, Tile)].rdd) -``` - -If your goal convert a single tile column with its spatial key back to a `TileLayerRDD[K]`, then there's an additional -extension method on `RasterFrame` called [`toTileLayerRDD`][toTileLayerRDD], which preserves the tile layer metadata, -enhancing interoperation with GeoTrellis RDD extension methods. - -```tut -showType(rf.toTileLayerRDD($"tile".as[Tile])) -``` - -```tut:invisible -spark.stop() -``` - -[rfInit]: org.locationtech.rasterframes.package#rfInit%28SQLContext%29:Unit -[rdd]: org.apache.spark.sql.Dataset#frdd:org.apache.spark.rdd.RDD[T] -[toTileLayerRDD]: org.locationtech.rasterframes.RasterFrameMethods#toTileLayerRDD%28tileCol:RasterFrameMethods.this.TileColumn%29:Either[geotrellis.spark.TileLayerRDD[geotrellis.spark.SpatialKey],geotrellis.spark.TileLayerRDD[geotrellis.spark.SpaceTimeKey]] -[tile_to_array_int]: org.locationtech.rasterframes.ColumnFunctions#tile_to_array_int - diff --git a/docs/src/main/paradox/getting-started.md b/docs/src/main/paradox/getting-started.md deleted file mode 100644 index b16dac563..000000000 --- a/docs/src/main/paradox/getting-started.md +++ /dev/null @@ -1,56 +0,0 @@ -# Getting Started - -## Quick Start - -RasterFrames is available in in a Jupyter Notebook Docker container for quick experimentation. - -1. Install [Docker](https://www.docker.com/get-docker) for your OS flavor. -2. Run - `docker run -it --rm -p 8888:8888 -p 4040-4044:4040-4044 s22s/rasterframes-notebooks` - -Additional instructions can be found [here](https://github.com/locationtech/rasterframes/blob/develop/deployment/README.md). - -## General Setup - -*RasterFrames* is published via [Maven Central](https://search.maven.org/search?q=g:org.locationtech.rasterframes) (click link to see latest versions). - -To use RasterFrames, add the following library dependencies: - -@@dependency[sbt,Maven,Gradle] { - group="org.locationtech.rasterframes" - artifact="rasterframes_2.11" - version="$version$" -} - -@@dependency[sbt,Maven,Gradle] { - group="org.locationtech.rasterframes" - artifact="rasterframes-datasource_2.11" - version="$version$" -} - -Optional: - -@@dependency[sbt,Maven,Gradle] { - group="org.locationtech.rasterframes" - artifact="rasterframes-experimental_2.11" - version="$version$" -} - -It assumes that SparkSQL 2.3.x is available in the runtime classpath. Here's how to add it explicitly: - -@@dependency[sbt,Maven,Gradle] { - group="org.apache.spark" - artifact="spark-sql" - version="2.3.2" -} - - -Until GeoTrellis 3.0 is released, the following artifact resolver needs to be added to your build. - -```scala -resolvers += "Azavea Public Builds" at "https://dl.bintray.com/azavea/geotrellis" -``` - -@@@ note -Most of the following examples are shown using the Spark DataFrames API. However, many could also be rewritten to use the Spark SQL API instead. We hope to add more examples in that form in the future. -@@@ diff --git a/docs/src/main/paradox/index.md b/docs/src/main/paradox/index.md deleted file mode 100644 index 84dadce2f..000000000 --- a/docs/src/main/paradox/index.md +++ /dev/null @@ -1,51 +0,0 @@ -# RasterFrames - -RasterFrames® brings together Earth-observing (EO) data analysis, big data computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. - -RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is accessible to general analysts while handling the rapidly growing data footprint. - -To learn more, please see the @ref:[Getting Started](getting-started.md) section of this manual. - -The source code can be found on GitHub at [locationtech/rasterframes](https://github.com/locationtech/rasterframes). - - - -
    - -@@@ div { .md-left} - -## Detailed Contents - -@@ toc { depth=2 } - -@@@ - -@@@ div { .md-right } - -## Related Links - -* [Gitter Channel](https://gitter.im/s22s/raster-frames)  [![Join the chat at https://gitter.im/s22s/raster-frames](https://badges.gitter.im/s22s/raster-frames.svg)](https://gitter.im/s22s/raster-frames?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -* [API Documentation](latest/api/index.html) -* [GitHub Repository](https://github.com/locationtech/rasterframes) -* [Astraea, Inc.](http://www.astraea.earth/) (the company behind RasterFrames) - -@@@ - -@@@ div { .md-clear } - -  - -@@@ - -@@@ index -* [Getting Started](getting-started.md) -* [PyRasterFrames](pyrasterframes/index.md) -* [Creating RasterFrames](creating-rasterframes.md) -* [Spatial Queries](spatial-queries.md) -* [Applications](apps/index.md) -* [Machine Learning](ml/index.md) -* [Exporting Rasterframes](exporting-rasterframes.md) -* [UDF Reference](reference.md) -* [Release Notes](release-notes.md) -@@@ - diff --git a/docs/src/main/paradox/ml/L8-RGB-VA.png b/docs/src/main/paradox/ml/L8-RGB-VA.png deleted file mode 100644 index cb41d27427ad427956b4b3fab3d3407817e7399c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75390 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 IM6N<$f@0W)c>n+a diff --git a/docs/src/main/paradox/ml/classification.md b/docs/src/main/paradox/ml/classification.md deleted file mode 100644 index fb50e5664..000000000 --- a/docs/src/main/paradox/ml/classification.md +++ /dev/null @@ -1,229 +0,0 @@ -# Classification - -In this example we will do some simple cell classification based on multiband imagery and a -target/label raster. As a part of the process we'll explore the cross-validation support in -SparkML. - -## Setup - -First some setup: - -```tut:silent -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.ml.{NoDataFilter, TileExploder} -import geotrellis.raster._ -import geotrellis.raster.render._ -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.classification.DecisionTreeClassifier -import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator -import org.apache.spark.ml.feature.VectorAssembler -import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder} -import org.apache.spark.sql._ - -implicit val spark = SparkSession.builder(). - withKryoSerialization. - master("local[*]").appName(getClass.getName).getOrCreate().withRasterFrames -spark.sparkContext.setLogLevel("ERROR") - -import spark.implicits._ - -// Utility for reading imagery from our test data set -def readTiff(name: String): SinglebandGeoTiff = SinglebandGeoTiff(s"../core/src/test/resources/$name") -``` - -## Loading Data - -The first step is to load multiple bands of imagery and construct a single RasterFrame from them. -To do this we: - -1. Identify the GeoTIFF filename. -2. Read the TIFF raster -3. Convert to a raster frame of `tileSize` sized tiles, with an appropriate column name -4. Use the RasterFrames `spatialJoin` function to create a new RasterFrame with a column for each band - - -```tut:silent -val filenamePattern = "L8-%s-Elkton-VA.tiff" -val bandNumbers = 2 to 7 -val bandColNames = bandNumbers.map(b ⇒ s"band_$b").toArray -val tileSize = 10 - -// For each identified band, load the associated image file -val joinedRF = bandNumbers. - map { b ⇒ (b, filenamePattern.format("B" + b)) }. - map { case (b, f) ⇒ (b, readTiff(f)) }. - map { case (b, t) ⇒ t.projectedRaster.toRF(tileSize, tileSize, s"band_$b") }. - reduce(_ spatialJoin _) -``` - -We should see a single `spatial_key` column along with 6 columns of tiles. - -```tut -joinedRF.printSchema() -``` - -Similarly pull we pull in the target label data. When load the target label raster we have -to convert the cell type to `Double` to meet expectations of SparkML. - -```tut:silent -val targetCol = "target" - -val target = readTiff(filenamePattern.format("Labels")). - mapTile(_.convert(DoubleConstantNoDataCellType)). - projectedRaster. - toRF(tileSize, tileSize, targetCol) -``` - -Take a peek at what kind of label data we have to work with. - -```tut -target.select(rf_agg_stats(target(targetCol))).show -``` - -Join the target label RasterFrame with the band tiles to create our analytics base table - -```tut:silent -val abt = joinedRF.spatialJoin(target) - -``` - -## ML Pipeline - -The data preparation modeling pipeline is next. SparkML requires that each observation be in -its own row, and those observations be packed into a single `Vector` type. The first step is -to "explode" the tiles into a single row per cell/pixel. Then we filter out any rows that -have `NoData` values (which will cause an error during training). Finally we use the -SparkML `VectorAssembler` to create that `Vector`. - -```tut:silent -val exploder = new TileExploder() - -val noDataFilter = new NoDataFilter(). - setInputCols(bandColNames :+ targetCol) - -val assembler = new VectorAssembler(). - setInputCols(bandColNames). - setOutputCol("features") -``` - -We are going to use a decision tree for classification. You can swap out one of the other multi-class -classification algorithms if you like. With the algorithm selected we can assemble our modeling pipeline. - -```tut:silent -val classifier = new DecisionTreeClassifier(). - setLabelCol(targetCol). - setFeaturesCol(assembler.getOutputCol) - -val pipeline = new Pipeline(). - setStages(Array(exploder, noDataFilter, assembler, classifier)) -``` - -## Cross Validation - -To extend the sophistication of the example we are going to use the SparkML support for -cross-validation and hyper-parameter tuning. The first step is to configure how we're -going to evaluate our model's performance. Then we define the hyperparmeter(s) we're going to -vary and evaluate. Finally we configure the cross validator. - -```tut:silent -val evaluator = new MulticlassClassificationEvaluator(). - setLabelCol(targetCol). - setPredictionCol("prediction"). - setMetricName("accuracy") - -val paramGrid = new ParamGridBuilder(). - addGrid(classifier.maxDepth, Array(2, 3, 4)). - build() - -val trainer = new CrossValidator(). - setEstimator(pipeline). - setEvaluator(evaluator). - setEstimatorParamMaps(paramGrid). - setNumFolds(4) -``` - -Push the "go button": - -```tut -val model = trainer.fit(abt) -``` - -## Model Evaluation - -To view the model's performance we format the `paramGrid` settings used for each model and -render the parameter/performance association. - -```tut:silent -val metrics = model.getEstimatorParamMaps. - map(_.toSeq.map(p ⇒ s"${p.param.name} = ${p.value}")). - map(_.mkString(", ")). - zip(model.avgMetrics) -``` -```tut -metrics.toSeq.toDF("params", "metric").show(false) -``` - -Finally, we score the original data set (including the cells without target values) and -add up class membership results. - -```tut -val scored = model.bestModel.transform(joinedRF) - -scored.groupBy($"prediction" as "class").count().show -``` - -## Visualizing Results - -The predictions are in a DataFrame with each row representing a separate pixel. -To assemble a raster to visualize the class assignments, we have to go through a -multi-stage process to get the data back in tile form, and from there to combined -raster form. - -First, we get the DataFrame back into RasterFrame form: - -```tut:silent -val tlm = joinedRF.tileLayerMetadata.left.get - -val retiled = scored.groupBy($"spatial_key").agg( - rf_assemble_tile( - $"column_index", $"row_index", $"prediction", - tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType - ) -) - -val rf = retiled.asRF($"spatial_key", tlm) -``` - -To render our visualization, we convert to a raster first, and then use an -`IndexedColorMap` to assign each discrete class a different color, and finally -rendering to a PNG file. - -```tut:silent -val raster = rf.toRaster($"prediction", 186, 169) - -val clusterColors = IndexedColorMap.fromColorMap( - ColorRamps.Viridis.toColorMap((0 until 3).toArray) -) - -raster.tile.renderPng(clusterColors).write("target/scala-2.11/tut/ml/classified.png") -``` - -| Color Composite | Target Labels | Class Assignments | -| ------------------ | ---------------------- | ------------------- | -| ![](L8-RGB-VA.png) | ![](target-labels.png) | ![](classified.png) | - - -```tut:invisible -val raster = SinglebandGeoTiff("../core/src/test/resources/L8-Labels-Elkton-VA.tiff").raster - -val k = raster.tile.findMinMax._2 - -val clusterColors = IndexedColorMap.fromColorMap( - ColorRamps.Viridis.toColorMap((0 to k).toArray) -) - -raster.tile.renderPng(clusterColors).write("target/scala-2.11/tut/ml/target-labels.png") - -spark.stop() -``` diff --git a/docs/src/main/paradox/ml/clustering.md b/docs/src/main/paradox/ml/clustering.md deleted file mode 100644 index 36de19652..000000000 --- a/docs/src/main/paradox/ml/clustering.md +++ /dev/null @@ -1,152 +0,0 @@ -# Clustering - -In this example we will do some simple cell clustering based on multiband imagery. - -## Setup - -First some setup: - -```tut:silent -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.ml.TileExploder -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.raster._ -import geotrellis.raster.render._ -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.clustering.{KMeans, KMeansModel} -import org.apache.spark.ml.feature.VectorAssembler -import org.apache.spark.sql._ - -// Utility for reading imagery from our test data set -def readTiff(name: String): SinglebandGeoTiff = SinglebandGeoTiff(s"../core/src/test/resources/$name") - -implicit val spark = SparkSession.builder(). - withKryoSerialization. - master("local[*]").appName(getClass.getName).getOrCreate().withRasterFrames -spark.sparkContext.setLogLevel("ERROR") - -import spark.implicits._ -``` - -## Loading Data - -The first step is to load multiple bands of imagery and construct a single RasterFrame from them. - -```tut:silent -val filenamePattern = "L8-B%d-Elkton-VA.tiff" -val bandNumbers = 1 to 4 -val bandColNames = bandNumbers.map(b ⇒ s"band_$b").toArray - -// For each identified band, load the associated image file, convert to a RasterFrame, and join -val joinedRF = bandNumbers. - map { b ⇒ (b, filenamePattern.format(b)) }. - map { case (b, f) ⇒ (b, readTiff(f)) }. - map { case (b, t) ⇒ t.projectedRaster.toRF(s"band_$b") }. - reduce(_ spatialJoin _) -``` - -We should see a single `spatial_key` column along with 4 columns of tiles. - -```tut -joinedRF.printSchema() -``` - -## ML Pipeline - -SparkML requires that each observation be in its own row, and those -observations be packed into a single `Vector`. The first step is to -"explode" the tiles into a single row per cell/pixel. - -```tut:silent -val exploder = new TileExploder() -``` - -To "vectorize" the the band columns, as required by SparkML, we use the SparkML -`VectorAssembler`. We then configure our algorithm, create the transformation pipeline, -and train our model. (Note: the selected value of *K* below is arbitrary.) - -```tut:silent -val assembler = new VectorAssembler(). - setInputCols(bandColNames). - setOutputCol("features") - -// Configure our clustering algorithm -val k = 5 -val kmeans = new KMeans().setK(k) - -// Combine the two stages -val pipeline = new Pipeline().setStages(Array(exploder, assembler, kmeans)) - -// Compute clusters -val model = pipeline.fit(joinedRF) -``` - -## Model Evaluation - -At this point the model can be saved off for later use, or used immediately on the same -data we used to compute the model. First we run the data through the model to assign -cluster IDs to each cell. - -```tut -val clustered = model.transform(joinedRF) -clustered.show(8) -``` - -If we want to inspect the model statistics, the SparkML API requires us to go -through this unfortunate contortion: - -```tut:silent -val clusterResults = model.stages.collect{ case km: KMeansModel ⇒ km}.head -``` - -Compute sum of squared distances of points to their nearest center: - -```tut -val metric = clusterResults.computeCost(clustered) -println("Within set sum of squared errors: " + metric) -``` - -## Visualizing Results - -The predictions are in a DataFrame with each row representing a separate pixel. -To assemble a raster to visualize the cluster assignments, we have to go through a -multi-stage process to get the data back in tile form, and from there to combined -raster form. - -First, we get the DataFrame back into RasterFrame form: - -```tut:silent -val tlm = joinedRF.tileLayerMetadata.left.get - -val retiled = clustered.groupBy($"spatial_key").agg( - rf_assemble_tile( - $"column_index", $"row_index", $"prediction", - tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType - ) -) - -val rf = retiled.asRF($"spatial_key", tlm) -``` - -To render our visualization, we convert to a raster first, and then use an -`IndexedColorMap` to assign each discrete cluster a different color, and finally -rendering to a PNG file. - -```tut:silent -val raster = rf.toRaster($"prediction", 186, 169) - -val clusterColors = IndexedColorMap.fromColorMap( - ColorRamps.Viridis.toColorMap((0 until k).toArray) -) - -raster.tile.renderPng(clusterColors).write("target/scala-2.11/tut/ml/clustered.png") -``` - -| Color Composite | Cluster Assignments | -| ------------------ | ------------------- | -| ![](L8-RGB-VA.png) | ![](clustered.png) | - - -```tut:invisible -spark.stop() -``` diff --git a/docs/src/main/paradox/ml/index.md b/docs/src/main/paradox/ml/index.md deleted file mode 100644 index 5798ff3b7..000000000 --- a/docs/src/main/paradox/ml/index.md +++ /dev/null @@ -1,18 +0,0 @@ -# Machine Learning - -@@@ note - -This examples here only scratch the surface of the type of machine learning one can perform -with RasterFrames. More examples are forthcoming. - -@@@ - -@@ toc { depth=2 } - -@@@ index - -* [Statistics](statistics.md) -* [Clustering](clustering.md) -* [Classification](classification.md) - -@@@ diff --git a/docs/src/main/paradox/ml/statistics.md b/docs/src/main/paradox/ml/statistics.md deleted file mode 100644 index 94611be0b..000000000 --- a/docs/src/main/paradox/ml/statistics.md +++ /dev/null @@ -1,95 +0,0 @@ -# Raster Statistics - -```tut:invisible -import org.locationtech.rasterframes._ -import geotrellis.raster._ -import geotrellis.raster.render._ -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.spark._ -import geotrellis.spark.io._ -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ - -implicit val spark = SparkSession.builder(). - withKryoSerialization. - master("local[*]").appName("RasterFrames").getOrCreate().withRasterFrames -spark.sparkContext.setLogLevel("ERROR") -import spark.implicits._ -val scene = SinglebandGeoTiff("../core/src/test/resources/L8-B8-Robinson-IL.tiff") -val rf = scene.projectedRaster.toRF(128, 128).cache() -``` - -RasterFrames has a number of extension methods and columnar functions for performing analysis on tiles. - -## Tile Statistics - -### Tile Dimensions - -Get the nominal tile dimensions. Depending on the tiling there may be some tiles with different sizes on the edges. - -```tut -rf.select(rf.spatialKeyColumn, rf_tile_dimensions($"tile")).show(3) -``` - -### Descriptive Statistics - -#### NoData Counts - -Count the numer of `NoData` and non-`NoData` cells in each tile. - -```tut -rf.select(rf.spatialKeyColumn, rf_no_data_cells($"tile"), rf_data_cells($"tile")).show(3) -``` - -#### Tile Mean - -Compute the mean value in each tile. - -```tut -rf.select(rf.spatialKeyColumn, rf_tile_mean($"tile")).show(3) -``` - -#### Tile Summary Statistics - -Compute a suite of summary statistics for each tile. Use `tile_stats` for integral cells types, and `tile_stats_double` -for floating point cell types. - -```tut -rf.withColumn("stats", rf_tile_stats($"tile")).select(rf.spatialKeyColumn, $"stats.*").show(3) -``` - -### Histogram - -The `tile_histogram` function computes a histogram over the data in each tile. - -In this example we compute quantile breaks. - -```tut -rf.select(rf_tile_histogram($"tile")).map(_.quantileBreaks(5)).show(5, false) -``` - -## Aggregate Statistics - -The `rf_agg_stats` function computes the same summary statistics as `rf_tile_stats`, but aggregates them over the whole -RasterFrame. - -```tut -rf.select(rf_agg_stats($"tile")).show() -``` - -A more involved example: extract bin counts from a computed `Histogram`. - -```tut -rf.select(rf_agg_approx_histogram($"tile")). - map(h => for(v <- h.labels) yield(v, h.itemCount(v))). - select(explode($"value") as "counts"). - select("counts._1", "counts._2"). - toDF("value", "count"). - orderBy(desc("count")). - show(10) -``` - -```tut:invisible -spark.stop() -``` - diff --git a/docs/src/main/paradox/spatial-queries.md b/docs/src/main/paradox/spatial-queries.md deleted file mode 100644 index c492b114a..000000000 --- a/docs/src/main/paradox/spatial-queries.md +++ /dev/null @@ -1,7 +0,0 @@ -# Spatial Queries - -An important aspect of working with big geospatial data is the ability to filter based on spatio-temporal predicates. RasterFrames uses [GeoMesa Spark JTS](http://www.geomesa.org/documentation/current/user/spark/spark_jts.html) for specifying and executing spatial queries against RasterFrame data sources. - -@@@ note -Until this section is written, please see [the `GeoTrellisDataSource` tests](https://github.com/s22s/raster-frames/blob/develop/datasource/src/test/scala/astraea/spark/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala) for examples on how to use the spatial query support. -@@@ diff --git a/pyrasterframes/src/main/python/docs/Background.md b/pyrasterframes/src/main/python/docs/Background.md deleted file mode 100644 index 36ec0b32d..000000000 --- a/pyrasterframes/src/main/python/docs/Background.md +++ /dev/null @@ -1,8 +0,0 @@ -# What is a RasterFrame? - -_This is a work in progress_ - - -1. Conceptual model -2. Data model -3. Compute model diff --git a/pyrasterframes/src/main/python/docs/InitializingEnvironment.py b/pyrasterframes/src/main/python/docs/InitializingEnvironment.py deleted file mode 100644 index 0832b5143..000000000 --- a/pyrasterframes/src/main/python/docs/InitializingEnvironment.py +++ /dev/null @@ -1,46 +0,0 @@ -#' # Initializing PySpark - -#' There are a number of ways to use PyRasterFrames: -#' -#' 1. Standalone Script -#' 2. `pyspark` shell -#' 3. Notebook Environment -#' - -#' ## Initializing a Python Script - -#+ echo=False -from docs import * - -#' Most of RasterFrames is implemented in Scala, and compiled to a Java Virtual Machine (JVM) -#' library file called a '.jar' file. The RasterFrames build provides a special `.jar` file, -#' called an "assembly", containing all of RasterFrames as well as the libraries that RasterFrames -#' rquires outside of Spark -#' Let's assume we can locate the PyRasterFrames "assembly" `.jar` file with a function named -#' `find_pyrasterframes_assembly`. - -#' The first step is to set up a `SparkSession`: - -from pyspark.sql import SparkSession -from pyrasterframes import * -jar = find_pyrasterframes_assembly() -spark = (SparkSession.builder - .master("local[*]") - .appName("RasterFrames") - .config('spark.driver.extraClassPath', jar) - .config('spark.executor.extraClassPath', jar) - .withKryoSerialization() - .getOrCreate()) -spark.withRasterFrames() - -#' Now we have a standard Spark session with RasterFrames enabled in it. -#' To import RasterFrames functions into the environment, use: -from pyrasterframes.rasterfunctions import * - -#' Functions starting with `rf_` (raster-oriented) or `st_` (vector geometry-oriented) are -#' become available for use with DataFrames. - -list(filter(lambda x: x.startswith("rf_") or x.startswith("st_"), dir())) - -#+ echo=False -spark.stop() diff --git a/pyrasterframes/src/main/python/docs/__init__.py b/pyrasterframes/src/main/python/docs/__init__.py index d08030799..4a1d1d5bc 100644 --- a/pyrasterframes/src/main/python/docs/__init__.py +++ b/pyrasterframes/src/main/python/docs/__init__.py @@ -1,30 +1,3 @@ -import os -import glob -from pyspark.sql import SparkSession -__all__ = ["create_spark_session", "find_pyrasterframes_assembly"] - -def find_pyrasterframes_assembly(): - here = os.path.dirname(os.path.realpath(__file__)) - scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) - jarpath = glob.glob(os.path.join(scala_target, 'pyrasterframes-assembly*.jar')) - if not len(jarpath) == 1: - raise RuntimeError(""" -Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/package' first. """.format(jarpath)) - return jarpath[0] - -def create_spark_session(): - pyJar = find_pyrasterframes_assembly() - spark = (SparkSession.builder - .master("local[*]") - .appName("RasterFrames") - .config('spark.driver.extraClassPath', pyJar) - .config('spark.executor.extraClassPath', pyJar) - .config("spark.ui.enabled", "false") - .withKryoSerialization() - .getOrCreate()) - spark.withRasterFrames() - spark.sparkContext.setLogLevel("ERROR") - return spark +__all__ = [] diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd new file mode 100644 index 000000000..a5436b030 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -0,0 +1,41 @@ +# Initializing PySpark + +There are a number of ways to use PyRasterFrames: + +1. Standalone Script +2. `pyspark` shell +3. Notebook Environment + +## Initializing a Python Script + +```python, echo=False +from docs import * +``` + +RasterFrames requires some special configuration to Spark to be fully functional. As a convenience you can use a provided utility function to get a preconfigured Spark session: + +The first step is to set up a `SparkSession`: + +```python +from pyspark.sql import SparkSession +from pyrasterframes.utils import create_rf_spark_session +spark = create_rf_spark_session() +``` + +Now we have a standard Spark session with RasterFrames enabled in it. +To import RasterFrames functions into the environment, use: + +```python +from pyrasterframes.rasterfunctions import * +``` + +Functions starting with `rf_` (raster-oriented) or `st_` (vector geometry-oriented) are +become available for use with DataFrames. + +```python +list(filter(lambda x: x.startswith("rf_") or x.startswith("st_"), dir())) +``` + +```python, echo=False +spark.stop() +``` diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index ff5669d78..92d71730c 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -1,7 +1,45 @@ -# PyRasterFrames Users' Manual +# RasterFrames -@@@ index +RasterFrames® brings together Earth-observing (EO) data analysis, big data computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. + +RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is accessible to general analysts while handling the rapidly growing data footprint. + +To learn more, please see the @ref:[Getting Started](getting-started.md) section of this manual. + +The source code can be found on GitHub at [locationtech/rasterframes](https://github.com/locationtech/rasterframes). + + + +
    + +@@@ div { .md-left} + +## Detailed Contents + +@@ toc { depth=2 } -* [Initializing a RasterFrames Environment](InitializingEnvironment.md) +@@@ + +@@@ div { .md-right } + +## Related Links + +* [Gitter Channel](https://gitter.im/s22s/raster-frames)  [![Join the chat at https://gitter.im/s22s/raster-frames](https://badges.gitter.im/s22s/raster-frames.svg)](https://gitter.im/s22s/raster-frames?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +* [API Documentation](latest/api/index.html) +* [GitHub Repository](https://github.com/locationtech/rasterframes) +* [Astraea, Inc.](http://www.astraea.earth/) (the company behind RasterFrames) + +@@@ + +@@@ div { .md-clear } + +  + +@@@ + +@@@ index +* [Getting Started](getting-started.md) +* [UDF Reference](reference.md) +* [Release Notes](release-notes.md) +@@@ -@@@ \ No newline at end of file diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py new file mode 100644 index 000000000..155ce0f46 --- /dev/null +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -0,0 +1,91 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import glob +from pyspark.sql import SparkSession +import os +import sys + +__all__ = ["create_rf_spark_session", "find_pyrasterframes_jar_dir", "find_pyrasterframes_assembly"] + + +def find_pyrasterframes_jar_dir(): + """ + Locates the directory where JVM libraries for Spark are stored. + :return: path to jar director as a string + """ + jar_dir = None + + if sys.version < "3": + import imp + try: + module_home = imp.find_module("pyrasterframes")[1] # path + jar_dir = os.path.join(module_home, 'jars') + except ImportError: + pass + + else: + from importlib.util import find_spec + try: + module_home = find_spec("pyrasterframes").origin + jar_dir = os.path.join(os.path.dirname(module_home), 'jars') + except ImportError: + pass + + # Case for when we're running from source build + if jar_dir is None or not os.path.exists(jar_dir): + def pdir(curr): + return os.path.dirname(curr) + + here = pdir(os.path.realpath(__file__)) + target_dir = pdir(pdir(here)) + # See if we're running outside of sbt build and adjust + if os.path.basename(target_dir) != "target": + target_dir = os.path.join(pdir(pdir(target_dir)), 'target') + jar_dir = os.path.join(target_dir, 'scala-2.11') + + return os.path.realpath(jar_dir) + + +def find_pyrasterframes_assembly(): + jar_dir = find_pyrasterframes_jar_dir() + jarpath = glob.glob(os.path.join(jar_dir, 'pyrasterframes-assembly*.jar')) + + if not len(jarpath) == 1: + raise RuntimeError(""" +Expected to find exactly one assembly. Found '{}' instead. +Try running 'sbt pyrasterframes/package' first. """.format(jarpath)) + return jarpath[0] + + +def create_rf_spark_session(): + jar_path = find_pyrasterframes_jar_dir() + + jars_cp = ','.join([f.path for f in os.scandir(jar_path) if f.name[-3:] == 'jar']) + + spark = (SparkSession.builder + .master("local[*]") + .appName("RasterFrames") + .config('spark.jars', jars_cp) + .config("spark.ui.enabled", "false") + .withKryoSerialization() + .getOrCreate()) + spark.withRasterFrames() + return spark diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 33477fda0..da72ee90d 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -96,8 +96,8 @@ def initialize_options(self): """Set default values for options.""" # Each user option must be listed here with their default value. self.files = filter( - lambda x: not x.name.startswith('_'), - list((Path(here) / 'docs').resolve().glob('*.py')) + lambda x: not path.basename(x)[:1] == '_', + glob(path.join(here, 'docs', '*.pymd')) ) def finalize_options(self): From ddc5207f3114031bcef4dfb95c3480000642cf83 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 20 Jun 2019 20:31:14 -0400 Subject: [PATCH 175/380] Scaffolding for new documentation. --- project/PythonBuildPlugin.scala | 2 + pyrasterframes/build.sbt | 12 +++--- .../src/main/python/docs/aggregation.md | 2 + .../src/main/python/docs/description.md | 37 +++++++++++++++++ .../src/main/python/docs/getting-started.pymd | 38 +++++++++++++++--- pyrasterframes/src/main/python/docs/index.md | 9 +++++ .../src/main/python/docs/local-algebra.pymd | 1 + .../src/main/python/docs/nodata-handling.pymd | 2 + .../src/main/python/docs/pandas-numpy.md | 2 + .../src/main/python/docs/raster-io.pymd | 7 ++++ .../src/main/python/docs/raster-processing.md | 12 ++++++ .../main/python/docs/rasterframe-anatomy.png | Bin 0 -> 216018 bytes .../python/docs/rasterframes-data-sources.png | Bin 0 -> 498181 bytes .../docs/rasterframes-locationtech-stack.png | Bin 0 -> 630758 bytes .../src/main/python/docs/spark-ml.pymd | 2 + .../main/python/docs/spatial-relations.pymd | 1 + .../src/main/python/docs/time-series.pymd | 1 + 17 files changed, 117 insertions(+), 11 deletions(-) create mode 100644 pyrasterframes/src/main/python/docs/aggregation.md create mode 100644 pyrasterframes/src/main/python/docs/description.md create mode 100644 pyrasterframes/src/main/python/docs/local-algebra.pymd create mode 100644 pyrasterframes/src/main/python/docs/nodata-handling.pymd create mode 100644 pyrasterframes/src/main/python/docs/pandas-numpy.md create mode 100644 pyrasterframes/src/main/python/docs/raster-io.pymd create mode 100644 pyrasterframes/src/main/python/docs/raster-processing.md create mode 100644 pyrasterframes/src/main/python/docs/rasterframe-anatomy.png create mode 100644 pyrasterframes/src/main/python/docs/rasterframes-data-sources.png create mode 100644 pyrasterframes/src/main/python/docs/rasterframes-locationtech-stack.png create mode 100644 pyrasterframes/src/main/python/docs/spark-ml.pymd create mode 100644 pyrasterframes/src/main/python/docs/spatial-relations.pymd create mode 100644 pyrasterframes/src/main/python/docs/time-series.pymd diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index a0d5971ea..789150997 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -37,6 +37,8 @@ object PythonBuildPlugin extends AutoPlugin { val pythonSource = settingKey[File]("Default Python source directory.").withRank(ASetting) val pythonCommand = settingKey[String]("Python command. Defaults to 'python'") val pySetup = inputKey[Int]("Run 'python setup.py '. Returns exit code.") + + // TODO: figure out how to rewrite this using the standard `mappings` facility. def copySources(srcDir: SettingKey[File], destDir: SettingKey[File], deleteFirst: Boolean) = Def.task { val s = streams.value val src = srcDir.value diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 942fbf9c5..9b488f804 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -8,9 +8,9 @@ Test / pythonSource := (Compile / sourceDirectory).value / "tests" exportJars := true Python / doc / sourceDirectory := (Python / target).value / "docs" -Python / doc / target := (Python / target).value / "markdown" / "pyrasterframes" -Python / doc := { - val _ = Def.sequential( +Python / doc / target := (Compile / target).value / "py-markdown" +Python / doc := (Python / doc / target).toTask.dependsOn( + Def.sequential( assembly, pySetup.toTask(" pweave"), copySources( @@ -18,9 +18,9 @@ Python / doc := { Python / doc / target, deleteFirst = true ) - ).value - (Python / doc / target).value -} + ) +).value + doc := (Python / doc).value diff --git a/pyrasterframes/src/main/python/docs/aggregation.md b/pyrasterframes/src/main/python/docs/aggregation.md new file mode 100644 index 000000000..140aec39d --- /dev/null +++ b/pyrasterframes/src/main/python/docs/aggregation.md @@ -0,0 +1,2 @@ +# Aggregation + diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md new file mode 100644 index 000000000..8a27c66ad --- /dev/null +++ b/pyrasterframes/src/main/python/docs/description.md @@ -0,0 +1,37 @@ +# Description + +Human beings have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. + +Today, DataFrames are the _lingua franca_ of data science. The evolution of the tabular form has continued with Apache Spark SQL, which brings DataFrames to the big data distributed compute space. Through several novel innovations, Spark SQL enables interactive and batch-oriented cluster computing without having to be versed in the highly specialized skills typically required for high-performance computing. As suggested by the name, these DataFrames are manipulatable via standard SQL, as well as the more general-purpose programming languages Python, R, Java, and Scala. + +RasterFrames®, an incubating Eclipse Foundation LocationTech project, brings together Earth-observing (EO) data analysis, big data computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. According to a World Bank document on assets for post-disaster situation awareness[^1]: + +> Of the 1,738 operational satellites currently orbiting the earth (as of 9/[20]17), 596 are earth observation satellites and 477 of these are non-military assets (ie available to civil society including commercial entities and governments for earth observation, according to the Union of Concerned Scientists). This number is expected to increase significantly over the next ten years. The 200 or so planned remote sensing satellites have a value of over 27 billion USD (Forecast International). This estimate does not include the burgeoning fleets of smallsats as well as micro, nano and even smaller satellites... All this enthusiasm has, not unexpectedly, led to a veritable fire-hose of remotely sensed data which is becoming difficult to navigate even for seasoned experts. + +RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is accessible to general analysts while handling the rapidly growing data footprint. + +## Architecture + +RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO operations. It does this with the help of several other LocationTech projects: +[GeoTrellis](https://geotrellis.io/), [GeoMesa](https://www.geomesa.org/), +[JTS](https://github.com/locationtech/jts), and +[SFCurve](https://github.com/locationtech/sfcurve) (see Figure 1). + +![LocationTech Stack](rasterframes-locationtech-stack.png) + +RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As showin in Figure 2, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. + +![RasterFrame Anatomy](rasterframe-anatomy.png) + +Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. + +![RasterFrame Data Sources](rasterframes-data-sources.png) + +[R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame +[Pandas]:https://pandas.pydata.org/ +[GeoJSON]:https://en.wikipedia.org/wiki/GeoJSON +[GTLayer]:https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html#layouts-and-tile-layers +[PDS]:https://registry.opendata.aws/modis/ + +[^1]: [_Demystifying Satellite Assets for Post-Disaster Situation Awareness_](https://docs.google.com/document/d/11bIw5HcEiZy8SKli6ZFQC2chVEiiIJ-f0o6btA4LU48). +World Bank via [OpenDRI.org](https://opendri.org/resource/demystifying-satellite-assets-for-post-disaster-situation-awareness/). Accessed November 28, 2018. diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index a5436b030..623eb2fcc 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -1,12 +1,40 @@ -# Initializing PySpark +# Getting Started + There are a number of ways to use PyRasterFrames: -1. Standalone Script -2. `pyspark` shell -3. Notebook Environment +1. `pyspark` shell +2. Jupyter Notebook +3. Standalone Python Script + +## `pyspark` shell + + +To manually initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. See below for how to build or download those artifacts. + +```bash + pyspark \ + --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ + --conf spark.kryo.registrator=org.locationtech.rasterframes.util.RFKryoRegistrator \ + --conf spark.kryoserializer.buffer.max=500m \ + --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ + --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip + +``` + +Then in the pyspark shell or app, import the module and call `withRasterFrames` on the SparkSession. + +```python, evaluate=False +import pyrasterframes +spark = spark.withRasterFrames() +df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') +``` + +## Jupyter Notebook + +See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook)/README.md -## Initializing a Python Script +## Standalone Python Script ```python, echo=False from docs import * diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index 92d71730c..f92aae9ed 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -38,8 +38,17 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi @@@ @@@ index +* [Description](description.md) * [Getting Started](getting-started.md) +* [Raster Data I/O](raster-io.md) +* [Spatial Relations](spatial-relations.md) +* [Raster Processing](raster-processing.md) +* [Pandas & NumPy Interoperabiliyt](pandas-numpy.md) * [UDF Reference](reference.md) * [Release Notes](release-notes.md) @@@ + + +Raster processing +Installation diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd new file mode 100644 index 000000000..d8d257d14 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -0,0 +1 @@ +# Local Algebra diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd new file mode 100644 index 000000000..dde8433a2 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -0,0 +1,2 @@ +# "NoData" Handling + diff --git a/pyrasterframes/src/main/python/docs/pandas-numpy.md b/pyrasterframes/src/main/python/docs/pandas-numpy.md new file mode 100644 index 000000000..35c124f61 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/pandas-numpy.md @@ -0,0 +1,2 @@ +# Pandas and NumPy Interoperabilty + diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd new file mode 100644 index 000000000..375f9c4f8 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -0,0 +1,7 @@ +# Raster Data I/O + +## Reading Raster Data + +## Writing Raster Data + + diff --git a/pyrasterframes/src/main/python/docs/raster-processing.md b/pyrasterframes/src/main/python/docs/raster-processing.md new file mode 100644 index 000000000..0d3189c66 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/raster-processing.md @@ -0,0 +1,12 @@ +# Raster Processing + +@@@ index + +* [Local Algebra](local-algebra.md) +* ["NoData" Handling](nodata-handling.md) +* [Aggregation](aggregation.md) +* [Time Series](time-series.md) +* [Spark ML](spark-ml.md) + +@@@ + diff --git a/pyrasterframes/src/main/python/docs/rasterframe-anatomy.png b/pyrasterframes/src/main/python/docs/rasterframe-anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..08abab9f2dbd5e4a72690a1f9558b0a624c17dd0 GIT binary patch literal 216018 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ΝklV-Zgq1 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

    #UluV2tx6K!^8lh1ne*;}CAl)RSCd*tq@e=Sz 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

    P9R+q=KJo~`2ZC#Ce)gHI89P5=Cx>e-h9 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%0DRHPrzyfE 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 G_x}f5Rdf9S literal 0 HcmV?d00001 diff --git a/pyrasterframes/src/main/python/docs/rasterframes-locationtech-stack.png b/pyrasterframes/src/main/python/docs/rasterframes-locationtech-stack.png new file mode 100644 index 0000000000000000000000000000000000000000..869d6174207608db8df20fb0e7b93dc09f25eca5 GIT binary patch literal 630758 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

    hx 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 `5knO!p>v8I;3pbFfY0Epj7> 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 (&-Lx?#V9;NU8iKg1X+->BlXSh5PETG`m5 zViRWg*f-Le6wpSgd)tp&cj>RFvpwH1T#ph@qW+XyqQky`m1{ja!^`Ss#}^?^s_=Xv zW{4JxGoc8DCsb5^1aeY}6UJwO1VJ^0bjO8#IReGe=Q!$%OF)&mj-IT~EI3*Z1s~%= zC5%h}(wc=cdCOx%;(DB82dUeJg+j&&QSOpvhMU*?>)~NF7m#I%w|oq@mu%lfe7 zp5pQhyG&4V5&B)m~vni!QL=K+{an)=K@I!)=lHgOsUJhgSoQ8f0nBB4hsd_V(6N zy2VcFkdx$!86|KpbpMJvX|L&*!*b7EOw9|iEID&{RL6upb5LK|)dIc%4 z=gSO^6ooDJ@QK4Y{Jh`3Q@-D?8+-lhYwW;-fs36Pv!Y^+VI}J14nagr-l9b-A3ZBA zgwIzy8W4Xa6q#Pf4u;M*>QDJ@QDP)^|>x>^F2C^G@vPeaB#=|zOC$)UBqLG0mkv@~0P z9~fBXN653wn7y55!%swld^QouqO0I?tYm%rfe5gPDl94_WD}c7#|ULXAX63{c0}i;q$BG%!0e)AIp@ z8^RL)3H`1_;UjuCi^EdLv9aR;vQf`*80kpl9+UXeiK9$ zh5Nsc=FJzCc=8&{(UvGem*ye4x~U=fkcaa#M4QuTFvEoBP(?pd@txpli>tjyOUD)p0cMe&kfefJYL zdHi-Bh)$mlQsJXjWqj1q_aegSq7|fGB#;`1^nVZyunp}K6oQF|$^7Y*Itxf@)@{*P zu1mxlaEbWOtf%_5Neq)K zA3cw%=-;m|6N|E2=~fWT?;8?N!%KeykzNw&Wh;TtJQxpwB4CCaA;LwXY=_Cr+~FfJUu*>Lyi(Y5JdYc zRqp{Q3W9m2wp0Dj5_!C6mk+xl8xfu)7)EOZURew!L}es?#K)>2fwYD_zW(U(9b1BkJ?^OoGBjyrOE-o(JxXg` z1^2EztDj7}Z`&g{)Hw?TYh6@=Y*`cW1o0&u4d1fLL@bG$cjq6qp5rDCNOW7$Q#y+E zT_0wG%afQL?<384*gg)bfGEh1+U>o{Fw%*{@I$MKt*(ql_XCc0<~u#vZ#y@2#Z!VW zIo0*l;T^Wt3C8fyTYL+jMBYw8QnHJq^YNu9o#5eTb8RXqm21i2qW22l25G~EZgXxZ zzXv;tl`v{0yu4^{HL~Mcfkr1M{)CS!d zs{ehtKa(c!o(h08q09gzaOz4>_LFSWKul_euF3Nb#Df93EG*Bkz-;jPLn9zs^cxKO zbz{LYmk7624TT(h&e7R(;(2w=nd4$xYgwE_tr+xQ6iqPVU2^*hlwaE$&+8*Ekl}F# zYX@TUc-X0gg6s45n=*@3ex%!0^*O0)P2DUnRCh#HUPS0oB?WrJ#~e+(h9gJ0&rDHCc-rRzLR)1O);@JHBWp zt$#ff@0)S_TxNZJgZ6J1!kje!*e0vK=KO^JS#cM#pxU_Wifh|* z$m&jsn+T{lO;e!_UwNwD3agwgf zY`#~3lKz?O+adP?yO+(^ZFiSC#ZuFy<_8V`m`cpy6w_oTJh*5X$XWhBrn_loOHfd) z@nGOo$XN`OKW4DVXg9B=sti|vRBEi6dbx}FbvBoiig7yAgxAEhx{MC(1Pu^ux^W?v zuQUF=`g%N~NbFrme$JH%v-)mIku>u6vrryEvB}1mVT5ZJ#>K2h${pNEbOjnJk5wX6y~-L+h0YE&k`VR^i7T1DUfMaA1^b4%2z!S|xNoy+;i!O6KxB!R}+? zqd+RWH*F$Qux?yk8FJCf&J|9i?00iQ*u^8mkMiF&?O!YEIeGoNkzs9D4EH?D&EYCJ zJ*@d~SiyLt?^R2SjO{wM#54-vo-wgH74s;-wl~l=l9p$Vh#* ztoQEjPY!4?4q*yBaY}~po)cfE<XN z^1xmH+98y9Nt;R>oJ}HK^-an5vKjgmO%Fc*)fF#IA1P8`*Bxr|+Ez8YAkoH?vUrVe z3}(r%9s}{Nu|MA-!;A(;@6`GElQhmoc%XuE41lbOdzi>0FGE|Xuy21Y^*lv0MHrb>WO5Mqk55<(;o^f z{QgkWqV}wRfpLKCHsKq8LI$AhyFiptlmU_`ge5~4F$tc?S%1Z6cg8OJ`TN9!I+*dF?01xnUcuS`ZR(#@G61kr>EyFHF}#fp4GZ< z2Dw1Pae-)(`$`!>!!lJCv-7BN1{GiO$c|GNIU8!ME!Li|&?1Y`#qOhJbg$NVx}_d= z#^xs@q7PNlEya*u!P3VcqO21JUmNUOF5Vfy@d4M@UwqQq9KwsKEX(ET2ftx1Q(ktt z@y~om{bh>wr4J`j71Mms?Pd8vximhdIZo5xLg0PpvDoXXV`%GDX_Y^TAXjR=gixK# zvQKTYGSR_eWd)l_;Nwb|%dhY+g5W(H7$l99Yyi+E9k-5oR%tSzXnxWp25UbFC?O); z3=aurALfeXYAm8KU7uE#d4nY+F%qmFrkgpc5-5@WG+CJwX@KhnN5CSG=9_&#q-dzS zrY$dgi(}MI7C{tkBHv*3{5~dxkZu^!SFTe8t+KK*B_*Zq0roHDm)PMyk8f~Ry`OI= zO!iWJg|MOgU;6s`zJpuy><>o!`yn0BEMH%Ob)l5NR3ejU=fuby?L6W;HqlpChcYbf{cNFtD z9gZI(dfj1qvRsU>X1xaHcG3vJi4~62H-y@kPA3;n%mV7c44 z!=FwR_Tph>ukt>{#?XKMlhOnawW9h<@ z>Yrf>Iw1o?>!l}wA1>=CTW(gEx0^%iTP8p0hvrD{)P99z%$8LohmCLcm@qGP@-x~s z?UwQy$#5=2o#{Vs9Bzp6z>cnC4~UTACAS%NX?tAMh}8^32Noj;yHD$3|56#su0sbA z-rinQSU}T!{IeW>JW>hp^zccbjP~+gIK;K zK5%vbU-z|HkITPmw5H9)iKROX&G5~7#6xAI_2`qJB2@rmcJ%lH-GLA}gfKy;mo*T0 zK2RTKHR$%LKaLQ&d4#}v2o)H%@a4@{o{!O}vRduTTg7*XCo5HOK?JO`_b(hmF}?6; zyaD}kH7-n>I-%=)Klm^!BZ>Bhj&E@_EM%H7D;G%rbBGYB5$G^vyyE7}uR$nt0{z(r zb^GLtFTMufn~T*8f1;%D@8F-3%DM76aB)S{1VPGS#NjvOeX?(vyw1#ilU~-=$Z)H$ zFX=X&uIH-_V4w^I38@DoI8t)#FmiY3CoT1inGfQV51I-kBqtv_wBAr37HUP@6ZGNY~r za4k+7L7{&zD(n>y3-^vGVK5O0(~m=~EnLPWjmpi|CGXYx_G*LedZyjJ?NHcBAQ^Lv z{uEe45bOk8KSOBuRHxvX5MMQch!DcN-VJukH;LY_ey~v0w3h>(fy*d|n!g21`Mtln zOCzl9yQJ9Mhg}`Qu}uC4#3w+91VLv%&}M7f?8BML7Zl-|$s>bvM`Ih&0i=ru+Ge8B zzuqJ9pnWsHZs(a!xM8uEBy6;USd_5g#lKHA&nq8kOli{mc?{3sfW?&!gq{O|wkrAw<94yC0e6?Ezad{6<;mO%XoICL{+o{o^ zWkV2+i$97&v>`O_y!7YG;X)aakr($h8<7T}O%!49cZ=D4c7av}3wfqh4a=1kC5|1cd{Oxul^h(yM zc|ag9Tjt&8#@XO;4~`lwZLeB1hGS<3kgB7Qf>LZVhav1yKl*NUdiUK73#Bi3IA(Z|Ks z%BzI9c*KX$LIHvI$Yx+}UwR?}hEDPuLESY@1QmR08 z4`D+D1~^Y6(x;Q91x6jq9~eOyl^*^~RcCe;Z~0d*bP=p`s6{fp+7gL(esA5R1m#uau)1_H^K z>3hH$`2Q@k|CPccO9F9F%e*J}(ygJsnd4buX^dS_>}(W0ArC@Y10s@Uh(-ltqWckK zR|gGN+~r`NHOA3cm`Oj}7*|Vuo!|INvIgF8yHXqKkdN622>*2i}aE(gT<79Q>aJt^iy)%|#-@6)6SE3gPVn(rL5#n-w?GXby`d zCf5>WU&pF0-oWRbd;`z(dk>+H2P(y(tx3;(t;&N%wI60xnCnVzZkYu`%dQ_g=c6|s z9Wi}ZIlNfWj|D@A{n`RJF$>Sh;4w4>I@x83X$zRE+|^nO${(r{-(K5se+@isuN_}( z!I|4E0L9>?$K={>2{CWffy?K3Lmnw5)s{TMWqUkWj=bm9zR@>_GJCWf~^~wLU z$p{OfpSkKXu}Ng$>?%C04|K%y`Z}V*G0IPYUOeF*k`F5>Zj-MI2A{t?-#*$*Z9aQ| z@u{EX1A9i)6KzBTJuE_k)*i9`t-Tpaw8UDKv3jUnm9XGeMrQagSupJ5vM!s`Jf|^L&ROsu>R>)g~KpOH(_fZ)c8GY2ucIG{s^=7;KQx(KPLr70OJs~#vP@YN-pg0o` z99PP<-VJDl4RrhkvDrL{&)DZv$?oT01j^bHtwy$Mr*N;Iy+HrwrP^+Z!`vf#4tUUQYLza`!Uw>6%IQex5!n4saXfGU-Yx*lNRS z#SOF+XKa(_E!57-9AI3M&FAN-Vv{d+lq6Z41Ph^|dF)8mUCpoqhLD$hA9Cjmi@`5C z!Ra0U8594F!1~W^xt&1rsfM8M%2qiEi*vptN_*#jbIL~etxGYK=TTg5F5rNOr|Zvj z1a*0EE8jr*SY^^}FR_mPfT%A!$U@;mBC=xw1Q@b72-R5NLn88VFtno}{b_l@;(2eRF51S;YI@y`MdCG+xp~0)QV!EGN{q{^ z>2(cCIn&fsrxkF8rJCjCXCadEUk+fbVgGyM{c^b@|I|y0H%xZ13m1r$7O@;^vxsNF z!I7@=$1M<2NjwbY^4H^Q1rwVb(0kx2x6StNE$iTidfbR7jNm+ckz!5yCDbc))acto zXBj3Dp`7Ql1=!x^lw@I>Sk|9UFl)=v21xVTm2wmp8{GMPt~s^DK-Q%4cx6k`#p&>h zZs9u9clte@!{qg<(bW;sH4T&4k=f0+QpcCbZ?HkTDtQSoMmJ{RP}edLNrqR6MIQrM zJ*hL+=@FahdcB|h&b<_*BeyMK&W;$W*VuiD0Nre#gOIO3w{&%EC(p3IVqeF!sKe(! zT#0zp7G(e1BQImD0vrZ7X&jBu)YjZSUR1_o=(%6c#s&!v%n}Xl?>@ka~UCw}Fz;RpQjG>QzN_z=2LexmTU5A5{o zVdXsZ-cG2UO6; zuHg6YL#;?C!~z8!eigFmV!UEy9K5_`N6&iG{F$;A=@$vRl1Bl&X(sXCs2{;HIX4F6 z(ZcJ3hW^Z`#+jJCM?3X2`hVUn_FGPyX8Y<2(frBPnc91vWWt;w@oEcbby=idoXQr< z=%|4oxH&OWkD96Y>SVB1Rk!S}nQ%VidM?VxQ^nAOYfLAUqf~^IS7(X5gqBg$D6N?T zK2=RW&7Xmc|I;9uK@GVLGz^TX=u5%Ne#(_dvIlT?<0p1SkDF?}3(Yi(J!3EjxM|JB_372n>vUk4MG9J9XoL5sN`7#m+Jd5rIW8W>DpSMoIECGS0u8Y-qF2PUJcoZQOZY=>N`C#9ElFZ% z2KQ08*#7BFuQ2r|kIi*tTj-AIvy`!dji|>v73ihvuU_LSPQv`KWb~8JZLNmG-B2?+ zp{RLa>9qbhsDy%Icw$77jVCo`@7^U){1FtjS}xAnmZptLMi&vreyTE=OMO}>$xfCc zYf3cGifsLa=IMVByKs*mc@&V`U@K}I+q0}!ecL#sLS<3@RU_5k`<;ub z^(~&kuIinb2biHRKKwiVBG=>;q^NQuP#X>|E>B=jAvU8{Gw^(Mcv!;QyQ|Uv;@n|( zdAm5*#|OdSAO8-ssnDEl?vdXbFb%EDN<*|fxK2v)YMrqL?mL*w2Zs8vn@&&yc3Qf? z<7Yp^NTloE4^L}FvukPf9i2W8-bX?&llzFs$eG2N&K)iD25LgO`*9{eg1>hsVA1`m z-rM#z3DIJ>ZDE3T-i~&y;nK-n<)44YMM>0Z7-q|8MCT?taVqKHCIdnR{9as~C9*x> zWFw^45=EJiXY*!<604Ii(2gOReyK^}b1~$b)xGjnBTZ(_s?Fv1<0AKrb6T$aE2#q7 zO3`1)R{i~3faR0e>55*fRA70XeBub`|Cu1cwshFfX4i9a6(=+`=$DQwm}ehDi{b8A zM8$?7&5D+(g2m3`MGQlI7y+nTg60Egy(!WK6=qGChzN#64keX$X}JT*Is$YPd=`s; zWXw*ihV-qhDjFNt%awQfzn^go#3W&Cv9} z5+r<{Kd}k0{ibj$NX+LLs~XNS$)IH0pn5eMKgF+s9x@^hRnLvFoUIL6Z>Il0SpY2; zck|yKcCV*QHx2aAB} za!^L%kz!&^Eg>=zVt|_)H~|LEZhF_hgUW{h1!meW`$!VTaZM>-gCAGZn)A;r)A?20=EEaXiJo< zhh7eV5gOMJt(f%wCb#kO#o5S`{YI*`=m!ueW+3py2-tV0VgjN>%X+=1gXQWHt;ONs zM+(^xc#6IJ=<4ct0iBG=dG{k^Nk44ISv!$O-Napd`iGR)ae&k_7u^Df6kKiSoA*5g zv9*GIZNiR`5%q7QD;*XQ#G=;$@ZJxg6>z)^SWDf8j*f0RnbGsffgLZ<{C6=QyQKnJ z@$+$vuEM83bbMYJ&ZF|EYWm+^z~v0tbl*8R8rs_tvox{^|3v>GK@3zioFr8TO4#Iq z|JS}7B;B4r$Of$jB13l`q6J=#>!t+UKi*t9(- zA3g$#3CQ>sZRf*rf@s2DGk2-q6GfuDAw;7DKaPgY%>D_if%0ACJ!Px~2^3;2#_ABS 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

    >apO-`0$8RqqG(%D4U!3DSYY36$6NP-k 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 Ziki*9dJ5rEed07gh-I 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 b@kPDnkb&VZrv^`e{~k*#J Date: Fri, 21 Jun 2019 11:17:15 -0400 Subject: [PATCH 176/380] Moved examples into pymd files. Updated Python README. --- pyrasterframes/README.md | 66 ++++++---- pyrasterframes/build.sbt | 16 +-- .../src/main/python/docs/__init__.py | 9 +- .../src/main/python/docs/aggregation.md | 2 - .../src/main/python/docs/aggregation.pymd | 22 ++++ .../src/main/python/docs/local-algebra.pymd | 28 +++++ .../src/main/python/docs/spark-ml.pymd | 113 ++++++++++++++++++ .../src/main/python/examples/Clustering.py | 74 ------------ .../python/examples/CreatingRasterFrames.py | 18 --- .../src/main/python/examples/MeanValue.py | 13 -- .../src/main/python/examples/NDVI.py | 17 --- .../src/main/python/examples/__init__.py | 10 -- pyrasterframes/src/main/python/setup.py | 68 +---------- .../src/main/python/tests/__init__.py | 8 +- 14 files changed, 225 insertions(+), 239 deletions(-) delete mode 100644 pyrasterframes/src/main/python/docs/aggregation.md create mode 100644 pyrasterframes/src/main/python/docs/aggregation.pymd delete mode 100644 pyrasterframes/src/main/python/examples/Clustering.py delete mode 100644 pyrasterframes/src/main/python/examples/CreatingRasterFrames.py delete mode 100644 pyrasterframes/src/main/python/examples/MeanValue.py delete mode 100644 pyrasterframes/src/main/python/examples/NDVI.py delete mode 100644 pyrasterframes/src/main/python/examples/__init__.py diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index 00f5b7069..062b6b6db 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -12,19 +12,30 @@ The pip installation focuses on local mode operation of spark. To deploy spark a #### Python shell -To initialize PyRasterFrames in a generic Python shell follow the pattern below, substituting configs as needed. + +To initialize RasterFrames in a generic Python shell, use the provided convenience function as follows: + +```python +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +spark = create_rf_spark_session() +``` + +If you require further customization you can follow the general pattern below: ```python from pyspark.sql import SparkSession -from pyrasterframes import * +from pyrasterframes.utils import find_pyrasterframes_assembly from pyrasterframes.rasterfunctions import * -spark = SparkSession.builder \ - .master("local[*]") \ - .appName("Using RasterFrames") \ - .config("spark.some.config.option", "some-value") \ - .withKryoSerialization() \ - .getOrCreate() \ - .withRasterFrames() +rf_jar = find_pyrasterframes_assembly() +spark = (SparkSession.builder + .master("local[*]") + .appName("RasterFrames") + .config('spark.jars', rf_jar) + .config("some.spark.setting", "some.setting.value") + .withKryoSerialization() + .getOrCreate()) +spark.withRasterFrames() ``` #### Pyspark shell or app @@ -34,7 +45,7 @@ To quickly get the command to run a `pyspark` shell with PyRasterFrames enabled, ```bash sbt pySparkCmd -# > PYTHONSTARTUP=/var/foo/pyrf_init.py pyspark --jars /somewhere/rasterframes/pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar --py-files /somewhere/rasterframes/pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip +# > PYTHONSTARTUP=/var/somewhere/pyrf_init.py pyspark --jars /pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar --py-files /pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip ``` The runtime dependencies will be created and the command to run printed to the console. @@ -54,12 +65,11 @@ To manually initialize PyRasterFrames in a `pyspark` shell, prepare to call pysp Then in the pyspark shell or app, import the module and call `withRasterFrames` on the SparkSession. ```python -import pyrasterframes -spark = spark.withRasterFrames() +from pyrasterframes.utils import create_rf_spark_session +spark = create_rf_spark_session() df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') ``` - ## Development RasterFrames is primarily implemented in Scala, and as such uses the Scala build tool [`sbt`](https://www.scala-sbt.org/). @@ -71,7 +81,7 @@ and subsequent commands are invoked via an interactive shell. But for context cl example below with `sbt`. -## Running Tests and Examples +## Running Tests The PyRasterFrames unit tests can found in `/pyrasterframes/python/tests`. To run them: @@ -79,22 +89,32 @@ The PyRasterFrames unit tests can found in `/pyrasterframes/python/tes sbt pyrasterframes/test # alias 'pyTest' ``` -*See also the below discussion of running `setup.py` for more options to run unit tests.* +*See also the below discussion of running `setup.py` for more options to run unit tests.* + +## Running Python Markdown Sources -Similarly, to run the examples in `pyrasterframes/python/examples`: +The markdown documentation in `/pyrasterframes/src/main/python/docs` contains code blocks that are evaluated by the build to show results alongside examples. The processed markdown source can be found in `/pyrasterframes/target/python/docs`. ```bash -sbt pyrasterframes/run # alias 'pyExamples' +sbt pyrasterframes/doc # alias 'pyDoc' ``` +To build the full complement of documentation and generate the HTML website, run: + +```bash +sbt makeSite +``` + +Results will be found in `/docs/target/site`. + ## Creating and Using a Build Assuming that `$SCALA_VER` is the major verison of Scala in use (e.g. 2.11) , and `$VER` is the version of RasterFrames, the primary build artifacts are: -* JVM library: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` -* Python .whl package with assembly: `pyrasterframes/target/python/dist/pyrasterframes-$VER-py2.py3-none-any.whl` -* Python package as Maven .zip artifact: `pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` +* JVM library: `/pyrasterframes/target/scala-$SCALA_VER/pyrasterframes_$SCALA_VER-$VER.jar` +* Python .whl package with assembly: `/pyrasterframes/target/python/dist/pyrasterframes-$VER-py2.py3-none-any.whl` +* Python package as Maven .zip artifact: `/pyrasterframes/target/scala-$SCALA_VER/pyrasterframes-python-$VER.zip` You build them with: @@ -121,10 +141,10 @@ illustrate its usage, suppose we want to run a subset of the Python unit test. I sbt 'pySetup test --addopts "-k test_tile_creation"' ``` -Or to run a specific example: +Or to build a specific document: ```bash -sbt 'pySetup examples -e NDVI' +sbt 'pySetup pweave -f docs/raster-io.pymd' ``` -*Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* +*Note: You may need to run `sbt pyrasterframes/package` at least once for certain `pySetup` commands to work.* diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 9a305de7c..e8f3f00e7 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -1,26 +1,18 @@ addCommandAlias("pyDocs", "pyrasterframes/doc") addCommandAlias("pyTest", "pyrasterframes/test") addCommandAlias("pyBuild", "pyrasterframes/package") -addCommandAlias("pyExamples", "pyrasterframes/run") Test / pythonSource := (Compile / sourceDirectory).value / "tests" -Compile / run := pySetup.toTask(" examples").dependsOn(assembly).value - -//RFProjectPlugin.IntegrationTest / test := (Compile / run).inputTaskValue - exportJars := true Python / doc / sourceDirectory := (Python / target).value / "docs" -Python / doc / target := (Compile / target).value / "py-markdown" +Python / doc / target := (Python / target).value / "docs" + //(Compile / target).value / "py-markdown" Python / doc := (Python / doc / target).toTask.dependsOn( Def.sequential( assembly, - pySetup.toTask(" pweave"), - copySources( - Python / doc / sourceDirectory, - Python / doc / target, - deleteFirst = true - ) + Test / compile, + pySetup.toTask(" pweave") ) ).value diff --git a/pyrasterframes/src/main/python/docs/__init__.py b/pyrasterframes/src/main/python/docs/__init__.py index 4a1d1d5bc..3172f8410 100644 --- a/pyrasterframes/src/main/python/docs/__init__.py +++ b/pyrasterframes/src/main/python/docs/__init__.py @@ -1,3 +1,10 @@ +import os -__all__ = [] +__all__ = ["resource_dir"] + +# This is temporary until we port to run on web assets. +def resource_dir(): + here = os.path.dirname(os.path.realpath(__file__)) + scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) + return os.path.realpath(os.path.join(scala_target, 'test-classes')) diff --git a/pyrasterframes/src/main/python/docs/aggregation.md b/pyrasterframes/src/main/python/docs/aggregation.md deleted file mode 100644 index 140aec39d..000000000 --- a/pyrasterframes/src/main/python/docs/aggregation.md +++ /dev/null @@ -1,2 +0,0 @@ -# Aggregation - diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd new file mode 100644 index 000000000..21dd89998 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -0,0 +1,22 @@ +# Aggregation + +```python, echo=False +from docs import * +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +from pyspark.sql import * +import os + +spark = create_rf_spark_session() +``` + +## Cell Counts & Tile Mean + +```python +rf = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B8-Robinson-IL.tiff')) +rf.show(5, False) + +stats = rf.agg(rf_agg_no_data_cells('tile'), rf_agg_data_cells('tile'), rf_agg_mean('tile')) +stats.show(5, False) +``` + diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index d8d257d14..124ab9342 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -1 +1,29 @@ # Local Algebra + +```python, echo=False +from docs import * +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +from pyspark.sql import * +import os + +spark = create_rf_spark_session() +``` + +## Computing NDVI + +```python, term=True +redBand = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') +nirBand = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') + +rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ + .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) +rf.printSchema() +rf.show(20, truncate=False) + +``` + + +```python, echo=False +spark.stop() +``` \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/spark-ml.pymd b/pyrasterframes/src/main/python/docs/spark-ml.pymd index f68de2f29..3dda84182 100644 --- a/pyrasterframes/src/main/python/docs/spark-ml.pymd +++ b/pyrasterframes/src/main/python/docs/spark-ml.pymd @@ -1,2 +1,115 @@ # Spark ML Support +## Clustering + +```python, echo=False +from docs import * +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes import * +from pyrasterframes.rasterfunctions import * +from pyspark.sql import * +from pyspark.ml.feature import VectorAssembler +from pyspark.ml.clustering import KMeans +from pyspark.ml import Pipeline +import os + +spark = create_rf_spark_session() +``` + +The first step is to load multiple bands of imagery and construct +a single RasterFrame from them. + +```python +filenamePattern = "L8-B{}-Elkton-VA.tiff" +bandNumbers = range(1, 8) +bandColNames = list(map(lambda n: 'band_{}'.format(n), bandNumbers)) +``` + +For each identified band, load the associated image file: + +```python, term=True +from functools import reduce +joinedRF = reduce(lambda rf1, rf2: rf1.asRF().spatialJoin(rf2.drop('bounds').drop('metadata').drop('extent').drop('crs')), + map(lambda bf: spark.read.geotiff(bf[1]) + .withColumnRenamed('tile', 'band_{}'.format(bf[0])), + map(lambda b: (b, os.path.join(resource_dir(), filenamePattern.format(b))), bandNumbers))) +``` + +We should see a single spatial_key column along with columns of tiles. + +```python +joinedRF.printSchema() +``` + +SparkML requires that each observation be in its own row, and those +observations be packed into a single `Vector`. The first step is to +"explode" the tiles into a single row per cell/pixel + +```python +exploder = TileExploder() +``` + +To "vectorize" the the band columns we use the SparkML `VectorAssembler` + +```python +assembler = VectorAssembler() \ + .setInputCols(bandColNames) \ + .setOutputCol("features") +``` + +Configure our clustering algorithm + +```python +k = 5 +kmeans = KMeans().setK(k) +``` + +Combine the two stages + +```python +pipeline = Pipeline().setStages([exploder, assembler, kmeans]) +``` + +Compute clusters + +```python +model = pipeline.fit(joinedRF) +``` + +Run the data through the model to assign cluster IDs to each + +```python +clustered = model.transform(joinedRF) +clustered.show(8) +``` + +If we want to inspect the model statistics, the SparkML API requires us to go +through this unfortunate contortion: + +```python +clusterResults = list(filter(lambda x: str(x).startswith('KMeans'), model.stages))[0] +``` + +Compute sum of squared distances of points to their nearest center + +```python +metric = clusterResults.computeCost(clustered) +print("Within set sum of squared errors: %s" % metric) + +tlm = joinedRF.tileLayerMetadata() +layout = tlm['layoutDefinition']['tileLayout'] + +retiled = clustered.groupBy('spatial_key').agg( + rf_assemble_tile('column_index', 'row_index', 'prediction', + layout['tileCols'], layout['tileRows'], 'int8') +) + +rf = retiled.asRF('spatial_key', tlm) +rf.printSchema() +rf.show() +``` + + +```python, echo=False +spark.stop() +``` \ No newline at end of file diff --git a/pyrasterframes/src/main/python/examples/Clustering.py b/pyrasterframes/src/main/python/examples/Clustering.py deleted file mode 100644 index 3825ede28..000000000 --- a/pyrasterframes/src/main/python/examples/Clustering.py +++ /dev/null @@ -1,74 +0,0 @@ -from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -from pyspark.sql import * -from pyspark.ml.feature import VectorAssembler -from pyspark.ml.clustering import KMeans -from pyspark.ml import Pipeline -import os - -spark = create_rf_spark_session() - -# The first step is to load multiple bands of imagery and construct -# a single RasterFrame from them. -filenamePattern = "L8-B{}-Elkton-VA.tiff" -bandNumbers = range(1, 8) -bandColNames = list(map(lambda n: 'band_{}'.format(n), bandNumbers)) - -# For each identified band, load the associated image file -from functools import reduce -joinedRF = reduce(lambda rf1, rf2: rf1.asRF().spatialJoin(rf2.drop('bounds').drop('metadata').drop('extent').drop('crs')), - map(lambda bf: spark.read.geotiff(bf[1]) - .withColumnRenamed('tile', 'band_{}'.format(bf[0])), - map(lambda b: (b, os.path.join(test_resource_dir(), filenamePattern.format(b))), bandNumbers))) - -# We should see a single spatial_key column along with columns of tiles. -joinedRF.printSchema() - -# SparkML requires that each observation be in its own row, and those -# observations be packed into a single `Vector`. The first step is to -# "explode" the tiles into a single row per cell/pixel -exploder = TileExploder() - -# To "vectorize" the the band columns we use the SparkML `VectorAssembler` -assembler = VectorAssembler() \ - .setInputCols(bandColNames) \ - .setOutputCol("features") - -# Configure our clustering algorithm -k = 5 -kmeans = KMeans().setK(k) - -# Combine the two stages -pipeline = Pipeline().setStages([exploder, assembler, kmeans]) - -# Compute clusters -model = pipeline.fit(joinedRF) - -# Run the data through the model to assign cluster IDs to each -clustered = model.transform(joinedRF) -clustered.show(8) - - -# If we want to inspect the model statistics, the SparkML API requires us to go -# through this unfortunate contortion: -clusterResults = list(filter(lambda x: str(x).startswith('KMeans'), model.stages))[0] - -# Compute sum of squared distances of points to their nearest center -metric = clusterResults.computeCost(clustered) -print("Within set sum of squared errors: %s" % metric) - -tlm = joinedRF.tileLayerMetadata() -layout = tlm['layoutDefinition']['tileLayout'] - -retiled = clustered.groupBy('spatial_key').agg( - rf_assemble_tile('column_index', 'row_index', 'prediction', - layout['tileCols'], layout['tileRows'], 'int8') -) - -rf = retiled.asRF('spatial_key', tlm) -rf.printSchema() -rf.show() - -spark.stop() \ No newline at end of file diff --git a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py deleted file mode 100644 index 99ae32b05..000000000 --- a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py +++ /dev/null @@ -1,18 +0,0 @@ -from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyspark.sql import * -import os - -spark = create_rf_spark_session().withRasterFrames() - -rf = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B8-Robinson-IL.tiff')) -rf.show(5, False) - -rf.tileColumns() - -rf.spatialKeyColumn() - -rf.temporalKeyColumn() - -rf.tileLayerMetadata() diff --git a/pyrasterframes/src/main/python/examples/MeanValue.py b/pyrasterframes/src/main/python/examples/MeanValue.py deleted file mode 100644 index 06960b7fc..000000000 --- a/pyrasterframes/src/main/python/examples/MeanValue.py +++ /dev/null @@ -1,13 +0,0 @@ -from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -from pyspark.sql import * -import os - -spark = create_rf_spark_session().withRasterFrames() - -rf = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B8-Robinson-IL.tiff')) -rf.show(5, False) - -rf.agg(rf_agg_no_data_cells('tile'), rf_agg_data_cells('tile'), rf_agg_mean('tile')).show(5, False) diff --git a/pyrasterframes/src/main/python/examples/NDVI.py b/pyrasterframes/src/main/python/examples/NDVI.py deleted file mode 100644 index 94e7fe031..000000000 --- a/pyrasterframes/src/main/python/examples/NDVI.py +++ /dev/null @@ -1,17 +0,0 @@ -from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -import os - -spark = create_rf_spark_session().withRasterFrames() - -redBand = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') -nirBand = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') - -rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ - .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) -rf.printSchema() -rf.show(20) - -spark.stop() \ No newline at end of file diff --git a/pyrasterframes/src/main/python/examples/__init__.py b/pyrasterframes/src/main/python/examples/__init__.py deleted file mode 100644 index 795a3bd62..000000000 --- a/pyrasterframes/src/main/python/examples/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# examples_setup -import os - -__all__ = ["test_resource_dir"] - - -def test_resource_dir(): - here = os.path.dirname(os.path.realpath(__file__)) - scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) - return os.path.realpath(os.path.join(scala_target, 'test-classes')) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 818f1bdbc..a86cbc62d 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -19,13 +19,12 @@ # # Always prefer setuptools over distutils -from setuptools import setup, find_packages -from os import path, environ +from setuptools import setup +from os import path import sys from glob import glob from io import open import distutils.cmd -import importlib try: exec(open('pyrasterframes/version.py').read()) # executable python script contains __version__; credit pyspark @@ -43,71 +42,11 @@ readme = f.read() -def _extract_module(mod): - module = importlib.import_module(mod) - - if hasattr(module, '__all__'): - globals().update({n: getattr(module, n) for n in module.__all__}) - else: - globals().update({k: v for (k, v) in module.__dict__.items() if not k.startswith('_')}) - - def _divided(msg): divider = ('-' * 50) return divider + '\n' + msg + '\n' + divider -class RunExamples(distutils.cmd.Command): - """A custom command to run pyrasterframes examples.""" - - description = 'Run PyRasterFrames examples' - user_options = [ - # The format is (long option, short option, description). - ('examples=', 'e', 'examples to run'), - ] - - @staticmethod - def _check_ex_path(ex): - file = ex - suffix = path.splitext(ex)[1] - if suffix == '': - file += '.py' - file = path.join(here, 'examples', file) - - assert path.isfile(file), ('Invalid example %s' % file) - return file - - def initialize_options(self): - """Set default values for options.""" - # Each user option must be listed here with their default value. - self.examples = filter(lambda x: not path.basename(x)[:1] == '_', - glob(path.join(here, 'examples', '*.py'))) - - def finalize_options(self): - """Post-process options.""" - import re - if isinstance(self.examples, str): - self.examples = filter( - lambda s: len(s) > 0, - re.split('\W+', self.examples) - ) - self.examples = map( - lambda x: 'examples.' + path.splitext(path.basename(x))[0], - map(self._check_ex_path, self.examples) - ) - - def run(self): - """Run the examples.""" - import traceback - for ex in self.examples: - print(_divided('Running %s' % ex)) - try: - _extract_module(ex) - except Exception: - print(_divided('%s Failed:' % ex)) - print(traceback.format_exc()) - - class PweaveDocs(distutils.cmd.Command): """A custom command to run documentation scripts through pweave.""" description = 'Pweave PyRasterFrames documentation scripts' @@ -128,7 +67,7 @@ def finalize_options(self): """Post-process options.""" import re if isinstance(self.files, str): - self.files = filter(lambda s: len(s) > 0, re.split('\W+', self.files)) + self.files = filter(lambda s: len(s) > 0, re.split(',', self.files)) def run(self): """Run pweave.""" @@ -212,7 +151,6 @@ def run(self): zip_safe=False, test_suite="pytest-runner", cmdclass={ - 'examples': RunExamples, 'pweave': PweaveDocs } ) diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 267701f34..1858116ea 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -34,13 +34,13 @@ import __builtin__ as builtins -def test_resource_dir(): +def resource_dir(): here = os.path.dirname(os.path.realpath(__file__)) scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) return os.path.realpath(os.path.join(scala_target, 'test-classes')) -def testing_spark_session(): +def spark_test_session(): spark = create_rf_spark_session() spark.sparkContext.setLogLevel('ERROR') @@ -62,9 +62,9 @@ def rounded_compare(self, val1, val2): @classmethod def setUpClass(cls): # hard-coded relative path for resources - cls.resource_dir = test_resource_dir() + cls.resource_dir = resource_dir() - cls.spark = testing_spark_session() + cls.spark = spark_test_session() cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') From ed4cebf62cc343dd0e3966a3880e26723c04d7da Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 21 Jun 2019 12:56:35 -0400 Subject: [PATCH 177/380] Changed default name of raster column in RasterSourceRelation schema to `proj_raster`. Added `rf_tile`. --- core/src/main/resources/reference.conf | 2 +- .../rasterframes/RasterFunctions.scala | 3 +++ .../rasterframes/StandardColumns.scala | 4 ++++ .../rasterframes/expressions/package.scala | 1 + .../encoders/CatalystSerializerSpec.scala | 6 ++--- .../rasterframes/ref/RasterRefSpec.scala | 2 +- .../rastersource/RasterSourceRelation.scala | 2 +- docs/README.md | 4 ++++ .../src/main/python/docs/getting-started.pymd | 4 ---- .../python/pyrasterframes/rasterfunctions.py | 1 + .../main/python/tests/PyRasterFramesTests.py | 23 +++++++++++-------- 11 files changed, 32 insertions(+), 20 deletions(-) create mode 100644 docs/README.md diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index 270f122fa..0052f5f5a 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -11,7 +11,7 @@ vlm.gdal { //CPL_DEBUG = "OFF" AWS_REQUEST_PAYER = "requester" GDAL_DISABLE_READDIR_ON_OPEN = "YES" - CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.jp2,.mrf,.idx,.lrc,.mrf.aux.xml" + CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.tiff,.jp2,.mrf,.idx,.lrc,.mrf.aux.xml" } // set this to `false` if CPL_DEBUG is `ON` useExceptions = true diff --git a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala index 5ca8e0748..0ea7f785e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/RasterFunctions.scala @@ -60,6 +60,9 @@ trait RasterFunctions { /** Extracts the CRS from a RasterSource or ProjectedRasterTile */ def rf_crs(col: Column): TypedColumn[Any, CRS] = GetCRS(col) + /** Extracts the tile from a ProjectedRasterTile, or passes through a Tile. */ + def rf_tile(col: Column): TypedColumn[Any, Tile] = RealizeTile(col) + /** Flattens Tile into a double array. */ def rf_tile_to_array_double(col: Column): TypedColumn[Any, Array[Double]] = TileToArrayDouble(col) diff --git a/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala b/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala index a53415f2a..128729209 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala @@ -30,6 +30,7 @@ import geotrellis.vector.{Extent, ProjectedExtent} import org.apache.spark.sql.functions.col import org.locationtech.jts.geom.{Point => jtsPoint, Polygon => jtsPolygon} import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Constants identifying column in most RasterFrames. @@ -70,6 +71,9 @@ trait StandardColumns { // This is a `def` because `TileUDT` needs to be initialized first. def TILE_COLUMN = col("tile").as[Tile] + /** Default column name for a tile with its CRS and Extent. */ + def PROJECTED_RASTER_COLUMN = col("proj_raster").as[ProjectedRasterTile] + /** Default RasterFrame `TileFeature.data` column name. */ val TILE_FEATURE_DATA_COLUMN = col("tile_data") diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 432c66888..776412e1c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -74,6 +74,7 @@ package object expressions { registry.registerExpression[GeometryToExtent]("st_extent") registry.registerExpression[GetExtent]("rf_extent") registry.registerExpression[GetCRS]("rf_crs") + registry.registerExpression[RealizeTile]("rf_tile") registry.registerExpression[Subtract]("rf_local_subtract") registry.registerExpression[Multiply]("rf_local_multiply") registry.registerExpression[Divide]("rf_local_divide") diff --git a/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala index 2b02a5523..4e8bfdfcc 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/encoders/CatalystSerializerSpec.scala @@ -118,17 +118,17 @@ class CatalystSerializerSpec extends TestEnvironment with TestData { assertContract(ext) } - it("should eserialize ProjectedExtent") { + it("should serialize ProjectedExtent") { val pe = ProjectedExtent(ext, ConusAlbers) assertContract(pe) } - it("should eserialize SpatialKey") { + it("should serialize SpatialKey") { val v = SpatialKey(2, 3) assertContract(v) } - it("should eserialize SpaceTimeKey") { + it("should serialize SpaceTimeKey") { val v = SpaceTimeKey(2, 3, ZonedDateTime.now()) assertContract(v) } diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala index 606b949f0..8bdb9cad0 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala @@ -110,7 +110,7 @@ class RasterRefSpec extends TestEnvironment with TestData { } } - describe("rf_extent") { + describe("GetExtent") { it("should read from RasterRef") { import spark.implicits._ new Fixture { diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index c33722520..14fcd01d1 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -48,7 +48,7 @@ case class RasterSourceRelation(sqlContext: SQLContext, discretePaths: Seq[Strin lazy val inputColNames = pathTable .map(_.columnNames) - .getOrElse(Seq(TILE_COLUMN.columnName)) + .getOrElse(Seq(PROJECTED_RASTER_COLUMN.columnName)) def pathColNames = inputColNames .map(_ + "_path") diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..4ea8233a2 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,4 @@ +# RasterFrames Documentation Build + +* Global documentation assets and Scala specific content: `/docs/src/main/paradox` +* Technical content and Python examples: `/pyrasterframes/src/main/python/docs` \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index 623eb2fcc..b6620a0d4 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -36,10 +36,6 @@ See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/ ## Standalone Python Script -```python, echo=False -from docs import * -``` - RasterFrames requires some special configuration to Spark to be fully functional. As a convenience you can use a provided utility function to get a preconfigured Spark session: The first step is to set up a `SparkSession`: diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 9d8ceff7a..7bcf0d782 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -278,6 +278,7 @@ def _(data_tile, mask_tile, mask_value): 'rf_crs': 'Get the CRS of a RasterSource or ProjectedRasterTile', 'st_extent': 'Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)', 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', + 'rf_tile': 'Extracts the Tile component of a ProjectedRasterTile (or Tile).', 'st_geometry': 'Convert the given extent/bbox to a polygon', 'rf_geometry': 'Get the extent of a RasterSource or ProjectdRasterTile as a Geometry', diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index f26eff74d..22472da28 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -416,7 +416,7 @@ def test_tile_udt_serialization(self): def test_udf_on_tile_type_input(self): import numpy.testing # rf_local_add(t, 0) is to force lazy eval; accessing tile.tile is to get at the actual Tile type vs PRT struct - df = self.spark.read.rastersource(self.img_uri).withColumn('tile2', rf_local_add_int(col('tile.tile'), 0)) + df = self.spark.read.rastersource(self.img_uri) rf = self.rf # create trivial UDF that does something we already do with raster_Functions @@ -435,8 +435,8 @@ def my_udf(t): ) df_result = df.select( - (rf_dimensions(df.tile).cols.cast('int') * rf_dimensions(df.tile).rows.cast('int') - - my_udf(df.tile2)).alias('result') + (rf_dimensions(df.proj_raster).cols.cast('int') * rf_dimensions(df.proj_raster).rows.cast('int') - + my_udf(rf_tile(df.proj_raster))).alias('result') ).toPandas() numpy.testing.assert_array_equal( @@ -681,16 +681,19 @@ class RasterSource(TestEnvironment): def test_handle_lazy_eval(self): df = self.spark.read.rastersource(self.img_uri) - ltdf = df.select('tile') + ltdf = df.select('proj_raster') self.assertGreater(ltdf.count(), 0) self.assertIsNotNone(ltdf.first()) + tdf = df.select(rf_tile('proj_raster')) + self.assertGreater(tdf.count(), 0) + self.assertIsNotNone(tdf.first()) def test_prt_functions(self): df = self.spark.read.rastersource(self.img_uri) \ - .withColumn('crs', rf_crs('tile')) \ - .withColumn('ext', rf_extent('tile')) \ - .withColumn('geom', rf_geometry('tile')) + .withColumn('crs', rf_crs('proj_raster')) \ + .withColumn('ext', rf_extent('proj_raster')) \ + .withColumn('geom', rf_geometry('proj_raster')) df.select('crs', 'ext', 'geom').first() def test_raster_source_reader(self): @@ -712,16 +715,16 @@ def l8path(b): # schema is tile_path and tile # df.printSchema() - self.assertTrue(len(df.columns) == 2 and 'tile_path' in df.columns and 'tile' in df.columns) + self.assertTrue(len(df.columns) == 2 and 'proj_raster_path' in df.columns and 'proj_raster' in df.columns) # the most common tile dimensions should be as passed to `options`, showing that options are correctly applied - tile_size_df = df.select(rf_dimensions(df.tile).rows.alias('r'), rf_dimensions(df.tile).cols.alias('c')) \ + tile_size_df = df.select(rf_dimensions(df.proj_raster).rows.alias('r'), rf_dimensions(df.proj_raster).cols.alias('c')) \ .groupby(['r', 'c']).count().toPandas() most_common_size = tile_size_df.loc[tile_size_df['count'].idxmax()] self.assertTrue(most_common_size.r == tile_size and most_common_size.c == tile_size) # all rows are from a single source URI - path_count = df.groupby(df.tile_path).count() + path_count = df.groupby(df.proj_raster_path).count() print(path_count.toPandas()) self.assertTrue(path_count.count() == 3) From 2985d1c2237c2ae65ba000d03ebc3f9c42831283 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 21 Jun 2019 14:40:41 -0400 Subject: [PATCH 178/380] Refactored path specification code in RasterSourceRelation. --- build.sbt | 2 +- .../rastersource/RasterSourceDataSource.scala | 64 +++++++++++++------ .../rastersource/RasterSourceRelation.scala | 29 +++++---- .../RasterSourceDataSourceSpec.scala | 39 ++++++----- project/RFProjectPlugin.scala | 4 -- 5 files changed, 83 insertions(+), 55 deletions(-) diff --git a/build.sbt b/build.sbt index bad42231b..6ffcffa4e 100644 --- a/build.sbt +++ b/build.sbt @@ -24,7 +24,7 @@ addCommandAlias("previewSite", "docs/previewSite") addCommandAlias("console", "datasource/console") // Prefer our own IntegrationTest config definition, which inherits from Test. -val IntegrationTest = RFProjectPlugin.IntegrationTest +lazy val IntegrationTest = config("it") extend Test lazy val root = project .in(file(".")) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index a09072f63..651d488db 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -21,6 +21,8 @@ package org.locationtech.rasterframes.datasource.rastersource +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.util._ import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} import org.locationtech.rasterframes.model.TileDimensions @@ -31,11 +33,8 @@ class RasterSourceDataSource extends DataSourceRegister with RelationProvider { override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { val bands = parameters.bandIndexes val tiling = parameters.tileDims - val pathTable = parameters.pathTable - val files = parameters.filePaths - require(!(pathTable.nonEmpty && files.nonEmpty), - "Only one of a set of file paths OR a paths table column may be provided.") - RasterSourceRelation(sqlContext, files, pathTable, bands, tiling) + val spec = parameters.pathSpec + RasterSourceRelation(sqlContext, spec, bands, tiling) } } object RasterSourceDataSource { @@ -47,36 +46,61 @@ object RasterSourceDataSource { final val PATH_TABLE_PARAM = "pathTable" final val PATH_TABLE_COL_PARAM = "pathTableColumns" + final val DEFAULT_COLUMN_NAME = PROJECTED_RASTER_COLUMN.columnName + + trait WithBandColumns { + def bandColumnNames: Seq[String] + } + /** Container for specifying raster paths. */ + case class BandSet(bandPaths: String*) + case class RasterSourcePathTable(sceneRows: Seq[BandSet], bandColumnNames: String*) extends WithBandColumns { + require(sceneRows.forall(_.bandPaths.length == bandColumnNames.length), + "Each scene row must have the same number of entries as band column names") + } /** Container for specifying where to select raster paths from. */ - case class RasterSourceTable(tableName: String, columnNames: String*) + case class RasterSourcePathTableRef(tableName: String, bandColumnNames: String*) extends WithBandColumns private[rastersource] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { - def filePaths: Seq[String] = ( - parameters - .get(PATHS_PARAM) - .toSeq - .flatMap(_.split(Array('\n','\r'))) ++ - parameters - .get(RasterSourceDataSource.PATH_PARAM) - .toSeq - ) - .filter(_.nonEmpty) def tileDims: Option[TileDimensions] = parameters.get(TILE_DIMS_PARAM) - .map(_.split(',').map(_.trim.toInt)) - .map { case Array(cols, rows) => TileDimensions(cols, rows)} + .map(_.split(',').map(_.trim.toInt)) + .map { case Array(cols, rows) => TileDimensions(cols, rows)} def bandIndexes: Seq[Int] = parameters .get(BAND_INDEXES_PARAM) .map(_.split(',').map(_.trim.toInt).toSeq) .getOrElse(Seq(0)) - def pathTable: Option[RasterSourceTable] = parameters + def filePaths: Option[RasterSourcePathTable] = { + val paths = ( + parameters + .get(PATHS_PARAM) + .toSeq + .flatMap(_.split(Array('\n','\r'))) ++ + parameters + .get(RasterSourceDataSource.PATH_PARAM) + .toSeq + ).filter(_.nonEmpty) + + if (paths.isEmpty) None + else + Some(RasterSourcePathTable(paths.map(BandSet(_)), DEFAULT_COLUMN_NAME)) + } + + def pathTable: Option[RasterSourcePathTableRef] = parameters .get(PATH_TABLE_PARAM) .zip(parameters.get(PATH_TABLE_COL_PARAM)) - .map(p => RasterSourceTable(p._1, p._2.split(','): _*)) + .map(p => RasterSourcePathTableRef(p._1, p._2.split(','): _*)) .headOption + + def pathSpec: Either[RasterSourcePathTable, RasterSourcePathTableRef] = { + (filePaths, pathTable) match { + case (Some(f), None) => Left(f) + case (None, Some(p)) => Right(p) + case _ => throw new IllegalArgumentException("Only one of a set of file paths OR a paths table column may be provided.") + } + } } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index 14fcd01d1..f3f337310 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -21,34 +21,32 @@ package org.locationtech.rasterframes.datasource.rastersource -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} -import org.locationtech.rasterframes.util._ import org.apache.spark.rdd.RDD +import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} -import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.RasterSourceTable +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourcePathTable, RasterSourcePathTableRef} +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames +import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Constructs a Spark Relation over one or more RasterSource paths. * @param sqlContext Query context - * @param discretePaths list of URIs to fetch rastefrom. + * @param pathTable Specifiction of raster path sources * @param bandIndexes band indexes to fetch * @param subtileDims how big to tile/subdivide rasters info */ -case class RasterSourceRelation(sqlContext: SQLContext, discretePaths: Seq[String], - pathTable: Option[RasterSourceTable], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) +case class RasterSourceRelation( + sqlContext: SQLContext, + pathTable: Either[RasterSourcePathTable, RasterSourcePathTableRef], + bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { - lazy val inputColNames = pathTable - .map(_.columnNames) - .getOrElse(Seq(PROJECTED_RASTER_COLUMN.columnName)) + lazy val inputColNames = pathTable.merge.bandColumnNames def pathColNames = inputColNames .map(_ + "_path") @@ -82,8 +80,11 @@ case class RasterSourceRelation(sqlContext: SQLContext, discretePaths: Seq[Strin // input -> path -> src -> ref -> tile // Each step is broken down for readability val inputs: DataFrame = pathTable match { - case Some(spec) => sqlContext.table(spec.tableName) - case _ => discretePaths.toDF(inputColNames.head) + case Right(spec) => sqlContext.table(spec.tableName) + case Left(spec) => spec.bandColumnNames match { + case Seq(single) => spec.sceneRows.map(_.bandPaths.headOption.orNull).toDF(single) + case bands => spec.sceneRows.map(_.bandPaths).toDF(bands: _*) + } } // Basically renames the input columns to have the '_path' suffix diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 25180b1ea..59ccf331b 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -29,25 +29,30 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { import spark.implicits._ describe("DataSource parameter processing") { + def singleCol(paths: Iterable[String]) = { + val rows: Seq[BandSet] = paths.map(BandSet(_)).toSeq + RasterSourcePathTable(rows, DEFAULT_COLUMN_NAME) + } + it("should handle single `path`") { val p = Map(PATH_PARAM -> "/usr/local/foo/bar.tif") - p.filePaths should be (p.values.toSeq) + p.filePaths should be (Some(singleCol(p.values))) } it("should handle single `paths`") { val p = Map(PATHS_PARAM -> "/usr/local/foo/bar.tif") - p.filePaths should be (p.values.toSeq) + p.filePaths should be (Some(singleCol(p.values))) } it("should handle multiple `paths`") { val expected = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") val p = Map(PATHS_PARAM -> expected.mkString("\n\r", "\n\n", "\r")) - p.filePaths should be (expected) + p.filePaths should be (Some(singleCol(expected))) } it("should handle both `path` and `paths`") { val expected1 = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") val expected2 = "/usr/local/barf/baz.tif" val p = Map(PATHS_PARAM -> expected1.mkString("\n"), PATH_PARAM -> expected2) - p.filePaths should be (expected1 :+ expected2) + p.filePaths should be (Some(singleCol(expected1 :+ expected2))) } it("should parse tile dimensions") { val p = Map(TILE_DIMS_PARAM -> "4, 5") @@ -56,16 +61,18 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { it("should parse path table specification") { val p = Map(PATH_TABLE_PARAM -> "pathTable", PATH_TABLE_COL_PARAM -> "path") - p.pathTable should be (Some(RasterSourceTable("pathTable", "path"))) + p.pathTable should be (Some(RasterSourcePathTableRef("pathTable", "path"))) } } describe("RasterSource as relation reading") { + val b = DEFAULT_COLUMN_NAME + it("should default to a single band schema") { val df = spark.read.rastersource.load(l8B1SamplePath.toASCIIString) val tcols = df.tileColumns tcols.length should be(1) - tcols.map(_.columnName) should contain("tile") + tcols.map(_.columnName) should contain(DEFAULT_COLUMN_NAME) } it("should support a multiband schema") { val df = spark.read @@ -74,7 +81,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { .load(cogPath.toASCIIString) val tcols = df.tileColumns tcols.length should be(3) - tcols.map(_.columnName) should contain allElementsOf Seq("tile_b0", "tile_b1", "tile_b2") + tcols.map(_.columnName) should contain allElementsOf Seq("_b0", "_b1", "_b2").map(s => DEFAULT_COLUMN_NAME + s) } it("should read a multiband file") { val df = spark.read @@ -84,7 +91,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { .cache() df.schema.size should be (4) // Test (roughly) we have three distinct but compabible bands - val stats = df.agg(rf_agg_stats($"tile_b0") as "s0", rf_agg_stats($"tile_b1") as "s1", rf_agg_stats($"tile_b2") as "s2") + val stats = df.agg(rf_agg_stats($"${b}_b0") as "s0", rf_agg_stats($"${b}_b1") as "s1", rf_agg_stats($"${b}_b2") as "s2") stats.select($"s0.data_cells" === $"s1.data_cells").as[Boolean].first() should be(true) stats.select($"s0.data_cells" === $"s2.data_cells").as[Boolean].first() should be(true) stats.select($"s0.mean" =!= $"s1.mean").as[Boolean].first() should be(true) @@ -98,18 +105,18 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.count() should be(math.ceil(1028.0 / 128).toInt * math.ceil(989.0 / 128).toInt) - val dims = df.select(rf_dimensions($"tile").as[TileDimensions]).distinct().collect() + val dims = df.select(rf_dimensions($"$b").as[TileDimensions]).distinct().collect() dims should contain allElementsOf Seq(TileDimensions(4,128), TileDimensions(128,128), TileDimensions(128,93), TileDimensions(4,93)) - df.select("tile_path").distinct().count() should be(1) + df.select($"${b}_path").distinct().count() should be(1) } it("should read a multiple files with one band") { val df = spark.read.rastersource .from(Seq(cogPath, l8B1SamplePath, nonCogPath)) .withTileDimensions(128, 128) .load() - df.select("tile_path").distinct().count() should be(3) + df.select($"${b}_path").distinct().count() should be(3) df.schema.size should be(2) } it("should read a multiple files with heterogeneous bands") { @@ -119,13 +126,13 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { .withBandIndexes(0, 1, 2, 3) .load() .cache() - df.select("tile_path").distinct().count() should be(3) + df.select($"${b}_path").distinct().count() should be(3) df.schema.size should be(5) - df.select($"tile_b0").count() should be (df.select($"tile_b0").na.drop.count()) - df.select($"tile_b1").na.drop.count() shouldBe <(df.count()) - df.select($"tile_b1").na.drop.count() should be (df.select($"tile_b2").na.drop.count()) - df.select($"tile_b3").na.drop.count() should be (0) + df.select($"${b}_b0").count() should be (df.select($"${b}_b0").na.drop.count()) + df.select($"${b}_b1").na.drop.count() shouldBe <(df.count()) + df.select($"${b}_b1").na.drop.count() should be (df.select($"${b}_b2").na.drop.count()) + df.select($"${b}_b3").na.drop.count() should be (0) } diff --git a/project/RFProjectPlugin.scala b/project/RFProjectPlugin.scala index 9f50f3fda..b7c904416 100644 --- a/project/RFProjectPlugin.scala +++ b/project/RFProjectPlugin.scala @@ -11,10 +11,6 @@ object RFProjectPlugin extends AutoPlugin { override def trigger: PluginTrigger = allRequirements override def requires = GitPlugin - lazy val IntegrationTest = config("it") extend Test - - override def projectConfigurations: Seq[Configuration] = Seq(IntegrationTest) - override def projectSettings = Seq( organization := "org.locationtech.rasterframes", organizationName := "LocationTech RasterFrames", From 11be7b25169e74dee300edd0fdd78eef7f43cbcd Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 21 Jun 2019 15:41:08 -0400 Subject: [PATCH 179/380] Added ability to initialize a `rastersource` datasource with a CSV of paths. --- .../rastersource/RasterSourceDataSource.scala | 28 ++++++- .../rastersource/RasterSourceRelation.scala | 7 +- .../datasource/rastersource/package.scala | 5 ++ .../RasterSourceDataSourceSpec.scala | 41 ++++++++- .../src/main/python/docs/raster-io.pymd | 83 +++++++++++++++++++ .../main/python/pyrasterframes/__init__.py | 8 +- 6 files changed, 164 insertions(+), 8 deletions(-) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index 651d488db..956dc89c3 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -27,6 +27,8 @@ import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} import org.locationtech.rasterframes.model.TileDimensions +import scala.util.Try + class RasterSourceDataSource extends DataSourceRegister with RelationProvider { import RasterSourceDataSource._ override def shortName(): String = SHORT_NAME @@ -44,6 +46,7 @@ object RasterSourceDataSource { final val BAND_INDEXES_PARAM = "bandIndexes" final val TILE_DIMS_PARAM = "tileDimensions" final val PATH_TABLE_PARAM = "pathTable" + final val PATH_CSV_PARAM = "pathCSVTable" final val PATH_TABLE_COL_PARAM = "pathTableColumns" final val DEFAULT_COLUMN_NAME = PROJECTED_RASTER_COLUMN.columnName @@ -57,6 +60,24 @@ object RasterSourceDataSource { require(sceneRows.forall(_.bandPaths.length == bandColumnNames.length), "Each scene row must have the same number of entries as band column names") } + + object RasterSourcePathTable { + def apply(csv: String): Option[RasterSourcePathTable] = Try { + val lines = csv + .split(Array('\n','\r')) + .map(_.trim) + .filter(_.nonEmpty) + + val header = lines.head.split(',').map(_.trim) + val rows = lines.tail.map(_.split(',').map(_.trim)).map(BandSet(_: _*)) + RasterSourcePathTable(rows, header: _*) + }.toOption + + def apply(singlebandPaths: Seq[String]): Option[RasterSourcePathTable] = + if (singlebandPaths.isEmpty) None + else Some(RasterSourcePathTable(singlebandPaths.map(BandSet(_)), DEFAULT_COLUMN_NAME)) + } + /** Container for specifying where to select raster paths from. */ case class RasterSourcePathTableRef(tableName: String, bandColumnNames: String*) extends WithBandColumns @@ -84,9 +105,10 @@ object RasterSourceDataSource { .toSeq ).filter(_.nonEmpty) - if (paths.isEmpty) None - else - Some(RasterSourcePathTable(paths.map(BandSet(_)), DEFAULT_COLUMN_NAME)) + RasterSourcePathTable(paths) + .orElse(parameters + .get(PATH_CSV_PARAM) + .flatMap(RasterSourcePathTable(_))) } def pathTable: Option[RasterSourcePathTableRef] = parameters diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index f3f337310..7fab2fbbd 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -83,7 +83,12 @@ case class RasterSourceRelation( case Right(spec) => sqlContext.table(spec.tableName) case Left(spec) => spec.bandColumnNames match { case Seq(single) => spec.sceneRows.map(_.bandPaths.headOption.orNull).toDF(single) - case bands => spec.sceneRows.map(_.bandPaths).toDF(bands: _*) + case bands => + val bsel = bands.zipWithIndex.map { case (b, i) => col("value")(i).as(b) } + + spec.sceneRows.map(_.bandPaths) + .toDF("value") + .select(bsel: _*) } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala index cae9e7fcd..2e284043f 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala @@ -56,6 +56,11 @@ package object rastersource { .option(RasterSourceDataSource.PATH_TABLE_COL_PARAM, bandColumnNames.mkString(",")) ) + def fromCSV(pathTableCSV: String): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.option(RasterSourceDataSource.PATH_CSV_PARAM, pathTableCSV) + ) + def from(newlineDelimPaths: String): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.option(RasterSourceDataSource.PATHS_PARAM, newlineDelimPaths) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 59ccf331b..ff1c315e7 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -21,7 +21,7 @@ package org.locationtech.rasterframes.datasource.rastersource import org.locationtech.rasterframes.{TestEnvironment, _} -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource._ +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourcePathTable, _} import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.util._ @@ -61,7 +61,19 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { it("should parse path table specification") { val p = Map(PATH_TABLE_PARAM -> "pathTable", PATH_TABLE_COL_PARAM -> "path") - p.pathTable should be (Some(RasterSourcePathTableRef("pathTable", "path"))) + p.pathSpec should be (Right(RasterSourcePathTableRef("pathTable", "path"))) + } + + it("should parse path table from CSV") { + val bands = Seq("B1", "B2", "B3") + val paths = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif", "/usr/local/barf/baz.tif") + val csv = + s""" + |${bands.mkString(",")} + |${paths.mkString(",")} + """.stripMargin.trim + val p = Map(PATH_CSV_PARAM -> csv) + p.pathSpec should be (Left(RasterSourcePathTable(Seq(BandSet(paths:_*)), bands:_*))) } } @@ -135,8 +147,31 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.select($"${b}_b3").na.drop.count() should be (0) } + it("should read a set of coherent bands from multiple files from a CSV") { + val bands = Seq("B1", "B2", "B3") + val paths = Seq( + l8SamplePath(1).toASCIIString, + l8SamplePath(2).toASCIIString, + l8SamplePath(3).toASCIIString + ) + + val csv = + s""" + |${bands.mkString(",")} + |${paths.mkString(",")} + """.stripMargin.trim + + val df = spark.read.rastersource + .fromCSV(csv) + .withTileDimensions(128, 128) + .load() + + df.schema.size should be(6) + df.tileColumns.size should be (3) + df.select($"B1_path").distinct().count() should be (1) + } - it("should read a extent coherent bands from multiple files") { + it("should read a set of coherent bands from multiple files in a table") { val bandPaths = Seq(( l8SamplePath(1).toASCIIString, l8SamplePath(2).toASCIIString, diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 375f9c4f8..135017c6a 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -1,7 +1,90 @@ # Raster Data I/O +The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames are compatible with existing generalized DataSources, such as Parquet, but provide specialized ones oriented around geospatial raster data. + ## Reading Raster Data +```python, echo=False +from IPython.display import display +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +spark = create_rf_spark_session() +``` + +RasterFrames registers a DataSource named `rastersource` that enables reading of GeoTIFFs (and other formats when GDAL is installed) from arbitrary (sets of) URLs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket: + +```python +data_root = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp' +def s2_band(idx): + return f"{data_root}/B0{idx}.tif" + +``` + +### Single Raster + +The simplest form is reading a single raster from a single URL: + +```python +rf = spark.read.rastersource(s2_band(2)) +rf.printSchema() +``` + +[[Discuss the schema]] + +Let's unpack the `proj_raster` column and look at the contents in more detail. + +```python +crs = rf.select(rf_crs("proj_raster").alias("value")).first() + +parts = rf.select( + rf_extent("proj_raster").alias("extent"), + rf_tile("proj_raster").alias("tile") +) + +print("CRS", crs.value.crsProj4) +parts.show(5) + +``` + +Let's elect a single tile and view it. + +```python +tile = rf.select(rf_tile("proj_raster")).first() +# TODO: IPython rendering +print(tile) +``` + + +### Single Scene, Multiple Bands + +Generally we'll want to work with multiple bands. If you have several singleband image files of the same scene, `rastersource` can make use of a CSV (or other DataFrame) specifying the band columns and scene rows. + +```python +csv = f""" +red,green,blue +{s2_band(4)},{s2_band(3)},{s2_band(2)} +""" + +print(csv) + +rf2 = spark.read.rastersource(csv=csv) +rf2.printSchema() + +rf2.show(5) +``` + + ## Writing Raster Data +### Overviews + +### GeoTIFFs + +### Tile Samples + +### GeoTrellis Layers + + + +[DS]: https://spark.apache.org/docs/latest/sql-data-sources.html \ No newline at end of file diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 884538630..5ab872df3 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -99,7 +99,7 @@ def _layer_reader(df_reader, format_key, path, **options): return _convert_df(df) -def _rastersource_reader(df_reader, path=None, band_indexes=None, tile_dimensions=(256, 256), **options): +def _rastersource_reader(df_reader, path=None, csv=None, band_indexes=None, tile_dimensions=(256, 256), **options): if band_indexes is None: band_indexes = [0] @@ -109,6 +109,12 @@ def to_csv(comp): return ','.join(str(v) for v in comp) "bandIndexes": to_csv(band_indexes), "tileDimensions": to_csv(tile_dimensions) }) + + if csv is not None: + options.update({ + "pathCSVTable": csv + }) + return df_reader \ .format("rastersource") \ .load(path, **options) From 290858153f90e4a026599ad6b3bc7a3c1dd9a631 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sun, 23 Jun 2019 13:47:18 -0400 Subject: [PATCH 180/380] Incremental progress commit. --- .../src/main/python/docs/raster-io.pymd | 60 ++++++++++++++++++- .../main/python/pyrasterframes/__init__.py | 7 ++- 2 files changed, 64 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 135017c6a..138829ca9 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -11,7 +11,7 @@ from pyrasterframes.rasterfunctions import * spark = create_rf_spark_session() ``` -RasterFrames registers a DataSource named `rastersource` that enables reading of GeoTIFFs (and other formats when GDAL is installed) from arbitrary (sets of) URLs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket: +RasterFrames registers a DataSource named `rastersource` that enables reading of GeoTIFFs (and other formats when GDAL is installed) from arbitrary (sets of) URIs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket: ```python data_root = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp' @@ -22,7 +22,7 @@ def s2_band(idx): ### Single Raster -The simplest form is reading a single raster from a single URL: +The simplest form is reading a single raster from a single URI: ```python rf = spark.read.rastersource(s2_band(2)) @@ -73,6 +73,62 @@ rf2.printSchema() rf2.show(5) ``` +### Multiple Scenes, Multiple Bands + +The example above will work with a reasonable number of rows in the CSV string. However, in many cases it's preferable to have that information organized in another DataFrame. For the purposes of this example use one of the AWS PDS daily scene listing files for MODIS surface reflectance as our catalog. + +```python +from pyspark import SparkFiles +cat_filename = "2018-07-04_scenes.txt" +spark.sparkContext.addFile(f"https://modis-pds.s3.amazonaws.com/MCD43A4.006/{cat_filename}") +modis_catalog = spark.read \ + .format("csv") \ + .option("header", "true") \ + .load(SparkFiles.get(cat_filename)) +modis_catalog.printSchema() +print("Available scenes: ", modis_catalog.count()) +modis_catalog.show(5, truncate=False) +``` + +MODIS data products are delivered on a regular, consistent grid, making identification of a specific area over time easy using `(h,v)` grid coordinates. + +![MODIS Grid](https://modis-land.gsfc.nasa.gov/images/MODIS_sinusoidal_grid1.gif) + +For sake of example, lets say we wanted all the MODIS data right above the equator. The grid position is encoded in the GUID, with `h07` being the strip just above the equator . To go from `download_url` to band URL we strip off `index.html`, and append the GUID, band specifier, and file extension. + +```python +from pyspark.sql import functions as F + +# Index URIs take the form: +# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/index.html +# Image URIs take the form: +# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF + +# .filter(modis_catalog.download_url.contains("h07")) \ + +equator = modis_catalog \ + .withColumn('base_url', + F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) + ) \ +.select( + F.concat('base_url', F.lit("_B1.TIF")).alias('red'), + F.concat('base_url', F.lit("_B2.TIF")).alias('nir') +) \ +.where(F.col('gid').like('%h07%')) +equator.show(5) +``` + +Now that we have a catalog of multiple scenes and mutiple bands withit each scene, we can pass it along to `rastersource` load the imagery. To complete the example, we compute some aggregate statistics over NDVI. + +```python +equator.createOrReplaceTempView("equator") +spark.read.rastersource() +``` + +### Multiband Rasters + +[[Need to know _a priori_ how many bands there are, specified with `band_indexes`]] + ## Writing Raster Data diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 5ab872df3..d3b8128ba 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -99,7 +99,12 @@ def _layer_reader(df_reader, format_key, path, **options): return _convert_df(df) -def _rastersource_reader(df_reader, path=None, csv=None, band_indexes=None, tile_dimensions=(256, 256), **options): +def _rastersource_reader( + df_reader, path=None, + csv=None, + band_indexes=None, tile_dimensions=(256, 256), + **options): + if band_indexes is None: band_indexes = [0] From 4722fba4313da05eb991f2b58bfc1a87ab6a4e44 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sun, 23 Jun 2019 20:55:09 -0400 Subject: [PATCH 181/380] Added ability to pass catalog DataFrame into `rastersource` read. --- .../RasterSourceToRasterRefs.scala | 6 ++- .../rastersource/RasterSourceDataSource.scala | 52 +++++++++++-------- .../rastersource/RasterSourceRelation.scala | 10 ++-- .../datasource/rastersource/package.scala | 8 +-- .../RasterSourceDataSourceSpec.scala | 20 +++---- .../src/main/python/docs/local-algebra.pymd | 1 + .../src/main/python/docs/raster-io.pymd | 33 +++++++----- .../src/main/python/docs/spark-ml.pymd | 1 + .../main/python/pyrasterframes/__init__.py | 35 ++++++++++--- .../src/main/python/pyrasterframes/utils.py | 1 - .../main/python/tests/PyRasterFramesTests.py | 10 ++-- 11 files changed, 106 insertions(+), 71 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index 663f090ff..7ba2bb13d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -63,9 +63,10 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[ if (b < src.bandCount) RasterRef(src, b, e) else null override def eval(input: InternalRow): TraversableOnce[InternalRow] = { + var src: RasterSource = null try { val refs = children.map { child ⇒ - val src = RasterSourceType.deserialize(child.eval(input)) + src = RasterSourceType.deserialize(child.eval(input)) subtileDims.map(dims => src .layoutExtents(dims) @@ -77,7 +78,8 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[ } catch { case NonFatal(ex) ⇒ - logger.error("Error fetching data for " + input, ex) + val payload = if (src == null) input else src + logger.error("Error fetching data for " + payload, ex) Traversable.empty } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala index 956dc89c3..73f5e2597 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala @@ -45,9 +45,9 @@ object RasterSourceDataSource { final val PATHS_PARAM = "paths" final val BAND_INDEXES_PARAM = "bandIndexes" final val TILE_DIMS_PARAM = "tileDimensions" - final val PATH_TABLE_PARAM = "pathTable" - final val PATH_CSV_PARAM = "pathCSVTable" - final val PATH_TABLE_COL_PARAM = "pathTableColumns" + final val CATALOG_TABLE_PARAM = "catalogTable" + final val CATALOG_TABLE_COLS_PARAM = "catalogColumns" + final val CATALOG_CSV_PARAM = "catalogCSV" final val DEFAULT_COLUMN_NAME = PROJECTED_RASTER_COLUMN.columnName @@ -56,30 +56,32 @@ object RasterSourceDataSource { } /** Container for specifying raster paths. */ case class BandSet(bandPaths: String*) - case class RasterSourcePathTable(sceneRows: Seq[BandSet], bandColumnNames: String*) extends WithBandColumns { + case class RasterSourceCatalog(sceneRows: Seq[BandSet], bandColumnNames: String*) extends WithBandColumns { require(sceneRows.forall(_.bandPaths.length == bandColumnNames.length), "Each scene row must have the same number of entries as band column names") } - object RasterSourcePathTable { - def apply(csv: String): Option[RasterSourcePathTable] = Try { + object RasterSourceCatalog { + def apply(csv: String, bandColumnNames: String*): Option[RasterSourceCatalog] = Try { val lines = csv .split(Array('\n','\r')) .map(_.trim) .filter(_.nonEmpty) - val header = lines.head.split(',').map(_.trim) + val header = lines.head.split(',').map(_.trim).toSeq val rows = lines.tail.map(_.split(',').map(_.trim)).map(BandSet(_: _*)) - RasterSourcePathTable(rows, header: _*) + val bands = if (bandColumnNames.isEmpty) header + else bandColumnNames + RasterSourceCatalog(rows, bands: _*) }.toOption - def apply(singlebandPaths: Seq[String]): Option[RasterSourcePathTable] = + def apply(singlebandPaths: Seq[String]): Option[RasterSourceCatalog] = if (singlebandPaths.isEmpty) None - else Some(RasterSourcePathTable(singlebandPaths.map(BandSet(_)), DEFAULT_COLUMN_NAME)) + else Some(RasterSourceCatalog(singlebandPaths.map(BandSet(_)), DEFAULT_COLUMN_NAME)) } /** Container for specifying where to select raster paths from. */ - case class RasterSourcePathTableRef(tableName: String, bandColumnNames: String*) extends WithBandColumns + case class RasterSourceCatalogRef(tableName: String, bandColumnNames: String*) extends WithBandColumns private[rastersource] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { @@ -94,7 +96,7 @@ object RasterSourceDataSource { .map(_.split(',').map(_.trim.toInt).toSeq) .getOrElse(Seq(0)) - def filePaths: Option[RasterSourcePathTable] = { + def catalog: Option[RasterSourceCatalog] = { val paths = ( parameters .get(PATHS_PARAM) @@ -105,20 +107,26 @@ object RasterSourceDataSource { .toSeq ).filter(_.nonEmpty) - RasterSourcePathTable(paths) + RasterSourceCatalog(paths) .orElse(parameters - .get(PATH_CSV_PARAM) - .flatMap(RasterSourcePathTable(_))) + .get(CATALOG_CSV_PARAM) + .flatMap(RasterSourceCatalog(_, catalogTableCols: _*)) + ) } - def pathTable: Option[RasterSourcePathTableRef] = parameters - .get(PATH_TABLE_PARAM) - .zip(parameters.get(PATH_TABLE_COL_PARAM)) - .map(p => RasterSourcePathTableRef(p._1, p._2.split(','): _*)) - .headOption + def catalogTableCols: Seq[String] = parameters + .get(CATALOG_TABLE_COLS_PARAM) + .map(_.split(',').toSeq) + .getOrElse(Seq.empty) - def pathSpec: Either[RasterSourcePathTable, RasterSourcePathTableRef] = { - (filePaths, pathTable) match { + def catalogTable: Option[RasterSourceCatalogRef] = parameters + .get(CATALOG_TABLE_PARAM) + .map(p => RasterSourceCatalogRef(p, catalogTableCols: _*)) + + def pathSpec: Either[RasterSourceCatalog, RasterSourceCatalogRef] = { + val a = catalogTable + val b = catalogTableCols + (catalog, catalogTable) match { case (Some(f), None) => Left(f) case (None, Some(p)) => Right(p) case _ => throw new IllegalArgumentException("Only one of a set of file paths OR a paths table column may be provided.") diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index 7fab2fbbd..a939db026 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -26,7 +26,7 @@ import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourcePathTable, RasterSourcePathTableRef} +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourceCatalog, RasterSourceCatalogRef} import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} @@ -36,17 +36,17 @@ import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Constructs a Spark Relation over one or more RasterSource paths. * @param sqlContext Query context - * @param pathTable Specifiction of raster path sources + * @param catalogTable Specifiction of raster path sources * @param bandIndexes band indexes to fetch * @param subtileDims how big to tile/subdivide rasters info */ case class RasterSourceRelation( sqlContext: SQLContext, - pathTable: Either[RasterSourcePathTable, RasterSourcePathTableRef], + catalogTable: Either[RasterSourceCatalog, RasterSourceCatalogRef], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { - lazy val inputColNames = pathTable.merge.bandColumnNames + lazy val inputColNames = catalogTable.merge.bandColumnNames def pathColNames = inputColNames .map(_ + "_path") @@ -79,7 +79,7 @@ case class RasterSourceRelation( // The general transformaion is: // input -> path -> src -> ref -> tile // Each step is broken down for readability - val inputs: DataFrame = pathTable match { + val inputs: DataFrame = catalogTable match { case Right(spec) => sqlContext.table(spec.tableName) case Left(spec) => spec.bandColumnNames match { case Seq(single) => spec.sceneRows.map(_.bandPaths.headOption.orNull).toDF(single) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala index 2e284043f..bbe0b7774 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala @@ -52,13 +52,13 @@ package object rastersource { def fromTable(tableName: String, bandColumnNames: String*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( - reader.option(RasterSourceDataSource.PATH_TABLE_PARAM, tableName) - .option(RasterSourceDataSource.PATH_TABLE_COL_PARAM, bandColumnNames.mkString(",")) + reader.option(RasterSourceDataSource.CATALOG_TABLE_PARAM, tableName) + .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) ) - def fromCSV(pathTableCSV: String): RasterSourceDataFrameReader = + def fromCSV(catalogCSV: String): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( - reader.option(RasterSourceDataSource.PATH_CSV_PARAM, pathTableCSV) + reader.option(RasterSourceDataSource.CATALOG_CSV_PARAM, catalogCSV) ) def from(newlineDelimPaths: String): RasterSourceDataFrameReader = diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index ff1c315e7..7b2360f31 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -21,7 +21,7 @@ package org.locationtech.rasterframes.datasource.rastersource import org.locationtech.rasterframes.{TestEnvironment, _} -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourcePathTable, _} +import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourceCatalog, _} import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.util._ @@ -31,28 +31,28 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { describe("DataSource parameter processing") { def singleCol(paths: Iterable[String]) = { val rows: Seq[BandSet] = paths.map(BandSet(_)).toSeq - RasterSourcePathTable(rows, DEFAULT_COLUMN_NAME) + RasterSourceCatalog(rows, DEFAULT_COLUMN_NAME) } it("should handle single `path`") { val p = Map(PATH_PARAM -> "/usr/local/foo/bar.tif") - p.filePaths should be (Some(singleCol(p.values))) + p.catalog should be (Some(singleCol(p.values))) } it("should handle single `paths`") { val p = Map(PATHS_PARAM -> "/usr/local/foo/bar.tif") - p.filePaths should be (Some(singleCol(p.values))) + p.catalog should be (Some(singleCol(p.values))) } it("should handle multiple `paths`") { val expected = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") val p = Map(PATHS_PARAM -> expected.mkString("\n\r", "\n\n", "\r")) - p.filePaths should be (Some(singleCol(expected))) + p.catalog should be (Some(singleCol(expected))) } it("should handle both `path` and `paths`") { val expected1 = Seq("/usr/local/foo/bar.tif", "/usr/local/bar/foo.tif") val expected2 = "/usr/local/barf/baz.tif" val p = Map(PATHS_PARAM -> expected1.mkString("\n"), PATH_PARAM -> expected2) - p.filePaths should be (Some(singleCol(expected1 :+ expected2))) + p.catalog should be (Some(singleCol(expected1 :+ expected2))) } it("should parse tile dimensions") { val p = Map(TILE_DIMS_PARAM -> "4, 5") @@ -60,8 +60,8 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { } it("should parse path table specification") { - val p = Map(PATH_TABLE_PARAM -> "pathTable", PATH_TABLE_COL_PARAM -> "path") - p.pathSpec should be (Right(RasterSourcePathTableRef("pathTable", "path"))) + val p = Map(CATALOG_TABLE_PARAM -> "catalogTable", CATALOG_TABLE_COLS_PARAM -> "path") + p.pathSpec should be (Right(RasterSourceCatalogRef("catalogTable", "path"))) } it("should parse path table from CSV") { @@ -72,8 +72,8 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { |${bands.mkString(",")} |${paths.mkString(",")} """.stripMargin.trim - val p = Map(PATH_CSV_PARAM -> csv) - p.pathSpec should be (Left(RasterSourcePathTable(Seq(BandSet(paths:_*)), bands:_*))) + val p = Map(CATALOG_CSV_PARAM -> csv) + p.pathSpec should be (Left(RasterSourceCatalog(Seq(BandSet(paths:_*)), bands:_*))) } } diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index 124ab9342..a281ce1a2 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -13,6 +13,7 @@ spark = create_rf_spark_session() ## Computing NDVI ```python, term=True +# TODO: rewrite to use `rastersource` redBand = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') nirBand = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 138829ca9..c9179540a 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -67,7 +67,7 @@ red,green,blue print(csv) -rf2 = spark.read.rastersource(csv=csv) +rf2 = spark.read.rastersource(catalog=csv, catalog_col_names=['red', 'green', 'blue']) rf2.printSchema() rf2.show(5) @@ -104,25 +104,34 @@ from pyspark.sql import functions as F # Image URIs take the form: # https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF -# .filter(modis_catalog.download_url.contains("h07")) \ - -equator = modis_catalog \ +equator = (modis_catalog .withColumn('base_url', F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) - ) \ + ) .select( - F.concat('base_url', F.lit("_B1.TIF")).alias('red'), - F.concat('base_url', F.lit("_B2.TIF")).alias('nir') -) \ -.where(F.col('gid').like('%h07%')) -equator.show(5) + F.concat('base_url', F.lit("_B01.TIF")).alias('red'), + F.concat('base_url', F.lit("_B02.TIF")).alias('nir') +) +.where(F.col('gid').like('%v07%')) +) +equator.show(3) ``` Now that we have a catalog of multiple scenes and mutiple bands withit each scene, we can pass it along to `rastersource` load the imagery. To complete the example, we compute some aggregate statistics over NDVI. ```python -equator.createOrReplaceTempView("equator") -spark.read.rastersource() +rf = spark.read.rastersource( + catalog=equator, + catalog_col_names=['red', 'nir'] +).repartition() +rf.show(2, truncate=False) +(rf + .select(rf_normalized_difference('nir', 'red').alias('ndvi')) + .agg(rf_agg_stats('ndvi').alias('stats')) + .select('stats.*') + .show(truncate=False) +) + ``` ### Multiband Rasters diff --git a/pyrasterframes/src/main/python/docs/spark-ml.pymd b/pyrasterframes/src/main/python/docs/spark-ml.pymd index 3dda84182..34314e659 100644 --- a/pyrasterframes/src/main/python/docs/spark-ml.pymd +++ b/pyrasterframes/src/main/python/docs/spark-ml.pymd @@ -28,6 +28,7 @@ bandColNames = list(map(lambda n: 'band_{}'.format(n), bandNumbers)) For each identified band, load the associated image file: ```python, term=True +# TODO: rewrite using `rastersource`. from functools import reduce joinedRF = reduce(lambda rf1, rf2: rf1.asRF().spatialJoin(rf2.drop('bounds').drop('metadata').drop('extent').drop('crs')), map(lambda bf: spark.read.geotiff(bf[1]) diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index d3b8128ba..d8433b09d 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -101,24 +101,43 @@ def _layer_reader(df_reader, format_key, path, **options): def _rastersource_reader( df_reader, path=None, - csv=None, - band_indexes=None, tile_dimensions=(256, 256), + band_indexes=None, + tile_dimensions=(256, 256), + catalog=None, + catalog_col_names=None, **options): + def to_csv(comp): + if isinstance(comp, str): + return comp + else: + return ','.join(str(v) for v in comp) + if band_indexes is None: band_indexes = [0] - def to_csv(comp): return ','.join(str(v) for v in comp) - # If path is list, convert to newline delimited string and pass as "paths" (plural) options.update({ "bandIndexes": to_csv(band_indexes), "tileDimensions": to_csv(tile_dimensions) }) - if csv is not None: - options.update({ - "pathCSVTable": csv - }) + if catalog is not None: + if catalog_col_names is None: + raise Exception("'catalog_col_names' required when DataFrame 'catalog' specified") + if isinstance(catalog, str): + options.update({ + "catalogCSV": catalog, + "catalogColumns": to_csv(catalog_col_names) + }) + elif isinstance(catalog, DataFrame): + import uuid + # Create a random view name + name = str(uuid.uuid4()).replace('-', '') + catalog.createOrReplaceTempView(name) + options.update({ + "catalogTable": name, + "catalogColumns": to_csv(catalog_col_names) + }) return df_reader \ .format("rastersource") \ diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py index 155ce0f46..f09eb672e 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/utils.py +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -84,7 +84,6 @@ def create_rf_spark_session(): .master("local[*]") .appName("RasterFrames") .config('spark.jars', jars_cp) - .config("spark.ui.enabled", "false") .withKryoSerialization() .getOrCreate()) spark.withRasterFrames() diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 22472da28..acf4ade06 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -728,8 +728,6 @@ def l8path(b): print(path_count.toPandas()) self.assertTrue(path_count.count() == 3) - ### Similar to the scala side's `fromTable`, read from a table with columns giving URI paths - scene_dict = { 1: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/041/LC08_L1TP_015041_20190305_20190309_01_T1/LC08_L1TP_015041_20190305_20190309_01_T1_B{}.TIF', 2: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/042/LC08_L1TP_015042_20190305_20190309_01_T1/LC08_L1TP_015042_20190305_20190309_01_T1_B{}.TIF', @@ -741,7 +739,6 @@ def path(scene, band): p = scene_dict[scene] return p.format(band) - path_table_hive_name = 'path_table' # Create a pandas dataframe (makes it easy to create spark df) path_pandas = pd.DataFrame([ {'b1': path(1, 1), 'b2': path(1, 2), 'b3': path(1, 3)}, @@ -749,14 +746,13 @@ def path(scene, band): {'b1': path(3, 1), 'b2': path(3, 2), 'b3': path(3, 3)}, ]) # comma separated list of column names containing URI's to read. - csv_columns = ','.join(path_pandas.columns.tolist()) # 'b1,b2,b3' + catalog_columns = ','.join(path_pandas.columns.tolist()) # 'b1,b2,b3' path_table = self.spark.createDataFrame(path_pandas) - path_table.createOrReplaceTempView(path_table_hive_name) path_df = self.spark.read.rastersource( tile_dimensions=(512, 512), - pathTable=path_table_hive_name, - pathTableColumns=csv_columns, + catalog=path_table, + catalog_col_names=catalog_columns ) self.assertTrue(len(path_df.columns) == 6) # three bands times {path, tile} From 103b7669d41c1ac51a57dd6489a2aa2371b6a7e9 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 24 Jun 2019 11:36:28 -0400 Subject: [PATCH 182/380] Tweak to create_rf_spark_session so python 2 test run / pass Signed-off-by: Jason T. Brown --- .../main/python/pyrasterframes/__init__.py | 3 +-- .../src/main/python/pyrasterframes/utils.py | 19 +++++++++++-------- .../src/main/python/tests/__init__.py | 3 +-- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 884538630..45962a34d 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -57,8 +57,7 @@ def _kryo_init(builder): def get_spark_session(): - from pyspark.sql import SparkSession - import os + """ Create a SparkSession with pyrasterframes enabled and configured. """ from pyrasterframes.utils import create_rf_spark_session return create_rf_spark_session() diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py index 155ce0f46..09f64bb16 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/utils.py +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -76,16 +76,19 @@ def find_pyrasterframes_assembly(): def create_rf_spark_session(): - jar_path = find_pyrasterframes_jar_dir() - - jars_cp = ','.join([f.path for f in os.scandir(jar_path) if f.name[-3:] == 'jar']) + """ Create a SparkSession with pyrasterframes enabled and configured. """ + jar_path = find_pyrasterframes_assembly() spark = (SparkSession.builder .master("local[*]") - .appName("RasterFrames") - .config('spark.jars', jars_cp) - .config("spark.ui.enabled", "false") + .appName("PyRasterFrames") + .config('spark.jars', jar_path) .withKryoSerialization() .getOrCreate()) - spark.withRasterFrames() - return spark + + try: + spark.withRasterFrames() + return spark + except TypeError as te: + print("Error setting up SparkSession; cannot find the pyrasterframes assembly jar\n", te) + return None diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 267701f34..36f3fadfd 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -22,7 +22,6 @@ import os import unittest -from pyspark.sql import SparkSession from pyrasterframes.rasterfunctions import * from pyrasterframes.utils import create_rf_spark_session @@ -78,4 +77,4 @@ def create_rasterframe(self): self.rf = rf.withColumn('tile2', rf_convert_cell_type('tile', 'float32')) \ .drop('tile') \ .withColumnRenamed('tile2', 'tile').asRF() - # cls.rf.show() \ No newline at end of file + # cls.rf.show() From 8f773adfe6ab69b87d481e5685a93d22bc8f6bfb Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 24 Jun 2019 11:53:13 -0400 Subject: [PATCH 183/380] python examples use get_spark_session, clean up imports Signed-off-by: Jason T. Brown --- .../src/main/python/examples/Clustering.py | 8 +++++--- .../python/examples/CreatingRasterFrames.py | 6 ++---- .../src/main/python/examples/MeanValue.py | 10 +++++----- .../src/main/python/examples/NDVI.py | 18 +++++++++++------- 4 files changed, 23 insertions(+), 19 deletions(-) diff --git a/pyrasterframes/src/main/python/examples/Clustering.py b/pyrasterframes/src/main/python/examples/Clustering.py index 3825ede28..fc1b9dfe9 100644 --- a/pyrasterframes/src/main/python/examples/Clustering.py +++ b/pyrasterframes/src/main/python/examples/Clustering.py @@ -1,11 +1,13 @@ from . import test_resource_dir + +from pyrasterframes import TileExploder from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -from pyspark.sql import * +from pyrasterframes.rasterfunctions import rf_assemble_tile + from pyspark.ml.feature import VectorAssembler from pyspark.ml.clustering import KMeans from pyspark.ml import Pipeline + import os spark = create_rf_spark_session() diff --git a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py index 99ae32b05..2a7499e5e 100644 --- a/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py +++ b/pyrasterframes/src/main/python/examples/CreatingRasterFrames.py @@ -1,10 +1,8 @@ from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyspark.sql import * +import pyrasterframes import os -spark = create_rf_spark_session().withRasterFrames() +spark = pyrasterframes.get_spark_session() rf = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) diff --git a/pyrasterframes/src/main/python/examples/MeanValue.py b/pyrasterframes/src/main/python/examples/MeanValue.py index 06960b7fc..7409b10b5 100644 --- a/pyrasterframes/src/main/python/examples/MeanValue.py +++ b/pyrasterframes/src/main/python/examples/MeanValue.py @@ -1,11 +1,11 @@ from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * -from pyspark.sql import * + +import pyrasterframes +from pyrasterframes.rasterfunctions import rf_agg_no_data_cells, rf_agg_data_cells, rf_agg_mean + import os -spark = create_rf_spark_session().withRasterFrames() +spark = pyrasterframes.get_spark_session() rf = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) diff --git a/pyrasterframes/src/main/python/examples/NDVI.py b/pyrasterframes/src/main/python/examples/NDVI.py index 94e7fe031..cb9b69854 100644 --- a/pyrasterframes/src/main/python/examples/NDVI.py +++ b/pyrasterframes/src/main/python/examples/NDVI.py @@ -1,15 +1,19 @@ from . import test_resource_dir -from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * + +import pyrasterframes +from pyrasterframes.rasterfunctions import rf_normalized_difference + import os -spark = create_rf_spark_session().withRasterFrames() +spark = pyrasterframes.get_spark_session() + +red_path = os.path.join(test_resource_dir(), 'L8-B4-Elkton-VA.tiff') +nir_path = os.path.join(test_resource_dir(), 'L8-B5-Elkton-VA.tiff') -redBand = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') -nirBand = spark.read.geotiff(os.path.join(test_resource_dir(), 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') +red_band = spark.read.geotiff(red_path).withColumnRenamed('tile', 'red_band') +nir_band = spark.read.geotiff(nir_path).withColumnRenamed('tile', 'nir_band') -rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ +rf = red_band.asRF().spatialJoin(nir_band.asRF()) \ .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) rf.printSchema() rf.show(20) From 318a1164c4692cb814f0cfffd58b07ba1ddb9573 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 24 Jun 2019 13:18:47 -0400 Subject: [PATCH 184/380] Clean up python wildcard imports Signed-off-by: Jason T. Brown --- pyrasterframes/README.md | 18 ++++++++++++++++-- pyrasterframes/build.sbt | 2 +- .../src/main/python/pyrasterframes/__init__.py | 4 ++-- .../python/pyrasterframes/rasterfunctions.py | 1 - .../src/main/python/pyrasterframes/rf_types.py | 2 +- .../main/python/tests/PyRasterFramesTests.py | 12 ++++++++++-- .../src/main/python/tests/__init__.py | 2 +- 7 files changed, 31 insertions(+), 10 deletions(-) diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index 00f5b7069..afc7fe25c 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -16,8 +16,7 @@ To initialize PyRasterFrames in a generic Python shell follow the pattern below, ```python from pyspark.sql import SparkSession -from pyrasterframes import * -from pyrasterframes.rasterfunctions import * +import pyrasterframes spark = SparkSession.builder \ .master("local[*]") \ .appName("Using RasterFrames") \ @@ -108,6 +107,20 @@ Release versions of these artifacts are published to https://central.sonatype.or Latest version can be found [here](https://search.maven.org/search?q=g:org.locationtech.rasterframes). The Python package is published under the `python` classifier, `zip` extension. +### Building and publishing for pypi + +To create a source and binary distribution appropriate for pypi: + +```bash +sbt pyrasterframes/package # alias 'pyBuild' +``` + +Observe the output messages such as: + + [info] Python .whl file written to '/Users/monty/rasterframes/pyrasterframes/target/python/dist/pyrasterframes-0.8.0.dev0-py2.py3-none-any.whl' + +This wheel is suitable for publishing to a package index. See [https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives](packaging.python.org). + ## Build Internals ### Running `setup.py` @@ -128,3 +141,4 @@ sbt 'pySetup examples -e NDVI' ``` *Note: You may need to run `sbt pyrasterframes/assembly` at least once for certain `pySetup` commands to work.* + diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 57af72f7e..578d364c0 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -18,7 +18,7 @@ pySparkCmd := { val py = (Python / packageBin).value val script = IO.createTemporaryDirectory / "pyrf_init.py" IO.write(script, """ -from pyrasterframes import * +import pyrasterframes from pyrasterframes.rasterfunctions import * """) val msg = s"PYTHONSTARTUP=$script pyspark --jars $jvm --py-files $py" diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 45962a34d..f6b2557bf 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -29,10 +29,9 @@ from pyspark.sql.column import _to_java_column # Import RasterFrame types and functions -from .rf_types import * -from . import rasterfunctions from .context import RFContext from .version import __version__ +from .rf_types import RasterFrame, TileExploder, TileUDT, RasterSourceUDT __all__ = ['RasterFrame', 'TileExploder'] @@ -62,6 +61,7 @@ def get_spark_session(): return create_rf_spark_session() + def _convert_df(df, sp_key=None, metadata=None): ctx = SparkContext._active_spark_context._rf_context diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 9d8ceff7a..4b37022c3 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -24,7 +24,6 @@ signatures are handled here as well. """ from __future__ import absolute_import -from pyspark.sql.types import * from pyspark.sql.column import Column, _to_java_column from .context import RFContext from .rf_types import CellType diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 2849642ac..1a2a2c391 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -28,7 +28,7 @@ class here provides the PyRasterFrames entry point. from pyspark.sql.types import UserDefinedType from pyspark import SparkContext from pyspark.sql import DataFrame, Column -from pyspark.sql.types import * +from pyspark.sql.types import (StructType, StructField, BinaryType, DoubleType, ShortType, IntegerType, StringType) from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable import numpy as np diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 35ab325f8..0795ad3d8 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -21,12 +21,11 @@ import unittest import numpy as np -from geomesa_pyspark.types import * +import geomesa_pyspark.types from pyrasterframes.rasterfunctions import * from pyrasterframes.rf_types import * from pyspark.sql import SQLContext, Column from pyspark.sql.functions import * -from pyspark.sql.types import * from . import TestEnvironment @@ -48,6 +47,7 @@ def setUp(self): def test_spatial_relations(self): from pyspark.sql.functions import udf, sum + from geomesa_pyspark.types import PointUDT import shapely import numpy.testing @@ -102,6 +102,7 @@ def some_point(g): ) def test_rasterize(self): + from geomesa_pyspark.types import PolygonUDT # simple test that raster contents are not invalid # create a udf to buffer (the bounds) polygon @@ -387,6 +388,8 @@ def test_mask_no_data(self): self.assertIsNotNone(t2.cells[1][1]) def test_tile_udt_serialization(self): + from pyspark.sql.types import StructType, StructField + udt = TileUDT() cell_types = (ct for ct in rf_cell_types() if not (ct.is_raw() or ("bool" in ct.base_cell_type_name()))) @@ -468,6 +471,8 @@ def my_udf(t): ) def test_no_data_udf_handling(self): + from pyspark.sql.types import StructType, StructField + t1 = Tile(np.array([[1, 2], [0, 4]]), CellType.uint8()) self.assertEqual(t1.cell_type.to_numpy_dtype(), np.dtype("uint8")) e1 = Tile(np.array([[2, 3], [0, 5]]), CellType.uint8()) @@ -516,6 +521,8 @@ def less_pi(t): class TileOps(TestEnvironment): + from pyrasterframes.rf_types import Tile + def setUp(self): # convenience so we can assert around Tile() == Tile() self.t1 = Tile(np.array([[1, 2], @@ -578,6 +585,7 @@ def test_matmul(self): class PandasInterop(TestEnvironment): + def setUp(self): self.create_rasterframe() diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 36f3fadfd..8dc6a1126 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -22,7 +22,6 @@ import os import unittest -from pyrasterframes.rasterfunctions import * from pyrasterframes.utils import create_rf_spark_session import sys @@ -68,6 +67,7 @@ def setUpClass(cls): cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') def create_rasterframe(self): + from pyrasterframes.rasterfunctions import rf_convert_cell_type # load something into a rasterframe rf = self.spark.read.geotiff(self.img_uri) \ .withBounds() \ From c52cba5d786ff9448c52379dbe98e75e1ff5f6ce Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 24 Jun 2019 15:32:14 -0400 Subject: [PATCH 185/380] Unpin pyspark version Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/requirements.txt b/pyrasterframes/src/main/python/requirements.txt index b715f2f7e..278f275c7 100644 --- a/pyrasterframes/src/main/python/requirements.txt +++ b/pyrasterframes/src/main/python/requirements.txt @@ -1,6 +1,6 @@ pytz shapely -pyspark==2.3.3 +pyspark<2.4 numpy>=1.7 pandas matplotlib<3.0.0 # no python 2.7 support after v2.x.x From 4c6b93cace2439e58c04ef92bba310bf7f922ce2 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 24 Jun 2019 15:48:51 -0400 Subject: [PATCH 186/380] Unpin spark version, try 2 Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/requirements.txt | 2 +- pyrasterframes/src/main/python/setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/requirements.txt b/pyrasterframes/src/main/python/requirements.txt index 278f275c7..9ce9fb620 100644 --- a/pyrasterframes/src/main/python/requirements.txt +++ b/pyrasterframes/src/main/python/requirements.txt @@ -1,6 +1,6 @@ pytz shapely -pyspark<2.4 +pyspark==2.3.3 # See issue # 154 numpy>=1.7 pandas matplotlib<3.0.0 # no python 2.7 support after v2.x.x diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 5d0d8bc2c..e48ef6973 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -116,14 +116,14 @@ def run(self): install_requires=[ 'pytz', 'shapely', - 'pyspark==2.3.3', + 'pyspark<2.4', 'numpy>=1.7', 'pandas', ], setup_requires=[ 'pytz', 'shapely', - 'pyspark==2.3.3', + 'pyspark<2.4', 'numpy>=1.7', 'pandas', 'pytest-runner', From 9a71c22023e8f31d757068b36998c134ef642aa9 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 24 Jun 2019 17:11:47 -0400 Subject: [PATCH 187/380] Converted installation of pyrasterframes in notebook to use whl file. --- project/PythonBuildPlugin.scala | 9 +++++---- rf-notebook/build.sbt | 9 +++------ rf-notebook/src/main/docker/Dockerfile | 8 ++------ 3 files changed, 10 insertions(+), 16 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index e9280a617..22a67dcf4 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -37,6 +37,7 @@ object PythonBuildPlugin extends AutoPlugin { val pythonSource = settingKey[File]("Default Python source directory.").withRank(ASetting) val pythonCommand = settingKey[String]("Python command. Defaults to 'python'") val pySetup = inputKey[Int]("Run 'python setup.py '. Returns exit code.") + val pyWhl = taskKey[File]("Builds the Python wheel distribution") } import autoImport._ @@ -65,9 +66,9 @@ object PythonBuildPlugin extends AutoPlugin { IO.copyFile(asmbl, dest) log.info(s"PyRasterFrames assembly written to '$dest'") dest - } + }.dependsOn(copyPySources) - val pyWhl = Def.task { + val pyWhlImp = Def.task { val log = streams.value.log val buildDir = (Python / target).value val retcode = pySetup.toTask(" build bdist_wheel").value @@ -85,7 +86,7 @@ object PythonBuildPlugin extends AutoPlugin { IO.copyFile(whl, pyDest) log.info(s"Maven Python .zip artifact written to '$pyDest'") pyDest - } + }.dependsOn(pyWhl) override def projectConfigurations: Seq[Configuration] = Seq(Python) @@ -94,7 +95,6 @@ object PythonBuildPlugin extends AutoPlugin { pythonCommand := "python", pySetup := { val s = streams.value - val _ = copyPySources.value val wd = (Python / target).value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args @@ -102,6 +102,7 @@ object PythonBuildPlugin extends AutoPlugin { s.log.info(s"Running '${cmd.mkString(" ")}' in '$wd'") Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! }, + pyWhl := pyWhlImp.value, Compile / pythonSource := (Compile / sourceDirectory).value / "python", Test / pythonSource := (Test / sourceDirectory).value / "python", Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value, diff --git a/rf-notebook/build.sbt b/rf-notebook/build.sbt index 7c94d8271..8a1d44b2a 100644 --- a/rf-notebook/build.sbt +++ b/rf-notebook/build.sbt @@ -1,6 +1,5 @@ -import sbt.{IO, _} - import scala.sys.process.Process +import PythonBuildPlugin.autoImport.pyWhl Docker / packageName := "rasterframes-notebook" @@ -18,11 +17,9 @@ Docker / mappings := { val dockerSrc = (Docker / sourceDirectory).value val dockerAssets = (dockerSrc ** "*") pair Path.relativeTo(dockerSrc) - val jar = assembly.value - - val py = (LocalProject("pyrasterframes") / Python / packageBin).value + val py = (LocalProject("pyrasterframes") / pyWhl).value - dockerAssets ++ Seq(jar -> jar.getName, py -> py.getName) + dockerAssets ++ Seq(py -> py.getName) } // This bypasses the standard DockerPlugin DSL-based Dockerfile construction diff --git a/rf-notebook/src/main/docker/Dockerfile b/rf-notebook/src/main/docker/Dockerfile index be5a2adeb..db7e4570a 100644 --- a/rf-notebook/src/main/docker/Dockerfile +++ b/rf-notebook/src/main/docker/Dockerfile @@ -3,8 +3,6 @@ FROM s22s/pyspark-notebook:spark-2.3.3-hadoop-2.7 MAINTAINER Astraea, Inc. ENV RF_LIB_LOC /usr/local/rasterframes -ENV RF_JAR $RF_LIB_LOC/rasterframes.jar -ENV PY_RF_ZIP $RF_LIB_LOC/pyrasterframes.zip USER root @@ -16,8 +14,6 @@ RUN echo "spark.driver.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-de EXPOSE 4040 4041 4042 4043 4044 ENV SPARK_OPTS $SPARK_OPTS \ - --py-files $PY_RF_ZIP \ - --jars $RF_JAR \ --driver-class-path $RF_JAR \ --conf spark.executor.extraClassPath=$RF_JAR @@ -34,8 +30,8 @@ RUN rm -rf /home/$NB_USER/.local && \ # Do these after the standard environment setup # since these change more regularly. -COPY *.zip $PY_RF_ZIP -COPY *.jar $RF_JAR +COPY *.whl $RF_LIB_LOC +RUN ls -1 $RF_LIB_LOC/*.whl | xargs pip install RUN chown -R $NB_UID:$NB_GID $HOME From 14303b287d2d114d8a04b5c0dd0fd92218b3fec6 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 25 Jun 2019 11:44:32 -0400 Subject: [PATCH 188/380] Update pattern for Getting Started python notebook Signed-off-by: Jason T. Brown --- .../src/main/notebooks/Getting Started.ipynb | 872 ++++-------------- 1 file changed, 173 insertions(+), 699 deletions(-) diff --git a/rf-notebook/src/main/notebooks/Getting Started.ipynb b/rf-notebook/src/main/notebooks/Getting Started.ipynb index d5d615664..9b164ad0e 100644 --- a/rf-notebook/src/main/notebooks/Getting Started.ipynb +++ b/rf-notebook/src/main/notebooks/Getting Started.ipynb @@ -17,60 +17,93 @@ { "cell_type": "code", "execution_count": 1, - "metadata": {}, - "outputs": [], - "source": [ - "from pyspark.sql import SparkSession\n", - "from pyrasterframes import *\n", - "from pyrasterframes.rasterfunctions import *\n", - "\n", - "spark = SparkSession.builder \\\n", - " .withKryoSerialization() \\\n", - " .getOrCreate() \\\n", - " .withRasterFrames()" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, + "metadata": { + "scrolled": false + }, "outputs": [ { "data": { + "text/html": [ + "\n", + "

    \n", + "

    SparkSession - in-memory

    \n", + " \n", + "
    \n", + "

    SparkContext

    \n", + "\n", + "

    Spark UI

    \n", + "\n", + "
    \n", + "
    Version
    \n", + "
    v2.3.3
    \n", + "
    Master
    \n", + "
    local[*]
    \n", + "
    AppName
    \n", + "
    PyRasterFrames
    \n", + "
    \n", + "
    \n", + " \n", + "
    \n", + " " + ], "text/plain": [ - "'{\"builtAtMillis\":\"1557330142297\", \"name\":\"core\", \"rfSparkVersion\":\"2.3.2\", \"moduleName\":\"rasterframes\", \"scalaVersion\":\"2.11.12\", \"rfGeoTrellisVersion\":\"2.2.0\", \"version\":\"0.8.0-SNAPSHOT\", \"sbtVersion\":\"1.2.8\", \"builtAtString\":\"2019-05-08 15:42:22.297\", \"rfGeoMesaVersion\":\"2.2.1\"}'" + "" ] }, - "execution_count": 3, + "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from pyrasterframes import RFContext\n", - "RFContext.active().build_info()" + "import pyrasterframes\n", + "import pyrasterframes.rf_ipython # enables nicer visualizations\n", + "spark = pyrasterframes.get_spark_session()\n", + "spark" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "## Read an image" + "### Get a PySpark DataFrame from [open data](https://landsatonaws.com/)" ] }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ - "href = \"https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\"\n", - "df = spark.read.rastersource(href)" + "uri = 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/041/'\\\n", + " 'LC08_L1TP_015041_20190305_20190309_01_T1/'\\\n", + " 'LC08_L1TP_015041_20190305_20190309_01_T1_B2.TIF'\n", + "df = spark.read.rastersource(uri)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "930" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.count()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -80,7 +113,7 @@ "root\n", " |-- tile_path: string (nullable = false)\n", " |-- tile: struct (nullable = true)\n", - " | |-- tileContext: struct (nullable = false)\n", + " | |-- tile_context: struct (nullable = false)\n", " | | |-- extent: struct (nullable = false)\n", " | | | |-- xmin: double (nullable = false)\n", " | | | |-- ymin: double (nullable = false)\n", @@ -99,488 +132,10 @@ }, { "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
    \n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
    rf_extent(tile)crs(tile)
    0(14455356.755667, -2342509.0947641465, 1457396...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    1(14573964.81109804, -2342509.0947641465, 14692...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    2(14692572.86652908, -2342509.0947641465, 14811...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    3(14811180.92196012, -2342509.0947641465, 14929...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    4(14929788.97739116, -2342509.0947641465, 15048...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    5(15048397.0328222, -2342509.0947641465, 151670...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    6(15167005.08825324, -2342509.0947641465, 15285...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    7(15285613.14368428, -2342509.0947641465, 15404...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    8(15404221.199115321, -2342509.0947641465, 1552...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    9(15522829.254546361, -2342509.0947641465, 1556...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    10(14455356.755667, -2461117.150195293, 14573964...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    11(14573964.81109804, -2461117.150195293, 146925...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    12(14692572.86652908, -2461117.150195293, 148111...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    13(14811180.92196012, -2461117.150195293, 149297...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    14(14929788.97739116, -2461117.150195293, 150483...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    15(15048397.0328222, -2461117.150195293, 1516700...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    16(15167005.08825324, -2461117.150195293, 152856...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    17(15285613.14368428, -2461117.150195293, 154042...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    18(15404221.199115321, -2461117.150195293, 15522...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    19(15522829.254546361, -2461117.150195293, 15567...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    20(14455356.755667, -2579725.20562644, 14573964....(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    21(14573964.81109804, -2579725.20562644, 1469257...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    22(14692572.86652908, -2579725.20562644, 1481118...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    23(14811180.92196012, -2579725.20562644, 1492978...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    24(14929788.97739116, -2579725.20562644, 1504839...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    25(15048397.0328222, -2579725.20562644, 15167005...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    26(15167005.08825324, -2579725.20562644, 1528561...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    27(15285613.14368428, -2579725.20562644, 1540422...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    28(15404221.199115321, -2579725.20562644, 155228...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    29(15522829.254546361, -2579725.20562644, 155673...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    .........
    70(14455356.755667, -3172765.482782173, 14573964...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    71(14573964.81109804, -3172765.482782173, 146925...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    72(14692572.86652908, -3172765.482782173, 148111...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    73(14811180.92196012, -3172765.482782173, 149297...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    74(14929788.97739116, -3172765.482782173, 150483...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    75(15048397.0328222, -3172765.482782173, 1516700...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    76(15167005.08825324, -3172765.482782173, 152856...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    77(15285613.14368428, -3172765.482782173, 154042...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    78(15404221.199115321, -3172765.482782173, 15522...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    79(15522829.254546361, -3172765.482782173, 15567...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    80(14455356.755667, -3291373.53821332, 14573964....(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    81(14573964.81109804, -3291373.53821332, 1469257...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    82(14692572.86652908, -3291373.53821332, 1481118...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    83(14811180.92196012, -3291373.53821332, 1492978...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    84(14929788.97739116, -3291373.53821332, 1504839...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    85(15048397.0328222, -3291373.53821332, 15167005...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    86(15167005.08825324, -3291373.53821332, 1528561...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    87(15285613.14368428, -3291373.53821332, 1540422...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    88(15404221.199115321, -3291373.53821332, 155228...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    89(15522829.254546361, -3291373.53821332, 155673...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    90(14455356.755667, -3335851.559, 14573964.81109...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    91(14573964.81109804, -3335851.559, 14692572.866...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    92(14692572.86652908, -3335851.559, 14811180.921...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    93(14811180.92196012, -3335851.559, 14929788.977...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    94(14929788.97739116, -3335851.559, 15048397.032...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    95(15048397.0328222, -3335851.559, 15167005.0882...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    96(15167005.08825324, -3335851.559, 15285613.143...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    97(15285613.14368428, -3335851.559, 15404221.199...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    98(15404221.199115321, -3335851.559, 15522829.25...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    99(15522829.254546361, -3335851.559, 15567307.27...(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...
    \n", - "

    100 rows × 2 columns

    \n", - "
    " - ], - "text/plain": [ - " rf_extent(tile) \\\n", - "0 (14455356.755667, -2342509.0947641465, 1457396... \n", - "1 (14573964.81109804, -2342509.0947641465, 14692... \n", - "2 (14692572.86652908, -2342509.0947641465, 14811... \n", - "3 (14811180.92196012, -2342509.0947641465, 14929... \n", - "4 (14929788.97739116, -2342509.0947641465, 15048... \n", - "5 (15048397.0328222, -2342509.0947641465, 151670... \n", - "6 (15167005.08825324, -2342509.0947641465, 15285... \n", - "7 (15285613.14368428, -2342509.0947641465, 15404... \n", - "8 (15404221.199115321, -2342509.0947641465, 1552... \n", - "9 (15522829.254546361, -2342509.0947641465, 1556... \n", - "10 (14455356.755667, -2461117.150195293, 14573964... \n", - "11 (14573964.81109804, -2461117.150195293, 146925... \n", - "12 (14692572.86652908, -2461117.150195293, 148111... \n", - "13 (14811180.92196012, -2461117.150195293, 149297... \n", - "14 (14929788.97739116, -2461117.150195293, 150483... \n", - "15 (15048397.0328222, -2461117.150195293, 1516700... \n", - "16 (15167005.08825324, -2461117.150195293, 152856... \n", - "17 (15285613.14368428, -2461117.150195293, 154042... \n", - "18 (15404221.199115321, -2461117.150195293, 15522... \n", - "19 (15522829.254546361, -2461117.150195293, 15567... \n", - "20 (14455356.755667, -2579725.20562644, 14573964.... \n", - "21 (14573964.81109804, -2579725.20562644, 1469257... \n", - "22 (14692572.86652908, -2579725.20562644, 1481118... \n", - "23 (14811180.92196012, -2579725.20562644, 1492978... \n", - "24 (14929788.97739116, -2579725.20562644, 1504839... \n", - "25 (15048397.0328222, -2579725.20562644, 15167005... \n", - "26 (15167005.08825324, -2579725.20562644, 1528561... \n", - "27 (15285613.14368428, -2579725.20562644, 1540422... \n", - "28 (15404221.199115321, -2579725.20562644, 155228... \n", - "29 (15522829.254546361, -2579725.20562644, 155673... \n", - ".. ... \n", - "70 (14455356.755667, -3172765.482782173, 14573964... \n", - "71 (14573964.81109804, -3172765.482782173, 146925... \n", - "72 (14692572.86652908, -3172765.482782173, 148111... \n", - "73 (14811180.92196012, -3172765.482782173, 149297... \n", - "74 (14929788.97739116, -3172765.482782173, 150483... \n", - "75 (15048397.0328222, -3172765.482782173, 1516700... \n", - "76 (15167005.08825324, -3172765.482782173, 152856... \n", - "77 (15285613.14368428, -3172765.482782173, 154042... \n", - "78 (15404221.199115321, -3172765.482782173, 15522... \n", - "79 (15522829.254546361, -3172765.482782173, 15567... \n", - "80 (14455356.755667, -3291373.53821332, 14573964.... \n", - "81 (14573964.81109804, -3291373.53821332, 1469257... \n", - "82 (14692572.86652908, -3291373.53821332, 1481118... \n", - "83 (14811180.92196012, -3291373.53821332, 1492978... \n", - "84 (14929788.97739116, -3291373.53821332, 1504839... \n", - "85 (15048397.0328222, -3291373.53821332, 15167005... \n", - "86 (15167005.08825324, -3291373.53821332, 1528561... \n", - "87 (15285613.14368428, -3291373.53821332, 1540422... \n", - "88 (15404221.199115321, -3291373.53821332, 155228... \n", - "89 (15522829.254546361, -3291373.53821332, 155673... \n", - "90 (14455356.755667, -3335851.559, 14573964.81109... \n", - "91 (14573964.81109804, -3335851.559, 14692572.866... \n", - "92 (14692572.86652908, -3335851.559, 14811180.921... \n", - "93 (14811180.92196012, -3335851.559, 14929788.977... \n", - "94 (14929788.97739116, -3335851.559, 15048397.032... \n", - "95 (15048397.0328222, -3335851.559, 15167005.0882... \n", - "96 (15167005.08825324, -3335851.559, 15285613.143... \n", - "97 (15285613.14368428, -3335851.559, 15404221.199... \n", - "98 (15404221.199115321, -3335851.559, 15522829.25... \n", - "99 (15522829.254546361, -3335851.559, 15567307.27... \n", - "\n", - " crs(tile) \n", - "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "10 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "11 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "12 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "13 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "14 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "15 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "16 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "17 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "18 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "19 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "20 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "21 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "22 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "23 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "24 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "25 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "26 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "27 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "28 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "29 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - ".. ... \n", - "70 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "71 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "72 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "73 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "74 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "75 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "76 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "77 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "78 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "79 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "80 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "81 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "82 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "83 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "84 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "85 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "86 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "87 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "88 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "89 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "90 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "91 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "92 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "93 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "94 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "95 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "96 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "97 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "98 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "99 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "\n", - "[100 rows x 2 columns]" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "df.select(rf_extent(\"tile\"), rf_crs(\"tile\")).toPandas()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, + "execution_count": 5, + "metadata": { + "scrolled": false + }, "outputs": [ { "data": { @@ -609,327 +164,246 @@ " \n", " \n", " 0\n", - " (((14455356.755667, -2342509.0947641465, 14573...\n", + " (((504825.0, 3142635.0, 512505.0, 3150315.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 1\n", - " (((14573964.81109804, -2342509.0947641465, 146...\n", + " (((497145.0, 3127275.0, 504825.0, 3134955.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 2\n", - " (((14692572.86652908, -2342509.0947641465, 148...\n", + " (((643065.0, 3127275.0, 650745.0, 3134955.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 3\n", - " (((14811180.92196012, -2342509.0947641465, 149...\n", + " (((650745.0, 3127275.0, 658425.0, 3134955.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 4\n", - " (((14929788.97739116, -2342509.0947641465, 150...\n", + " (((489465.0, 3119595.0, 497145.0, 3127275.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 5\n", - " (((15048397.0328222, -2342509.0947641465, 1516...\n", + " (((512505.0, 3119595.0, 520185.0, 3127275.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[ 0 0 0 ... 34835 35040 34929]\\n [ 0 0 0 ... 34438 33838 34300]\\n [ 0 0 0 ... 34169 34047 35019]\\n ...\\n [ 0 0 0 ... 28880 28858 28860]\\n [ 0 0 0 ... 28868 28882 28825]\\n [ 0 0 0 ... 28892 28830 28751]]))\n", " \n", " \n", " 6\n", - " (((15167005.08825324, -2342509.0947641465, 152...\n", + " (((566265.0, 3088875.0, 573945.0, 3096555.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[25072 24691 24206 ... 14174 14055 13722]\\n [24987 24851 24668 ... 13488 13960 14160]\\n [25287 25327 25125 ... 14932 14992 15673]\\n ...\\n [18261 18773 18356 ... 28507 29489 29209]\\n [18898 19475 18998 ... 27742 28559 28831]\\n [20193 20706 19194 ... 27191 27340 27728]]))\n", " \n", " \n", " 7\n", - " (((15285613.14368428, -2342509.0947641465, 154...\n", + " (((650745.0, 3081195.0, 658425.0, 3088875.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[37009 36664 36718 ... 30211 31565 32545]\\n [37220 36770 36653 ... 26997 30338 32433]\\n [37509 36985 36639 ... 26815 29523 31915]\\n ...\\n [21496 22198 22629 ... 50496 49952 49069]\\n [21319 21920 22650 ... 44582 47035 48996]\\n [21015 21923 23135 ... 40391 41619 46114]]))\n", " \n", " \n", " 8\n", - " (((15404221.199115321, -2342509.0947641465, 15...\n", + " (((481785.0, 3073515.0, 489465.0, 3081195.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 9\n", - " (((15522829.254546361, -2342509.0947641465, 15...\n", + " (((643065.0, 3073515.0, 650745.0, 3081195.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[41963 41787 41288 ... 19905 19831 20434]\\n [41612 41503 41209 ... 20569 20559 20786]\\n [41520 41262 41159 ... 20901 21337 21310]\\n ...\\n [35591 34598 33741 ... 28094 28141 28347]\\n [35111 34607 34556 ... 28344 28428 28404]\\n [35020 35115 35496 ... 28928 28943 28659]]))\n", " \n", " \n", " 10\n", - " (((14455356.755667, -2461117.150195293, 145739...\n", + " (((550905.0, 3065835.0, 558585.0, 3073515.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[29634 29074 27867 ... 34042 35793 36101]\\n [28292 28290 27806 ... 35532 36229 36043]\\n [26764 27215 27229 ... 35614 36731 37212]\\n ...\\n [12799 11281 11560 ... 22493 22390 24250]\\n [12380 12208 12146 ... 21462 24578 26095]\\n [11854 12212 12253 ... 21606 23951 26103]]))\n", " \n", " \n", " 11\n", - " (((14573964.81109804, -2461117.150195293, 1469...\n", + " (((581625.0, 3065835.0, 589305.0, 3073515.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[29596 29158 29310 ... 31524 32105 32622]\\n [29449 30052 29751 ... 31945 32458 32848]\\n [30147 30365 29524 ... 31432 32140 32678]\\n ...\\n [34789 34764 34617 ... 38622 38460 38426]\\n [34196 34286 34005 ... 38503 38249 38346]\\n [33628 33690 33329 ... 38487 38527 38578]]))\n", " \n", " \n", " 12\n", - " (((14692572.86652908, -2461117.150195293, 1481...\n", + " (((527865.0, 3050475.0, 535545.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[23166 23360 22026 ... 17733 17719 17761]\\n [20816 22672 20776 ... 18288 17669 17715]\\n [21089 20806 19823 ... 17316 17232 16957]\\n ...\\n [13103 12781 12562 ... 18723 19452 19702]\\n [12532 12190 12241 ... 18387 19321 19802]\\n [11338 11578 11682 ... 18910 19432 20186]]))\n", " \n", " \n", " 13\n", - " (((14811180.92196012, -2461117.150195293, 1492...\n", + " (((550905.0, 3050475.0, 558585.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[16526 16306 15638 ... 15329 14712 14664]\\n [16903 16944 16832 ... 15041 15341 16860]\\n [15429 16114 16805 ... 16944 17966 20436]\\n ...\\n [16725 15873 14367 ... 14874 16061 16183]\\n [17029 15729 14388 ... 14999 15990 16224]\\n [17588 16339 15071 ... 16020 16677 16706]]))\n", " \n", " \n", " 14\n", - " (((14929788.97739116, -2461117.150195293, 1504...\n", + " (((566265.0, 3050475.0, 573945.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[33341 32022 31451 ... 26398 27977 28861]\\n [32632 31144 30286 ... 25217 26510 27947]\\n [32467 31358 30482 ... 24477 24832 26911]\\n ...\\n [24057 21928 19082 ... 27809 28046 29053]\\n [24680 23947 22570 ... 27101 28215 29453]\\n [25789 24841 23734 ... 26425 27868 29834]]))\n", " \n", " \n", " 15\n", - " (((15048397.0328222, -2461117.150195293, 15167...\n", + " (((627705.0, 3050475.0, 635385.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[38204 38705 39130 ... 26587 26447 26839]\\n [38392 38655 38823 ... 26448 25693 25283]\\n [38544 38747 38786 ... 26832 24899 23747]\\n ...\\n [26022 26438 26731 ... 25005 25354 25707]\\n [26400 26930 27321 ... 24669 25009 25260]\\n [27408 27625 28089 ... 25586 24755 24192]]))\n", " \n", " \n", " 16\n", - " (((15167005.08825324, -2461117.150195293, 1528...\n", + " (((589305.0, 3042795.0, 596985.0, 3050475.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[32575 32134 30849 ... 30972 31822 32286]\\n [31885 31061 30993 ... 30657 32024 32868]\\n [31407 31448 31981 ... 29817 30815 32045]\\n ...\\n [35508 35433 35177 ... 33603 33305 33672]\\n [35484 35003 34429 ... 33247 33058 33417]\\n [35343 34631 34415 ... 33020 33076 33331]]))\n", " \n", " \n", " 17\n", - " (((15285613.14368428, -2461117.150195293, 1540...\n", + " (((512505.0, 3035115.0, 520185.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[13629 13641 13654 ... 15836 15926 15930]\\n [13589 13639 13708 ... 15108 15343 15375]\\n [13691 13537 13669 ... 14280 14724 14503]\\n ...\\n [24557 24697 24844 ... 18465 18186 18502]\\n [25020 25233 25155 ... 17952 17631 18332]\\n [25061 25075 25074 ... 18569 19170 19982]]))\n", " \n", " \n", " 18\n", - " (((15404221.199115321, -2461117.150195293, 155...\n", + " (((573945.0, 3035115.0, 581625.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[24336 24964 25037 ... 33327 33051 33358]\\n [22415 23612 24149 ... 33521 33440 33479]\\n [21209 23243 24114 ... 33880 33893 33683]\\n ...\\n [33638 32723 31054 ... 33057 32382 30685]\\n [32698 31960 31017 ... 32298 31310 30263]\\n [31792 31185 30859 ... 31983 31021 30331]]))\n", " \n", " \n", " 19\n", - " (((15522829.254546361, -2461117.150195293, 155...\n", + " (((612345.0, 3035115.0, 620025.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[40280 41293 42603 ... 32490 31581 31512]\\n [41099 41587 42092 ... 32941 32131 32091]\\n [41203 41661 42110 ... 33382 32299 32086]\\n ...\\n [24846 25986 26169 ... 27485 27374 27173]\\n [25559 27182 27638 ... 27592 27364 27008]\\n [26692 28129 28436 ... 27810 27397 27121]]))\n", " \n", " \n", " 20\n", - " (((14455356.755667, -2579725.20562644, 1457396...\n", + " (((635385.0, 3035115.0, 643065.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[24378 24438 23453 ... 29819 31058 33367]\\n [24208 23636 23144 ... 31847 33205 34472]\\n [23688 22993 22775 ... 33441 34319 34732]\\n ...\\n [33234 32463 33299 ... 11817 11144 10977]\\n [32762 33111 33942 ... 12565 11693 11084]\\n [32264 33099 33582 ... 12812 12458 11561]]))\n", " \n", " \n", " 21\n", - " (((14573964.81109804, -2579725.20562644, 14692...\n", + " (((512505.0, 3027435.0, 520185.0, 3035115.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[24858 24940 24606 ... 19891 21038 20948]\\n [25196 25118 24577 ... 20240 21793 21361]\\n [25752 25520 25170 ... 19794 20813 20261]\\n ...\\n [18146 17475 16777 ... 13993 13820 13694]\\n [17344 17460 17196 ... 13948 13775 13770]\\n [17364 17248 16749 ... 14023 13933 13923]]))\n", " \n", " \n", " 22\n", - " (((14692572.86652908, -2579725.20562644, 14811...\n", + " (((481785.0, 3019755.0, 489465.0, 3027435.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", " 23\n", - " (((14811180.92196012, -2579725.20562644, 14929...\n", + " (((543225.0, 3019755.0, 550905.0, 3027435.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[26791 27865 28601 ... 22455 23951 25011]\\n [26513 27266 28239 ... 24150 25929 26738]\\n [25921 26332 27075 ... 24996 26887 28051]\\n ...\\n [28977 28830 28319 ... 27381 27470 26778]\\n [26999 26694 27336 ... 27126 26994 26973]\\n [25323 26363 27737 ... 27885 27729 29269]]))\n", " \n", " \n", " 24\n", - " (((14929788.97739116, -2579725.20562644, 15048...\n", + " (((620025.0, 3019755.0, 627705.0, 3027435.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[27887 29274 29420 ... 28594 28067 26775]\\n [27511 27157 27926 ... 28321 27372 26632]\\n [26124 26258 28093 ... 28248 27692 27230]\\n ...\\n [25102 23556 20447 ... 13549 12968 12387]\\n [25162 22693 18945 ... 12300 11879 12002]\\n [24361 20969 19145 ... 11435 11760 12192]]))\n", " \n", " \n", " 25\n", - " (((15048397.0328222, -2579725.20562644, 151670...\n", + " (((527865.0, 3012075.0, 535545.0, 3019755.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[23505 21881 21270 ... 28139 28527 28544]\\n [22847 23503 24292 ... 28372 28332 28020]\\n [25271 26722 26837 ... 28584 28075 27104]\\n ...\\n [26081 26353 25850 ... 23742 24155 24609]\\n [26054 25953 25177 ... 24958 25520 24955]\\n [25083 24297 23914 ... 25547 24948 24104]]))\n", " \n", " \n", " 26\n", - " (((15167005.08825324, -2579725.20562644, 15285...\n", + " (((558585.0, 3012075.0, 566265.0, 3019755.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[26250 26128 25784 ... 31877 31438 31180]\\n [26943 27098 26642 ... 31622 31352 30721]\\n [27795 27798 26474 ... 31461 30972 29782]\\n ...\\n [30301 30720 30815 ... 33041 32485 32388]\\n [30441 30736 30864 ... 32788 32812 33148]\\n [30632 30872 30957 ... 33857 34225 34098]]))\n", " \n", " \n", " 27\n", - " (((15285613.14368428, -2579725.20562644, 15404...\n", + " (((604665.0, 3012075.0, 612345.0, 3019755.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[16956 16754 16345 ... 21434 24875 28081]\\n [14837 14482 14216 ... 20008 21061 26474]\\n [12628 12588 12772 ... 17531 17956 24291]\\n ...\\n [12289 11931 12192 ... 16177 15880 15761]\\n [11916 12498 12292 ... 16069 15753 15868]\\n [12397 12705 11561 ... 16069 15868 15818]]))\n", " \n", " \n", " 28\n", - " (((15404221.199115321, -2579725.20562644, 1552...\n", + " (((566265.0, 3004395.0, 573945.0, 3012075.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[33574 33483 33158 ... 24957 24142 22776]\\n [34258 34099 34122 ... 26301 25233 24223]\\n [34544 34011 34466 ... 26305 25216 24065]\\n ...\\n [19789 19914 18905 ... 9703 9691 9696]\\n [18684 18597 18354 ... 9718 9699 9705]\\n [18358 16960 17366 ... 9672 9694 9752]]))\n", " \n", " \n", " 29\n", - " (((15522829.254546361, -2579725.20562644, 1556...\n", + " (((689145.0, 2996715.0, 696825.0, 3004395.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", - " ...\n", - " ...\n", + " 30\n", + " (((497145.0, 2981355.0, 504825.0, 2989035.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[12994 12892 13184 ... 13493 13857 13523]\\n [12845 13003 13482 ... 13903 14242 13732]\\n [13498 13647 13934 ... 14212 14245 13795]\\n ...\\n [15265 14704 14405 ... 14367 14409 14607]\\n [15671 15221 14812 ... 14792 14543 14227]\\n [15696 15458 15443 ... 15313 14650 13765]]))\n", " \n", " \n", - " 70\n", - " (((14455356.755667, -3172765.482782173, 145739...\n", + " 31\n", + " (((512505.0, 2973675.0, 520185.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[16204 16261 15205 ... 20715 21030 21177]\\n [16838 16326 15415 ... 20730 21139 21452]\\n [17289 16132 15167 ... 20711 21213 21590]\\n ...\\n [29109 30660 32185 ... 17231 14617 12620]\\n [30143 31752 32885 ... 15871 14035 12636]\\n [30663 32379 33617 ... 15469 14269 12847]]))\n", " \n", " \n", - " 71\n", - " (((14573964.81109804, -3172765.482782173, 1469...\n", + " 32\n", + " (((535545.0, 2973675.0, 543225.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[23036 24603 24745 ... 23201 23318 21658]\\n [19719 22610 23585 ... 25232 24894 23378]\\n [16386 18718 20205 ... 27731 27839 26234]\\n ...\\n [16662 17750 19966 ... 13344 16500 20875]\\n [20821 19012 19282 ... 12865 16932 20117]\\n [21951 20509 20907 ... 14476 18089 18942]]))\n", " \n", " \n", - " 72\n", - " (((14692572.86652908, -3172765.482782173, 1481...\n", + " 33\n", + " (((566265.0, 2973675.0, 573945.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[11473 11996 11959 ... 9030 9031 9030]\\n [11654 11890 12173 ... 9014 8991 8969]\\n [11921 12394 13089 ... 8959 8989 8919]\\n ...\\n [ 9002 8979 8991 ... 9451 9251 9239]\\n [ 8960 8976 9001 ... 9237 9314 9308]\\n [ 9123 9089 8963 ... 9778 9518 9274]]))\n", " \n", " \n", - " 73\n", - " (((14811180.92196012, -3172765.482782173, 1492...\n", + " 34\n", + " (((604665.0, 2973675.0, 612345.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8788 8805 8800 ... 8783 8788 8792]\\n [8792 8790 8793 ... 8789 8796 8785]\\n [8794 8804 8794 ... 8792 8802 8811]\\n ...\\n [8792 8770 8771 ... 8785 8769 8769]\\n [8785 8769 8787 ... 8769 8772 8777]\\n [8780 8763 8790 ... 8762 8770 8774]]))\n", " \n", " \n", - " 74\n", - " (((14929788.97739116, -3172765.482782173, 1504...\n", + " 35\n", + " (((612345.0, 2973675.0, 620025.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8796 8790 8797 ... 8802 8807 8807]\\n [8801 8806 8787 ... 8811 8818 8850]\\n [8795 8801 8806 ... 8797 8814 8815]\\n ...\\n [8771 8769 8787 ... 8802 8809 8816]\\n [8774 8777 8781 ... 8798 8819 8810]\\n [8777 8775 8766 ... 8782 8805 8786]]))\n", " \n", " \n", - " 75\n", - " (((15048397.0328222, -3172765.482782173, 15167...\n", + " 36\n", + " (((658425.0, 2973675.0, 666105.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8962 8957 8922 ... 9001 8995 9002]\\n [8938 8941 8936 ... 9001 9001 9012]\\n [8949 8939 8944 ... 8991 8986 9015]\\n ...\\n [8951 8962 8946 ... 9000 9019 9000]\\n [8960 8941 8930 ... 8996 8977 8971]\\n [8945 8924 8964 ... 8993 8976 9017]]))\n", " \n", " \n", - " 76\n", - " (((15167005.08825324, -3172765.482782173, 1528...\n", + " 37\n", + " (((543225.0, 2958315.0, 550905.0, 2965995.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[12803 12598 11798 ... 9106 9120 9118]\\n [14612 13071 11067 ... 9091 9080 9075]\\n [13822 11982 11517 ... 9057 9078 9065]\\n ...\\n [13038 13592 14077 ... 9273 9263 9250]\\n [12724 13054 13805 ... 9275 9309 9292]\\n [12043 11960 13863 ... 9384 9389 9388]]))\n", " \n", " \n", - " 77\n", - " (((15285613.14368428, -3172765.482782173, 1540...\n", + " 38\n", + " (((704505.0, 2958315.0, 709815.0, 2965995.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[177, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", - " 78\n", - " (((15404221.199115321, -3172765.482782173, 155...\n", + " 39\n", + " (((527865.0, 2950635.0, 535545.0, 2958315.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[20582 20739 20425 ... 9685 9588 9523]\\n [21068 20891 20466 ... 9582 9398 9422]\\n [20643 20751 20623 ... 9626 9413 9405]\\n ...\\n [10269 9976 9906 ... 9966 9957 9938]\\n [10262 10023 9695 ... 9949 9944 9936]\\n [10215 9936 9576 ... 9903 9921 9945]]))\n", " \n", " \n", - " 79\n", - " (((15522829.254546361, -3172765.482782173, 155...\n", + " 40\n", + " (((620025.0, 2942955.0, 627705.0, 2950635.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8818 8819 8814 ... 8844 8815 8810]\\n [8804 8817 8821 ... 8797 8785 8783]\\n [8805 8804 8807 ... 8809 8821 8781]\\n ...\\n [8817 8826 8844 ... 8815 8824 8852]\\n [8841 8822 8792 ... 8804 8801 8821]\\n [8804 8811 8807 ... 8794 8796 8823]]))\n", " \n", " \n", - " 80\n", - " (((14455356.755667, -3291373.53821332, 1457396...\n", + " 41\n", + " (((481785.0, 2917785.0, 489465.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", - " 81\n", - " (((14573964.81109804, -3291373.53821332, 14692...\n", + " 42\n", + " (((520185.0, 2917785.0, 527865.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", - " 82\n", - " (((14692572.86652908, -3291373.53821332, 14811...\n", + " 43\n", + " (((658425.0, 2917785.0, 666105.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[ 0 0 0 ... 9231 9227 9247]\\n [ 0 0 0 ... 9245 9242 9246]\\n [ 0 0 0 ... 9262 9252 9265]\\n ...\\n [ 0 0 0 ... 0 0 0]\\n [ 0 0 0 ... 0 0 0]\\n [ 0 0 0 ... 0 0 0]]))\n", " \n", " \n", - " 83\n", - " (((14811180.92196012, -3291373.53821332, 14929...\n", - " \n", - " \n", - " 84\n", - " (((14929788.97739116, -3291373.53821332, 15048...\n", - " \n", - " \n", - " 85\n", - " (((15048397.0328222, -3291373.53821332, 151670...\n", - " \n", - " \n", - " 86\n", - " (((15167005.08825324, -3291373.53821332, 15285...\n", - " \n", - " \n", - " 87\n", - " (((15285613.14368428, -3291373.53821332, 15404...\n", - " \n", - " \n", - " 88\n", - " (((15404221.199115321, -3291373.53821332, 1552...\n", - " \n", - " \n", - " 89\n", - " (((15522829.254546361, -3291373.53821332, 1556...\n", - " \n", - " \n", - " 90\n", - " (((14455356.755667, -3335851.559, 14573964.811...\n", - " \n", - " \n", - " 91\n", - " (((14573964.81109804, -3335851.559, 14692572.8...\n", - " \n", - " \n", - " 92\n", - " (((14692572.86652908, -3335851.559, 14811180.9...\n", - " \n", - " \n", - " 93\n", - " (((14811180.92196012, -3335851.559, 14929788.9...\n", - " \n", - " \n", - " 94\n", - " (((14929788.97739116, -3335851.559, 15048397.0...\n", - " \n", - " \n", - " 95\n", - " (((15048397.0328222, -3335851.559, 15167005.08...\n", - " \n", - " \n", - " 96\n", - " (((15167005.08825324, -3335851.559, 15285613.1...\n", - " \n", - " \n", - " 97\n", - " (((15285613.14368428, -3335851.559, 15404221.1...\n", - " \n", - " \n", - " 98\n", - " (((15404221.199115321, -3335851.559, 15522829....\n", - " \n", - " \n", - " 99\n", - " (((15522829.254546361, -3335851.559, 15567307....\n", + " 44\n", + " (((673785.0, 2917785.0, 681465.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", " \n", " \n", "\n", - "

    100 rows × 1 columns

    \n", "" ], "text/plain": [ " tile\n", - "0 (((14455356.755667, -2342509.0947641465, 14573...\n", - "1 (((14573964.81109804, -2342509.0947641465, 146...\n", - "2 (((14692572.86652908, -2342509.0947641465, 148...\n", - "3 (((14811180.92196012, -2342509.0947641465, 149...\n", - "4 (((14929788.97739116, -2342509.0947641465, 150...\n", - "5 (((15048397.0328222, -2342509.0947641465, 1516...\n", - "6 (((15167005.08825324, -2342509.0947641465, 152...\n", - "7 (((15285613.14368428, -2342509.0947641465, 154...\n", - "8 (((15404221.199115321, -2342509.0947641465, 15...\n", - "9 (((15522829.254546361, -2342509.0947641465, 15...\n", - "10 (((14455356.755667, -2461117.150195293, 145739...\n", - "11 (((14573964.81109804, -2461117.150195293, 1469...\n", - "12 (((14692572.86652908, -2461117.150195293, 1481...\n", - "13 (((14811180.92196012, -2461117.150195293, 1492...\n", - "14 (((14929788.97739116, -2461117.150195293, 1504...\n", - "15 (((15048397.0328222, -2461117.150195293, 15167...\n", - "16 (((15167005.08825324, -2461117.150195293, 1528...\n", - "17 (((15285613.14368428, -2461117.150195293, 1540...\n", - "18 (((15404221.199115321, -2461117.150195293, 155...\n", - "19 (((15522829.254546361, -2461117.150195293, 155...\n", - "20 (((14455356.755667, -2579725.20562644, 1457396...\n", - "21 (((14573964.81109804, -2579725.20562644, 14692...\n", - "22 (((14692572.86652908, -2579725.20562644, 14811...\n", - "23 (((14811180.92196012, -2579725.20562644, 14929...\n", - "24 (((14929788.97739116, -2579725.20562644, 15048...\n", - "25 (((15048397.0328222, -2579725.20562644, 151670...\n", - "26 (((15167005.08825324, -2579725.20562644, 15285...\n", - "27 (((15285613.14368428, -2579725.20562644, 15404...\n", - "28 (((15404221.199115321, -2579725.20562644, 1552...\n", - "29 (((15522829.254546361, -2579725.20562644, 1556...\n", - ".. ...\n", - "70 (((14455356.755667, -3172765.482782173, 145739...\n", - "71 (((14573964.81109804, -3172765.482782173, 1469...\n", - "72 (((14692572.86652908, -3172765.482782173, 1481...\n", - "73 (((14811180.92196012, -3172765.482782173, 1492...\n", - "74 (((14929788.97739116, -3172765.482782173, 1504...\n", - "75 (((15048397.0328222, -3172765.482782173, 15167...\n", - "76 (((15167005.08825324, -3172765.482782173, 1528...\n", - "77 (((15285613.14368428, -3172765.482782173, 1540...\n", - "78 (((15404221.199115321, -3172765.482782173, 155...\n", - "79 (((15522829.254546361, -3172765.482782173, 155...\n", - "80 (((14455356.755667, -3291373.53821332, 1457396...\n", - "81 (((14573964.81109804, -3291373.53821332, 14692...\n", - "82 (((14692572.86652908, -3291373.53821332, 14811...\n", - "83 (((14811180.92196012, -3291373.53821332, 14929...\n", - "84 (((14929788.97739116, -3291373.53821332, 15048...\n", - "85 (((15048397.0328222, -3291373.53821332, 151670...\n", - "86 (((15167005.08825324, -3291373.53821332, 15285...\n", - "87 (((15285613.14368428, -3291373.53821332, 15404...\n", - "88 (((15404221.199115321, -3291373.53821332, 1552...\n", - "89 (((15522829.254546361, -3291373.53821332, 1556...\n", - "90 (((14455356.755667, -3335851.559, 14573964.811...\n", - "91 (((14573964.81109804, -3335851.559, 14692572.8...\n", - "92 (((14692572.86652908, -3335851.559, 14811180.9...\n", - "93 (((14811180.92196012, -3335851.559, 14929788.9...\n", - "94 (((14929788.97739116, -3335851.559, 15048397.0...\n", - "95 (((15048397.0328222, -3335851.559, 15167005.08...\n", - "96 (((15167005.08825324, -3335851.559, 15285613.1...\n", - "97 (((15285613.14368428, -3335851.559, 15404221.1...\n", - "98 (((15404221.199115321, -3335851.559, 15522829....\n", - "99 (((15522829.254546361, -3335851.559, 15567307....\n", - "\n", - "[100 rows x 1 columns]" + "0 (((504825.0, 3142635.0, 512505.0, 3150315.0), ...\n", + "1 (((497145.0, 3127275.0, 504825.0, 3134955.0), ...\n", + "2 (((643065.0, 3127275.0, 650745.0, 3134955.0), ...\n", + "3 (((650745.0, 3127275.0, 658425.0, 3134955.0), ...\n", + "4 (((489465.0, 3119595.0, 497145.0, 3127275.0), ...\n", + "5 (((512505.0, 3119595.0, 520185.0, 3127275.0), ...\n", + "6 (((566265.0, 3088875.0, 573945.0, 3096555.0), ...\n", + "7 (((650745.0, 3081195.0, 658425.0, 3088875.0), ...\n", + "8 (((481785.0, 3073515.0, 489465.0, 3081195.0), ...\n", + "9 (((643065.0, 3073515.0, 650745.0, 3081195.0), ...\n", + "10 (((550905.0, 3065835.0, 558585.0, 3073515.0), ...\n", + "11 (((581625.0, 3065835.0, 589305.0, 3073515.0), ...\n", + "12 (((527865.0, 3050475.0, 535545.0, 3058155.0), ...\n", + "13 (((550905.0, 3050475.0, 558585.0, 3058155.0), ...\n", + "14 (((566265.0, 3050475.0, 573945.0, 3058155.0), ...\n", + "15 (((627705.0, 3050475.0, 635385.0, 3058155.0), ...\n", + "16 (((589305.0, 3042795.0, 596985.0, 3050475.0), ...\n", + "17 (((512505.0, 3035115.0, 520185.0, 3042795.0), ...\n", + "18 (((573945.0, 3035115.0, 581625.0, 3042795.0), ...\n", + "19 (((612345.0, 3035115.0, 620025.0, 3042795.0), ...\n", + "20 (((635385.0, 3035115.0, 643065.0, 3042795.0), ...\n", + "21 (((512505.0, 3027435.0, 520185.0, 3035115.0), ...\n", + "22 (((481785.0, 3019755.0, 489465.0, 3027435.0), ...\n", + "23 (((543225.0, 3019755.0, 550905.0, 3027435.0), ...\n", + "24 (((620025.0, 3019755.0, 627705.0, 3027435.0), ...\n", + "25 (((527865.0, 3012075.0, 535545.0, 3019755.0), ...\n", + "26 (((558585.0, 3012075.0, 566265.0, 3019755.0), ...\n", + "27 (((604665.0, 3012075.0, 612345.0, 3019755.0), ...\n", + "28 (((566265.0, 3004395.0, 573945.0, 3012075.0), ...\n", + "29 (((689145.0, 2996715.0, 696825.0, 3004395.0), ...\n", + "30 (((497145.0, 2981355.0, 504825.0, 2989035.0), ...\n", + "31 (((512505.0, 2973675.0, 520185.0, 2981355.0), ...\n", + "32 (((535545.0, 2973675.0, 543225.0, 2981355.0), ...\n", + "33 (((566265.0, 2973675.0, 573945.0, 2981355.0), ...\n", + "34 (((604665.0, 2973675.0, 612345.0, 2981355.0), ...\n", + "35 (((612345.0, 2973675.0, 620025.0, 2981355.0), ...\n", + "36 (((658425.0, 2973675.0, 666105.0, 2981355.0), ...\n", + "37 (((543225.0, 2958315.0, 550905.0, 2965995.0), ...\n", + "38 (((704505.0, 2958315.0, 709815.0, 2965995.0), ...\n", + "39 (((527865.0, 2950635.0, 535545.0, 2958315.0), ...\n", + "40 (((620025.0, 2942955.0, 627705.0, 2950635.0), ...\n", + "41 (((481785.0, 2917785.0, 489465.0, 2919915.0), ...\n", + "42 (((520185.0, 2917785.0, 527865.0, 2919915.0), ...\n", + "43 (((658425.0, 2917785.0, 666105.0, 2919915.0), ...\n", + "44 (((673785.0, 2917785.0, 681465.0, 2919915.0), ..." ] }, - "execution_count": 13, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "df.select(\"tile\").toPandas()" + "#Look at a sample\n", + "pandas_df = df.select(df.tile).sample(0.05).toPandas()\n", + "pandas_df" ] }, { From c2ed8003caeb65f89b8110ac6d78a7e891ac5a56 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 26 Jun 2019 11:23:44 -0400 Subject: [PATCH 189/380] PR feedback fixes. --- .../datasource/rastersource/RasterSourceRelation.scala | 2 +- pyrasterframes/src/main/python/docs/raster-io.pymd | 10 +++++----- .../src/main/python/tests/PyRasterFramesTests.py | 1 - 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala index a939db026..d49f3d911 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala @@ -36,7 +36,7 @@ import org.locationtech.rasterframes.tiles.ProjectedRasterTile /** * Constructs a Spark Relation over one or more RasterSource paths. * @param sqlContext Query context - * @param catalogTable Specifiction of raster path sources + * @param catalogTable Specification of raster path sources * @param bandIndexes band indexes to fetch * @param subtileDims how big to tile/subdivide rasters info */ diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index c9179540a..39ede7d21 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -16,7 +16,7 @@ RasterFrames registers a DataSource named `rastersource` that enables reading of ```python data_root = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp' def s2_band(idx): - return f"{data_root}/B0{idx}.tif" + return "{}/B0{}.tif".format(data_root, idx) ``` @@ -60,10 +60,10 @@ print(tile) Generally we'll want to work with multiple bands. If you have several singleband image files of the same scene, `rastersource` can make use of a CSV (or other DataFrame) specifying the band columns and scene rows. ```python -csv = f""" +csv = """ red,green,blue -{s2_band(4)},{s2_band(3)},{s2_band(2)} -""" +{},{},{} +""".format(s2_band(4), s2_band(3), s2_band(2)) print(csv) @@ -80,7 +80,7 @@ The example above will work with a reasonable number of rows in the CSV string. ```python from pyspark import SparkFiles cat_filename = "2018-07-04_scenes.txt" -spark.sparkContext.addFile(f"https://modis-pds.s3.amazonaws.com/MCD43A4.006/{cat_filename}") +spark.sparkContext.addFile("https://modis-pds.s3.amazonaws.com/MCD43A4.006/{}".format(cat_filename)) modis_catalog = spark.read \ .format("csv") \ .option("header", "true") \ diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 4e594d1b5..917f0f844 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -418,7 +418,6 @@ def test_tile_udt_serialization(self): def test_udf_on_tile_type_input(self): import numpy.testing - # rf_local_add(t, 0) is to force lazy eval; accessing tile.tile is to get at the actual Tile type vs PRT struct df = self.spark.read.rastersource(self.img_uri) rf = self.rf From ad0d6fea825f2cb57c38ca9365ec0891a9559cfc Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 26 Jun 2019 16:55:00 -0400 Subject: [PATCH 190/380] Refactor raster-ml doc to use rastersource Signed-off-by: Jason T. Brown --- docs/src/main/paradox/reference.md | 14 +- .../src/main/python/docs/__init__.py | 11 +- .../src/main/python/docs/spark-ml.pymd | 126 ++++++++++-------- 3 files changed, 89 insertions(+), 62 deletions(-) diff --git a/docs/src/main/paradox/reference.md b/docs/src/main/paradox/reference.md index 492773a7d..a8874f7e0 100644 --- a/docs/src/main/paradox/reference.md +++ b/docs/src/main/paradox/reference.md @@ -85,17 +85,23 @@ Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. Get the cell type of the `tile`. The cell type can be changed with @ref:[rf_convert_cell_type](reference.md#rf-convert-cell-type). +#### rf_tile + + Tile rf_tile(ProjectedRasterTile proj_raster) + +Get the `tile` from the `ProjectedRasterTile` or `RasterSource` type tile column. + #### rf_extent - Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(ProjectedRasterTile raster) - Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(RasterSource raster) + Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(ProjectedRasterTile proj_raster) + Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(RasterSource proj_raster) Fetches the extent (bounding box or envelope) of a `ProjectedRasterTile` or `RasterSource` type tile columns. #### rf_crs - Struct[String] rf_crs(ProjectedRasterTile raster) - Struct[String] rf_crs(RasterSource raster) + Struct[String] rf_crs(ProjectedRasterTile proj_raster) + Struct[String] rf_crs(RasterSource proj_raster) Fetch the [proj4](https://proj4.org/) string representation of the coordinate reference system of a `ProjectedRasterTile` or `RasterSource` type tile columns. diff --git a/pyrasterframes/src/main/python/docs/__init__.py b/pyrasterframes/src/main/python/docs/__init__.py index 3172f8410..01478ecd5 100644 --- a/pyrasterframes/src/main/python/docs/__init__.py +++ b/pyrasterframes/src/main/python/docs/__init__.py @@ -1,10 +1,13 @@ import os -__all__ = ["resource_dir"] - # This is temporary until we port to run on web assets. def resource_dir(): here = os.path.dirname(os.path.realpath(__file__)) - scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) - return os.path.realpath(os.path.join(scala_target, 'test-classes')) + test_resource = os.path.realpath(os.path.join(here, '..', '..', '..', 'src', 'test', 'resources')) + + return test_resource + + +def resource_dir_uri(): + return 'file://' + resource_dir() diff --git a/pyrasterframes/src/main/python/docs/spark-ml.pymd b/pyrasterframes/src/main/python/docs/spark-ml.pymd index ed36dc317..d6456436c 100644 --- a/pyrasterframes/src/main/python/docs/spark-ml.pymd +++ b/pyrasterframes/src/main/python/docs/spark-ml.pymd @@ -1,87 +1,100 @@ -# Spark ML Support +# Machine Learning with RasterFrames -## Clustering +RasterFrames provides access to train and predict with a wide variety of machine learning models through [Spark ML Pipelines](https://spark.apache.org/docs/latest/ml-guide.html). This library provides a variety of pipeline components for supervised learning, unsupervised learning, and data preparation that can be used to repeatably represent a variety of tasks in machine learning. + +In this example we will demonstrate how to fit and score an unsupervised learning model with a [sample of Landsat 8 data](https://github.com/locationtech/rasterframes/tree/develop/pyrasterframes/src/test/resources). + +## Imports and Data Preparation ```python, echo=False -from docs import * -from pyrasterframes import TileExploder +from IPython.core.display import display +from docs import resource_dir_uri from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes.rasterfunctions import rf_assemble_tile - -from pyspark.ml.feature import VectorAssembler -from pyspark.ml.clustering import KMeans -from pyspark.ml import Pipeline import os spark = create_rf_spark_session() + +import pandas as pd ``` -The first step is to load multiple bands of imagery and construct -a single RasterFrame from them. +We import various Spark components that we need to construct our Pipeline. -```python -filenamePattern = "L8-B{}-Elkton-VA.tiff" -bandNumbers = range(1, 8) -bandColNames = list(map(lambda n: 'band_{}'.format(n), bandNumbers)) -``` +```python, echo=True +from pyrasterframes import TileExploder +from pyrasterframes.rasterfunctions import rf_assemble_tile, rf_crs, rf_extent, rf_tile, rf_dimensions -For each identified band, load the associated image file: +from pyspark.ml.feature import VectorAssembler +from pyspark.ml.clustering import KMeans +from pyspark.ml import Pipeline -```python, term=True -# TODO: rewrite using `rastersource`. -from functools import reduce -joinedRF = reduce(lambda rf1, rf2: rf1.asRF().spatialJoin(rf2.drop('bounds').drop('metadata').drop('extent').drop('crs')), - map(lambda bf: spark.read.geotiff(bf[1]) - .withColumnRenamed('tile', 'band_{}'.format(bf[0])), - map(lambda b: (b, os.path.join(resource_dir(), filenamePattern.format(b))), bandNumbers))) ``` -We should see a single spatial_key column along with columns of tiles. +The first step is to create a Spark DataFrame of our imagery data. To achieve that we will create a catalog DataFrame using the pattern from [the I/O page](raster-io.html#Single-Scene--Multiple-Bands). In the catalog, each row represents a distinct area and time; and each column is the URI to a band's image product. The function `resource_dir` gives a local file system path to the sample Landsat data. The resulting Spark DataFrame may have many rows per URI, with a column corresponding to each band. -```python -joinedRF.printSchema() + +```python, term=True +filenamePattern = "L8-B{}-Elkton-VA.tiff" +catalog_df = pd.DataFrame([ + {'b' + str(b): os.path.join(resource_dir_uri(), filenamePattern.format(b)) for b in range(1, 8)} +]) +df = spark.read.rastersource(catalog=catalog_df.to_csv(index=None), catalog_col_names=catalog_df.columns) +df = df.select( + rf_crs(df.b1).alias('crs'), + rf_extent(df.b1).alias('extent'), + rf_tile(df.b1).alias('b1'), + rf_tile(df.b2).alias('b2'), + rf_tile(df.b3).alias('b3'), + rf_tile(df.b4).alias('b4'), + rf_tile(df.b5).alias('b5'), + rf_tile(df.b6).alias('b6'), + rf_tile(df.b7).alias('b7'), +) +df.printSchema() ``` -SparkML requires that each observation be in its own row, and those -observations be packed into a single `Vector`. The first step is to -"explode" the tiles into a single row per cell/pixel +## Create ML Pipeline + +SparkML requires that each observation be in its own row, and features for each +observation be packed into a single `Vector`. For this unsupervised learning problem, we will treat each _pixel_ as an observation and use one feature per band. The first step is to +"explode" the tiles into a single row per pixel. In the scala API a pixel is called a `cell`. ```python exploder = TileExploder() ``` -To "vectorize" the the band columns we use the SparkML `VectorAssembler` +To "vectorize" the the band columns we use the SparkML `VectorAssembler`. We use each of the seven bands for a different feature. ```python assembler = VectorAssembler() \ - .setInputCols(bandColNames) \ + .setInputCols(list(catalog_df.columns)) \ .setOutputCol("features") ``` -Configure our clustering algorithm +Configure our clustering algorithm. ```python -k = 5 -kmeans = KMeans().setK(k) +kmeans = KMeans().setK(5).setFeaturesCol('features') ``` -Combine the two stages +Combine the stages into a single pipeline. ```python pipeline = Pipeline().setStages([exploder, assembler, kmeans]) ``` -Compute clusters +## Fit the Model and Score + +Fit the pipeline; this actually executes exploding the tiles, assembling the `Vector`s, and fitting the k-means clustering. ```python -model = pipeline.fit(joinedRF) +model = pipeline.fit(df) ``` -Run the data through the model to assign cluster IDs to each +Score the training data in the fitted pipeline model. This will add a column called `prediction` with the closest cluster identifier. ```python -clustered = model.transform(joinedRF) +clustered = model.transform(df) clustered.show(8) ``` @@ -89,29 +102,34 @@ If we want to inspect the model statistics, the SparkML API requires us to go through this unfortunate contortion: ```python -clusterResults = list(filter(lambda x: str(x).startswith('KMeans'), model.stages))[0] +cluster_stage = model.stages[2] ``` -Compute sum of squared distances of points to their nearest center +Compute sum of squared distances of points to their nearest center. This is elemental to most of the cluster quality metrics. ```python -metric = clusterResults.computeCost(clustered) +metric = cluster_stage.computeCost(clustered) print("Within set sum of squared errors: %s" % metric) +``` -tlm = joinedRF.tileLayerMetadata() -layout = tlm['layoutDefinition']['tileLayout'] +## Visualize Prediction -retiled = clustered.groupBy('spatial_key').agg( - rf_assemble_tile('column_index', 'row_index', 'prediction', - layout['tileCols'], layout['tileRows'], 'int8') +We can recreate the tiled data structure using the metadata added by the `TileExploder` pipeline stage. + +```python +tile_dims = df.select(rf_dimensions(df.b1).alias('dims')).first()['dims'] +retiled = clustered.groupBy('extent', 'crs') \ + .agg( + rf_assemble_tile('column_index', 'row_index', 'prediction', + tile_dims['cols'], tile_dims['rows'], 'int8').alias('prediction') ) -rf = retiled.asRF('spatial_key', tlm) -rf.printSchema() -rf.show() +retiled.printSchema() +retiled.show() ``` +Take a look at the resulting output. -```python, echo=False -spark.stop() -``` \ No newline at end of file +```python +display(retiled.select('prediction').first()['prediction']) +``` From 41ca73bbfbc50a96d7c0ad95221714e356a29ebb Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 26 Jun 2019 19:54:06 -0400 Subject: [PATCH 191/380] Attempted CircleCI fix. --- project/PythonBuildPlugin.scala | 1 + 1 file changed, 1 insertion(+) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 22a67dcf4..71d66b076 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -95,6 +95,7 @@ object PythonBuildPlugin extends AutoPlugin { pythonCommand := "python", pySetup := { val s = streams.value + val _ = copyPySources.value val wd = (Python / target).value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args From 67d86a9cbe34315038086960fb2f8356781b7842 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 26 Jun 2019 20:40:09 -0400 Subject: [PATCH 192/380] More CircleCI hacking for Python build. --- .circleci/config.yml | 4 +++- pyrasterframes/src/main/python/requirements.txt | 1 + 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c9ca203b0..96a1461dd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -69,7 +69,9 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get update && sudo apt-get install -y python-pip pandoc && pip install setuptools # required for pyrasterframes testing + - run: sudo apt-get update && sudo apt-get install -y python3 python3-pip + - run: sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1 + - run: pip3 install ipython==6.2.1 - run: cat /dev/null | sbt test - run: *unsetenv diff --git a/pyrasterframes/src/main/python/requirements.txt b/pyrasterframes/src/main/python/requirements.txt index 9ce9fb620..84a79d5c8 100644 --- a/pyrasterframes/src/main/python/requirements.txt +++ b/pyrasterframes/src/main/python/requirements.txt @@ -4,3 +4,4 @@ pyspark==2.3.3 # See issue # 154 numpy>=1.7 pandas matplotlib<3.0.0 # no python 2.7 support after v2.x.x +ipython==6.2.1 From 40bcbd76167f298dab267617138aca261f23b5b8 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 27 Jun 2019 09:02:14 -0400 Subject: [PATCH 193/380] Fixed image link. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c074e0a0e..4f96ade94 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ _RasterFrames™_ brings the power of Spark DataFrames to geospatial raster data, empowered by the map algebra and tile layer operations of [GeoTrellis](https://geotrellis.io/). - + Please see the [Getting Started](http://rasterframes.io/getting-started.html) section of the Users' Manual to start using RasterFrames. From 80cd7408f394719ddd61ebd5d3d4ccb21b382304 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 27 Jun 2019 09:04:09 -0400 Subject: [PATCH 194/380] Updated pyrasterframes README link. --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4f96ade94..fa878e5b1 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,7 @@ The documentation may be built with sbt makeSite ``` -The `pyrasterframes` build instructions are located [pyrasterframes/python/README.rst](pyrasterframes/python/README.rst) +The `pyrasterframes` build instructions are located at [pyrasterframes/src/main/python/README.md](pyrasterframes/src/main/python/README.md) ## Copyright and License From bf7ca2f90e103d3d9c3e4ff9360731062313dbfd Mon Sep 17 00:00:00 2001 From: Phil Varner Date: Thu, 27 Jun 2019 11:27:13 -0400 Subject: [PATCH 195/380] Update build image to only python 3 exists Signed-off-by: Phil Varner --- .circleci/config.yml | 4 ---- build/circleci/Dockerfile | 15 +++++++++++---- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 96a1461dd..431dcb2ac 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -69,9 +69,6 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get update && sudo apt-get install -y python3 python3-pip - - run: sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1 - - run: pip3 install ipython==6.2.1 - run: cat /dev/null | sbt test - run: *unsetenv @@ -87,7 +84,6 @@ jobs: - restore_cache: <<: *restore_cache - - run: sudo apt-get update && sudo apt-get install -y python-pip pandoc && pip install setuptools # required for pyrasterframes testing - run: cat /dev/null | sbt test - run: cat /dev/null | sbt publish diff --git a/build/circleci/Dockerfile b/build/circleci/Dockerfile index 0eb8bb522..334c1b15f 100644 --- a/build/circleci/Dockerfile +++ b/build/circleci/Dockerfile @@ -7,8 +7,13 @@ ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/ # most of these libraries required for # python-pip pandoc && pip install setuptools => required for pyrasterframes testing RUN sudo apt-get update && \ - sudo apt-get install -y \ - python-pip pandoc \ + sudo apt remove \ + python python-minimal python2.7 python2.7-minimal \ + libpython-stdlib libpython2.7 libpython2.7-minimal libpython2.7-stdlib \ + && sudo apt-get install -y \ + python3 \ + python3-pip \ + pandoc \ wget \ gcc g++ build-essential \ libcurl4-gnutls-dev \ @@ -22,8 +27,10 @@ RUN sudo apt-get update && \ libpng-dev \ swig \ ant \ - && sudo apt-get clean all \ - && pip install setuptools + && sudo apt autoremove \ + && sudo apt-get clean all \ + && pip3 install setuptools ipython==6.2.1 \ + && sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 1 # install OpenJPEG RUN cd /tmp && \ From 9f69cc6ba059b8f7d1d3b8d413d41be7f2977cfc Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 27 Jun 2019 16:51:01 -0400 Subject: [PATCH 196/380] Docs for local algebra demo Signed-off-by: Jason T. Brown --- .../src/main/python/docs/local-algebra.pymd | 66 +++++++++++++++---- 1 file changed, 55 insertions(+), 11 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index a281ce1a2..ce494f84e 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -1,27 +1,71 @@ -# Local Algebra ```python, echo=False -from docs import * +from IPython.core.display import display from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes.rasterfunctions import * -from pyspark.sql import * +from pyrasterframes.rasterfunctions import rf_normalized_difference, rf_tile, rf_dimensions, rf_extent, rf_tile_mean + +import pandas as pd import os + spark = create_rf_spark_session() ``` +# Local Map Algebra + +[Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single `tile`, between a `tile` and a scalar, between two `tile`s, or among many `tile`s. These operations are common in processing of earth observation and other image data. + + ## Computing NDVI +Here’s an example of computing the Normalized Differential Vegetation Index (NDVI). NDVI is a vegetation index which emphasizes differences in relative biomass and vegetation health. The term _index_ in Earth observation means a combination of many raster bands into a single band that highlights a phenomenon of interest. Various indexes have proven useful visual tools and frequently appear as features in machine learning models using Earth observation data. + +> NDVI is often used worldwide to monitor drought, monitor and predict agricultural production, assist in predicting hazardous fire zones, and map desert encroachment. The NDVI is preferred for global vegetation monitoring because it helps to compensate for changing illumination conditions, surface slope, aspect, and other extraneous factors (Lillesand. _Remote sensing and image interpretation_. 2004) + +### Create DataFrame + +We will use the @ref:[catalog pattern](raster-io.md) for data access. To compute NDVI we need to compute local algebra on the *red* and *near infrared* bands: `(n - r) / (n + r)`. This form of `(x - y) / (x + y)` is common in remote sensing and is called a normalized difference. It is used with other band pairs to highlight water, snow, and other phenomena. + ```python, term=True -# TODO: rewrite to use `rastersource` -redBand = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B4-Elkton-VA.tiff')).withColumnRenamed('tile', 'red_band') -nirBand = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B5-Elkton-VA.tiff')).withColumnRenamed('tile', 'nir_band') +bands = {4: 'red', 8: 'nir'} +uri_pattern = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B0{}.tif' +catalog_df = pd.DataFrame([ + {bands[b_num]: uri_pattern.format(b_num) for b_num in bands.keys()} +]) +df = spark.read.rastersource(catalog=catalog_df.to_csv(index=None), + catalog_col_names=list(catalog_df.columns)) +df.printSchema() +``` + +Observe how the bands we need to use to compute the index are arranged as columns of our resulting DataFrame. The rows or observations are various spatial extents within the entire coverage area. + +### Local Map Algebra + +RasterFrames provides a wide variety of local map algebra functions. There are several different broad categories, based on how many tiles the function takes as input: + + * A function on a single Tile is a unary operation; example: @ref:[rf_log](reference.md#rf-log); + * A function on two Tiles is a binary operation; example: @ref:[rf_local_multiply](reference.md#rf-local-multiply); + * A function on a Tile and a scalar is a binary operation; example: @ref:[rf_local_less](reference.md#rf-local-less); or + * A function on many Tiles is a n-ary operation; example: @ref:[rf_agg_local_min](reference.md#rf-agg-local-min) + +We can express the normalized difference with a combination of `rf_local_divide`, `rf_local_subtract`, and `rf_local_add`. Since the normalized difference is so common there is a convenience method `rf_normalized_difference` which we use in this example. We will append a new column to the DataFrame, which will apply the map alegbra function to each row. + +```python +df = df.withColumn('ndvi', rf_normalized_difference(df.nir, df.red)) +df.printSchema() +``` -rf = redBand.asRF().spatialJoin(nirBand.asRF()) \ - .withColumn("ndvi", rf_normalized_difference('red_band', 'nir_band')) -rf.printSchema() -rf.show(20, truncate=False) +We can inspect a small sample of the data. The yellow values are areas of healthy vegetation and the purple areas are bare soil or impervious surfaces. +```python +ndvi_tiles = df.sort(-rf_tile_mean('ndvi')) \ + .select(rf_tile('ndvi').alias('ndvi')) \ + .take(5) +for r in ndvi_tiles: + display(r['ndvi']) +#display( +# df.select(rf_extent('ndvi'), rf_tile('ndvi')).toPandas() +#) ``` From d7ac696c09b61986e1686bbb375145ba351a52c6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 28 Jun 2019 09:15:31 -0400 Subject: [PATCH 197/380] Extended unit test to trigger #166. --- .../datasource/rastersource/RasterSourceDataSourceSpec.scala | 3 +++ 1 file changed, 3 insertions(+) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala index 7b2360f31..b145fe129 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala @@ -188,6 +188,9 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.schema.size should be(6) df.tileColumns.size should be (3) df.select($"B1_path").distinct().count() should be (1) + + val diffStats = df.select(rf_tile_stats($"B1") =!= rf_tile_stats($"B2")).as[Boolean].collect() + diffStats.forall(identity) should be(true) } } } From 24e0ae7d52f964d2e2fa93e46e490842f1b8c43e Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 28 Jun 2019 11:31:51 -0400 Subject: [PATCH 198/380] Thou shall not use `map` with side effects. --- .../transformers/RasterSourceToRasterRefs.scala | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index 7ba2bb13d..dd8ac7ca8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -36,6 +36,7 @@ import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRast import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} +import scala.util.Try import scala.util.control.NonFatal /** @@ -63,10 +64,9 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[ if (b < src.bandCount) RasterRef(src, b, e) else null override def eval(input: InternalRow): TraversableOnce[InternalRow] = { - var src: RasterSource = null try { val refs = children.map { child ⇒ - src = RasterSourceType.deserialize(child.eval(input)) + val src = RasterSourceType.deserialize(child.eval(input)) subtileDims.map(dims => src .layoutExtents(dims) @@ -78,8 +78,8 @@ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[ } catch { case NonFatal(ex) ⇒ - val payload = if (src == null) input else src - logger.error("Error fetching data for " + payload, ex) + val payload = Try(children.map(c => RasterSourceType.deserialize(c.eval(input)))).toOption.toSeq.flatten + logger.error("Error fetching data for one of: " + payload.mkString(", "), ex) Traversable.empty } } From ffd4da6b9b26f5f2cd1f7bd57240251ef6f4ccac Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 28 Jun 2019 12:50:48 -0400 Subject: [PATCH 199/380] Update getting started docs and related Signed-off-by: Jason T. Brown --- docs/src/main/paradox/reference.md | 18 +- pyrasterframes/src/main/python/README.md | 8 +- .../src/main/python/docs/__init__.py | 2 + .../src/main/python/docs/getting-started.pymd | 97 ++-- pyrasterframes/src/main/python/docs/index.md | 10 +- .../src/main/python/docs/local-algebra.pymd | 19 +- .../src/main/python/docs/raster-io.pymd | 10 +- .../src/main/python/docs/raster-processing.md | 12 +- .../src/main/python/docs/time-series.pymd | 5 +- rf-notebook/src/main/docker/Dockerfile | 2 +- .../src/main/notebooks/Getting Started.ipynb | 504 ++++++++---------- 11 files changed, 335 insertions(+), 352 deletions(-) diff --git a/docs/src/main/paradox/reference.md b/docs/src/main/paradox/reference.md index a8874f7e0..3d4d41cbf 100644 --- a/docs/src/main/paradox/reference.md +++ b/docs/src/main/paradox/reference.md @@ -1,10 +1,6 @@ # Function Reference -For the most up to date list of User Defined Functions using Tiles, look at API documentation for @scaladoc[`RasterFunctions`][RasterFunctions]. - -The full Scala API documentation can be found [here][scaladoc]. - -RasterFrames also provides SQL and Python bindings to many UDFs using the `Tile` column type. In Spark SQL, the functions are already registered in the SQL engine; they are usually prefixed with `rf_`. In Python, they are available in the `pyrasterframes.rasterfunctions` module. +RasterFrames provides SQL and Python bindings to many UDFs using the `Tile` column type. In Spark SQL, the functions are already registered in the SQL engine; they are usually prefixed with `rf_`. In Python, they are available in the `pyrasterframes.rasterfunctions` module. The convention in this document will be to define the function signature as below, with its return type, the function name, and named arguments with their types. @@ -12,6 +8,8 @@ The convention in this document will be to define the function signature as belo ReturnDataType function_name(InputDataType argument1, InputDataType argument2) ``` +For the Scala documentation on these functions, see @scaladoc[`RasterFunctions`][RasterFunctions]. The full Scala API documentation can be found [here][scaladoc]. + ## List of Available SQL and Python Functions @@toc { depth=3 } @@ -40,7 +38,7 @@ See also GeoMesa [st_envelope](https://www.geomesa.org/documentation/user/spark/ #### st_geometry - Geometry st_extent(Struct[Double xmin, Double xmax, Double ymin, Double ymax] extent) + Geometry st_geometry(Struct[Double xmin, Double xmax, Double ymin, Double ymax] extent) Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`](reference.md#st-extent) or @ref:[`rf_extent`](reference.md#rf-extent). @@ -253,11 +251,11 @@ The `no_data_value` argument is a literal Double, not a Column expression. If input `tile` had a nodata value already, the behaviour depends on if its cell type is floating point or not. For floating point cell type `tile`, nodata values on the input `tile` remain nodata values on the output. For integral cell type `tile`s, the previous nodata values become literal values. -### Map Algebra +### Local Map Algebra -[Map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations between a `tile` and a scalar, between two `tile`s, or among many `tile`s. +[Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single tile (unary), between a `tile` and a scalar, between two `tile`s, or across many `tile`s. -Some of these functions have similar variations in the Python API: +The binary local map algebra functions have similar variations in the Python API depending on the left hand side type: - `rf_local_op`: applies `op` to two columns; the right hand side can be a `tile` or a numeric column. - `rf_local_op_double`: applies `op` to a `tile` and a literal scalar, coercing the `tile` to a floating point type @@ -265,6 +263,8 @@ Some of these functions have similar variations in the Python API: The SQL API does not require the `rf_local_op_double` or `rf_local_op_int` forms (just `rf_local_op`). +Local map algebra operations for more than two tiles are implemented to work across rows in the data frame. As such, they are @ref:[aggregate functions](reference.md#tile-local-aggregate-statistics). + #### rf_local_add Tile rf_local_add(Tile tile1, Tile rhs) diff --git a/pyrasterframes/src/main/python/README.md b/pyrasterframes/src/main/python/README.md index 9b6688656..1ccfcb0d3 100644 --- a/pyrasterframes/src/main/python/README.md +++ b/pyrasterframes/src/main/python/README.md @@ -4,12 +4,7 @@ PyRasterFrames enables access and processing of geospatial raster data in PySpar ## Getting started -### Prerequisites - -1. [`pip`](https://pip.pypa.io/en/stable/installing/) -2. ['pyspark`](https://pypi.org/project/pyspark/) > 2.3.2 - -The quickest way to get started is to `pip` install the pyrasterframes package. +The quickest way to get started is to [`pip`](https://pip.pypa.io/en/stable/installing/) install the pyrasterframes package. ```bash pip install pyrasterframes @@ -33,7 +28,6 @@ df = spark.read.rastersource('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/ df.select(rf_local_add(df.tile, lit(3))).show(5, False) ``` - ## Support Reach out to us on [gitter](https://gitter.im/s22s/raster-frames)! diff --git a/pyrasterframes/src/main/python/docs/__init__.py b/pyrasterframes/src/main/python/docs/__init__.py index 01478ecd5..a1949f49c 100644 --- a/pyrasterframes/src/main/python/docs/__init__.py +++ b/pyrasterframes/src/main/python/docs/__init__.py @@ -3,6 +3,8 @@ # This is temporary until we port to run on web assets. def resource_dir(): + # we may consider using gitpython which I think would be appropriate in the context of building docs + # see https://stackoverflow.com/a/41920796/2787937 here = os.path.dirname(os.path.realpath(__file__)) test_resource = os.path.realpath(os.path.join(here, '..', '..', '..', 'src', 'test', 'resources')) diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index b6620a0d4..c720a7f16 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -1,16 +1,69 @@ # Getting Started +There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames. Let's start with the simplest. Python 3.6 or greater is recommended. -There are a number of ways to use PyRasterFrames: +```bash +$ python3 -m pip install pyrasterframes +``` + +Then in a python interpreter of your choice, you can get a [`pyspark` `SparkSession`](https://spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.SparkSession) using the [`local[*]` master](https://spark.apache.org/docs/latest/submitting-applications.html#master-urls). + +```python +import pyrasterframes +spark = pyrasterframes.get_spark_session() +``` + +Then you can read a raster and work with it in a Spark DataFrame. + +```python +from pyrasterframes.rasterfunctions import rf_local_add +from pyspark.sql.functions import lit + +# Read a MODIS surface reflectance granule +df = spark.read.rastersource('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF') + +# Add 3 element-wise, show some rows of the dataframe +df.select(rf_local_add(df.proj_raster, lit(3))).show(5, False) + +``` + +This example is extended in the [getting started Jupyter notebook](https://nbviewer.jupyter.org/github/locationtech/rasterframes/blob/develop/rf-notebook/src/main/notebooks/Getting%20Started.ipynb). + +To understand more about how and why RasterFrames represents Earth observation in DataFrames, read the project @ref:[description](description.md). For more hands-on examples, see the chapters about @ref:[reading](raster-io.md) and @ref:[processing](raster-processing.md) with RasterFrames. + +## Raster Functions + +To import RasterFrames functions into the environment, import from `pyrasterframes.rasterfunctions`. + +```python +from pyrasterframes.rasterfunctions import * +``` + +Functions starting with `rf_`, which are for raster, and `st_`, which are for vector geometry, +become available for use with DataFrames. See the complete @ref:[function reference](reference.md). + +```python +[fn for fn in dir() if fn.startswith('rf_') or fn.startswith('st_')] +``` + +## Other Options +You can also use RasterFrames in the following environments: + +1. Jupyter Notebook 1. `pyspark` shell -2. Jupyter Notebook -3. Standalone Python Script -## `pyspark` shell +### Jupyter Notebook + +**TODO** User facing quick instructions e.g. how to pull and run docker hub hosted container + +See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook/README.md) for instructions on running a Jupyter notebook server within a Docker container that has a fully set up environment. +### `pyspark` shell or app -To manually initialize PyRasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. See below for how to build or download those artifacts. +To initialize RasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. + +**TODO** how to build or download those artifacts. ```bash pyspark \ @@ -19,10 +72,9 @@ To manually initialize PyRasterFrames in a `pyspark` shell, prepare to call pysp --conf spark.kryoserializer.buffer.max=500m \ --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip - ``` -Then in the pyspark shell or app, import the module and call `withRasterFrames` on the SparkSession. +Then in the pyspark shell, import the module and call `withRasterFrames` on the SparkSession. ```python, evaluate=False import pyrasterframes @@ -30,36 +82,11 @@ spark = spark.withRasterFrames() df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') ``` -## Jupyter Notebook - -See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook)/README.md - -## Standalone Python Script - -RasterFrames requires some special configuration to Spark to be fully functional. As a convenience you can use a provided utility function to get a preconfigured Spark session: - -The first step is to set up a `SparkSession`: - -```python -from pyspark.sql import SparkSession -from pyrasterframes.utils import create_rf_spark_session -spark = create_rf_spark_session() -``` - -Now we have a standard Spark session with RasterFrames enabled in it. -To import RasterFrames functions into the environment, use: - -```python -from pyrasterframes.rasterfunctions import * -``` - -Functions starting with `rf_` (raster-oriented) or `st_` (vector geometry-oriented) are -become available for use with DataFrames. +Now you have the configured SparkSession with RasterFrames enabled. -```python -list(filter(lambda x: x.startswith("rf_") or x.startswith("st_"), dir())) -``` ```python, echo=False spark.stop() ``` + + diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index f92aae9ed..abd890ea6 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -25,9 +25,9 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi ## Related Links * [Gitter Channel](https://gitter.im/s22s/raster-frames)  [![Join the chat at https://gitter.im/s22s/raster-frames](https://badges.gitter.im/s22s/raster-frames.svg)](https://gitter.im/s22s/raster-frames?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -* [API Documentation](latest/api/index.html) +* [Scala API Documentation](latest/api/index.html) * [GitHub Repository](https://github.com/locationtech/rasterframes) -* [Astraea, Inc.](http://www.astraea.earth/) (the company behind RasterFrames) +* [Astraea, Inc.](http://www.astraea.earth/), the company behind RasterFrames @@@ @@ -43,12 +43,8 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi * [Raster Data I/O](raster-io.md) * [Spatial Relations](spatial-relations.md) * [Raster Processing](raster-processing.md) -* [Pandas & NumPy Interoperabiliyt](pandas-numpy.md) +* [Pandas, NumPy & RasterFrames](pandas-numpy.md) * [UDF Reference](reference.md) * [Release Notes](release-notes.md) @@@ - - -Raster processing -Installation diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index ce494f84e..a03a7f4ea 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -1,13 +1,13 @@ ```python, echo=False -from IPython.core.display import display +from IPython.core.display import display, HTML from pyrasterframes.utils import create_rf_spark_session from pyrasterframes.rasterfunctions import rf_normalized_difference, rf_tile, rf_dimensions, rf_extent, rf_tile_mean +import pyrasterframes.rf_ipython import pandas as pd import os - spark = create_rf_spark_session() ``` @@ -55,19 +55,16 @@ df = df.withColumn('ndvi', rf_normalized_difference(df.nir, df.red)) df.printSchema() ``` -We can inspect a small sample of the data. The yellow values are areas of healthy vegetation and the purple areas are bare soil or impervious surfaces. +We can inspect a sample of the data. Yellow indicates very healthy vegetation, and purple represents bare soil or impervious surfaces. ```python -ndvi_tiles = df.sort(-rf_tile_mean('ndvi')) \ - .select(rf_tile('ndvi').alias('ndvi')) \ - .take(5) -for r in ndvi_tiles: - display(r['ndvi']) -#display( -# df.select(rf_extent('ndvi'), rf_tile('ndvi')).toPandas() -#) +df.select(rf_tile('ndvi').alias('ndvi')).limit(5).toPandas() ``` +**TODO** fix the display once issue #166 fix. + +We continue examining NDVI in the @ref:[time series](time-series.md) section. + ```python, echo=False spark.stop() diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 39ede7d21..4a8c2ae66 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -29,7 +29,7 @@ rf = spark.read.rastersource(s2_band(2)) rf.printSchema() ``` -[[Discuss the schema]] +\[Discuss the schema\] Let's unpack the `proj_raster` column and look at the contents in more detail. @@ -46,12 +46,12 @@ parts.show(5) ``` -Let's elect a single tile and view it. +Let's select a single tile and view it. ```python -tile = rf.select(rf_tile("proj_raster")).first() -# TODO: IPython rendering -print(tile) +tile = rf.select(rf_tile("proj_raster")).first()[0] +display(tile) +# todo verify its chilly ``` diff --git a/pyrasterframes/src/main/python/docs/raster-processing.md b/pyrasterframes/src/main/python/docs/raster-processing.md index 0d3189c66..3ac4c8ac4 100644 --- a/pyrasterframes/src/main/python/docs/raster-processing.md +++ b/pyrasterframes/src/main/python/docs/raster-processing.md @@ -2,11 +2,13 @@ @@@ index -* [Local Algebra](local-algebra.md) -* ["NoData" Handling](nodata-handling.md) -* [Aggregation](aggregation.md) -* [Time Series](time-series.md) -* [Spark ML](spark-ml.md) +* @ref:[Local Algebra](local-algebra.md) +* @ref:["NoData" Handling](nodata-handling.md) +* @ref:[Aggregation](aggregation.md) +* @ref:[Time Series](time-series.md) +* @ref:[Machine Learning](spark-ml.md) @@@ + +Explore what you can do with RasterFrames to work with, analyze, manipulate, and summarize Earth observation data. diff --git a/pyrasterframes/src/main/python/docs/time-series.pymd b/pyrasterframes/src/main/python/docs/time-series.pymd index 90587a9a6..304f05a9d 100644 --- a/pyrasterframes/src/main/python/docs/time-series.pymd +++ b/pyrasterframes/src/main/python/docs/time-series.pymd @@ -1 +1,4 @@ -# Time Series \ No newline at end of file +# Time Series + +/[ Example of generating time series of NDVI as visual phenology indicators. /] + diff --git a/rf-notebook/src/main/docker/Dockerfile b/rf-notebook/src/main/docker/Dockerfile index db7e4570a..cf9b54ba7 100644 --- a/rf-notebook/src/main/docker/Dockerfile +++ b/rf-notebook/src/main/docker/Dockerfile @@ -21,7 +21,7 @@ ENV PYTHONPATH $PYTHONPATH:$PY_RF_ZIP # Sphinx (for Notebook->html) RUN conda install --quiet --yes \ - anaconda sphinx nbsphinx shapely numpy + anaconda sphinx nbsphinx shapely numpy folium geopandas geojsonio # Cleanup pip residuals RUN rm -rf /home/$NB_USER/.local && \ diff --git a/rf-notebook/src/main/notebooks/Getting Started.ipynb b/rf-notebook/src/main/notebooks/Getting Started.ipynb index 9b164ad0e..b2d49d5df 100644 --- a/rf-notebook/src/main/notebooks/Getting Started.ipynb +++ b/rf-notebook/src/main/notebooks/Getting Started.ipynb @@ -17,82 +17,131 @@ { "cell_type": "code", "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import pyrasterframes\n", + "import pyrasterframes.rf_ipython # enables nicer visualizations of pandas DF\n", + "from pyrasterframes.rasterfunctions import (rf_local_add, rf_dimensions, rf_extent, rf_crs, \n", + " st_geometry, st_reproject, rf_tile)\n", + "import pyspark.sql.functions as F" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "metadata": { "scrolled": false }, + "outputs": [], + "source": [ + "spark = pyrasterframes.get_spark_session()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Get a PySpark DataFrame from [open data](https://docs.opendata.aws/modis-pds/readme.html)\n", + "\n", + "Read a single \"granule\" of MODIS surface reflectance data. " + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "uri = 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059' \\\n", + " '/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF'\n", + "df = spark.read.rastersource(uri)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, "outputs": [ { - "data": { - "text/html": [ - "\n", - "
    \n", - "

    SparkSession - in-memory

    \n", - " \n", - "
    \n", - "

    SparkContext

    \n", - "\n", - "

    Spark UI

    \n", - "\n", - "
    \n", - "
    Version
    \n", - "
    v2.3.3
    \n", - "
    Master
    \n", - "
    local[*]
    \n", - "
    AppName
    \n", - "
    PyRasterFrames
    \n", - "
    \n", - "
    \n", - " \n", - "
    \n", - " " - ], - "text/plain": [ - "" - ] - }, - "execution_count": 1, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "root\n", + " |-- proj_raster_path: string (nullable = false)\n", + " |-- proj_raster: struct (nullable = true)\n", + " | |-- tile_context: struct (nullable = false)\n", + " | | |-- extent: struct (nullable = false)\n", + " | | | |-- xmin: double (nullable = false)\n", + " | | | |-- ymin: double (nullable = false)\n", + " | | | |-- xmax: double (nullable = false)\n", + " | | | |-- ymax: double (nullable = false)\n", + " | | |-- crs: struct (nullable = false)\n", + " | | | |-- crsProj4: string (nullable = false)\n", + " | |-- tile: tile (nullable = false)\n", + "\n" + ] } ], "source": [ - "import pyrasterframes\n", - "import pyrasterframes.rf_ipython # enables nicer visualizations\n", - "spark = pyrasterframes.get_spark_session()\n", - "spark" + "df.printSchema()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "### Get a PySpark DataFrame from [open data](https://landsatonaws.com/)" + "Do some work with the raster data; add 3 element-wise to the pixel/cell values and show some rows of the DataFrame." ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 5, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|rf_local_add(proj_raster, 3) |\n", + "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|[[[-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [3408,3471,3110,2875,2798,2973,3255,3169,3,3217,...,3,3,3,3,3,3,3,2519,3036,3]]] |\n", + "|[[[-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [2337,2346,2581,2751,2575,2364,2223,2384,2618,2296,...,3,3,2688,2702,2967,3200,3257,3052,2914,2534]]] |\n", + "|[[[-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (257,256), [2602,2728,2784,2781,2567,2539,2254,2327,2436,2888,...,2726,2695,2788,2898,3139,3121,2939,2778,2859,2728]]]|\n", + "|[[[-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [3058,3163,3036,3228,2877,3310,2885,2932,2931,2940,...,2299,2190,2180,2441,2563,2431,2347,2414,2525,2778]]] |\n", + "|[[[-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (257,256), [3238,3355,3502,3055,3343,3334,3,3,3,3,...,2629,2841,2983,2839,3107,2762,2524,3175,3190,3181]]] |\n", + "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 5 rows\n", + "\n" + ] + } + ], "source": [ - "uri = 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/041/'\\\n", - " 'LC08_L1TP_015041_20190305_20190309_01_T1/'\\\n", - " 'LC08_L1TP_015041_20190305_20190309_01_T1_B2.TIF'\n", - "df = spark.read.rastersource(uri)" + "df.select(rf_local_add(df.proj_raster, F.lit(3))).show(5, False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The extent struct tells us where in the [CRS](https://spatialreference.org/ref/sr-org/6842/) the tile data covers. The granule is split into arbitrary sized chunks. Each row is a different chunk. Let's see how many.\n", + "\n", + "Side note: you can configure the default size of these chunks, which are called Tiles, by passing a tuple of desired columns and rows as: `rastersource(uri, tile_dimensions=(96, 96))`. The default is `(256, 256)`" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "930" + "100" ] }, - "execution_count": 3, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -101,40 +150,114 @@ "df.count()" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "What area does the DataFrame cover?" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "coverage_area = df.groupby(df.proj_raster_path).agg(\n", + " F.first(rf_crs(df.proj_raster).crsProj4).alias('crs'),\n", + " F.min(rf_extent(df.proj_raster).xmin).alias('xmin'),\n", + " F.min(rf_extent(df.proj_raster).ymin).alias('ymin'),\n", + " F.min(rf_extent(df.proj_raster).xmax).alias('xmax'),\n", + " F.min(rf_extent(df.proj_raster).ymax).alias('ymax'),\n", + ").withColumn('footprint_4326', st_geometry(F.struct('xmin', 'ymin', 'xmax', 'ymax')))\n", + "coverage_area = cov_area()\n", + "coverage_area" + ] + }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "root\n", - " |-- tile_path: string (nullable = false)\n", - " |-- tile: struct (nullable = true)\n", - " | |-- tile_context: struct (nullable = false)\n", - " | | |-- extent: struct (nullable = false)\n", - " | | | |-- xmin: double (nullable = false)\n", - " | | | |-- ymin: double (nullable = false)\n", - " | | | |-- xmax: double (nullable = false)\n", - " | | | |-- ymax: double (nullable = false)\n", - " | | |-- crs: struct (nullable = false)\n", - " | | | |-- crsProj4: string (nullable = false)\n", - " | |-- tile: tile (nullable = false)\n", + "+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m \n", + "+--------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|proj_raster_path |footprint |\n", + "+--------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-70.85954815687087 8.933333332533772, -71.07986282542622 9.999999999104968, -69.99674110618135 9.999999999104968, -69.7797836135278 8.933333332533772, -70.85954815687087 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-69.77978361352781 8.933333332533772, -69.99674110618135 9.999999999104968, -68.91361938693649 9.999999999104968, -68.70001907018472 8.933333332533772, -69.77978361352781 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-68.70001907018474 8.933333332533772, -68.9136193869365 9.999999999104968, -67.8304976676916 9.999999999104968, -67.62025452684163 8.933333332533772, -68.70001907018474 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-67.62025452684165 8.933333332533772, -67.83049766769162 9.999999999104968, -66.74737594844675 9.999999999104968, -66.54048998349857 8.933333332533772, -67.62025452684165 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-66.54048998349859 8.933333332533772, -66.74737594844676 9.999999999104968, -65.66425422920187 9.999999999104968, -65.4607254401555 8.933333332533772, -66.54048998349859 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-65.4607254401555 8.933333332533772, -65.66425422920187 9.999999999104968, -64.58113250995702 9.999999999104968, -64.38096089681244 8.933333332533772, -65.4607254401555 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-64.38096089681244 8.933333332533772, -64.58113250995702 9.999999999104968, -63.498010790712144 9.999999999104968, -63.30119635346936 8.933333332533772, -64.38096089681244 8.933333332533772))|\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-63.30119635346937 8.933333332533772, -63.49801079071215 9.999999999104968, -62.41488907146726 9.999999999104968, -62.221431810126276 8.933333332533772, -63.30119635346937 8.933333332533772))|\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-62.22143181012629 8.933333332533772, -62.41488907146727 9.999999999104968, -61.33176735222239 9.999999999104968, -61.14166726678321 8.933333332533772, -62.22143181012629 8.933333332533772)) |\n", + "|https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF|POLYGON ((-61.14166726678322 8.933333332533772, -61.3317673522224 9.999999999104968, -60.92559670750556 9.999999999104968, -60.736755563029554 8.933333332533772, -61.14166726678322 8.933333332533772)) |\n", + "+--------------------------------------------------------------------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "only showing top 10 rows\n", "\n" ] } ], "source": [ - "df.printSchema()" + "crs = df.agg(F.first(rf_crs(df.proj_raster)).crsProj4.alias('crs')).first()['crs']\n", + "print(crs)\n", + "coverage_area = df.select(\n", + " df.proj_raster_path,\n", + " st_reproject(st_geometry(rf_extent(df.proj_raster)), crs, 'EPSG:4326').alias('footprint')\n", + " )\n", + "coverage_area.show(10, False)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "So where in the world is that? We'll generate a little visualization on http://geojson.io." ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 8, "metadata": { - "scrolled": false + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "'http://geojson.io/#data=data:application/json,%7B%22type%22%3A%20%22FeatureCollection%22%2C%20%22features%22%3A%20%5B%7B%22id%22%3A%20%220%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.85954815687087%2C%208.933333332533772%5D%2C%20%5B-71.07986282542622%2C%209.999999999104968%5D%2C%20%5B-69.99674110618135%2C%209.999999999104968%5D%2C%20%5B-69.7797836135278%2C%208.933333332533772%5D%2C%20%5B-70.85954815687087%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%221%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.77978361352781%2C%208.933333332533772%5D%2C%20%5B-69.99674110618135%2C%209.999999999104968%5D%2C%20%5B-68.91361938693649%2C%209.999999999104968%5D%2C%20%5B-68.70001907018472%2C%208.933333332533772%5D%2C%20%5B-69.77978361352781%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%222%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.70001907018474%2C%208.933333332533772%5D%2C%20%5B-68.9136193869365%2C%209.999999999104968%5D%2C%20%5B-67.8304976676916%2C%209.999999999104968%5D%2C%20%5B-67.62025452684163%2C%208.933333332533772%5D%2C%20%5B-68.70001907018474%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%223%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.62025452684165%2C%208.933333332533772%5D%2C%20%5B-67.83049766769162%2C%209.999999999104968%5D%2C%20%5B-66.74737594844675%2C%209.999999999104968%5D%2C%20%5B-66.54048998349857%2C%208.933333332533772%5D%2C%20%5B-67.62025452684165%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%224%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.54048998349859%2C%208.933333332533772%5D%2C%20%5B-66.74737594844676%2C%209.999999999104968%5D%2C%20%5B-65.66425422920187%2C%209.999999999104968%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-66.54048998349859%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%225%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-65.66425422920187%2C%209.999999999104968%5D%2C%20%5B-64.58113250995702%2C%209.999999999104968%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%226%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-64.58113250995702%2C%209.999999999104968%5D%2C%20%5B-63.498010790712144%2C%209.999999999104968%5D%2C%20%5B-63.30119635346936%2C%208.933333332533772%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%227%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.30119635346937%2C%208.933333332533772%5D%2C%20%5B-63.49801079071215%2C%209.999999999104968%5D%2C%20%5B-62.41488907146726%2C%209.999999999104968%5D%2C%20%5B-62.221431810126276%2C%208.933333332533772%5D%2C%20%5B-63.30119635346937%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%228%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.22143181012629%2C%208.933333332533772%5D%2C%20%5B-62.41488907146727%2C%209.999999999104968%5D%2C%20%5B-61.33176735222239%2C%209.999999999104968%5D%2C%20%5B-61.14166726678321%2C%208.933333332533772%5D%2C%20%5B-62.22143181012629%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%229%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.14166726678322%2C%208.933333332533772%5D%2C%20%5B-61.3317673522224%2C%209.999999999104968%5D%2C%20%5B-60.92559670750556%2C%209.999999999104968%5D%2C%20%5B-60.736755563029554%2C%208.933333332533772%5D%2C%20%5B-61.14166726678322%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2210%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.66501020104033%2C%207.866666665962575%5D%2C%20%5B-70.85954815687087%2C%208.933333332533772%5D%2C%20%5B-69.7797836135278%2C%208.933333332533772%5D%2C%20%5B-69.58821004559562%2C%207.866666665962575%5D%2C%20%5B-70.66501020104033%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2211%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.58821004559563%2C%207.866666665962575%5D%2C%20%5B-69.77978361352781%2C%208.933333332533772%5D%2C%20%5B-68.70001907018472%2C%208.933333332533772%5D%2C%20%5B-68.51140989015092%2C%207.866666665962575%5D%2C%20%5B-69.58821004559563%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2212%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.51140989015093%2C%207.866666665962575%5D%2C%20%5B-68.70001907018474%2C%208.933333332533772%5D%2C%20%5B-67.62025452684163%2C%208.933333332533772%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-68.51140989015093%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2213%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-67.62025452684165%2C%208.933333332533772%5D%2C%20%5B-66.54048998349857%2C%208.933333332533772%5D%2C%20%5B-66.35780957926151%2C%207.866666665962575%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2214%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.35780957926153%2C%207.866666665962575%5D%2C%20%5B-66.54048998349859%2C%208.933333332533772%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-66.35780957926153%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2215%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2216%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-63.30119635346936%2C%208.933333332533772%5D%2C%20%5B-63.12740911292742%2C%207.866666665962575%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2217%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.127409112927424%2C%207.866666665962575%5D%2C%20%5B-63.30119635346937%2C%208.933333332533772%5D%2C%20%5B-62.221431810126276%2C%208.933333332533772%5D%2C%20%5B-62.0506089574827%2C%207.866666665962575%5D%2C%20%5B-63.127409112927424%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2218%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.05060895748272%2C%207.866666665962575%5D%2C%20%5B-62.22143181012629%2C%208.933333332533772%5D%2C%20%5B-61.14166726678321%2C%208.933333332533772%5D%2C%20%5B-60.973808802038015%2C%207.866666665962575%5D%2C%20%5B-62.05060895748272%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2219%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.97380880203802%2C%207.866666665962575%5D%2C%20%5B-61.14166726678322%2C%208.933333332533772%5D%2C%20%5B-60.736755563029554%2C%208.933333332533772%5D%2C%20%5B-60.57000874374624%2C%207.866666665962575%5D%2C%20%5B-60.97380880203802%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2220%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.4959028507541%2C%206.799999999391379%5D%2C%20%5B-70.66501020104033%2C%207.866666665962575%5D%2C%20%5B-69.58821004559562%2C%207.866666665962575%5D%2C%20%5B-69.42167956921853%2C%206.799999999391379%5D%2C%20%5B-70.4959028507541%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2221%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.42167956921854%2C%206.799999999391379%5D%2C%20%5B-69.58821004559563%2C%207.866666665962575%5D%2C%20%5B-68.51140989015092%2C%207.866666665962575%5D%2C%20%5B-68.34745628768296%2C%206.799999999391379%5D%2C%20%5B-69.42167956921854%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2222%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.34745628768297%2C%206.799999999391379%5D%2C%20%5B-68.51140989015093%2C%207.866666665962575%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-67.27323300614736%2C%206.799999999391379%5D%2C%20%5B-68.34745628768297%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2223%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.27323300614738%2C%206.799999999391379%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-66.35780957926151%2C%207.866666665962575%5D%2C%20%5B-66.1990097246118%2C%206.799999999391379%5D%2C%20%5B-67.27323300614738%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2224%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.19900972461181%2C%206.799999999391379%5D%2C%20%5B-66.35780957926153%2C%207.866666665962575%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-65.12478644307622%2C%206.799999999391379%5D%2C%20%5B-66.19900972461181%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2225%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.12478644307622%2C%206.799999999391379%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-64.05056316154065%2C%206.799999999391379%5D%2C%20%5B-65.12478644307622%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2226%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.05056316154065%2C%206.799999999391379%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-63.12740911292742%2C%207.866666665962575%5D%2C%20%5B-62.97633988000506%2C%206.799999999391379%5D%2C%20%5B-64.05056316154065%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2227%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.97633988000507%2C%206.799999999391379%5D%2C%20%5B-63.127409112927424%2C%207.866666665962575%5D%2C%20%5B-62.0506089574827%2C%207.866666665962575%5D%2C%20%5B-61.902116598469476%2C%206.799999999391379%5D%2C%20%5B-62.97633988000507%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2228%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.90211659846949%2C%206.799999999391379%5D%2C%20%5B-62.05060895748272%2C%207.866666665962575%5D%2C%20%5B-60.973808802038015%2C%207.866666665962575%5D%2C%20%5B-60.8278933169339%2C%206.799999999391379%5D%2C%20%5B-61.90211659846949%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2229%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.82789331693391%2C%206.799999999391379%5D%2C%20%5B-60.97380880203802%2C%207.866666665962575%5D%2C%20%5B-60.57000874374624%2C%207.866666665962575%5D%2C%20%5B-60.42505958635807%2C%206.799999999391379%5D%2C%20%5B-60.82789331693391%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2230%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.3519270891162%2C%205.733333332820182%5D%2C%20%5B-70.4959028507541%2C%206.799999999391378%5D%2C%20%5B-69.42167956921853%2C%206.799999999391378%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-70.3519270891162%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2231%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-69.42167956921854%2C%206.799999999391378%5D%2C%20%5B-68.34745628768296%2C%206.799999999391378%5D%2C%20%5B-68.20786835878069%2C%205.733333332820182%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2232%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.2078683587807%2C%205.733333332820182%5D%2C%20%5B-68.34745628768297%2C%206.799999999391378%5D%2C%20%5B-67.27323300614736%2C%206.799999999391378%5D%2C%20%5B-67.13583899361292%2C%205.733333332820182%5D%2C%20%5B-68.2078683587807%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2233%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.13583899361294%2C%205.733333332820182%5D%2C%20%5B-67.27323300614738%2C%206.799999999391378%5D%2C%20%5B-66.1990097246118%2C%206.799999999391378%5D%2C%20%5B-66.06380962844516%2C%205.733333332820182%5D%2C%20%5B-67.13583899361294%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2234%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.06380962844517%2C%205.733333332820182%5D%2C%20%5B-66.19900972461181%2C%206.799999999391378%5D%2C%20%5B-65.12478644307622%2C%206.799999999391378%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-66.06380962844517%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2235%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-65.12478644307622%2C%206.799999999391378%5D%2C%20%5B-64.05056316154065%2C%206.799999999391378%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2236%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-64.05056316154065%2C%206.799999999391378%5D%2C%20%5B-62.97633988000506%2C%206.799999999391378%5D%2C%20%5B-62.847721532941875%2C%205.733333332820182%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2237%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.84772153294189%2C%205.733333332820182%5D%2C%20%5B-62.97633988000507%2C%206.799999999391378%5D%2C%20%5B-61.902116598469476%2C%206.799999999391378%5D%2C%20%5B-61.77569216777411%2C%205.733333332820182%5D%2C%20%5B-62.84772153294189%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2238%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.77569216777412%2C%205.733333332820182%5D%2C%20%5B-61.90211659846949%2C%206.799999999391378%5D%2C%20%5B-60.8278933169339%2C%206.799999999391378%5D%2C%20%5B-60.70366280260635%2C%205.733333332820182%5D%2C%20%5B-61.77569216777412%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2239%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.70366280260636%2C%205.733333332820182%5D%2C%20%5B-60.82789331693391%2C%206.799999999391378%5D%2C%20%5B-60.42505958635807%2C%206.799999999391378%5D%2C%20%5B-60.301651790668444%2C%205.733333332820182%5D%2C%20%5B-60.70366280260636%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2240%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.2328296870388%2C%204.666666666248985%5D%2C%20%5B-70.3519270891162%2C%205.733333332820182%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-69.1626151394265%2C%204.666666666248985%5D%2C%20%5B-70.2328296870388%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2241%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.16261513942652%2C%204.666666666248985%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-68.20786835878069%2C%205.733333332820182%5D%2C%20%5B-68.09240059181421%2C%204.666666666248985%5D%2C%20%5B-69.16261513942652%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2242%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.09240059181423%2C%204.666666666248985%5D%2C%20%5B-68.2078683587807%2C%205.733333332820182%5D%2C%20%5B-67.13583899361292%2C%205.733333332820182%5D%2C%20%5B-67.0221860442019%2C%204.666666666248985%5D%2C%20%5B-68.09240059181423%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2243%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.02218604420192%2C%204.666666666248985%5D%2C%20%5B-67.13583899361294%2C%205.733333332820182%5D%2C%20%5B-66.06380962844516%2C%205.733333332820182%5D%2C%20%5B-65.95197149658962%2C%204.666666666248985%5D%2C%20%5B-67.02218604420192%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2244%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.95197149658964%2C%204.666666666248985%5D%2C%20%5B-66.06380962844517%2C%205.733333332820182%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-64.88175694897733%2C%204.666666666248985%5D%2C%20%5B-65.95197149658964%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2245%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.88175694897733%2C%204.666666666248985%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-63.81154240136504%2C%204.666666666248985%5D%2C%20%5B-64.88175694897733%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2246%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.81154240136504%2C%204.666666666248985%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-62.847721532941875%2C%205.733333332820182%5D%2C%20%5B-62.74132785375273%2C%204.666666666248985%5D%2C%20%5B-63.81154240136504%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2247%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.741327853752736%2C%204.666666666248985%5D%2C%20%5B-62.84772153294189%2C%205.733333332820182%5D%2C%20%5B-61.77569216777411%2C%205.733333332820182%5D%2C%20%5B-61.67111330614043%2C%204.666666666248985%5D%2C%20%5B-62.741327853752736%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2248%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.67111330614044%2C%204.666666666248985%5D%2C%20%5B-61.77569216777412%2C%205.733333332820182%5D%2C%20%5B-60.70366280260635%2C%205.733333332820182%5D%2C%20%5B-60.600898758528146%2C%204.666666666248985%5D%2C%20%5B-61.67111330614044%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2249%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.60089875852815%2C%204.666666666248985%5D%2C%20%5B-60.70366280260636%2C%205.733333332820182%5D%2C%20%5B-60.301651790668444%2C%205.733333332820182%5D%2C%20%5B-60.19956830317353%2C%204.666666666248985%5D%2C%20%5B-60.60089875852815%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2250%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.13840210865949%2C%203.599999999677788%5D%2C%20%5B-70.2328296870388%2C%204.666666666248986%5D%2C%20%5B-69.1626151394265%2C%204.666666666248986%5D%2C%20%5B-69.06962645747964%2C%203.599999999677788%5D%2C%20%5B-70.13840210865949%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2251%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.06962645747966%2C%203.599999999677788%5D%2C%20%5B-69.16261513942652%2C%204.666666666248986%5D%2C%20%5B-68.09240059181421%2C%204.666666666248986%5D%2C%20%5B-68.0008508062998%2C%203.599999999677788%5D%2C%20%5B-69.06962645747966%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2252%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.00085080629981%2C%203.599999999677788%5D%2C%20%5B-68.09240059181423%2C%204.666666666248986%5D%2C%20%5B-67.0221860442019%2C%204.666666666248986%5D%2C%20%5B-66.93207515511993%2C%203.599999999677788%5D%2C%20%5B-68.00085080629981%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2253%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.93207515511995%2C%203.599999999677788%5D%2C%20%5B-67.02218604420192%2C%204.666666666248986%5D%2C%20%5B-65.95197149658962%2C%204.666666666248986%5D%2C%20%5B-65.86329950394008%2C%203.599999999677788%5D%2C%20%5B-66.93207515511995%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2254%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.8632995039401%2C%203.599999999677788%5D%2C%20%5B-65.95197149658964%2C%204.666666666248986%5D%2C%20%5B-64.88175694897733%2C%204.666666666248986%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-65.8632995039401%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2255%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-64.88175694897733%2C%204.666666666248986%5D%2C%20%5B-63.81154240136504%2C%204.666666666248986%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2256%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-63.81154240136504%2C%204.666666666248986%5D%2C%20%5B-62.74132785375273%2C%204.666666666248986%5D%2C%20%5B-62.65697255040055%2C%203.599999999677788%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2257%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.65697255040057%2C%203.599999999677788%5D%2C%20%5B-62.741327853752736%2C%204.666666666248986%5D%2C%20%5B-61.67111330614043%2C%204.666666666248986%5D%2C%20%5B-61.5881968992207%2C%203.599999999677788%5D%2C%20%5B-62.65697255040057%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2258%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.58819689922071%2C%203.599999999677788%5D%2C%20%5B-61.67111330614044%2C%204.666666666248986%5D%2C%20%5B-60.600898758528146%2C%204.666666666248986%5D%2C%20%5B-60.51942124804085%2C%203.599999999677788%5D%2C%20%5B-61.58819689922071%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2259%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.519421248040864%2C%203.599999999677788%5D%2C%20%5B-60.60089875852815%2C%204.666666666248986%5D%2C%20%5B-60.19956830317353%2C%204.666666666248986%5D%2C%20%5B-60.1186303788484%2C%203.599999999677788%5D%2C%20%5B-60.519421248040864%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2260%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.06847961578245%2C%202.533333333106592%5D%2C%20%5B-70.13840210865949%2C%203.599999999677788%5D%2C%20%5B-69.06962645747964%2C%203.599999999677788%5D%2C%20%5B-69.00076945020834%2C%202.533333333106592%5D%2C%20%5B-70.06847961578245%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2261%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.00076945020835%2C%202.533333333106592%5D%2C%20%5B-69.06962645747966%2C%203.599999999677788%5D%2C%20%5B-68.0008508062998%2C%203.599999999677788%5D%2C%20%5B-67.93305928463424%2C%202.533333333106592%5D%2C%20%5B-69.00076945020835%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2262%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.93305928463425%2C%202.533333333106592%5D%2C%20%5B-68.00085080629981%2C%203.599999999677788%5D%2C%20%5B-66.93207515511993%2C%203.599999999677788%5D%2C%20%5B-66.86534911906014%2C%202.533333333106592%5D%2C%20%5B-67.93305928463425%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2263%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.86534911906016%2C%202.533333333106592%5D%2C%20%5B-66.93207515511995%2C%203.599999999677788%5D%2C%20%5B-65.86329950394008%2C%203.599999999677788%5D%2C%20%5B-65.79763895348603%2C%202.533333333106592%5D%2C%20%5B-66.86534911906016%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2264%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.79763895348604%2C%202.533333333106592%5D%2C%20%5B-65.8632995039401%2C%203.599999999677788%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-65.79763895348604%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2265%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2266%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-62.65697255040055%2C%203.599999999677788%5D%2C%20%5B-62.594508456763734%2C%202.533333333106592%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2267%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.59450845676375%2C%202.533333333106592%5D%2C%20%5B-62.65697255040057%2C%203.599999999677788%5D%2C%20%5B-61.5881968992207%2C%203.599999999677788%5D%2C%20%5B-61.526798291189614%2C%202.533333333106592%5D%2C%20%5B-62.59450845676375%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2268%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.52679829118963%2C%202.533333333106592%5D%2C%20%5B-61.58819689922071%2C%203.599999999677788%5D%2C%20%5B-60.51942124804085%2C%203.599999999677788%5D%2C%20%5B-60.45908812561552%2C%202.533333333106592%5D%2C%20%5B-61.52679829118963%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2269%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.45908812561554%2C%202.533333333106592%5D%2C%20%5B-60.519421248040864%2C%203.599999999677788%5D%2C%20%5B-60.1186303788484%2C%203.599999999677788%5D%2C%20%5B-60.05869681352523%2C%202.533333333106592%5D%2C%20%5B-60.45908812561554%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2270%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.02294056414732%2C%201.466666666535396%5D%2C%20%5B-70.06847961578245%2C%202.533333333106592%5D%2C%20%5B-69.00076945020834%2C%202.533333333106592%5D%2C%20%5B-68.95592432697907%2C%201.466666666535396%5D%2C%20%5B-70.02294056414732%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2271%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.95592432697909%2C%201.466666666535396%5D%2C%20%5B-69.00076945020835%2C%202.533333333106592%5D%2C%20%5B-67.93305928463424%2C%202.533333333106592%5D%2C%20%5B-67.88890808981084%2C%201.466666666535396%5D%2C%20%5B-68.95592432697909%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2272%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.88890808981085%2C%201.466666666535396%5D%2C%20%5B-67.93305928463425%2C%202.533333333106592%5D%2C%20%5B-66.86534911906014%2C%202.533333333106592%5D%2C%20%5B-66.82189185264261%2C%201.466666666535396%5D%2C%20%5B-67.88890808981085%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2273%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.82189185264262%2C%201.466666666535396%5D%2C%20%5B-66.86534911906016%2C%202.533333333106592%5D%2C%20%5B-65.79763895348603%2C%202.533333333106592%5D%2C%20%5B-65.75487561547438%2C%201.466666666535396%5D%2C%20%5B-66.82189185264262%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2274%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.75487561547439%2C%201.466666666535396%5D%2C%20%5B-65.79763895348604%2C%202.533333333106592%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-64.68785937830614%2C%201.466666666535396%5D%2C%20%5B-65.75487561547439%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2275%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.68785937830614%2C%201.466666666535396%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-63.62084314113792%2C%201.466666666535396%5D%2C%20%5B-64.68785937830614%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2276%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.62084314113792%2C%201.466666666535396%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-62.594508456763734%2C%202.533333333106592%5D%2C%20%5B-62.55382690396967%2C%201.466666666535396%5D%2C%20%5B-63.62084314113792%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2277%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.553826903969686%2C%201.466666666535396%5D%2C%20%5B-62.59450845676375%2C%202.533333333106592%5D%2C%20%5B-61.526798291189614%2C%202.533333333106592%5D%2C%20%5B-61.48681066680143%2C%201.466666666535396%5D%2C%20%5B-62.553826903969686%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2278%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.486810666801446%2C%201.466666666535396%5D%2C%20%5B-61.52679829118963%2C%202.533333333106592%5D%2C%20%5B-60.45908812561552%2C%202.533333333106592%5D%2C%20%5B-60.4197944296332%2C%201.466666666535396%5D%2C%20%5B-61.486810666801446%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2279%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.419794429633214%2C%201.466666666535396%5D%2C%20%5B-60.45908812561554%2C%202.533333333106592%5D%2C%20%5B-60.05869681352523%2C%202.533333333106592%5D%2C%20%5B-60.01966334069511%2C%201.466666666535396%5D%2C%20%5B-60.419794429633214%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2280%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.00170588591008%2C%200.3999999999641985%5D%2C%20%5B-70.02294056414732%2C%201.4666666665353953%5D%2C%20%5B-68.95592432697907%2C%201.4666666665353953%5D%2C%20%5B-68.93501322479118%2C%200.3999999999641985%5D%2C%20%5B-70.00170588591008%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2281%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.93501322479119%2C%200.3999999999641985%5D%2C%20%5B-68.95592432697909%2C%201.4666666665353953%5D%2C%20%5B-67.88890808981084%2C%201.4666666665353953%5D%2C%20%5B-67.86832056367227%2C%200.3999999999641985%5D%2C%20%5B-68.93501322479119%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2282%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.86832056367227%2C%200.3999999999641985%5D%2C%20%5B-67.88890808981085%2C%201.4666666665353953%5D%2C%20%5B-66.82189185264261%2C%201.4666666665353953%5D%2C%20%5B-66.80162790255335%2C%200.3999999999641985%5D%2C%20%5B-67.86832056367227%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2283%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.80162790255336%2C%200.3999999999641985%5D%2C%20%5B-66.82189185264262%2C%201.4666666665353953%5D%2C%20%5B-65.75487561547438%2C%201.4666666665353953%5D%2C%20%5B-65.73493524143446%2C%200.3999999999641985%5D%2C%20%5B-66.80162790255336%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2284%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.73493524143447%2C%200.3999999999641985%5D%2C%20%5B-65.75487561547439%2C%201.4666666665353953%5D%2C%20%5B-64.68785937830614%2C%201.4666666665353953%5D%2C%20%5B-64.66824258031555%2C%200.3999999999641985%5D%2C%20%5B-65.73493524143447%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2285%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.66824258031555%2C%200.3999999999641985%5D%2C%20%5B-64.68785937830614%2C%201.4666666665353953%5D%2C%20%5B-63.62084314113792%2C%201.4666666665353953%5D%2C%20%5B-63.60154991919666%2C%200.3999999999641985%5D%2C%20%5B-64.66824258031555%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2286%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.60154991919666%2C%200.3999999999641985%5D%2C%20%5B-63.62084314113792%2C%201.4666666665353953%5D%2C%20%5B-62.55382690396967%2C%201.4666666665353953%5D%2C%20%5B-62.53485725807775%2C%200.3999999999641985%5D%2C%20%5B-63.60154991919666%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2287%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.534857258077764%2C%200.3999999999641985%5D%2C%20%5B-62.553826903969686%2C%201.4666666665353953%5D%2C%20%5B-61.48681066680143%2C%201.4666666665353953%5D%2C%20%5B-61.46816459695883%2C%200.3999999999641985%5D%2C%20%5B-62.534857258077764%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2288%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.46816459695884%2C%200.3999999999641985%5D%2C%20%5B-61.486810666801446%2C%201.4666666665353953%5D%2C%20%5B-60.4197944296332%2C%201.4666666665353953%5D%2C%20%5B-60.40147193583993%2C%200.3999999999641985%5D%2C%20%5B-61.46816459695884%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2289%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.40147193583994%2C%200.3999999999641985%5D%2C%20%5B-60.419794429633214%2C%201.4666666665353953%5D%2C%20%5B-60.01966334069511%2C%201.4666666665353953%5D%2C%20%5B-60.00146218792034%2C%200.3999999999641985%5D%2C%20%5B-60.40147193583994%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2290%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.99999999371678%2C%20-6.717228065038803e-16%5D%2C%20%5B-70.00170588591008%2C%200.39999999996419916%5D%2C%20%5B-68.93501322479118%2C%200.39999999996419916%5D%2C%20%5B-68.93333332714558%2C%20-6.717228065038803e-16%5D%2C%20%5B-69.99999999371678%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2291%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.93333332714559%2C%20-6.717228065038803e-16%5D%2C%20%5B-68.93501322479119%2C%200.39999999996419916%5D%2C%20%5B-67.86832056367227%2C%200.39999999996419916%5D%2C%20%5B-67.8666666605744%2C%20-6.717228065038803e-16%5D%2C%20%5B-68.93333332714559%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2292%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.8666666605744%2C%20-6.717228065038803e-16%5D%2C%20%5B-67.86832056367227%2C%200.39999999996419916%5D%2C%20%5B-66.80162790255335%2C%200.39999999996419916%5D%2C%20%5B-66.79999999400319%2C%20-6.717228065038803e-16%5D%2C%20%5B-67.8666666605744%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2293%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.7999999940032%2C%20-6.717228065038803e-16%5D%2C%20%5B-66.80162790255336%2C%200.39999999996419916%5D%2C%20%5B-65.73493524143446%2C%200.39999999996419916%5D%2C%20%5B-65.73333332743199%2C%20-6.717228065038803e-16%5D%2C%20%5B-66.7999999940032%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2294%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.733333327432%2C%20-6.717228065038803e-16%5D%2C%20%5B-65.73493524143447%2C%200.39999999996419916%5D%2C%20%5B-64.66824258031555%2C%200.39999999996419916%5D%2C%20%5B-64.6666666608608%2C%20-6.717228065038803e-16%5D%2C%20%5B-65.733333327432%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2295%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.6666666608608%2C%20-6.717228065038803e-16%5D%2C%20%5B-64.66824258031555%2C%200.39999999996419916%5D%2C%20%5B-63.60154991919666%2C%200.39999999996419916%5D%2C%20%5B-63.599999994289604%2C%20-6.717228065038803e-16%5D%2C%20%5B-64.6666666608608%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2296%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.599999994289604%2C%20-6.717228065038803e-16%5D%2C%20%5B-63.60154991919666%2C%200.39999999996419916%5D%2C%20%5B-62.53485725807775%2C%200.39999999996419916%5D%2C%20%5B-62.5333333277184%2C%20-6.717228065038803e-16%5D%2C%20%5B-63.599999994289604%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2297%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.53333332771842%2C%20-6.717228065038803e-16%5D%2C%20%5B-62.534857258077764%2C%200.39999999996419916%5D%2C%20%5B-61.46816459695883%2C%200.39999999996419916%5D%2C%20%5B-61.4666666611472%2C%20-6.717228065038803e-16%5D%2C%20%5B-62.53333332771842%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2298%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.46666666114721%2C%20-6.717228065038803e-16%5D%2C%20%5B-61.46816459695884%2C%200.39999999996419916%5D%2C%20%5B-60.40147193583993%2C%200.39999999996419916%5D%2C%20%5B-60.39999999457601%2C%20-6.717228065038803e-16%5D%2C%20%5B-61.46666666114721%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2299%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.39999999457602%2C%20-6.717228065038803e-16%5D%2C%20%5B-60.40147193583994%2C%200.39999999996419916%5D%2C%20%5B-60.00146218792034%2C%200.39999999996419916%5D%2C%20%5B-59.999999994611805%2C%20-6.717228065038803e-16%5D%2C%20%5B-60.39999999457602%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%5D%7D'" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "import geopandas\n", + "import geojsonio\n", + "\n", + "geojsonio.display(\n", + " geopandas.GeoDataFrame(\n", + " coverage_area.select('footprint').toPandas(), geometry='footprint', crs='EPSG:4326').to_json()\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Look at a sample of the data." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": { + "scrolled": true }, "outputs": [ { @@ -158,251 +281,90 @@ " \n", " \n", " \n", + " proj_raster_path\n", + " extent\n", " tile\n", " \n", " \n", " \n", " \n", " 0\n", - " (((504825.0, 3142635.0, 512505.0, 3150315.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", + " (-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667)\n", + " \n", " \n", " \n", " 1\n", - " (((497145.0, 3127275.0, 504825.0, 3134955.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", + " (-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667)\n", + " \n", " \n", " \n", " 2\n", - " (((643065.0, 3127275.0, 650745.0, 3134955.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", + " (-6953397.249648973, 756126.3533735601, -6834789.194217825, 874734.4088047068)\n", + " \n", " \n", " \n", " 3\n", - " (((650745.0, 3127275.0, 658425.0, 3134955.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", + " (-7783653.637667, 281694.1316489733, -7665045.582235852, 400302.18708011997)\n", + " \n", " \n", " \n", " 4\n", - " (((489465.0, 3119595.0, 497145.0, 3127275.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", + " (-7783653.637667, 163086.07621782675, -7665045.582235852, 281694.1316489733)\n", + " \n", " \n", " \n", " 5\n", - " (((512505.0, 3119595.0, 520185.0, 3127275.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[ 0 0 0 ... 34835 35040 34929]\\n [ 0 0 0 ... 34438 33838 34300]\\n [ 0 0 0 ... 34169 34047 35019]\\n ...\\n [ 0 0 0 ... 28880 28858 28860]\\n [ 0 0 0 ... 28868 28882 28825]\\n [ 0 0 0 ... 28892 28830 28751]]))\n", - " \n", - " \n", - " 6\n", - " (((566265.0, 3088875.0, 573945.0, 3096555.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[25072 24691 24206 ... 14174 14055 13722]\\n [24987 24851 24668 ... 13488 13960 14160]\\n [25287 25327 25125 ... 14932 14992 15673]\\n ...\\n [18261 18773 18356 ... 28507 29489 29209]\\n [18898 19475 18998 ... 27742 28559 28831]\\n [20193 20706 19194 ... 27191 27340 27728]]))\n", - " \n", - " \n", - " 7\n", - " (((650745.0, 3081195.0, 658425.0, 3088875.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[37009 36664 36718 ... 30211 31565 32545]\\n [37220 36770 36653 ... 26997 30338 32433]\\n [37509 36985 36639 ... 26815 29523 31915]\\n ...\\n [21496 22198 22629 ... 50496 49952 49069]\\n [21319 21920 22650 ... 44582 47035 48996]\\n [21015 21923 23135 ... 40391 41619 46114]]))\n", - " \n", - " \n", - " 8\n", - " (((481785.0, 3073515.0, 489465.0, 3081195.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 9\n", - " (((643065.0, 3073515.0, 650745.0, 3081195.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[41963 41787 41288 ... 19905 19831 20434]\\n [41612 41503 41209 ... 20569 20559 20786]\\n [41520 41262 41159 ... 20901 21337 21310]\\n ...\\n [35591 34598 33741 ... 28094 28141 28347]\\n [35111 34607 34556 ... 28344 28428 28404]\\n [35020 35115 35496 ... 28928 28943 28659]]))\n", - " \n", - " \n", - " 10\n", - " (((550905.0, 3065835.0, 558585.0, 3073515.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[29634 29074 27867 ... 34042 35793 36101]\\n [28292 28290 27806 ... 35532 36229 36043]\\n [26764 27215 27229 ... 35614 36731 37212]\\n ...\\n [12799 11281 11560 ... 22493 22390 24250]\\n [12380 12208 12146 ... 21462 24578 26095]\\n [11854 12212 12253 ... 21606 23951 26103]]))\n", - " \n", - " \n", - " 11\n", - " (((581625.0, 3065835.0, 589305.0, 3073515.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[29596 29158 29310 ... 31524 32105 32622]\\n [29449 30052 29751 ... 31945 32458 32848]\\n [30147 30365 29524 ... 31432 32140 32678]\\n ...\\n [34789 34764 34617 ... 38622 38460 38426]\\n [34196 34286 34005 ... 38503 38249 38346]\\n [33628 33690 33329 ... 38487 38527 38578]]))\n", - " \n", - " \n", - " 12\n", - " (((527865.0, 3050475.0, 535545.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[23166 23360 22026 ... 17733 17719 17761]\\n [20816 22672 20776 ... 18288 17669 17715]\\n [21089 20806 19823 ... 17316 17232 16957]\\n ...\\n [13103 12781 12562 ... 18723 19452 19702]\\n [12532 12190 12241 ... 18387 19321 19802]\\n [11338 11578 11682 ... 18910 19432 20186]]))\n", - " \n", - " \n", - " 13\n", - " (((550905.0, 3050475.0, 558585.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[16526 16306 15638 ... 15329 14712 14664]\\n [16903 16944 16832 ... 15041 15341 16860]\\n [15429 16114 16805 ... 16944 17966 20436]\\n ...\\n [16725 15873 14367 ... 14874 16061 16183]\\n [17029 15729 14388 ... 14999 15990 16224]\\n [17588 16339 15071 ... 16020 16677 16706]]))\n", - " \n", - " \n", - " 14\n", - " (((566265.0, 3050475.0, 573945.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[33341 32022 31451 ... 26398 27977 28861]\\n [32632 31144 30286 ... 25217 26510 27947]\\n [32467 31358 30482 ... 24477 24832 26911]\\n ...\\n [24057 21928 19082 ... 27809 28046 29053]\\n [24680 23947 22570 ... 27101 28215 29453]\\n [25789 24841 23734 ... 26425 27868 29834]]))\n", - " \n", - " \n", - " 15\n", - " (((627705.0, 3050475.0, 635385.0, 3058155.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[38204 38705 39130 ... 26587 26447 26839]\\n [38392 38655 38823 ... 26448 25693 25283]\\n [38544 38747 38786 ... 26832 24899 23747]\\n ...\\n [26022 26438 26731 ... 25005 25354 25707]\\n [26400 26930 27321 ... 24669 25009 25260]\\n [27408 27625 28089 ... 25586 24755 24192]]))\n", - " \n", - " \n", - " 16\n", - " (((589305.0, 3042795.0, 596985.0, 3050475.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[32575 32134 30849 ... 30972 31822 32286]\\n [31885 31061 30993 ... 30657 32024 32868]\\n [31407 31448 31981 ... 29817 30815 32045]\\n ...\\n [35508 35433 35177 ... 33603 33305 33672]\\n [35484 35003 34429 ... 33247 33058 33417]\\n [35343 34631 34415 ... 33020 33076 33331]]))\n", - " \n", - " \n", - " 17\n", - " (((512505.0, 3035115.0, 520185.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[13629 13641 13654 ... 15836 15926 15930]\\n [13589 13639 13708 ... 15108 15343 15375]\\n [13691 13537 13669 ... 14280 14724 14503]\\n ...\\n [24557 24697 24844 ... 18465 18186 18502]\\n [25020 25233 25155 ... 17952 17631 18332]\\n [25061 25075 25074 ... 18569 19170 19982]]))\n", - " \n", - " \n", - " 18\n", - " (((573945.0, 3035115.0, 581625.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[24336 24964 25037 ... 33327 33051 33358]\\n [22415 23612 24149 ... 33521 33440 33479]\\n [21209 23243 24114 ... 33880 33893 33683]\\n ...\\n [33638 32723 31054 ... 33057 32382 30685]\\n [32698 31960 31017 ... 32298 31310 30263]\\n [31792 31185 30859 ... 31983 31021 30331]]))\n", - " \n", - " \n", - " 19\n", - " (((612345.0, 3035115.0, 620025.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[40280 41293 42603 ... 32490 31581 31512]\\n [41099 41587 42092 ... 32941 32131 32091]\\n [41203 41661 42110 ... 33382 32299 32086]\\n ...\\n [24846 25986 26169 ... 27485 27374 27173]\\n [25559 27182 27638 ... 27592 27364 27008]\\n [26692 28129 28436 ... 27810 27397 27121]]))\n", - " \n", - " \n", - " 20\n", - " (((635385.0, 3035115.0, 643065.0, 3042795.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[24378 24438 23453 ... 29819 31058 33367]\\n [24208 23636 23144 ... 31847 33205 34472]\\n [23688 22993 22775 ... 33441 34319 34732]\\n ...\\n [33234 32463 33299 ... 11817 11144 10977]\\n [32762 33111 33942 ... 12565 11693 11084]\\n [32264 33099 33582 ... 12812 12458 11561]]))\n", - " \n", - " \n", - " 21\n", - " (((512505.0, 3027435.0, 520185.0, 3035115.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[24858 24940 24606 ... 19891 21038 20948]\\n [25196 25118 24577 ... 20240 21793 21361]\\n [25752 25520 25170 ... 19794 20813 20261]\\n ...\\n [18146 17475 16777 ... 13993 13820 13694]\\n [17344 17460 17196 ... 13948 13775 13770]\\n [17364 17248 16749 ... 14023 13933 13923]]))\n", - " \n", - " \n", - " 22\n", - " (((481785.0, 3019755.0, 489465.0, 3027435.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 23\n", - " (((543225.0, 3019755.0, 550905.0, 3027435.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[26791 27865 28601 ... 22455 23951 25011]\\n [26513 27266 28239 ... 24150 25929 26738]\\n [25921 26332 27075 ... 24996 26887 28051]\\n ...\\n [28977 28830 28319 ... 27381 27470 26778]\\n [26999 26694 27336 ... 27126 26994 26973]\\n [25323 26363 27737 ... 27885 27729 29269]]))\n", - " \n", - " \n", - " 24\n", - " (((620025.0, 3019755.0, 627705.0, 3027435.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[27887 29274 29420 ... 28594 28067 26775]\\n [27511 27157 27926 ... 28321 27372 26632]\\n [26124 26258 28093 ... 28248 27692 27230]\\n ...\\n [25102 23556 20447 ... 13549 12968 12387]\\n [25162 22693 18945 ... 12300 11879 12002]\\n [24361 20969 19145 ... 11435 11760 12192]]))\n", - " \n", - " \n", - " 25\n", - " (((527865.0, 3012075.0, 535545.0, 3019755.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[23505 21881 21270 ... 28139 28527 28544]\\n [22847 23503 24292 ... 28372 28332 28020]\\n [25271 26722 26837 ... 28584 28075 27104]\\n ...\\n [26081 26353 25850 ... 23742 24155 24609]\\n [26054 25953 25177 ... 24958 25520 24955]\\n [25083 24297 23914 ... 25547 24948 24104]]))\n", - " \n", - " \n", - " 26\n", - " (((558585.0, 3012075.0, 566265.0, 3019755.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[26250 26128 25784 ... 31877 31438 31180]\\n [26943 27098 26642 ... 31622 31352 30721]\\n [27795 27798 26474 ... 31461 30972 29782]\\n ...\\n [30301 30720 30815 ... 33041 32485 32388]\\n [30441 30736 30864 ... 32788 32812 33148]\\n [30632 30872 30957 ... 33857 34225 34098]]))\n", - " \n", - " \n", - " 27\n", - " (((604665.0, 3012075.0, 612345.0, 3019755.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[16956 16754 16345 ... 21434 24875 28081]\\n [14837 14482 14216 ... 20008 21061 26474]\\n [12628 12588 12772 ... 17531 17956 24291]\\n ...\\n [12289 11931 12192 ... 16177 15880 15761]\\n [11916 12498 12292 ... 16069 15753 15868]\\n [12397 12705 11561 ... 16069 15868 15818]]))\n", - " \n", - " \n", - " 28\n", - " (((566265.0, 3004395.0, 573945.0, 3012075.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[33574 33483 33158 ... 24957 24142 22776]\\n [34258 34099 34122 ... 26301 25233 24223]\\n [34544 34011 34466 ... 26305 25216 24065]\\n ...\\n [19789 19914 18905 ... 9703 9691 9696]\\n [18684 18597 18354 ... 9718 9699 9705]\\n [18358 16960 17366 ... 9672 9694 9752]]))\n", - " \n", - " \n", - " 29\n", - " (((689145.0, 2996715.0, 696825.0, 3004395.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 30\n", - " (((497145.0, 2981355.0, 504825.0, 2989035.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[12994 12892 13184 ... 13493 13857 13523]\\n [12845 13003 13482 ... 13903 14242 13732]\\n [13498 13647 13934 ... 14212 14245 13795]\\n ...\\n [15265 14704 14405 ... 14367 14409 14607]\\n [15671 15221 14812 ... 14792 14543 14227]\\n [15696 15458 15443 ... 15313 14650 13765]]))\n", - " \n", - " \n", - " 31\n", - " (((512505.0, 2973675.0, 520185.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[16204 16261 15205 ... 20715 21030 21177]\\n [16838 16326 15415 ... 20730 21139 21452]\\n [17289 16132 15167 ... 20711 21213 21590]\\n ...\\n [29109 30660 32185 ... 17231 14617 12620]\\n [30143 31752 32885 ... 15871 14035 12636]\\n [30663 32379 33617 ... 15469 14269 12847]]))\n", - " \n", - " \n", - " 32\n", - " (((535545.0, 2973675.0, 543225.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[23036 24603 24745 ... 23201 23318 21658]\\n [19719 22610 23585 ... 25232 24894 23378]\\n [16386 18718 20205 ... 27731 27839 26234]\\n ...\\n [16662 17750 19966 ... 13344 16500 20875]\\n [20821 19012 19282 ... 12865 16932 20117]\\n [21951 20509 20907 ... 14476 18089 18942]]))\n", - " \n", - " \n", - " 33\n", - " (((566265.0, 2973675.0, 573945.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[11473 11996 11959 ... 9030 9031 9030]\\n [11654 11890 12173 ... 9014 8991 8969]\\n [11921 12394 13089 ... 8959 8989 8919]\\n ...\\n [ 9002 8979 8991 ... 9451 9251 9239]\\n [ 8960 8976 9001 ... 9237 9314 9308]\\n [ 9123 9089 8963 ... 9778 9518 9274]]))\n", - " \n", - " \n", - " 34\n", - " (((604665.0, 2973675.0, 612345.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8788 8805 8800 ... 8783 8788 8792]\\n [8792 8790 8793 ... 8789 8796 8785]\\n [8794 8804 8794 ... 8792 8802 8811]\\n ...\\n [8792 8770 8771 ... 8785 8769 8769]\\n [8785 8769 8787 ... 8769 8772 8777]\\n [8780 8763 8790 ... 8762 8770 8774]]))\n", - " \n", - " \n", - " 35\n", - " (((612345.0, 2973675.0, 620025.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8796 8790 8797 ... 8802 8807 8807]\\n [8801 8806 8787 ... 8811 8818 8850]\\n [8795 8801 8806 ... 8797 8814 8815]\\n ...\\n [8771 8769 8787 ... 8802 8809 8816]\\n [8774 8777 8781 ... 8798 8819 8810]\\n [8777 8775 8766 ... 8782 8805 8786]]))\n", - " \n", - " \n", - " 36\n", - " (((658425.0, 2973675.0, 666105.0, 2981355.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8962 8957 8922 ... 9001 8995 9002]\\n [8938 8941 8936 ... 9001 9001 9012]\\n [8949 8939 8944 ... 8991 8986 9015]\\n ...\\n [8951 8962 8946 ... 9000 9019 9000]\\n [8960 8941 8930 ... 8996 8977 8971]\\n [8945 8924 8964 ... 8993 8976 9017]]))\n", - " \n", - " \n", - " 37\n", - " (((543225.0, 2958315.0, 550905.0, 2965995.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[12803 12598 11798 ... 9106 9120 9118]\\n [14612 13071 11067 ... 9091 9080 9075]\\n [13822 11982 11517 ... 9057 9078 9065]\\n ...\\n [13038 13592 14077 ... 9273 9263 9250]\\n [12724 13054 13805 ... 9275 9309 9292]\\n [12043 11960 13863 ... 9384 9389 9388]]))\n", - " \n", - " \n", - " 38\n", - " (((704505.0, 2958315.0, 709815.0, 2965995.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[177, 256], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 39\n", - " (((527865.0, 2950635.0, 535545.0, 2958315.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[20582 20739 20425 ... 9685 9588 9523]\\n [21068 20891 20466 ... 9582 9398 9422]\\n [20643 20751 20623 ... 9626 9413 9405]\\n ...\\n [10269 9976 9906 ... 9966 9957 9938]\\n [10262 10023 9695 ... 9949 9944 9936]\\n [10215 9936 9576 ... 9903 9921 9945]]))\n", - " \n", - " \n", - " 40\n", - " (((620025.0, 2942955.0, 627705.0, 2950635.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 256], cell_type=CellType(uint16raw, None), cells=[[8818 8819 8814 ... 8844 8815 8810]\\n [8804 8817 8821 ... 8797 8785 8783]\\n [8805 8804 8807 ... 8809 8821 8781]\\n ...\\n [8817 8826 8844 ... 8815 8824 8852]\\n [8841 8822 8792 ... 8804 8801 8821]\\n [8804 8811 8807 ... 8794 8796 8823]]))\n", - " \n", - " \n", - " 41\n", - " (((481785.0, 2917785.0, 489465.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 42\n", - " (((520185.0, 2917785.0, 527865.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 43\n", - " (((658425.0, 2917785.0, 666105.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[ 0 0 0 ... 9231 9227 9247]\\n [ 0 0 0 ... 9245 9242 9246]\\n [ 0 0 0 ... 9262 9252 9265]\\n ...\\n [ 0 0 0 ... 0 0 0]\\n [ 0 0 0 ... 0 0 0]\\n [ 0 0 0 ... 0 0 0]]))\n", - " \n", - " \n", - " 44\n", - " (((673785.0, 2917785.0, 681465.0, 2919915.0), (+proj=utm +zone=17 +datum=WGS84 +units=m +no_defs ,)), Tile(dimensions=[256, 71], cell_type=CellType(uint16raw, None), cells=[[0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n ...\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]\\n [0 0 0 ... 0 0 0]]))\n", + " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", + " (-6834789.194217826, 163086.07621782675, -6716181.138786679, 281694.1316489733)\n", + " \n", " \n", " \n", "\n", "" ], "text/plain": [ - " tile\n", - "0 (((504825.0, 3142635.0, 512505.0, 3150315.0), ...\n", - "1 (((497145.0, 3127275.0, 504825.0, 3134955.0), ...\n", - "2 (((643065.0, 3127275.0, 650745.0, 3134955.0), ...\n", - "3 (((650745.0, 3127275.0, 658425.0, 3134955.0), ...\n", - "4 (((489465.0, 3119595.0, 497145.0, 3127275.0), ...\n", - "5 (((512505.0, 3119595.0, 520185.0, 3127275.0), ...\n", - "6 (((566265.0, 3088875.0, 573945.0, 3096555.0), ...\n", - "7 (((650745.0, 3081195.0, 658425.0, 3088875.0), ...\n", - "8 (((481785.0, 3073515.0, 489465.0, 3081195.0), ...\n", - "9 (((643065.0, 3073515.0, 650745.0, 3081195.0), ...\n", - "10 (((550905.0, 3065835.0, 558585.0, 3073515.0), ...\n", - "11 (((581625.0, 3065835.0, 589305.0, 3073515.0), ...\n", - "12 (((527865.0, 3050475.0, 535545.0, 3058155.0), ...\n", - "13 (((550905.0, 3050475.0, 558585.0, 3058155.0), ...\n", - "14 (((566265.0, 3050475.0, 573945.0, 3058155.0), ...\n", - "15 (((627705.0, 3050475.0, 635385.0, 3058155.0), ...\n", - "16 (((589305.0, 3042795.0, 596985.0, 3050475.0), ...\n", - "17 (((512505.0, 3035115.0, 520185.0, 3042795.0), ...\n", - "18 (((573945.0, 3035115.0, 581625.0, 3042795.0), ...\n", - "19 (((612345.0, 3035115.0, 620025.0, 3042795.0), ...\n", - "20 (((635385.0, 3035115.0, 643065.0, 3042795.0), ...\n", - "21 (((512505.0, 3027435.0, 520185.0, 3035115.0), ...\n", - "22 (((481785.0, 3019755.0, 489465.0, 3027435.0), ...\n", - "23 (((543225.0, 3019755.0, 550905.0, 3027435.0), ...\n", - "24 (((620025.0, 3019755.0, 627705.0, 3027435.0), ...\n", - "25 (((527865.0, 3012075.0, 535545.0, 3019755.0), ...\n", - "26 (((558585.0, 3012075.0, 566265.0, 3019755.0), ...\n", - "27 (((604665.0, 3012075.0, 612345.0, 3019755.0), ...\n", - "28 (((566265.0, 3004395.0, 573945.0, 3012075.0), ...\n", - "29 (((689145.0, 2996715.0, 696825.0, 3004395.0), ...\n", - "30 (((497145.0, 2981355.0, 504825.0, 2989035.0), ...\n", - "31 (((512505.0, 2973675.0, 520185.0, 2981355.0), ...\n", - "32 (((535545.0, 2973675.0, 543225.0, 2981355.0), ...\n", - "33 (((566265.0, 2973675.0, 573945.0, 2981355.0), ...\n", - "34 (((604665.0, 2973675.0, 612345.0, 2981355.0), ...\n", - "35 (((612345.0, 2973675.0, 620025.0, 2981355.0), ...\n", - "36 (((658425.0, 2973675.0, 666105.0, 2981355.0), ...\n", - "37 (((543225.0, 2958315.0, 550905.0, 2965995.0), ...\n", - "38 (((704505.0, 2958315.0, 709815.0, 2965995.0), ...\n", - "39 (((527865.0, 2950635.0, 535545.0, 2958315.0), ...\n", - "40 (((620025.0, 2942955.0, 627705.0, 2950635.0), ...\n", - "41 (((481785.0, 2917785.0, 489465.0, 2919915.0), ...\n", - "42 (((520185.0, 2917785.0, 527865.0, 2919915.0), ...\n", - "43 (((658425.0, 2917785.0, 666105.0, 2919915.0), ...\n", - "44 (((673785.0, 2917785.0, 681465.0, 2919915.0), ..." + " proj_raster_path \\\n", + "0 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "1 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "2 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "3 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "4 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "5 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", + "\n", + " extent \\\n", + "0 (-7427829.47137356, 993342.4642358534, -730922... \n", + "1 (-7309221.415942414, 993342.4642358534, -71906... \n", + "2 (-6953397.249648973, 756126.3533735601, -68347... \n", + "3 (-7783653.637667, 281694.1316489733, -7665045.... \n", + "4 (-7783653.637667, 163086.07621782675, -7665045... \n", + "5 (-6834789.194217826, 163086.07621782675, -6716... \n", + "\n", + " tile \n", + "0 Tile(dimensions=[256, 256], cell_type=CellType... \n", + "1 Tile(dimensions=[257, 256], cell_type=CellType... \n", + "2 Tile(dimensions=[257, 257], cell_type=CellType... \n", + "3 Tile(dimensions=[256, 256], cell_type=CellType... \n", + "4 Tile(dimensions=[256, 256], cell_type=CellType... \n", + "5 Tile(dimensions=[256, 256], cell_type=CellType... " ] }, - "execution_count": 5, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Look at a sample\n", - "pandas_df = df.select(df.tile).sample(0.05).toPandas()\n", + "pandas_df = df.select(\n", + " df.proj_raster_path,\n", + " rf_extent(df.proj_raster).alias('extent'),\n", + " rf_tile(df.proj_raster).alias('tile'),\n", + ").sample(0.05).toPandas()\n", "pandas_df" ] }, From 7da526746b49a0cb8183d50edb1780e0b6fc6522 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 28 Jun 2019 15:08:24 -0400 Subject: [PATCH 200/380] Testing CI build with deletion of Python sources removed. --- project/PythonBuildPlugin.scala | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 71d66b076..32c01538c 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -41,21 +41,20 @@ object PythonBuildPlugin extends AutoPlugin { } import autoImport._ - def copySources(srcDir: SettingKey[File], destDir: SettingKey[File], deleteFirst: Boolean) = Def.task { + def copySources(srcDir: SettingKey[File], destDir: SettingKey[File]) = Def.task { val s = streams.value val src = srcDir.value val dest = destDir.value - if (deleteFirst) - IO.delete(dest) - dest.mkdirs() + if (!dest.exists()) + dest.mkdirs() s.log.info(s"Copying '$src' to '$dest'") IO.copyDirectory(src, dest) dest } val copyPySources = Def.sequential( - copySources(Compile / pythonSource, Python / target, true), - copySources(Test / pythonSource, Python / test / target, false) + copySources(Compile / pythonSource, Python / target), + copySources(Test / pythonSource, Python / test / target) ) val pyWhlJar = Def.task { @@ -122,6 +121,7 @@ object PythonBuildPlugin extends AutoPlugin { inConfig(Python)(Seq( target := (Compile / target).value / "python", test / target := (Compile / target).value / "python" / "tests", + includeFilter := "*", packageBin := Def.sequential( Compile / packageBin, pyWhl, From 6a7bc0cf9dcde2439a80695dd05a255c8244a7be Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 28 Jun 2019 15:55:18 -0400 Subject: [PATCH 201/380] "Modernized" handling of Python sources in build plugin. --- project/PythonBuildPlugin.scala | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 32c01538c..d3dd3ea1b 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -24,6 +24,7 @@ import sbt.Keys.{`package`, _} import sbt._ import complete.DefaultParsers._ import sbt.Tests.Summary +import sbt.util.CacheStore import scala.sys.process.Process import sbtassembly.AssemblyPlugin.autoImport.assembly @@ -41,22 +42,22 @@ object PythonBuildPlugin extends AutoPlugin { } import autoImport._ - def copySources(srcDir: SettingKey[File], destDir: SettingKey[File]) = Def.task { - val s = streams.value - val src = srcDir.value - val dest = destDir.value - if (!dest.exists()) - dest.mkdirs() - s.log.info(s"Copying '$src' to '$dest'") - IO.copyDirectory(src, dest) - dest + val copyPySources = Def.task { + val log = streams.value.log + + val destDir = (Python / target).value + val cacheDir = streams.value.cacheDirectory + val maps = (Python / mappings).value + + val resolved = maps map { case (file, d) => (file, destDir / d) } + + log.info(s"Synchronizing ${maps.size} files to '${destDir}'") + resolved.foreach(println) + + Sync.sync(CacheStore(cacheDir / "python"))(resolved) + destDir } - val copyPySources = Def.sequential( - copySources(Compile / pythonSource, Python / target), - copySources(Test / pythonSource, Python / test / target) - ) - val pyWhlJar = Def.task { val log = streams.value.log val buildDir = (Python / target).value @@ -94,8 +95,7 @@ object PythonBuildPlugin extends AutoPlugin { pythonCommand := "python", pySetup := { val s = streams.value - val _ = copyPySources.value - val wd = (Python / target).value + val wd = copyPySources.value val args = spaceDelimited("").parsed val cmd = Seq(pythonCommand.value, "setup.py") ++ args val ver = version.value @@ -122,6 +122,7 @@ object PythonBuildPlugin extends AutoPlugin { target := (Compile / target).value / "python", test / target := (Compile / target).value / "python" / "tests", includeFilter := "*", + mappings := Path.selectSubpaths((Compile / pythonSource).value, (Python / includeFilter).value).toSeq, packageBin := Def.sequential( Compile / packageBin, pyWhl, From 27b47441c6ad7ace370b37b62039f0c1e40554e9 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sat, 29 Jun 2019 11:04:18 -0400 Subject: [PATCH 202/380] Further refinement of python source file management. --- project/PythonBuildPlugin.scala | 16 +++++----------- pyrasterframes/build.sbt | 2 -- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index d3dd3ea1b..859fdec1f 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -19,7 +19,6 @@ * */ -import sbt.KeyRanks.ASetting import sbt.Keys.{`package`, _} import sbt._ import complete.DefaultParsers._ @@ -35,7 +34,6 @@ object PythonBuildPlugin extends AutoPlugin { object autoImport { val Python = config("python") - val pythonSource = settingKey[File]("Default Python source directory.").withRank(ASetting) val pythonCommand = settingKey[String]("Python command. Defaults to 'python'") val pySetup = inputKey[Int]("Run 'python setup.py '. Returns exit code.") val pyWhl = taskKey[File]("Builds the Python wheel distribution") @@ -44,16 +42,11 @@ object PythonBuildPlugin extends AutoPlugin { val copyPySources = Def.task { val log = streams.value.log - val destDir = (Python / target).value val cacheDir = streams.value.cacheDirectory val maps = (Python / mappings).value - val resolved = maps map { case (file, d) => (file, destDir / d) } - log.info(s"Synchronizing ${maps.size} files to '${destDir}'") - resolved.foreach(println) - Sync.sync(CacheStore(cacheDir / "python"))(resolved) destDir } @@ -103,8 +96,6 @@ object PythonBuildPlugin extends AutoPlugin { Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! }, pyWhl := pyWhlImp.value, - Compile / pythonSource := (Compile / sourceDirectory).value / "python", - Test / pythonSource := (Test / sourceDirectory).value / "python", Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value, Test / testQuick := (Python / testQuick).evaluated, Test / executeTests := { @@ -119,10 +110,13 @@ object PythonBuildPlugin extends AutoPlugin { } ) ++ inConfig(Python)(Seq( + sourceDirectory := (Compile / sourceDirectory).value / "python", + sourceDirectories := Seq((Python / sourceDirectory).value), target := (Compile / target).value / "python", - test / target := (Compile / target).value / "python" / "tests", includeFilter := "*", - mappings := Path.selectSubpaths((Compile / pythonSource).value, (Python / includeFilter).value).toSeq, + excludeFilter := HiddenFileFilter || "__pycache__" || "*.egg-info", + sources := Defaults.collectFiles(Python / sourceDirectories, Python / includeFilter, Python / excludeFilter).value, + mappings := Defaults.relativeMappings(Python / sources, Python / sourceDirectories).value, packageBin := Def.sequential( Compile / packageBin, pyWhl, diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 896454e36..0b6575e7e 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -2,8 +2,6 @@ addCommandAlias("pyDocs", "pyrasterframes/doc") addCommandAlias("pyTest", "pyrasterframes/test") addCommandAlias("pyBuild", "pyrasterframes/package") -Test / pythonSource := (Compile / sourceDirectory).value / "tests" - exportJars := true Python / doc / sourceDirectory := (Python / target).value / "docs" Python / doc / target := (Python / target).value / "docs" From 493e10d0e8bd055a12f062b8ec0c59d02b0ff024 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sat, 29 Jun 2019 14:41:16 -0400 Subject: [PATCH 203/380] Replaced all "_rf_unique_functions" with explicit forms. --- .../python/pyrasterframes/rasterfunctions.py | 198 ++++++------------ .../rasterframes/py/PyRFContext.scala | 2 +- 2 files changed, 61 insertions(+), 139 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 4876247f3..cb589ddc7 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -36,162 +36,92 @@ def _context_call(name, *args): return f(*args) -def _celltype(cellTypeStr): +def _parse_cell_type(cell_type_str): """ Convert the string cell type to the expected CellType object.""" - return _context_call('rf_cell_type', cellTypeStr) + return _context_call('_parse_cell_type', cell_type_str) -def _create_assembleTile(): - """ Create a function mapping to the Scala implementation.""" - def _(colIndex, rowIndex, cellData, numCols, numRows, cellType): - jfcn = RFContext.active().lookup('rf_assemble_tile') - return Column(jfcn(_to_java_column(colIndex), _to_java_column(rowIndex), _to_java_column(cellData), numCols, numRows, _celltype(cellType))) - _.__name__ = 'rf_assemble_tile' - _.__doc__ = "Create a Tile from a column of cell data with location indices" - _.__module__ = THIS_MODULE - return _ +def rf_cell_types(): + """Return a list of standard cell types""" + return [CellType(str(ct)) for ct in _context_call('rf_cell_types')] -def _create_arrayToTile(): - """ Create a function mapping to the Scala implementation.""" - def _(arrayCol, numCols, numRows): - jfcn = RFContext.active().lookup('rf_array_to_tile') - return Column(jfcn(_to_java_column(arrayCol), numCols, numRows)) - _.__name__ = 'rf_array_to_tile' - _.__doc__ = "Convert array in `arrayCol` into a Tile of dimensions `numCols` and `numRows'" - _.__module__ = THIS_MODULE - return _ +def rf_assemble_tile(col_index, row_index, cell_data_col, num_cols, num_rows, cell_type_str): + """Create a Tile from a column of cell data with location indices""" + jfcn = RFContext.active().lookup('rf_assemble_tile') + return Column(jfcn(_to_java_column(col_index), _to_java_column(row_index), _to_java_column(cell_data_col), num_cols, num_rows, _parse_cell_type(cell_type_str))) -def _create_convertCellType(): - """ Create a function mapping to the Scala implementation.""" - def _(tileCol, cellType): - jfcn = RFContext.active().lookup('rf_convert_cell_type') - return Column(jfcn(_to_java_column(tileCol), _celltype(cellType))) - _.__name__ = 'rf_convert_cell_type' - _.__doc__ = "Convert the numeric type of the Tiles in `tileCol`" - _.__module__ = THIS_MODULE - return _ +def rf_array_to_tile(array_col, num_cols, num_rows): + """Convert array in `array_col` into a Tile of dimensions `num_cols` and `num_rows'""" + jfcn = RFContext.active().lookup('rf_array_to_tile') + return Column(jfcn(_to_java_column(array_col), num_cols, num_rows)) -def _create_makeConstantTile(): - """ Create a function mapping to the Scala implementation.""" - def _(value, cols, rows, cellType): - jfcn = RFContext.active().lookup('rf_make_constant_tile') - return Column(jfcn(value, cols, rows, cellType)) - _.__name__ = 'rf_make_constant_tile' - _.__doc__ = "Constructor for constant tile column" - _.__module__ = THIS_MODULE - return _ +def rf_convert_cell_type(tile_col, cell_type): + """Convert the numeric type of the Tiles in `tileCol`""" + jfcn = RFContext.active().lookup('rf_convert_cell_type') + return Column(jfcn(_to_java_column(tile_col), _parse_cell_type(cell_type))) -def _create_tileZeros(): - """ Create a function mapping to the Scala implementation.""" - def _(cols, rows, cellType = 'float64'): - jfcn = RFContext.active().lookup('rf_make_zeros_tile') - return Column(jfcn(cols, rows, cellType)) - _.__name__ = 'rf_make_zeros_tile' - _.__doc__ = "Create column of constant tiles of zero" - _.__module__ = THIS_MODULE - return _ +def rf_make_constant_tile(value, cols, rows, cell_type): + """Constructor for constant tile column""" + jfcn = RFContext.active().lookup('rf_make_constant_tile') + return Column(jfcn(value, cols, rows, cell_type)) -def _create_tileOnes(): - """ Create a function mapping to the Scala implementation.""" - def _(cols, rows, cellType = 'float64'): - jfcn = RFContext.active().lookup('rf_make_ones_tile') - return Column(jfcn(cols, rows, cellType)) - _.__name__ = 'rf_tile_ones' - _.__doc__ = "Create column of constant tiles of one" - _.__module__ = THIS_MODULE - return _ +def rf_make_zeros_tile(cols, rows, cell_type='float64'): + """Create column of constant tiles of zero""" + jfcn = RFContext.active().lookup('rf_make_zeros_tile') + return Column(jfcn(cols, rows, cell_type)) -def _create_rasterize(): - """ Create a function mapping to the Scala rf_rasterize function. """ - def _(geometryCol, boundsCol, valueCol, numCols, numRows): - jfcn = RFContext.active().lookup('rf_rasterize') - return Column(jfcn(_to_java_column(geometryCol), _to_java_column(boundsCol), _to_java_column(valueCol), numCols, numRows)) - _.__name__ = 'rf_rasterize' - _.__doc__ = 'Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value.' - _.__module__ = THIS_MODULE - return _ +def rf_make_ones_tile(cols, rows, cell_type='float64'): + """Create column of constant tiles of one""" + jfcn = RFContext.active().lookup('rf_make_ones_tile') + return Column(jfcn(cols, rows, cell_type)) -def _create_reproject_geometry(): - """ Create a function mapping to the Scala st_reproject function. """ - def _(geometryCol, srcCRSName, dstCRSName): - jfcn = RFContext.active().lookup('st_reproject') - return Column(jfcn(_to_java_column(geometryCol), srcCRSName, dstCRSName)) - _.__name__ = 'st_reproject' - _.__doc__ = """Reproject a column of geometry given the CRS names of the source and destination. -Currently supported registries are EPSG, ESRI, WORLD, NAD83, & NAD27. -An example of a valid CRS name is EPSG:3005. -""" - _.__module__ = THIS_MODULE - return _ +def rf_rasterize(geometry_col, bounds_col, value_col, num_cols, num_rows): + """Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value.""" + jfcn = RFContext.active().lookup('rf_rasterize') + return Column(jfcn(_to_java_column(geometry_col), _to_java_column(bounds_col), _to_java_column(value_col), num_cols, num_rows)) -def _create_explode_tiles(): - """ Create a function mapping to Scala rf_explode_tiles function """ - def _(*args): - jfcn = RFContext.active().lookup('rf_explode_tiles') - jcols = [_to_java_column(arg) for arg in args] - return Column(jfcn(RFContext.active().list_to_seq(jcols))) - _.__name__ = 'rf_explode_tiles' - _.__doc__ = 'Create a row for each cell in Tile.' - _.__module__ = THIS_MODULE - return _ +def st_reproject(geometry_col, src_crs_name, dst_crs_name): + """Reproject a column of geometry given the CRS names of the source and destination. + Currently supported registries are EPSG, ESRI, WORLD, NAD83, & NAD27. + An example of a valid CRS name is EPSG:3005.""" + jfcn = RFContext.active().lookup('st_reproject') + return Column(jfcn(_to_java_column(geometry_col), src_crs_name, dst_crs_name)) -def _create_explode_tiles_sample(): - """ Create a function mapping to Scala rf_explode_tiles_sample function""" - def _(sample_frac, seed, *tile_cols): - jfcn = RFContext.active().lookup('rf_explode_tiles_sample') - jcols = [_to_java_column(arg) for arg in tile_cols] - return Column(jfcn(sample_frac, seed, RFContext.active().list_to_seq(jcols))) +def rf_explode_tiles(*args): + """Create a row for each cell in Tile.""" + jfcn = RFContext.active().lookup('rf_explode_tiles') + jcols = [_to_java_column(arg) for arg in args] + return Column(jfcn(RFContext.active().list_to_seq(jcols))) - _.__name__ = 'rf_explode_tiles_sample' - _.__doc__ = 'Create a row for a sample of cells in Tile columns.' - _.__module__ = THIS_MODULE - return _ +def rf_explode_tiles_sample(sample_frac, seed, *tile_cols): + """Create a row for a sample of cells in Tile columns.""" + jfcn = RFContext.active().lookup('rf_explode_tiles_sample') + jcols = [_to_java_column(arg) for arg in tile_cols] + return Column(jfcn(sample_frac, seed, RFContext.active().list_to_seq(jcols))) -def _create_maskByValue(): - """ Create a function mapping to Scala rf_mask_by_value function """ - def _(data_tile, mask_tile, mask_value): - jfcn = RFContext.active().lookup('rf_mask_by_value') - return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) - _.__name__ = 'rf_mask_by_value' - _.__doc__ = 'Generate a tile with the values from the data tile, but where cells in the masking tile contain the masking value, replace the data value with NODATA.' - _.__module__ = THIS_MODULE - return _ -def _create_inverseMaskByValue(): - """ Create a function mapping to Scala rf_inverse_mask_by_value function """ - def _(data_tile, mask_tile, mask_value): - jfcn = RFContext.active().lookup('rf_inverse_mask_by_value') - return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) - _.__name__ = 'rf_inverse_mask_by_value' - _.__doc__ = 'Generate a tile with the values from the data tile, but where cells in the masking tile do not contain the masking value, replace the data value with NODATA.' - _.__module__ = THIS_MODULE - return _ +def rf_mask_by_value(data_tile, mask_tile, mask_value): + """Generate a tile with the values from the data tile, but where cells in the masking tile contain the masking + value, replace the data value with NODATA. """ + jfcn = RFContext.active().lookup('rf_mask_by_value') + return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) -_rf_unique_functions = { - 'rf_array_to_tile': _create_arrayToTile(), - 'rf_assemble_tile': _create_assembleTile(), - 'rf_cell_types': lambda: [CellType(str(ct)) for ct in _context_call('rf_cell_types')], - 'rf_convert_cell_type': _create_convertCellType(), - 'rf_explode_tiles': _create_explode_tiles(), - 'rf_explode_tiles_sample': _create_explode_tiles_sample(), - 'rf_make_constant_tile': _create_makeConstantTile(), - 'rf_mask_by_value': _create_maskByValue(), - 'rf_inverse_mask_by_value': _create_inverseMaskByValue(), - 'rf_rasterize': _create_rasterize(), - 'st_reproject': _create_reproject_geometry(), - 'rf_make_ones_tile': _create_tileOnes(), - 'rf_make_zeros_tile': _create_tileZeros(), -} + +def rf_inverse_mask_by_value(data_tile, mask_tile, mask_value): + """Generate a tile with the values from the data tile, but where cells in the masking tile do not contain the + masking value, replace the data value with NODATA. """ + jfcn = RFContext.active().lookup('rf_inverse_mask_by_value') + return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) _rf_column_scalar_functions = { @@ -360,11 +290,6 @@ def _(data_tile, mask_tile, mask_value): } -__all__ = list(_rf_column_functions.keys()) + \ - list(_rf_column_scalar_functions.keys()) + \ - list(_rf_unique_functions.keys()) - - def _create_column_function(name, doc=""): """ Create a mapping to Scala UDF for a column function by name""" def _(*args): @@ -396,8 +321,5 @@ def _register_functions(): for name, doc in _rf_column_scalar_functions.items(): globals()[name] = _create_columnScalarFunction(name, doc) - for name, func in _rf_unique_functions.items(): - globals()[name] = func - _register_functions() \ No newline at end of file diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 31ee5107a..4590eccc4 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -124,7 +124,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions /** * Convenience functions for use in Python */ - def rf_cell_type(name: String): CellType = CellType.fromName(name) + def _parse_cell_type(name: String): CellType = CellType.fromName(name) /** * Convenience list of valid cell type strings From 84a8f1a2237bda0879fab10eb3c95db087a65292 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sat, 29 Jun 2019 16:11:46 -0400 Subject: [PATCH 204/380] Replaced all `_rf_column_scalar_functions` with explicit forms. --- .../python/pyrasterframes/rasterfunctions.py | 142 +++++++++++++----- 1 file changed, 106 insertions(+), 36 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index cb589ddc7..d7177a068 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -124,29 +124,112 @@ def rf_inverse_mask_by_value(data_tile, mask_tile, mask_value): return Column(jfcn(_to_java_column(data_tile), _to_java_column(mask_tile), _to_java_column(mask_value))) -_rf_column_scalar_functions = { - 'rf_with_no_data': 'Assign a `NoData` value to the Tiles in the given Column.', - 'rf_local_add_double': 'Add a scalar to a Tile', - 'rf_local_add_int': 'Add a scalar to a Tile', - 'rf_local_subtract_double': 'Subtract a scalar from a Tile', - 'rf_local_subtract_int': 'Subtract a scalar from a Tile', - 'rf_local_multiply_double': 'Multiply a Tile by a scalar', - 'rf_local_multiply_int': 'Multiply a Tile by a scalar', - 'rf_local_divide_double': 'Divide a Tile by a scalar', - 'rf_local_divide_int': 'Divide a Tile by a scalar', - 'rf_local_less_double': 'Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0', - 'rf_local_less_int': 'Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0', - 'rf_local_less_equal_double': 'Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0', - 'rf_local_less_equal_int': 'Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0', - 'rf_local_greater_double': 'Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0', - 'rf_local_greater_int': 'Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0', - 'rf_local_greater_equal_double': 'Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0', - 'rf_local_greater_equal_int': 'Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0', - 'rf_local_equal_double': 'Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0', - 'rf_local_equal_int': 'Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0', - 'rf_local_unequal_double': 'Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0', - 'rf_local_unequal_int': 'Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0', -} +def _apply_scalar_to_tile(name, tile_col, scalar): + jfcn = RFContext.active().lookup(name) + return Column(jfcn(_to_java_column(tile_col), scalar)) + +def rf_with_no_data(tile_col, scalar): + """Assign a `NoData` value to the Tiles in the given Column.""" + return _apply_scalar_to_tile('rf_with_no_data', tile_col, scalar) + +def rf_local_add_double(tile_col, scalar): + """Add a floating point scalar to a Tile""" + return _apply_scalar_to_tile('rf_local_add_double', tile_col, scalar) + + +def rf_local_add_int(tile_col, scalar): + """Add an integral scalar to a Tile""" + return _apply_scalar_to_tile('rf_local_add_int', tile_col, scalar) + + +def rf_local_subtract_double(tile_col, scalar): + """Subtract a floating point scalar from a Tile""" + return _apply_scalar_to_tile('rf_local_subtract_double', tile_col, scalar) + + +def rf_local_subtract_int(tile_col, scalar): + """Subtract an integral scalar from a Tile""" + return _apply_scalar_to_tile('rf_local_subtract_int', tile_col, scalar) + + +def rf_local_multiply_double(tile_col, scalar): + """Multiply a Tile by a float point scalar""" + return _apply_scalar_to_tile('rf_local_multiply_double', tile_col, scalar) + + +def rf_local_multiply_int(tile_col, scalar): + """Multiply a Tile by an integral scalar""" + return _apply_scalar_to_tile('rf_local_multiply_int', tile_col, scalar) + + +def rf_local_divide_double(tile_col, scalar): + """Divide a Tile by a floating point scalar""" + return _apply_scalar_to_tile('rf_local_divide_double', tile_col, scalar) + + +def rf_local_divide_int(tile_col, scalar): + """Divide a Tile by an integral scalar""" + return _apply_scalar_to_tile('rf_local_divide_int', tile_col, scalar) + + +def rf_local_less_double(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0""" + return _apply_scalar_to_tile('foo', tile_col, scalar) + + +def rf_local_less_int(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is less than a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_less_double', tile_col, scalar) + + +def rf_local_less_equal_double(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_less_equal_double', tile_col, scalar) + + +def rf_local_less_equal_int(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is less than or equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_less_equal_int', tile_col, scalar) + + +def rf_local_greater_double(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_greater_double', tile_col, scalar) + + +def rf_local_greater_int(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is greater than a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_greater_int', tile_col, scalar) + + +def rf_local_greater_equal_double(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_greater_equal_double', tile_col, scalar) + + +def rf_local_greater_equal_int(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is greater than or equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_greater_equal_int', tile_col, scalar) + + +def rf_local_equal_double(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_equal_double', tile_col, scalar) + + +def rf_local_equal_int(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_equal_int', tile_col, scalar) + + +def rf_local_unequal_double(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_unequal_double', tile_col, scalar) + + +def rf_local_unequal_int(tile_col, scalar): + """Return a Tile with values equal 1 if the cell is not equal to a scalar, otherwise 0""" + return _apply_scalar_to_tile('rf_local_unequal_int', tile_col, scalar) _rf_column_functions = { @@ -302,24 +385,11 @@ def _(*args): return _ -def _create_columnScalarFunction(name, doc=""): - """ Create a mapping to Scala UDF for a (column, scalar) -> column function by name""" - def _(col, scalar): - jfcn = RFContext.active().lookup(name) - return Column(jfcn(_to_java_column(col), scalar)) - _.__name__ = name - _.__doc__ = doc - _.__module__ = THIS_MODULE - return _ - def _register_functions(): """ Register each function in the scope""" for name, doc in _rf_column_functions.items(): globals()[name] = _create_column_function(name, doc) - for name, doc in _rf_column_scalar_functions.items(): - globals()[name] = _create_columnScalarFunction(name, doc) - _register_functions() \ No newline at end of file From 83fbba59624311fa9f951629a4743b850ce6d01f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sat, 29 Jun 2019 16:25:58 -0400 Subject: [PATCH 205/380] Finished conversions of `_register_functions` to explicit forms. --- .../python/pyrasterframes/rasterfunctions.py | 814 ++++++++++++++---- 1 file changed, 651 insertions(+), 163 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index d7177a068..f4fa2e9f4 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -49,7 +49,9 @@ def rf_cell_types(): def rf_assemble_tile(col_index, row_index, cell_data_col, num_cols, num_rows, cell_type_str): """Create a Tile from a column of cell data with location indices""" jfcn = RFContext.active().lookup('rf_assemble_tile') - return Column(jfcn(_to_java_column(col_index), _to_java_column(row_index), _to_java_column(cell_data_col), num_cols, num_rows, _parse_cell_type(cell_type_str))) + return Column( + jfcn(_to_java_column(col_index), _to_java_column(row_index), _to_java_column(cell_data_col), num_cols, num_rows, + _parse_cell_type(cell_type_str))) def rf_array_to_tile(array_col, num_cols, num_rows): @@ -85,7 +87,8 @@ def rf_make_ones_tile(cols, rows, cell_type='float64'): def rf_rasterize(geometry_col, bounds_col, value_col, num_cols, num_rows): """Create a tile where cells in the grid defined by cols, rows, and bounds are filled with the given value.""" jfcn = RFContext.active().lookup('rf_rasterize') - return Column(jfcn(_to_java_column(geometry_col), _to_java_column(bounds_col), _to_java_column(value_col), num_cols, num_rows)) + return Column(jfcn(_to_java_column(geometry_col), _to_java_column(bounds_col), _to_java_column(value_col), num_cols, + num_rows)) def st_reproject(geometry_col, src_crs_name, dst_crs_name): @@ -128,10 +131,12 @@ def _apply_scalar_to_tile(name, tile_col, scalar): jfcn = RFContext.active().lookup(name) return Column(jfcn(_to_java_column(tile_col), scalar)) + def rf_with_no_data(tile_col, scalar): """Assign a `NoData` value to the Tiles in the given Column.""" return _apply_scalar_to_tile('rf_with_no_data', tile_col, scalar) + def rf_local_add_double(tile_col, scalar): """Add a floating point scalar to a Tile""" return _apply_scalar_to_tile('rf_local_add_double', tile_col, scalar) @@ -232,164 +237,647 @@ def rf_local_unequal_int(tile_col, scalar): return _apply_scalar_to_tile('rf_local_unequal_int', tile_col, scalar) -_rf_column_functions = { - # ------- RasterFrames functions ------- - 'rf_dimensions': 'Query the number of (cols, rows) in a Tile.', - 'rf_tile_to_array_int': 'Flattens Tile into an array of integers.', - 'rf_tile_to_array_double': 'Flattens Tile into an array of doubles.', - 'rf_cell_type': 'Extract the Tile\'s cell type', - 'rf_is_no_data_tile': 'Report if the Tile is entirely NODDATA cells', - 'rf_exists': 'Returns true if any cells in the tile are true (non-zero and not NoData)', - 'rf_for_all': 'Returns true if all cells in the tile are true (non-zero and not NoData).', - 'rf_agg_approx_histogram': 'Compute the full column aggregate floating point histogram', - 'rf_agg_stats': 'Compute the full column aggregate floating point statistics', - 'rf_agg_mean': 'Computes the column aggregate mean', - 'rf_agg_data_cells': 'Computes the number of non-NoData cells in a column', - 'rf_agg_no_data_cells': 'Computes the number of NoData cells in a column', - 'rf_tile_histogram': 'Compute the Tile-wise histogram', - 'rf_tile_mean': 'Compute the Tile-wise mean', - 'rf_tile_sum': 'Compute the Tile-wise sum', - 'rf_tile_min': 'Compute the Tile-wise minimum', - 'rf_tile_max': 'Compute the Tile-wise maximum', - 'rf_tile_stats': 'Compute the Tile-wise floating point statistics', - 'rf_render_ascii': 'Render ASCII art of tile', - 'rf_render_matrix': 'Render Tile cell values as numeric values, for debugging purposes', - 'rf_no_data_cells': 'Count of NODATA cells', - 'rf_data_cells': 'Count of cells with valid data', - 'rf_local_add': 'Add two Tiles', - 'rf_local_subtract': 'Subtract two Tiles', - 'rf_local_multiply': 'Multiply two Tiles', - 'rf_local_divide': 'Divide two Tiles', - 'rf_normalized_difference': 'Compute the normalized difference of two tiles', - 'rf_agg_local_max': 'Compute the cell-wise/local max operation between Tiles in a column.', - 'rf_agg_local_min': 'Compute the cellwise/local min operation between Tiles in a column.', - 'rf_agg_local_mean': 'Compute the cellwise/local mean operation between Tiles in a column.', - 'rf_agg_local_data_cells': 'Compute the cellwise/local count of non-NoData cells for all Tiles in a column.', - 'rf_agg_local_no_data_cells': 'Compute the cellwise/local count of NoData cells for all Tiles in a column.', - 'rf_agg_local_stats': 'Compute cell-local aggregate descriptive statistics for a column of Tiles.', - 'rf_mask': 'Where the rf_mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.', - 'rf_inverse_mask': 'Where the rf_mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.', - 'rf_local_less': 'Cellwise less than comparison between two tiles', - 'rf_local_less_equal': 'Cellwise less than or equal to comparison between two tiles', - 'rf_local_greater': 'Cellwise greater than comparison between two tiles', - 'rf_local_greater_equal': 'Cellwise greater than or equal to comparison between two tiles', - 'rf_local_equal': 'Cellwise equality comparison between two tiles', - 'rf_local_unequal': 'Cellwise inequality comparison between two tiles', - 'rf_round': 'Round cell values to the nearest integer without changing the cell type', - 'rf_abs': 'Compute the absolute value of each cell', - 'rf_log': 'Performs cell-wise natural logarithm', - 'rf_log10': 'Performs cell-wise logartithm with base 10', - 'rf_log2': 'Performs cell-wise logartithm with base 2', - 'rf_log1p': 'Performs natural logarithm of cell values plus one', - 'rf_exp': 'Performs cell-wise exponential', - 'rf_exp2': 'Compute 2 to the power of cell values', - 'rf_exp10': 'Compute 10 to the power of cell values', - 'rf_expm1': 'Performs cell-wise exponential, then subtract one', - 'rf_identity': 'Pass tile through unchanged', - 'rf_resample': 'Resample tile to different size based on scalar factor or tile whose dimension to match', - 'rf_crs': 'Get the CRS of a RasterSource or ProjectedRasterTile', - 'st_extent': 'Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)', - 'rf_extent': 'Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)', - 'rf_tile': 'Extracts the Tile component of a ProjectedRasterTile (or Tile).', - 'st_geometry': 'Convert the given extent/bbox to a polygon', - 'rf_geometry': 'Get the extent of a RasterSource or ProjectdRasterTile as a Geometry', - - # ------- JTS functions ------- - # spatial constructors - 'st_geomFromGeoHash': '', - 'st_geomFromWKT': '', - 'st_geomFromWKB': '', - 'st_lineFromText': '', - 'st_makeBox2D': '', - 'st_makeBBox': '', - 'st_makePolygon': '', - 'st_makePoint': '', - 'st_makeLine': '', - 'st_makePointM': '', - 'st_mLineFromText': '', - 'st_mPointFromText': '', - 'st_mPolyFromText': '', - 'st_point': '', - 'st_pointFromGeoHash': '', - 'st_pointFromText': '', - 'st_pointFromWKB': '', - 'st_polygon': '', - 'st_polygonFromText': '', - # spatial converters - 'st_castToPoint': '', - 'st_castToPolygon': '', - 'st_castToLineString': '', - 'st_byteArray': '', - # spatial accessors - 'st_boundary': '', - 'st_coordDim': '', - 'st_dimension': '', - 'st_envelope': '', - 'st_exteriorRing': '', - 'st_geometryN': '', - 'st_geometryType': '', - 'st_interiorRingN': '', - 'st_isClosed': '', - 'st_isCollection': '', - 'st_isEmpty': '', - 'st_isRing': '', - 'st_isSimple': '', - 'st_isValid': '', - 'st_numGeometries': '', - 'st_numPoints': '', - 'st_pointN': '', - 'st_x': '', - 'st_y': '', - # spatial outputs - 'st_asBinary': '', - 'st_asGeoJSON': '', - 'st_asLatLonText': '', - 'st_asText': '', - 'st_geoHash': '', - # spatial processors - 'st_bufferPoint': '', - 'st_antimeridianSafeGeom': '', - # spatial relations - 'st_translate': '', - 'st_contains': '', - 'st_covers': '', - 'st_crosses': '', - 'st_disjoint': '', - 'st_equals': '', - 'st_intersects': '', - 'st_overlaps': '', - 'st_touches': '', - 'st_within': '', - 'st_relate': '', - 'st_relateBool': '', - 'st_area': '', - 'st_closestPoint': '', - 'st_centroid': '', - 'st_distance': '', - 'st_distanceSphere': '', - 'st_length': '', - 'st_aggregateDistanceSphere': '', - 'st_lengthSphere': '', -} - - -def _create_column_function(name, doc=""): - """ Create a mapping to Scala UDF for a column function by name""" - def _(*args): - jfcn = RFContext.active().lookup(name) - jcols = [_to_java_column(arg) for arg in args] - return Column(jfcn(*jcols)) - _.__name__ = name - _.__doc__ = doc - _.__module__ = THIS_MODULE - return _ - - - -def _register_functions(): - """ Register each function in the scope""" - for name, doc in _rf_column_functions.items(): - globals()[name] = _create_column_function(name, doc) - - -_register_functions() \ No newline at end of file +def _apply_column_function(name, *args): + jfcn = RFContext.active().lookup(name) + jcols = [_to_java_column(arg) for arg in args] + return Column(jfcn(*jcols)) + + +def rf_dimensions(*args): + """Query the number of (cols, rows) in a Tile.""" + return _apply_column_function('rf_dimensions', *args) + + +def rf_tile_to_array_int(*args): + """Flattens Tile into an array of integers.""" + return _apply_column_function('rf_tile_to_array_int', *args) + + +def rf_tile_to_array_double(*args): + """Flattens Tile into an array of doubles.""" + return _apply_column_function('rf_tile_to_array_double', *args) + + +def rf_cell_type(*args): + """Extract the Tile's cell type""" + return _apply_column_function('rf_cell_type', *args) + + +def rf_is_no_data_tile(*args): + """Report if the Tile is entirely NODDATA cells""" + return _apply_column_function('rf_is_no_data_tile', *args) + + +def rf_exists(*args): + """Returns true if any cells in the tile are true (non-zero and not NoData)""" + return _apply_column_function('rf_exists', *args) + + +def rf_for_all(*args): + """Returns true if all cells in the tile are true (non-zero and not NoData).""" + return _apply_column_function('rf_for_all', *args) + + +def rf_agg_approx_histogram(*args): + """Compute the full column aggregate floating point histogram""" + return _apply_column_function('rf_agg_approx_histogram', *args) + + +def rf_agg_stats(*args): + """Compute the full column aggregate floating point statistics""" + return _apply_column_function('rf_agg_stats', *args) + + +def rf_agg_mean(*args): + """Computes the column aggregate mean""" + return _apply_column_function('rf_agg_mean', *args) + + +def rf_agg_data_cells(*args): + """Computes the number of non-NoData cells in a column""" + return _apply_column_function('rf_agg_data_cells', *args) + + +def rf_agg_no_data_cells(*args): + """Computes the number of NoData cells in a column""" + return _apply_column_function('rf_agg_no_data_cells', *args) + + +def rf_tile_histogram(*args): + """Compute the Tile-wise histogram""" + return _apply_column_function('rf_tile_histogram', *args) + + +def rf_tile_mean(*args): + """Compute the Tile-wise mean""" + return _apply_column_function('rf_tile_mean', *args) + + +def rf_tile_sum(*args): + """Compute the Tile-wise sum""" + return _apply_column_function('rf_tile_sum', *args) + + +def rf_tile_min(*args): + """Compute the Tile-wise minimum""" + return _apply_column_function('rf_tile_min', *args) + + +def rf_tile_max(*args): + """Compute the Tile-wise maximum""" + return _apply_column_function('rf_tile_max', *args) + + +def rf_tile_stats(*args): + """Compute the Tile-wise floating point statistics""" + return _apply_column_function('rf_tile_stats', *args) + + +def rf_render_ascii(*args): + """Render ASCII art of tile""" + return _apply_column_function('rf_render_ascii', *args) + + +def rf_render_matrix(*args): + """Render Tile cell values as numeric values, for debugging purposes""" + return _apply_column_function('rf_render_matrix', *args) + + +def rf_no_data_cells(*args): + """Count of NODATA cells""" + return _apply_column_function('rf_no_data_cells', *args) + + +def rf_data_cells(*args): + """Count of cells with valid data""" + return _apply_column_function('rf_data_cells', *args) + + +def rf_local_add(*args): + """Add two Tiles""" + return _apply_column_function('rf_local_add', *args) + + +def rf_local_subtract(*args): + """Subtract two Tiles""" + return _apply_column_function('rf_local_subtract', *args) + + +def rf_local_multiply(*args): + """Multiply two Tiles""" + return _apply_column_function('rf_local_multiply', *args) + + +def rf_local_divide(*args): + """Divide two Tiles""" + return _apply_column_function('rf_local_divide', *args) + + +def rf_normalized_difference(*args): + """Compute the normalized difference of two tiles""" + return _apply_column_function('rf_normalized_difference', *args) + + +def rf_agg_local_max(*args): + """Compute the cell-wise/local max operation between Tiles in a column.""" + return _apply_column_function('rf_agg_local_max', *args) + + +def rf_agg_local_min(*args): + """Compute the cellwise/local min operation between Tiles in a column.""" + return _apply_column_function('rf_agg_local_min', *args) + + +def rf_agg_local_mean(*args): + """Compute the cellwise/local mean operation between Tiles in a column.""" + return _apply_column_function('rf_agg_local_mean', *args) + + +def rf_agg_local_data_cells(*args): + """Compute the cellwise/local count of non-NoData cells for all Tiles in a column.""" + return _apply_column_function('rf_agg_local_data_cells', *args) + + +def rf_agg_local_no_data_cells(*args): + """Compute the cellwise/local count of NoData cells for all Tiles in a column.""" + return _apply_column_function('rf_agg_local_no_data_cells', *args) + + +def rf_agg_local_stats(*args): + """Compute cell-local aggregate descriptive statistics for a column of Tiles.""" + return _apply_column_function('rf_agg_local_stats', *args) + + +def rf_mask(*args): + """Where the rf_mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.""" + return _apply_column_function('rf_mask', *args) + + +def rf_inverse_mask(*args): + """Where the rf_mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.""" + return _apply_column_function('rf_inverse_mask', *args) + + +def rf_local_less(*args): + """Cellwise less than comparison between two tiles""" + return _apply_column_function('rf_local_less', *args) + + +def rf_local_less_equal(*args): + """Cellwise less than or equal to comparison between two tiles""" + return _apply_column_function('rf_local_less_equal', *args) + + +def rf_local_greater(*args): + """Cellwise greater than comparison between two tiles""" + return _apply_column_function('rf_local_greater', *args) + + +def rf_local_greater_equal(*args): + """Cellwise greater than or equal to comparison between two tiles""" + return _apply_column_function('rf_local_greater_equal', *args) + + +def rf_local_equal(*args): + """Cellwise equality comparison between two tiles""" + return _apply_column_function('rf_local_equal', *args) + + +def rf_local_unequal(*args): + """Cellwise inequality comparison between two tiles""" + return _apply_column_function('rf_local_unequal', *args) + + +def rf_round(*args): + """Round cell values to the nearest integer without changing the cell type""" + return _apply_column_function('rf_round', *args) + + +def rf_abs(*args): + """Compute the absolute value of each cell""" + return _apply_column_function('rf_abs', *args) + + +def rf_log(*args): + """Performs cell-wise natural logarithm""" + return _apply_column_function('rf_log', *args) + + +def rf_log10(*args): + """Performs cell-wise logartithm with base 10""" + return _apply_column_function('rf_log10', *args) + + +def rf_log2(*args): + """Performs cell-wise logartithm with base 2""" + return _apply_column_function('rf_log2', *args) + + +def rf_log1p(*args): + """Performs natural logarithm of cell values plus one""" + return _apply_column_function('rf_log1p', *args) + + +def rf_exp(*args): + """Performs cell-wise exponential""" + return _apply_column_function('rf_exp', *args) + + +def rf_exp2(*args): + """Compute 2 to the power of cell values""" + return _apply_column_function('rf_exp2', *args) + + +def rf_exp10(*args): + """Compute 10 to the power of cell values""" + return _apply_column_function('rf_exp10', *args) + + +def rf_expm1(*args): + """Performs cell-wise exponential, then subtract one""" + return _apply_column_function('rf_expm1', *args) + + +def rf_identity(*args): + """Pass tile through unchanged""" + return _apply_column_function('rf_identity', *args) + + +def rf_resample(*args): + """Resample tile to different size based on scalar factor or tile whose dimension to match""" + return _apply_column_function('rf_resample', *args) + + +def rf_crs(*args): + """Get the CRS of a RasterSource or ProjectedRasterTile""" + return _apply_column_function('rf_crs', *args) + + +def st_extent(*args): + """Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)""" + return _apply_column_function('st_extent', *args) + + +def rf_extent(*args): + """Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)""" + return _apply_column_function('rf_extent', *args) + + +def rf_tile(*args): + """Extracts the Tile component of a ProjectedRasterTile (or Tile).""" + return _apply_column_function('rf_tile', *args) + + +def st_geometry(*args): + """Convert the given extent/bbox to a polygon""" + return _apply_column_function('st_geometry', *args) + + +def rf_geometry(*args): + """Get the extent of a RasterSource or ProjectdRasterTile as a Geometry""" + return _apply_column_function('rf_geometry', *args) + + +def st_geomFromGeoHash(*args): + """""" + return _apply_column_function('st_geomFromGeoHash', *args) + + +def st_geomFromWKT(*args): + """""" + return _apply_column_function('st_geomFromWKT', *args) + + +def st_geomFromWKB(*args): + """""" + return _apply_column_function('st_geomFromWKB', *args) + + +def st_lineFromText(*args): + """""" + return _apply_column_function('st_lineFromText', *args) + + +def st_makeBox2D(*args): + """""" + return _apply_column_function('st_makeBox2D', *args) + + +def st_makeBBox(*args): + """""" + return _apply_column_function('st_makeBBox', *args) + + +def st_makePolygon(*args): + """""" + return _apply_column_function('st_makePolygon', *args) + + +def st_makePoint(*args): + """""" + return _apply_column_function('st_makePoint', *args) + + +def st_makeLine(*args): + """""" + return _apply_column_function('st_makeLine', *args) + + +def st_makePointM(*args): + """""" + return _apply_column_function('st_makePointM', *args) + + +def st_mLineFromText(*args): + """""" + return _apply_column_function('st_mLineFromText', *args) + + +def st_mPointFromText(*args): + """""" + return _apply_column_function('st_mPointFromText', *args) + + +def st_mPolyFromText(*args): + """""" + return _apply_column_function('st_mPolyFromText', *args) + + +def st_point(*args): + """""" + return _apply_column_function('st_point', *args) + + +def st_pointFromGeoHash(*args): + """""" + return _apply_column_function('st_pointFromGeoHash', *args) + + +def st_pointFromText(*args): + """""" + return _apply_column_function('st_pointFromText', *args) + + +def st_pointFromWKB(*args): + """""" + return _apply_column_function('st_pointFromWKB', *args) + + +def st_polygon(*args): + """""" + return _apply_column_function('st_polygon', *args) + + +def st_polygonFromText(*args): + """""" + return _apply_column_function('st_polygonFromText', *args) + + +def st_castToPoint(*args): + """""" + return _apply_column_function('st_castToPoint', *args) + + +def st_castToPolygon(*args): + """""" + return _apply_column_function('st_castToPolygon', *args) + + +def st_castToLineString(*args): + """""" + return _apply_column_function('st_castToLineString', *args) + + +def st_byteArray(*args): + """""" + return _apply_column_function('st_byteArray', *args) + + +def st_boundary(*args): + """""" + return _apply_column_function('st_boundary', *args) + + +def st_coordDim(*args): + """""" + return _apply_column_function('st_coordDim', *args) + + +def st_dimension(*args): + """""" + return _apply_column_function('st_dimension', *args) + + +def st_envelope(*args): + """""" + return _apply_column_function('st_envelope', *args) + + +def st_exteriorRing(*args): + """""" + return _apply_column_function('st_exteriorRing', *args) + + +def st_geometryN(*args): + """""" + return _apply_column_function('st_geometryN', *args) + + +def st_geometryType(*args): + """""" + return _apply_column_function('st_geometryType', *args) + + +def st_interiorRingN(*args): + """""" + return _apply_column_function('st_interiorRingN', *args) + + +def st_isClosed(*args): + """""" + return _apply_column_function('st_isClosed', *args) + + +def st_isCollection(*args): + """""" + return _apply_column_function('st_isCollection', *args) + + +def st_isEmpty(*args): + """""" + return _apply_column_function('st_isEmpty', *args) + + +def st_isRing(*args): + """""" + return _apply_column_function('st_isRing', *args) + + +def st_isSimple(*args): + """""" + return _apply_column_function('st_isSimple', *args) + + +def st_isValid(*args): + """""" + return _apply_column_function('st_isValid', *args) + + +def st_numGeometries(*args): + """""" + return _apply_column_function('st_numGeometries', *args) + + +def st_numPoints(*args): + """""" + return _apply_column_function('st_numPoints', *args) + + +def st_pointN(*args): + """""" + return _apply_column_function('st_pointN', *args) + + +def st_x(*args): + """""" + return _apply_column_function('st_x', *args) + + +def st_y(*args): + """""" + return _apply_column_function('st_y', *args) + + +def st_asBinary(*args): + """""" + return _apply_column_function('st_asBinary', *args) + + +def st_asGeoJSON(*args): + """""" + return _apply_column_function('st_asGeoJSON', *args) + + +def st_asLatLonText(*args): + """""" + return _apply_column_function('st_asLatLonText', *args) + + +def st_asText(*args): + """""" + return _apply_column_function('st_asText', *args) + + +def st_geoHash(*args): + """""" + return _apply_column_function('st_geoHash', *args) + + +def st_bufferPoint(*args): + """""" + return _apply_column_function('st_bufferPoint', *args) + + +def st_antimeridianSafeGeom(*args): + """""" + return _apply_column_function('st_antimeridianSafeGeom', *args) + + +def st_translate(*args): + """""" + return _apply_column_function('st_translate', *args) + + +def st_contains(*args): + """""" + return _apply_column_function('st_contains', *args) + + +def st_covers(*args): + """""" + return _apply_column_function('st_covers', *args) + + +def st_crosses(*args): + """""" + return _apply_column_function('st_crosses', *args) + + +def st_disjoint(*args): + """""" + return _apply_column_function('st_disjoint', *args) + + +def st_equals(*args): + """""" + return _apply_column_function('st_equals', *args) + + +def st_intersects(*args): + """""" + return _apply_column_function('st_intersects', *args) + + +def st_overlaps(*args): + """""" + return _apply_column_function('st_overlaps', *args) + + +def st_touches(*args): + """""" + return _apply_column_function('st_touches', *args) + + +def st_within(*args): + """""" + return _apply_column_function('st_within', *args) + + +def st_relate(*args): + """""" + return _apply_column_function('st_relate', *args) + + +def st_relateBool(*args): + """""" + return _apply_column_function('st_relateBool', *args) + + +def st_area(*args): + """""" + return _apply_column_function('st_area', *args) + + +def st_closestPoint(*args): + """""" + return _apply_column_function('st_closestPoint', *args) + + +def st_centroid(*args): + """""" + return _apply_column_function('st_centroid', *args) + + +def st_distance(*args): + """""" + return _apply_column_function('st_distance', *args) + + +def st_distanceSphere(*args): + """""" + return _apply_column_function('st_distanceSphere', *args) + + +def st_length(*args): + """""" + return _apply_column_function('st_length', *args) + + +def st_aggregateDistanceSphere(*args): + """""" + return _apply_column_function('st_aggregateDistanceSphere', *args) + + +def st_lengthSphere(*args): + """""" + return _apply_column_function('st_lengthSphere', *args) From 371a321ccf0827548b043bb298cc236e42d7c440 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sun, 30 Jun 2019 11:10:33 -0400 Subject: [PATCH 206/380] Renamed DataSource name 'rastersource' to just 'raster'. Fixed #159 --- ...pache.spark.sql.sources.DataSourceRegister | 2 +- .../RasterSourceDataSource.scala | 6 +-- .../RasterSourceRelation.scala | 4 +- .../{rastersource => raster}/package.scala | 19 +++++--- .../RasterSourceDataSourceSpec.scala | 43 ++++++++++++++----- pyrasterframes/README.md | 2 +- pyrasterframes/src/main/python/README.md | 2 +- .../src/main/python/docs/getting-started.pymd | 4 +- .../src/main/python/docs/local-algebra.pymd | 4 +- .../src/main/python/docs/raster-io.pymd | 12 +++--- .../src/main/python/docs/spark-ml.pymd | 2 +- .../main/python/pyrasterframes/__init__.py | 14 +++--- .../python/pyrasterframes/rasterfunctions.py | 2 +- .../{context.py => rf_context.py} | 0 .../main/python/pyrasterframes/rf_types.py | 2 +- .../main/python/tests/PyRasterFramesTests.py | 10 ++--- .../src/main/notebooks/Getting Started.ipynb | 4 +- .../pretty_rendering_rf_types.tile.ipynb | 2 +- 18 files changed, 82 insertions(+), 52 deletions(-) rename datasource/src/main/scala/org/locationtech/rasterframes/datasource/{rastersource => raster}/RasterSourceDataSource.scala (97%) rename datasource/src/main/scala/org/locationtech/rasterframes/datasource/{rastersource => raster}/RasterSourceRelation.scala (96%) rename datasource/src/main/scala/org/locationtech/rasterframes/datasource/{rastersource => raster}/package.scala (78%) rename datasource/src/test/scala/org/locationtech/rasterframes/datasource/{rastersource => raster}/RasterSourceDataSourceSpec.scala (85%) rename pyrasterframes/src/main/python/pyrasterframes/{context.py => rf_context.py} (100%) diff --git a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index d60fa152d..c3148d7ce 100644 --- a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -1,4 +1,4 @@ org.locationtech.rasterframes.datasource.geotiff.GeoTiffDataSource org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisCatalog -org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource +org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala similarity index 97% rename from datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala index 73f5e2597..6626bd6db 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.datasource.rastersource +package org.locationtech.rasterframes.datasource.raster import org.locationtech.rasterframes._ import org.locationtech.rasterframes.util._ @@ -40,7 +40,7 @@ class RasterSourceDataSource extends DataSourceRegister with RelationProvider { } } object RasterSourceDataSource { - final val SHORT_NAME = "rastersource" + final val SHORT_NAME = "raster" final val PATH_PARAM = "path" final val PATHS_PARAM = "paths" final val BAND_INDEXES_PARAM = "bandIndexes" @@ -83,7 +83,7 @@ object RasterSourceDataSource { /** Container for specifying where to select raster paths from. */ case class RasterSourceCatalogRef(tableName: String, bandColumnNames: String*) extends WithBandColumns - private[rastersource] + private[raster] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { def tileDims: Option[TileDimensions] = diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala similarity index 96% rename from datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala index d49f3d911..c5169b8c9 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala @@ -19,14 +19,14 @@ * */ -package org.locationtech.rasterframes.datasource.rastersource +package org.locationtech.rasterframes.datasource.raster import org.apache.spark.rdd.RDD import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourceCatalog, RasterSourceCatalogRef} +import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.{RasterSourceCatalog, RasterSourceCatalogRef} import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala similarity index 78% rename from datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala index bbe0b7774..1376ea5c9 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/rastersource/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala @@ -22,18 +22,19 @@ package org.locationtech.rasterframes.datasource import java.net.URI +import java.util.UUID -import org.apache.spark.sql.DataFrameReader +import org.apache.spark.sql.{DataFrame, DataFrameReader} import shapeless.tag import shapeless.tag.@@ -package object rastersource { +package object raster { trait RasterSourceDataFrameReaderTag type RasterSourceDataFrameReader = DataFrameReader @@ RasterSourceDataFrameReaderTag - /** Adds `rastersource` format specifier to `DataFrameReader`. */ + /** Adds `raster` format specifier to `DataFrameReader`. */ implicit class DataFrameReaderHasRasterSourceFormat(val reader: DataFrameReader) { - def rastersource: RasterSourceDataFrameReader = + def raster: RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.format(RasterSourceDataSource.SHORT_NAME)) } @@ -50,7 +51,15 @@ package object rastersource { reader.option(RasterSourceDataSource.TILE_DIMS_PARAM, s"$cols,$rows") ) - def fromTable(tableName: String, bandColumnNames: String*): RasterSourceDataFrameReader = + def fromCatalog(catalog: DataFrame, bandColumnNames: String*): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader] { + val tmpName = UUID.randomUUID().toString.replace("-", "") + catalog.createOrReplaceTempView(tmpName) + reader.option(RasterSourceDataSource.CATALOG_TABLE_PARAM, tmpName) + .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) + } + + def fromCatalog(tableName: String, bandColumnNames: String*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.option(RasterSourceDataSource.CATALOG_TABLE_PARAM, tableName) .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala similarity index 85% rename from datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala index b145fe129..48c524980 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/rastersource/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala @@ -19,9 +19,9 @@ * */ -package org.locationtech.rasterframes.datasource.rastersource +package org.locationtech.rasterframes.datasource.raster import org.locationtech.rasterframes.{TestEnvironment, _} -import org.locationtech.rasterframes.datasource.rastersource.RasterSourceDataSource.{RasterSourceCatalog, _} +import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.{RasterSourceCatalog, _} import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.util._ @@ -81,14 +81,14 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { val b = DEFAULT_COLUMN_NAME it("should default to a single band schema") { - val df = spark.read.rastersource.load(l8B1SamplePath.toASCIIString) + val df = spark.read.raster.load(l8B1SamplePath.toASCIIString) val tcols = df.tileColumns tcols.length should be(1) tcols.map(_.columnName) should contain(DEFAULT_COLUMN_NAME) } it("should support a multiband schema") { val df = spark.read - .rastersource + .raster .withBandIndexes(0, 1, 2) .load(cogPath.toASCIIString) val tcols = df.tileColumns @@ -97,7 +97,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { } it("should read a multiband file") { val df = spark.read - .rastersource + .raster .withBandIndexes(0, 1, 2) .load(cogPath.toASCIIString) .cache() @@ -111,7 +111,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { } it("should read a single file") { // Image is 1028 x 989 -> 9 x 8 tiles - val df = spark.read.rastersource + val df = spark.read.raster .withTileDimensions(128, 128) .load(cogPath.toASCIIString) @@ -124,7 +124,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.select($"${b}_path").distinct().count() should be(1) } it("should read a multiple files with one band") { - val df = spark.read.rastersource + val df = spark.read.raster .from(Seq(cogPath, l8B1SamplePath, nonCogPath)) .withTileDimensions(128, 128) .load() @@ -132,7 +132,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.schema.size should be(2) } it("should read a multiple files with heterogeneous bands") { - val df = spark.read.rastersource + val df = spark.read.raster .from(Seq(cogPath, l8B1SamplePath, nonCogPath)) .withTileDimensions(128, 128) .withBandIndexes(0, 1, 2, 3) @@ -161,7 +161,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { |${paths.mkString(",")} """.stripMargin.trim - val df = spark.read.rastersource + val df = spark.read.raster .fromCSV(csv) .withTileDimensions(128, 128) .load() @@ -171,6 +171,27 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { df.select($"B1_path").distinct().count() should be (1) } + it("should read a set of coherent bands from multiple files in a dataframe") { + val bandPaths = Seq(( + l8SamplePath(1).toASCIIString, + l8SamplePath(2).toASCIIString, + l8SamplePath(3).toASCIIString)) + .toDF("B1", "B2", "B3") + + val df = spark.read.raster + .fromCatalog(bandPaths, "B1", "B2", "B3") + .withTileDimensions(128, 128) + .load() + + df.schema.size should be(6) + df.tileColumns.size should be (3) + df.select($"B1_path").distinct().count() should be (1) + + val diffStats = df.select(rf_tile_stats($"B1") =!= rf_tile_stats($"B2")).as[Boolean].collect() + diffStats.forall(identity) should be(true) + } + + it("should read a set of coherent bands from multiple files in a table") { val bandPaths = Seq(( l8SamplePath(1).toASCIIString, @@ -180,8 +201,8 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { bandPaths.createOrReplaceTempView("pathsTable") - val df = spark.read.rastersource - .fromTable("pathsTable", "B1", "B2", "B3") + val df = spark.read.raster + .fromCatalog("pathsTable", "B1", "B2", "B3") .withTileDimensions(128, 128) .load() diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index eed711957..6f82e8ebf 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -67,7 +67,7 @@ Then in the pyspark shell or app, import the module and call `withRasterFrames` ```python from pyrasterframes.utils import create_rf_spark_session spark = create_rf_spark_session() -df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') +df = spark.read.raster('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') ``` ## Development diff --git a/pyrasterframes/src/main/python/README.md b/pyrasterframes/src/main/python/README.md index 1ccfcb0d3..16d6163ff 100644 --- a/pyrasterframes/src/main/python/README.md +++ b/pyrasterframes/src/main/python/README.md @@ -23,7 +23,7 @@ Then you can read a raster and do some work with it. from pyrasterframes.rasterfunctions import * from pyspark.sql.functions import lit # Read a MODIS surface reflectance granule -df = spark.read.rastersource('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF') +df = spark.read.raster('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF') # Add 3 element-wise, show some rows of the dataframe df.select(rf_local_add(df.tile, lit(3))).show(5, False) ``` diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index c720a7f16..147c1a1c6 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -20,7 +20,7 @@ from pyrasterframes.rasterfunctions import rf_local_add from pyspark.sql.functions import lit # Read a MODIS surface reflectance granule -df = spark.read.rastersource('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF') +df = spark.read.raster('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF') # Add 3 element-wise, show some rows of the dataframe df.select(rf_local_add(df.proj_raster, lit(3))).show(5, False) @@ -79,7 +79,7 @@ Then in the pyspark shell, import the module and call `withRasterFrames` on the ```python, evaluate=False import pyrasterframes spark = spark.withRasterFrames() -df = spark.read.rastersource('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') +df = spark.read.raster('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') ``` Now you have the configured SparkSession with RasterFrames enabled. diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index a03a7f4ea..6f9d03b69 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -32,8 +32,8 @@ uri_pattern = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B0{}.tif' catalog_df = pd.DataFrame([ {bands[b_num]: uri_pattern.format(b_num) for b_num in bands.keys()} ]) -df = spark.read.rastersource(catalog=catalog_df.to_csv(index=None), - catalog_col_names=list(catalog_df.columns)) +df = spark.read.raster(catalog=catalog_df.to_csv(index=None), + catalog_col_names=list(catalog_df.columns)) df.printSchema() ``` diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 4a8c2ae66..5b66afeaf 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -11,7 +11,7 @@ from pyrasterframes.rasterfunctions import * spark = create_rf_spark_session() ``` -RasterFrames registers a DataSource named `rastersource` that enables reading of GeoTIFFs (and other formats when GDAL is installed) from arbitrary (sets of) URIs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket: +RasterFrames registers a DataSource named `rasters` that enables reading of GeoTIFFs (and other formats when GDAL is installed) from arbitrary (sets of) URIs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket: ```python data_root = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp' @@ -25,7 +25,7 @@ def s2_band(idx): The simplest form is reading a single raster from a single URI: ```python -rf = spark.read.rastersource(s2_band(2)) +rf = spark.read.raster(s2_band(2)) rf.printSchema() ``` @@ -57,7 +57,7 @@ display(tile) ### Single Scene, Multiple Bands -Generally we'll want to work with multiple bands. If you have several singleband image files of the same scene, `rastersource` can make use of a CSV (or other DataFrame) specifying the band columns and scene rows. +Generally we'll want to work with multiple bands. If you have several singleband image files of the same scene, `raster` can make use of a CSV (or other DataFrame) specifying the band columns and scene rows. ```python csv = """ @@ -67,7 +67,7 @@ red,green,blue print(csv) -rf2 = spark.read.rastersource(catalog=csv, catalog_col_names=['red', 'green', 'blue']) +rf2 = spark.read.raster(catalog=csv, catalog_col_names=['red', 'green', 'blue']) rf2.printSchema() rf2.show(5) @@ -117,10 +117,10 @@ equator = (modis_catalog equator.show(3) ``` -Now that we have a catalog of multiple scenes and mutiple bands withit each scene, we can pass it along to `rastersource` load the imagery. To complete the example, we compute some aggregate statistics over NDVI. +Now that we have a catalog of multiple scenes and mutiple bands withit each scene, we can pass it along to `raster` load the imagery. To complete the example, we compute some aggregate statistics over NDVI. ```python -rf = spark.read.rastersource( +rf = spark.read.raster( catalog=equator, catalog_col_names=['red', 'nir'] ).repartition() diff --git a/pyrasterframes/src/main/python/docs/spark-ml.pymd b/pyrasterframes/src/main/python/docs/spark-ml.pymd index d6456436c..d871a8831 100644 --- a/pyrasterframes/src/main/python/docs/spark-ml.pymd +++ b/pyrasterframes/src/main/python/docs/spark-ml.pymd @@ -38,7 +38,7 @@ filenamePattern = "L8-B{}-Elkton-VA.tiff" catalog_df = pd.DataFrame([ {'b' + str(b): os.path.join(resource_dir_uri(), filenamePattern.format(b)) for b in range(1, 8)} ]) -df = spark.read.rastersource(catalog=catalog_df.to_csv(index=None), catalog_col_names=catalog_df.columns) +df = spark.read.raster(catalog=catalog_df.to_csv(index=None), catalog_col_names=catalog_df.columns) df = df.select( rf_crs(df.b1).alias('crs'), rf_extent(df.b1).alias('extent'), diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 9c7379dac..772a6b107 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -29,7 +29,7 @@ from pyspark.sql.column import _to_java_column # Import RasterFrame types and functions -from .context import RFContext +from .rf_context import RFContext from .version import __version__ from .rf_types import RasterFrame, TileExploder, TileUDT, RasterSourceUDT @@ -98,7 +98,7 @@ def _layer_reader(df_reader, format_key, path, **options): return _convert_df(df) -def _rastersource_reader( +def _raster_reader( df_reader, path=None, band_indexes=None, tile_dimensions=(256, 256), @@ -131,15 +131,15 @@ def to_csv(comp): elif isinstance(catalog, DataFrame): import uuid # Create a random view name - name = str(uuid.uuid4()).replace('-', '') - catalog.createOrReplaceTempView(name) + tmp_name = str(uuid.uuid4()).replace('-', '') + catalog.createOrReplaceTempView(tmp_name) options.update({ - "catalogTable": name, + "catalogTable": tmp_name, "catalogColumns": to_csv(catalog_col_names) }) return df_reader \ - .format("rastersource") \ + .format("raster") \ .load(path, **options) @@ -154,7 +154,7 @@ def to_csv(comp): DataFrame.raster_join = _raster_join # Add DataSource convenience methods to the DataFrameReader -DataFrameReader.rastersource = _rastersource_reader +DataFrameReader.raster = _raster_reader # Legacy readers DataFrameReader.geotiff = lambda df_reader, path: _layer_reader(df_reader, "geotiff", path) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index f4fa2e9f4..6b6620a84 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -25,7 +25,7 @@ """ from __future__ import absolute_import from pyspark.sql.column import Column, _to_java_column -from .context import RFContext +from .rf_context import RFContext from .rf_types import CellType THIS_MODULE = 'pyrasterframes' diff --git a/pyrasterframes/src/main/python/pyrasterframes/context.py b/pyrasterframes/src/main/python/pyrasterframes/rf_context.py similarity index 100% rename from pyrasterframes/src/main/python/pyrasterframes/context.py rename to pyrasterframes/src/main/python/pyrasterframes/rf_context.py diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index 12b0ec14f..ddf334d7a 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -31,7 +31,7 @@ class here provides the PyRasterFrames entry point. from pyspark.sql.types import (StructType, StructField, BinaryType, DoubleType, ShortType, IntegerType, StringType) from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable -from pyrasterframes.context import RFContext +from pyrasterframes.rf_context import RFContext import numpy as np __all__ = ['RasterFrame', 'Tile', 'TileUDT', 'CellType', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 917f0f844..a5a3a8002 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -418,7 +418,7 @@ def test_tile_udt_serialization(self): def test_udf_on_tile_type_input(self): import numpy.testing - df = self.spark.read.rastersource(self.img_uri) + df = self.spark.read.raster(self.img_uri) rf = self.rf # create trivial UDF that does something we already do with raster_Functions @@ -687,7 +687,7 @@ def test_raster_join(self): class RasterSource(TestEnvironment): def test_handle_lazy_eval(self): - df = self.spark.read.rastersource(self.img_uri) + df = self.spark.read.raster(self.img_uri) ltdf = df.select('proj_raster') self.assertGreater(ltdf.count(), 0) self.assertIsNotNone(ltdf.first()) @@ -697,7 +697,7 @@ def test_handle_lazy_eval(self): self.assertIsNotNone(tdf.first()) def test_prt_functions(self): - df = self.spark.read.rastersource(self.img_uri) \ + df = self.spark.read.raster(self.img_uri) \ .withColumn('crs', rf_crs('proj_raster')) \ .withColumn('ext', rf_extent('proj_raster')) \ .withColumn('geom', rf_geometry('proj_raster')) @@ -715,7 +715,7 @@ def l8path(b): path_param = '\n'.join([l8path(b) for b in [1, 2, 3]]) # "http://foo.com/file1.tif,http://foo.com/file2.tif" tile_size = 512 - df = self.spark.read.rastersource( + df = self.spark.read.raster( tile_dimensions=(tile_size, tile_size), paths=path_param ) @@ -756,7 +756,7 @@ def path(scene, band): catalog_columns = ','.join(path_pandas.columns.tolist()) # 'b1,b2,b3' path_table = self.spark.createDataFrame(path_pandas) - path_df = self.spark.read.rastersource( + path_df = self.spark.read.raster( tile_dimensions=(512, 512), catalog=path_table, catalog_col_names=catalog_columns diff --git a/rf-notebook/src/main/notebooks/Getting Started.ipynb b/rf-notebook/src/main/notebooks/Getting Started.ipynb index b2d49d5df..33e3c6b6a 100644 --- a/rf-notebook/src/main/notebooks/Getting Started.ipynb +++ b/rf-notebook/src/main/notebooks/Getting Started.ipynb @@ -55,7 +55,7 @@ "source": [ "uri = 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059' \\\n", " '/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF'\n", - "df = spark.read.rastersource(uri)" + "df = spark.read.raster(uri)" ] }, { @@ -127,7 +127,7 @@ "source": [ "The extent struct tells us where in the [CRS](https://spatialreference.org/ref/sr-org/6842/) the tile data covers. The granule is split into arbitrary sized chunks. Each row is a different chunk. Let's see how many.\n", "\n", - "Side note: you can configure the default size of these chunks, which are called Tiles, by passing a tuple of desired columns and rows as: `rastersource(uri, tile_dimensions=(96, 96))`. The default is `(256, 256)`" + "Side note: you can configure the default size of these chunks, which are called Tiles, by passing a tuple of desired columns and rows as: `raster(uri, tile_dimensions=(96, 96))`. The default is `(256, 256)`" ] }, { diff --git a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb index 45167345d..d0541a821 100644 --- a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb +++ b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb @@ -46,7 +46,7 @@ "from pyspark.sql.functions import col\n", "from pyrasterframes.rasterfunctions import rf_crs, rf_extent\n", "# here we flatten the structure to get the tile type \n", - "df = spark.read.rastersource(uri) \\\n", + "df = spark.read.raster(uri) \\\n", " .withColumn('tile2', col('tile').tile) \\\n", " .withColumn('crs', rf_crs(col('tile'))) \\\n", " .withColumn('ext', rf_extent(col('tile'))) \\\n", From dbe18a597d40a209a82ed0044c7f304221ed0972 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sun, 30 Jun 2019 11:27:19 -0400 Subject: [PATCH 207/380] Promoted `geojson` DataSource from experimental. Added to Python API. --- ...pache.spark.sql.sources.DataSourceRegister | 1 + .../datasource/geojson/DOM.scala | 8 +- .../geojson/GeoJsonDataSource.scala | 8 +- .../datasource/geojson/package.scala | 2 +- .../src/test/resources/buildings.geojson | 0 .../src/test/resources/example.geojson | 0 .../geojson/GeoJsonDataSourceTest.scala | 4 +- .../src/it/resources/larger-example.geojson | 91 -- ...pache.spark.sql.sources.DataSourceRegister | 1 - pyrasterframes/src/main/python/docs/index.md | 2 +- .../main/python/docs/spatial-relations.pymd | 1 - .../src/main/python/docs/vector-data.pymd | 17 + .../main/python/pyrasterframes/__init__.py | 6 + .../main/python/tests/PyRasterFramesTests.py | 8 + .../src/main/python/tests/__init__.py | 11 +- .../src/test/resources/buildings.geojson | 899 ++++++++++++++++++ 16 files changed, 952 insertions(+), 107 deletions(-) rename {experimental/src/main/scala/org/locationtech/rasterframes/experimental => datasource/src/main/scala/org/locationtech/rasterframes}/datasource/geojson/DOM.scala (97%) rename {experimental/src/main/scala/org/locationtech/rasterframes/experimental => datasource/src/main/scala/org/locationtech/rasterframes}/datasource/geojson/GeoJsonDataSource.scala (95%) rename {experimental/src/main/scala/org/locationtech/rasterframes/experimental => datasource/src/main/scala/org/locationtech/rasterframes}/datasource/geojson/package.scala (94%) rename {experimental => datasource}/src/test/resources/buildings.geojson (100%) rename {experimental => datasource}/src/test/resources/example.geojson (100%) rename {experimental/src/test/scala/org/locationtech/rasterframes/experimental => datasource/src/test/scala/org/locationtech/rasterframes}/datasource/geojson/GeoJsonDataSourceTest.scala (95%) delete mode 100644 experimental/src/it/resources/larger-example.geojson delete mode 100644 pyrasterframes/src/main/python/docs/spatial-relations.pymd create mode 100644 pyrasterframes/src/main/python/docs/vector-data.pymd create mode 100644 pyrasterframes/src/test/resources/buildings.geojson diff --git a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index c3148d7ce..a44f6fccd 100644 --- a/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/datasource/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -2,3 +2,4 @@ org.locationtech.rasterframes.datasource.geotiff.GeoTiffDataSource org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisLayerDataSource org.locationtech.rasterframes.datasource.geotrellis.GeoTrellisCatalog org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource +org.locationtech.rasterframes.datasource.geojson.GeoJsonDataSource diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/DOM.scala similarity index 97% rename from experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/DOM.scala index 1122f2bc7..dfbbb92f3 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/DOM.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/DOM.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,13 +19,13 @@ * */ -package org.locationtech.rasterframes.experimental.datasource.geojson +package org.locationtech.rasterframes.datasource.geojson +import geotrellis.vector.Extent import org.locationtech.jts.geom.{Envelope, Geometry} import org.locationtech.jts.io.geojson.{GeoJsonReader, GeoJsonWriter} -import geotrellis.vector.Extent -import spray.json._ import spray.json.DefaultJsonProtocol._ +import spray.json._ /** * Lightweight DOM for parsing GeoJSON feature sets. diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/GeoJsonDataSource.scala similarity index 95% rename from experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/GeoJsonDataSource.scala index e2cb93a91..1bda41cd7 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/GeoJsonDataSource.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,10 +19,8 @@ * */ -package org.locationtech.rasterframes.experimental.datasource.geojson +package org.locationtech.rasterframes.datasource.geojson -import org.locationtech.rasterframes.experimental.datasource.geojson.DOM._ -import org.locationtech.jts.geom.Geometry import org.apache.spark.annotation.Experimental import org.apache.spark.rdd.RDD import org.apache.spark.sql.jts.JTSTypes @@ -30,6 +28,8 @@ import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationP import org.apache.spark.sql.types.{DataTypes, StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} import org.locationtech.geomesa.spark.jts._ +import org.locationtech.jts.geom.Geometry +import org.locationtech.rasterframes.datasource.geojson.DOM._ import spray.json.DefaultJsonProtocol._ import spray.json._ diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/package.scala similarity index 94% rename from experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/package.scala rename to datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/package.scala index 0ffda39a0..6c49d75bc 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/geojson/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geojson/package.scala @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.experimental.datasource +package org.locationtech.rasterframes.datasource import org.apache.spark.sql.DataFrameReader diff --git a/experimental/src/test/resources/buildings.geojson b/datasource/src/test/resources/buildings.geojson similarity index 100% rename from experimental/src/test/resources/buildings.geojson rename to datasource/src/test/resources/buildings.geojson diff --git a/experimental/src/test/resources/example.geojson b/datasource/src/test/resources/example.geojson similarity index 100% rename from experimental/src/test/resources/example.geojson rename to datasource/src/test/resources/example.geojson diff --git a/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geojson/GeoJsonDataSourceTest.scala similarity index 95% rename from experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala rename to datasource/src/test/scala/org/locationtech/rasterframes/datasource/geojson/GeoJsonDataSourceTest.scala index 000193085..3d8ec9db3 100644 --- a/experimental/src/test/scala/org/locationtech/rasterframes/experimental/datasource/geojson/GeoJsonDataSourceTest.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geojson/GeoJsonDataSourceTest.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,7 +19,7 @@ * */ -package org.locationtech.rasterframes.experimental.datasource.geojson +package org.locationtech.rasterframes.datasource.geojson import org.apache.spark.sql.types.{LongType, MapType} import org.locationtech.rasterframes.TestEnvironment diff --git a/experimental/src/it/resources/larger-example.geojson b/experimental/src/it/resources/larger-example.geojson deleted file mode 100644 index d0a3b1b82..000000000 --- a/experimental/src/it/resources/larger-example.geojson +++ /dev/null @@ -1,91 +0,0 @@ -{ - "type": "FeatureCollection", - "crs": { - "type": "name", - "properties": { - "name": "EPSG:3857" - } - }, - "features": [{ - "type": "Feature", - "geometry": { - "type": "Point", - "coordinates": [0, 0] - }, - "properties": { - "ID": 1 - } - }, { - "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [[4e6, -2e6], [8e6, 2e6]] - }, - "properties": { - "ID": 2 - } - }, { - "type": "Feature", - "geometry": { - "type": "LineString", - "coordinates": [[4e6, 2e6], [8e6, -2e6]] - }, - "properties": { - "ID": 3 - } - }, { - "type": "Feature", - "geometry": { - "type": "Polygon", - "coordinates": [[[-5e6, -1e6], [-4e6, 1e6], [-3e6, -1e6],[-5e6, -1e6]]] - }, - "properties": { - "ID": 4 - } - }, { - "type": "Feature", - "geometry": { - "type": "MultiLineString", - "coordinates": [ - [[-1e6, -7.5e5], [-1e6, 7.5e5]], - [[1e6, -7.5e5], [1e6, 7.5e5]], - [[-7.5e5, -1e6], [7.5e5, -1e6]], - [[-7.5e5, 1e6], [7.5e5, 1e6]] - ] - }, - "properties": { - "ID": 5 - } - }, { - "type": "Feature", - "geometry": { - "type": "MultiPolygon", - "coordinates": [ - [[[-5e6, 6e6], [-5e6, 8e6], [-3e6, 8e6], [-3e6, 6e6]]], - [[[-2e6, 6e6], [-2e6, 8e6], [0, 8e6], [0, 6e6]]], - [[[1e6, 6e6], [1e6, 8e6], [3e6, 8e6], [3e6, 6e6]]] - ] - }, - "properties": { - "ID": 6 - } - }, { - "type": "Feature", - "geometry": { - "type": "GeometryCollection", - "geometries": [{ - "type": "LineString", - "coordinates": [[-5e6, -5e6], [0, -5e6]] - }, { - "type": "Point", - "coordinates": [4e6, -5e6] - }, { - "type": "Polygon", - "coordinates": [[[1e6, -6e6], [2e6, -4e6], [3e6, -6e6]]] - }] - }, - "properties": { - "ID": 7 - } - }] -} \ No newline at end of file diff --git a/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index 3db32938c..0f44a610b 100644 --- a/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -1,4 +1,3 @@ -org.locationtech.rasterframes.experimental.datasource.geojson.GeoJsonDataSource org.locationtech.rasterframes.experimental.datasource.awspds.L8CatalogDataSource org.locationtech.rasterframes.experimental.datasource.awspds.MODISCatalogDataSource org.locationtech.rasterframes.experimental.datasource.awspds.L8DataSource diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index abd890ea6..63a0d57a0 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -41,7 +41,7 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi * [Description](description.md) * [Getting Started](getting-started.md) * [Raster Data I/O](raster-io.md) -* [Spatial Relations](spatial-relations.md) +* [Vector Data](vector-data.md) * [Raster Processing](raster-processing.md) * [Pandas, NumPy & RasterFrames](pandas-numpy.md) * [UDF Reference](reference.md) diff --git a/pyrasterframes/src/main/python/docs/spatial-relations.pymd b/pyrasterframes/src/main/python/docs/spatial-relations.pymd deleted file mode 100644 index 764d6e620..000000000 --- a/pyrasterframes/src/main/python/docs/spatial-relations.pymd +++ /dev/null @@ -1 +0,0 @@ -# Spatial Relations diff --git a/pyrasterframes/src/main/python/docs/vector-data.pymd b/pyrasterframes/src/main/python/docs/vector-data.pymd new file mode 100644 index 000000000..241ca6974 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/vector-data.pymd @@ -0,0 +1,17 @@ +# Vector Data + +* `geojson` DataSource for going right into Spark +* Shapely or Python-side processing, getting into Spark via Pandas + +## GeoJSON DataSource + +Show `spark.read.geojson(...)` example. + +## Shapely + +Show Shapely interop + +## Spatial Relations + +Using `st_` functions, particularly boolean relations. + diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 772a6b107..09805643f 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -98,6 +98,10 @@ def _layer_reader(df_reader, format_key, path, **options): return _convert_df(df) +def _aliased_reader(df_reader, format_key, path, **options): + """ Loads the file of the given type at the given path.""" + return df_reader.format(format_key).load(path, **options) + def _raster_reader( df_reader, path=None, band_indexes=None, @@ -155,6 +159,8 @@ def to_csv(comp): # Add DataSource convenience methods to the DataFrameReader DataFrameReader.raster = _raster_reader +DataFrameReader.geojson = lambda df_reader, path: _aliased_reader(df_reader, "geojson", path) + # Legacy readers DataFrameReader.geotiff = lambda df_reader, path: _layer_reader(df_reader, "geotiff", path) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index a5a3a8002..3ba625e9d 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -134,6 +134,14 @@ def area(g): def test_reproject(self): reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) reprojected.show() + self.assertEqual(reprojected.count(), 8) + + def test_geojson(self): + import os + sample = 'file://' + os.path.join(self.resource_dir, 'buildings.geojson') + geo = self.spark.read.geojson(sample) + geo.show() + self.assertEqual(geo.select('geometry').count(), 8) class RasterFunctions(TestEnvironment): diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 3d09a4d75..3ed3e2edf 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -33,9 +33,16 @@ def resource_dir(): + def pdir(curr): + return os.path.dirname(curr) + here = os.path.dirname(os.path.realpath(__file__)) - scala_target = os.path.realpath(os.path.join(here, '..', '..', 'scala-2.11')) - return os.path.realpath(os.path.join(scala_target, 'test-classes')) + scala_target = os.path.realpath(os.path.join(pdir(pdir(here)), 'scala-2.11')) + rez_dir = os.path.realpath(os.path.join(scala_target, 'test-classes')) + # If not running in build mode, try source dirs. + if not os.path.exists(rez_dir): + rez_dir = os.path.realpath(os.path.join(pdir(pdir(pdir(here))), 'test', 'resources')) + return rez_dir def spark_test_session(): diff --git a/pyrasterframes/src/test/resources/buildings.geojson b/pyrasterframes/src/test/resources/buildings.geojson new file mode 100644 index 000000000..91aea5924 --- /dev/null +++ b/pyrasterframes/src/test/resources/buildings.geojson @@ -0,0 +1,899 @@ +{ + "type": "FeatureCollection", + "crs": { + "type": "name", + "properties": { + "name": "urn:ogc:def:crs:EPSG::3968" + } + }, + "bbox": [ + 10453.2340000011, + 137465.4443, + 0, + 203572.226800002, + 261914.089200001, + 518 + ], + "features": [ + { + "type": "Feature", + "properties": { + "OBJECTID": 2560367, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "23712149512", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 112.01513810500001, + "SHAPE_Area": 612.03868604499996, + "AREA_SQFT": 6587.9 + }, + "bbox": [ + 23695.017599999904633, + 149496.648900002241135, + 0.0, + 23732.747999999672174, + 149527.1985, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23730.124099999666214, + 149514.097699999809265, + 0.0 + ], + [ + 23728.569000001996756, + 149511.027800001204014, + 0.0 + ], + [ + 23732.747999999672174, + 149508.911100000143051, + 0.0 + ], + [ + 23731.134500000625849, + 149505.72520000115037, + 0.0 + ], + [ + 23727.252300001680851, + 149507.691500000655651, + 0.0 + ], + [ + 23725.473999999463558, + 149504.180500000715256, + 0.0 + ], + [ + 23722.397100001573563, + 149505.523900002241135, + 0.0 + ], + [ + 23717.634100001305342, + 149496.648900002241135, + 0.0 + ], + [ + 23696.2179000005126, + 149507.229299999773502, + 0.0 + ], + [ + 23698.083399999886751, + 149510.912300001829863, + 0.0 + ], + [ + 23696.541700001806021, + 149511.693300001323223, + 0.0 + ], + [ + 23695.017599999904633, + 149512.464999999850988, + 0.0 + ], + [ + 23702.387800000607967, + 149527.1985, + 0.0 + ], + [ + 23730.124099999666214, + 149514.097699999809265, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2561065, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "22784149837", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 140.080104933, + "SHAPE_Area": 572.44039797000005, + "AREA_SQFT": 6161.67 + }, + "bbox": [ + 22778.690500002354383, + 149807.139500003308058, + 0.0, + 22788.61260000243783, + 149867.804400000721216, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 22788.599300000816584, + 149866.041400000452995, + 0.0 + ], + [ + 22788.586899999529123, + 149864.452200002968311, + 0.0 + ], + [ + 22788.545500002801418, + 149859.174200002104044, + 0.0 + ], + [ + 22788.532500002533197, + 149857.504900000989437, + 0.0 + ], + [ + 22788.493900001049042, + 149852.586800001561642, + 0.0 + ], + [ + 22788.480700001120567, + 149850.917000003159046, + 0.0 + ], + [ + 22788.44030000269413, + 149845.7555, + 0.0 + ], + [ + 22788.427200000733137, + 149844.088899999856949, + 0.0 + ], + [ + 22788.36600000038743, + 149836.274000000208616, + 0.0 + ], + [ + 22788.355200000107288, + 149834.883799999952, + 0.0 + ], + [ + 22788.314600002020597, + 149829.721200000494719, + 0.0 + ], + [ + 22788.302200000733137, + 149828.140100002288818, + 0.0 + ], + [ + 22788.262099999934435, + 149823.015900000929832, + 0.0 + ], + [ + 22788.249400001019239, + 149821.38910000026226, + 0.0 + ], + [ + 22788.20890000090003, + 149816.230100002139807, + 0.0 + ], + [ + 22788.19649999961257, + 149814.641700003296137, + 0.0 + ], + [ + 22788.157099999487, + 149809.631100002676249, + 0.0 + ], + [ + 22788.143800001591444, + 149807.931900002062321, + 0.0 + ], + [ + 22788.137600000947714, + 149807.139500003308058, + 0.0 + ], + [ + 22778.690500002354383, + 149807.213600002229214, + 0.0 + ], + [ + 22778.701400000602007, + 149808.6064000017941, + 0.0 + ], + [ + 22778.724300000816584, + 149811.520500000566244, + 0.0 + ], + [ + 22778.757200002670288, + 149815.718500003218651, + 0.0 + ], + [ + 22778.776700001209974, + 149818.198900002986193, + 0.0 + ], + [ + 22778.80800000205636, + 149822.202100001275539, + 0.0 + ], + [ + 22778.830000001937151, + 149825.011500000953674, + 0.0 + ], + [ + 22778.861900001764297, + 149829.083700001239777, + 0.0 + ], + [ + 22778.882699999958277, + 149831.727000001817942, + 0.0 + ], + [ + 22778.913499999791384, + 149835.65990000218153, + 0.0 + ], + [ + 22778.934599999338388, + 149838.344300001859665, + 0.0 + ], + [ + 22778.967199999839067, + 149842.509800001978874, + 0.0 + ], + [ + 22778.99040000140667, + 149845.455000001937151, + 0.0 + ], + [ + 22779.019000001251698, + 149849.091400001198053, + 0.0 + ], + [ + 22779.041999999433756, + 149852.034200001507998, + 0.0 + ], + [ + 22779.073300000280142, + 149856.03490000218153, + 0.0 + ], + [ + 22779.094000000506639, + 149858.6824000030756, + 0.0 + ], + [ + 22779.124700002372265, + 149862.587100002914667, + 0.0 + ], + [ + 22779.149300001561642, + 149865.729600001126528, + 0.0 + ], + [ + 22779.159200001507998, + 149866.985300000756979, + 0.0 + ], + [ + 22779.165600001811981, + 149867.804400000721216, + 0.0 + ], + [ + 22788.61260000243783, + 149867.730399999767542, + 0.0 + ], + [ + 22788.599300000816584, + 149866.041400000452995, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2564971, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "22828150049", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 90.962539370399995, + "SHAPE_Area": 469.83376775699998, + "AREA_SQFT": 5057.23 + }, + "bbox": [ + 22814.135000001639128, + 150033.061800003051758, + 0.0, + 22842.757500000298023, + 150063.555600002408028, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 22826.411499999463558, + 150063.357500001788139, + 0.0 + ], + [ + 22832.272399999201298, + 150060.221000000834465, + 0.0 + ], + [ + 22832.609200000762939, + 150060.850400000810623, + 0.0 + ], + [ + 22833.580099999904633, + 150062.664800003170967, + 0.0 + ], + [ + 22840.825800001621246, + 150058.787200000137091, + 0.0 + ], + [ + 22842.757500000298023, + 150057.753499999642372, + 0.0 + ], + [ + 22841.060200002044439, + 150054.581800002604723, + 0.0 + ], + [ + 22829.543500002473593, + 150033.061800003051758, + 0.0 + ], + [ + 22814.135000001639128, + 150041.30800000205636, + 0.0 + ], + [ + 22815.89299999922514, + 150044.593100000172853, + 0.0 + ], + [ + 22826.041400000452995, + 150063.555600002408028, + 0.0 + ], + [ + 22826.411499999463558, + 150063.357500001788139, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2565115, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "23690149798", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 666.59224832899997, + "SHAPE_Area": 1754.8776121799999, + "AREA_SQFT": 18889.3 + }, + "bbox": [ + 23608.65260000154376, + 149786.040000002831221, + 0.0, + 23716.468699999153614, + 149934.448400001972914, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23677.989900000393391, + 149786.040000002831221, + 0.0 + ], + [ + 23608.65260000154376, + 149905.035600002855062, + 0.0 + ], + [ + 23659.130400002002716, + 149934.448400001972914, + 0.0 + ], + [ + 23709.182300001382828, + 149848.55010000243783, + 0.0 + ], + [ + 23702.254200000315905, + 149844.513300001621246, + 0.0 + ], + [ + 23653.967100001871586, + 149927.382800001651049, + 0.0 + ], + [ + 23613.26410000026226, + 149903.665699999779463, + 0.0 + ], + [ + 23676.700699999928474, + 149794.797200001776218, + 0.0 + ], + [ + 23712.332600001245737, + 149815.559600003063679, + 0.0 + ], + [ + 23716.468699999153614, + 149808.461100000888109, + 0.0 + ], + [ + 23677.989900000393391, + 149786.040000002831221, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2565175, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "23677149868", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 208.79166312800001, + "SHAPE_Area": 756.18697303700003, + "AREA_SQFT": 8139.5 + }, + "bbox": [ + 23649.58049999922514, + 149824.107200000435114, + 0.0, + 23704.862700000405312, + 149911.536400001496077, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23698.09180000051856, + 149824.107200000435114, + 0.0 + ], + [ + 23649.58049999922514, + 149907.602500002831221, + 0.0 + ], + [ + 23656.351600002497435, + 149911.536400001496077, + 0.0 + ], + [ + 23704.862700000405312, + 149828.041200000792742, + 0.0 + ], + [ + 23698.09180000051856, + 149824.107200000435114, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2565183, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "23665149861", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 207.67019654800001, + "SHAPE_Area": 732.90812511800004, + "AREA_SQFT": 7888.93 + }, + "bbox": [ + 23637.763700000941753, + 149817.533100001513958, + 0.0, + 23692.70160000026226, + 149904.5471, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23686.116100002080202, + 149817.533100001513958, + 0.0 + ], + [ + 23637.763700000941753, + 149900.719300001859665, + 0.0 + ], + [ + 23644.349199999123812, + 149904.5471, + 0.0 + ], + [ + 23692.70160000026226, + 149821.361000001430511, + 0.0 + ], + [ + 23686.116100002080202, + 149817.533100001513958, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2565190, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "23742149880", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 122.36290404099999, + "SHAPE_Area": 646.52232617100003, + "AREA_SQFT": 6959.08 + }, + "bbox": [ + 23724.983899999409914, + 149858.991399999707937, + 0.0, + 23760.777000002563, + 149899.87780000269413, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23738.19200000166893, + 149899.87780000269413, + 0.0 + ], + [ + 23760.777000002563, + 149866.160600002855062, + 0.0 + ], + [ + 23756.139400001615286, + 149863.332299999892712, + 0.0 + ], + [ + 23749.021099999547005, + 149858.991399999707937, + 0.0 + ], + [ + 23739.843000002205372, + 149873.353400003165007, + 0.0 + ], + [ + 23738.434500001370907, + 149872.516200002282858, + 0.0 + ], + [ + 23736.961800001561642, + 149875.730600003153086, + 0.0 + ], + [ + 23733.695100001990795, + 149873.934000000357628, + 0.0 + ], + [ + 23731.586500000208616, + 149877.310600001364946, + 0.0 + ], + [ + 23726.082499999552965, + 149886.124200001358986, + 0.0 + ], + [ + 23728.469000000506639, + 149888.12780000269413, + 0.0 + ], + [ + 23726.007200002670288, + 149892.045700002461672, + 0.0 + ], + [ + 23724.983899999409914, + 149893.5912000015378, + 0.0 + ], + [ + 23727.842800002545118, + 149895.429100003093481, + 0.0 + ], + [ + 23727.374400001019239, + 149896.157600000500679, + 0.0 + ], + [ + 23733.05970000103116, + 149899.811800003051758, + 0.0 + ], + [ + 23734.530200000852346, + 149897.524100001901388, + 0.0 + ], + [ + 23738.19200000166893, + 149899.87780000269413, + 0.0 + ] + ] + ] + ] + } + }, + { + "type": "Feature", + "properties": { + "OBJECTID": 2565193, + "BLDGHEIGHT": 0, + "NUMSTORIES": 0, + "FEATURECOD": null, + "LASTUPDATE": "2017\/08\/15", + "LASTEDITOR": "VGIN", + "RuleID": 0, + "BUILDINGCL": 0, + "DATASOURCE": "Jurisdiction", + "EDITCOMMEN": null, + "SOURCEFEAT": "23654149854", + "RuleID_1": 1, + "SFIDdupes": 0, + "FIPS": "51680", + "MUNICIPALI": "Lynchburg City", + "SHAPE_Leng": 207.14953045, + "SHAPE_Area": 744.31082211199998, + "AREA_SQFT": 8011.66 + }, + "bbox": [ + 23626.108500000089407, + 149810.810000002384186, + 0.0, + 23681.160199999809265, + 149897.444099999964, + 0.0 + ], + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [ + [ + [ + 23674.452899999916553, + 149810.810000002384186, + 0.0 + ], + [ + 23626.108500000089407, + 149893.523800000548363, + 0.0 + ], + [ + 23632.815799999982119, + 149897.444099999964, + 0.0 + ], + [ + 23681.160199999809265, + 149814.73030000180006, + 0.0 + ], + [ + 23674.452899999916553, + 149810.810000002384186, + 0.0 + ] + ] + ] + ] + } + } + ] +} \ No newline at end of file From 867e9205932d6b3c5920aa02a9b3d1f18759a27c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Sun, 30 Jun 2019 17:02:45 -0400 Subject: [PATCH 208/380] Initial rework of PDS L8 catalog DataSource. --- .../encoders/SparkBasicEncoders.scala | 1 + .../src/it/resources/log4j.properties | 2 +- .../awspds/L8CatalogRelationTest.scala | 89 ++++++++-- .../datasource/awspds/L8RelationTest.scala | 65 ------- .../awspds/MODISCatalogRelationTest.scala | 21 --- ...pache.spark.sql.sources.DataSourceRegister | 1 - experimental/src/main/resources/slippy.html | 83 --------- .../{awspds => }/CachedDatasetRelation.scala | 8 +- .../datasource/DownloadExpression.scala | 73 -------- .../datasource/ReadTilesExpression.scala | 165 ------------------ .../{awspds => }/ResourceCacheSupport.scala | 9 +- .../awspds/L8CatalogDataSource.scala | 3 +- .../datasource/awspds/L8CatalogRelation.scala | 47 +++-- .../datasource/awspds/L8DataSource.scala | 42 ----- .../datasource/awspds/L8Relation.scala | 137 --------------- .../awspds/MODISCatalogDataSource.scala | 5 +- .../awspds/MODISCatalogRelation.scala | 3 +- .../datasource/awspds/package.scala | 23 ++- .../experimental/datasource/package.scala | 13 -- 19 files changed, 133 insertions(+), 657 deletions(-) delete mode 100644 experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala delete mode 100644 experimental/src/main/resources/slippy.html rename experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/{awspds => }/CachedDatasetRelation.scala (90%) delete mode 100644 experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala delete mode 100644 experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala rename experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/{awspds => }/ResourceCacheSupport.scala (92%) delete mode 100644 experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala delete mode 100644 experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala index 7ec8121b5..e2830f7f1 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/SparkBasicEncoders.scala @@ -40,3 +40,4 @@ private[rasterframes] trait SparkBasicEncoders { implicit val boolEnc: Encoder[Boolean] = Encoders.scalaBoolean } +object SparkBasicEncoders extends SparkBasicEncoders \ No newline at end of file diff --git a/experimental/src/it/resources/log4j.properties b/experimental/src/it/resources/log4j.properties index 85cd816dd..5cc16f4db 100644 --- a/experimental/src/it/resources/log4j.properties +++ b/experimental/src/it/resources/log4j.properties @@ -35,7 +35,7 @@ log4j.logger.org.spark_project.jetty=WARN log4j.logger.org.spark_project.jetty.util.component.AbstractLifeCycle=ERROR log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO -log4j.logger.org.locationtech.rasterframes=WARN +log4j.logger.org.locationtech.rasterframes=DEBUG log4j.logger.org.apache.parquet.hadoop.ParquetRecordReader=OFF # SPARK-9183: Settings to avoid annoying messages when looking up nonexistent UDFs in SparkSQL with Hive support diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala index 448bacca8..85639ff41 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala @@ -20,11 +20,11 @@ package org.locationtech.rasterframes.experimental.datasource.awspds -import java.net.URL +import java.net.{HttpURLConnection, URL, URLConnection} import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.experimental.datasource._ -import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes.{TestEnvironment, rf_agg_stats} +import org.locationtech.rasterframes.datasource.raster._ /** * Test rig for L8 catalog stuff. @@ -32,38 +32,89 @@ import org.locationtech.rasterframes.TestEnvironment * @since 5/4/18 */ class L8CatalogRelationTest extends TestEnvironment { + + describe("Representing L8 scenes as a Spark data source") { import spark.implicits._ - val catalog = spark.read.format(L8CatalogDataSource.SHORT_NAME).load() + val catalog = spark.read.l8Catalog.load() val scenes = catalog .where($"acquisition_date" === to_timestamp(lit("2017-04-04 15:12:55.394"))) .where($"path" === 11 && $"row" === 12) it("should provide a non-empty catalog") { - assert(scenes.count() === 1) + scenes.count() shouldBe 1 + } + + it("should provide 11 band + 1 QA urls") { + scenes.schema.count(_.name.startsWith("B")) shouldBe 12 } - it("should construct band specific download URLs") { - val b01 = scenes.select(l8_band_url("B1")) - noException shouldBe thrownBy { - new URL(b01.first()) + it("should construct valid URLs") { + + def urlResponse(urlStr: String): Int = { + val conn = new URL(urlStr).openConnection().asInstanceOf[HttpURLConnection] + try { + conn.setRequestMethod("GET") + conn.connect() + conn.getResponseCode + } + finally { + conn.disconnect() + } } + + val urlStr = scenes.select("B11").as[String].first + val code = urlResponse(urlStr) + code shouldBe 200 } - it("should download geotiff as blob") { - import org.apache.spark.sql.functions.{length ⇒ alength} - val b01 = scenes.limit(1) - .select(download(l8_band_url("B1")) as "data") + it("should work with SQL and spatial predicates") { + catalog.createOrReplaceTempView("l8_catalog") + val scenes = spark.sql(""" + SELECT st_geometry(bounds_wgs84) as geometry, acquisition_date, B1, B2 + FROM l8_catalog + WHERE + st_intersects(st_geometry(bounds_wgs84), st_geomFromText('LINESTRING (-39.551 -7.1881, -72.2461 -45.7062)')) AND + acquisition_date > to_timestamp('2017-11-01') AND + acquisition_date <= to_timestamp('2017-11-03') + """) - val len = b01.select(alength($"data").as[Long]) - assert(len.first() >= 4000000) + scenes.count() shouldBe > (200L) } + } + + describe("Read L8 scenes from PDS") { + import spark.implicits._ + val catalog = spark.read.l8Catalog.load().repartition(8) - it("should download geotiff as tiles") { - val b01 = scenes - .select($"*", read_tiles(l8_band_url("B1"))) - assert(b01.count() === 1089) + it("should be compatible with raster DataSource") { + val df = spark.read.raster + .fromCatalog(catalog, "B1", "B8") + .withTileDimensions(512, 512) + .load() + + df.printSchema() + df.show(false) } + +// it("should count scenes") { +// +// +// +// +// val scenes = sql("SELECT entity_id FROM l8 DISTINCT") +// scenes.count() shouldBe > (300400L) +// +// val subscenes = sqlContext.table("subscenes") +// subscenes.schema.size should be (4) +// subscenes.count() should be (7) +// } +// +// it("should compute statistics") { +// val subscenes = sqlContext.table("subscenes") +// val stats = subscenes.select(rf_agg_stats($"B1")).first() +// stats.data_cells shouldBe > (420024000L) +// } } } diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala deleted file mode 100644 index f53246c09..000000000 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8RelationTest.scala +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea. Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * - */ - -package org.locationtech.rasterframes.experimental.datasource.awspds - -import org.locationtech.rasterframes._ -import org.scalatest.{BeforeAndAfter, BeforeAndAfterAll} - -/** - * @since 8/21/18 - */ -class L8RelationTest extends TestEnvironment with BeforeAndAfterAll with BeforeAndAfter { - - val query = """ - |SELECT geometry, timestamp, B1, B2 - |FROM l8 - |WHERE - | st_intersects(geometry, st_geomFromText('LINESTRING (-39.551 -7.1881, -72.2461 -45.7062)')) AND - | timestamp > to_timestamp('2017-11-01') AND - | timestamp <= to_timestamp('2017-11-03') - """.stripMargin - - override protected def beforeAll(): Unit = { - val l8 = spark.read - .format(L8DataSource.SHORT_NAME) - .load() - l8.createOrReplaceTempView("l8") - sql(query).createOrReplaceTempView("subscenes") - } - - describe("Read L8 on PDS as a DataSource") { - import spark.implicits._ - it("should count scenes") { - val scenes = sql("SELECT entity_id FROM l8 DISTINCT") - scenes.count() shouldBe >(300400L) - - val subscenes = sqlContext.table("subscenes") - subscenes.schema.size should be (4) - subscenes.count() should be(7) - } - - it("should compute statistics") { - val subscenes = sqlContext.table("subscenes") - val stats = subscenes.select(rf_agg_stats($"B1")).first() - stats.data_cells shouldBe >(420024000L) - } - } -} diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala index a71ec0218..c7d11c917 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala @@ -22,7 +22,6 @@ package org.locationtech.rasterframes.experimental.datasource.awspds import java.net.URL import java.sql.Timestamp -import org.locationtech.rasterframes.experimental.datasource._ import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.TestEnvironment @@ -50,25 +49,5 @@ class MODISCatalogRelationTest extends TestEnvironment { new URL(b01.first()) } } - - it("should download geotiff as blob") { - import org.apache.spark.sql.functions.{length ⇒ alength} - val b01 = scenes.limit(1) - .select(download($"assets"("B01")) as "data") - - val len = b01.select(alength($"data").as[Long]) - assert(len.first() >= 4000000) - } - - it("should download geotiff as tiles") { - val b01 = scenes - .select(read_tiles($"assets"("B01") as "B01", $"assets"("B02") as "B02")) - assert(b01.count() === 100) - -// val kv = b01.select($"B01_extent", $"B01_tile").as[(Extent, Tile)] -// kv.collect.zipWithIndex.foreach { case ((extent, tile), idx) ⇒ -// GeoTiff(tile, extent, Sinusoidal).write(s"target/b01-tile-$idx.tiff") -// } - } } } diff --git a/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister b/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister index 0f44a610b..97275f043 100644 --- a/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister +++ b/experimental/src/main/resources/META-INF/services/org.apache.spark.sql.sources.DataSourceRegister @@ -1,3 +1,2 @@ org.locationtech.rasterframes.experimental.datasource.awspds.L8CatalogDataSource org.locationtech.rasterframes.experimental.datasource.awspds.MODISCatalogDataSource -org.locationtech.rasterframes.experimental.datasource.awspds.L8DataSource diff --git a/experimental/src/main/resources/slippy.html b/experimental/src/main/resources/slippy.html deleted file mode 100644 index 4f616928f..000000000 --- a/experimental/src/main/resources/slippy.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - RasterFrames - - - - - - - - - - -
    - - - - diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/CachedDatasetRelation.scala similarity index 90% rename from experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/CachedDatasetRelation.scala index 37be5335e..231b2411e 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/CachedDatasetRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/CachedDatasetRelation.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2089 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,13 +19,13 @@ * */ -package org.locationtech.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource import com.typesafe.scalalogging.LazyLogging -import org.apache.hadoop.fs.{FileSystem, Path ⇒ HadoopPath} +import org.apache.hadoop.fs.{FileSystem, Path => HadoopPath} import org.apache.spark.rdd.RDD -import org.apache.spark.sql.{Dataset, Row} import org.apache.spark.sql.sources.BaseRelation +import org.apache.spark.sql.{Dataset, Row} import org.locationtech.rasterframes.util._ /** diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala deleted file mode 100644 index 0a39071ff..000000000 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/DownloadExpression.scala +++ /dev/null @@ -1,73 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package org.locationtech.rasterframes.experimental.datasource - -import java.net.URI - -import org.locationtech.rasterframes.util.GeoTiffInfoSupport -import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.sql.{Column, TypedColumn} -import org.apache.spark.sql.catalyst.InternalRow -import org.apache.spark.sql.catalyst.analysis.TypeCheckResult -import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.{TypeCheckFailure, TypeCheckSuccess} -import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback -import org.apache.spark.sql.catalyst.expressions.{Expression, Generator, GenericInternalRow, UnaryExpression} -import org.apache.spark.sql.types._ -import org.apache.spark.unsafe.types.UTF8String -import org.locationtech.rasterframes.util._ - -/** - * Downloads data from URL and stores it in a column. - * - * @since 5/4/18 - */ -case class DownloadExpression(override val child: Expression, colPrefix: String) extends UnaryExpression - with Generator with CodegenFallback with GeoTiffInfoSupport with DownloadSupport with LazyLogging { - - override def nodeName: String = "download" - - override def checkInputDataTypes(): TypeCheckResult = { - if(child.dataType == StringType) TypeCheckSuccess - else TypeCheckFailure( - s"Expected '${StringType.typeName}' but received '${child.dataType.simpleString}'" - ) - } - - override def elementSchema: StructType = StructType(Seq( - StructField(colPrefix + "_data", BinaryType, true) - )) - - override def eval(input: InternalRow): TraversableOnce[InternalRow] = { - val urlString = child.eval(input).asInstanceOf[UTF8String] - val bytes = getBytes(URI.create(urlString.toString)) - Traversable(new GenericInternalRow(Array[Any](bytes))) - } -} - -object DownloadExpression { - import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders.arrayEnc - - def apply(urlColumn: Column): TypedColumn[Any, Array[Byte]] = - new Column( - new DownloadExpression(urlColumn.expr, urlColumn.columnName) - ).as[Array[Byte]] -} diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala deleted file mode 100644 index 37e32ba46..000000000 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ReadTilesExpression.scala +++ /dev/null @@ -1,165 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package org.locationtech.rasterframes.experimental.datasource - -import java.net.URI - -import org.locationtech.rasterframes.TileType -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import com.typesafe.scalalogging.LazyLogging -import geotrellis.proj4.CRS -import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.raster.{ProjectedRaster, Tile} -import geotrellis.spark.io.hadoop.HdfsRangeReader -import geotrellis.spark.io.http.util.HttpRangeReader -import geotrellis.spark.io.s3.S3Client -import geotrellis.spark.io.s3.util.S3RangeReader -import geotrellis.util.{ByteReader, FileRangeReader, RangeReader, StreamingByteReader} -import geotrellis.vector.Extent -import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path -import org.apache.spark.sql.Column -import org.apache.spark.sql.catalyst.InternalRow -import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback -import org.apache.spark.sql.catalyst.expressions.{Alias, Expression, Generator, Literal} -import org.apache.spark.sql.types._ - -/** - * Catalyst generator to convert a geotiff download URL into a series of rows containing the internal - * tiles and associated extents. - * - * @since 5/4/18 - */ -case class ReadTilesExpression(children: Seq[Expression]) extends Expression - with Generator with CodegenFallback with DownloadSupport with LazyLogging { - - override def nodeName: String = "download_tiles" - - def inputTypes = Seq.fill(children.length)(StringType) - - override def elementSchema: StructType = StructType(Seq( - StructField("crs", schemaOf[CRS], true), - StructField("extent", schemaOf[Extent], true) - ) ++ - children - .zipWithIndex - .map { - case (l: Literal, _) ⇒ String.valueOf(l.value) - case (a: Alias, _) ⇒ a.name - case (_, i) ⇒ s"_${i + 1}" - } - .map(name ⇒ { - StructField(name, TileType, true) - }) - ) - - private def reader(uri: URI): ByteReader = { - val rr: RangeReader = uri.getScheme match { - case "http" | "https" ⇒ HttpRangeReader(uri) - case "file" ⇒ FileRangeReader(uri.getPath) - case "hdfs" | "s3n" | "s3a" | "wasb" | "wasbs" ⇒ - HdfsRangeReader(new Path(uri), new Configuration()) - case "s3" ⇒ - S3RangeReader(uri, S3Client.DEFAULT) - } - StreamingByteReader(rr) - } - - def checkDimensions(tiles: Array[Array[ProjectedRaster[Tile]]], uris: Seq[URI]) = { - val rowDims = tiles.map(row ⇒ { - row.map { - case null ⇒ null - case t ⇒ t.tile.dimensions - } - }) - - val notSameDim = rowDims - .map(_.distinct.count(_ != null)) - .indexWhere(_ > 1) - - if (notSameDim >= 0) { - throw new IllegalArgumentException("Detecuris: Seq[Option[String]] ted rows with different sized tiles: " + - rowDims(notSameDim).mkString(", ") + "\nfrom: " + uris.mkString(", ")) - } - } - - - private def safeTranspose(tiles: Seq[Seq[ProjectedRaster[Tile]]]) = { - // We need to transpose the nested sequence of from column major to row major order - // However, some columns have no rows, the default transpose needs a regular grid... - // so we do it manually. - val numRows = tiles.map(_.size).max - val numCols = tiles.length - val tileGrid = Array.fill(numRows)(Array.ofDim[ProjectedRaster[Tile]](numCols)) - - for { - (rows, col) ← tiles.zipWithIndex - (tile, row) ← rows.zipWithIndex - } { - tileGrid(row)(col) = tile - } - tileGrid - } - - override def eval(input: InternalRow): TraversableOnce[InternalRow] = { - val uris = children.map(_.eval(input).toString).map(URI.create) - val colMajor = uris.map { uri ⇒ - val tiff = GeoTiffReader.readSingleband(reader(uri)) - val segmentLayout = tiff.imageData.segmentLayout - val windows = segmentLayout.listWindows(256) - val re = tiff.rasterExtent - - val subtiles = tiff.crop(windows) - for { - (gridbounds, tile) ← subtiles.toSeq - } yield { - val extent = re.extentFor(gridbounds, false) - ProjectedRaster(tile, extent, tiff.crs) - } - } - - val rowMajor = safeTranspose(colMajor) - - checkDimensions(rowMajor, uris) - - rowMajor.map(row ⇒ { - val serializedTiles = row.map { - case null ⇒ null - case t ⇒ TileType.serialize(t.tile) - } - - val firstBandExt = row - .find(_ != null) - .map(p ⇒ Seq(p.crs.toInternalRow, p.extent.toInternalRow)) - .getOrElse(Seq(null, null)) - - InternalRow(firstBandExt ++ serializedTiles: _*) - }) - } - -} - -object ReadTilesExpression { - def apply(urls: Seq[Column]): Column = new Column( - new ReadTilesExpression(urls.map(_.expr)) - ) -} diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ResourceCacheSupport.scala similarity index 92% rename from experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala rename to experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ResourceCacheSupport.scala index f203a187f..45173572f 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/ResourceCacheSupport.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/ResourceCacheSupport.scala @@ -1,7 +1,7 @@ /* * This software is licensed under the Apache 2 license, quoted below. * - * Copyright 2018 Astraea, Inc. + * Copyright 2019 Astraea, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of @@ -19,17 +19,16 @@ * */ -package org.locationtech.rasterframes.experimental.datasource.awspds +package org.locationtech.rasterframes.experimental.datasource import java.net.URI import java.time.{Duration, Instant} -import org.locationtech.rasterframes.experimental.datasource.DownloadSupport -import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import org.apache.commons.io.FilenameUtils -import org.apache.hadoop.fs.{FileSystem, Path ⇒ HadoopPath} +import org.apache.hadoop.fs.{FileSystem, Path => HadoopPath} import org.apache.hadoop.io.MD5Hash +import org.locationtech.rasterframes.util._ import scala.util.Try import scala.util.control.NonFatal diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala index 47ff0afab..aad1cd2fc 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogDataSource.scala @@ -28,6 +28,7 @@ import com.typesafe.scalalogging.LazyLogging import org.apache.hadoop.fs.FileSystem import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} +import org.locationtech.rasterframes.experimental.datasource.ResourceCacheSupport /** * Data source for querying AWS PDS catalog of L8 imagery. @@ -48,7 +49,7 @@ class L8CatalogDataSource extends DataSourceRegister with RelationProvider { } object L8CatalogDataSource extends LazyLogging with ResourceCacheSupport { - final val SHORT_NAME: String = "awsl8-catalog" + final val SHORT_NAME: String = "aws-pds-l8-catalog" private val remoteSource = URI.create("http://landsat-pds.s3.amazonaws.com/c1/L8/scene_list.gz") private def sceneListFile(implicit fs: FileSystem) = cachedURI(remoteSource).getOrElse(throw new FileNotFoundException(remoteSource.toString)) diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala index 3f5c9a142..a7b426176 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala @@ -22,12 +22,14 @@ package org.locationtech.rasterframes.experimental.datasource.awspds import com.typesafe.scalalogging.LazyLogging -import org.locationtech.jts.geom.Envelope -import org.apache.hadoop.fs.{Path ⇒ HadoopPath} +import geotrellis.vector.Extent +import org.apache.hadoop.fs.{Path => HadoopPath} import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types._ -import org.apache.spark.sql.{Dataset, Row, SQLContext} +import org.apache.spark.sql.{Dataset, Row, SQLContext, TypedColumn} +import org.locationtech.rasterframes.encoders.SparkBasicEncoders.stringEnc +import org.locationtech.rasterframes.experimental.datasource.CachedDatasetRelation /** * Schema definition and parser for AWS PDS L8 scene data. * @@ -43,9 +45,12 @@ case class L8CatalogRelation(sqlContext: SQLContext, sceneListPath: HadoopPath) protected def cacheFile: HadoopPath = sceneListPath.suffix(".parquet") protected def constructDataset: Dataset[Row] = { - import org.locationtech.rasterframes.encoders.StandardEncoders.envelopeEncoder + import org.locationtech.rasterframes.encoders.StandardEncoders.extentEncoder import sqlContext.implicits._ logger.debug("Parsing " + sceneListPath) + + val bandCols = Bands.values.toSeq.map(b => l8_band_url(b) as (b.toString)) + sqlContext.read .schema(inputSchema) .option("header", "true") @@ -54,12 +59,13 @@ case class L8CatalogRelation(sqlContext: SQLContext, sceneListPath: HadoopPath) .where(not($"${PRODUCT_ID.name}".endsWith("RT"))) .drop("download_url") .withColumn(BOUNDS_WGS84.name, struct( - $"min_lon" as "minX", - $"max_lon" as "maxX", - $"min_lat" as "minY", - $"max_lat" as "maxY" - ).as[Envelope]) + $"min_lon" as "xmin", + $"min_lat" as "ymin", + $"max_lon" as "xmax", + $"max_lat" as "ymax" + ).as[Extent]) .withColumnRenamed("__url", DOWNLOAD_URL.name) + .select(col("*") +: bandCols: _*) .select(schema.map(f ⇒ col(f.name)): _*) .orderBy(ACQUISITION_DATE.name, PATH.name, ROW.name) .distinct() // The scene file contains duplicates. @@ -69,6 +75,17 @@ case class L8CatalogRelation(sqlContext: SQLContext, sceneListPath: HadoopPath) object L8CatalogRelation extends PDSFields { + + /** + * Constructs link with the form: + * `https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_{bandId].TIF` + * @param band Band identifier + * @return + */ + def l8_band_url(band: Bands.Band): TypedColumn[Any, String] = { + concat(col("download_url"), concat(col("product_id"), lit(s"_$band.TIF"))) + }.as(band.toString).as[String] + private def inputSchema = StructType(Seq( PRODUCT_ID, ENTITY_ID, @@ -84,6 +101,13 @@ object L8CatalogRelation extends PDSFields { DOWNLOAD_URL )) + object Bands extends Enumeration { + type Band = Value + val B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, BQA = Value + val names: Seq[String] = values.toSeq.map(_.toString) + } + + def schema = StructType(Seq( PRODUCT_ID, ENTITY_ID, @@ -92,9 +116,8 @@ object L8CatalogRelation extends PDSFields { PROC_LEVEL, PATH, ROW, - BOUNDS_WGS84, - DOWNLOAD_URL - )) + BOUNDS_WGS84 + ) ++ Bands.names.map(n => StructField(n, StringType, true))) } diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala deleted file mode 100644 index 95e70ff4f..000000000 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8DataSource.scala +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package org.locationtech.rasterframes.experimental.datasource.awspds - -import org.apache.spark.sql.SQLContext -import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} - -/** - * Experiment in providing RasterFrames over whole PDS catalog. - * - * @since 8/21/18 - */ -class L8DataSource extends DataSourceRegister with RelationProvider { - override def shortName(): String = L8DataSource.SHORT_NAME - - override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { - L8Relation(sqlContext) - } -} - -object L8DataSource { - final val SHORT_NAME = "awsl8" -} diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala deleted file mode 100644 index 43c180cac..000000000 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8Relation.scala +++ /dev/null @@ -1,137 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - * SPDX-License-Identifier: Apache-2.0 - * - */ - -package org.locationtech.rasterframes.experimental.datasource.awspds - -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.experimental.datasource.awspds.L8Relation.Bands -import org.locationtech.rasterframes.expressions.transformers._ -import org.locationtech.rasterframes.rules.SpatialFilters.{Contains, Intersects} -import org.locationtech.rasterframes.rules._ -import org.locationtech.rasterframes.util._ -import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.rdd.RDD -import org.apache.spark.sql.functions._ -import org.apache.spark.sql.sources._ -import org.apache.spark.sql.types._ -import org.apache.spark.sql.{Column, Row, SQLContext} -import org.locationtech.rasterframes.tiles.ProjectedRasterTile - -/** - * Spark relation over AWS PDS Landsat 8 collection. - * - * @since 8/21/18 - */ -case class L8Relation(sqlContext: SQLContext, filters: Seq[Filter] = Seq.empty) - extends BaseRelation with PrunedFilteredScan with SpatialRelationReceiver[L8Relation] with LazyLogging { - override def schema: StructType = L8Relation.schema - - /** Create new relation with the give filter added. */ - override def withFilter(value: Filter): L8Relation = copy(filters = filters :+ value) - - /** Check to see if relation already exists in this. */ - override def hasFilter(filter: Filter): Boolean = filters.contains(filter) - - // Most implementations don't bother with this... the hassle vs. benefit may be questionable. - override def unhandledFilters(filters: Array[Filter]): Array[Filter] = { - val TS = PDSFields.TIMESTAMP.name - super.unhandledFilters(filters).filterNot { - case GreaterThan(TS, _) ⇒ true - case GreaterThanOrEqual(TS, _) ⇒ true - case LessThan(TS, _) ⇒ true - case LessThanOrEqual(TS, _) ⇒ true - case _ ⇒ false - } - } - - // TODO: Is there a more clean, direct way of delegating filtering other - // TODO: having to reconstitute the predicates like this? - private def colExpr(filter: Filter): Column = filter match { - case GreaterThan(name, value) ⇒ col(name) > value - case GreaterThanOrEqual(name, value) ⇒ col(name) >= value - case LessThan(name, value) ⇒ col(name) < value - case LessThanOrEqual(name, value) ⇒ col(name) <= value - case EqualTo(name, value) ⇒ col(name) === value - case Intersects(name, value) ⇒ st_intersects(col(name), geomLit(value)) - case Contains(name, value) ⇒ st_contains(col(name), geomLit(value)) - } - - override def buildScan(requiredColumns: Array[String], sparkFilters: Array[Filter]): RDD[Row] = { - logger.debug(s"Required columns: ${requiredColumns.mkString(", ")}") - val aggFilters = (sparkFilters ++ splitFilters(filters)).distinct - if(aggFilters.isEmpty) { - logger.warn("No filters provided. Full catalog scan invoked.") - } - else { - logger.debug(s"Filters: $aggFilters") - } - - val catalog = sqlContext.read - .format(L8CatalogDataSource.SHORT_NAME) - .load() - .withColumnRenamed(PDSFields.ACQUISITION_DATE.name, PDSFields.TIMESTAMP.name) - .withColumn(PDSFields.BOUNDS.name, st_geometry(col(PDSFields.BOUNDS_WGS84.name))) - .drop(PDSFields.BOUNDS_WGS84.name) - - val filtered = aggFilters - .foldLeft(catalog)((d, filter) ⇒ d.where(colExpr(filter))) - - val (bands, other) = requiredColumns.partition(Bands.names.contains) - - val nonTile = other.map(col) - - val df = if (bands.nonEmpty) { - val sources = bands.map(b ⇒ URIToRasterSource(l8_band_url(b)).as(b)) - // NB: We assume that `nativeTiling` preserves the band names. - val expanded = RasterSourceToRasterRefs(None, Seq(0), sources: _*) - - filtered - .select(nonTile :+ expanded: _*) - .select(nonTile ++ bands.map(b => RasterRefToTile(col(b + "_ref")) as b): _*) - } else filtered - - // Make sure shape of resulting rows conforms to what was requested - val selected = requiredColumns.headOption - .map(head ⇒ df.select(head, requiredColumns.tail: _*)) - .getOrElse(df) - - selected.rdd - } -} - -object L8Relation extends PDSFields { - object Bands extends Enumeration { - type Bands = Value - val B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, BQA = Value - val names: Seq[String] = values.toSeq.map(_.toString) - } - - lazy val schema: StructType = { - StructType( - L8CatalogRelation.schema.collect { - case ACQUISITION_DATE ⇒ ACQUISITION_DATE.copy(name = StandardColumns.TIMESTAMP_COLUMN.columnName) - case s if s.name == BOUNDS_WGS84.name ⇒ BOUNDS - case s if s != DOWNLOAD_URL ⇒ s - } ++ L8Relation.Bands.values.toSeq.map(b ⇒ StructField(b.toString, schemaOf[ProjectedRasterTile], true)) - ) - } -} diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala index d1c886755..c4498c63a 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogDataSource.scala @@ -28,10 +28,11 @@ import java.time.temporal.ChronoUnit import org.locationtech.rasterframes.util.withResource import org.locationtech.rasterframes._ import com.typesafe.scalalogging.LazyLogging -import org.apache.hadoop.fs.{FileSystem, Path ⇒ HadoopPath} +import org.apache.hadoop.fs.{FileSystem, Path => HadoopPath} import org.apache.hadoop.io.IOUtils import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} +import org.locationtech.rasterframes.experimental.datasource.ResourceCacheSupport /** @@ -70,7 +71,7 @@ class MODISCatalogDataSource extends DataSourceRegister with RelationProvider wi } object MODISCatalogDataSource extends LazyLogging with ResourceCacheSupport { - final val SHORT_NAME = "aws-pds-modis" + final val SHORT_NAME = "aws-pds-modis-catalog" final val MCD43A4_BASE = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/" override def maxCacheFileAgeHours: Int = Int.MaxValue diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala index 32ea9ce87..322bd5698 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala @@ -22,11 +22,12 @@ package org.locationtech.rasterframes.experimental.datasource.awspds import com.typesafe.scalalogging.LazyLogging -import org.apache.hadoop.fs.{Path ⇒ HadoopPath} +import org.apache.hadoop.fs.{Path => HadoopPath} import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources._ import org.apache.spark.sql.types._ +import org.locationtech.rasterframes.experimental.datasource.CachedDatasetRelation /** * Constructs a dataframe from the available scenes diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala index ccf1331ff..6a91c3d04 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala @@ -21,9 +21,9 @@ package org.locationtech.rasterframes.experimental.datasource -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders._ +import org.apache.spark.sql.DataFrameReader +import shapeless.tag +import shapeless.tag.@@ /** * Module support. @@ -31,14 +31,13 @@ import org.locationtech.rasterframes.encoders.StandardEncoders.PrimitiveEncoders * @since 5/4/18 */ package object awspds { - /** - * Constructs link with the form: - * `https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_{bandId].TIF` - * @param bandID Band ID suffix, e.g. "B4" - * @return - */ - def l8_band_url(bandID: String): TypedColumn[Any, String] = { - concat(col("download_url"), concat(col("product_id"), lit(s"_$bandID.TIF"))) - }.as(bandID).as[String] + trait CatalogDataFrameReaderTag + type CatalogDataFrameReader = DataFrameReader @@ CatalogDataFrameReaderTag + /** Adds `raster` format specifier to `DataFrameReader`. */ + implicit class DataFrameReaderHasL8CatalogFormat(val reader: DataFrameReader) { + def l8Catalog: CatalogDataFrameReader = + tag[CatalogDataFrameReaderTag][DataFrameReader]( + reader.format(L8CatalogDataSource.SHORT_NAME)) + } } diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala index 57e8e8f53..6c8c08aac 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/package.scala @@ -22,8 +22,6 @@ package org.locationtech.rasterframes.experimental import org.apache.spark.sql._ -import org.apache.spark.sql.catalyst.analysis.FunctionRegistry -import org.apache.spark.sql.rf.VersionShims._ /** @@ -32,17 +30,6 @@ import org.apache.spark.sql.rf.VersionShims._ * @since 9/3/18 */ package object datasource { - /** Downloads the referenced URL into an uninterpreted binary data array. */ - def download(urlColumn: Column): TypedColumn[Any, Array[Byte]] = DownloadExpression(urlColumn) - - /** Downloads the contents at each of the referenced URLs, interpreting - * them as equally sized and */ - def read_tiles(urls: Column*): Column = ReadTilesExpression(urls) - def register(sqlContext: SQLContext): Unit = { - // Expression-oriented functions have a different registration scheme - // Currently have to register with the `builtin` registry due to Spark data hiding. - val registry: FunctionRegistry = rf.registry(sqlContext) - registry.registerExpression[ReadTilesExpression]("rf_read_tiles") } } From 7f83abfc7becfa0de906a3e38caaed85041abb8f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 1 Jul 2019 11:08:01 -0400 Subject: [PATCH 209/380] Separated out various implementations of RasterSource into their own files. --- core/src/main/resources/reference.conf | 1 + .../RasterSourceToRasterRefs.scala | 5 +- .../rasterframes/model/TileDataContext.scala | 1 - .../ref/DelegatingRasterSource.scala | 89 +++++++ .../rasterframes/ref/GDALRasterSource.scala | 70 +++++ .../ref/HadoopGeoTiffRasterSource.scala | 35 +++ .../ref/InMemoryRasterSource.scala | 52 ++++ .../ref/JVMGeoTiffRasterSource.scala | 28 ++ .../ref/RangeReaderRasterSource.scala | 64 +++++ .../rasterframes/ref/RasterRef.scala | 2 +- .../rasterframes/ref/RasterSource.scala | 245 ++---------------- .../rasterframes/ref/SimpleRasterInfo.scala | 84 ++++++ .../rasterframes/util/RFKryoRegistrator.scala | 8 +- .../rasterframes/TileAssemblerSpec.scala | 3 +- .../rasterframes/ref/RasterSourceSpec.scala | 1 - .../awspds/L8CatalogRelationTest.scala | 33 +-- 16 files changed, 465 insertions(+), 256 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/HadoopGeoTiffRasterSource.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/InMemoryRasterSource.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/JVMGeoTiffRasterSource.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/RangeReaderRasterSource.scala create mode 100644 core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index 0052f5f5a..ef635bb61 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -3,6 +3,7 @@ rasterframes { prefer-gdal = true showable-tiles = true showable-max-cells = 20 + raster-source-cache-timeout = 120 seconds } vlm.gdal { diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala index dd8ac7ca8..967ba52a5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala @@ -21,9 +21,6 @@ package org.locationtech.rasterframes.expressions.transformers -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.ref.RasterRef -import org.locationtech.rasterframes.util._ import com.typesafe.scalalogging.LazyLogging import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.InternalRow @@ -32,9 +29,11 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} +import org.locationtech.rasterframes.util._ import scala.util.Try import scala.util.control.NonFatal diff --git a/core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala b/core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala index bbf49705d..9f6bd358f 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/model/TileDataContext.scala @@ -21,7 +21,6 @@ package org.locationtech.rasterframes.model -import org.locationtech.rasterframes.encoders.CatalystSerializerEncoder import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.raster.{CellType, Tile} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala new file mode 100644 index 000000000..b0224d5cd --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala @@ -0,0 +1,89 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import java.net.URI + +import geotrellis.contrib.vlm.{RasterSource => GTRasterSource} +import geotrellis.proj4.CRS +import geotrellis.raster.io.geotiff.Tags +import geotrellis.raster.{CellType, GridBounds, MultibandTile, Raster} +import geotrellis.vector.Extent +import org.locationtech.rasterframes.ref.RasterSource.URIRasterSource + +/** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ +abstract class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRasterSource) extends RasterSource with URIRasterSource { + @transient + @volatile + private var _delRef: GTRasterSource = _ + + private def retryableRead[R >: Null](f: GTRasterSource => R): R = synchronized { + try { + if (_delRef == null) + _delRef = delegateBuilder() + f(_delRef) + } + catch { + // On this exeception we attempt to recreate the delegate and read again. + case _: java.nio.BufferUnderflowException => + _delRef = null + val newDel = delegateBuilder() + val result = f(newDel) + _delRef = newDel + result + } + } + + // Bad? + override def equals(obj: Any): Boolean = obj match { + case drs: DelegatingRasterSource => drs.source == source + case _ => false + } + + override def hashCode(): Int = source.hashCode() + + // This helps reduce header reads between serializations + lazy val info: SimpleRasterInfo = SimpleRasterInfo.cache.get(source, _ => + retryableRead(rs => SimpleRasterInfo(rs)) + ) + + override def cols: Int = info.cols + override def rows: Int = info.rows + override def crs: CRS = info.crs + override def extent: Extent = info.extent + override def cellType: CellType = info.cellType + override def bandCount: Int = info.bandCount + override def tags: Tags = info.tags + + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = + retryableRead(_.readBounds(bounds, bands)) + + override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = + retryableRead(_.read(bounds, bands) + .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) + ) + + override def read(extent: Extent, bands: Seq[Int]): Raster[MultibandTile] = + retryableRead(_.read(extent, bands) + .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) + ) +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala new file mode 100644 index 000000000..0b764766d --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala @@ -0,0 +1,70 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import java.net.URI + +import geotrellis.proj4.CRS +import geotrellis.raster.{CellType, GridBounds, MultibandTile, Raster} +import geotrellis.raster.io.geotiff.Tags +import geotrellis.vector.Extent +import org.locationtech.rasterframes.ref.RasterSource.URIRasterSource +import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} + +case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSource { + + @transient + private lazy val gdal: VLMRasterSource = { + val cleaned = source.toASCIIString.replace("gdal+", "") + // VSIPath doesn't like single slash "file:/path..." + val tweaked = + if (cleaned.matches("^file:/[^/].*")) + cleaned.replace("file:", "") + else cleaned + + VLMRasterSource(tweaked) + } + + protected lazy val tiffInfo = SimpleRasterInfo.cache.get(source, _ => SimpleRasterInfo(gdal)) + + override def crs: CRS = tiffInfo.crs + + override def extent: Extent = tiffInfo.extent + + private def metadata = Map.empty[String, String] + + override def cellType: CellType = { + println(SimpleRasterInfo.cache.stats().toString) + tiffInfo.cellType + } + + override def bandCount: Int = tiffInfo.bandCount + + override def cols: Int = tiffInfo.cols + + override def rows: Int = tiffInfo.rows + + override def tags: Tags = Tags(metadata, List.empty) + + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = + gdal.readBounds(bounds, bands) +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/HadoopGeoTiffRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/HadoopGeoTiffRasterSource.scala new file mode 100644 index 000000000..3249f1bce --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/HadoopGeoTiffRasterSource.scala @@ -0,0 +1,35 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import java.net.URI + +import geotrellis.spark.io.hadoop.HdfsRangeReader +import org.apache.hadoop.conf.Configuration +import org.apache.hadoop.fs.Path +import org.locationtech.rasterframes.ref.RasterSource.{URIRasterSource, URIRasterSourceDebugString} + +case class HadoopGeoTiffRasterSource(source: URI, config: () => Configuration) + extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => + @transient + protected lazy val rangeReader = HdfsRangeReader(new Path(source.getPath), config()) +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/InMemoryRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/InMemoryRasterSource.scala new file mode 100644 index 000000000..3a6a2f5e1 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/InMemoryRasterSource.scala @@ -0,0 +1,52 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import geotrellis.proj4.CRS +import geotrellis.raster.{CellType, GridBounds, MultibandTile, Raster, Tile} +import geotrellis.raster.io.geotiff.Tags +import geotrellis.vector.Extent +import org.locationtech.rasterframes.ref.RasterSource.EMPTY_TAGS +import org.locationtech.rasterframes.tiles.ProjectedRasterTile + +case class InMemoryRasterSource(tile: Tile, extent: Extent, crs: CRS) extends RasterSource { + def this(prt: ProjectedRasterTile) = this(prt, prt.extent, prt.crs) + + override def rows: Int = tile.rows + + override def cols: Int = tile.cols + + override def cellType: CellType = tile.cellType + + override def bandCount: Int = 1 + + override def tags: Tags = EMPTY_TAGS + + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + bounds + .map(b => { + val subext = rasterExtent.extentFor(b) + Raster(MultibandTile(tile.crop(b)), subext) + }) + .toIterator + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/JVMGeoTiffRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/JVMGeoTiffRasterSource.scala new file mode 100644 index 000000000..cedb81c61 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/JVMGeoTiffRasterSource.scala @@ -0,0 +1,28 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import java.net.URI + +import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource + +case class JVMGeoTiffRasterSource(source: URI) extends DelegatingRasterSource(source, () => GeoTiffRasterSource(source.toASCIIString)) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RangeReaderRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RangeReaderRasterSource.scala new file mode 100644 index 000000000..90df001bd --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RangeReaderRasterSource.scala @@ -0,0 +1,64 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import com.typesafe.scalalogging.LazyLogging +import geotrellis.proj4.CRS +import geotrellis.raster.{CellType, GridBounds, MultibandTile, Raster} +import geotrellis.raster.io.geotiff.Tags +import geotrellis.raster.io.geotiff.reader.GeoTiffReader +import geotrellis.util.RangeReader +import geotrellis.vector.Extent +import org.locationtech.rasterframes.util.GeoTiffInfoSupport + +trait RangeReaderRasterSource extends RasterSource with GeoTiffInfoSupport with LazyLogging { + protected def rangeReader: RangeReader + + private def realInfo = + GeoTiffReader.readGeoTiffInfo(rangeReader, streaming = true, withOverviews = false) + + protected lazy val tiffInfo = SimpleRasterInfo(realInfo) + + def crs: CRS = tiffInfo.crs + + def extent: Extent = tiffInfo.extent + + override def cols: Int = tiffInfo.rasterExtent.cols + + override def rows: Int = tiffInfo.rasterExtent.rows + + def cellType: CellType = tiffInfo.cellType + + def bandCount: Int = tiffInfo.bandCount + + override def tags: Tags = tiffInfo.tags + + override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { + val info = realInfo + val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) + val intersectingBounds = bounds.flatMap(_.intersection(this)).toSeq + geoTiffTile.crop(intersectingBounds, bands.toArray).map { + case (gb, tile) => + Raster(tile, rasterExtent.extentFor(gb, clamp = true)) + } + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala index ad2291c77..f191f4188 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterRef.scala @@ -63,7 +63,7 @@ object RasterRef extends LazyLogging { case class RasterRefTile(rr: RasterRef) extends ProjectedRasterTile { val extent: Extent = rr.extent val crs: CRS = rr.crs - override val cellType = rr.cellType + override def cellType = rr.cellType override val cols: Int = rr.cols override val rows: Int = rr.rows diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 2d07bb129..e39f32508 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -23,29 +23,21 @@ package org.locationtech.rasterframes.ref import java.net.URI -import org.locationtech.rasterframes.NOMINAL_TILE_DIMS -import org.locationtech.rasterframes.model.TileDimensions -import RasterSource.SINGLEBAND import com.azavea.gdal.GDALWarp +import com.github.blemale.scaffeine.Scaffeine import com.typesafe.scalalogging.LazyLogging -import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} -import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource -import geotrellis.contrib.vlm.{RasterSource => GTRasterSource} import geotrellis.proj4.CRS import geotrellis.raster._ import geotrellis.raster.io.geotiff.Tags -import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.spark.io.hadoop.HdfsRangeReader -import geotrellis.util.RangeReader import geotrellis.vector.Extent import org.apache.hadoop.conf.Configuration -import org.apache.hadoop.fs.Path import org.apache.spark.annotation.Experimental import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.rf.RasterSourceUDT import org.locationtech.rasterframes.model.{TileContext, TileDimensions} -import org.locationtech.rasterframes.tiles.ProjectedRasterTile -import org.locationtech.rasterframes.util.GeoTiffInfoSupport +import org.locationtech.rasterframes.{NOMINAL_TILE_DIMS, rfConfig} + +import scala.concurrent.duration.Duration /** * Abstraction over fetching geospatial raster data. @@ -53,7 +45,9 @@ import org.locationtech.rasterframes.util.GeoTiffInfoSupport * @since 8/21/18 */ @Experimental -sealed trait RasterSource extends ProjectedRasterLike with Serializable { +trait RasterSource extends ProjectedRasterLike with Serializable { + import RasterSource._ + def crs: CRS def extent: Extent @@ -96,22 +90,29 @@ sealed trait RasterSource extends ProjectedRasterLike with Serializable { object RasterSource extends LazyLogging { final val SINGLEBAND = Seq(0) final val EMPTY_TAGS = Tags(Map.empty, List.empty) + val cacheTimeout: Duration = Duration.fromNanos(rfConfig.getDuration("raster-source-cache-timeout").toNanos) + private val rsCache = Scaffeine() + .expireAfterAccess(RasterSource.cacheTimeout) + .build[URI, RasterSource] implicit def rsEncoder: ExpressionEncoder[RasterSource] = { RasterSourceUDT // Makes sure UDT is registered first ExpressionEncoder() } - def apply(source: URI): RasterSource = source match { - case IsGDAL() => GDALRasterSource(source) - case IsHadoopGeoTiff() => - // TODO: How can we get the active hadoop configuration - // TODO: without having to pass it through? - val config = () => new Configuration() - HadoopGeoTiffRasterSource(source, config) - case IsDefaultGeoTiff() => JVMGeoTiffRasterSource(source) - case s => throw new UnsupportedOperationException(s"Reading '$s' not supported") - } + def apply(source: URI): RasterSource = + rsCache.get( + source, { + case IsGDAL() => GDALRasterSource(source) + case IsHadoopGeoTiff() => + // TODO: How can we get the active hadoop configuration + // TODO: without having to pass it through? + val config = () => new Configuration() + HadoopGeoTiffRasterSource(source, config) + case IsDefaultGeoTiff() => JVMGeoTiffRasterSource(source) + case s => throw new UnsupportedOperationException(s"Reading '$s' not supported") + } + ) object IsGDAL { @@ -128,6 +129,7 @@ object RasterSource extends LazyLogging { } val gdalOnlyExtensions = Seq(".jp2", ".mrf", ".hdf") + def gdalOnly(source: URI): Boolean = if (gdalOnlyExtensions.exists(source.getPath.toLowerCase.endsWith)) { require(hasGDAL, s"Can only read $source if GDAL is available") @@ -153,33 +155,6 @@ object RasterSource extends LazyLogging { } } - case class SimpleGeoTiffInfo( - cols: Int, - rows: Int, - cellType: CellType, - extent: Extent, - rasterExtent: RasterExtent, - crs: CRS, - tags: Tags, - bandCount: Int, - noDataValue: Option[Double] - ) - - object SimpleGeoTiffInfo { - def apply(info: GeoTiffReader.GeoTiffInfo): SimpleGeoTiffInfo = - SimpleGeoTiffInfo( - info.segmentLayout.totalCols, - info.segmentLayout.totalRows, - info.cellType, - info.extent, - info.rasterExtent, - info.crs, - info.tags, - info.bandCount, - info.noDataValue - ) - } - trait URIRasterSource { _: RasterSource => def source: URI @@ -187,176 +162,6 @@ object RasterSource extends LazyLogging { s"${getClass.getSimpleName}(${source})" } } - - /** A RasterFrames RasterSource which delegates most operations to a geotrellis-contrib RasterSource */ - abstract class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRasterSource) extends RasterSource with URIRasterSource { - @transient - @volatile - private var _delRef: GTRasterSource = _ - - private def retryableRead[R >: Null](f: GTRasterSource => R): R = synchronized { - try { - if (_delRef == null) - _delRef = delegateBuilder() - f(_delRef) - } - catch { - // On this exeception we attempt to recreate the delegate and read again. - case be: java.nio.BufferUnderflowException => - _delRef = null - val newDel = delegateBuilder() - val result = f(newDel) - _delRef = newDel - result - } - } - - // Bad, bad, bad? - override def equals(obj: Any): Boolean = obj match { - case drs: DelegatingRasterSource => drs.source == source - case _ => false - } - override def hashCode(): Int = source.hashCode() - - // This helps reduce header reads between serializations - lazy val info: SimpleGeoTiffInfo = retryableRead { rs => - SimpleGeoTiffInfo( - rs.cols, - rs.rows, - rs.cellType, - rs.extent, - rs.rasterExtent, - rs.crs, - fetchTags, - rs.bandCount, - None - ) - } - - override def cols: Int = info.cols - override def rows: Int = info.rows - override def crs: CRS = info.crs - override def extent: Extent = info.extent - override def cellType: CellType = info.cellType - override def bandCount: Int = info.bandCount - private def fetchTags: Tags = retryableRead { - case rs: GeoTiffRasterSource => rs.tiff.tags - case _ => EMPTY_TAGS - } - override def tags: Tags = info.tags - - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = - retryableRead(_.readBounds(bounds, bands)) - - override def read(bounds: GridBounds, bands: Seq[Int]): Raster[MultibandTile] = - retryableRead(_.read(bounds, bands) - .getOrElse(throw new IllegalArgumentException(s"Bounds '$bounds' outside of source")) - ) - - override def read(extent: Extent, bands: Seq[Int]): Raster[MultibandTile] = - retryableRead(_.read(extent, bands) - .getOrElse(throw new IllegalArgumentException(s"Extent '$extent' outside of source")) - ) - } - - case class JVMGeoTiffRasterSource(source: URI) extends DelegatingRasterSource(source, () => GeoTiffRasterSource(source.toASCIIString)) - - case class InMemoryRasterSource(tile: Tile, extent: Extent, crs: CRS) extends RasterSource { - def this(prt: ProjectedRasterTile) = this(prt, prt.extent, prt.crs) - - override def rows: Int = tile.rows - - override def cols: Int = tile.cols - - override def cellType: CellType = tile.cellType - - override def bandCount: Int = 1 - - override def tags: Tags = EMPTY_TAGS - - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { - bounds - .map(b => { - val subext = rasterExtent.extentFor(b) - Raster(MultibandTile(tile.crop(b)), subext) - }) - .toIterator - } - } - - case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSource { - - @transient - private lazy val gdal = { - val cleaned = source.toASCIIString.replace("gdal+", "") - // VSIPath doesn't like single slash "file:/path..." - val tweaked = - if (cleaned.matches("^file:/[^/].*")) - cleaned.replace("file:", "") - else cleaned - - VLMRasterSource(tweaked) - } - - override def crs: CRS = gdal.crs - - override def extent: Extent = gdal.extent - - private def metadata = Map.empty[String, String] - - override def cellType: CellType = gdal.cellType - - override def bandCount: Int = gdal.bandCount - - override def cols: Int = gdal.cols - - override def rows: Int = gdal.rows - - override def tags: Tags = Tags(metadata, List.empty) - - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = - gdal.readBounds(bounds, bands) - } - - trait RangeReaderRasterSource extends RasterSource with GeoTiffInfoSupport with LazyLogging { - protected def rangeReader: RangeReader - - private def realInfo = - GeoTiffReader.readGeoTiffInfo(rangeReader, streaming = true, withOverviews = false) - - protected lazy val tiffInfo = SimpleGeoTiffInfo(realInfo) - - def crs: CRS = tiffInfo.crs - - def extent: Extent = tiffInfo.extent - - override def cols: Int = tiffInfo.rasterExtent.cols - - override def rows: Int = tiffInfo.rasterExtent.rows - - def cellType: CellType = tiffInfo.cellType - - def bandCount: Int = tiffInfo.bandCount - - override def tags: Tags = tiffInfo.tags - - override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = { - val info = realInfo - val geoTiffTile = GeoTiffReader.geoTiffMultibandTile(info) - val intersectingBounds = bounds.flatMap(_.intersection(this)).toSeq - geoTiffTile.crop(intersectingBounds, bands.toArray).map { - case (gb, tile) => - Raster(tile, rasterExtent.extentFor(gb, clamp = true)) - } - } - } - - case class HadoopGeoTiffRasterSource(source: URI, config: () => Configuration) - extends RangeReaderRasterSource with URIRasterSource with URIRasterSourceDebugString { self => - @transient - protected lazy val rangeReader = HdfsRangeReader(new Path(source.getPath), config()) - } - trait URIRasterSourceDebugString { _: RangeReaderRasterSource with URIRasterSource with Product => def toDebugString: String = { val buf = new StringBuilder() diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala new file mode 100644 index 000000000..4799607e6 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala @@ -0,0 +1,84 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.ref + +import java.net.URI + +import com.github.blemale.scaffeine.Scaffeine +import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource +import geotrellis.contrib.vlm.{RasterSource => GTRasterSource} +import geotrellis.proj4.CRS +import geotrellis.raster.io.geotiff.Tags +import geotrellis.raster.io.geotiff.reader.GeoTiffReader +import geotrellis.raster.{CellType, RasterExtent} +import geotrellis.vector.Extent +import org.locationtech.rasterframes.ref.RasterSource.EMPTY_TAGS + +case class SimpleRasterInfo( + cols: Int, + rows: Int, + cellType: CellType, + extent: Extent, + rasterExtent: RasterExtent, + crs: CRS, + tags: Tags, + bandCount: Int, + noDataValue: Option[Double] +) + +object SimpleRasterInfo { + def apply(info: GeoTiffReader.GeoTiffInfo): SimpleRasterInfo = + SimpleRasterInfo( + info.segmentLayout.totalCols, + info.segmentLayout.totalRows, + info.cellType, + info.extent, + info.rasterExtent, + info.crs, + info.tags, + info.bandCount, + info.noDataValue + ) + + def apply(rs: GTRasterSource): SimpleRasterInfo = { + def fetchTags: Tags = rs match { + case gt: GeoTiffRasterSource => gt.tiff.tags + case _ => EMPTY_TAGS + } + + SimpleRasterInfo( + rs.cols, + rs.rows, + rs.cellType, + rs.extent, + rs.rasterExtent, + rs.crs, + fetchTags, + rs.bandCount, + None + ) + } + + lazy val cache = Scaffeine() + .recordStats() + .build[URI, SimpleRasterInfo] +} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala b/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala index 7fea0a93e..8275c6402 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/RFKryoRegistrator.scala @@ -22,10 +22,9 @@ package org.locationtech.rasterframes.util import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile -import org.locationtech.rasterframes.ref.RasterRef -import org.locationtech.rasterframes.ref.RasterSource._ +import org.locationtech.rasterframes.ref.{DelegatingRasterSource, RasterRef, RasterSource} +import org.locationtech.rasterframes.ref._ import com.esotericsoftware.kryo.Kryo -import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} /** @@ -41,10 +40,11 @@ class RFKryoRegistrator extends geotrellis.spark.io.kryo.KryoRegistrator { kryo.register(classOf[RasterRef]) kryo.register(classOf[RasterRefTile]) kryo.register(classOf[DelegatingRasterSource]) + kryo.register(classOf[JVMGeoTiffRasterSource]) kryo.register(classOf[InMemoryRasterSource]) kryo.register(classOf[HadoopGeoTiffRasterSource]) kryo.register(classOf[GDALRasterSource]) - kryo.register(classOf[SimpleGeoTiffInfo]) + kryo.register(classOf[SimpleRasterInfo]) kryo.register(classOf[geotrellis.raster.io.geotiff.reader.GeoTiffReader.GeoTiffInfo]) } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index 7dbccc92a..0c3478d8f 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -27,8 +27,7 @@ import geotrellis.raster._ import geotrellis.raster.render.ColorRamps import geotrellis.vector.Extent import org.apache.spark.sql.{functions => F, _} -import org.locationtech.rasterframes.ref.RasterSource -import org.locationtech.rasterframes.ref.RasterSource.InMemoryRasterSource +import org.locationtech.rasterframes.ref.{InMemoryRasterSource, RasterSource} /** * diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala index 7fbc274f4..439934f38 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala @@ -21,7 +21,6 @@ package org.locationtech.rasterframes.ref -import RasterSource.{GDALRasterSource, JVMGeoTiffRasterSource} import org.locationtech.rasterframes.TestData import geotrellis.vector.Extent import org.apache.spark.sql.rf.RasterSourceUDT diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala index 85639ff41..e4c2c8eac 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala @@ -20,10 +20,10 @@ package org.locationtech.rasterframes.experimental.datasource.awspds -import java.net.{HttpURLConnection, URL, URLConnection} +import java.net.{HttpURLConnection, URL} import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.{TestEnvironment, rf_agg_stats} +import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource.raster._ /** @@ -90,31 +90,16 @@ class L8CatalogRelationTest extends TestEnvironment { it("should be compatible with raster DataSource") { val df = spark.read.raster - .fromCatalog(catalog, "B1", "B8") + .fromCatalog(catalog, "B1", "B3") .withTileDimensions(512, 512) .load() - df.printSchema() - df.show(false) - } + // Read just a single tile. + val sub = df.select($"B1", $"B3").where( + st_contains(st_geometry(rf_extent($"B1")), st_makePoint(602205, 7843335)) + ) -// it("should count scenes") { -// -// -// -// -// val scenes = sql("SELECT entity_id FROM l8 DISTINCT") -// scenes.count() shouldBe > (300400L) -// -// val subscenes = sqlContext.table("subscenes") -// subscenes.schema.size should be (4) -// subscenes.count() should be (7) -// } -// -// it("should compute statistics") { -// val subscenes = sqlContext.table("subscenes") -// val stats = subscenes.select(rf_agg_stats($"B1")).first() -// stats.data_cells shouldBe > (420024000L) -// } + sub.show(false) + } } } From 9e9c0acaba0ca97fa23aec18d116697e14a8913c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 1 Jul 2019 12:42:58 -0400 Subject: [PATCH 210/380] Rewrote L8 catalog to provide band URLs, for compatibility with RasterSourceDataSource. Added additional caching optimization uncovered during testing. --- .../ref/DelegatingRasterSource.scala | 2 +- .../rasterframes/ref/GDALRasterSource.scala | 7 ++----- .../rasterframes/ref/RasterSource.scala | 8 +++++--- .../rasterframes/ref/SimpleRasterInfo.scala | 6 ++---- .../awspds/L8CatalogRelationTest.scala | 17 +++++++++++------ 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala index b0224d5cd..c460911a0 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/DelegatingRasterSource.scala @@ -62,7 +62,7 @@ abstract class DelegatingRasterSource(source: URI, delegateBuilder: () => GTRast override def hashCode(): Int = source.hashCode() // This helps reduce header reads between serializations - lazy val info: SimpleRasterInfo = SimpleRasterInfo.cache.get(source, _ => + def info: SimpleRasterInfo = SimpleRasterInfo.cache.get(source.toASCIIString, _ => retryableRead(rs => SimpleRasterInfo(rs)) ) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala index 0b764766d..eabbac002 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala @@ -44,7 +44,7 @@ case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSour VLMRasterSource(tweaked) } - protected lazy val tiffInfo = SimpleRasterInfo.cache.get(source, _ => SimpleRasterInfo(gdal)) + protected def tiffInfo = SimpleRasterInfo.cache.get(source.toASCIIString, _ => SimpleRasterInfo(gdal)) override def crs: CRS = tiffInfo.crs @@ -52,10 +52,7 @@ case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSour private def metadata = Map.empty[String, String] - override def cellType: CellType = { - println(SimpleRasterInfo.cache.stats().toString) - tiffInfo.cellType - } + override def cellType: CellType = tiffInfo.cellType override def bandCount: Int = tiffInfo.bandCount diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index e39f32508..287bb8064 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -90,10 +90,12 @@ trait RasterSource extends ProjectedRasterLike with Serializable { object RasterSource extends LazyLogging { final val SINGLEBAND = Seq(0) final val EMPTY_TAGS = Tags(Map.empty, List.empty) + val cacheTimeout: Duration = Duration.fromNanos(rfConfig.getDuration("raster-source-cache-timeout").toNanos) + private val rsCache = Scaffeine() .expireAfterAccess(RasterSource.cacheTimeout) - .build[URI, RasterSource] + .build[String, RasterSource] implicit def rsEncoder: ExpressionEncoder[RasterSource] = { RasterSourceUDT // Makes sure UDT is registered first @@ -102,7 +104,7 @@ object RasterSource extends LazyLogging { def apply(source: URI): RasterSource = rsCache.get( - source, { + source.toASCIIString, _ => source match { case IsGDAL() => GDALRasterSource(source) case IsHadoopGeoTiff() => // TODO: How can we get the active hadoop configuration @@ -162,7 +164,7 @@ object RasterSource extends LazyLogging { s"${getClass.getSimpleName}(${source})" } } - trait URIRasterSourceDebugString { _: RangeReaderRasterSource with URIRasterSource with Product => + trait URIRasterSourceDebugString { _: RasterSource with URIRasterSource with Product => def toDebugString: String = { val buf = new StringBuilder() buf.append(productPrefix) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala index 4799607e6..1a67822e5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/SimpleRasterInfo.scala @@ -21,8 +21,6 @@ package org.locationtech.rasterframes.ref -import java.net.URI - import com.github.blemale.scaffeine.Scaffeine import geotrellis.contrib.vlm.geotiff.GeoTiffRasterSource import geotrellis.contrib.vlm.{RasterSource => GTRasterSource} @@ -79,6 +77,6 @@ object SimpleRasterInfo { } lazy val cache = Scaffeine() - .recordStats() - .build[URI, SimpleRasterInfo] + //.recordStats() + .build[String, SimpleRasterInfo] } \ No newline at end of file diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala index e4c2c8eac..cbe01dc63 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala @@ -87,19 +87,24 @@ class L8CatalogRelationTest extends TestEnvironment { describe("Read L8 scenes from PDS") { import spark.implicits._ val catalog = spark.read.l8Catalog.load().repartition(8) + val scenes = catalog + .where($"acquisition_date" === to_timestamp(lit("2017-04-04 15:12:55.394"))) + .where($"path" === 11 && $"row" === 12) it("should be compatible with raster DataSource") { val df = spark.read.raster - .fromCatalog(catalog, "B1", "B3") + .fromCatalog(scenes, "B1", "B3") .withTileDimensions(512, 512) .load() - // Read just a single tile. - val sub = df.select($"B1", $"B3").where( - st_contains(st_geometry(rf_extent($"B1")), st_makePoint(602205, 7843335)) - ) + // Further refine down to a tile + val sub = df.select($"B3") + .where(st_contains(st_geometry(rf_extent($"B1")), st_makePoint(574965, 7679175))) + + val stats = sub.select(rf_agg_stats($"B3")).first - sub.show(false) + stats.data_cells should be (512*512) + stats.mean shouldBe > (10000.0) } } } From 1621fb247af0de28b6f95f272b3e47e41fd8190f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 1 Jul 2019 14:48:30 -0400 Subject: [PATCH 211/380] Normalized schemas of L8 and MODIS catalogs, making them compatible with RasterSourceRelation. Deprecated separate `geotiff` reader. --- .../datasource/geotiff/GeoTiffRelation.scala | 2 +- .../datasource/geotiff/package.scala | 3 + .../GeoTiffCollectionDataSourceSpec.scala | 2 +- .../geotiff/GeoTiffDataSourceSpec.scala | 27 ++------ .../awspds/L8CatalogRelationTest.scala | 41 +++--------- .../awspds/MODISCatalogRelationTest.scala | 54 +++++++++++---- .../datasource/awspds/TestSupport.scala | 38 +++++++++++ .../datasource/awspds/L8CatalogRelation.scala | 5 +- .../awspds/MODISCatalogRelation.scala | 66 ++++++++----------- .../datasource/awspds/PDSFields.scala | 1 - .../datasource/awspds/package.scala | 5 +- 11 files changed, 133 insertions(+), 111 deletions(-) create mode 100644 experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/TestSupport.scala diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala index d16d69fb1..b08ebc830 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffRelation.scala @@ -109,7 +109,7 @@ case class GeoTiffRelation(sqlContext: SQLContext, uri: URI) extends BaseRelatio } } else { - logger.warn("GeoTIFF is not already tiled. In-memory read required: " + uri) + //logger.warn("GeoTIFF is not already tiled. In-memory read required: " + uri) val geotiff = HadoopGeoTiffReader.readMultiband(new Path(uri)) val rdd = sqlContext.sparkContext.makeRDD(Seq((geotiff.projectedExtent, Shims.toArrayTile(geotiff.tile)))) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala index 39fb16ca1..2178c7ee6 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala @@ -35,16 +35,19 @@ package object geotiff { /** Adds `geotiff` format specifier to `DataFrameReader`. */ implicit class DataFrameReaderHasGeoTiffFormat(val reader: DataFrameReader) { + @deprecated("Use `raster` instead.", "7/1/2019") def geotiff: GeoTiffRasterFrameReader = tag[GeoTiffRasterFrameReaderTag][DataFrameReader](reader.format(GeoTiffDataSource.SHORT_NAME)) } implicit class DataFrameWriterHasGeoTiffFormat[T](val writer: DataFrameWriter[T]) { + @deprecated("Use `raster` instead.", "7/1/2019") def geotiff: DataFrameWriter[T] = writer.format(GeoTiffDataSource.SHORT_NAME) } /** Adds `loadRF` to appropriately tagged `DataFrameReader` */ implicit class GeoTiffReaderWithRF(val reader: GeoTiffRasterFrameReader) { + @deprecated("Use `raster` instead.", "7/1/2019") def loadRF(path: URI): RasterFrame = reader.load(path.toASCIIString).asRF } } diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala index d50ef2b62..9b69fd89e 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionDataSourceSpec.scala @@ -35,7 +35,7 @@ class GeoTiffCollectionDataSourceSpec it("shiould read a directory of files") { val df = spark.read - .geotiff + .format("geotiff") .load(geotiffDir.resolve("*.tiff").toString) val expected = geotiffDir.toFile.list(new FilenameFilter { override def accept(dir: File, name: String): Boolean = name.endsWith("tiff") diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 04a532503..704c7db53 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -35,18 +35,14 @@ class GeoTiffDataSourceSpec describe("GeoTiff reading") { it("should read sample GeoTiff") { - val rf = spark.read - .geotiff - .loadRF(cogPath) + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF assert(rf.count() > 10) } it("should lay out tiles correctly"){ - val rf = spark.read - .geotiff - .loadRF(cogPath) + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF val tlm = rf.tileLayerMetadata.left.get val gb = tlm.gridBounds @@ -55,12 +51,7 @@ class GeoTiffDataSourceSpec } it("should lay out tiles correctly for non-tiled tif") { - val rf = spark.read - .geotiff - .loadRF(nonCogPath) - - //println(rf.count()) - //rf.show(false) + val rf = spark.read.format("geotiff").load(nonCogPath.toASCIIString).asRF assert(rf.count() > 1) @@ -83,7 +74,7 @@ class GeoTiffDataSourceSpec it("should read in correctly check-summed contents") { // c.f. TileStatsSpec -> computing statistics over tiles -> should compute tile statistics -> sum - val rf = spark.read.geotiff.loadRF(l8B1SamplePath) + val rf = spark.read.format("geotiff").load(l8B1SamplePath.toASCIIString).asRF val expected = 309149454 // computed with rasterio val result = rf.agg( sum(rf_tile_sum(rf("tile"))) @@ -93,23 +84,19 @@ class GeoTiffDataSourceSpec } it("should write GeoTIFF RF to parquet") { - val rf = spark.read - .geotiff - .loadRF(cogPath) + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF assert(write(rf)) } it("should write GeoTIFF") { - val rf = spark.read - .geotiff - .loadRF(cogPath) + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF logger.info(s"Read extent: ${rf.tileLayerMetadata.merge.extent}") val out = Paths.get("target", "example-geotiff.tiff") logger.info(s"Writing to $out") noException shouldBe thrownBy { - rf.write.geotiff.save(out.toString) + rf.write.format("geotiff").save(out.toString) } } } diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala index cbe01dc63..cfc901b9a 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala @@ -20,8 +20,6 @@ package org.locationtech.rasterframes.experimental.datasource.awspds -import java.net.{HttpURLConnection, URL} - import org.apache.spark.sql.functions._ import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource.raster._ @@ -32,16 +30,16 @@ import org.locationtech.rasterframes.datasource.raster._ * @since 5/4/18 */ class L8CatalogRelationTest extends TestEnvironment { + import spark.implicits._ + val catalog = spark.read.l8Catalog.load() - describe("Representing L8 scenes as a Spark data source") { - import spark.implicits._ - val catalog = spark.read.l8Catalog.load() - - val scenes = catalog - .where($"acquisition_date" === to_timestamp(lit("2017-04-04 15:12:55.394"))) - .where($"path" === 11 && $"row" === 12) + val scenes = catalog + .where($"acquisition_date" === to_timestamp(lit("2017-04-04 15:12:55.394"))) + .where($"path" === 11 && $"row" === 12) + .cache() + describe("Representing L8 scenes as a Spark data source") { it("should provide a non-empty catalog") { scenes.count() shouldBe 1 } @@ -51,22 +49,9 @@ class L8CatalogRelationTest extends TestEnvironment { } it("should construct valid URLs") { - - def urlResponse(urlStr: String): Int = { - val conn = new URL(urlStr).openConnection().asInstanceOf[HttpURLConnection] - try { - conn.setRequestMethod("GET") - conn.connect() - conn.getResponseCode - } - finally { - conn.disconnect() - } - } - val urlStr = scenes.select("B11").as[String].first - val code = urlResponse(urlStr) - code shouldBe 200 + val code = TestSupport.urlResponse(urlStr) + code should be (200) } it("should work with SQL and spatial predicates") { @@ -85,12 +70,6 @@ class L8CatalogRelationTest extends TestEnvironment { } describe("Read L8 scenes from PDS") { - import spark.implicits._ - val catalog = spark.read.l8Catalog.load().repartition(8) - val scenes = catalog - .where($"acquisition_date" === to_timestamp(lit("2017-04-04 15:12:55.394"))) - .where($"path" === 11 && $"row" === 12) - it("should be compatible with raster DataSource") { val df = spark.read.raster .fromCatalog(scenes, "B1", "B3") @@ -103,7 +82,7 @@ class L8CatalogRelationTest extends TestEnvironment { val stats = sub.select(rf_agg_stats($"B3")).first - stats.data_cells should be (512*512) + stats.data_cells should be (512L * 512L) stats.mean shouldBe > (10000.0) } } diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala index c7d11c917..3f777d322 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelationTest.scala @@ -19,11 +19,12 @@ */ package org.locationtech.rasterframes.experimental.datasource.awspds -import java.net.URL import java.sql.Timestamp import org.apache.spark.sql.functions._ -import org.locationtech.rasterframes.TestEnvironment +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.raster._ +import org.locationtech.rasterframes.stats.CellStatistics /** * Test rig for MODIS catalog stuff. @@ -31,23 +32,48 @@ import org.locationtech.rasterframes.TestEnvironment * @since 5/4/18 */ class MODISCatalogRelationTest extends TestEnvironment { - describe("Representing MODIS scenes as a Spark data source") { - import spark.implicits._ - val catalog = spark.read.format(MODISCatalogDataSource.SHORT_NAME).load() - val scenes = catalog - .where($"acquisition_date".as[Timestamp] === to_timestamp(lit("2018-1-1"))) - .where($"granule_id".contains("h24v03")) - .cache() + import spark.implicits._ + val catalog = spark.read.modisCatalog.load() + val scenes = catalog + .where($"acquisition_date".as[Timestamp] === to_timestamp(lit("2018-1-1"))) + .where($"granule_id".contains("h24v03")) + .cache() + describe("Representing MODIS scenes as a Spark data source") { it("should provide a non-empty catalog") { - assert(scenes.count() === 1) + scenes.count() should be (1) } - it("should construct band specific download URLs") { - val b01 = scenes.select($"assets"("B01").as[String]) - noException shouldBe thrownBy { - new URL(b01.first()) + it("should provide 7 band and 7 qa urls") { + scenes.schema.count(_.name.startsWith("B")) should be (14) + } + + it("should construct valid URLs") { + val urlStr = scenes.select("B03").as[String].first + val code = TestSupport.urlResponse(urlStr) + withClue(urlStr) { + code should be(200) } } } + + describe("Read MODIS scenes from PDS") { + it("should be compatible with raster DataSource") { + val df = spark.read.raster + .fromCatalog(scenes, "B03") + .withTileDimensions(128, 128) + .load() + + // Further refine down to a tile + val sub = df.select($"B03", st_centroid(st_geometry(rf_extent($"B03")))) + .where(st_contains(st_geometry(rf_extent($"B03")), st_makePoint(7175787.353582373, 6345530.965564346))) + .withColumn("stats", rf_tile_stats(rf_tile($"B03"))) + + val stats = sub.select($"stats".as[CellStatistics]).first() + + stats.data_cells shouldBe < (128L * 128L) + stats.data_cells shouldBe > (128L) + stats.mean shouldBe > (1000.0) + } + } } diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/TestSupport.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/TestSupport.scala new file mode 100644 index 000000000..a8d33f77e --- /dev/null +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/TestSupport.scala @@ -0,0 +1,38 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.experimental.datasource.awspds + +import java.net.{HttpURLConnection, URL} + +object TestSupport { + def urlResponse(urlStr: String): Int = { + val conn = new URL(urlStr).openConnection().asInstanceOf[HttpURLConnection] + try { + conn.setRequestMethod("GET") + conn.connect() + conn.getResponseCode + } + finally { + conn.disconnect() + } + } +} diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala index a7b426176..f87597362 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelation.scala @@ -49,7 +49,7 @@ case class L8CatalogRelation(sqlContext: SQLContext, sceneListPath: HadoopPath) import sqlContext.implicits._ logger.debug("Parsing " + sceneListPath) - val bandCols = Bands.values.toSeq.map(b => l8_band_url(b) as (b.toString)) + val bandCols = Bands.values.toSeq.map(b => l8_band_url(b) as b.toString) sqlContext.read .schema(inputSchema) @@ -69,13 +69,12 @@ case class L8CatalogRelation(sqlContext: SQLContext, sceneListPath: HadoopPath) .select(schema.map(f ⇒ col(f.name)): _*) .orderBy(ACQUISITION_DATE.name, PATH.name, ROW.name) .distinct() // The scene file contains duplicates. - .repartition(8) + .repartition(8, col(PATH.name), col(ROW.name)) } } object L8CatalogRelation extends PDSFields { - /** * Constructs link with the form: * `https://s3-us-west-2.amazonaws.com/landsat-pds/c1/L8/149/039/LC08_L1TP_149039_20170411_20170415_01_T1/LC08_L1TP_149039_20170411_20170415_01_T1_{bandId].TIF` diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala index 322bd5698..8fa3422e3 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/MODISCatalogRelation.scala @@ -28,6 +28,7 @@ import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources._ import org.apache.spark.sql.types._ import org.locationtech.rasterframes.experimental.datasource.CachedDatasetRelation +import org.locationtech.rasterframes.experimental.datasource.awspds.MODISCatalogRelation.Bands /** * Constructs a dataframe from the available scenes @@ -41,19 +42,7 @@ case class MODISCatalogRelation(sqlContext: SQLContext, sceneList: HadoopPath) protected def cacheFile: HadoopPath = sceneList.suffix(".parquet") - private val inputSchema = StructType(Seq( - StructField("date", TimestampType, false), - DOWNLOAD_URL, - GID - )) - - def schema = StructType(Seq( - PRODUCT_ID, - ACQUISITION_DATE, - GRANULE_ID, - GID, - ASSETS - )) + override def schema: StructType = MODISCatalogRelation.schema protected def constructDataset: Dataset[Row] = { import sqlContext.implicits._ @@ -63,47 +52,46 @@ case class MODISCatalogRelation(sqlContext: SQLContext, sceneList: HadoopPath) .option("header", "true") .option("mode", "DROPMALFORMED") // <--- mainly for the fact that we have internal headers from the concat .option("timestampFormat", "yyyy-MM-dd HH:mm:ss") - .schema(inputSchema) + .schema(MODISCatalogRelation.inputSchema) .csv(sceneList.toString) + val bandCols = Bands.values.toSeq.map(b => MCD43A4_band_url(b) as b.toString) + catalog .withColumn("__split_gid", split($"gid", "\\.")) .withColumn(DOWNLOAD_URL.name, regexp_replace(col(DOWNLOAD_URL.name), "index.html", "")) - .select( + .select(Seq( $"__split_gid" (0) as PRODUCT_ID.name, $"date" as ACQUISITION_DATE.name, $"__split_gid" (2) as GRANULE_ID.name, - $"${GID.name}", - MCD43A4_BAND_MAP as ASSETS.name + $"${GID.name}") ++ bandCols: _* ) .orderBy(ACQUISITION_DATE.name, GID.name) - .repartition(col(GRANULE_ID.name)) + .repartition(8, col(GRANULE_ID.name)) } } object MODISCatalogRelation extends PDSFields { - def MCD43A4_LINK(suffix: String) = - concat(col(DOWNLOAD_URL.name), concat(col(GID.name), lit(suffix))) + def MCD43A4_band_url(suffix: Bands.Band) = + concat(col(DOWNLOAD_URL.name), concat(col(GID.name), lit(s"_${suffix}.TIF"))) - val MCD43A4_BAND_MAP = map( - lit("B01"), MCD43A4_LINK("_B01.TIF"), - lit("B01qa"), MCD43A4_LINK("_B01qa.TIF"), - lit("B02"), MCD43A4_LINK("_B02.TIF"), - lit("B02qa"), MCD43A4_LINK("_B02qa.TIF"), - lit("B03"), MCD43A4_LINK("_B03.TIF"), - lit("B03qa"), MCD43A4_LINK("_B03qa.TIF"), - lit("B04"), MCD43A4_LINK("_B04.TIF"), - lit("B04qa"), MCD43A4_LINK("_B04qa.TIF"), - lit("B05"), MCD43A4_LINK("_B05.TIF"), - lit("B05qa"), MCD43A4_LINK("_B05qa.TIF"), - lit("B06"), MCD43A4_LINK("_B06.TIF"), - lit("B06qa"), MCD43A4_LINK("_B06qa.TIF"), - lit("B07"), MCD43A4_LINK("_B07.TIF"), - lit("B07qa"), MCD43A4_LINK("_B07qa.TIF"), - lit("metadata.json"), MCD43A4_LINK("_meta.json"), - lit("metadata.xml"), MCD43A4_LINK(".hdf.xml"), - lit("index.html"), concat(col(DOWNLOAD_URL.name), lit("index.html")) - ) + object Bands extends Enumeration { + type Band = Value + val B01, B01qa, B02, B02qa, B03, B03aq, B04, B04qa, B05, B05qa, B06, B06qa, B07, B07qa = Value + val names: Seq[String] = values.toSeq.map(_.toString) + } + + def schema = StructType(Seq( + PRODUCT_ID, + ACQUISITION_DATE, + GRANULE_ID, + GID + ) ++ Bands.names.map(n => StructField(n, StringType, true))) + private val inputSchema = StructType(Seq( + StructField("date", TimestampType, false), + DOWNLOAD_URL, + GID + )) } diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala index f615bbbe2..a0af40148 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala @@ -45,7 +45,6 @@ trait PDSFields { final val PATH = StructField("path", ShortType, false) final val ROW = StructField("row", ShortType, false) final val BOUNDS = StructField(GEOMETRY_COLUMN.columnName, JTSTypes.GeometryTypeInstance, false) - final val ASSETS = StructField("assets", DataTypes.createMapType(StringType, StringType)) final def BOUNDS_WGS84 = StructField( "bounds_wgs84", StandardEncoders.envelopeEncoder.schema, false ) diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala index 6a91c3d04..bbd476528 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/package.scala @@ -34,10 +34,13 @@ package object awspds { trait CatalogDataFrameReaderTag type CatalogDataFrameReader = DataFrameReader @@ CatalogDataFrameReaderTag - /** Adds `raster` format specifier to `DataFrameReader`. */ implicit class DataFrameReaderHasL8CatalogFormat(val reader: DataFrameReader) { def l8Catalog: CatalogDataFrameReader = tag[CatalogDataFrameReaderTag][DataFrameReader]( reader.format(L8CatalogDataSource.SHORT_NAME)) + + def modisCatalog: CatalogDataFrameReader = + tag[CatalogDataFrameReaderTag][DataFrameReader]( + reader.format(MODISCatalogDataSource.SHORT_NAME)) } } From b77df639050741714bdd1d47829c7bb1bbe0c309 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 1 Jul 2019 18:54:04 -0400 Subject: [PATCH 212/380] Added joining of extra columns from catalog into RasterFrame. Normalized handling of CSV tables into DataFrame input path. --- .../raster/RasterSourceDataSource.scala | 62 +++++++++++-------- .../raster/RasterSourceRelation.scala | 34 +++++----- .../datasource/raster/package.scala | 10 ++- .../raster/RasterSourceDataSourceSpec.scala | 34 ++++++---- 4 files changed, 81 insertions(+), 59 deletions(-) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala index 6626bd6db..b0b4185d8 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala @@ -27,8 +27,6 @@ import org.apache.spark.sql.SQLContext import org.apache.spark.sql.sources.{BaseRelation, DataSourceRegister, RelationProvider} import org.locationtech.rasterframes.model.TileDimensions -import scala.util.Try - class RasterSourceDataSource extends DataSourceRegister with RelationProvider { import RasterSourceDataSource._ override def shortName(): String = SHORT_NAME @@ -36,9 +34,11 @@ class RasterSourceDataSource extends DataSourceRegister with RelationProvider { val bands = parameters.bandIndexes val tiling = parameters.tileDims val spec = parameters.pathSpec - RasterSourceRelation(sqlContext, spec, bands, tiling) + val catRef = spec.fold(_.registerAsTable(sqlContext), identity) + RasterSourceRelation(sqlContext, catRef, bands, tiling) } } + object RasterSourceDataSource { final val SHORT_NAME = "raster" final val PATH_PARAM = "path" @@ -55,29 +55,39 @@ object RasterSourceDataSource { def bandColumnNames: Seq[String] } /** Container for specifying raster paths. */ - case class BandSet(bandPaths: String*) - case class RasterSourceCatalog(sceneRows: Seq[BandSet], bandColumnNames: String*) extends WithBandColumns { - require(sceneRows.forall(_.bandPaths.length == bandColumnNames.length), - "Each scene row must have the same number of entries as band column names") - } - - object RasterSourceCatalog { - def apply(csv: String, bandColumnNames: String*): Option[RasterSourceCatalog] = Try { + case class RasterSourceCatalog(csv: String, bandColumnNames: String*) extends WithBandColumns { + def registerAsTable(sqlContext: SQLContext): RasterSourceCatalogRef = { + import sqlContext.implicits._ val lines = csv .split(Array('\n','\r')) .map(_.trim) .filter(_.nonEmpty) - val header = lines.head.split(',').map(_.trim).toSeq - val rows = lines.tail.map(_.split(',').map(_.trim)).map(BandSet(_: _*)) - val bands = if (bandColumnNames.isEmpty) header + val dsLines = sqlContext.createDataset(lines) + val catalog = sqlContext.read + .option("header", "true") + .option("ignoreTrailingWhiteSpace", true) + .option("ignoreLeadingWhiteSpace", true) + .csv(dsLines) + + val tmpName = tmpTableName() + catalog.createOrReplaceTempView(tmpName) + + val cols = if (bandColumnNames.isEmpty) catalog.columns.toSeq else bandColumnNames - RasterSourceCatalog(rows, bands: _*) - }.toOption + RasterSourceCatalogRef(tmpName, cols: _*) + } + } + + object RasterSourceCatalog { def apply(singlebandPaths: Seq[String]): Option[RasterSourceCatalog] = if (singlebandPaths.isEmpty) None - else Some(RasterSourceCatalog(singlebandPaths.map(BandSet(_)), DEFAULT_COLUMN_NAME)) + else { + val header = DEFAULT_COLUMN_NAME + val csv = header + "\n" + singlebandPaths.mkString("\n") + Some(new RasterSourceCatalog(csv, header)) + } } /** Container for specifying where to select raster paths from. */ @@ -85,15 +95,16 @@ object RasterSourceDataSource { private[raster] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { + def tokenize(csv: String): Seq[String] = csv.split(',').map(_.trim) def tileDims: Option[TileDimensions] = parameters.get(TILE_DIMS_PARAM) - .map(_.split(',').map(_.trim.toInt)) - .map { case Array(cols, rows) => TileDimensions(cols, rows)} + .map(tokenize(_).map(_.toInt)) + .map { case Seq(cols, rows) => TileDimensions(cols, rows)} def bandIndexes: Seq[Int] = parameters .get(BAND_INDEXES_PARAM) - .map(_.split(',').map(_.trim.toInt).toSeq) + .map(tokenize(_).map(_.toInt)) .getOrElse(Seq(0)) def catalog: Option[RasterSourceCatalog] = { @@ -110,13 +121,13 @@ object RasterSourceDataSource { RasterSourceCatalog(paths) .orElse(parameters .get(CATALOG_CSV_PARAM) - .flatMap(RasterSourceCatalog(_, catalogTableCols: _*)) + .map(RasterSourceCatalog(_, catalogTableCols: _*)) ) } def catalogTableCols: Seq[String] = parameters .get(CATALOG_TABLE_COLS_PARAM) - .map(_.split(',').toSeq) + .map(tokenize(_).filter(_.nonEmpty).toSeq) .getOrElse(Seq.empty) def catalogTable: Option[RasterSourceCatalogRef] = parameters @@ -124,12 +135,13 @@ object RasterSourceDataSource { .map(p => RasterSourceCatalogRef(p, catalogTableCols: _*)) def pathSpec: Either[RasterSourceCatalog, RasterSourceCatalogRef] = { - val a = catalogTable - val b = catalogTableCols (catalog, catalogTable) match { case (Some(f), None) => Left(f) case (None, Some(p)) => Right(p) - case _ => throw new IllegalArgumentException("Only one of a set of file paths OR a paths table column may be provided.") + case (None, None) => throw new IllegalArgumentException( + s"Unable to interpret paths from: ${parameters.mkString("\n", "\n", "\n")}") + case _ => throw new IllegalArgumentException( + "Only one of a set of file paths OR a paths table column may be provided.") } } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala index c5169b8c9..dc0cfac97 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala @@ -26,7 +26,7 @@ import org.apache.spark.sql.functions._ import org.apache.spark.sql.sources.{BaseRelation, TableScan} import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} -import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.{RasterSourceCatalog, RasterSourceCatalogRef} +import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.RasterSourceCatalogRef import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} @@ -42,11 +42,11 @@ import org.locationtech.rasterframes.tiles.ProjectedRasterTile */ case class RasterSourceRelation( sqlContext: SQLContext, - catalogTable: Either[RasterSourceCatalog, RasterSourceCatalogRef], + catalogTable: RasterSourceCatalogRef, bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) extends BaseRelation with TableScan { - lazy val inputColNames = catalogTable.merge.bandColumnNames + lazy val inputColNames = catalogTable.bandColumnNames def pathColNames = inputColNames .map(_ + "_path") @@ -61,6 +61,11 @@ case class RasterSourceRelation( def tileColNames = inputColNames .flatMap(bandNames(_, bandIndexes)) + def extraCols: Seq[StructField] = { + val catalog = sqlContext.table(catalogTable.tableName) + catalog.schema.fields.filter(f => !catalogTable.bandColumnNames.contains(f.name)) + } + override def schema: StructType = { val tileSchema = schemaOf[ProjectedRasterTile] val paths = for { @@ -70,7 +75,7 @@ case class RasterSourceRelation( tileColName <- tileColNames } yield StructField(tileColName, tileSchema, true) - StructType(paths ++ tiles) + StructType(paths ++ tiles ++ extraCols) } override def buildScan(): RDD[Row] = { @@ -79,18 +84,7 @@ case class RasterSourceRelation( // The general transformaion is: // input -> path -> src -> ref -> tile // Each step is broken down for readability - val inputs: DataFrame = catalogTable match { - case Right(spec) => sqlContext.table(spec.tableName) - case Left(spec) => spec.bandColumnNames match { - case Seq(single) => spec.sceneRows.map(_.bandPaths.headOption.orNull).toDF(single) - case bands => - val bsel = bands.zipWithIndex.map { case (b, i) => col("value")(i).as(b) } - - spec.sceneRows.map(_.bandPaths) - .toDF("value") - .select(bsel: _*) - } - } + val inputs: DataFrame = sqlContext.table(catalogTable.tableName) // Basically renames the input columns to have the '_path' suffix val pathsAliasing = for { @@ -115,15 +109,17 @@ case class RasterSourceRelation( // Add path columns val withPaths = inputs - .select(pathsAliasing: _*) + .select($"*" +: pathsAliasing: _*) // Path columns have to be manually pulled along through each step. Resolve columns once // and reused with each select. val paths = pathColNames.map(withPaths.apply) + val extras = extraCols.map(f => inputs(f.name)) + val df = withPaths - .select(paths :+ refs: _*) - .select(paths ++ refsToTiles: _*) + .select(extras ++ paths :+ refs: _*) + .select(paths ++ refsToTiles ++ extras: _*) df.rdd } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala index 1376ea5c9..3ac06946a 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala @@ -29,6 +29,8 @@ import shapeless.tag import shapeless.tag.@@ package object raster { + private[raster] def tmpTableName() = UUID.randomUUID().toString.replace("-", "") + trait RasterSourceDataFrameReaderTag type RasterSourceDataFrameReader = DataFrameReader @@ RasterSourceDataFrameReaderTag @@ -53,9 +55,10 @@ package object raster { def fromCatalog(catalog: DataFrame, bandColumnNames: String*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader] { - val tmpName = UUID.randomUUID().toString.replace("-", "") + val tmpName = tmpTableName() catalog.createOrReplaceTempView(tmpName) - reader.option(RasterSourceDataSource.CATALOG_TABLE_PARAM, tmpName) + reader + .option(RasterSourceDataSource.CATALOG_TABLE_PARAM, tmpName) .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) } @@ -65,9 +68,10 @@ package object raster { .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) ) - def fromCSV(catalogCSV: String): RasterSourceDataFrameReader = + def fromCSV(catalogCSV: String, bandColumnNames: String*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader]( reader.option(RasterSourceDataSource.CATALOG_CSV_PARAM, catalogCSV) + .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) ) def from(newlineDelimPaths: String): RasterSourceDataFrameReader = diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala index 48c524980..58aa44dfd 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala @@ -20,6 +20,7 @@ */ package org.locationtech.rasterframes.datasource.raster +import org.apache.spark.sql.functions.lit import org.locationtech.rasterframes.{TestEnvironment, _} import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.{RasterSourceCatalog, _} import org.locationtech.rasterframes.model.TileDimensions @@ -30,7 +31,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { describe("DataSource parameter processing") { def singleCol(paths: Iterable[String]) = { - val rows: Seq[BandSet] = paths.map(BandSet(_)).toSeq + val rows = paths.mkString(DEFAULT_COLUMN_NAME + "\n", "\n", "") RasterSourceCatalog(rows, DEFAULT_COLUMN_NAME) } @@ -73,7 +74,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { |${paths.mkString(",")} """.stripMargin.trim val p = Map(CATALOG_CSV_PARAM -> csv) - p.pathSpec should be (Left(RasterSourceCatalog(Seq(BandSet(paths:_*)), bands:_*))) + p.pathSpec should be (Left(RasterSourceCatalog(csv))) } } @@ -177,39 +178,48 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { l8SamplePath(2).toASCIIString, l8SamplePath(3).toASCIIString)) .toDF("B1", "B2", "B3") + .withColumn("foo", lit("something")) val df = spark.read.raster .fromCatalog(bandPaths, "B1", "B2", "B3") .withTileDimensions(128, 128) .load() - df.schema.size should be(6) + df.schema.size should be(7) df.tileColumns.size should be (3) df.select($"B1_path").distinct().count() should be (1) + df.columns.contains("foo") should be (true) + df.select($"foo").distinct().count() should be (1) + df.select($"foo".as[String]).first() should be ("something") + val diffStats = df.select(rf_tile_stats($"B1") =!= rf_tile_stats($"B2")).as[Boolean].collect() diffStats.forall(identity) should be(true) } - it("should read a set of coherent bands from multiple files in a table") { - val bandPaths = Seq(( - l8SamplePath(1).toASCIIString, - l8SamplePath(2).toASCIIString, - l8SamplePath(3).toASCIIString)) - .toDF("B1", "B2", "B3") + it("should read a set of coherent bands from multiple files in a csv") { + def b(i: Int) = l8SamplePath(i).toASCIIString - bandPaths.createOrReplaceTempView("pathsTable") + val csv = + s""" + |B1, B2, B3, foo + |${b(1)}, ${b(2)}, ${b(3)}, something + """.stripMargin val df = spark.read.raster - .fromCatalog("pathsTable", "B1", "B2", "B3") + .fromCSV(csv, "B1", "B2", "B3") .withTileDimensions(128, 128) .load() - df.schema.size should be(6) + df.schema.size should be(7) df.tileColumns.size should be (3) df.select($"B1_path").distinct().count() should be (1) + df.columns.contains("foo") should be (true) + df.select($"foo").distinct().count() should be (1) + df.select($"foo".as[String]).first() should be ("something") + val diffStats = df.select(rf_tile_stats($"B1") =!= rf_tile_stats($"B2")).as[Boolean].collect() diffStats.forall(identity) should be(true) } From 29142313e28a8958a893bb2c5156fc7ddea87bcc Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Jul 2019 08:53:51 -0400 Subject: [PATCH 213/380] Documentation tweaks. --- .../src/main/python/docs/raster-io.pymd | 28 +++++++++++++++++-- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 5b66afeaf..318fec5ee 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -2,6 +2,26 @@ The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames are compatible with existing generalized DataSources, such as Parquet, but provide specialized ones oriented around geospatial raster data. +Three types of DataSources will be introduced below: + +* Catalog Readers + - `aws-pds-l8-catalog`: experimental + - `aws-pds-modis-catalog`: experimental + - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] +* Raster Readers + - `raster`: the standard reader for most operations + - `geotrellis` (for reading [GeoTrellis layers][GTLayer]) + - `geotiff`: a deprecated reader for reading single GeoTIFF files +* Raster Writers + - `geotrellis`: for creating [GeoTrellis layers][GTLayer] + - `geotiff`: beta + - `parquet`: for writing raster data in an analytics functional form + +There's also some support for vector data (for masking and data labeling): + +* Vector Readers + - `geojson`: read GeoJson files with `geometry` column aside attribute values + ## Reading Raster Data ```python, echo=False @@ -73,7 +93,7 @@ rf2.printSchema() rf2.show(5) ``` -### Multiple Scenes, Multiple Bands +### Raster Catalogs The example above will work with a reasonable number of rows in the CSV string. However, in many cases it's preferable to have that information organized in another DataFrame. For the purposes of this example use one of the AWS PDS daily scene listing files for MODIS surface reflectance as our catalog. @@ -136,7 +156,8 @@ rf.show(2, truncate=False) ### Multiband Rasters -[[Need to know _a priori_ how many bands there are, specified with `band_indexes`]] +> Need to know _a priori_ how many bands there are, specified with `band_indexes`. +> Must be homogenous, or tolerant of `null` Tiles. ## Writing Raster Data @@ -152,4 +173,5 @@ rf.show(2, truncate=False) -[DS]: https://spark.apache.org/docs/latest/sql-data-sources.html \ No newline at end of file +[DS]: https://spark.apache.org/docs/latest/sql-data-sources.html +[GTLayer]: https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html \ No newline at end of file From d4f0ca87f658f3098b5b78f1b1dce403ad22af42 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Jul 2019 11:04:42 -0400 Subject: [PATCH 214/380] `RasterFrame` renamed to `RasterFrameLayer` `asRF` now `asLayer` Fixed snake caseing of Python `RasterFrameLayer` methods. --- .../rasterframes/MetadataKeys.scala | 2 +- .../rasterframes/PairRDDConverter.scala | 2 +- .../rasterframes/StandardColumns.scala | 16 +- .../encoders/StandardEncoders.scala | 2 +- .../extensions/ContextRDDMethods.scala | 14 +- .../extensions/DataFrameMethods.scala | 48 ++-- .../rasterframes/extensions/Implicits.scala | 4 +- .../extensions/ProjectedRasterMethods.scala | 55 ++-- .../extensions/RFSpatialColumnMethods.scala | 28 +-- ...ds.scala => RasterFrameLayerMethods.scala} | 43 ++-- .../rasterframes/rasterframes.scala | 8 +- .../rasterframes/util/debug/package.scala | 4 +- .../rasterframes/util/package.scala | 4 +- .../test/scala/examples/Classification.scala | 8 +- core/src/test/scala/examples/Clustering.scala | 6 +- .../scala/examples/CreatingRasterFrames.scala | 10 +- core/src/test/scala/examples/Exporting.scala | 14 +- .../test/scala/examples/LocalArithmetic.scala | 6 +- core/src/test/scala/examples/Masking.scala | 6 +- core/src/test/scala/examples/MeanValue.scala | 2 +- core/src/test/scala/examples/NDVI.scala | 6 +- core/src/test/scala/examples/Tour.scala | 10 +- .../rasterframes/ExplodeSpec.scala | 4 +- .../rasterframes/ExtensionMethodSpec.scala | 6 +- .../rasterframes/GeometryFunctionsSpec.scala | 4 +- .../rasterframes/MetadataSpec.scala | 2 +- .../rasterframes/RasterFrameSpec.scala | 66 ++--- .../rasterframes/SpatialKeySpec.scala | 2 +- .../locationtech/rasterframes/TestData.scala | 2 +- .../rasterframes/TileAssemblerSpec.scala | 2 +- .../rasterframes/TileUDTSpec.scala | 2 +- .../geotiff/GeoTiffDataSource.scala | 2 +- .../datasource/geotiff/package.scala | 6 +- .../GeoTrellisLayerDataSource.scala | 4 +- .../datasource/geotrellis/package.scala | 12 +- .../src/test/scala/examples/Creating.scala | 235 ------------------ .../geotiff/GeoTiffDataSourceSpec.scala | 12 +- .../geotrellis/GeoTrellisCatalogSpec.scala | 2 +- .../geotrellis/GeoTrellisDataSourceSpec.scala | 74 +++--- docs/src/main/paradox/release-notes.md | 7 +- .../src/main/python/docs/architecture.md | 39 +++ .../src/main/python/docs/description.md | 17 -- .../main/python/pyrasterframes/__init__.py | 16 +- .../main/python/pyrasterframes/rf_context.py | 2 +- .../main/python/pyrasterframes/rf_types.py | 50 ++-- .../main/python/tests/PyRasterFramesTests.py | 28 +-- .../src/main/python/tests/__init__.py | 8 +- .../rasterframes/py/PyRFContext.scala | 56 ++--- 48 files changed, 374 insertions(+), 584 deletions(-) rename core/src/main/scala/org/locationtech/rasterframes/extensions/{RasterFrameMethods.scala => RasterFrameLayerMethods.scala} (90%) delete mode 100644 datasource/src/test/scala/examples/Creating.scala create mode 100644 pyrasterframes/src/main/python/docs/architecture.md diff --git a/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala b/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala index d3f90a502..9eb4000d9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/MetadataKeys.scala @@ -29,6 +29,6 @@ trait MetadataKeys { /** Key under which ContextRDD metadata is stored. */ private[rasterframes] val CONTEXT_METADATA_KEY = "_context" - /** Key under which RasterFrame role a column plays. */ + /** Key under which RasterFrameLayer role a column plays. */ private[rasterframes] val SPATIAL_ROLE_KEY = "_stRole" } diff --git a/core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala b/core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala index 0b3caf09e..658c0d65d 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/PairRDDConverter.scala @@ -36,7 +36,7 @@ import scala.annotation.implicitNotFound * * @since 4/8/18 */ -@implicitNotFound("An RDD converter is required create a RasterFrame. " + +@implicitNotFound("An RDD converter is required create a RasterFrameLayer. " + "Please provide an implementation of PairRDDConverter[${K}, ${V}].") trait PairRDDConverter[K, V] extends Serializable { val schema: StructType diff --git a/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala b/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala index 128729209..2e82ab356 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/StandardColumns.scala @@ -38,20 +38,20 @@ import org.locationtech.rasterframes.tiles.ProjectedRasterTile * @since 2/19/18 */ trait StandardColumns { - /** Default RasterFrame spatial column name. */ + /** Default RasterFrameLayer spatial column name. */ val SPATIAL_KEY_COLUMN = col("spatial_key").as[SpatialKey] - /** Default RasterFrame temporal column name. */ + /** Default RasterFrameLayer temporal column name. */ val TEMPORAL_KEY_COLUMN = col("temporal_key").as[TemporalKey] - /** Default RasterFrame timestamp column name */ + /** Default RasterFrameLayer timestamp column name */ val TIMESTAMP_COLUMN = col("timestamp").as[Timestamp] - /** Default RasterFrame column name for an tile extent as geometry value. */ + /** Default RasterFrameLayer column name for an tile extent as geometry value. */ // This is a `def` because `PolygonUDT` needs to be initialized first. def GEOMETRY_COLUMN = col("geometry").as[jtsPolygon] - /** Default RasterFrame column name for the center coordinates of the tile's bounds. */ + /** Default RasterFrameLayer column name for the center coordinates of the tile's bounds. */ // This is a `def` because `PointUDT` needs to be initialized first. def CENTER_COLUMN = col("center").as[jtsPoint] @@ -64,17 +64,17 @@ trait StandardColumns { /** Default CRS column name. */ def CRS_COLUMN = col("crs").as[CRS] - /** Default RasterFrame column name for an added spatial index. */ + /** Default RasterFrameLayer column name for an added spatial index. */ val SPATIAL_INDEX_COLUMN = col("spatial_index").as[Long] - /** Default RasterFrame tile column name. */ + /** Default RasterFrameLayer tile column name. */ // This is a `def` because `TileUDT` needs to be initialized first. def TILE_COLUMN = col("tile").as[Tile] /** Default column name for a tile with its CRS and Extent. */ def PROJECTED_RASTER_COLUMN = col("proj_raster").as[ProjectedRasterTile] - /** Default RasterFrame `TileFeature.data` column name. */ + /** Default RasterFrameLayer `TileFeature.data` column name. */ val TILE_FEATURE_DATA_COLUMN = col("tile_data") /** Default GeoTiff tags column. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala index 8066265d3..badce6283 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala @@ -39,7 +39,7 @@ import org.locationtech.rasterframes.model.{CellContext, Cells, TileContext, Til import scala.reflect.runtime.universe._ /** - * Implicit encoder definitions for RasterFrame types. + * Implicit encoder definitions for RasterFrameLayer types. */ trait StandardEncoders extends SpatialEncoders { object PrimitiveEncoders extends SparkBasicEncoders diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala index d7aa0a665..7bf3230b3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ContextRDDMethods.scala @@ -25,7 +25,7 @@ import org.locationtech.rasterframes.PairRDDConverter._ import org.locationtech.rasterframes.StandardColumns._ import Implicits._ import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.{PairRDDConverter, RasterFrame} +import org.locationtech.rasterframes.RasterFrameLayer import geotrellis.raster.CellGrid import geotrellis.spark._ import geotrellis.spark.io._ @@ -35,16 +35,16 @@ import org.apache.spark.sql.SparkSession import org.locationtech.rasterframes.PairRDDConverter /** - * Extension method on `ContextRDD`-shaped RDDs with appropriate context bounds to create a RasterFrame. + * Extension method on `ContextRDD`-shaped RDDs with appropriate context bounds to create a RasterFrameLayer. * @since 7/18/17 */ abstract class SpatialContextRDDMethods[T <: CellGrid](implicit spark: SparkSession) extends MethodExtensions[RDD[(SpatialKey, T)] with Metadata[TileLayerMetadata[SpatialKey]]] { import PairRDDConverter._ - def toRF(implicit converter: PairRDDConverter[SpatialKey, T]): RasterFrame = toRF(TILE_COLUMN.columnName) + def toLayer(implicit converter: PairRDDConverter[SpatialKey, T]): RasterFrameLayer = toLayer(TILE_COLUMN.columnName) - def toRF(tileColumnName: String)(implicit converter: PairRDDConverter[SpatialKey, T]): RasterFrame = { + def toLayer(tileColumnName: String)(implicit converter: PairRDDConverter[SpatialKey, T]): RasterFrameLayer = { val df = self.toDataFrame.setSpatialColumnRole(SPATIAL_KEY_COLUMN, self.metadata) val defName = TILE_COLUMN.columnName df.mapWhen(_ ⇒ tileColumnName != defName, _.withColumnRenamed(defName, tileColumnName)) @@ -53,16 +53,16 @@ abstract class SpatialContextRDDMethods[T <: CellGrid](implicit spark: SparkSess } /** - * Extension method on `ContextRDD`-shaped `Tile` RDDs keyed with [[SpaceTimeKey]], with appropriate context bounds to create a RasterFrame. + * Extension method on `ContextRDD`-shaped `Tile` RDDs keyed with [[SpaceTimeKey]], with appropriate context bounds to create a RasterFrameLayer. * @since 9/11/17 */ abstract class SpatioTemporalContextRDDMethods[T <: CellGrid]( implicit spark: SparkSession) extends MethodExtensions[RDD[(SpaceTimeKey, T)] with Metadata[TileLayerMetadata[SpaceTimeKey]]] { - def toRF(implicit converter: PairRDDConverter[SpaceTimeKey, T]): RasterFrame = toRF(TILE_COLUMN.columnName) + def toLayer(implicit converter: PairRDDConverter[SpaceTimeKey, T]): RasterFrameLayer = toLayer(TILE_COLUMN.columnName) - def toRF(tileColumnName: String)(implicit converter: PairRDDConverter[SpaceTimeKey, T]): RasterFrame = { + def toLayer(tileColumnName: String)(implicit converter: PairRDDConverter[SpaceTimeKey, T]): RasterFrameLayer = { val df = self.toDataFrame .setSpatialColumnRole(SPATIAL_KEY_COLUMN, self.metadata) .setTemporalColumnRole(TEMPORAL_KEY_COLUMN) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 599beb637..43177117b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -23,7 +23,7 @@ package org.locationtech.rasterframes.extensions import org.locationtech.rasterframes.StandardColumns._ import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.RasterFrame +import org.locationtech.rasterframes.RasterFrameLayer import geotrellis.raster.Tile import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} @@ -44,7 +44,7 @@ import scala.util.Try * @since 7/18/17 */ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with MetadataKeys { - import Implicits.{WithDataFrameMethods, WithMetadataBuilderMethods, WithMetadataMethods, WithRasterFrameMethods} + import Implicits.{WithDataFrameMethods, WithMetadataBuilderMethods, WithMetadataMethods, WithRasterFrameLayerMethods} private def selector(column: Column) = (attr: Attribute) ⇒ attr.name == column.columnName || attr.semanticEquals(column.expr) @@ -82,7 +82,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def setTemporalColumnRole(column: Column): DF = addColumnMetadata(column, _.tagTemporalKey) - /** Get the role tag the column plays in the RasterFrame, if any. */ + /** Get the role tag the column plays in the RasterFrameLayer, if any. */ private[rasterframes] def getColumnRole(column: Column): Option[String] = fetchMetadataValue(column, _.metadata.getString(SPATIAL_ROLE_KEY)) @@ -135,7 +135,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def withPrefixedColumnNames(prefix: String): DF = self.columns.foldLeft(self)((df, c) ⇒ df.withColumnRenamed(c, s"$prefix$c").asInstanceOf[DF]) - /** Converts this DataFrame to a RasterFrame after ensuring it has: + /** Converts this DataFrame to a RasterFrameLayer after ensuring it has: * *
      *
    1. a space or space-time key column @@ -145,23 +145,23 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada * * If any of the above are violated, and [[IllegalArgumentException]] is thrown. * - * @return validated RasterFrame + * @return validated RasterFrameLayer * @throws IllegalArgumentException when constraints are not met. */ @throws[IllegalArgumentException] - def asRF: RasterFrame = { + def asLayer: RasterFrameLayer = { val potentialRF = certifyRasterframe(self) require( potentialRF.findSpatialKeyField.nonEmpty, - "A RasterFrame requires a column identified as a spatial key" + "A RasterFrameLayer requires a column identified as a spatial key" ) - require(potentialRF.tileColumns.nonEmpty, "A RasterFrame requires at least one tile column") + require(potentialRF.tileColumns.nonEmpty, "A RasterFrameLayer requires at least one tile column") require( Try(potentialRF.tileLayerMetadata).isSuccess, - "A RasterFrame requires embedded TileLayerMetadata" + "A RasterFrameLayer requires embedded TileLayerMetadata" ) potentialRF @@ -219,36 +219,36 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada RasterJoin(self, right, joinExpr, leftExtent, leftCRS, rightExtent, rightCRS) /** - * Convert DataFrame into a RasterFrame + * Convert DataFrame into a RasterFrameLayer * * @param spatialKey The column where the spatial key is stored * @param tlm Metadata describing layout under which tiles were created. Note: no checking is * performed to ensure metadata, key-space, and tiles are coherent. - * @throws IllegalArgumentException when constraints outlined in `asRF` are not met. - * @return Encoded RasterFrame + * @throws IllegalArgumentException when constraints outlined in `asLayer` are not met. + * @return Encoded RasterFrameLayer */ @throws[IllegalArgumentException] - def asRF(spatialKey: Column, tlm: TileLayerMetadata[SpatialKey]): RasterFrame = - setSpatialColumnRole(spatialKey, tlm).asRF + def asLayer(spatialKey: Column, tlm: TileLayerMetadata[SpatialKey]): RasterFrameLayer = + setSpatialColumnRole(spatialKey, tlm).asLayer /** - * Convert DataFrame into a RasterFrame + * Convert DataFrame into a RasterFrameLayer * * @param spatialKey The column where the spatial key is stored * @param temporalKey The column tagged under the temporal role * @param tlm Metadata describing layout under which tiles were created. Note: no checking is * performed to ensure metadata, key-space, and tiles are coherent. - * @throws IllegalArgumentException when constraints outlined in `asRF` are not met. - * @return Encoded RasterFrame + * @throws IllegalArgumentException when constraints outlined in `asLayer` are not met. + * @return Encoded RasterFrameLayer */ @throws[IllegalArgumentException] - def asRF(spatialKey: Column, temporalKey: Column, tlm: TileLayerMetadata[SpaceTimeKey]): RasterFrame = + def asLayer(spatialKey: Column, temporalKey: Column, tlm: TileLayerMetadata[SpaceTimeKey]): RasterFrameLayer = setSpatialColumnRole(spatialKey, tlm) .setTemporalColumnRole(temporalKey) - .asRF + .asLayer /** - * Converts [[DataFrame]] to a RasterFrame if the following constraints are fulfilled: + * Converts [[DataFrame]] to a RasterFrameLayer if the following constraints are fulfilled: * *
        *
      1. a space or space-time key column @@ -256,9 +256,9 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada *
      2. tile layout metadata *
          * - * @return Some[RasterFrame] if constraints fulfilled, [[None]] otherwise. + * @return Some[RasterFrameLayer] if constraints fulfilled, [[None]] otherwise. */ - def asRFSafely: Option[RasterFrame] = Try(asRF).toOption + def asLayerSafely: Option[RasterFrameLayer] = Try(asLayer).toOption /** * Tests for the following conditions on the [[DataFrame]]: @@ -271,9 +271,9 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada * * @return true if all constraints are fulfilled, false otherwise. */ - def isRF: Boolean = Try(asRF).isSuccess + def isLayer: Boolean = Try(asLayer).isSuccess - /** Internal method for slapping the RasterFreame seal of approval on a DataFrame. + /** Internal method for slapping the RasterFreameLayer seal of approval on a DataFrame. * Only call if if you are sure it has a spatial key and tile columns and TileLayerMetadata. */ private[rasterframes] def certify = certifyRasterframe(self) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala index 95f24507d..563e03e87 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/Implicits.scala @@ -21,7 +21,7 @@ package org.locationtech.rasterframes.extensions -import org.locationtech.rasterframes.RasterFrame +import org.locationtech.rasterframes.RasterFrameLayer import org.locationtech.rasterframes.util.{WithMergeMethods, WithPrototypeMethods} import geotrellis.raster._ import geotrellis.raster.io.geotiff.SinglebandGeoTiff @@ -56,7 +56,7 @@ trait Implicits { implicit class WithDataFrameMethods[D <: DataFrame](val self: D) extends DataFrameMethods[D] - implicit class WithRasterFrameMethods(val self: RasterFrame) extends RasterFrameMethods + implicit class WithRasterFrameLayerMethods(val self: RasterFrameLayer) extends RasterFrameLayerMethods implicit class WithSpatialContextRDDMethods[T <: CellGrid]( val self: RDD[(SpatialKey, T)] with Metadata[TileLayerMetadata[SpatialKey]] diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala index 917f329d4..81f5054f9 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ProjectedRasterMethods.scala @@ -23,20 +23,19 @@ package org.locationtech.rasterframes.extensions import java.time.ZonedDateTime -import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.{RasterFrame, StandardColumns} import geotrellis.raster.{CellGrid, ProjectedRaster} import geotrellis.spark._ import geotrellis.spark.tiling._ import geotrellis.util.MethodExtensions import org.apache.spark.rdd.RDD import org.apache.spark.sql.SparkSession -import org.locationtech.rasterframes.{PairRDDConverter, StandardColumns} +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.{PairRDDConverter, RasterFrameLayer, StandardColumns} import scala.reflect.runtime.universe._ /** - * Extension methods on [[ProjectedRaster]] for creating [[RasterFrame]]s. + * Extension methods on [[ProjectedRaster]] for creating [[RasterFrameLayer]]s. * * @since 8/10/17 */ @@ -46,64 +45,64 @@ abstract class ProjectedRasterMethods[T <: CellGrid: WithMergeMethods: WithProto type XTileLayerRDD[K] = RDD[(K, T)] with Metadata[TileLayerMetadata[K]] /** - * Convert the wrapped [[ProjectedRaster]] into a [[RasterFrame]] with a + * Convert the wrapped [[ProjectedRaster]] into a [[RasterFrameLayer]] with a * single row. * - * @param spark [[SparkSession]] in which to create [[RasterFrame]] + * @param spark [[SparkSession]] in which to create [[RasterFrameLayer]] */ - def toRF(implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrame = - toRF(TILE_COLUMN.columnName) + def toLayer(implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrameLayer = + toLayer(TILE_COLUMN.columnName) /** - * Convert the wrapped [[ProjectedRaster]] into a [[RasterFrame]] with a + * Convert the wrapped [[ProjectedRaster]] into a [[RasterFrameLayer]] with a * single row. * - * @param spark [[SparkSession]] in which to create [[RasterFrame]] + * @param spark [[SparkSession]] in which to create [[RasterFrameLayer]] */ - def toRF(tileColName: String) - (implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrame = { + def toLayer(tileColName: String) + (implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrameLayer = { val (cols, rows) = self.raster.dimensions - toRF(cols, rows, tileColName) + toLayer(cols, rows, tileColName) } /** - * Convert the [[ProjectedRaster]] into a [[RasterFrame]] using the + * Convert the [[ProjectedRaster]] into a [[RasterFrameLayer]] using the * given dimensions as the target per-row tile size. * * @param tileCols Max number of horizontal cells per tile * @param tileRows Max number of vertical cells per tile - * @param spark [[SparkSession]] in which to create [[RasterFrame]] + * @param spark [[SparkSession]] in which to create [[RasterFrameLayer]] */ - def toRF(tileCols: Int, tileRows: Int) - (implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrame = - toRF(tileCols, tileRows, TILE_COLUMN.columnName) + def toLayer(tileCols: Int, tileRows: Int) + (implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrameLayer = + toLayer(tileCols, tileRows, TILE_COLUMN.columnName) /** - * Convert the [[ProjectedRaster]] into a [[RasterFrame]] using the + * Convert the [[ProjectedRaster]] into a [[RasterFrameLayer]] using the * given dimensions as the target per-row tile size. * * @param tileCols Max number of horizontal cells per tile * @param tileRows Max number of vertical cells per tile * @param tileColName Name to give the created tile column - * @param spark [[SparkSession]] in which to create [[RasterFrame]] + * @param spark [[SparkSession]] in which to create [[RasterFrameLayer]] */ - def toRF(tileCols: Int, tileRows: Int, tileColName: String) - (implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrame = { - toTileLayerRDD(tileCols, tileRows).toRF(tileColName) + def toLayer(tileCols: Int, tileRows: Int, tileColName: String) + (implicit spark: SparkSession, schema: PairRDDConverter[SpatialKey, T]): RasterFrameLayer = { + toTileLayerRDD(tileCols, tileRows).toLayer(tileColName) } /** - * Convert the [[ProjectedRaster]] into a [[RasterFrame]] using the + * Convert the [[ProjectedRaster]] into a [[RasterFrameLayer]] using the * given dimensions as the target per-row tile size and singular timestamp as the temporal component. * * @param tileCols Max number of horizontal cells per tile * @param tileRows Max number of vertical cells per tile. * @param timestamp Temporal key value to assign to tiles. - * @param spark [[SparkSession]] in which to create [[RasterFrame]] + * @param spark [[SparkSession]] in which to create [[RasterFrameLayer]] */ - def toRF(tileCols: Int, tileRows: Int, timestamp: ZonedDateTime) - (implicit spark: SparkSession, schema: PairRDDConverter[SpaceTimeKey, T]): RasterFrame = - toTileLayerRDD(tileCols, tileRows, timestamp).toRF + def toLayer(tileCols: Int, tileRows: Int, timestamp: ZonedDateTime) + (implicit spark: SparkSession, schema: PairRDDConverter[SpaceTimeKey, T]): RasterFrameLayer = + toTileLayerRDD(tileCols, tileRows, timestamp).toLayer /** * Convert the [[ProjectedRaster]] into a [[TileLayerRDD[SpatialKey]] using the diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala index c7c46920b..4eade42ad 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RFSpatialColumnMethods.scala @@ -22,7 +22,7 @@ package org.locationtech.rasterframes.extensions import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.RasterFrame +import org.locationtech.rasterframes.RasterFrameLayer import org.locationtech.jts.geom.Point import geotrellis.proj4.LatLng import geotrellis.spark.SpatialKey @@ -36,12 +36,12 @@ import org.locationtech.geomesa.curve.Z2SFC import org.locationtech.rasterframes.StandardColumns /** - * RasterFrame extension methods associated with adding spatially descriptive columns. + * RasterFrameLayer extension methods associated with adding spatially descriptive columns. * * @since 12/15/17 */ -trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with StandardColumns { - import Implicits.{WithDataFrameMethods, WithRasterFrameMethods} +trait RFSpatialColumnMethods extends MethodExtensions[RasterFrameLayer] with StandardColumns { + import Implicits.{WithDataFrameMethods, WithRasterFrameLayerMethods} import org.locationtech.geomesa.spark.jts._ /** Returns the key-space to map-space coordinate transform. */ @@ -65,9 +65,9 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard * Append a column containing the extent of the row's spatial key. * Coordinates are in native CRS. * @param colName name of column to append. Defaults to "extent" - * @return updated RasterFrame + * @return updated RasterFrameLayer */ - def withExtent(colName: String = EXTENT_COLUMN.columnName): RasterFrame = { + def withExtent(colName: String = EXTENT_COLUMN.columnName): RasterFrameLayer = { val key2Extent = sparkUdf(keyCol2Extent) self.withColumn(colName, key2Extent(self.spatialKeyColumn)).certify } @@ -76,9 +76,9 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard * Append a column containing the bounds of the row's spatial key. * Coordinates are in native CRS. * @param colName name of column to append. Defaults to "geometry" - * @return updated RasterFrame + * @return updated RasterFrameLayer */ - def withGeometry(colName: String = GEOMETRY_COLUMN.columnName): RasterFrame = { + def withGeometry(colName: String = GEOMETRY_COLUMN.columnName): RasterFrameLayer = { val key2Bounds = sparkUdf(keyCol2Extent andThen (_.jtsGeom)) self.withColumn(colName, key2Bounds(self.spatialKeyColumn)).certify } @@ -87,9 +87,9 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard * Append a column containing the center of the row's spatial key. * Coordinate is in native CRS. * @param colName name of column to append. Defaults to "center" - * @return updated RasterFrame + * @return updated RasterFrameLayer */ - def withCenter(colName: String = CENTER_COLUMN.columnName): RasterFrame = { + def withCenter(colName: String = CENTER_COLUMN.columnName): RasterFrameLayer = { val key2Center = sparkUdf(keyCol2Extent andThen (_.center.jtsGeom)) self.withColumn(colName, key2Center(self.spatialKeyColumn).as[Point]).certify } @@ -98,9 +98,9 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard * Append a column containing the center of the row's spatial key. * Coordinate is in (longitude, latitude) (EPSG:4326). * @param colName name of column to append. Defaults to "center" - * @return updated RasterFrame + * @return updated RasterFrameLayer */ - def withCenterLatLng(colName: String = "center"): RasterFrame = { + def withCenterLatLng(colName: String = "center"): RasterFrameLayer = { val key2Center = sparkUdf(keyCol2LatLng) self.withColumn(colName, key2Center(self.spatialKeyColumn).cast(RFSpatialColumnMethods.LngLatStructType)).certify } @@ -109,9 +109,9 @@ trait RFSpatialColumnMethods extends MethodExtensions[RasterFrame] with Standard * Appends a spatial index column * @param colName name of new column to create. Defaults to `index` * @param applyOrdering if true, adds `.orderBy(asc(colName))` to result. Defaults to `true` - * @return RasterFrame with index column. + * @return RasterFrameLayer with index column. */ - def withSpatialIndex(colName: String = SPATIAL_INDEX_COLUMN.columnName, applyOrdering: Boolean = true): RasterFrame = { + def withSpatialIndex(colName: String = SPATIAL_INDEX_COLUMN.columnName, applyOrdering: Boolean = true): RasterFrameLayer = { val zindex = sparkUdf(keyCol2LatLng andThen (p ⇒ Z2SFC.index(p._1, p._2).z)) self.withColumn(colName, zindex(self.spatialKeyColumn)) match { case rf if applyOrdering ⇒ rf.orderBy(asc(colName)).certify diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameLayerMethods.scala similarity index 90% rename from core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala rename to core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameLayerMethods.scala index fd4b4f11d..28f2839ed 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterFrameLayerMethods.scala @@ -24,7 +24,7 @@ package org.locationtech.rasterframes.extensions import java.time.ZonedDateTime import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.RasterFrame +import org.locationtech.rasterframes.RasterFrameLayer import geotrellis.proj4.CRS import geotrellis.raster.resample.{NearestNeighbor, ResampleMethod} import geotrellis.raster.{MultibandTile, ProjectedRaster, Tile, TileLayout} @@ -47,17 +47,18 @@ import org.locationtech.rasterframes.tiles.ShowableTile import scala.reflect.runtime.universe._ /** - * Extension methods on [[RasterFrame]] type. - * @since 7/18/17 + * Extension methods on [[RasterFrameLayer]] type. + * + * @since 7/18/17 */ -trait RasterFrameMethods extends MethodExtensions[RasterFrame] +trait RasterFrameLayerMethods extends MethodExtensions[RasterFrameLayer] with RFSpatialColumnMethods with MetadataKeys with LazyLogging { - import Implicits.{WithDataFrameMethods, WithRasterFrameMethods} + import Implicits.{WithDataFrameMethods, WithRasterFrameLayerMethods} /** - * A convenience over `DataFrame.withColumnRenamed` whereby the `RasterFrame` type is maintained. + * A convenience over `DataFrame.withColumnRenamed` whereby the `RasterFrameLayer` type is maintained. */ - def withRFColumnRenamed(existingName: String, newName: String): RasterFrame = + def withRFColumnRenamed(existingName: String, newName: String): RasterFrameLayer = (self: DataFrame).withColumnRenamed(existingName, newName).certify /** Get the spatial column. */ @@ -75,7 +76,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] def tileLayerMetadata: Either[TileLayerMetadata[SpatialKey], TileLayerMetadata[SpaceTimeKey]] = { val spatialMD = self.findSpatialKeyField .map(_.metadata) - .getOrElse(throw new IllegalArgumentException(s"RasterFrame operation requsted on non-RasterFrame: $self")) + .getOrElse(throw new IllegalArgumentException(s"RasterFrameLayer operation requsted on non-RasterFrameLayer: $self")) if (self.findTemporalKeyField.nonEmpty) Right(extract[TileLayerMetadata[SpaceTimeKey]](CONTEXT_METADATA_KEY)(spatialMD)) @@ -83,12 +84,12 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] Left(extract[TileLayerMetadata[SpatialKey]](CONTEXT_METADATA_KEY)(spatialMD)) } - /** Get the CRS covering the RasterFrame. */ + /** Get the CRS covering the RasterFrameLayer. */ def crs: CRS = tileLayerMetadata.fold(_.crs, _.crs) - /** Add a temporal key to the RasterFrame, assigning the same temporal key to all rows. */ - def addTemporalComponent(value: TemporalKey): RasterFrame = { - require(self.temporalKeyColumn.isEmpty, "RasterFrame already has a temporal component") + /** Add a temporal key to the RasterFrameLayer, assigning the same temporal key to all rows. */ + def addTemporalComponent(value: TemporalKey): RasterFrameLayer = { + require(self.temporalKeyColumn.isEmpty, "RasterFrameLayer already has a temporal component") val tlm = tileLayerMetadata.left.get val newBounds: Bounds[SpaceTimeKey] = tlm.bounds.flatMap[SpaceTimeKey] { @@ -110,14 +111,14 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] } /** Create a temporal key from the given time and assign it as thea temporal key for all rows. */ - def addTemporalComponent(value: ZonedDateTime): RasterFrame = addTemporalComponent(TemporalKey(value)) + def addTemporalComponent(value: ZonedDateTime): RasterFrameLayer = addTemporalComponent(TemporalKey(value)) /** * Append a column containing the temporal key rendered as a TimeStamp. * @param colName name of column to add - * @return updated RasterFrame + * @return updated RasterFrameLayer */ - def withTimestamp(colName: String = TIMESTAMP_COLUMN.columnName): RasterFrame = { + def withTimestamp(colName: String = TIMESTAMP_COLUMN.columnName): RasterFrameLayer = { self.withColumn(colName, (TEMPORAL_KEY_COLUMN.getField("instant").as[Long] / 1000).cast(TimestampType)) .certify } @@ -133,7 +134,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] * @param joinType One of: `inner`, `outer`, `left_outer`, `right_outer`, `leftsemi`. */ @Experimental - def spatialJoin(right: RasterFrame, joinType: String = "inner"): RasterFrame = { + def spatialJoin(right: RasterFrameLayer, joinType: String = "inner"): RasterFrameLayer = { val left = self val leftMetadata = left.tileLayerMetadata.merge @@ -146,7 +147,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] ) } - def updateNames(rf: RasterFrame, + def updateNames(rf: RasterFrameLayer, prefix: String, sk: TypedColumn[Any, SpatialKey], tk: Option[TypedColumn[Any, TemporalKey]]) = { @@ -188,7 +189,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] /** * Performs a full RDD scans of the key column for the data extent, and updates the [[TileLayerMetadata]] data extent to match. */ - def clipLayerExtent: RasterFrame = { + def clipLayerExtent: RasterFrameLayer = { val metadata = tileLayerMetadata val extent = metadata.merge.extent val layout = metadata.merge.layout @@ -222,7 +223,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] } /** - * Convert a single tile column from RasterFrame to a GeoTrellis [[TileLayerRDD]] + * Convert a single tile column from RasterFrameLayer to a GeoTrellis [[TileLayerRDD]] * @param tileCol column with tiles to be the */ def toTileLayerRDD(tileCol: Column): Either[TileLayerRDD[SpatialKey], TileLayerRDD[SpaceTimeKey]] = @@ -287,7 +288,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] private[rasterframes] def extract[M: JsonFormat](metadataKey: String)(md: Metadata) = md.getMetadata(metadataKey).json.parseJson.convertTo[M] - /** Convert the tiles in the RasterFrame into a single raster. For RasterFrames keyed with temporal keys, they + /** Convert the tiles in the RasterFrameLayer into a single raster. For RasterFrames keyed with temporal keys, they * will be merge undeterministically. */ def toRaster(tileCol: Column, rasterCols: Int, @@ -322,7 +323,7 @@ trait RasterFrameMethods extends MethodExtensions[RasterFrame] ProjectedRaster(croppedTile.tile, md.extent, md.crs) } - /** Convert the Red, Green & Blue assigned tiles in the RasterFrame into a single color composite raster. + /** Convert the Red, Green & Blue assigned tiles in the RasterFrameLayer into a single color composite raster. * For RasterFrames keyed with temporal keys, they will be merged underterministically. */ def toMultibandRaster( tileCols: Seq[Column], diff --git a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala index 4224ef622..a58f851a0 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala @@ -56,7 +56,7 @@ package object rasterframes extends StandardColumns final val NOMINAL_TILE_DIMS: TileDimensions = TileDimensions(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE) /** - * Initialization injection point. Must be called before any RasterFrame + * Initialization injection point. Must be called before any RasterFrameLayer * types are used. */ def initRF(sqlContext: SQLContext): Unit = { @@ -92,14 +92,14 @@ package object rasterframes extends StandardColumns def RasterSourceType = new RasterSourceUDT() /** - * A RasterFrame is just a DataFrame with certain invariants, enforced via the methods that create and transform them: + * A RasterFrameLayer is just a DataFrame with certain invariants, enforced via the methods that create and transform them: * 1. One column is a [[geotrellis.spark.SpatialKey]] or [[geotrellis.spark.SpaceTimeKey]] * 2. One or more columns is a [[Tile]] UDT. * 3. The `TileLayerMetadata` is encoded and attached to the key column. */ - type RasterFrame = DataFrame @@ RasterFrameTag + type RasterFrameLayer = DataFrame @@ RasterFrameTag - /** Tagged type for allowing compiler to help keep track of what has RasterFrame assurances applied to it. */ + /** Tagged type for allowing compiler to help keep track of what has RasterFrameLayer assurances applied to it. */ trait RasterFrameTag type TileFeatureLayerRDD[K, D] = diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala index 2d0c8c780..e33529b02 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/debug/package.scala @@ -33,14 +33,14 @@ import spray.json.JsValue * @since 4/6/18 */ package object debug { - implicit class RasterFrameWithDebug(val self: RasterFrame) { + implicit class RasterFrameWithDebug(val self: RasterFrameLayer) { /** Renders the whole schema with metadata as a JSON string. */ def describeFullSchema: String = { self.schema.prettyJson } - /** Renders all the extents in this RasterFrame as GeoJSON in EPSG:4326. This does a full + /** Renders all the extents in this RasterFrameLayer as GeoJSON in EPSG:4326. This does a full * table scan and collects **all** the geometry into the driver, and then converts it into a * Spray JSON data structure. Not performant, and for debugging only. */ def geoJsonExtents: JsValue = { diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala index 7f54ce540..99bf80d96 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/package.scala @@ -77,8 +77,8 @@ package object util { type KeyMethodsProvider[K1, K2] = K1 ⇒ TilerKeyMethods[K1, K2] - /** Internal method for slapping the RasterFrame seal of approval on a DataFrame. */ - private[rasterframes] def certifyRasterframe(df: DataFrame): RasterFrame = + /** Internal method for slapping the RasterFrameLayer seal of approval on a DataFrame. */ + private[rasterframes] def certifyRasterframe(df: DataFrame): RasterFrameLayer = shapeless.tag[RasterFrameTag][DataFrame](df) diff --git a/core/src/test/scala/examples/Classification.scala b/core/src/test/scala/examples/Classification.scala index ae87aa6cf..6f234e45c 100644 --- a/core/src/test/scala/examples/Classification.scala +++ b/core/src/test/scala/examples/Classification.scala @@ -46,7 +46,7 @@ object Classification extends App { import spark.implicits._ // The first step is to load multiple bands of imagery and construct - // a single RasterFrame from them. + // a single RasterFrameLayer from them. val filenamePattern = "L8-%s-Elkton-VA.tiff" val bandNumbers = 2 to 7 val bandColNames = bandNumbers.map(b ⇒ s"band_$b").toArray @@ -56,7 +56,7 @@ object Classification extends App { val joinedRF = bandNumbers .map { b ⇒ (b, filenamePattern.format("B" + b)) } .map { case (b, f) ⇒ (b, readTiff(f)) } - .map { case (b, t) ⇒ t.projectedRaster.toRF(tileSize, tileSize, s"band_$b") } + .map { case (b, t) ⇒ t.projectedRaster.toLayer(tileSize, tileSize, s"band_$b") } .reduce(_ spatialJoin _) // We should see a single spatial_key column along with 4 columns of tiles. @@ -70,7 +70,7 @@ object Classification extends App { val target = readTiff(filenamePattern.format("Labels")) .mapTile(_.convert(DoubleConstantNoDataCellType)) .projectedRaster - .toRF(tileSize, tileSize, targetCol) + .toLayer(tileSize, tileSize, targetCol) // Take a peek at what kind of label data we have to work with. target.select(rf_agg_stats(target(targetCol))).show @@ -147,7 +147,7 @@ object Classification extends App { ) ) - val rf = retiled.asRF($"spatial_key", tlm) + val rf = retiled.asLayer($"spatial_key", tlm) val raster = rf.toRaster($"prediction", 186, 169) diff --git a/core/src/test/scala/examples/Clustering.scala b/core/src/test/scala/examples/Clustering.scala index c5e08ca1b..66e7e58b1 100644 --- a/core/src/test/scala/examples/Clustering.scala +++ b/core/src/test/scala/examples/Clustering.scala @@ -39,7 +39,7 @@ object Clustering extends App { import spark.implicits._ // The first step is to load multiple bands of imagery and construct - // a single RasterFrame from them. + // a single RasterFrameLayer from them. val filenamePattern = "L8-B%d-Elkton-VA.tiff" val bandNumbers = 1 to 7 val bandColNames = bandNumbers.map(b ⇒ s"band_$b").toArray @@ -48,7 +48,7 @@ object Clustering extends App { val joinedRF = bandNumbers .map { b ⇒ (b, filenamePattern.format(b)) } .map { case (b,f) ⇒ (b, readTiff(f)) } - .map { case (b, t) ⇒ t.projectedRaster.toRF(s"band_$b") } + .map { case (b, t) ⇒ t.projectedRaster.toLayer(s"band_$b") } .reduce(_ spatialJoin _) // We should see a single spatial_key column along with 4 columns of tiles. @@ -94,7 +94,7 @@ object Clustering extends App { tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) ) - val rf = retiled.asRF($"spatial_key", tlm) + val rf = retiled.asLayer($"spatial_key", tlm) val raster = rf.toRaster($"prediction", 186, 169) diff --git a/core/src/test/scala/examples/CreatingRasterFrames.scala b/core/src/test/scala/examples/CreatingRasterFrames.scala index a1e7e0536..8b5c00c72 100644 --- a/core/src/test/scala/examples/CreatingRasterFrames.scala +++ b/core/src/test/scala/examples/CreatingRasterFrames.scala @@ -27,7 +27,7 @@ package examples object CreatingRasterFrames extends App { // # Creating RasterFrames // -// There are a number of ways to create a `RasterFrame`, as enumerated in the sections below. +// There are a number of ways to create a `RasterFrameLayer`, as enumerated in the sections below. // // ## Initialization // @@ -49,21 +49,21 @@ object CreatingRasterFrames extends App { // ## From `ProjectedExtent` // -// The simplest mechanism for getting a RasterFrame is to use the `toRF(tileCols, tileRows)` extension method on `ProjectedRaster`. +// The simplest mechanism for getting a RasterFrameLayer is to use the `toLayer(tileCols, tileRows)` extension method on `ProjectedRaster`. val scene = SinglebandGeoTiff("src/test/resources/L8-B8-Robinson-IL.tiff") - val rf = scene.projectedRaster.toRF(128, 128) + val rf = scene.projectedRaster.toLayer(128, 128) rf.show(5, false) // ## From `TileLayerRDD` // -// Another option is to use a GeoTrellis [`LayerReader`](https://docs.geotrellis.io/en/latest/guide/tile-backends.html), to get a `TileLayerRDD` for which there's also a `toRF` extension method. +// Another option is to use a GeoTrellis [`LayerReader`](https://docs.geotrellis.io/en/latest/guide/tile-backends.html), to get a `TileLayerRDD` for which there's also a `toLayer` extension method. // ## Inspecting Structure // -// `RasterFrame` has a number of methods providing access to metadata about the contents of the RasterFrame. +// `RasterFrameLayer` has a number of methods providing access to metadata about the contents of the RasterFrameLayer. // // ### Tile Column Names diff --git a/core/src/test/scala/examples/Exporting.scala b/core/src/test/scala/examples/Exporting.scala index 71ebb7faf..25fa321c1 100644 --- a/core/src/test/scala/examples/Exporting.scala +++ b/core/src/test/scala/examples/Exporting.scala @@ -38,7 +38,7 @@ object Exporting extends App { import spark.implicits._ val scene = SinglebandGeoTiff("src/test/resources/L8-B8-Robinson-IL.tiff") - val rf = scene.projectedRaster.toRF(128, 128).cache() + val rf = scene.projectedRaster.toLayer(128, 128).cache() // While the goal of RasterFrames is to make it as easy as possible to do your geospatial analysis with a single // construct, it is helpful to be able to transform it into other representations for various use cases. @@ -73,9 +73,9 @@ object Exporting extends App { // the imagery types. // // - // Let's assume we have a RasterFrame we've done some fancy processing on: + // Let's assume we have a RasterFrameLayer we've done some fancy processing on: val equalizer = udf((t: Tile) => t.equalize()) - val equalized = rf.withColumn("equalized", equalizer($"tile")).asRF + val equalized = rf.withColumn("equalized", equalizer($"tile")).asLayer equalized.printSchema equalized.select(rf_agg_stats($"tile")).show(false) @@ -103,7 +103,7 @@ object Exporting extends App { // ## Converting to `RDD` and `TileLayerRDD` // - // Since a `RasterFrame` is just a `DataFrame` with extra metadata, the method + // Since a `RasterFrameLayer` is just a `DataFrame` with extra metadata, the method // @scaladoc[`DataFrame.rdd`][rdd] is available for simple conversion back to `RDD` space. The type returned // by `.rdd` is dependent upon how you select it. @@ -118,14 +118,14 @@ object Exporting extends App { showType(rf.select(rf.spatialKeyColumn, $"tile").as[(SpatialKey, Tile)].rdd) // If your goal convert a single tile column with its spatial key back to a `TileLayerRDD[K]`, then there's an additional - // extension method on `RasterFrame` called [`toTileLayerRDD`][toTileLayerRDD], which preserves the tile layer metadata, + // extension method on `RasterFrameLayer` called [`toTileLayerRDD`][toTileLayerRDD], which preserves the tile layer metadata, // enhancing interoperation with GeoTrellis RDD extension methods. showType(rf.toTileLayerRDD($"tile".as[Tile])) // ## Exporting a Raster // - // For the purposes of debugging, the RasterFrame tiles can be reassembled back into a raster for viewing. However, + // For the purposes of debugging, the RasterFrameLayer tiles can be reassembled back into a raster for viewing. However, // keep in mind that this will download all the data to the driver, and reassemble it in-memory. So it's not appropriate // for very large coverages. // @@ -147,7 +147,7 @@ object Exporting extends App { // [*Download GeoTIFF*](rf-raster.tiff) // # Exporting to a GeoTrellis Layer - // First, convert the RasterFrame into a TileLayerRDD. The return type is an Either; + // First, convert the RasterFrameLayer into a TileLayerRDD. The return type is an Either; // the `left` side is for spatial-only keyed data val tlRDD = equalized.toTileLayerRDD($"equalized").left.get diff --git a/core/src/test/scala/examples/LocalArithmetic.scala b/core/src/test/scala/examples/LocalArithmetic.scala index 26c9bf6d4..428fcc64a 100644 --- a/core/src/test/scala/examples/LocalArithmetic.scala +++ b/core/src/test/scala/examples/LocalArithmetic.scala @@ -49,11 +49,11 @@ object LocalArithmetic extends App { val joinedRF = bandNumbers. map { b ⇒ (b, filenamePattern.format(b)) }. map { case (b, f) ⇒ (b, readTiff(f)) }. - map { case (b, t) ⇒ t.projectedRaster.toRF(s"band_$b") }. + map { case (b, t) ⇒ t.projectedRaster.toLayer(s"band_$b") }. reduce(_ spatialJoin _) - val addRF = joinedRF.withColumn("1+2", rf_local_add(joinedRF("band_1"), joinedRF("band_2"))).asRF - val divideRF = joinedRF.withColumn("1/2", rf_local_divide(joinedRF("band_1"), joinedRF("band_2"))).asRF + val addRF = joinedRF.withColumn("1+2", rf_local_add(joinedRF("band_1"), joinedRF("band_2"))).asLayer + val divideRF = joinedRF.withColumn("1/2", rf_local_divide(joinedRF("band_1"), joinedRF("band_2"))).asLayer addRF.select("1+2").collect().apply(0) .getClass diff --git a/core/src/test/scala/examples/Masking.scala b/core/src/test/scala/examples/Masking.scala index 4470e8871..6270bcef1 100644 --- a/core/src/test/scala/examples/Masking.scala +++ b/core/src/test/scala/examples/Masking.scala @@ -24,18 +24,18 @@ object Masking extends App { val joinedRF = bandNumbers. map { b ⇒ (b, filenamePattern.format(b)) }. map { case (b, f) ⇒ (b, readTiff(f)) }. - map { case (b, t) ⇒ t.projectedRaster.toRF(s"band_$b") }. + map { case (b, t) ⇒ t.projectedRaster.toLayer(s"band_$b") }. reduce(_ spatialJoin _) val threshold = udf((t: Tile) => { t.convert(IntConstantNoDataCellType).map(x => if (x > 10500) x else NODATA) } ) - val withMaskedTile = joinedRF.withColumn("maskTile", threshold(joinedRF("band_1"))).asRF + val withMaskedTile = joinedRF.withColumn("maskTile", threshold(joinedRF("band_1"))).asLayer withMaskedTile.select(rf_no_data_cells(withMaskedTile("maskTile"))).show() - val masked = withMaskedTile.withColumn("masked", rf_mask(joinedRF("band_2"), joinedRF("maskTile"))).asRF + val masked = withMaskedTile.withColumn("masked", rf_mask(joinedRF("band_2"), joinedRF("maskTile"))).asLayer val maskRF = masked.toRaster(masked("masked"), 466, 428) val b2 = masked.toRaster(masked("band_2"), 466, 428) diff --git a/core/src/test/scala/examples/MeanValue.scala b/core/src/test/scala/examples/MeanValue.scala index 5a2571404..2ee264469 100644 --- a/core/src/test/scala/examples/MeanValue.scala +++ b/core/src/test/scala/examples/MeanValue.scala @@ -39,7 +39,7 @@ object MeanValue extends App { val scene = SinglebandGeoTiff("src/test/resources/L8-B8-Robinson-IL.tiff") - val rf = scene.projectedRaster.toRF(128, 128) // <-- tile size + val rf = scene.projectedRaster.toLayer(128, 128) // <-- tile size rf.printSchema diff --git a/core/src/test/scala/examples/NDVI.scala b/core/src/test/scala/examples/NDVI.scala index 0173c7807..48a6f6e51 100644 --- a/core/src/test/scala/examples/NDVI.scala +++ b/core/src/test/scala/examples/NDVI.scala @@ -46,8 +46,8 @@ object NDVI extends App { import spark.implicits._ - def redBand = readTiff("L8-B4-Elkton-VA.tiff").projectedRaster.toRF("red_band") - def nirBand = readTiff("L8-B5-Elkton-VA.tiff").projectedRaster.toRF("nir_band") + def redBand = readTiff("L8-B4-Elkton-VA.tiff").projectedRaster.toLayer("red_band") + def nirBand = readTiff("L8-B5-Elkton-VA.tiff").projectedRaster.toLayer("nir_band") val ndvi = udf((red: Tile, nir: Tile) => { val redd = red.convert(DoubleConstantNoDataCellType) @@ -55,7 +55,7 @@ object NDVI extends App { (nird - redd) / (nird + redd) }) - val rf = redBand.spatialJoin(nirBand).withColumn("ndvi", ndvi($"red_band", $"nir_band")).asRF + val rf = redBand.spatialJoin(nirBand).withColumn("ndvi", ndvi($"red_band", $"nir_band")).asLayer rf.printSchema() diff --git a/core/src/test/scala/examples/Tour.scala b/core/src/test/scala/examples/Tour.scala index 8dac067b8..0c2896949 100644 --- a/core/src/test/scala/examples/Tour.scala +++ b/core/src/test/scala/examples/Tour.scala @@ -48,7 +48,7 @@ object Tour extends App { val scene = SinglebandGeoTiff("src/test/resources/L8-B8-Robinson-IL.tiff") // Convert it to a raster frame, discretizing it into the given tile size. - val rf = scene.projectedRaster.toRF(64, 64) + val rf = scene.projectedRaster.toLayer(64, 64) // See how many tiles we have after discretization println("Tile count: " + rf.count()) @@ -72,7 +72,7 @@ object Tour extends App { val contrast = udf((t: Tile) ⇒ t.sigmoidal(0.2, 10)) // Let's contrast adjust the tile column - val withAdjusted = rf.withColumn("adjusted", contrast($"tile")).asRF + val withAdjusted = rf.withColumn("adjusted", contrast($"tile")).asLayer // Show the stats for the adjusted version withAdjusted.select(rf_agg_stats($"adjusted")).show(false) @@ -82,7 +82,7 @@ object Tour extends App { GeoTiff(raster).write("contrast-adjusted.tiff") // Perform some arbitrary local ops between columns and render - val withOp = withAdjusted.withColumn("op", rf_local_subtract($"tile", $"adjusted")).asRF + val withOp = withAdjusted.withColumn("op", rf_local_subtract($"tile", $"adjusted")).asLayer val raster2 = withOp.toRaster($"op", 774, 500) GeoTiff(raster2).write("with-op.tiff") @@ -91,7 +91,7 @@ object Tour extends App { val k = 4 // SparkML doesn't like NoData/NaN values, so we set the no-data value to something less offensive - val forML = rf.select(rf.spatialKeyColumn, rf_with_no_data($"tile", 99999) as "tile").asRF + val forML = rf.select(rf.spatialKeyColumn, rf_with_no_data($"tile", 99999) as "tile").asLayer // First we instantiate the transformer that converts tile rows into cell rows. val exploder = new TileExploder() @@ -126,7 +126,7 @@ object Tour extends App { rf_assemble_tile($"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) ) - val clusteredRF = retiled.asRF($"spatial_key", tlm) + val clusteredRF = retiled.asLayer($"spatial_key", tlm) val raster3 = clusteredRF.toRaster($"prediction", 774, 500) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala index 021b528d1..da0af2397 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExplodeSpec.scala @@ -184,7 +184,7 @@ class ExplodeSpec extends TestEnvironment with TestData { it("should reassemble multiple exploded tiles") { val image = sampleSmallGeoTiff - val tinyTiles = image.projectedRaster.toRF(10, 10) + val tinyTiles = image.projectedRaster.toLayer(10, 10) val exploded = tinyTiles.select(tinyTiles.spatialKeyColumn, rf_explode_tiles(tinyTiles.tileColumns.head)) @@ -199,7 +199,7 @@ class ExplodeSpec extends TestEnvironment with TestData { val tlm = tinyTiles.tileLayerMetadata.left.get - val rf = assembled.asRF(SPATIAL_KEY_COLUMN, tlm) + val rf = assembled.asLayer(SPATIAL_KEY_COLUMN, tlm) val (cols, rows) = image.tile.dimensions diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index dd497d0fa..3b30a38ae 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -34,19 +34,19 @@ import org.locationtech.rasterframes.util.SubdivideSupport */ //noinspection ScalaUnusedSymbol class ExtensionMethodSpec extends TestEnvironment with TestData with SubdivideSupport { - lazy val rf = sampleTileLayerRDD.toRF + lazy val rf = sampleTileLayerRDD.toLayer describe("DataFrame exention methods") { it("should maintain original type") { val df = rf.withPrefixedColumnNames("_foo_") - "val rf2: RasterFrame = df" should compile + "val rf2: RasterFrameLayer = df" should compile } it("should provide tagged column access") { val df = rf.drop("tile") "val Some(col) = df.spatialKeyColumn" should compile } } - describe("RasterFrame exention methods") { + describe("RasterFrameLayer exention methods") { it("should provide spatial key column") { noException should be thrownBy { rf.spatialKeyColumn diff --git a/core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala index 5a7c0b813..54321d0dc 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/GeometryFunctionsSpec.scala @@ -35,7 +35,7 @@ class GeometryFunctionsSpec extends TestEnvironment with TestData with StandardC import spark.implicits._ describe("Vector geometry operations") { - val rf = l8Sample(1).projectedRaster.toRF(10, 10).withGeometry() + val rf = l8Sample(1).projectedRaster.toLayer(10, 10).withGeometry() it("should allow joining and filtering of tiles based on points") { import spark.implicits._ @@ -139,7 +139,7 @@ class GeometryFunctionsSpec extends TestEnvironment with TestData with StandardC } it("should rasterize geometry") { - val rf = l8Sample(1).projectedRaster.toRF.withGeometry() + val rf = l8Sample(1).projectedRaster.toLayer.withGeometry() val df = GeomData.features.map(f ⇒ ( f.geom.reproject(LatLng, rf.crs).jtsGeom, f.data.fields("id").asInstanceOf[JsNumber].value.intValue() diff --git a/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala index 244b9ab3d..0f179937a 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/MetadataSpec.scala @@ -35,7 +35,7 @@ class MetadataSpec extends TestEnvironment with TestData { describe("Metadata storage") { it("should serialize and attach metadata") { - //val rf = sampleGeoTiff.projectedRaster.toRF(128, 128) + //val rf = sampleGeoTiff.projectedRaster.toLayer(128, 128) val df = spark.createDataset(Seq((1, "one"), (2, "two"), (3, "three"))).toDF("num", "str") val withmeta = df.mapColumnAttribute($"num", attr ⇒ { attr.withMetadata(sampleMetadata) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala index f8a3c0ac9..e77a0fecc 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFrameSpec.scala @@ -40,7 +40,7 @@ import org.locationtech.rasterframes.model.TileDimensions import scala.util.control.NonFatal /** - * RasterFrame test rig. + * RasterFrameLayer test rig. * * @since 7/10/17 */ @@ -74,12 +74,12 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } } - describe("RasterFrame") { + describe("RasterFrameLayer") { it("should implicitly convert from spatial layer type") { val tileLayerRDD = TestData.randomSpatialTileLayerRDD(20, 20, 2, 2) - val rf = tileLayerRDD.toRF + val rf = tileLayerRDD.toLayer assert(rf.tileColumns.nonEmpty) assert(rf.spatialKeyColumn.columnName == "spatial_key") @@ -95,7 +95,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys assert(rf.count() === 4) - val cols = tileLayerRDD.toRF("foo").columns + val cols = tileLayerRDD.toLayer("foo").columns assert(!cols.contains("tile")) assert(cols.contains("foo")) } @@ -104,7 +104,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys val tileLayerRDD = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2) - val rf = tileLayerRDD.toRF + val rf = tileLayerRDD.toLayer try { assert(rf.tileColumns.nonEmpty) @@ -116,7 +116,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys println(rf.schema.prettyJson) throw ex } - val cols = tileLayerRDD.toRF("foo").columns + val cols = tileLayerRDD.toLayer("foo").columns assert(!cols.contains("tile")) assert(cols.contains("foo")) } @@ -135,7 +135,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys val tileLayerRDD = TileFeatureLayerRDD(tileRDD, metadata) - val rf = tileLayerRDD.toRF + val rf = tileLayerRDD.toLayer assert(rf.columns.toSet === Set(SPATIAL_KEY_COLUMN, TILE_COLUMN, TILE_FEATURE_DATA_COLUMN).map(_.columnName)) } @@ -154,14 +154,14 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys val tileLayerRDD = TileFeatureLayerRDD(tileRDD, metadata) - val rf = tileLayerRDD.toRF + val rf = tileLayerRDD.toLayer assert(rf.columns.toSet === Set(SPATIAL_KEY_COLUMN, TEMPORAL_KEY_COLUMN, TILE_COLUMN, TILE_FEATURE_DATA_COLUMN).map(_.columnName)) } it("should support adding a timestamp column") { val now = ZonedDateTime.now() - val rf = sampleGeoTiff.projectedRaster.toRF(256, 256) + val rf = sampleGeoTiff.projectedRaster.toLayer(256, 256) val wt = rf.addTemporalComponent(now) val goodie = wt.withTimestamp() assert(goodie.columns.contains("timestamp")) @@ -172,7 +172,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } it("should support spatial joins") { - val rf = sampleGeoTiff.projectedRaster.toRF(256, 256) + val rf = sampleGeoTiff.projectedRaster.toLayer(256, 256) val wt = rf.addTemporalComponent(TemporalKey(34)) @@ -186,11 +186,11 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } it("should have correct schema on inner spatial joins") { - val left = sampleGeoTiff.projectedRaster.toRF(256, 256) + val left = sampleGeoTiff.projectedRaster.toLayer(256, 256) .addTemporalComponent(TemporalKey(34)) val right = left.withColumnRenamed(left.tileColumns.head.columnName, "rightTile") - .asRF + .asLayer val joined = left.spatialJoin(right) // since right is a copy of left, should not drop any rows with inner join @@ -205,19 +205,19 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys assert(joined.tileColumns.toSet !== joined.notTileColumns.toSet) } - it("should convert a GeoTiff to RasterFrame") { + it("should convert a GeoTiff to RasterFrameLayer") { val praster: ProjectedRaster[Tile] = sampleGeoTiff.projectedRaster val (cols, rows) = praster.raster.dimensions val layoutCols = math.ceil(cols / 128.0).toInt val layoutRows = math.ceil(rows / 128.0).toInt - assert(praster.toRF.count() === 1) - assert(praster.toRF(128, 128).count() === (layoutCols * layoutRows)) + assert(praster.toLayer.count() === 1) + assert(praster.toLayer(128, 128).count() === (layoutCols * layoutRows)) } it("should provide TileLayerMetadata[SpatialKey]") { - val rf = sampleGeoTiff.projectedRaster.toRF(256, 256) + val rf = sampleGeoTiff.projectedRaster.toLayer(256, 256) val tlm = rf.tileLayerMetadata.merge val bounds = tlm.bounds.get assert(bounds === KeyBounds(SpatialKey(0, 0), SpatialKey(3, 1))) @@ -225,7 +225,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys it("should provide TileLayerMetadata[SpaceTimeKey]") { val now = ZonedDateTime.now() - val rf = sampleGeoTiff.projectedRaster.toRF(256, 256, now) + val rf = sampleGeoTiff.projectedRaster.toLayer(256, 256, now) val tlm = rf.tileLayerMetadata.merge val bounds = tlm.bounds.get assert(bounds._1 === SpaceTimeKey(0, 0, now)) @@ -235,7 +235,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys // it("should clip TileLayerMetadata extent") { // val tiled = sampleTileLayerRDD // -// val rf = tiled.reproject(LatLng, tiled.metadata.layout)._2.toRF +// val rf = tiled.reproject(LatLng, tiled.metadata.layout)._2.toLayer // // val worldish = Extent(-179, -89, 179, 89) // val areaish = Extent(-90, 30, -81, 40) @@ -262,14 +262,14 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } it("shouldn't clip already clipped extents") { - val rf = TestData.randomSpatialTileLayerRDD(1024, 1024, 8, 8).toRF + val rf = TestData.randomSpatialTileLayerRDD(1024, 1024, 8, 8).toLayer val expected = rf.tileLayerMetadata.merge.extent val computed = rf.clipLayerExtent.tileLayerMetadata.merge.extent basicallySame(expected, computed) val pr = sampleGeoTiff.projectedRaster - val rf2 = pr.toRF(256, 256) + val rf2 = pr.toLayer(256, 256) val expected2 = rf2.tileLayerMetadata.merge.extent val computed2 = rf2.clipLayerExtent.tileLayerMetadata.merge.extent basicallySame(expected2, computed2) @@ -294,7 +294,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } it("should rasterize with a spatiotemporal key") { - val rf = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2).toRF + val rf = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2).toLayer noException shouldBe thrownBy { rf.toRaster($"tile", 128, 128) @@ -302,8 +302,8 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } it("should maintain metadata after all spatial join operations") { - val rf1 = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2).toRF - val rf2 = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2).toRF + val rf1 = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2).toLayer + val rf2 = TestData.randomSpatioTemporalTileLayerRDD(20, 20, 2, 2).toLayer val joinTypes = Seq("inner", "outer", "fullouter", "left_outer", "right_outer", "leftsemi") forEvery(joinTypes) { jt ⇒ @@ -315,9 +315,9 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys it("should rasterize multiband") { withClue("Landsat") { - val blue = TestData.l8Sample(1).projectedRaster.toRF.withRFColumnRenamed("tile", "blue") - val green = TestData.l8Sample(2).projectedRaster.toRF.withRFColumnRenamed("tile", "green") - val red = TestData.l8Sample(3).projectedRaster.toRF.withRFColumnRenamed("tile", "red") + val blue = TestData.l8Sample(1).projectedRaster.toLayer.withRFColumnRenamed("tile", "blue") + val green = TestData.l8Sample(2).projectedRaster.toLayer.withRFColumnRenamed("tile", "green") + val red = TestData.l8Sample(3).projectedRaster.toLayer.withRFColumnRenamed("tile", "red") val joined = blue.spatialJoin(green).spatialJoin(red) @@ -328,9 +328,9 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys } } withClue("NAIP") { - val red = TestData.naipSample(1).projectedRaster.toRF.withRFColumnRenamed("tile", "red") - val green = TestData.naipSample(2).projectedRaster.toRF.withRFColumnRenamed("tile", "green") - val blue = TestData.naipSample(3).projectedRaster.toRF.withRFColumnRenamed("tile", "blue") + val red = TestData.naipSample(1).projectedRaster.toLayer.withRFColumnRenamed("tile", "red") + val green = TestData.naipSample(2).projectedRaster.toLayer.withRFColumnRenamed("tile", "green") + val blue = TestData.naipSample(3).projectedRaster.toLayer.withRFColumnRenamed("tile", "blue") val joined = blue.spatialJoin(green).spatialJoin(red) noException shouldBe thrownBy { @@ -345,7 +345,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys // 774 × 500 val praster: ProjectedRaster[Tile] = sampleGeoTiff.projectedRaster val (cols, rows) = praster.raster.dimensions - val rf = praster.toRF(64, 64) + val rf = praster.toLayer(64, 64) val raster = rf.toRaster($"tile", cols, rows) render(raster.tile, "normal") @@ -366,7 +366,7 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys it("shouldn't restitch raster that's has derived tiles") { val praster: ProjectedRaster[Tile] = sampleGeoTiff.projectedRaster - val rf = praster.toRF(64, 64) + val rf = praster.toLayer(64, 64) val equalizer = udf((t: Tile) => t.equalize()) @@ -374,13 +374,13 @@ class RasterFrameSpec extends TestEnvironment with MetadataKeys intercept[IllegalArgumentException] { // spatial_key is lost - equalized.asRF.toRaster($"equalized", 128, 128) + equalized.asLayer.toRaster($"equalized", 128, 128) } } it("should fetch CRS") { val praster: ProjectedRaster[Tile] = sampleGeoTiff.projectedRaster - val rf = praster.toRF + val rf = praster.toLayer assert(rf.crs === praster.crs) } diff --git a/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala index 773c28877..b99b5c48e 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/SpatialKeySpec.scala @@ -38,7 +38,7 @@ class SpatialKeySpec extends TestEnvironment with TestData { describe("Spatial key conversions") { val raster = sampleGeoTiff.projectedRaster // Create a raster frame with a single row - val rf = raster.toRF(raster.tile.cols, raster.tile.rows) + val rf = raster.toLayer(raster.tile.cols, raster.tile.rows) it("should add an extent column") { val expected = raster.extent.jtsGeom diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index 7e1acda1d..d47fafbc1 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -127,7 +127,7 @@ trait TestData { def rgbCogSample = readMultiband("LC08_RGB_Norfolk_COG.tiff") def sampleTileLayerRDD(implicit spark: SparkSession): TileLayerRDD[SpatialKey] = { - val rf = sampleGeoTiff.projectedRaster.toRF(128, 128) + val rf = sampleGeoTiff.projectedRaster.toLayer(128, 128) rf.toTileLayerRDD(rf.tileColumns.head).left.get } diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala index 0c3478d8f..757231595 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileAssemblerSpec.scala @@ -41,7 +41,7 @@ class TileAssemblerSpec extends TestEnvironment { it("should reassemble a small scene") { val raster = TestData.l8Sample(8).projectedRaster - val rf = raster.toRF(16, 16) + val rf = raster.toLayer(16, 16) val ct = rf.tileLayerMetadata.merge.cellType val (tileCols, tileRows) = rf.tileLayerMetadata.merge.tileLayout.tileDimensions diff --git a/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala index 88d1e754f..3081b2f64 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TileUDTSpec.scala @@ -29,7 +29,7 @@ import org.locationtech.rasterframes.tiles.ShowableTile import org.scalatest.Inspectors /** - * RasterFrame test rig. + * RasterFrameLayer test rig. * * @since 7/10/17 */ diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 4b306df1e..c62d1a7e3 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -64,7 +64,7 @@ class GeoTiffDataSource extends DataSourceRegister require(pathO.get.getScheme == "file" || pathO.get.getScheme == null, "Currently only 'file://' destinations are supported") sqlContext.withRasterFrames - require(data.isRF, "GeoTIFF can only be constructed from a RasterFrame") + require(data.isLayer, "GeoTIFF can only be constructed from a RasterFrameLayer") val rf = data.certify // If no desired image size is given, write at full size. diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala index 2178c7ee6..f89ebc2d6 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala @@ -29,7 +29,7 @@ import shapeless.tag package object geotiff { /** Tagged type construction for enabling type-safe extension methods for loading - * a RasterFrame in expected form. */ + * a RasterFrameLayer in expected form. */ type GeoTiffRasterFrameReader = DataFrameReader @@ GeoTiffRasterFrameReaderTag trait GeoTiffRasterFrameReaderTag @@ -45,9 +45,9 @@ package object geotiff { def geotiff: DataFrameWriter[T] = writer.format(GeoTiffDataSource.SHORT_NAME) } - /** Adds `loadRF` to appropriately tagged `DataFrameReader` */ + /** Adds `loadLayer` to appropriately tagged `DataFrameReader` */ implicit class GeoTiffReaderWithRF(val reader: GeoTiffRasterFrameReader) { @deprecated("Use `raster` instead.", "7/1/2019") - def loadRF(path: URI): RasterFrame = reader.load(path.toASCIIString).asRF + def loadRF(path: URI): RasterFrameLayer = reader.load(path.toASCIIString).asLayer } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala index 8662fdc64..d12ea1e17 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisLayerDataSource.scala @@ -81,8 +81,8 @@ class GeoTrellisLayerDataSource extends DataSourceRegister require(layerName.isDefined, s"'$LAYER_PARAM' parameter for raster layer name required.") require(zoom.isDefined, s"Integer '$ZOOM_PARAM' parameter for raster layer zoom level required.") - val rf = data.asRFSafely - .getOrElse(throw new IllegalArgumentException("Only a valid RasterFrame can be saved as a GeoTrellis layer")) + val rf = data.asLayerSafely + .getOrElse(throw new IllegalArgumentException("Only a valid RasterFrameLayer can be saved as a GeoTrellis layer")) val tileColumn = parameters.get(TILE_COLUMN_PARAM).map(c ⇒ rf(c)) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala index bb4cc4840..c4a7dc425 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotrellis/package.scala @@ -36,11 +36,11 @@ package object geotrellis extends DataSourceOptions { def geotrellis_layer = col("layer").as[Layer] /** Tagged type construction for enabling type-safe extension methods for loading - * a RasterFrame from a GeoTrellis layer. */ + * a RasterFrameLayer from a GeoTrellis layer. */ type GeoTrellisRasterFrameReader = DataFrameReader @@ GeoTrellisRasterFrameReaderTag trait GeoTrellisRasterFrameReaderTag /** Tagged type construction for enabling type-safe extension methods for writing - * a RasterFrame to a GeoTrellis layer. */ + * a RasterFrameLayer to a GeoTrellis layer. */ type GeoTrellisRasterFrameWriter[T] = DataFrameWriter[T] @@ GeoTrellisRasterFrameWriterTag trait GeoTrellisRasterFrameWriterTag @@ -71,7 +71,7 @@ package object geotrellis extends DataSourceOptions { .option("path", layer.base.toASCIIString) } - /** Extension methods for loading a RasterFrame from a tagged `DataFrameReader`. */ + /** Extension methods for loading a RasterFrameLayer from a tagged `DataFrameReader`. */ implicit class GeoTrellisReaderWithRF(val reader: GeoTrellisRasterFrameReader) { def withTileSubdivisions(divs: Int): GeoTrellisRasterFrameReader = tag[GeoTrellisRasterFrameReaderTag][DataFrameReader]( @@ -83,13 +83,13 @@ package object geotrellis extends DataSourceOptions { reader.option(NUM_PARTITIONS_PARAM, partitions.toLong) ) - def loadRF(uri: URI, id: LayerId): RasterFrame = + def loadLayer(uri: URI, id: LayerId): RasterFrameLayer = reader .option(LAYER_PARAM, id.name) .option(ZOOM_PARAM, id.zoom.toString) .load(uri.toASCIIString) - .asRF + .asLayer - def loadRF(layer: Layer): RasterFrame = loadRF(layer.base, layer.id) + def loadLayer(layer: Layer): RasterFrameLayer = loadLayer(layer.base, layer.id) } } diff --git a/datasource/src/test/scala/examples/Creating.scala b/datasource/src/test/scala/examples/Creating.scala deleted file mode 100644 index fed1fac4a..000000000 --- a/datasource/src/test/scala/examples/Creating.scala +++ /dev/null @@ -1,235 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2018 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - */ - -package examples - -import java.io.File -import java.nio.file.Files - -/** - * Examples of creating RasterFrames - * - * @since 1/16/18 - */ -object Creating extends App { -/* -# Creating RasterFrames - -## Initialization - -There are a couple of setup steps necessary anytime you want to work with RasterFrames. the first is to import the API symbols into scope: - -*/ -// tut:silent -import org.locationtech.rasterframes._ -import org.apache.spark.sql._ - - -/* -Next, initialize the `SparkSession`, and call the `withRasterFrames` method on it: -*/ - -// tut:silent -implicit val spark = SparkSession.builder(). - master("local").appName("RasterFrames"). - getOrCreate(). - withRasterFrames - -/* -And, ss is standard Spark SQL practice, we import additional DataFrame support: -*/ - -// tut:silent -// tut:invisible -spark.sparkContext.setLogLevel("ERROR") - - -/* -Now we are ready to create a RasterFrame. - -## Reading a GeoTIFF - -The most straightforward way to create a `RasterFrame` is to read a [GeoTIFF](https://en.wikipedia.org/wiki/GeoTIFF) -file using a RasterFrame [`DataSource`](https://spark.apache.org/docs/latest/sql-programming-guide.html#data-sources) -designed for this purpose. - -First add the following import: -*/ - -import org.locationtech.rasterframes.datasource.geotiff._ -/* -(This is what adds the `.geotiff` method to `spark.read` below.) - -Then we use the `DataFrameReader` provided by `spark.read` to read the GeoTIFF: - */ - -// tut:book -val samplePath = new File("src/test/resources/LC08_RGB_Norfolk_COG.tiff") -val tiffRF = spark.read - .geotiff - .loadRF(samplePath.toURI) - -/* -Let's inspect the structure of what we get back: - */ - -// tut -tiffRF.printSchema() - -/* -As reported by Spark, RasterFrames extracts 6 columns from the GeoTIFF we selected. Some of these columns are dependent -on the contents of the source data, and some are are always available. Let's take a look at these in more detail. - -* `spatial_key`: GeoTrellis assigns a `SpatialKey` or a `SpaceTimeKey` to each tile, mapping it to the layer grid from - which it came. If it has a `SpaceTimeKey`, RasterFrames will split it into a `SpatialKey` and a `TemporalKey` (the - latter with column name `temporal_key`). -* `extent`: The bounding box of the tile in the tile's native CRS. -* `metadata`: The TIFF format header tags found in the file. -* `tile` or `tile_n` (where `n` is a band number): For singleband GeoTIFF files, the `tile` column contains the cell - data split into tiles. For multiband tiles, each column with `tile_` prefix contains each of the sources bands, - in the order they were stored. - -See the section [Inspecting a `RasterFrame`](#inspecting-a--code-rasterframe--code-) (below) for more details on accessing the RasterFrame's metadata. - */ - - -/* -## Reading a GeoTrellis Layer - -If your imagery is already ingested into a [GeoTrellis layer](https://docs.geotrellis.io/en/latest/guide/spark.html#writing-layers), -you can use the RasterFrames GeoTrellis DataSource. There are two parts to this GeoTrellis Layer support. The first -is the GeoTrellis Catalog DataSource, which lists the GeoTrellis layers available at a URI. The second part is the actual -RasterFrame reader for pulling a layer into a RasterFrame. - -Before we show how all of this works we need to have a GeoTrellis layer to work with. We can create one with the RasterFrame we -constructed above. - - */ -import org.locationtech.rasterframes.datasource.geotrellis._ - -val base = Files.createTempDirectory("rf-").toUri -val layer = Layer(base, "sample", 0) -tiffRF.write.geotrellis.asLayer(layer).save() - -/* -Now we can point our catalog reader at the base directory and see what was saved: -*/ - -val cat = spark.read.geotrellisCatalog(base) -cat.printSchema -cat.show() - -/* -As you can see, there's a lot of information stored in each row of the catalog. Most of this is associated with how the -layer is discretized. However, there may be other application specific metadata serialized with a layer that can be use -to filter the catalog entries or select a specific one. But for now, we're just going to load a RasterFrame in from the -catalog using a convenience function. - */ - -val firstLayer = cat.select(geotrellis_layer).first -val rfAgain = spark.read.geotrellis.loadRF(firstLayer) -rfAgain.show() - -/* -If you already know the `LayerId` of what you're wanting to read, you can bypass working with the catalog: - */ - -val anotherRF = spark.read.geotrellis.loadRF(layer) - -/* -## Using GeoTrellis APIs - -If you are used to working directly with the GeoTrellis APIs, there are a number of additional ways to create a `RasterFrame`, as enumerated in the sections below. - -First, some standard `import`s: -*/ - -// tut:silent -import geotrellis.raster.io.geotiff.SinglebandGeoTiff -import geotrellis.spark.io._ - -/* -### From `ProjectedExtent` - -The simplest mechanism for getting a RasterFrame is to use the `toRF(tileCols, tileRows)` extension method on `ProjectedRaster`. -*/ - -val scene = SinglebandGeoTiff("src/test/resources/L8-B8-Robinson-IL.tiff") -val rf = scene.projectedRaster.toRF(128, 128) -rf.show(5, false) - -/* -### From `TileLayerRDD` - -Another option is to use a GeoTrellis [`LayerReader`](https://docs.geotrellis.io/en/latest/guide/tile-backends.html), -to get a `TileLayerRDD` for which there's also a `toRF` extension method. - -*/ - -/* -```scala -import geotrellis.spark._ -val tiledLayer: TileLayerRDD[SpatialKey] = ??? -val rf = tiledLayer.toRF -``` -*/ - -/* -## Inspecting a `RasterFrame` - -`RasterFrame` has a number of methods providing access to metadata about the contents of the RasterFrame. - -### Tile Column Names - -*/ - -//```tut:book -rf.tileColumns.map(_.toString) - -/* -### Spatial Key Column Name -*/ - -//```tut:book -rf.spatialKeyColumn.toString - -/* -### Temporal Key Column - -Returns an `Option[Column]` since not all RasterFrames have an explicit temporal dimension. -*/ - -//```tut:book -rf.temporalKeyColumn.map(_.toString) - -/* -### Tile Layer Metadata - -The Tile Layer Metadata defines how the spatial/spatiotemporal domain is discretized into tiles, and what the key bounds are. -*/ - -import spray.json._ -// NB: The `fold` is required because an `Either` is returned, depending on the key type. -rf.tileLayerMetadata.fold(_.toJson, _.toJson).prettyPrint - - -//tut:invisible -spark.stop() - -} diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 704c7db53..aecf2d848 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -35,14 +35,14 @@ class GeoTiffDataSourceSpec describe("GeoTiff reading") { it("should read sample GeoTiff") { - val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer assert(rf.count() > 10) } it("should lay out tiles correctly"){ - val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer val tlm = rf.tileLayerMetadata.left.get val gb = tlm.gridBounds @@ -51,7 +51,7 @@ class GeoTiffDataSourceSpec } it("should lay out tiles correctly for non-tiled tif") { - val rf = spark.read.format("geotiff").load(nonCogPath.toASCIIString).asRF + val rf = spark.read.format("geotiff").load(nonCogPath.toASCIIString).asLayer assert(rf.count() > 1) @@ -74,7 +74,7 @@ class GeoTiffDataSourceSpec it("should read in correctly check-summed contents") { // c.f. TileStatsSpec -> computing statistics over tiles -> should compute tile statistics -> sum - val rf = spark.read.format("geotiff").load(l8B1SamplePath.toASCIIString).asRF + val rf = spark.read.format("geotiff").load(l8B1SamplePath.toASCIIString).asLayer val expected = 309149454 // computed with rasterio val result = rf.agg( sum(rf_tile_sum(rf("tile"))) @@ -84,12 +84,12 @@ class GeoTiffDataSourceSpec } it("should write GeoTIFF RF to parquet") { - val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer assert(write(rf)) } it("should write GeoTIFF") { - val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asRF + val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer logger.info(s"Read extent: ${rf.tileLayerMetadata.merge.extent}") diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala index 042fa4c3b..c409eb216 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisCatalogSpec.scala @@ -70,7 +70,7 @@ class GeoTrellisCatalogSpec .collect assert(layer.length === 2) - val lots = layer.map(sqlContext.read.geotrellis.loadRF).map(_.toDF).reduce(_ union _) + val lots = layer.map(sqlContext.read.geotrellis.loadLayer).map(_.toDF).reduce(_ union _) assert(lots.count === 60) } } diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala index aefe01f07..ecd3351df 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotrellis/GeoTrellisDataSourceSpec.scala @@ -91,7 +91,7 @@ class GeoTrellisDataSourceSpec outputDir.deleteOnExit() // Test layer writing via RF - testRdd.toRF.write.geotrellis.asLayer(layer).save() + testRdd.toLayer.write.geotrellis.asLayer(layer).save() val tfRdd = testRdd.map { case (k, tile) ⇒ val md = Map("col" -> k.col,"row" -> k.row) @@ -117,7 +117,7 @@ class GeoTrellisDataSourceSpec val tlfRdd = ContextRDD(tfRdd, testRdd.metadata) writer.write(tfLayer.id, tlfRdd, ZCurveKeyIndexMethod.byDay()) - //TestData.sampleTileLayerRDD.toRF.write.geotrellis.asLayer(sampleImageLayer).save() + //TestData.sampleTileLayerRDD.toLayer.write.geotrellis.asLayer(sampleImageLayer).save() val writer2 = LayerWriter(sampleImageLayer.base) val imgRDD = TestData.sampleTileLayerRDD writer2.write(sampleImageLayer.id, imgRDD, ZCurveKeyIndexMethod) @@ -126,12 +126,12 @@ class GeoTrellisDataSourceSpec describe("DataSource reading") { def layerReader = spark.read.geotrellis it("should read tiles") { - val df = layerReader.loadRF(layer) + val df = layerReader.loadLayer(layer) assert(df.count === tileCoordRange.length * tileCoordRange.length) } it("used produce tile UDT that we can manipulate") { - val df = layerReader.loadRF(layer) + val df = layerReader.loadLayer(layer) .select(SPATIAL_KEY_COLUMN, rf_tile_stats(TILE_COLUMN)) assert(df.count() > 0) } @@ -141,7 +141,7 @@ class GeoTrellisDataSourceSpec val bbox = testRdd.metadata.layout .mapTransform(boundKeys.toGridBounds()) .jtsGeom - val wc = layerReader.loadRF(layer).withCenter() + val wc = layerReader.loadLayer(layer).withCenter() withClue("literate API") { val df = wc.where(CENTER_COLUMN intersects bbox) @@ -154,7 +154,7 @@ class GeoTrellisDataSourceSpec } it("should invoke Encoder[Extent]") { - val df = layerReader.loadRF(layer).withGeometry() + val df = layerReader.loadLayer(layer).withGeometry() assert(df.count > 0) assert(df.first.length === 5) assert(df.first.getAs[Extent](2) !== null) @@ -162,7 +162,7 @@ class GeoTrellisDataSourceSpec it("should write to parquet") { //just should not throw - val df = layerReader.loadRF(layer) + val df = layerReader.loadLayer(layer) assert(write(df)) } } @@ -172,21 +172,21 @@ class GeoTrellisDataSourceSpec val expected = 2 val df = spark.read.geotrellis .withNumPartitions(expected) - .loadRF(layer) + .loadLayer(layer) assert(df.rdd.partitions.length === expected) } it("should respect partitions 20") { val expected = 20 val df = spark.read.geotrellis .withNumPartitions(expected) - .loadRF(layer) + .loadLayer(layer) assert(df.rdd.partitions.length === expected) } it("should respect subdivide 2") { val param = 2 - val df: RasterFrame = spark.read.geotrellis + val df: RasterFrameLayer = spark.read.geotrellis .withTileSubdivisions(param) - .loadRF(layer) + .loadLayer(layer) val dims = df.select(rf_dimensions(df.tileColumns.head)("cols"), rf_dimensions(df.tileColumns.head)("rows")).first() assert(dims.getAs[Int](0) === tileSize / param) @@ -197,9 +197,9 @@ class GeoTrellisDataSourceSpec } it("should respect subdivide with TileFeature"){ val param = 2 - val rf: RasterFrame = spark.read.geotrellis + val rf: RasterFrameLayer = spark.read.geotrellis .withTileSubdivisions(param) - .loadRF(tfLayer) + .loadLayer(tfLayer) val dims = rf.select(rf_dimensions(rf.tileColumns.head)("cols"), rf_dimensions(rf.tileColumns.head)("rows")) .first() @@ -216,7 +216,7 @@ class GeoTrellisDataSourceSpec .geotrellis .withNumPartitions(7) .withTileSubdivisions(subParam) - .loadRF(layer) + .loadLayer(layer) // is it partitioned correctly? assert(rf.rdd.partitions.length === 7) @@ -233,7 +233,7 @@ class GeoTrellisDataSourceSpec val subs = 4 val rf = spark.read.geotrellis .withTileSubdivisions(subs) - .loadRF(sampleImageLayer) + .loadLayer(sampleImageLayer) assert(rf.count === (TestData.sampleTileLayerRDD.count * subs * subs)) @@ -250,13 +250,13 @@ class GeoTrellisDataSourceSpec it("should throw on subdivide 5") { // only throws when an action is taken... - assertThrows[IllegalArgumentException](spark.read.geotrellis.withTileSubdivisions(5).loadRF(layer).cache) + assertThrows[IllegalArgumentException](spark.read.geotrellis.withTileSubdivisions(5).loadLayer(layer).cache) } it("should throw on subdivide 13") { - assertThrows[IllegalArgumentException](spark.read.geotrellis.withTileSubdivisions(13).loadRF(layer).cache) + assertThrows[IllegalArgumentException](spark.read.geotrellis.withTileSubdivisions(13).loadLayer(layer).cache) } it("should throw on subdivide -3") { - assertThrows[IllegalArgumentException](spark.read.geotrellis.withTileSubdivisions(-3).loadRF(layer).count) + assertThrows[IllegalArgumentException](spark.read.geotrellis.withTileSubdivisions(-3).loadLayer(layer).count) } } @@ -287,7 +287,7 @@ class GeoTrellisDataSourceSpec it("should support extent against a geometry literal") { val df: DataFrame = layerReader - .loadRF(layer) + .loadLayer(layer) .where(GEOMETRY_COLUMN intersects pt1) assert(numFilters(df) === 1) @@ -299,7 +299,7 @@ class GeoTrellisDataSourceSpec it("should support query with multiple geometry types") { // Mostly just testing that these evaluate without catalyst type errors. forEvery(GeomData.all) { g ⇒ - val query = layerReader.loadRF(layer).where(GEOMETRY_COLUMN.intersects(g)) + val query = layerReader.loadLayer(layer).where(GEOMETRY_COLUMN.intersects(g)) .persist(StorageLevel.OFF_HEAP) assert(query.count() === 0) } @@ -311,7 +311,7 @@ class GeoTrellisDataSourceSpec val mkPtFcn = sparkUdf((_: Row) ⇒ { Point(-88, 60).jtsGeom }) val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(st_intersects(GEOMETRY_COLUMN, mkPtFcn(SPATIAL_KEY_COLUMN))) assert(numFilters(df) === 0) @@ -323,7 +323,7 @@ class GeoTrellisDataSourceSpec it("should support temporal predicates") { withClue("at now") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(TIMESTAMP_COLUMN === Timestamp.valueOf(now.toLocalDateTime)) assert(numFilters(df) == 1) @@ -332,7 +332,7 @@ class GeoTrellisDataSourceSpec withClue("at earlier") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(TIMESTAMP_COLUMN === Timestamp.valueOf(now.minusDays(1).toLocalDateTime)) assert(numFilters(df) === 1) @@ -341,7 +341,7 @@ class GeoTrellisDataSourceSpec withClue("between now") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(TIMESTAMP_COLUMN betweenTimes (now.minusDays(1), now.plusDays(1))) assert(numFilters(df) === 1) @@ -350,7 +350,7 @@ class GeoTrellisDataSourceSpec withClue("between later") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(TIMESTAMP_COLUMN betweenTimes (now.plusDays(1), now.plusDays(2))) assert(numFilters(df) === 1) @@ -361,7 +361,7 @@ class GeoTrellisDataSourceSpec it("should support nested predicates") { withClue("fully nested") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where( ((GEOMETRY_COLUMN intersects pt1) || (GEOMETRY_COLUMN intersects pt2)) && @@ -376,7 +376,7 @@ class GeoTrellisDataSourceSpec withClue("partially nested") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where((GEOMETRY_COLUMN intersects pt1) || (GEOMETRY_COLUMN intersects pt2)) .where(TIMESTAMP_COLUMN === Timestamp.valueOf(now.toLocalDateTime)) @@ -390,7 +390,7 @@ class GeoTrellisDataSourceSpec it("should support intersects with between times") { withClue("intersects first") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(GEOMETRY_COLUMN intersects pt1) .where(TIMESTAMP_COLUMN betweenTimes(now.minusDays(1), now.plusDays(1))) @@ -398,7 +398,7 @@ class GeoTrellisDataSourceSpec } withClue("intersects last") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(TIMESTAMP_COLUMN betweenTimes(now.minusDays(1), now.plusDays(1))) .where(GEOMETRY_COLUMN intersects pt1) @@ -408,7 +408,7 @@ class GeoTrellisDataSourceSpec withClue("untyped columns") { import spark.implicits._ val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where($"timestamp" >= Timestamp.valueOf(now.minusDays(1).toLocalDateTime)) .where($"timestamp" <= Timestamp.valueOf(now.plusDays(1).toLocalDateTime)) .where(st_intersects(GEOMETRY_COLUMN, geomLit(pt1.jtsGeom))) @@ -420,7 +420,7 @@ class GeoTrellisDataSourceSpec it("should handle renamed spatial filter columns") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(GEOMETRY_COLUMN intersects region.jtsGeom) .withColumnRenamed(GEOMETRY_COLUMN.columnName, "foobar") @@ -430,7 +430,7 @@ class GeoTrellisDataSourceSpec it("should handle dropped spatial filter columns") { val df = layerReader - .loadRF(layer) + .loadLayer(layer) .where(GEOMETRY_COLUMN intersects region.jtsGeom) .drop(GEOMETRY_COLUMN) @@ -440,14 +440,14 @@ class GeoTrellisDataSourceSpec describe("TileFeature support") { def layerReader = spark.read.geotrellis - it("should resolve TileFeature-based RasterFrame") { - val rf = layerReader.loadRF(tfLayer) + it("should resolve TileFeature-based RasterFrameLayer") { + val rf = layerReader.loadLayer(tfLayer) //rf.show(false) assert(rf.collect().length === testRdd.count()) } - it("should respect subdivideTile option on TileFeature RasterFrame") { + it("should respect subdivideTile option on TileFeature RasterFrameLayer") { val subParam = 4 - val rf = spark.read.option(TILE_SUBDIVISIONS_PARAM, subParam).geotrellis.loadRF(tfLayer) + val rf = spark.read.option(TILE_SUBDIVISIONS_PARAM, subParam).geotrellis.loadLayer(tfLayer) assert(rf.count === testRdd.count * subParam * subParam) @@ -462,7 +462,7 @@ class GeoTrellisDataSourceSpec val rf = spark.read .option(TILE_SUBDIVISIONS_PARAM, subParam) .option(NUM_PARTITIONS_PARAM, 10) - .geotrellis.loadRF(tfLayer) + .geotrellis.loadLayer(tfLayer) // is it subdivided? assert(rf.count === testRdd.count * subParam * subParam) diff --git a/docs/src/main/paradox/release-notes.md b/docs/src/main/paradox/release-notes.md index 2a4cb1a7e..96db8e579 100644 --- a/docs/src/main/paradox/release-notes.md +++ b/docs/src/main/paradox/release-notes.md @@ -6,9 +6,10 @@ * Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. * Build `pyrasterframes` binary distribution for pip installation. +* Added support for rendering RasterFrame types in IPython/Jupyter. * Added new tile functions `rf_round`, `rf_abs`, `rf_log`, `rf_log10`, `rf_log2`, `rf_log1p`, `rf_exp`, `rf_exp10`, `rf_exp2`, `rf_expm1`, `rf_resample`. -* Support python-side Tile User-Defined Type backed by [numpy](https://www.numpy.org/) `ndarray` or `ma.MaskedArray`. -* Support python-side [Shapely](https://pypi.org/project/Shapely/) geometry User-Defined Type. +* Support Python-side Tile User-Defined Type backed by [numpy](https://www.numpy.org/) `ndarray` or `ma.MaskedArray`. +* Support Python-side [Shapely](https://pypi.org/project/Shapely/) geometry User-Defined Type. * SQL API support for: `rf_assemble_tile`, `rf_array_to_tile`. * Introduced at the source level the concept of a `RasterSource` and `RasterRef`, enabling lazy/delayed read of sub-scene tiles. * Added `withKryoSerialization` extension methods on `SparkSession.Builder` and `SparkConf`. @@ -19,6 +20,8 @@ * Added `rf_crs` for `ProjectedRasterTile` columns. * Added `st_extent` (for `Geometry` types) and `rf_extent` (for `ProjectedRasterTile` and `RasterSource` columns). * Added `st_geometry` (for `Extent` types) and `rf_geometry` (for `ProjectedRasterTile` and `RasterSource` columns). +* _Breaking_: The type `RasterFrame` renamed `RasterFrameLayer` to be reflect its purpose. +* _Breaking_: All `asRF` methods renamed to `asLayer`. * _Breaking_: Root package changed from `org.locationtech.rasterframes` to `org.locationtech.rasterframes`. * _Breaking_: Removed `envelope`, in lieu of `st_extent`, `rf_extent` or `st_envelope` * _Breaking_: Renamed `rf_extent_geometry` to `st_geometry` diff --git a/pyrasterframes/src/main/python/docs/architecture.md b/pyrasterframes/src/main/python/docs/architecture.md new file mode 100644 index 000000000..5dc5735a5 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/architecture.md @@ -0,0 +1,39 @@ +# Architecture + +RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO operations. It does this with the help of several other LocationTech projects: +[GeoTrellis](https://geotrellis.io/), [GeoMesa](https://www.geomesa.org/), +[JTS](https://github.com/locationtech/jts), and +[SFCurve](https://github.com/locationtech/sfcurve) (see below). + +![LocationTech Stack](rasterframes-locationtech-stack.png) + + +## Concepts + +> * Cell +> * Cell Type +> * Tile +> * Extent +> * Coordinate Reference System (CRS) +> * Projected Extent +> * Projected Raster +> * Layer + +RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As showin in Figure 2, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. + +![RasterFrame Anatomy](rasterframe-anatomy.png) + +Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. + +> Update to match components in raster-io.md + +![RasterFrame Data Sources](rasterframes-data-sources.png) + + + + +[R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame +[Pandas]:https://pandas.pydata.org/ +[GeoJSON]:https://en.wikipedia.org/wiki/GeoJSON +[GTLayer]:https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html#layouts-and-tile-layers +[PDS]:https://registry.opendata.aws/modis/ diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md index 8a27c66ad..c9665ad8d 100644 --- a/pyrasterframes/src/main/python/docs/description.md +++ b/pyrasterframes/src/main/python/docs/description.md @@ -10,23 +10,6 @@ RasterFrames®, an incubating Eclipse Foundation LocationTech project, brings to RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is accessible to general analysts while handling the rapidly growing data footprint. -## Architecture - -RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO operations. It does this with the help of several other LocationTech projects: -[GeoTrellis](https://geotrellis.io/), [GeoMesa](https://www.geomesa.org/), -[JTS](https://github.com/locationtech/jts), and -[SFCurve](https://github.com/locationtech/sfcurve) (see Figure 1). - -![LocationTech Stack](rasterframes-locationtech-stack.png) - -RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As showin in Figure 2, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. - -![RasterFrame Anatomy](rasterframe-anatomy.png) - -Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. - -![RasterFrame Data Sources](rasterframes-data-sources.png) - [R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame [Pandas]:https://pandas.pydata.org/ [GeoJSON]:https://en.wikipedia.org/wiki/GeoJSON diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 09805643f..6d8c69052 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -28,12 +28,12 @@ from pyspark.sql import SparkSession, DataFrame, DataFrameReader from pyspark.sql.column import _to_java_column -# Import RasterFrame types and functions +# Import RasterFrameLayer types and functions from .rf_context import RFContext from .version import __version__ -from .rf_types import RasterFrame, TileExploder, TileUDT, RasterSourceUDT +from .rf_types import RasterFrameLayer, TileExploder, TileUDT, RasterSourceUDT -__all__ = ['RasterFrame', 'TileExploder'] +__all__ = ['RasterFrameLayer', 'TileExploder'] def _rf_init(spark_session): @@ -66,10 +66,10 @@ def _convert_df(df, sp_key=None, metadata=None): ctx = SparkContext._active_spark_context._rf_context if sp_key is None: - return RasterFrame(ctx._jrfctx.asRF(df._jdf), ctx._spark_session) + return RasterFrameLayer(ctx._jrfctx.asLayer(df._jdf), ctx._spark_session) else: import json - return RasterFrame(ctx._jrfctx.asRF( + return RasterFrameLayer(ctx._jrfctx.asLayer( df._jdf, _to_java_column(sp_key), json.dumps(metadata)), ctx._spark_session) @@ -89,7 +89,7 @@ def _raster_join(df, other, left_extent=None, left_crs=None, right_extent=None, else: jdf = ctx._jrfctx.rasterJoin(df._jdf, other._jdf) - return RasterFrame(jdf, ctx._spark_session) + return RasterFrameLayer(jdf, ctx._spark_session) def _layer_reader(df_reader, format_key, path, **options): @@ -151,8 +151,8 @@ def to_csv(comp): SparkSession.withRasterFrames = _rf_init SparkSession.Builder.withKryoSerialization = _kryo_init -# Add the 'asRF' method to pyspark DataFrame -DataFrame.asRF = _convert_df +# Add the 'asLayer' method to pyspark DataFrame +DataFrame.as_layer = _convert_df # Add `raster_join` method to pyspark DataFrame DataFrame.raster_join = _raster_join diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_context.py b/pyrasterframes/src/main/python/pyrasterframes/rf_context.py index ce7904474..0b96a6348 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_context.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_context.py @@ -19,7 +19,7 @@ # """ -This module contains access to the jvm SparkContext with RasterFrame support. +This module contains access to the jvm SparkContext with RasterFrameLayer support. """ from pyspark import SparkContext diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index ddf334d7a..ffe2aa925 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -21,7 +21,7 @@ """ This module contains all types relevant to PyRasterFrames. Classes in this module are meant to provide smoother pathways between the jvm and Python, and whenever possible, -the implementations take advantage of the existing Scala functionality. The RasterFrame +the implementations take advantage of the existing Scala functionality. The RasterFrameLayer class here provides the PyRasterFrames entry point. """ @@ -34,15 +34,15 @@ class here provides the PyRasterFrames entry point. from pyrasterframes.rf_context import RFContext import numpy as np -__all__ = ['RasterFrame', 'Tile', 'TileUDT', 'CellType', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] +__all__ = ['RasterFrameLayer', 'Tile', 'TileUDT', 'CellType', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] -class RasterFrame(DataFrame): +class RasterFrameLayer(DataFrame): def __init__(self, jdf, spark_session): DataFrame.__init__(self, jdf, spark_session._wrapped) self._jrfctx = spark_session.rasterframes._jrfctx - def tileColumns(self): + def tile_columns(self): """ Fetches columns of type Tile. :return: One or more Column instances associated with Tiles. @@ -50,7 +50,7 @@ def tileColumns(self): cols = self._jrfctx.tileColumns(self._jdf) return [Column(c) for c in cols] - def spatialKeyColumn(self): + def spatial_key_column(self): """ Fetch the tagged spatial key column. :return: Spatial key column @@ -58,7 +58,7 @@ def spatialKeyColumn(self): col = self._jrfctx.spatialKeyColumn(self._jdf) return Column(col) - def temporalKeyColumn(self): + def temporal_key_column(self): """ Fetch the temporal key column, if any. :return: Temporal key column, or None. @@ -66,7 +66,7 @@ def temporalKeyColumn(self): col = self._jrfctx.temporalKeyColumn(self._jdf) return col and Column(col) - def tileLayerMetadata(self): + def tile_layer_metadata(self): """ Fetch the tile layer metadata. :return: A dictionary of metadata. @@ -74,16 +74,16 @@ def tileLayerMetadata(self): import json return json.loads(str(self._jrfctx.tileLayerMetadata(self._jdf))) - def spatialJoin(self, other_df): + def spatial_join(self, other_df): """ - Spatially join this RasterFrame to the given RasterFrame. - :return: Joined RasterFrame. + Spatially join this RasterFrameLayer to the given RasterFrameLayer. + :return: Joined RasterFrameLayer. """ ctx = SparkContext._active_spark_context._rf_context df = ctx._jrfctx.spatialJoin(self._jdf, other_df._jdf) - return RasterFrame(df, ctx._spark_session) + return RasterFrameLayer(df, ctx._spark_session) - def toIntRaster(self, colname, cols, rows): + def to_int_raster(self, colname, cols, rows): """ Convert a tile to an Int raster :return: array containing values of the tile's cells @@ -91,7 +91,7 @@ def toIntRaster(self, colname, cols, rows): resArr = self._jrfctx.toIntRaster(self._jdf, colname, cols, rows) return resArr - def toDoubleRaster(self, colname, cols, rows): + def to_double_raster(self, colname, cols, rows): """ Convert a tile to an Double raster :return: array containing values of the tile's cells @@ -99,41 +99,41 @@ def toDoubleRaster(self, colname, cols, rows): resArr = self._jrfctx.toDoubleRaster(self._jdf, colname, cols, rows) return resArr - def withBounds(self): + def with_bounds(self): """ Add a column called "bounds" containing the extent of each row. - :return: RasterFrame with "bounds" column. + :return: RasterFrameLayer with "bounds" column. """ ctx = SparkContext._active_spark_context._rf_context df = ctx._jrfctx.withBounds(self._jdf) - return RasterFrame(df, ctx._spark_session) + return RasterFrameLayer(df, ctx._spark_session) - def withCenter(self): + def with_center(self): """ Add a column called "center" containing the center of the extent of each row. - :return: RasterFrame with "center" column. + :return: RasterFrameLayer with "center" column. """ ctx = SparkContext._active_spark_context._rf_context df = ctx._jrfctx.withCenter(self._jdf) - return RasterFrame(df, ctx._spark_session) + return RasterFrameLayer(df, ctx._spark_session) - def withCenterLatLng(self): + def with_center_lat_lng(self): """ Add a column called "center" containing the center of the extent of each row in Lat Long form. - :return: RasterFrame with "center" column. + :return: RasterFrameLayer with "center" column. """ ctx = SparkContext._active_spark_context._rf_context df = ctx._jrfctx.withCenterLatLng(self._jdf) - return RasterFrame(df, ctx._spark_session) + return RasterFrameLayer(df, ctx._spark_session) - def withSpatialIndex(self): + def with_spatial_index(self): """ Add a column containing the spatial index of each row. - :return: RasterFrame with "center" column. + :return: RasterFrameLayer with "center" column. """ ctx = SparkContext._active_spark_context._rf_context df = ctx._jrfctx.withSpatialIndex(self._jdf) - return RasterFrame(df, ctx._spark_session) + return RasterFrameLayer(df, ctx._spark_session) class RasterSourceUDT(UserDefinedType): diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 3ba625e9d..94b158c2d 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -32,7 +32,7 @@ class VectorTypes(TestEnvironment): def setUp(self): - self.create_rasterframe() + self.create_layer() import pandas as pd self.pandas_df = pd.DataFrame({ 'eye': ['a', 'b', 'c', 'd'], @@ -147,20 +147,20 @@ def test_geojson(self): class RasterFunctions(TestEnvironment): def setUp(self): - self.create_rasterframe() + self.create_layer() def test_setup(self): self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") def test_identify_columns(self): - cols = self.rf.tileColumns() + cols = self.rf.tile_columns() self.assertEqual(len(cols), 1, '`tileColumns` did not find the proper number of columns.') print("Tile columns: ", cols) - col = self.rf.spatialKeyColumn() + col = self.rf.spatial_key_column() self.assertIsInstance(col, Column, '`spatialKeyColumn` was not found') print("Spatial key column: ", col) - col = self.rf.temporalKeyColumn() + col = self.rf.temporal_key_column() self.assertIsNone(col, '`temporalKeyColumn` should be `None`') print("Temporal key column: ", col) @@ -172,9 +172,9 @@ def test_tile_creation(self): self.assertEqual(tiles.count(), 4) def test_multi_column_operations(self): - df1 = self.rf.withColumnRenamed('tile', 't1').asRF() - df2 = self.rf.withColumnRenamed('tile', 't2').asRF() - df3 = df1.spatialJoin(df2).asRF() + df1 = self.rf.withColumnRenamed('tile', 't1').as_layer() + df2 = self.rf.withColumnRenamed('tile', 't2').as_layer() + df3 = df1.spatial_join(df2).as_layer() df3 = df3.withColumn('norm_diff', rf_normalized_difference('t1', 't2')) # df3.printSchema() @@ -187,7 +187,7 @@ def test_multi_column_operations(self): self.assertTrue(self.rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) def test_general(self): - meta = self.rf.tileLayerMetadata() + meta = self.rf.tile_layer_metadata() self.assertIsNotNone(meta['bounds']) df = self.rf.withColumn('dims', rf_dimensions('tile')) \ .withColumn('type', rf_cell_type('tile')) \ @@ -263,7 +263,7 @@ def test_explode(self): # |spatial_key|column_index|row_index|tile | # +-----------+------------+---------+-------+ # |[2,1] |4 |0 |10150.0| - cell = self.rf.select(self.rf.spatialKeyColumn(), rf_explode_tiles(self.rf.tile)) \ + cell = self.rf.select(self.rf.spatial_key_column(), rf_explode_tiles(self.rf.tile)) \ .where(F.col("spatial_key.col") == 2) \ .where(F.col("spatial_key.row") == 1) \ .where(F.col("column_index") == 4) \ @@ -386,7 +386,7 @@ def test_cell_type_conversion(self): class UDT(TestEnvironment): def setUp(self): - self.create_rasterframe() + self.create_layer() def test_mask_no_data(self): t1 = Tile(np.array([[1, 2], [3, 4]]), CellType("int8ud3")) @@ -598,7 +598,7 @@ def test_matmul(self): class PandasInterop(TestEnvironment): def setUp(self): - self.create_rasterframe() + self.create_layer() def test_pandas_conversion(self): import pandas as pd @@ -649,7 +649,7 @@ def test_extended_pandas_ops(self): }) rf_maybe_2 = self.spark.createDataFrame(to_spark_2) - #print("RasterFrame `show`:") + #print("RasterFrameLayer `show`:") #rf_maybe_2.select(rf_render_matrix(rf_maybe_2.t).alias('t')).show(truncate=False) pd_2 = rf_maybe_2.toPandas() @@ -663,7 +663,7 @@ def test_extended_pandas_ops(self): class RasterJoin(TestEnvironment): def setUp(self): - self.create_rasterframe() + self.create_layer() def test_raster_join(self): # re-read the same source diff --git a/pyrasterframes/src/main/python/tests/__init__.py b/pyrasterframes/src/main/python/tests/__init__.py index 3ed3e2edf..177c9a8c7 100644 --- a/pyrasterframes/src/main/python/tests/__init__.py +++ b/pyrasterframes/src/main/python/tests/__init__.py @@ -73,15 +73,15 @@ def setUpClass(cls): cls.img_uri = 'file://' + os.path.join(cls.resource_dir, 'L8-B8-Robinson-IL.tiff') - def create_rasterframe(self): + def create_layer(self): from pyrasterframes.rasterfunctions import rf_convert_cell_type # load something into a rasterframe rf = self.spark.read.geotiff(self.img_uri) \ - .withBounds() \ - .withCenter() + .with_bounds() \ + .with_center() # convert the tile cell type to provide for other operations self.rf = rf.withColumn('tile2', rf_convert_cell_type('tile', 'float32')) \ .drop('tile') \ - .withColumnRenamed('tile2', 'tile').asRF() + .withColumnRenamed('tile2', 'tile').as_layer() # cls.rf.show() diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 4590eccc4..10c83fef8 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -37,7 +37,7 @@ import spray.json._ import scala.collection.JavaConverters._ /** - * py4j access wrapper to RasterFrame entry points. + * py4j access wrapper to RasterFrameLayer entry points. * * @since 11/6/17 */ @@ -54,53 +54,53 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions retval } - def toSpatialMultibandTileLayerRDD(rf: RasterFrame): MultibandTileLayerRDD[SpatialKey] = + def toSpatialMultibandTileLayerRDD(rf: RasterFrameLayer): MultibandTileLayerRDD[SpatialKey] = rf.toMultibandTileLayerRDD match { case Left(spatial) => spatial case Right(other) => throw new Exception(s"Expected a MultibandTileLayerRDD[SpatailKey] but got $other instead") } - def toSpaceTimeMultibandTileLayerRDD(rf: RasterFrame): MultibandTileLayerRDD[SpaceTimeKey] = + def toSpaceTimeMultibandTileLayerRDD(rf: RasterFrameLayer): MultibandTileLayerRDD[SpaceTimeKey] = rf.toMultibandTileLayerRDD match { case Right(temporal) => temporal case Left(other) => throw new Exception(s"Expected a MultibandTileLayerRDD[SpaceTimeKey] but got $other instead") } /** - * Converts a `ContextRDD[Spatialkey, MultibandTile, TileLayerMedadata[Spatialkey]]` to a RasterFrame + * Converts a `ContextRDD[Spatialkey, MultibandTile, TileLayerMedadata[Spatialkey]]` to a RasterFrameLayer */ - def asRF( + def asLayer( layer: ContextRDD[SpatialKey, MultibandTile, TileLayerMetadata[SpatialKey]], bandCount: java.lang.Integer - ): RasterFrame = { + ): RasterFrameLayer = { implicit val pr = PairRDDConverter.forSpatialMultiband(bandCount.toInt) - layer.toRF + layer.toLayer } /** - * Converts a `ContextRDD[SpaceTimeKey, MultibandTile, TileLayerMedadata[SpaceTimeKey]]` to a RasterFrame + * Converts a `ContextRDD[SpaceTimeKey, MultibandTile, TileLayerMedadata[SpaceTimeKey]]` to a RasterFrameLayer */ - def asRF( + def asLayer( layer: ContextRDD[SpaceTimeKey, MultibandTile, TileLayerMetadata[SpaceTimeKey]], bandCount: java.lang.Integer - )(implicit d: DummyImplicit): RasterFrame = { + )(implicit d: DummyImplicit): RasterFrameLayer = { implicit val pr = PairRDDConverter.forSpaceTimeMultiband(bandCount.toInt) - layer.toRF + layer.toLayer } /** - * Base conversion to RasterFrame + * Base conversion to RasterFrameLayer */ - def asRF(df: DataFrame): RasterFrame = { - df.asRF + def asLayer(df: DataFrame): RasterFrameLayer = { + df.asLayer } /** - * Conversion to RasterFrame with spatial key column and TileLayerMetadata specified. + * Conversion to RasterFrameLayer with spatial key column and TileLayerMetadata specified. */ - def asRF(df: DataFrame, spatialKey: Column, tlm: String): RasterFrame = { + def asLayer(df: DataFrame, spatialKey: Column, tlm: String): RasterFrameLayer = { val jtlm = tlm.parseJson.convertTo[TileLayerMetadata[SpatialKey]] - df.asRF(spatialKey, jtlm) + df.asLayer(spatialKey, jtlm) } /** @@ -138,13 +138,13 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions rf_explode_tiles_sample(sampleFraction, Some(seed), cols: _*) def tileColumns(df: DataFrame): Array[Column] = - df.asRF.tileColumns.toArray + df.asLayer.tileColumns.toArray def spatialKeyColumn(df: DataFrame): Column = - df.asRF.spatialKeyColumn + df.asLayer.spatialKeyColumn def temporalKeyColumn(df: DataFrame): Column = - df.asRF.temporalKeyColumn.orNull + df.asLayer.temporalKeyColumn.orNull // All the scalar tile arithmetic functions @@ -196,26 +196,26 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions // return toRaster, get just the tile, and make an array out of it def toIntRaster(df: DataFrame, colname: String, cols: Int, rows: Int): Array[Int] = { - df.asRF.toRaster(df.col(colname), cols, rows).tile.toArray() + df.asLayer.toRaster(df.col(colname), cols, rows).tile.toArray() } def toDoubleRaster(df: DataFrame, colname: String, cols: Int, rows: Int): Array[Double] = { - df.asRF.toRaster(df.col(colname), cols, rows).tile.toArrayDouble() + df.asLayer.toRaster(df.col(colname), cols, rows).tile.toArrayDouble() } def tileLayerMetadata(df: DataFrame): String = // The `fold` is required because an `Either` is retured, depending on the key type. - df.asRF.tileLayerMetadata.fold(_.toJson, _.toJson).prettyPrint + df.asLayer.tileLayerMetadata.fold(_.toJson, _.toJson).prettyPrint - def spatialJoin(df: DataFrame, right: DataFrame): RasterFrame = df.asRF.spatialJoin(right.asRF) + def spatialJoin(df: DataFrame, right: DataFrame): RasterFrameLayer = df.asLayer.spatialJoin(right.asLayer) - def withBounds(df: DataFrame): RasterFrame = df.asRF.withGeometry() + def withBounds(df: DataFrame): RasterFrameLayer = df.asLayer.withGeometry() - def withCenter(df: DataFrame): RasterFrame = df.asRF.withCenter() + def withCenter(df: DataFrame): RasterFrameLayer = df.asLayer.withCenter() - def withCenterLatLng(df: DataFrame): RasterFrame = df.asRF.withCenterLatLng() + def withCenterLatLng(df: DataFrame): RasterFrameLayer = df.asLayer.withCenterLatLng() - def withSpatialIndex(df: DataFrame): RasterFrame = df.asRF.withSpatialIndex() + def withSpatialIndex(df: DataFrame): RasterFrameLayer = df.asLayer.withSpatialIndex() //----------------------------Support Routines----------------------------------------- From 1e4952962006c17755c78cf99ea2986b98d0cc97 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Jul 2019 12:00:09 -0400 Subject: [PATCH 215/380] Upgraded to gdal-warp-bindings "33.58d4965" --- .../org/locationtech/rasterframes/ref/RasterSourceIT.scala | 4 ++++ project/RFDependenciesPlugin.scala | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 9372e29ba..1123c6a08 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -24,6 +24,7 @@ package org.locationtech.rasterframes.ref import java.lang.Math.ceil import java.net.URI +import com.azavea.gdal.GDALWarp import org.locationtech.rasterframes import org.locationtech.rasterframes.util.time import org.locationtech.rasterframes.{NOMINAL_TILE_SIZE, TestData, TestEnvironment} @@ -63,8 +64,11 @@ class RasterSourceIT extends TestEnvironment with TestData { } if (RasterSource.IsGDAL.hasGDAL) { + println("GDAL version: " + GDALWarp.get_version_info("--version")) + describe("GDAL support") { + it("should read JPEG2000 scene") { RasterSource(localSentinel).readAll().flatMap(_.tile.statisticsDouble).size should be(64) } diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index b9620e9dc..a4caa89c0 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -62,6 +62,6 @@ object RFDependenciesPlugin extends AutoPlugin { rfSparkVersion := "2.3.2", rfGeoTrellisVersion := "2.2.0", rfGeoMesaVersion := "2.2.1", - dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.3f7a866" + dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.58d4965" ) } From 7d75cb7afe7e08b34c69ebd084399887e04eed2f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Jul 2019 13:52:17 -0400 Subject: [PATCH 216/380] Implemented switch to RasterSourceRelation to control lazy or strict reading of tiles. --- .../rasterframes/bench/RasterRefBench.scala | 3 +- .../RasterSourceToRasterRefs.scala | 16 ++-- .../generators/RasterSourceToTiles.scala | 88 +++++++++++++++++++ .../transformers/URIToRasterSource.scala | 2 +- .../rasterframes/ref/RasterRefSpec.scala | 2 +- .../raster/RasterSourceDataSource.scala | 8 +- .../raster/RasterSourceRelation.scala | 50 ++++++----- .../datasource/raster/package.scala | 7 +- .../raster/RasterSourceDataSourceSpec.scala | 25 +++++- .../src/main/python/docs/raster-io.pymd | 5 ++ .../main/python/pyrasterframes/__init__.py | 11 ++- .../main/python/tests/PyRasterFramesTests.py | 12 ++- 12 files changed, 184 insertions(+), 45 deletions(-) rename core/src/main/scala/org/locationtech/rasterframes/expressions/{transformers => generators}/RasterSourceToRasterRefs.scala (85%) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToTiles.scala diff --git a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala index a3450e1d7..448fab9c3 100644 --- a/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala +++ b/bench/src/main/scala/org/locationtech/rasterframes/bench/RasterRefBench.scala @@ -26,7 +26,8 @@ import java.util.concurrent.TimeUnit import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs} +import org.locationtech.rasterframes.expressions.generators.RasterSourceToRasterRefs +import org.locationtech.rasterframes.expressions.transformers.RasterRefToTile import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.ref.RasterSource import org.openjdk.jmh.annotations._ diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToRasterRefs.scala similarity index 85% rename from core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala rename to core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToRasterRefs.scala index 967ba52a5..68c7209e5 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/RasterSourceToRasterRefs.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToRasterRefs.scala @@ -19,45 +19,41 @@ * */ -package org.locationtech.rasterframes.expressions.transformers +package org.locationtech.rasterframes.expressions.generators import com.typesafe.scalalogging.LazyLogging import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.InternalRow import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback -import org.apache.spark.sql.rf._ import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames +import org.locationtech.rasterframes.expressions.generators.RasterSourceToRasterRefs.bandNames import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.RasterSourceType import scala.util.Try import scala.util.control.NonFatal /** - * Accepts RasterRef and generates one or more RasterRef instances representing the - * native internal sub-tiling, if any (and requested). + * Accepts RasterSource and generates one or more RasterRef instances representing * * @since 9/6/18 */ case class RasterSourceToRasterRefs(children: Seq[Expression], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions] = None) extends Expression with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { - private val RasterSourceType = new RasterSourceUDT() - private val rasterRefSchema = schemaOf[RasterRef] - override def inputTypes: Seq[DataType] = Seq.fill(children.size)(RasterSourceType) - override def nodeName: String = "raster_source_to_raster_ref" + override def nodeName: String = "rf_raster_source_to_raster_ref" override def elementSchema: StructType = StructType(for { child <- children basename = child.name + "_ref" name <- bandNames(basename, bandIndexes) - } yield StructField(name, rasterRefSchema, true)) + } yield StructField(name, schemaOf[RasterRef], true)) private def band2ref(src: RasterSource, e: Option[Extent])(b: Int): RasterRef = if (b < src.bandCount) RasterRef(src, b, e) else null diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToTiles.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToTiles.scala new file mode 100644 index 000000000..32b3f4b11 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/generators/RasterSourceToTiles.scala @@ -0,0 +1,88 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.generators + +import com.typesafe.scalalogging.LazyLogging +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.expressions._ +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.types.{DataType, StructField, StructType} +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.expressions.generators.RasterSourceToRasterRefs.bandNames +import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.tiles.ProjectedRasterTile +import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.RasterSourceType + +import scala.util.Try +import scala.util.control.NonFatal + +/** + * Accepts RasterRef and generates one or more RasterRef instances representing the + * native internal sub-tiling, if any (and requested). + * + * @since 9/6/18 + */ +case class RasterSourceToTiles(children: Seq[Expression], bandIndexes: Seq[Int], subtileDims: Option[TileDimensions] = None) extends Expression + with Generator with CodegenFallback with ExpectsInputTypes with LazyLogging { + + override def inputTypes: Seq[DataType] = Seq.fill(children.size)(RasterSourceType) + override def nodeName: String = "rf_raster_source_to_tiles" + + override def elementSchema: StructType = StructType(for { + child <- children + basename = child.name + name <- bandNames(basename, bandIndexes) + } yield StructField(name, schemaOf[ProjectedRasterTile], true)) + + override def eval(input: InternalRow): TraversableOnce[InternalRow] = { + try { + val tiles = children.map { child ⇒ + val src = RasterSourceType.deserialize(child.eval(input)) + val maxBands = src.bandCount + val allowedBands = bandIndexes.filter(_ < maxBands) + src.readAll(subtileDims.getOrElse(rasterframes.NOMINAL_TILE_DIMS), allowedBands) + .map(r => bandIndexes.map { + case i if i < maxBands => ProjectedRasterTile(r.tile.band(i), r.extent, src.crs) + case _ => null + }) + } + tiles.transpose.map(ts ⇒ InternalRow(ts.flatMap(_.map(_.toInternalRow)): _*)) + } + catch { + case NonFatal(ex) ⇒ + val payload = Try(children.map(c => RasterSourceType.deserialize(c.eval(input)))).toOption.toSeq.flatten + logger.error("Error fetching data for one of: " + payload.mkString(", "), ex) + Traversable.empty + } + } +} + +object RasterSourceToTiles { + def apply(rrs: Column*): TypedColumn[Any, ProjectedRasterTile] = apply(None, Seq(0), rrs: _*) + def apply(subtileDims: Option[TileDimensions], bandIndexes: Seq[Int], rrs: Column*): TypedColumn[Any, ProjectedRasterTile] = + new Column(new RasterSourceToTiles(rrs.map(_.expr), bandIndexes, subtileDims)).as[ProjectedRasterTile] +} + + diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala index ab138ec91..903e62dde 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/URIToRasterSource.scala @@ -41,7 +41,7 @@ import org.locationtech.rasterframes.ref.RasterSource case class URIToRasterSource(override val child: Expression) extends UnaryExpression with ExpectsInputTypes with CodegenFallback with LazyLogging { - override def nodeName: String = "rf_read_raster_source" + override def nodeName: String = "rf_uri_to_raster_source" override def dataType: DataType = RasterSourceType diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala index 8bdb9cad0..aeffdcd66 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterRefSpec.scala @@ -23,7 +23,7 @@ package org.locationtech.rasterframes.ref import org.locationtech.rasterframes._ import org.locationtech.rasterframes.expressions.accessors._ -import org.locationtech.rasterframes.expressions.transformers._ +import org.locationtech.rasterframes.expressions.generators._ import RasterRef.RasterRefTile import geotrellis.raster.Tile import geotrellis.vector.Extent diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala index b0b4185d8..6cea717ec 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSource.scala @@ -33,9 +33,10 @@ class RasterSourceDataSource extends DataSourceRegister with RelationProvider { override def createRelation(sqlContext: SQLContext, parameters: Map[String, String]): BaseRelation = { val bands = parameters.bandIndexes val tiling = parameters.tileDims + val lazyTiles = parameters.lazyTiles val spec = parameters.pathSpec val catRef = spec.fold(_.registerAsTable(sqlContext), identity) - RasterSourceRelation(sqlContext, catRef, bands, tiling) + RasterSourceRelation(sqlContext, catRef, bands, tiling, lazyTiles) } } @@ -48,6 +49,7 @@ object RasterSourceDataSource { final val CATALOG_TABLE_PARAM = "catalogTable" final val CATALOG_TABLE_COLS_PARAM = "catalogColumns" final val CATALOG_CSV_PARAM = "catalogCSV" + final val LAZY_TILES_PARAM = "lazyTiles" final val DEFAULT_COLUMN_NAME = PROJECTED_RASTER_COLUMN.columnName @@ -107,6 +109,10 @@ object RasterSourceDataSource { .map(tokenize(_).map(_.toInt)) .getOrElse(Seq(0)) + + def lazyTiles: Boolean = parameters + .get(LAZY_TILES_PARAM).forall(_.toBoolean) + def catalog: Option[RasterSourceCatalog] = { val paths = ( parameters diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala index dc0cfac97..6af519f56 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceRelation.scala @@ -28,8 +28,9 @@ import org.apache.spark.sql.types.{StringType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext} import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.RasterSourceCatalogRef import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.expressions.transformers.RasterSourceToRasterRefs.bandNames -import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, RasterSourceToRasterRefs, URIToRasterSource} +import org.locationtech.rasterframes.expressions.generators.{RasterSourceToRasterRefs, RasterSourceToTiles} +import org.locationtech.rasterframes.expressions.generators.RasterSourceToRasterRefs.bandNames +import org.locationtech.rasterframes.expressions.transformers.{RasterRefToTile, URIToRasterSource} import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.tiles.ProjectedRasterTile @@ -43,8 +44,10 @@ import org.locationtech.rasterframes.tiles.ProjectedRasterTile case class RasterSourceRelation( sqlContext: SQLContext, catalogTable: RasterSourceCatalogRef, - bandIndexes: Seq[Int], subtileDims: Option[TileDimensions]) - extends BaseRelation with TableScan { + bandIndexes: Seq[Int], + subtileDims: Option[TileDimensions], + lazyTiles: Boolean +) extends BaseRelation with TableScan { lazy val inputColNames = catalogTable.bandColumnNames @@ -61,7 +64,7 @@ case class RasterSourceRelation( def tileColNames = inputColNames .flatMap(bandNames(_, bandIndexes)) - def extraCols: Seq[StructField] = { + lazy val extraCols: Seq[StructField] = { val catalog = sqlContext.table(catalogTable.tableName) catalog.schema.fields.filter(f => !catalogTable.bandColumnNames.contains(f.name)) } @@ -96,17 +99,6 @@ case class RasterSourceRelation( (pathColName, srcColName) <- pathColNames.zip(srcColNames) } yield URIToRasterSource(col(pathColName)) as srcColName - // Expand RasterSource into multiple columns per band, and multiple rows per tile - // There's some unintentional fragililty here in that the structure of the expression - // is expected to line up with our column structure here. - val refs = RasterSourceToRasterRefs(subtileDims, bandIndexes, srcs: _*) as refColNames - - // RasterSourceToRasterRef is a generator, which means you have to do the Tile conversion - // in a separate select statement (Query planner doesn't know how many columns ahead of time). - val refsToTiles = for { - (refColName, tileColName) <- refColNames.zip(tileColNames) - } yield RasterRefToTile(col(refColName)) as tileColName - // Add path columns val withPaths = inputs .select($"*" +: pathsAliasing: _*) @@ -115,12 +107,30 @@ case class RasterSourceRelation( // and reused with each select. val paths = pathColNames.map(withPaths.apply) + // Input columns along for the ride. val extras = extraCols.map(f => inputs(f.name)) - val df = withPaths - .select(extras ++ paths :+ refs: _*) - .select(paths ++ refsToTiles ++ extras: _*) - + val df = if (lazyTiles) { + // Expand RasterSource into multiple columns per band, and multiple rows per tile + // There's some unintentional fragililty here in that the structure of the expression + // is expected to line up with our column structure here. + val refs = RasterSourceToRasterRefs(subtileDims, bandIndexes, srcs: _*) as refColNames + + // RasterSourceToRasterRef is a generator, which means you have to do the Tile conversion + // in a separate select statement (Query planner doesn't know how many columns ahead of time). + val refsToTiles = for { + (refColName, tileColName) <- refColNames.zip(tileColNames) + } yield RasterRefToTile(col(refColName)) as tileColName + + withPaths + .select(extras ++ paths :+ refs: _*) + .select(paths ++ refsToTiles ++ extras: _*) + } + else { + val tiles = RasterSourceToTiles(subtileDims, bandIndexes, srcs: _*) as tileColNames + withPaths + .select((paths :+ tiles) ++ extras: _*) + } df.rdd } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala index 3ac06946a..d85f435d2 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/raster/package.scala @@ -53,13 +53,18 @@ package object raster { reader.option(RasterSourceDataSource.TILE_DIMS_PARAM, s"$cols,$rows") ) + /** Indicate if tile reading should be delayed until cells are fetched. Defaults to `true`. */ + def withLazyTiles(state: Boolean): RasterSourceDataFrameReader = + tag[RasterSourceDataFrameReaderTag][DataFrameReader]( + reader.option(RasterSourceDataSource.LAZY_TILES_PARAM, state)) + def fromCatalog(catalog: DataFrame, bandColumnNames: String*): RasterSourceDataFrameReader = tag[RasterSourceDataFrameReaderTag][DataFrameReader] { val tmpName = tmpTableName() catalog.createOrReplaceTempView(tmpName) reader .option(RasterSourceDataSource.CATALOG_TABLE_PARAM, tmpName) - .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")) + .option(RasterSourceDataSource.CATALOG_TABLE_COLS_PARAM, bandColumnNames.mkString(",")): DataFrameReader } def fromCatalog(tableName: String, bandColumnNames: String*): RasterSourceDataFrameReader = diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala index 58aa44dfd..a8ca3bef8 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala @@ -20,10 +20,12 @@ */ package org.locationtech.rasterframes.datasource.raster -import org.apache.spark.sql.functions.lit +import geotrellis.raster.Tile +import org.apache.spark.sql.functions.{lit, udf} import org.locationtech.rasterframes.{TestEnvironment, _} import org.locationtech.rasterframes.datasource.raster.RasterSourceDataSource.{RasterSourceCatalog, _} import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.ref.RasterRef.RasterRefTile import org.locationtech.rasterframes.util._ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { @@ -135,6 +137,7 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { it("should read a multiple files with heterogeneous bands") { val df = spark.read.raster .from(Seq(cogPath, l8B1SamplePath, nonCogPath)) + .withLazyTiles(false) .withTileDimensions(128, 128) .withBandIndexes(0, 1, 2, 3) .load() @@ -197,7 +200,6 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { diffStats.forall(identity) should be(true) } - it("should read a set of coherent bands from multiple files in a csv") { def b(i: Int) = l8SamplePath(i).toASCIIString @@ -223,5 +225,24 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { val diffStats = df.select(rf_tile_stats($"B1") =!= rf_tile_stats($"B2")).as[Boolean].collect() diffStats.forall(identity) should be(true) } + + it("should support lazy and strict reading of tiles") { + val is_lazy = udf((t: Tile) => { + t.isInstanceOf[RasterRefTile] + }) + + val df1 = spark.read.raster + .withLazyTiles(true) + .load(l8SamplePath(1).toASCIIString) + + df1.select(is_lazy($"proj_raster.tile").as[Boolean]).first() should be (true) + + val df2 = spark.read.raster + .withLazyTiles(false) + .load(l8SamplePath(1).toASCIIString) + + df2.select(is_lazy($"proj_raster.tile").as[Boolean]).first() should be (false) + + } } } diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 318fec5ee..6bc2d3a37 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -154,6 +154,11 @@ rf.show(2, truncate=False) ``` +### Lazy vs. Strict Raster Reads + +> Discuss the `spark.read.raster(lazy_tiles=False)` behavior + + ### Multiband Rasters > Need to know _a priori_ how many bands there are, specified with `band_indexes`. diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 6d8c69052..2af1677a1 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -103,11 +103,13 @@ def _aliased_reader(df_reader, format_key, path, **options): return df_reader.format(format_key).load(path, **options) def _raster_reader( - df_reader, path=None, - band_indexes=None, - tile_dimensions=(256, 256), + df_reader, + path=None, catalog=None, catalog_col_names=None, + band_indexes=None, + tile_dimensions=(256, 256), + lazy_tiles=True, **options): def to_csv(comp): @@ -121,7 +123,8 @@ def to_csv(comp): options.update({ "bandIndexes": to_csv(band_indexes), - "tileDimensions": to_csv(tile_dimensions) + "tileDimensions": to_csv(tile_dimensions), + "lazyTiles": lazy_tiles }) if catalog is not None: diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 94b158c2d..6fd925459 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -712,7 +712,6 @@ def test_prt_functions(self): df.select('crs', 'ext', 'geom').first() def test_raster_source_reader(self): - import pandas as pd # much the same as RasterSourceDataSourceSpec here; but using https PDS. Takes about 30s to run def l8path(b): @@ -725,8 +724,9 @@ def l8path(b): df = self.spark.read.raster( tile_dimensions=(tile_size, tile_size), - paths=path_param - ) + paths=path_param, + lazy_tiles=False + ).cache() # schema is tile_path and tile # df.printSchema() @@ -743,6 +743,9 @@ def l8path(b): print(path_count.toPandas()) self.assertTrue(path_count.count() == 3) + def test_raster_source_catalog_reader(self): + import pandas as pd + scene_dict = { 1: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/041/LC08_L1TP_015041_20190305_20190309_01_T1/LC08_L1TP_015041_20190305_20190309_01_T1_B{}.TIF', 2: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/042/LC08_L1TP_015042_20190305_20190309_01_T1/LC08_L1TP_015042_20190305_20190309_01_T1_B{}.TIF', @@ -767,7 +770,8 @@ def path(scene, band): path_df = self.spark.read.raster( tile_dimensions=(512, 512), catalog=path_table, - catalog_col_names=catalog_columns + catalog_col_names=catalog_columns, + lazy_tiles=True # We'll get an OOM error if we try to read 9 scenes all at once! ) self.assertTrue(len(path_df.columns) == 6) # three bands times {path, tile} From 98fab79ac4aebe8fc2392ac1d18ae557a111ab90 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 2 Jul 2019 21:02:21 -0400 Subject: [PATCH 217/380] Added conversion of .pymd files not Jupyter Notebooks, and include in rf-notebook. --- pyrasterframes/build.sbt | 9 ++++++++- pyrasterframes/src/main/python/setup.py | 13 +++++++++++-- rf-notebook/build.sbt | 19 +++++++++++++------ rf-notebook/src/main/docker/Dockerfile | 1 + 4 files changed, 33 insertions(+), 9 deletions(-) diff --git a/pyrasterframes/build.sbt b/pyrasterframes/build.sbt index 0b6575e7e..707f6ce14 100644 --- a/pyrasterframes/build.sbt +++ b/pyrasterframes/build.sbt @@ -5,7 +5,6 @@ addCommandAlias("pyBuild", "pyrasterframes/package") exportJars := true Python / doc / sourceDirectory := (Python / target).value / "docs" Python / doc / target := (Python / target).value / "docs" - //(Compile / target).value / "py-markdown" Python / doc := (Python / doc / target).toTask.dependsOn( Def.sequential( assembly, @@ -16,6 +15,14 @@ Python / doc := (Python / doc / target).toTask.dependsOn( doc := (Python / doc).value +val nbInclude = Def.setting[FileFilter](GlobFilter("*.ipynb")) + +lazy val pyNotebooks = taskKey[Seq[File]]("Convert relevant scripts into notebooks") +pyNotebooks := { + val _ = pySetup.toTask(" notebooks").value + ((Python / doc / target).value ** "*.ipynb").get() +} + lazy val pySparkCmd = taskKey[Unit]("Create build and emit command to run in pyspark") pySparkCmd := { val s = streams.value diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 0a2b9aac5..459383bc5 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -69,6 +69,9 @@ def finalize_options(self): if isinstance(self.files, str): self.files = filter(lambda s: len(s) > 0, re.split(',', self.files)) + def doctype(self): + return "markdown" + def run(self): """Run pweave.""" import traceback @@ -80,11 +83,16 @@ def run(self): try: pweave.weave( file=str(file), - doctype='markdown' + doctype=self.doctype() ) except Exception: print(_divided('%s Failed:' % file)) print(traceback.format_exc()) + exit(1) + +class PweaveNotebooks(PweaveDocs): + def doctype(self): + return "notebook" setup( name='pyrasterframes', @@ -151,6 +159,7 @@ def run(self): zip_safe=False, test_suite="pytest-runner", cmdclass={ - 'pweave': PweaveDocs + 'pweave': PweaveDocs, + 'notebooks': PweaveNotebooks } ) diff --git a/rf-notebook/build.sbt b/rf-notebook/build.sbt index 8a1d44b2a..753f13cef 100644 --- a/rf-notebook/build.sbt +++ b/rf-notebook/build.sbt @@ -13,14 +13,21 @@ Docker / target := target.value / "docker" dockerUpdateLatest := true -Docker / mappings := { - val dockerSrc = (Docker / sourceDirectory).value - val dockerAssets = (dockerSrc ** "*") pair Path.relativeTo(dockerSrc) +Docker / mappings := Def.sequential( + LocalProject("pyrasterframes") / pyWhl, + Def.task { + val dockerSrc = (Docker / sourceDirectory).value + val dockerAssets = (dockerSrc ** "*") pair Path.relativeTo(dockerSrc) - val py = (LocalProject("pyrasterframes") / pyWhl).value + val py = (LocalProject("pyrasterframes") / pyWhl).value + val _ = (LocalProject("pyrasterframes") / pySetup).toTask(" notebooks").value - dockerAssets ++ Seq(py -> py.getName) -} + val nbFiles = ((LocalProject("pyrasterframes") / Python / doc / target).value ** "*.ipynb").get() + + val examples = nbFiles.map(f => (f, "examples/" + f.getName)) + dockerAssets ++ Seq(py -> py.getName) ++ examples + } +).value // This bypasses the standard DockerPlugin DSL-based Dockerfile construction // and just copies the separate, external one. diff --git a/rf-notebook/src/main/docker/Dockerfile b/rf-notebook/src/main/docker/Dockerfile index cf9b54ba7..023e1ee17 100644 --- a/rf-notebook/src/main/docker/Dockerfile +++ b/rf-notebook/src/main/docker/Dockerfile @@ -39,3 +39,4 @@ USER $NB_UID COPY jupyter_notebook_config.py $HOME/.jupyter +COPY examples $HOME/examples From 8a9a53ea6338375c87ac403984f4d0ae436c311c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 8 Jul 2019 09:24:38 -0400 Subject: [PATCH 218/380] Updating documentation on the documentation process, with the hope of making it easier for others to contribute. --- docs/README.md | 100 +++++++++++++++++- docs/documentation-principles.md | 98 +++++++++++++++++ pyrasterframes/README.md | 7 +- .../src/main/python/docs/description.md | 2 +- .../src/main/python/docs/local-algebra.pymd | 3 +- 5 files changed, 199 insertions(+), 11 deletions(-) create mode 100644 docs/documentation-principles.md diff --git a/docs/README.md b/docs/README.md index 4ea8233a2..e8b3071f8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,4 +1,100 @@ -# RasterFrames Documentation Build +# RasterFrames Documentation +The conceptual principles to consider when writing RasterFrames users' documentation are covered in [Documentation Principles](documentation-principles.md). This document covers the mechanics of writing, evaluating, and building the documentation during the writing process. + +## Organization + +The documentation build is a two step process, whereby two sources (three if API docs are included) are merged together and converted into a static HTML website. They are: + +* Technical content and Python examples: `/pyrasterframes/src/main/python/docs` * Global documentation assets and Scala specific content: `/docs/src/main/paradox` -* Technical content and Python examples: `/pyrasterframes/src/main/python/docs` \ No newline at end of file + +The build constructs in `/docs` are (due to legacy reasons) the top-level mechanisms of bringing it all together, but the meat of the content is in `/pyrasterframes/...`, and will be the focus of most of this document. + +## Prerequisites + +* [`sbt`](https://www.scala-sbt.org/) +* Python 3 +* Markdown editor. [Visual Studio Code](https://code.visualstudio.com/) with [`language-weave` extension](https://marketplace.visualstudio.com/items?itemName=jameselderfield.language-weave) is one option. [Atom](https://atom.io/) is another which might actually have better support for evaluating code in Markdown, but I've not tried it. + +> Note: If you're using Visual Studio Code, you can associate the `.pymd` with the `language-weave` plugin by adding this to your `settings.json` file. + +```json +"files.associations": { + "*.pymd": "pweave_md" +} +``` + +## Content Development Process + +Start with one of the existing files in `/pyrasterframes/src/main/python/docs` as a template. [`local-algebra.pymd`](../pyrasterframes/src/main/python/docs/local-algebra.pymd) is a good example. If the content will have code blocks you want evaluated an results injected into the output, use the file extension `.pymd`. If the content doesn't use evaluatable code blocks, use `.md`. + +All `.pymd` files are processed with a tool called [Pweave](http://mpastell.com/pweave), which produces a regular Markdown file where identified code blocks are evaluated and their results (optionally) included in the text. Matplot lib is supported! It is much like `knitr` in the R community. If we run into issues with Pweave, we can also consider [`knitpy`](https://github.com/jankatins/knitpy) or [`codebraid`](https://github.com/gpoore/codebraid). Codebraid looks particularly powerful, so we may think to transition to it. + +Pweave has a number of [code chunk options](http://mpastell.com/pweave/chunks.html) for controlling the output. Refer to those documents on details, and experiment a little to see what conveys your intent best. + +To set up an environment whereby you can easily test/evaluate your code blocks during writing: + +1. Run `sbt` from the `` directory. You should get output that looks something like: + ``` + $ sbt + ... + [info] Loading settings for project pyrasterframes from build.sbt ... + [info] Loading settings for project rf-notebook from build.sbt ... + [info] Set current project to RasterFrames (in build file:/) + sbt:RasterFrames> + ``` +2. The first time you check out the code, or whenever RasterFrames code is updated, you need to build the project artifacts so they are available for Pweave. + ``` + sbt:RasterFrames> pyrasterframes/package + [info] Compiling 4 Scala sources to /core/target/scala-2.11/classes ... + ... lots of noise ... + [info] PyRasterFrames assembly written to '/pyrasterframes/target/python/deps/jars/pyrasterframes-assembly-0.8.0-SNAPSHOT.jar' + [info] Synchronizing 44 files to '/pyrasterframes/target/python' + [info] Running 'python setup.py build bdist_wheel' in '/pyrasterframes/target/python' + ... more noise ... + [info] Python .whl file written to '/pyrasterframes/target/python/dist/pyrasterframes-0.8.0.dev0-py2.py3-none-any.whl' + [info] Maven Python .zip artifact written to '/pyrasterframes/target/scala-2.11/pyrasterframes-python-0.8.0-SNAPSHOT.zip' + [success] Total time: 83 s, completed Jul 5, 2019 12:25:48 PM + sbt:RasterFrames> + ``` +3. To evaluate all the `.pymd` files, run: + ``` + sbt:RasterFrames> pyrasterframes/pySetup pweave + ``` + To build the artifact (step 1) and evaluate all the `.pymd` files, you can run: + ``` + sbt:RasterFrames> pyrasterframes/doc + ``` + There's a command alias for this last step: `pyDocs`. +4. To evaluate a single `.pymd` file, you pass the `-f` option and the filename relative to the `python` direoctry: + ``` + sbt:RasterFrames> pyrasterframes/pySetup pweave -f docs/getting-started.pymd + [info] Synchronizing 44 files to '/pyrasterframes/target/python' + [info] Running 'python setup.py pweave -f docs/getting-started.pymd' in '/pyrasterframes/target/python' + running pweave + -------------------------------------------------- + Running getting-started + -------------------------------------------------- + status + status + Processing chunk 1 named None from line 14 + ... + Weaved docs/getting-started.pymd to docs/getting-started.md + [success] Total time: 21 s, completed Jul 5, 2019 12:31:09 PM + sbt:RasterFrames> + ``` +5. The _output_ Markdown files are written to `/pyrasterframes/target/python/docs`. _Note_: don't edit any files in the `pyrasterframes/target` directory... they will get overwritten each time `sbt` runs a command. +6. To build all the documentation and convert to a static html site, run: + ```bash + sbt makeSite + ``` + Results will be found in `/docs/target/site`. + +## Notebooks + +The `rf-notebooks` sub-project creates a Docker image with Jupyter Notebooks pre-configured with RasterFrames. Any `.pymd` file under `.../python/docs/` is converted to an evaluated Jupyter Notebook and included as a part of the build (an additional bonus of the Pweave tool). + +## Submission Process + +Submit new and updated documentation as a PR against locationtech/rasterframes. Make sure you've signed the Eclipse Foundation ECA and you ["Signed-off-by:"](https://stackoverflow.com/questions/1962094/what-is-the-sign-off-feature-in-git-for) each commit in the PR. The "Signed-off-by" address needs to be the exact same one as registered with the [Eclipse Foundation](https://wiki.eclipse.org/Development_Resources/Contributing_via_Git). diff --git a/docs/documentation-principles.md b/docs/documentation-principles.md new file mode 100644 index 000000000..3f626ddb8 --- /dev/null +++ b/docs/documentation-principles.md @@ -0,0 +1,98 @@ +# Documentation Principles + +This document outlines some concrete considerations for the planned rewrite of the _RasterFrames Users' Manual_. +See [`docs/README.md`](https://github.com/locationtech/rasterframes/blob/develop/docs/README.md) for technical details on the mechanics of building the documentation. + +## Title + +The project is "RasterFrames". Documentation shall use the name "RasterFrames". The RasterFrames runtime is deployed in two forms: `rasterframes` (for Scala/Java/SQL-only), and `pyrasterframes` (Python). But the user should know and think of the project as one thing: RasterFrames. + +## Format + +The documentation shall be rendered in Markdown (`.md`) and Python Markdown (`.pymd`). The source of this documentation is committed in the same project as the code, in `pyrasterframes/src/main/python/docs`. Additional details on processing the docs can be found [here](https://github.com/locationtech/rasterframes/tree/develop/pyrasterframes#running-python-markdown-sources). + +Filenames shall be in skewer case; lower case with dashes ('-') separating words. For example, `foo-in-bar-with-baz.md`. + +## Target Audience + +The target audience for the _RasterFrames User's Manual_ is the intermediate data scientist or developer, already adept at either Python or Scala. Eventually this should be expanded to include SQL adepts. This user may or may not be an expert at EO data usage, so attention to jargon, undefined terms, new concepts etc. should be kept in mind, making use of authoritative external resources to fill in knowledge. + +> Enumerate concepts they are aware of, including: +> * Scene discretization +> * Temporal revisit rate +> * Spatial resolution +> * Spatial extent + +The user may or may not be familiar with Apache Spark, so they should also be guided in filling in minimum requisite knowledge. At a minimum we have to explain what a `SparkSession` is, and that we have to configure it; note the difference between an "action" and "transformation"; what a "collect" action is, and the consequences if the data is large; awareness of partitioning. + +There's also an opportunity to emphasize the scalability benefits over, say, a rasterio/Pandas-only solution (but that we interop with them too). + +The users' goals with EO data are could be from a number of different perspectives: + +* Creating map layers +* Statistical analysis +* Machine learning +* Change detection +* Chip preparation + +While the emphasis of the documentation should be on the core capabilities (and flexibility therein) of RasterFrames, a nod toward these various needs in the examples shown can go a long way in helping the user understand appropriateness of the library to their problem domain. + +## Pedagogical Technique + +The documentation shall emphasize the use of executable code examples, with interspersed prose to explain them. The RasterFrames tooling supports the `.pymd` (Python Markdown) format whereby delimited code blocks are evaluated at build time in order to include output/results. The project currently uses ['Pweave'](http://mpastell.com/pweave/chunks.html) to do this (this may change, but `.pymd` will remain the source format). `Pweave` also has the ability to convert `.pymd` to Jupyter Notebooks, which may serve useful. Through this process we can be assured that any examples shown are code the user can copy into their own projects. + +Visuals are always helpful, but even more so when there's a lot of code involved that needs continual contextualization and explanation. `Pweave` supports rendering of `matplotlib` charts/images, a capability we should make use of. Furthermore, where beneficial, we should create diagrams or other visuals to help express concepts and relationships. + +This "code-first" focus is admittedly in tension with the competing need to explain some of the more abstract aspects of distributed computing necessary for advanced monitoring, profiling, optimization, and deployment. We should evolve the documentation over the long term to address some of these needs, but in the near term the focus should be on the core conceptual model necessary for understanding tile processing. Diagrams can be helpful here. + +## Polyglot Considerations + +In terms of implementation, RasterFrames is a Scala project first. All algorithmic, data modeling, and heavy lifting, etc. are implemented in Scala. + +However, due to user base preferences, RasterFrames is primarily _deployed_ through Python. As such, documentation, examples, etc. should first be implemented in Python. + +Secondarily to that, SQL should be used to highlight the analyst-friendly expression of the functionality in SQL. At least a handful of examples in a dedicated SQL page would go far in showing the cross-language support. + +Thirdly, Scala developers should be encouraged to use the platform, clearly stating that the APIs are on equal footing, using consistent naming conventions, etc. and that most examples should translate almost one-to-one. + +In the long term I'd love to see Python, Scala, and SQL all treated in equal footing, with examples expressed in all languages, but that's a tall order this early in the project development. + +## User Journey + +As noted in the _Target Audience_ section, the documentation needs to guide the user through process from curiosity around EO data to scalable processing of it. Within the first section or so the user should see an example that reads an image and does something somewhat compelling with it, noting that the same code will work on a laptop with a small amount of imagery, as well as on 100s of computers with TB (or more) of imagery. Problems "solved in the small" can be grown to "global scale". + +With a "journey" focus, concepts and capabilities are introduced incrementally, building upon previous examples and concepts, adding more complexity as it develops. Once the fundamentals are covered, we then move into the examples that are closer to use-cases or cookbook entries. + +The preliminary outline is a follows, but is open for refinement, rethinking, etc. + +1. Description +2. Architecture +3. Getting Started + * `pyspark` shell + * Jupyter Notebook + * Standalone Python Script +4. Raster Data I/O + * Reading Raster Data + * Writing Raster Data +5. Spatial Relations +6. Raster Processing + * Local Algebra + * “NoData” Handling + * Aggregation + * Time Series + * Spark ML Support + * Pandas and NumPy Interoperability +7. Cookbook Examples +8. Extended Examples / Case Studies +9. Function Reference + +## Hiccups + +During the documentation process we are likely to run into problems whereby the goal of the writer is inhibited by a bug or capability gap in the code. We should use this opportunity to improve the library to provide the optimal user experience before resorting to workarounds or hacks or addition of what might seem to be arbitrary complexity. + +## Testing + +To "be all that we can be", testing the documentation against a new user is a boon. It may be hard to capture volunteers to do this, but we should consider enlisting interns and friends of the company to go through the documentation and give feedback on where gaps exist. + + + diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index 6f82e8ebf..a7c3b3235 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -99,13 +99,8 @@ The markdown documentation in `/pyrasterframes/src/main/python/docs` c sbt pyrasterframes/doc # alias 'pyDoc' ``` -To build the full complement of documentation and generate the HTML website, run: +See [`docs/README.md`](../docs/README.md) for details. -```bash -sbt makeSite -``` - -Results will be found in `/docs/target/site`. ## Creating and Using a Build diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md index c9665ad8d..49df72744 100644 --- a/pyrasterframes/src/main/python/docs/description.md +++ b/pyrasterframes/src/main/python/docs/description.md @@ -1,6 +1,6 @@ # Description -Human beings have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. +We have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. Today, DataFrames are the _lingua franca_ of data science. The evolution of the tabular form has continued with Apache Spark SQL, which brings DataFrames to the big data distributed compute space. Through several novel innovations, Spark SQL enables interactive and batch-oriented cluster computing without having to be versed in the highly specialized skills typically required for high-performance computing. As suggested by the name, these DataFrames are manipulatable via standard SQL, as well as the more general-purpose programming languages Python, R, Java, and Scala. diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index 6f9d03b69..c90f24322 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -1,3 +1,4 @@ +# Local Map Algebra ```python, echo=False from IPython.core.display import display, HTML @@ -11,8 +12,6 @@ import os spark = create_rf_spark_session() ``` -# Local Map Algebra - [Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single `tile`, between a `tile` and a scalar, between two `tile`s, or among many `tile`s. These operations are common in processing of earth observation and other image data. From ffc5e7d20cb7d36596bb9785c6735ac0b4429d5d Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 8 Jul 2019 11:03:34 -0400 Subject: [PATCH 219/380] Enableing core dumps in CircleCI --- .circleci/config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 431dcb2ac..262f3ce13 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -30,6 +30,9 @@ _save_cache: &save_cache - ~/.sbt - ~/.rf_cache +before_script: + - ulimit -c unlimited -S + jobs: staticAnalysis: <<: *defaults From e2eacb2b7703e433c160c1fb064f64c83dd18323 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 8 Jul 2019 12:41:36 -0400 Subject: [PATCH 220/380] CircleCI tweaks and fixes. (#183) * Enableing core dumps in CircleCI * Adding CircleCI job for building docs. Adding core file archiving. * Fixed core dump copy to ignore errors. * Added matplotlib to setup_requires. * Fixed list indentation. * Experimenting with invoking subproject tests individually. * Changed docs archive destination in CircleCI --- .circleci/config.yml | 118 ++++++++++++------ .../src/main/python/docs/raster-io.pymd | 20 +-- pyrasterframes/src/main/python/setup.py | 1 + 3 files changed, 90 insertions(+), 49 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 431dcb2ac..4e28ab89c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -31,63 +31,60 @@ _save_cache: &save_cache - ~/.rf_cache jobs: - staticAnalysis: + test: <<: *defaults - + resource_class: large steps: - checkout - run: *setenv - restore_cache: <<: *restore_cache - - run: cat /dev/null | sbt dependencyCheck - - run: cat /dev/null | sbt --debug dumpLicenseReport + - run: ulimit -c unlimited -S + - run: cat /dev/null | sbt -batch core/test datasource/test experimental/test pyrasterframes/test + - run: + command: | + mkdir -p /tmp/core_dumps + cp core.* *.hs /tmp/core_dumps 2> /dev/null || true + when: on_fail - - run: *unsetenv + - store_artifacts: + path: /tmp/core_dumps + - run: *unsetenv - save_cache: <<: *save_cache - - store_artifacts: - path: datasource/target/scala-2.11/dependency-check-report.html - destination: dependency-check-report-datasource.html - - store_artifacts: - path: experimental/target/scala-2.11/dependency-check-report.html - destination: dependency-check-report-experimental.html - - store_artifacts: - path: core/target/scala-2.11/dependency-check-report.html - destination: dependency-check-report-core.html - - store_artifacts: - path: pyrasterframes/target/scala-2.11/dependency-check-report.html - destination: dependency-check-report-pyrasterframes.html - test: + docs: <<: *defaults - resource_class: large + resource_class: xlarge steps: - checkout - run: *setenv + - restore_cache: <<: *restore_cache - - run: cat /dev/null | sbt test + - run: ulimit -c unlimited -S + - run: + command: cat /dev/null | sbt makeSite + no_output_timeout: 30m - - run: *unsetenv - - save_cache: - <<: *save_cache + - run: + command: | + mkdir -p /tmp/core_dumps + cp core.* *.hs /tmp/core_dumps 2> /dev/null || true + when: on_fail - publish: - <<: *defaults - resource_class: large - steps: - - checkout - - run: *setenv - - restore_cache: - <<: *restore_cache + - store_artifacts: + path: /tmp/core_dumps - - run: cat /dev/null | sbt test - - run: cat /dev/null | sbt publish + - store_artifacts: + path: docs/target/site + destination: rf-site - run: *unsetenv + - save_cache: <<: *save_cache @@ -101,9 +98,20 @@ jobs: - restore_cache: <<: *restore_cache + - run: ulimit -c unlimited -S - run: command: cat /dev/null | sbt it:test no_output_timeout: 30m + + - run: + command: | + mkdir -p /tmp/core_dumps + cp core.* *.hs /tmp/core_dumps 2> /dev/null || true + when: on_fail + + - store_artifacts: + path: /tmp/core_dumps + - run: *unsetenv - save_cache: @@ -131,6 +139,36 @@ jobs: - save_cache: <<: *save_cache + staticAnalysis: + <<: *defaults + + steps: + - checkout + - run: *setenv + - restore_cache: + <<: *restore_cache + + - run: cat /dev/null | sbt dependencyCheck + - run: cat /dev/null | sbt --debug dumpLicenseReport + + - run: *unsetenv + + - save_cache: + <<: *save_cache + - store_artifacts: + path: datasource/target/scala-2.11/dependency-check-report.html + destination: dependency-check-report-datasource.html + - store_artifacts: + path: experimental/target/scala-2.11/dependency-check-report.html + destination: dependency-check-report-experimental.html + - store_artifacts: + path: core/target/scala-2.11/dependency-check-report.html + destination: dependency-check-report-core.html + - store_artifacts: + path: pyrasterframes/target/scala-2.11/dependency-check-report.html + destination: dependency-check-report-pyrasterframes.html + + workflows: version: 2 all: @@ -146,12 +184,13 @@ workflows: branches: only: - /feature\/.*-its/ -# - publish: -# filters: -# branches: -# only: -# - develop - nightlyReleaseAstraea: + - docs: + filters: + branches: + only: + - /feature\/.*docs.*/ + + nightly: triggers: - schedule: cron: "0 8 * * *" @@ -162,4 +201,5 @@ workflows: jobs: - it - itWithoutGdal + - docs - staticAnalysis diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-io.pymd index 6bc2d3a37..423de7d82 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-io.pymd @@ -5,22 +5,22 @@ The standard mechanism by which any data is brought in and out of a Spark Datafr Three types of DataSources will be introduced below: * Catalog Readers - - `aws-pds-l8-catalog`: experimental - - `aws-pds-modis-catalog`: experimental - - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] + - `aws-pds-l8-catalog`: experimental + - `aws-pds-modis-catalog`: experimental + - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] * Raster Readers - - `raster`: the standard reader for most operations - - `geotrellis` (for reading [GeoTrellis layers][GTLayer]) - - `geotiff`: a deprecated reader for reading single GeoTIFF files + - `raster`: the standard reader for most operations + - `geotrellis` (for reading [GeoTrellis layers][GTLayer]) + - `geotiff`: a deprecated reader for reading single GeoTIFF files * Raster Writers - - `geotrellis`: for creating [GeoTrellis layers][GTLayer] - - `geotiff`: beta - - `parquet`: for writing raster data in an analytics functional form + - `geotrellis`: for creating [GeoTrellis layers][GTLayer] + - `geotiff`: beta + - `parquet`: for writing raster data in an analytics functional form There's also some support for vector data (for masking and data labeling): * Vector Readers - - `geojson`: read GeoJson files with `geometry` column aside attribute values + - `geojson`: read GeoJson files with `geometry` column aside attribute values ## Reading Raster Data diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 459383bc5..35ae8a8d2 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -120,6 +120,7 @@ def doctype(self): 'shapely', 'pyspark<2.4', 'numpy>=1.7', + 'matplotlib<3.0.0', 'pandas', 'pytest-runner', 'setuptools>=0.8', From d4bb4f140547b797741ec380d810477b807eb219 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 10 Jul 2019 11:14:24 -0400 Subject: [PATCH 221/380] Converted generic varargs to named args for various Python rf_ functions to improve readability and discoverability. --- .../python/pyrasterframes/rasterfunctions.py | 244 +++++++++--------- .../src/main/python/pyrasterframes/utils.py | 2 +- 2 files changed, 124 insertions(+), 122 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 6b6620a84..587891614 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -99,10 +99,10 @@ def st_reproject(geometry_col, src_crs_name, dst_crs_name): return Column(jfcn(_to_java_column(geometry_col), src_crs_name, dst_crs_name)) -def rf_explode_tiles(*args): +def rf_explode_tiles(*tile_cols): """Create a row for each cell in Tile.""" jfcn = RFContext.active().lookup('rf_explode_tiles') - jcols = [_to_java_column(arg) for arg in args] + jcols = [_to_java_column(arg) for arg in tile_cols] return Column(jfcn(RFContext.active().list_to_seq(jcols))) @@ -243,300 +243,302 @@ def _apply_column_function(name, *args): return Column(jfcn(*jcols)) -def rf_dimensions(*args): +def rf_dimensions(tile_col): """Query the number of (cols, rows) in a Tile.""" - return _apply_column_function('rf_dimensions', *args) + return _apply_column_function('rf_dimensions', tile_col) -def rf_tile_to_array_int(*args): +def rf_tile_to_array_int(tile_col): """Flattens Tile into an array of integers.""" - return _apply_column_function('rf_tile_to_array_int', *args) + return _apply_column_function('rf_tile_to_array_int', tile_col) -def rf_tile_to_array_double(*args): +def rf_tile_to_array_double(tile_col): """Flattens Tile into an array of doubles.""" - return _apply_column_function('rf_tile_to_array_double', *args) + return _apply_column_function('rf_tile_to_array_double', tile_col) -def rf_cell_type(*args): +def rf_cell_type(tile_col): """Extract the Tile's cell type""" - return _apply_column_function('rf_cell_type', *args) + return _apply_column_function('rf_cell_type', tile_col) -def rf_is_no_data_tile(*args): +def rf_is_no_data_tile(tile_col): """Report if the Tile is entirely NODDATA cells""" - return _apply_column_function('rf_is_no_data_tile', *args) + return _apply_column_function('rf_is_no_data_tile', tile_col) -def rf_exists(*args): +def rf_exists(tile_col): """Returns true if any cells in the tile are true (non-zero and not NoData)""" - return _apply_column_function('rf_exists', *args) + return _apply_column_function('rf_exists', tile_col) -def rf_for_all(*args): +def rf_for_all(tile_col): """Returns true if all cells in the tile are true (non-zero and not NoData).""" - return _apply_column_function('rf_for_all', *args) + return _apply_column_function('rf_for_all', tile_col) -def rf_agg_approx_histogram(*args): +def rf_agg_approx_histogram(tile_col): """Compute the full column aggregate floating point histogram""" - return _apply_column_function('rf_agg_approx_histogram', *args) + return _apply_column_function('rf_agg_approx_histogram', tile_col) -def rf_agg_stats(*args): +def rf_agg_stats(tile_col): """Compute the full column aggregate floating point statistics""" - return _apply_column_function('rf_agg_stats', *args) + return _apply_column_function('rf_agg_stats', tile_col) -def rf_agg_mean(*args): +def rf_agg_mean(tile_col): """Computes the column aggregate mean""" - return _apply_column_function('rf_agg_mean', *args) + return _apply_column_function('rf_agg_mean', tile_col) -def rf_agg_data_cells(*args): +def rf_agg_data_cells(tile_col): """Computes the number of non-NoData cells in a column""" - return _apply_column_function('rf_agg_data_cells', *args) + return _apply_column_function('rf_agg_data_cells', tile_col) -def rf_agg_no_data_cells(*args): +def rf_agg_no_data_cells(tile_col): """Computes the number of NoData cells in a column""" - return _apply_column_function('rf_agg_no_data_cells', *args) + return _apply_column_function('rf_agg_no_data_cells', tile_col) -def rf_tile_histogram(*args): +def rf_tile_histogram(tile_col): """Compute the Tile-wise histogram""" - return _apply_column_function('rf_tile_histogram', *args) + return _apply_column_function('rf_tile_histogram', tile_col) -def rf_tile_mean(*args): +def rf_tile_mean(tile_col): """Compute the Tile-wise mean""" - return _apply_column_function('rf_tile_mean', *args) + return _apply_column_function('rf_tile_mean', tile_col) -def rf_tile_sum(*args): +def rf_tile_sum(tile_col): """Compute the Tile-wise sum""" - return _apply_column_function('rf_tile_sum', *args) + return _apply_column_function('rf_tile_sum', tile_col) -def rf_tile_min(*args): +def rf_tile_min(tile_col): """Compute the Tile-wise minimum""" - return _apply_column_function('rf_tile_min', *args) + return _apply_column_function('rf_tile_min', tile_col) -def rf_tile_max(*args): +def rf_tile_max(tile_col): """Compute the Tile-wise maximum""" - return _apply_column_function('rf_tile_max', *args) + return _apply_column_function('rf_tile_max', tile_col) -def rf_tile_stats(*args): +def rf_tile_stats(tile_col): """Compute the Tile-wise floating point statistics""" - return _apply_column_function('rf_tile_stats', *args) + return _apply_column_function('rf_tile_stats', tile_col) -def rf_render_ascii(*args): +def rf_render_ascii(tile_col): """Render ASCII art of tile""" - return _apply_column_function('rf_render_ascii', *args) + return _apply_column_function('rf_render_ascii', tile_col) -def rf_render_matrix(*args): +def rf_render_matrix(tile_col): """Render Tile cell values as numeric values, for debugging purposes""" - return _apply_column_function('rf_render_matrix', *args) + return _apply_column_function('rf_render_matrix', tile_col) -def rf_no_data_cells(*args): +def rf_no_data_cells(tile_col): """Count of NODATA cells""" - return _apply_column_function('rf_no_data_cells', *args) + return _apply_column_function('rf_no_data_cells', tile_col) -def rf_data_cells(*args): +def rf_data_cells(tile_col): """Count of cells with valid data""" - return _apply_column_function('rf_data_cells', *args) + return _apply_column_function('rf_data_cells', tile_col) -def rf_local_add(*args): +def rf_local_add(tile_col): """Add two Tiles""" - return _apply_column_function('rf_local_add', *args) + return _apply_column_function('rf_local_add', tile_col) -def rf_local_subtract(*args): +def rf_local_subtract(tile_col): """Subtract two Tiles""" - return _apply_column_function('rf_local_subtract', *args) + return _apply_column_function('rf_local_subtract', tile_col) -def rf_local_multiply(*args): +def rf_local_multiply(tile_col): """Multiply two Tiles""" - return _apply_column_function('rf_local_multiply', *args) + return _apply_column_function('rf_local_multiply', tile_col) -def rf_local_divide(*args): +def rf_local_divide(tile_col): """Divide two Tiles""" - return _apply_column_function('rf_local_divide', *args) + return _apply_column_function('rf_local_divide', tile_col) -def rf_normalized_difference(*args): +def rf_normalized_difference(tile_col): """Compute the normalized difference of two tiles""" - return _apply_column_function('rf_normalized_difference', *args) + return _apply_column_function('rf_normalized_difference', tile_col) -def rf_agg_local_max(*args): +def rf_agg_local_max(tile_col): """Compute the cell-wise/local max operation between Tiles in a column.""" - return _apply_column_function('rf_agg_local_max', *args) + return _apply_column_function('rf_agg_local_max', tile_col) -def rf_agg_local_min(*args): +def rf_agg_local_min(tile_col): """Compute the cellwise/local min operation between Tiles in a column.""" - return _apply_column_function('rf_agg_local_min', *args) + return _apply_column_function('rf_agg_local_min', tile_col) -def rf_agg_local_mean(*args): +def rf_agg_local_mean(tile_col): """Compute the cellwise/local mean operation between Tiles in a column.""" - return _apply_column_function('rf_agg_local_mean', *args) + return _apply_column_function('rf_agg_local_mean', tile_col) -def rf_agg_local_data_cells(*args): +def rf_agg_local_data_cells(tile_col): """Compute the cellwise/local count of non-NoData cells for all Tiles in a column.""" - return _apply_column_function('rf_agg_local_data_cells', *args) + return _apply_column_function('rf_agg_local_data_cells', tile_col) -def rf_agg_local_no_data_cells(*args): +def rf_agg_local_no_data_cells(tile_col): """Compute the cellwise/local count of NoData cells for all Tiles in a column.""" - return _apply_column_function('rf_agg_local_no_data_cells', *args) + return _apply_column_function('rf_agg_local_no_data_cells', tile_col) -def rf_agg_local_stats(*args): +def rf_agg_local_stats(tile_col): """Compute cell-local aggregate descriptive statistics for a column of Tiles.""" - return _apply_column_function('rf_agg_local_stats', *args) + return _apply_column_function('rf_agg_local_stats', tile_col) -def rf_mask(*args): +def rf_mask(tile_col): """Where the rf_mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.""" - return _apply_column_function('rf_mask', *args) + return _apply_column_function('rf_mask', tile_col) -def rf_inverse_mask(*args): +def rf_inverse_mask(tile_col): """Where the rf_mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.""" - return _apply_column_function('rf_inverse_mask', *args) + return _apply_column_function('rf_inverse_mask', tile_col) -def rf_local_less(*args): +def rf_local_less(tile_col): """Cellwise less than comparison between two tiles""" - return _apply_column_function('rf_local_less', *args) + return _apply_column_function('rf_local_less', tile_col) -def rf_local_less_equal(*args): +def rf_local_less_equal(tile_col): """Cellwise less than or equal to comparison between two tiles""" - return _apply_column_function('rf_local_less_equal', *args) + return _apply_column_function('rf_local_less_equal', tile_col) -def rf_local_greater(*args): +def rf_local_greater(tile_col): """Cellwise greater than comparison between two tiles""" - return _apply_column_function('rf_local_greater', *args) + return _apply_column_function('rf_local_greater', tile_col) -def rf_local_greater_equal(*args): +def rf_local_greater_equal(tile_col): """Cellwise greater than or equal to comparison between two tiles""" - return _apply_column_function('rf_local_greater_equal', *args) + return _apply_column_function('rf_local_greater_equal', tile_col) -def rf_local_equal(*args): +def rf_local_equal(tile_col): """Cellwise equality comparison between two tiles""" - return _apply_column_function('rf_local_equal', *args) + return _apply_column_function('rf_local_equal', tile_col) -def rf_local_unequal(*args): +def rf_local_unequal(tile_col): """Cellwise inequality comparison between two tiles""" - return _apply_column_function('rf_local_unequal', *args) + return _apply_column_function('rf_local_unequal', tile_col) -def rf_round(*args): +def rf_round(tile_col): """Round cell values to the nearest integer without changing the cell type""" - return _apply_column_function('rf_round', *args) + return _apply_column_function('rf_round', tile_col) -def rf_abs(*args): +def rf_abs(tile_col): """Compute the absolute value of each cell""" - return _apply_column_function('rf_abs', *args) + return _apply_column_function('rf_abs', tile_col) -def rf_log(*args): +def rf_log(tile_col): """Performs cell-wise natural logarithm""" - return _apply_column_function('rf_log', *args) + return _apply_column_function('rf_log', tile_col) -def rf_log10(*args): +def rf_log10(tile_col): """Performs cell-wise logartithm with base 10""" - return _apply_column_function('rf_log10', *args) + return _apply_column_function('rf_log10', tile_col) -def rf_log2(*args): +def rf_log2(tile_col): """Performs cell-wise logartithm with base 2""" - return _apply_column_function('rf_log2', *args) + return _apply_column_function('rf_log2', tile_col) -def rf_log1p(*args): +def rf_log1p(tile_col): """Performs natural logarithm of cell values plus one""" - return _apply_column_function('rf_log1p', *args) + return _apply_column_function('rf_log1p', tile_col) -def rf_exp(*args): +def rf_exp(tile_col): """Performs cell-wise exponential""" - return _apply_column_function('rf_exp', *args) + return _apply_column_function('rf_exp', tile_col) -def rf_exp2(*args): +def rf_exp2(tile_col): """Compute 2 to the power of cell values""" - return _apply_column_function('rf_exp2', *args) + return _apply_column_function('rf_exp2', tile_col) -def rf_exp10(*args): +def rf_exp10(tile_col): """Compute 10 to the power of cell values""" - return _apply_column_function('rf_exp10', *args) + return _apply_column_function('rf_exp10', tile_col) -def rf_expm1(*args): +def rf_expm1(tile_col): """Performs cell-wise exponential, then subtract one""" - return _apply_column_function('rf_expm1', *args) + return _apply_column_function('rf_expm1', tile_col) -def rf_identity(*args): +def rf_identity(tile_col): """Pass tile through unchanged""" - return _apply_column_function('rf_identity', *args) + return _apply_column_function('rf_identity', tile_col) -def rf_resample(*args): - """Resample tile to different size based on scalar factor or tile whose dimension to match""" - return _apply_column_function('rf_resample', *args) +def rf_resample(tile_col, scale_factor_col): + """Resample tile to different size based on scalar factor or tile whose dimension to match + Scalar less than one will downsample tile; greater than one will upsample. Uses nearest-neighbor.""" + return _apply_column_function('rf_resample', tile_col, scale_factor_col) -def rf_crs(*args): +def rf_crs(tile_col): """Get the CRS of a RasterSource or ProjectedRasterTile""" - return _apply_column_function('rf_crs', *args) + return _apply_column_function('rf_crs', tile_col) -def st_extent(*args): +def st_extent(geom_col): """Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)""" - return _apply_column_function('st_extent', *args) + return _apply_column_function('st_extent', geom_col) -def rf_extent(*args): +def rf_extent(proj_raster_col): """Get the extent of a RasterSource or ProjectedRasterTile (a tile with embedded extent and CRS)""" - return _apply_column_function('rf_extent', *args) + return _apply_column_function('rf_extent', proj_raster_col) -def rf_tile(*args): +def rf_tile(proj_raster_col): """Extracts the Tile component of a ProjectedRasterTile (or Tile).""" - return _apply_column_function('rf_tile', *args) + return _apply_column_function('rf_tile', proj_raster_col) -def st_geometry(*args): +def st_geometry(geom_col): """Convert the given extent/bbox to a polygon""" - return _apply_column_function('st_geometry', *args) + return _apply_column_function('st_geometry', geom_col) -def rf_geometry(*args): +def rf_geometry(proj_raster_col): """Get the extent of a RasterSource or ProjectdRasterTile as a Geometry""" - return _apply_column_function('rf_geometry', *args) + return _apply_column_function('rf_geometry', proj_raster_col) +# ------ GeoMesa Functions ------ def st_geomFromGeoHash(*args): """""" diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py index 09f64bb16..aef478831 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/utils.py +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -71,7 +71,7 @@ def find_pyrasterframes_assembly(): if not len(jarpath) == 1: raise RuntimeError(""" Expected to find exactly one assembly. Found '{}' instead. -Try running 'sbt pyrasterframes/package' first. """.format(jarpath)) +Try running 'sbt pyrasterframes/clean pyrasterframes/package' first. """.format(jarpath)) return jarpath[0] From 37208eff68f196eace10dba61e7e6ee187f77744 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 10 Jul 2019 11:30:42 -0400 Subject: [PATCH 222/380] Fixed bad explicit parameter definitions in rasterfunctions.py. --- .../python/pyrasterframes/rasterfunctions.py | 64 +++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index 587891614..e342842d9 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -66,22 +66,22 @@ def rf_convert_cell_type(tile_col, cell_type): return Column(jfcn(_to_java_column(tile_col), _parse_cell_type(cell_type))) -def rf_make_constant_tile(value, cols, rows, cell_type): +def rf_make_constant_tile(scalar_value, num_cols, num_rows, cell_type): """Constructor for constant tile column""" jfcn = RFContext.active().lookup('rf_make_constant_tile') - return Column(jfcn(value, cols, rows, cell_type)) + return Column(jfcn(scalar_value, num_cols, num_rows, cell_type)) -def rf_make_zeros_tile(cols, rows, cell_type='float64'): +def rf_make_zeros_tile(num_cols, num_rows, cell_type='float64'): """Create column of constant tiles of zero""" jfcn = RFContext.active().lookup('rf_make_zeros_tile') - return Column(jfcn(cols, rows, cell_type)) + return Column(jfcn(num_cols, num_rows, cell_type)) -def rf_make_ones_tile(cols, rows, cell_type='float64'): +def rf_make_ones_tile(num_cols, num_rows, cell_type='float64'): """Create column of constant tiles of one""" jfcn = RFContext.active().lookup('rf_make_ones_tile') - return Column(jfcn(cols, rows, cell_type)) + return Column(jfcn(num_cols, num_rows, cell_type)) def rf_rasterize(geometry_col, bounds_col, value_col, num_cols, num_rows): @@ -353,29 +353,29 @@ def rf_data_cells(tile_col): return _apply_column_function('rf_data_cells', tile_col) -def rf_local_add(tile_col): +def rf_local_add(left_tile_col, right_tile_col): """Add two Tiles""" - return _apply_column_function('rf_local_add', tile_col) + return _apply_column_function('rf_local_add', left_tile_col, right_tile_col) -def rf_local_subtract(tile_col): +def rf_local_subtract(left_tile_col, right_tile_col): """Subtract two Tiles""" - return _apply_column_function('rf_local_subtract', tile_col) + return _apply_column_function('rf_local_subtract', left_tile_col, right_tile_col) -def rf_local_multiply(tile_col): +def rf_local_multiply(left_tile_col, right_tile_col): """Multiply two Tiles""" - return _apply_column_function('rf_local_multiply', tile_col) + return _apply_column_function('rf_local_multiply', left_tile_col, right_tile_col) -def rf_local_divide(tile_col): +def rf_local_divide(left_tile_col, right_tile_col): """Divide two Tiles""" - return _apply_column_function('rf_local_divide', tile_col) + return _apply_column_function('rf_local_divide', left_tile_col, right_tile_col) -def rf_normalized_difference(tile_col): +def rf_normalized_difference(left_tile_col, right_tile_col): """Compute the normalized difference of two tiles""" - return _apply_column_function('rf_normalized_difference', tile_col) + return _apply_column_function('rf_normalized_difference', left_tile_col, right_tile_col) def rf_agg_local_max(tile_col): @@ -408,44 +408,44 @@ def rf_agg_local_stats(tile_col): return _apply_column_function('rf_agg_local_stats', tile_col) -def rf_mask(tile_col): +def rf_mask(src_tile_col, mask_tile_col): """Where the rf_mask (second) tile contains NODATA, replace values in the source (first) tile with NODATA.""" - return _apply_column_function('rf_mask', tile_col) + return _apply_column_function('rf_mask', src_tile_col, mask_tile_col) -def rf_inverse_mask(tile_col): +def rf_inverse_mask(src_tile_col, mask_tile_col): """Where the rf_mask (second) tile DOES NOT contain NODATA, replace values in the source (first) tile with NODATA.""" - return _apply_column_function('rf_inverse_mask', tile_col) + return _apply_column_function('rf_inverse_mask', src_tile_col, mask_tile_col) -def rf_local_less(tile_col): +def rf_local_less(left_tile_col, right_tile_col): """Cellwise less than comparison between two tiles""" - return _apply_column_function('rf_local_less', tile_col) + return _apply_column_function('rf_local_less', left_tile_col, right_tile_col) -def rf_local_less_equal(tile_col): +def rf_local_less_equal(left_tile_col, right_tile_col): """Cellwise less than or equal to comparison between two tiles""" - return _apply_column_function('rf_local_less_equal', tile_col) + return _apply_column_function('rf_local_less_equal', left_tile_col, right_tile_col) -def rf_local_greater(tile_col): +def rf_local_greater(left_tile_col, right_tile_col): """Cellwise greater than comparison between two tiles""" - return _apply_column_function('rf_local_greater', tile_col) + return _apply_column_function('rf_local_greater', left_tile_col, right_tile_col) -def rf_local_greater_equal(tile_col): +def rf_local_greater_equal(left_tile_col, right_tile_col): """Cellwise greater than or equal to comparison between two tiles""" - return _apply_column_function('rf_local_greater_equal', tile_col) + return _apply_column_function('rf_local_greater_equal', left_tile_col, right_tile_col) -def rf_local_equal(tile_col): +def rf_local_equal(left_tile_col, right_tile_col): """Cellwise equality comparison between two tiles""" - return _apply_column_function('rf_local_equal', tile_col) + return _apply_column_function('rf_local_equal', left_tile_col, right_tile_col) -def rf_local_unequal(tile_col): +def rf_local_unequal(left_tile_col, right_tile_col): """Cellwise inequality comparison between two tiles""" - return _apply_column_function('rf_local_unequal', tile_col) + return _apply_column_function('rf_local_unequal', left_tile_col, right_tile_col) def rf_round(tile_col): From c2b52173613e561c433e92de5f6b976ca61c38dc Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 10 Jul 2019 17:15:03 -0400 Subject: [PATCH 223/380] Restructured IO-related docs. --- .../src/main/python/docs/raster-catalogs.pymd | 164 ++++++++++++++++++ .../src/main/python/docs/raster-io.md | 34 ++++ .../docs/{raster-io.pymd => raster-read.pymd} | 40 ----- .../src/main/python/docs/raster-write.pymd | 11 ++ .../src/main/python/pyrasterframes/utils.py | 2 +- 5 files changed, 210 insertions(+), 41 deletions(-) create mode 100644 pyrasterframes/src/main/python/docs/raster-catalogs.pymd create mode 100644 pyrasterframes/src/main/python/docs/raster-io.md rename pyrasterframes/src/main/python/docs/{raster-io.pymd => raster-read.pymd} (77%) create mode 100644 pyrasterframes/src/main/python/docs/raster-write.pymd diff --git a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd new file mode 100644 index 000000000..33d459ef8 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd @@ -0,0 +1,164 @@ +# Raster Catalogs + +While much interesting processing can be done on single raster files, RasterFrames shines when _Catalogs_ of raster data are to be processed. In its simplest form, a _Catalog_ is a listing of URLs referencing raster files. This listing can be manifested as CSV in a character string or an external file, or as a Spark or Pandas DataFrame. This _Catalog_ then serves as the input into the `raster` DataSource, described in the next page. + +A _Catalog_ can be zero, one or two dimensions: + +* Zero-D: A single URL to a single raster file +* One-D: Multiple URLs in a single column, where all referenced rasters represent the same content type. For example, a column of URLs to Landsat 8 NIR rasters covering Europe. Each row represents different spatiotemporal locations (scenes). +* Two-D: One or more columns of multiple URLs, where each column references the same content type, and each row represents the same spatiotemporal location. For example, red-, green-, and blue-band columns for scenes covering Europe. Each spatiotemporal location (scenes), and each raster cell within it must be of the same dimensions, extent, crs, etc. + +## Creating a Catalog + +This section will provide some examples of creating your own _Catalogs_, as well as introduce some experimental _Catalogs_ built into RasterFrames. The consuption of _Catalogs_ is covered in more detail in the next page. + +```python, echo=False +from IPython.display import display +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +spark = create_rf_spark_session() +``` + +```python +from pyspark.sql import Row +``` + +### Zero-D + +A single URL is this simplest form of a catalog. + +```python +my_cat = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" +# or +my_cat_df = spark.createDataFrame([Row(B01=my_cat)]) +``` + +### One-D + +Example of a single column representing the same content type: + +```python +scene1_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" +scene2_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018188/MCD43A4.A2018188.h04v09.006.2018198232008_B01.TIF" + +# As CSV string +my_cat = '\n'.join(['B01', scene1_B01, scene2_B01]) +# or +my_cat_df = spark.createDataFrame([Row(B01=scene1_B01), Row(B01=scene2_B01)]) +my_cat_df.printSchema() +``` + +### Two-D + +Example of a multiple columns representing multiple content types (bands) across multiple scenes. + +```python +scene1_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" +scene1_B02 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B02.TIF" +scene2_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018188/MCD43A4.A2018188.h04v09.006.2018198232008_B01.TIF" +scene2_B02 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018188/MCD43A4.A2018188.h04v09.006.2018198232008_B02.TIF" + + +# As CSV string +my_cat = '\n'.join(['B01,B02', scene1_B01 + "," + scene1_B02, scene2_B01 + "," + scene2_B02]) +# or +my_cat_df = spark.createDataFrame([Row(B01=scene1_B01, B02=scene1_B02), Row(B01=scene2_B01, B02=scene2_B02)]) +my_cat_df.printSchema() +``` + +## Using External Catalogs + +The simplest example of an external _Catalog_ is a CSV file (or a transformation of) in one of the formats above. Here's an extended example of reading an external CSV file of MODIS scenes and transforming it into a _Catalog_ + +```python +from pyspark import SparkFiles +from pyspark.sql import functions as F + +spark.sparkContext.addFile("https://modis-pds.s3.amazonaws.com/MCD43A4.006/2018-07-04_scenes.txt") + +# The scenes list file has index URIs take the form: +# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/index.html +# Image URIs take the form: +# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF + +modis_catalog = spark.read \ + .format("csv") \ + .option("header", "true") \ + .load(SparkFiles.get("2018-07-04_scenes.txt")) \ + .withColumn('base_url', + F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) + ) \ + .withColumn('B01' , F.concat('base_url', F.lit("_B01.TIF"))) \ + .withColumn('B02' , F.concat('base_url', F.lit("_B02.TIF"))) \ + .withColumn('B03' , F.concat('base_url', F.lit("_B03.TIF"))) +# ... and so on. +modis_catalog.printSchema() +``` + + +## Using Built-in Experimental Catalogs + +RasterFrames comes with two experimental catalogs over the AWS PDS Landsat 8 and MODIS repositories. They are created by downloading the latest scene lists and transforming as in the prior example. + +> Note: The first time you run these may take some time, as the catalogs are large. However, they are cached and subsequent invocations should be faster. + +### MODIS + +```python, evaluate=False +modis_catalog2 = spark.read.format('aws-pds-modis-catalog').load() +modis_catalog2.printSchema() +``` +``` +root + |-- product_id: string (nullable = false) + |-- acquisition_date: timestamp (nullable = false) + |-- granule_id: string (nullable = false) + |-- gid: string (nullable = false) + |-- B01: string (nullable = true) + |-- B01qa: string (nullable = true) + |-- B02: string (nullable = true) + |-- B02qa: string (nullable = true) + |-- B03: string (nullable = true) + |-- B03aq: string (nullable = true) + |-- B04: string (nullable = true) + |-- B04qa: string (nullable = true) + |-- B05: string (nullable = true) + |-- B05qa: string (nullable = true) + |-- B06: string (nullable = true) + |-- B06qa: string (nullable = true) + |-- B07: string (nullable = true) + |-- B07qa: string (nullable = true) +``` + +### Landsat 8 + +```python, evaluate=False +l8 = spark.read.format('aws-pds-l8-catalog').load() +l8.printSchema() +root + |-- product_id: string (nullable = false) + |-- entity_id: string (nullable = false) + |-- acquisition_date: timestamp (nullable = false) + |-- cloud_cover_pct: float (nullable = false) + |-- processing_level: string (nullable = false) + |-- path: short (nullable = false) + |-- row: short (nullable = false) + |-- bounds_wgs84: struct (nullable = false) + | |-- minX: double (nullable = false) + | |-- maxX: double (nullable = false) + | |-- minY: double (nullable = false) + | |-- maxY: double (nullable = false) + |-- B1: string (nullable = true) + |-- B2: string (nullable = true) + |-- B3: string (nullable = true) + |-- B4: string (nullable = true) + |-- B5: string (nullable = true) + |-- B6: string (nullable = true) + |-- B7: string (nullable = true) + |-- B8: string (nullable = true) + |-- B9: string (nullable = true) + |-- B10: string (nullable = true) + |-- B11: string (nullable = true) + |-- BQA: string (nullable = true) +``` + diff --git a/pyrasterframes/src/main/python/docs/raster-io.md b/pyrasterframes/src/main/python/docs/raster-io.md new file mode 100644 index 000000000..60fe0e913 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/raster-io.md @@ -0,0 +1,34 @@ +# Raster Data I/O + +The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames are compatible with existing generalized DataSources, such as Parquet, but provide specialized ones oriented around geospatial raster data. + +Three types of DataSources will be introduced: + +* Catalog Readers + - `aws-pds-l8-catalog`: experimental + - `aws-pds-modis-catalog`: experimental + - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] +* Raster Readers + - `raster`: the standard reader for most operations + - `geotiff`: a simplified reader for reading single GeoTIFF files + - `geotrellis` (for reading [GeoTrellis layers][GTLayer]) +* Raster Writers + - `geotrellis`: for creating [GeoTrellis layers][GTLayer] + - `geotiff`: beta + - `parquet`: for writing raster data in an analytics functional form + +There's also some support for vector data (for masking and data labeling): + +* Vector Readers + - `geojson`: read GeoJson files with `geometry` column aside attribute values + + +@@@ index +* [Raster Catalogs](raster-catalogs.md) +* [Raster Readers](raster-read.md) +* [Raster Writers](raster-write.md) +@@@ + + +[DS]: https://spark.apache.org/docs/latest/sql-data-sources.html +[GTLayer]: https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/raster-io.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd similarity index 77% rename from pyrasterframes/src/main/python/docs/raster-io.pymd rename to pyrasterframes/src/main/python/docs/raster-read.pymd index 423de7d82..b791cbadc 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -1,27 +1,3 @@ -# Raster Data I/O - -The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames are compatible with existing generalized DataSources, such as Parquet, but provide specialized ones oriented around geospatial raster data. - -Three types of DataSources will be introduced below: - -* Catalog Readers - - `aws-pds-l8-catalog`: experimental - - `aws-pds-modis-catalog`: experimental - - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] -* Raster Readers - - `raster`: the standard reader for most operations - - `geotrellis` (for reading [GeoTrellis layers][GTLayer]) - - `geotiff`: a deprecated reader for reading single GeoTIFF files -* Raster Writers - - `geotrellis`: for creating [GeoTrellis layers][GTLayer] - - `geotiff`: beta - - `parquet`: for writing raster data in an analytics functional form - -There's also some support for vector data (for masking and data labeling): - -* Vector Readers - - `geojson`: read GeoJson files with `geometry` column aside attribute values - ## Reading Raster Data ```python, echo=False @@ -164,19 +140,3 @@ rf.show(2, truncate=False) > Need to know _a priori_ how many bands there are, specified with `band_indexes`. > Must be homogenous, or tolerant of `null` Tiles. - -## Writing Raster Data - -### Overviews - -### GeoTIFFs - -### Tile Samples - -### GeoTrellis Layers - - - - -[DS]: https://spark.apache.org/docs/latest/sql-data-sources.html -[GTLayer]: https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd new file mode 100644 index 000000000..1c4e4edb5 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -0,0 +1,11 @@ +## Writing Raster Data + +### Overviews + +### GeoTIFFs + +### Tile Samples + +### GeoTrellis Layers + + diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py index aef478831..5faa62a22 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/utils.py +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -81,7 +81,7 @@ def create_rf_spark_session(): spark = (SparkSession.builder .master("local[*]") - .appName("PyRasterFrames") + .appName("RasterFrames") .config('spark.jars', jar_path) .withKryoSerialization() .getOrCreate()) From e7098a140fcc7ce76bf9fbfc9452863ee2b7bd14 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 10 Jul 2019 17:15:20 -0400 Subject: [PATCH 224/380] Misc build tweaks. --- project/PythonBuildPlugin.scala | 4 ++-- rf-notebook/src/main/docker/Dockerfile | 9 --------- 2 files changed, 2 insertions(+), 11 deletions(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 859fdec1f..e4383a7b9 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -130,7 +130,7 @@ object PythonBuildPlugin extends AutoPlugin { val dest = (Compile / packageBin / artifactPath).value.getParentFile val art = (Python / packageBin / artifact).value val ver = version.value - dest / s"${art.name}-python-$ver.zip" + dest / s"${art.name}-$ver-py2.py3-none-any.whl" }, testQuick := pySetup.toTask(" test").value, executeTests := Def.task { @@ -171,7 +171,7 @@ object PythonBuildPlugin extends AutoPlugin { ) } result - Tests.Output(result.result, Map("PyRasterFramesTests" -> result), Iterable(pySummary)) + Tests.Output(result.result, Map("Python Tests" -> result), Iterable(pySummary)) }.dependsOn(assembly).value )) ++ addArtifact(Python / packageBin / artifact, Python / packageBin) diff --git a/rf-notebook/src/main/docker/Dockerfile b/rf-notebook/src/main/docker/Dockerfile index 023e1ee17..0a22c820a 100644 --- a/rf-notebook/src/main/docker/Dockerfile +++ b/rf-notebook/src/main/docker/Dockerfile @@ -8,17 +8,8 @@ USER root RUN mkdir $RF_LIB_LOC -RUN echo "spark.driver.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-defaults.conf && \ - echo "spark.executor.extraClassPath $RF_JAR" >> /usr/local/spark/conf/spark-defaults.conf - EXPOSE 4040 4041 4042 4043 4044 -ENV SPARK_OPTS $SPARK_OPTS \ - --driver-class-path $RF_JAR \ - --conf spark.executor.extraClassPath=$RF_JAR - -ENV PYTHONPATH $PYTHONPATH:$PY_RF_ZIP - # Sphinx (for Notebook->html) RUN conda install --quiet --yes \ anaconda sphinx nbsphinx shapely numpy folium geopandas geojsonio From 3b7bfa8d5594f73386591e5f8304e5215833f07c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 16 Jul 2019 10:03:54 -0400 Subject: [PATCH 225/380] Removed CircleCI caching of ~/.rf_cache so code is tested with each IT. --- .circleci/config.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 6fec4977e..8697bb425 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -19,16 +19,15 @@ _delenv: &unsetenv _restore_cache: &restore_cache keys: - - v2-dependencies-{{ checksum "build.sbt" }} - - v2-dependencies- + - v3-dependencies-{{ checksum "build.sbt" }} + - v3-dependencies- _save_cache: &save_cache - key: v2-dependencies--{{ checksum "build.sbt" }} + key: v3-dependencies--{{ checksum "build.sbt" }} paths: - ~/.cache/coursier - ~/.ivy2/cache - ~/.sbt - - ~/.rf_cache before_script: - ulimit -c unlimited -S From f02a2804c9524680fed0110af017ba4208afd406 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 16 Jul 2019 11:06:07 -0400 Subject: [PATCH 226/380] Flesh out vector data support; move function ref to pymd file; clean up of getting started Signed-off-by: Jason T. Brown --- .../src/main/python/docs/getting-started.pymd | 22 ++-- .../src/main/python/docs/raster-io.md | 35 +++--- .../src/main/python/docs/reference.pymd | 51 +++----- .../src/main/python/docs/vector-data.pymd | 109 ++++++++++++++++-- pyrasterframes/src/main/python/setup.py | 1 + 5 files changed, 145 insertions(+), 73 deletions(-) rename docs/src/main/paradox/reference.md => pyrasterframes/src/main/python/docs/reference.pymd (96%) diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index 147c1a1c6..957eba2d8 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -2,6 +2,8 @@ There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames. Let's start with the simplest. Python 3.6 or greater is recommended. +## pip install pyrasterframes + ```bash $ python3 -m pip install pyrasterframes ``` @@ -31,20 +33,6 @@ This example is extended in the [getting started Jupyter notebook](https://nbvie To understand more about how and why RasterFrames represents Earth observation in DataFrames, read the project @ref:[description](description.md). For more hands-on examples, see the chapters about @ref:[reading](raster-io.md) and @ref:[processing](raster-processing.md) with RasterFrames. -## Raster Functions - -To import RasterFrames functions into the environment, import from `pyrasterframes.rasterfunctions`. - -```python -from pyrasterframes.rasterfunctions import * -``` - -Functions starting with `rf_`, which are for raster, and `st_`, which are for vector geometry, -become available for use with DataFrames. See the complete @ref:[function reference](reference.md). - -```python -[fn for fn in dir() if fn.startswith('rf_') or fn.startswith('st_')] -``` ## Other Options @@ -89,4 +77,10 @@ Now you have the configured SparkSession with RasterFrames enabled. spark.stop() ``` +## Installing GDAL + +GDAL provides a wide variety of drivers to read data from many different raster formats. If GDAL is installed in the environment, RasterFrames will be able to @ref:[read](raster-read.md) those formats. If you are using the @ref:[Jupyter Notebook image](getting-started.md#jupyter-notebook), GDAL is already installed for you. Otherwise follow the instructions below. + +__TODO__ Verify notebook env has GDAL? +__TODO__ How to install it. diff --git a/pyrasterframes/src/main/python/docs/raster-io.md b/pyrasterframes/src/main/python/docs/raster-io.md index 60fe0e913..22fc1c898 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.md +++ b/pyrasterframes/src/main/python/docs/raster-io.md @@ -1,34 +1,33 @@ # Raster Data I/O -The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames are compatible with existing generalized DataSources, such as Parquet, but provide specialized ones oriented around geospatial raster data. +The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames provides specialized DataSources for geospatial raster data and maintains compatibility with existing general purpose DataSources, such as Parquet. Three types of DataSources will be introduced: * Catalog Readers - - `aws-pds-l8-catalog`: experimental - - `aws-pds-modis-catalog`: experimental + - `aws-pds-l8-catalog`: built-in catalog over [Landsat on AWS][Landsat] + - `aws-pds-modis-catalog`: built-in catalog over [MODIS on AWS][MODIS] - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] * Raster Readers - - `raster`: the standard reader for most operations - - `geotiff`: a simplified reader for reading single GeoTIFF files - - `geotrellis` (for reading [GeoTrellis layers][GTLayer]) + - `raster`: the standard reader for most raster data + - `geotiff`: a simplified reader for reading a single GeoTIFF file + - `geotrellis`: for reading a [GeoTrellis layer][GTLayer]) * Raster Writers - - `geotrellis`: for creating [GeoTrellis layers][GTLayer] - - `geotiff`: beta - - `parquet`: for writing raster data in an analytics functional form - -There's also some support for vector data (for masking and data labeling): - -* Vector Readers - - `geojson`: read GeoJson files with `geometry` column aside attribute values + - `geotrellis`: for creating a [GeoTrellis layer][GTLayer] + - `geotiff`: beta writer to GeoTiff file + - [`parquet`][Parquet]: general purpose writer +There is also support for @ref:[vector data](vector-data.md) for masking and data labeling. @@@ index -* [Raster Catalogs](raster-catalogs.md) -* [Raster Readers](raster-read.md) -* [Raster Writers](raster-write.md) +* @ref:[Raster Catalogs](raster-catalogs.md) +* @ref:[Raster Readers](raster-read.md) +* @ref:[Raster Writers](raster-write.md) @@@ [DS]: https://spark.apache.org/docs/latest/sql-data-sources.html -[GTLayer]: https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html \ No newline at end of file +[GTLayer]: https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html +[Parquet]: https://spark.apache.org/docs/latest/sql-data-sources-parquet.html +[MODIS]: https://docs.opendata.aws/modis-pds/readme.html +[Landsat]: https://docs.opendata.aws/landsat-pds/readme.html \ No newline at end of file diff --git a/docs/src/main/paradox/reference.md b/pyrasterframes/src/main/python/docs/reference.pymd similarity index 96% rename from docs/src/main/paradox/reference.md rename to pyrasterframes/src/main/python/docs/reference.pymd index 3d4d41cbf..8bf336964 100644 --- a/docs/src/main/paradox/reference.md +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -12,11 +12,22 @@ For the Scala documentation on these functions, see @scaladoc[`RasterFunctions`] ## List of Available SQL and Python Functions -@@toc { depth=3 } +To import RasterFrames functions into the environment, import from `pyrasterframes.rasterfunctions`. + +```python +from pyrasterframes.rasterfunctions import * +``` + +Functions starting with `rf_`, which are for raster, and `st_`, which are for vector geometry, +become available for use with DataFrames. You can view all of the available functions with the following. + +```python, evaluate=False +[fn for fn in dir() if fn.startswith('rf_') or fn.startswith('st_')] +``` ### Vector Operations -Various LocationTech GeoMesa UDFs to deal with `geomtery` type columns are also provided in the SQL engine and within the `pyrasterframes.rasterfunctions` Python module. These are documented in the [LocationTech GeoMesa Spark SQL documentation](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#). These functions are all prefixed with `st_`. +Various LocationTech GeoMesa user-defined functions (UDFs) to deal with `geomtery` type columns are provided in the SQL engine and within the `pyrasterframes.rasterfunctions` Python module. These are documented in the [LocationTech GeoMesa Spark SQL documentation](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#). These functions are all prefixed with `st_`. RasterFrames provides some additional functions for vector geometry operations. @@ -51,25 +62,10 @@ Functions to access and change the particulars of a `tile`: its shape and the da Array[String] rf_cell_types() Print an array of possible cell type names, as below. These names are used in other functions. See @ref:[discussion on nodata](reference.md#masking-and-nodata) for additional details. - -|cell_types | -|----------| -|bool | -|int8raw | -|int8 | -|uint8raw | -|uint8 | -|int16raw | -|int16 | -|uint16raw | -|uint16 | -|int32raw | -|int32 | -|float32raw| -|float32 | -|float64raw| -|float64 | +```python +rf_cell_types() +``` #### rf_dimensions @@ -171,19 +167,6 @@ FROM st_geomFromWKT('POLYGON((0.0 0.0, 2.0 0.0, 2.0 2.0, 0.0 2.0, 0.0 0.0))') AS b ) r """).show(1, False) - ------------ -|∘∘∘∘∘∘∘∘∘∘ -∘∘∘∘∘∘∘∘∘∘ -∘∘∘∘∘∘∘∘∘∘ -∘∘∘∘∘∘∘ ∘∘ -∘∘∘∘∘∘ ∘∘ -∘∘∘∘∘ ∘∘ -∘∘∘∘ ∘∘ -∘∘∘ ∘∘ -∘∘∘∘∘∘∘∘∘∘ -∘∘∘∘∘∘∘∘∘∘| ------------ ``` @@ -377,7 +360,7 @@ Round cell values to the nearest integer without changing the cell type. Compute the absolute value of cell value. - #### rf_exp +#### rf_exp Tile rf_exp(Tile tile) diff --git a/pyrasterframes/src/main/python/docs/vector-data.pymd b/pyrasterframes/src/main/python/docs/vector-data.pymd index 241ca6974..2fb2faa4e 100644 --- a/pyrasterframes/src/main/python/docs/vector-data.pymd +++ b/pyrasterframes/src/main/python/docs/vector-data.pymd @@ -1,17 +1,112 @@ # Vector Data -* `geojson` DataSource for going right into Spark -* Shapely or Python-side processing, getting into Spark via Pandas +RasterFrames provides a variety of ways to work with spatial vector (points, lines, and polygons) data alongside raster data. There is a convenience DataSource for geojson format, as well as the ability to convert from [GeoPandas][GeoPandas] to Spark. Representation of vector geometries in pyspark is through [Shapely][Shapely] which provides a great deal of flexibility. RasterFrames also provides access to Spark functions for working with geometries. ## GeoJSON DataSource -Show `spark.read.geojson(...)` example. +```python, echo=False +import pyrasterframes +from pyrasterframes.utils import create_rf_spark_session +spark = create_rf_spark_session() +``` -## Shapely +```python +from pyspark import SparkFiles +spark.sparkContext.addFile('https://raw.githubusercontent.com/datasets/geo-admin1-us/master/data/admin1-us.geojson') -Show Shapely interop +df = spark.read.geojson(SparkFiles.get('admin1-us.geojson')) +df.printSchema() +``` -## Spatial Relations +The properties of each feature are available as columns of the dataframe, along with the geometry. -Using `st_` functions, particularly boolean relations. +## GeoPandas and RasterFrames +You can also convert a [GeoPandas][GeoPandas] GeoDataFrame to a Spark DataFrame, preserving the geometry column. This means that any vector format that can be read with [OGR][OGR] can be converted to a Spark DataFrame. In the example below, we expect the same schema as `df` defined above by the geojson reader. Note that in a geopandas dataframe there can be heterogeneous geometry types in the column, but this may fail Spark's schema inference. + +```python +import geopandas +from shapely.geometry import MultiPolygon + +def poly_or_mp_to_mp(g): + """ Normalize polygons or multipolygons to all be multipolygons. """ + if isinstance(g, MultiPolygon): + return g + else: + return MultiPolygon([g]) + +gdf = geopandas.read_file('https://raw.githubusercontent.com/datasets/geo-admin1-us/master/data/admin1-us.geojson') +gdf.geometry = gdf.geometry.apply(poly_or_mp_to_mp) +df2 = spark.createDataFrame(gdf) +df2.printSchema() +``` + +## Shapely Geometry Support + +The geometry column will have a Spark user-defined type that is compatible with [Shapely][Shapely] when working on the Python side. This means that when the data is collected to the driver, it will be a Shapely geometry object. + +```python +the_first = df.first() +print(type(the_first['geometry'])) +``` + +Since it is a geometry we can do things like this. + +```python +the_first['geometry'].wkt +``` + +You can also write user-defined functions that input geometries, output geometries, or both, via user defined types in the [geomesa_pyspark.types](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/src/main/python/geomesa_pyspark/types.py) module. Here is a simple example using both a geometry input and output. The example is repeated below with a built-in function. + +```python +from pyspark.sql.functions import udf +from geomesa_pyspark.types import PointUDT + +@udf(PointUDT()) +def get_centroid(g): + return g.centroid + +df = df.withColumn('naive_centroid', get_centroid(df.geometry)) +df.printSchema() +``` + +We can take a look at a sample of the data. Notice the geometry columns print as well known text. + +```python +df.show(4) +``` + + +## GeoMesa Functions and Spatial Relations + +As documented in the @ref:[function reference](reference.md), the various user-defined functions already available through GeoMesa are available for use. The example above is logically equivalent but less efficient than this. + + +```python +from pyrasterframes.rasterfunctions import st_centroid +df = df.withColumn('centroid', st_centroid(df.geometry)) +df.select('name', 'geometry', 'naive_centroid', 'centroid').show(4) +``` + +The RasterFrames vector functions and GeoMesa functions also provide a variety of spatial relations that are useful in combination with the geometric properties of projected rasters. In this example we use the @ref:[built-in MODIS catalog](raster-catalogs.md#using-built-in-experimental-catalogs) which provides an extent. We will convert the extent to a polygon and filter only those within approximately 500 km of a selected point. + +```python, evaluate=True +from pyrasterframes.rasterfunctions import st_geometry, st_bufferPoint, st_intersects, st_point +from pyspark.sql.functions import lit +l8 = spark.read.format('aws-pds-l8-catalog').load() + +l8 = l8.withColumn('geom', st_geometry(l8.bounds_wgs84)) +l8 = l8.withColumn('paducah', st_point(lit(-88.6275), lit(37.072222))) + +l8_filtered = l8.filter(st_intersects(l8.geom, st_bufferPoint(l8.paducah, lit(500000.0)))) +``` + +```python, evaluate=False, echo=False +# suppressed due to run time. +l8_filtered.count() +``` + + +[GeoPandas]: http://geopandas.org +[OGR]: https://gdal.org/drivers/vector/index.html +[Shapely]: https://shapely.readthedocs.io/en/latest/manual.html \ No newline at end of file diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 35ae8a8d2..2c1c9e753 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -122,6 +122,7 @@ def doctype(self): 'numpy>=1.7', 'matplotlib<3.0.0', 'pandas', + 'geopandas', 'pytest-runner', 'setuptools>=0.8', 'ipython==6.2.1', From 4d5568b30e5d2a10e712a5d65159863b501fdd6f Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 16 Jul 2019 17:17:58 -0400 Subject: [PATCH 227/380] Raster catalog and read content and smoothing Signed-off-by: Jason T. Brown --- .../src/main/python/docs/raster-catalogs.pymd | 45 ++--- .../src/main/python/docs/raster-io.md | 6 +- .../src/main/python/docs/raster-read.pymd | 162 ++++++++++-------- 3 files changed, 116 insertions(+), 97 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd index 33d459ef8..1f89a7343 100644 --- a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd +++ b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd @@ -1,41 +1,36 @@ # Raster Catalogs -While much interesting processing can be done on single raster files, RasterFrames shines when _Catalogs_ of raster data are to be processed. In its simplest form, a _Catalog_ is a listing of URLs referencing raster files. This listing can be manifested as CSV in a character string or an external file, or as a Spark or Pandas DataFrame. This _Catalog_ then serves as the input into the `raster` DataSource, described in the next page. +While much interesting processing can be done on a @ref:[single raster file](raster-read.md#single-raster), RasterFrames shines when _Catalogs_ of raster data are to be processed. In its simplest form, a _Catalog_ is a listing of @ref:[URLs referencing raster files](raster-read.md#uri-formats). This listing can be manifested as a DataFrame, CSV file or CSV string. The _Catalog_ is input into the `raster` DataSource, described in the next page. -A _Catalog_ can be zero, one or two dimensions: +A _Catalog_ can have one or two dimensions: -* Zero-D: A single URL to a single raster file -* One-D: Multiple URLs in a single column, where all referenced rasters represent the same content type. For example, a column of URLs to Landsat 8 NIR rasters covering Europe. Each row represents different spatiotemporal locations (scenes). -* Two-D: One or more columns of multiple URLs, where each column references the same content type, and each row represents the same spatiotemporal location. For example, red-, green-, and blue-band columns for scenes covering Europe. Each spatiotemporal location (scenes), and each raster cell within it must be of the same dimensions, extent, crs, etc. +* One-D: A single column containing one or many URLs across the rows. All referenced rasters represent the same content type. For example, a column of URLs to Landsat 8 NIR rasters covering Europe. Each row represents different places and times. +* Two-D: Many columns containing raster URLs. Each column references the same content type, and each row represents the same place and time. For example, red-, green-, and blue-band columns for scenes covering Europe. Each row reperesents a single spatiotemporal location (or scene) with the same dimensions, extent, CRS, etc across the row. ## Creating a Catalog -This section will provide some examples of creating your own _Catalogs_, as well as introduce some experimental _Catalogs_ built into RasterFrames. The consuption of _Catalogs_ is covered in more detail in the next page. +This section will provide some examples of creating your own _Catalogs_, as well as introduce some experimental _Catalogs_ built into RasterFrames. Reading raster data represented by a _Catalog_ is covered in more detail in the @ref:[next page](raster-read.md). ```python, echo=False from IPython.display import display from pyrasterframes.utils import create_rf_spark_session from pyrasterframes.rasterfunctions import * +import pandas as pd spark = create_rf_spark_session() ``` -```python -from pyspark.sql import Row -``` - -### Zero-D +### One-D A single URL is this simplest form of a catalog. ```python +from pyspark.sql import Row my_cat = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" -# or +# or my_cat_df = spark.createDataFrame([Row(B01=my_cat)]) ``` -### One-D - -Example of a single column representing the same content type: +A single column represents the same content type with different observations along the rows. In this example it is band 1 of MODIS, which is visible red. In the example the location of the images is the same (h04v09) but the dates differ. ```python scene1_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" @@ -46,11 +41,14 @@ my_cat = '\n'.join(['B01', scene1_B01, scene2_B01]) # or my_cat_df = spark.createDataFrame([Row(B01=scene1_B01), Row(B01=scene2_B01)]) my_cat_df.printSchema() +# or +pandas_cat = pd.DataFrame([{'B01': scene1_B01}, {'B01': scene2_B01}]) +my_cat = spark.createDataFrame(pandas_cat) ``` ### Two-D -Example of a multiple columns representing multiple content types (bands) across multiple scenes. +Example of a multiple columns representing multiple content types (bands) across multiple scenes. In each row, the scene is the same. The first column is band 1 and the second is band 2, near infrared. ```python scene1_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" @@ -62,13 +60,15 @@ scene2_B02 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018188/MCD43 # As CSV string my_cat = '\n'.join(['B01,B02', scene1_B01 + "," + scene1_B02, scene2_B01 + "," + scene2_B02]) # or -my_cat_df = spark.createDataFrame([Row(B01=scene1_B01, B02=scene1_B02), Row(B01=scene2_B01, B02=scene2_B02)]) +my_cat_df = spark.createDataFrame([ + Row(B01=scene1_B01, B02=scene1_B02), + Row(B01=scene2_B01, B02=scene2_B02)]) my_cat_df.printSchema() ``` ## Using External Catalogs -The simplest example of an external _Catalog_ is a CSV file (or a transformation of) in one of the formats above. Here's an extended example of reading an external CSV file of MODIS scenes and transforming it into a _Catalog_ +The simplest example of an external _Catalog_ is a DataFrame (or a transformation of) in one of the formats above. Here's an extended example of reading an external CSV file of MODIS scenes and transforming it into a _Catalog_. The metadata describing the content of each URL is an important aspect of processing raster data. This example includes some minimal metadata. ```python from pyspark import SparkFiles @@ -76,7 +76,7 @@ from pyspark.sql import functions as F spark.sparkContext.addFile("https://modis-pds.s3.amazonaws.com/MCD43A4.006/2018-07-04_scenes.txt") -# The scenes list file has index URIs take the form: +# The scenes list file has index URIs in the download_url column, for example: # https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/index.html # Image URIs take the form: # https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF @@ -95,10 +95,9 @@ modis_catalog = spark.read \ modis_catalog.printSchema() ``` - ## Using Built-in Experimental Catalogs -RasterFrames comes with two experimental catalogs over the AWS PDS Landsat 8 and MODIS repositories. They are created by downloading the latest scene lists and transforming as in the prior example. +RasterFrames comes with two experimental catalogs over the AWS PDS [Landsat 8][Landsat] and [MODIS][MODIS] repositories. They are created by downloading the latest scene lists and transforming as in the prior example. > Note: The first time you run these may take some time, as the catalogs are large. However, they are cached and subsequent invocations should be faster. @@ -132,6 +131,8 @@ root ### Landsat 8 +The Landsat 8 catalog includes a richer set of metadata describing the contents of each scene. + ```python, evaluate=False l8 = spark.read.format('aws-pds-l8-catalog').load() l8.printSchema() @@ -162,3 +163,5 @@ root |-- BQA: string (nullable = true) ``` +[MODIS]: https://docs.opendata.aws/modis-pds/readme.html +[Landsat]: https://docs.opendata.aws/landsat-pds/readme.html \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/raster-io.md b/pyrasterframes/src/main/python/docs/raster-io.md index 22fc1c898..d10bab8f1 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.md +++ b/pyrasterframes/src/main/python/docs/raster-io.md @@ -4,15 +4,15 @@ The standard mechanism by which any data is brought in and out of a Spark Datafr Three types of DataSources will be introduced: -* Catalog Readers +* @ref:[Catalog Readers](raster-catalogs.md) - `aws-pds-l8-catalog`: built-in catalog over [Landsat on AWS][Landsat] - `aws-pds-modis-catalog`: built-in catalog over [MODIS on AWS][MODIS] - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] -* Raster Readers +* @ref:[Raster Readers](raster-read.md) - `raster`: the standard reader for most raster data - `geotiff`: a simplified reader for reading a single GeoTIFF file - `geotrellis`: for reading a [GeoTrellis layer][GTLayer]) -* Raster Writers +* @ref:[Raster Writers](raster-write.md) - `geotrellis`: for creating a [GeoTrellis layer][GTLayer] - `geotiff`: beta writer to GeoTiff file - [`parquet`][Parquet]: general purpose writer diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index b791cbadc..74b749a61 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -1,4 +1,4 @@ -## Reading Raster Data +# Reading Raster Data ```python, echo=False from IPython.display import display @@ -7,29 +7,20 @@ from pyrasterframes.rasterfunctions import * spark = create_rf_spark_session() ``` -RasterFrames registers a DataSource named `rasters` that enables reading of GeoTIFFs (and other formats when GDAL is installed) from arbitrary (sets of) URIs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket: +RasterFrames registers a DataSource named `raster` that enables reading of GeoTIFFs (and other formats when @ref:[GDAL is installed](getting-started.md#installing-gdal)) from arbitrary URIs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket. -```python -data_root = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp' -def s2_band(idx): - return "{}/B0{}.tif".format(data_root, idx) - -``` - -### Single Raster +## Single Raster The simplest form is reading a single raster from a single URI: -```python -rf = spark.read.raster(s2_band(2)) +```python read_one_uri +rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') rf.printSchema() ``` -\[Discuss the schema\] - -Let's unpack the `proj_raster` column and look at the contents in more detail. +Let's unpack the `proj_raster` column and look at the contents in more detail. It contains a [_CRS_][CRS], a spatial _extent_ measured in that CRS, and a two-dimensional array of numeric values called a _tile_. -```python +```python unpack_schema crs = rf.select(rf_crs("proj_raster").alias("value")).first() parts = rf.select( @@ -38,51 +29,65 @@ parts = rf.select( ) print("CRS", crs.value.crsProj4) -parts.show(5) +parts.show(5, False) ``` -Let's select a single tile and view it. +You can also see that the single raster has been broken out into many arbitrary non-overlapping regions. Doing so takes advantage of parallel in-memory reads from the cloud hosted data source and allows Spark to work on managable amounts of data per task. -```python -tile = rf.select(rf_tile("proj_raster")).first()[0] -display(tile) -# todo verify its chilly +```python count_by_uri +rf.groupby(rf.proj_raster_path).count().show() ``` +Let's select a single tile and view it. The tile preview image as well as the string representation provide some basic information about the tile: it's dimensions as number of columns and rows, and the cell type, or data type of all the cells in the tile. For more about cell types, refer to @ref:[the NoData page](noData-handling.md#cell-types). -### Single Scene, Multiple Bands +```python show_tile_sample +tile = rf.select(rf_tile("proj_raster")).first()[0] +display(tile) +``` -Generally we'll want to work with multiple bands. If you have several singleband image files of the same scene, `raster` can make use of a CSV (or other DataFrame) specifying the band columns and scene rows. +## URI Formats -```python -csv = """ -red,green,blue -{},{},{} -""".format(s2_band(4), s2_band(3), s2_band(2)) +/[ TODO Populate this with valid URI's we can use including how to use gdal /] -print(csv) +https:// +http:// ? +s3a:// +s3n:// ? +hdfs:// ? +ftp:// ? +azure ? +google cloud ? -rf2 = spark.read.raster(catalog=csv, catalog_col_names=['red', 'green', 'blue']) -rf2.printSchema() +gdal vsi? https://gdal.org/user/virtual_file_systems.html -rf2.show(5) -``` -### Raster Catalogs +## Raster Catalogs -The example above will work with a reasonable number of rows in the CSV string. However, in many cases it's preferable to have that information organized in another DataFrame. For the purposes of this example use one of the AWS PDS daily scene listing files for MODIS surface reflectance as our catalog. +Considering the definition of a @ref:[_Catalog_](raster-catalogs.md) previously discussed, let's read the raster data contained in the catalog URIs. We will start with the @ref:[external catalog](raster-catalogs.md#using-external-catalogs) of MODIS surface reflectance that we previously demonstrated. -```python +```python catalog_prep from pyspark import SparkFiles +from pyspark.sql import functions as F + cat_filename = "2018-07-04_scenes.txt" spark.sparkContext.addFile("https://modis-pds.s3.amazonaws.com/MCD43A4.006/{}".format(cat_filename)) + modis_catalog = spark.read \ .format("csv") \ .option("header", "true") \ - .load(SparkFiles.get(cat_filename)) + .load(SparkFiles.get(cat_filename)) \ + .withColumn('base_url', + F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) + ) \ + .drop('download_url') \ + .withColumn('red' , F.concat('base_url', F.lit("_B01.TIF"))) \ + .withColumn('nir' , F.concat('base_url', F.lit("_B02.TIF"))) + modis_catalog.printSchema() + print("Available scenes: ", modis_catalog.count()) + modis_catalog.show(5, truncate=False) ``` @@ -90,53 +95,64 @@ MODIS data products are delivered on a regular, consistent grid, making identifi ![MODIS Grid](https://modis-land.gsfc.nasa.gov/images/MODIS_sinusoidal_grid1.gif) -For sake of example, lets say we wanted all the MODIS data right above the equator. The grid position is encoded in the GUID, with `h07` being the strip just above the equator . To go from `download_url` to band URL we strip off `index.html`, and append the GUID, band specifier, and file extension. +For example, MODIS data right above the equator is all grid coordinates with `v07`. -```python -from pyspark.sql import functions as F - -# Index URIs take the form: -# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/index.html -# Image URIs take the form: -# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF - -equator = (modis_catalog - .withColumn('base_url', - F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) - ) -.select( - F.concat('base_url', F.lit("_B01.TIF")).alias('red'), - F.concat('base_url', F.lit("_B02.TIF")).alias('nir') -) -.where(F.col('gid').like('%v07%')) -) -equator.show(3) +```python catalog_filtering +equator = modis_catalog.where(F.col('gid').like('%v07%')) +equator.select('date', 'gid').show(10, False) ``` -Now that we have a catalog of multiple scenes and mutiple bands withit each scene, we can pass it along to `raster` load the imagery. To complete the example, we compute some aggregate statistics over NDVI. +Now that we have prepared our catalog, we simply pass the DataFrame or CSV string to the `raster` DataSource to load the imagery. The `catalog_col_names` parameter gives the columns that contain the URI's to be read. -```python +```python read_catalog rf = spark.read.raster( catalog=equator, - catalog_col_names=['red', 'nir'] -).repartition() -rf.show(2, truncate=False) -(rf - .select(rf_normalized_difference('nir', 'red').alias('ndvi')) - .agg(rf_agg_stats('ndvi').alias('stats')) - .select('stats.*') - .show(truncate=False) + catalog_col_names=['red', 'nir'], ) - +rf.printSchema() +``` + +Observe schema of the resulting dataframe has a projected raster struct for each column passed in `catalog_col_names`. For reference the URI is now in a column appended with `_path`. We can take a quick look at the representation of the data. We see again each row contains an arbitrary portion of the entire scene coverage. We also see that for two-D catalogs, each row contains the same spatial extent from within that coverage. + +```python cat_read_sample +rf.select('gid', rf_extent('red'), rf_extent('nir'), rf_tile('red'), rf_tile('nir')).show(3, False) ``` -### Lazy vs. Strict Raster Reads +### Lazy Raster Reads + +By default the raster reads are delayed as long as possible. The DataFrame will contain metadata and pointers to the appropriate portion of the data until + +Consider the following two reads of the same data source. In the first, the lazy case, there is a pointer to the URI, extent and band to read. This will not be evaluated until the cell values are absolutely required. The second case shows the realized tile is queried right away. + +```python lazy_demo +uri = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif' +spark.read.raster(uri) \ + .select('proj_raster.tile').show(1, False) -> Discuss the `spark.read.raster(lazy_tiles=False)` behavior +spark.read.raster(uri, lazy_tiles=False) \ + .select('proj_raster.tile').show(1, False) +``` +In the initial examples on this page, we used `rf_tile` to explicitly request the realized tile from the lazy representation. -### Multiband Rasters +## Multiband Rasters > Need to know _a priori_ how many bands there are, specified with `band_indexes`. -> Must be homogenous, or tolerant of `null` Tiles. + +band indexes start at 0 + + +> Must be homogenous, or tolerant of `null` Tiles. +Not sure what that means? + +For example we can read a four-band (red, green, blue, and near-infrared) image as follows. The individual rows of the resulting dataframe represent distinct spatial extents, with a projected raster column for each band specified by `band_indexes`. + +```python Multiband +mb = spark.read.raster('s3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620.tif', + band_indexes=[0, 1, 2, 3], + ) +mb.printSchema() +``` + +As with reading a singleband image we can use the `band_indexes` parameter to operate over a catalog of multiband rasters. From e96a64c3eaeb01fd4457b881081f0222be2505aa Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 17 Jul 2019 09:30:47 -0400 Subject: [PATCH 228/380] Add multiband raster discussion Signed-off-by: Jason T. Brown --- .../src/main/python/docs/raster-read.pymd | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 74b749a61..a95942fb0 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -2,6 +2,7 @@ ```python, echo=False from IPython.display import display +import pandas as pd from pyrasterframes.utils import create_rf_spark_session from pyrasterframes.rasterfunctions import * spark = create_rf_spark_session() @@ -48,8 +49,9 @@ display(tile) ## URI Formats -/[ TODO Populate this with valid URI's we can use including how to use gdal /] +/[ TODO Populate this with valid URI's schemes we can use with an example? including how to use gdal /] +file:// (is this only valid for spark local? or if file is ) https:// http:// ? s3a:// @@ -137,16 +139,11 @@ In the initial examples on this page, we used `rf_tile` to explicitly request th ## Multiband Rasters -> Need to know _a priori_ how many bands there are, specified with `band_indexes`. +A multiband raster represents a three dimensional numeric array. The first two dimensions are spatial, and the third dimension is typically designated as different bands. The bands may represent intensity of different wavelengths of light (or other electromagnetic radiation). The different bands may represent other phenomena such as measurement time, quality indications, or additional measurements. -band indexes start at 0 +When reading a multiband raster or a _Catalog_ describing multiband rasters, you will need to know ahead of time which bands you want to read. You will specify the bands to read, indexed from zero, passing a list of integers into the `band_indexes` parameter of the `raster` reader. - - -> Must be homogenous, or tolerant of `null` Tiles. -Not sure what that means? - -For example we can read a four-band (red, green, blue, and near-infrared) image as follows. The individual rows of the resulting dataframe represent distinct spatial extents, with a projected raster column for each band specified by `band_indexes`. +For example we can read a four-band (red, green, blue, and near-infrared) image as follows. The individual rows of the resulting dataframe still represent distinct spatial extents, with a projected raster column for each band specified by `band_indexes`. ```python Multiband mb = spark.read.raster('s3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620.tif', @@ -155,4 +152,24 @@ mb = spark.read.raster('s3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620. mb.printSchema() ``` -As with reading a singleband image we can use the `band_indexes` parameter to operate over a catalog of multiband rasters. +If a band is passed into `band_index` that exceeds the number of bands in the raster, a projected raster column will still be generated in the schema but it will be full of `null` values. + +You can also pass a `catalog` and `band_indexes` together into the `raster` reader. This will create a projected raster column for the combination of all items passed into `catalog_col_names` and `band_indexes`. Again if a band in `band_indexes` exceeds the number of bands in a raster, it will have a `null` value for the corresponding column. + +Here is a trivial example with a _Catalog_ over multiband rasters. We specify two columns containing URIs and two bands, resulting in four projected raster columns. + +```python multiband_catalog +import pandas as pd +mb_cat = pd.DataFrame([ + {'foo': 's3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620.tif', + 'bar': 's3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620.tif', + }, +]) +mb2 = spark.read.raster(catalog=spark.createDataFrame(mb_cat), + catalog_col_names=['foo', 'bar'], + band_indexes=[0, 1], + tile_dimensions=(64,64) + ) +mb2.printSchema() +``` + \ No newline at end of file From e02b6a7fce51b269e8c9f72329cfa810f0ddcc40 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 17 Jul 2019 16:57:28 -0400 Subject: [PATCH 229/380] NoData chapter, cell types, masking extended example and restyle as NoData Signed-off-by: Jason T. Brown --- .../src/main/python/docs/nodata-handling.pymd | 156 ++++++++++++++++++ .../src/main/python/docs/reference.pymd | 65 ++++---- 2 files changed, 188 insertions(+), 33 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index dde8433a2..795771577 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -1,2 +1,158 @@ # "NoData" Handling +## What is NoData? + +In raster operations, the preservation and correct processing of missing observations is very important. In [most dataframes and scientific computing](https://www.oreilly.com/learning/handling-missing-data), the idea of missing data is expressed as a null or NaN value. A great deal of raster data is stored for space efficiency. This typically leads to use of integral values and a "sentinel" value to represent missing observations. This sentinel value varies across data products and is usually called the NoData value. + +RasterFrames provides a variety of functions to inspect and manage NoData within `tile`s. + +## Cell Types + +To understand how NoData is handled in RasterFrames, we first need to understand the different underlying types of data called cell types. The cell types are GeoTrellis `CellType`s, so the [GeoTrellis documentation](https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html?#working-with-cell-values) is a valuable resource on how these are defined. + +Use the function `rf_cell_type` to find the cell type of a specific set of raster data. + +```python setup, echo=False +import pyrasterframes +from pyrasterframes.rasterfunctions import * +import pyrasterframes.rf_ipython +from IPython.display import display + +spark = pyrasterframes.get_spark_session() +``` + +```python ct_from_sen +spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') \ + .select(rf_cell_type('proj_raster')).distinct().show() +``` + +The function `rf_cell_types` provides a convenient list of basic cell types. Note that this list is not exhaustive. + +```python +rf_cell_types() +``` + +### Understanding Cell Types and NoData + +Use the `CellType` class to learn more about a specific cell type. + +```python +from pyrasterframes.rf_types import CellType +ct = CellType('uint16raw') +ct, ct.is_floating_point(), ct.has_no_data() +``` + +We can see that for the above data source, there is no defined NoData value. This means that each value is interpreted as a valid observation. Often such data is meant to be combined with another band indicating the quality of observations at each location. The lack of NoData is indicated by the `raw` at the end of the type name. Consider also the `uint16` cell type. + +```python +from pyrasterframes.rf_types import CellType +ct = CellType('uint16') +ct, ct.is_floating_point(), ct.has_no_data(), ct.no_data_value() +``` + +In this case, the minimum value of 0 is designated as the NoData value. For integral valued cell types, the NoData is typically zero, the maximum, or the minimum value for the underlying data type. The NoData value can also be a user-defined value. In that case the value is designated with a `ud`. + +```python +CellType.uint16().with_no_data_value(99).cell_type_name +``` + +Floating point types by default have `NaN` as the NoData value. However a user-defined NoData can be set. + +```python float_ud +print(CellType.float32().no_data_value()) +print(CellType.float32().with_no_data_value(-99.9).no_data_value()) +``` + +## Masking + +Let's continue the example above with Sentinel-2 data. Band 2 is blue and has no defined NoData. The quality information is in a separate file called the scene classification (SCL), which delineates areas of missing data and probable clouds. For much more information on that, see the [Sentinel-2 algorithm overview](https://earth.esa.int/web/sentinel/technical-guides/sentinel-2-msi/level-2a/algorithm). Figure 3 tells us how to interpret the scene classification. For this example, we will exclude NoData, defective pixels, probable clouds, and cirrus clouds: values 0, 1, 8, 9, and 10. + +The first step is to create a catalog with our band of interest and the SCL band. We read the data from the catalog and now the blue band and SCL tiles are aligned across rows. + +```python blue_scl_cat +from pyspark.sql import Row + +blue_uri = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif' +scl_uri = 'https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/SCL.tif' +cat = spark.createDataFrame([Row(blue=blue_uri, scl=scl_uri),]) +unmasked = spark.read.raster(catalog=cat, catalog_col_names=['blue', 'scl']) +unmasked.printSchema() +unmasked.select(rf_cell_type('blue'), rf_cell_type('scl')).distinct().show() +``` + +Drawing on @ref:[local map algebra](local-algebra.md) techniques, we will create a new tile column containing our indicator of unwanted pixels, as defined above. + +```python def_mask +from pyspark.sql.functions import lit + +unmasked = unmasked.withColumn('nodata', rf_local_equal('scl', lit(0))) +unmasked = unmasked.withColumn('defect', rf_local_equal('scl', lit(1))) +unmasked = unmasked.withColumn('cloud8', rf_local_equal('scl', lit(8))) +unmasked = unmasked.withColumn('cloud9', rf_local_equal('scl', lit(9))) +unmasked = unmasked.withColumn('cirrus', rf_local_equal('scl', lit(10))) + +unmasked = unmasked.withColumn('mask', rf_local_add('nodata', 'defect')) +unmasked = unmasked.withColumn('mask', rf_local_add('mask', 'cloud8')) +unmasked = unmasked.withColumn('mask', rf_local_add('mask', 'cloud9')) +unmasked = unmasked.withColumn('mask', rf_local_add('mask', 'cirrus')) + +unmasked.select(rf_cell_type('mask')).distinct().show() +``` + +Now we will use the @ref:[`rf_mask_by_value`](reference.md#rf-mask-by-value) to designate the cloudy and other unwanted pixels as NoData in the blue column. Because there is not a NoData already defined, we will choose one. Note that in this particular example the minimum value is greater than zero, so we can use 0 as the NoData value. + +```python pick_nd +unmasked.agg(rf_agg_stats('blue').min.alias('blue_min')).show() +``` + +We can now construct the cell type string for our blue band's cell type, but designating 0 as NoData. + +```python get_ct_string +blue_ct = unmasked.select(rf_cell_type('blue')).distinct().first()[0][0] +masked_blue_ct = CellType(blue_ct).with_no_data_value(0) +masked_blue_ct.cell_type_name +``` + +Convert the cell type and apply the mask. Since the mask column is bit type, the addition done above was equivalent to a logical or. So the true values are 1. + +```python mask_blu +with_nd = rf_convert_cell_type('blue', masked_blue_ct.cell_type_name) +masked = unmasked.withColumn('blue_masked', + rf_mask_by_value(with_nd, 'mask', lit(1))) \ + .drop('nodata', 'defect', 'cloud8', 'cloud9', 'cirrus', 'blue') +``` + +We can verify that the number of NoData cells in the resulting `blue_masked` column matches the total of the bit-type `mask` tile. + +```python +masked.select(rf_no_data_cells('blue_masked'), rf_tile_sum('mask')).show(10) +``` + +It's also nice to view a sample. + +```python show_masked +sample = masked.orderBy(-rf_no_data_cells('blue_masked')).select(rf_tile('blue_masked'), rf_tile('scl')).first() +display(sample[0]) +``` + +And the original SCL data. + +```python show_scl +display(sample[1]) +``` + +## NoData in Arithmetic Operations + +local algebra example; same celltype what happens to nodata +Possibly use st_geomFromWkt and rf_rasterize to create something to work from + +agg + + +## Dealing with Multiple Cell Types + +Quick demo of one ND tile one raw tile + +Quick demo of ND in two different cell types + + diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index 8bf336964..f2866fbd3 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -12,6 +12,9 @@ For the Scala documentation on these functions, see @scaladoc[`RasterFunctions`] ## List of Available SQL and Python Functions +@@toc { depth=3 } + + To import RasterFrames functions into the environment, import from `pyrasterframes.rasterfunctions`. ```python @@ -55,13 +58,13 @@ Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`] ### Tile Metadata and Mutation -Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and nodata](reference.md#masking-and-nodata) for additional discussion of cell types. +Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and NoData](reference.md#masking-and-NoData) for additional discussion of cell types. #### rf_cell_types Array[String] rf_cell_types() -Print an array of possible cell type names, as below. These names are used in other functions. See @ref:[discussion on nodata](reference.md#masking-and-nodata) for additional details. +Print an array of possible cell type names, as below. These names are used in other functions. See @ref:[discussion on NoData](reference.md#masking-and-NoData) for additional details. ```python rf_cell_types() @@ -149,12 +152,12 @@ Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with Tile rf_rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows) -Convert a vector Geometry `geom` into a Tile representation. The `value` will be "burned-in" to the returned `tile` where the `geom` intersects the `tile_bounds`. Returned `tile` will have shape `tile_columns` by `tile_rows`. Values outside the `geom` will be assigned a nodata value. Returned `tile` has cell type `int32`, note that `value` is of type Int. +Convert a vector Geometry `geom` into a Tile representation. The `value` will be "burned-in" to the returned `tile` where the `geom` intersects the `tile_bounds`. Returned `tile` will have shape `tile_columns` by `tile_rows`. Values outside the `geom` will be assigned a NoData value. Returned `tile` has cell type `int32`, note that `value` is of type Int. Parameters `tile_columns` and `tile_rows` are literals, not column expressions. The others are column expressions. -Example use. In the code snip below, you can visualize the `tri` and `b` geometries with tools like [Wicket](https://arthur-e.github.io/Wicket/sandbox-gmaps3.html). The result is a right triangle burned into the `tile`, with nodata values shown as ∘. +Example use. In the code snip below, you can visualize the `tri` and `b` geometries with tools like [Wicket](https://arthur-e.github.io/Wicket/sandbox-gmaps3.html). The result is a right triangle burned into the `tile`, with NoData values shown as ∘. ```python @@ -182,57 +185,53 @@ Python only. Create a `tile` from a Spark SQL [Array](http://spark.apache.org/do Python only. Create a Tile from a column of cell data with location indices. This function is the inverse of @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles). Intended use is with a `groupby`, producing one row with a new `tile` per group. The `numCols`, `numRows` and `cellType` arguments are literal values, others are column expressions. Valid values for `cellType` can be found with function @ref:[`rf_cell_types`](reference.md#rf-cell-types). -### Masking and Nodata - -In raster operations, the preservation and correct processing of missing operations is very important. The idea of missing data is often expressed as a null or NaN. In raster data, missing observations are often termed NODATA; we will style them as nodata in this document. RasterFrames provides a variety of functions to manage and inspect nodata within `tile`s. +### Masking and NoData -See also statistical summaries to get the count of data and nodata values per `tile` and aggregate in a `tile` column: @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). +See @ref:[NoData handling](nodata-handling.md) for conceptual discussion of cell types and NoData. -It is important to note that not all cell types support the nodata representation: these are `bool` and when the cell type string ends in `raw`. +There are statistical functions of the count of data and NoData values per `tile` and aggregate over a `tile` column: @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). -For integral valued cell types, the nodata is marked by a special sentinel value. This can be a default, typically zero or the minimum value for the underlying data type. The nodata value can also be a user-defined value. For example if the value 4 is to be interpreted as nodata, the cell type will read 'int32ud4'. - -For float cell types, the nodata can either be NaN or a user-defined value; for example `'float32ud-999.9'` would mean the value -999.9 is interpreted as a nodata. - -For more reading about cell types and ndodata, see the [GeoTrellis documentation](https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html?#working-with-cell-values). +Masking is a raster operation that sets specific cells to NoData based on the values in another raster. #### rf_mask Tile rf_mask(Tile tile, Tile mask) -Where the `mask` contains nodata, replace values in the `tile` with nodata. +Where the `mask` contains NoData, replace values in the `tile` with NoData. + +Returned `tile` cell type will be coerced to one supporting NoData if it does not already. -Returned `tile` cell type will be coerced to one supporting nodata if it does not already. +See also @[`rf_rasterize`](reference.md#rf-rasterize). #### rf_inverse_mask Tile rf_inverse_mask(Tile tile, Tile mask) -Where the `mask` _does not_ contain nodata, replace values in `tile` with nodata. +Where the `mask` _does not_ contain NoData, replace values in `tile` with NoData. #### rf_mask_by_value Tile rf_mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value) -Generate a `tile` with the values from `data_tile`, with nodata in cells where the `mask_tile` is equal to `mask_value`. +Generate a `tile` with the values from `data_tile`, with NoData in cells where the `mask_tile` is equal to `mask_value`. #### rf_is_no_data_tile Boolean rf_is_no_data_tile(Tile) -Returns true if `tile` contains only nodata. By definition returns false if cell type does not support nodata. To count nodata cells or data cells, see @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_local_no_data_cells`](reference.md#rf-agg-local-no-data-cells), and @ref:[`rf_agg_local_data_cells`](reference.md#rf-agg-local-data-cells). This function is distinguished from @ref:[`rf_for_all`](reference.md#rf-for-all), which tests that values are not nodata and nonzero. +Returns true if `tile` contains only NoData. By definition returns false if cell type does not support NoData. To count NoData cells or data cells, see @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_local_no_data_cells`](reference.md#rf-agg-local-no-data-cells), and @ref:[`rf_agg_local_data_cells`](reference.md#rf-agg-local-data-cells). This function is distinguished from @ref:[`rf_for_all`](reference.md#rf-for-all), which tests that values are not NoData and nonzero. #### rf_with_no_data Tile rf_with_no_data(Tile tile, Double no_data_value) -Python only. Return a `tile` column marking as nodata all cells equal to `no_data_value`. +Python only. Return a `tile` column marking as NoData all cells equal to `no_data_value`. The `no_data_value` argument is a literal Double, not a Column expression. -If input `tile` had a nodata value already, the behaviour depends on if its cell type is floating point or not. For floating point cell type `tile`, nodata values on the input `tile` remain nodata values on the output. For integral cell type `tile`s, the previous nodata values become literal values. +If input `tile` had a NoData value already, the behaviour depends on if its cell type is floating point or not. For floating point cell type `tile`, NoData values on the input `tile` remain NoData values on the output. For integral cell type `tile`s, the previous NoData values become literal values. ### Local Map Algebra @@ -435,14 +434,14 @@ spark.sql(""" Double rf_tile_sum(Tile tile) -Computes the sum of cells in each row of column `tile`, ignoring nodata values. +Computes the sum of cells in each row of column `tile`, ignoring NoData values. #### rf_tile_mean Double rf_tile_mean(Tile tile) -Computes the mean of cells in each row of column `tile`, ignoring nodata values. +Computes the mean of cells in each row of column `tile`, ignoring NoData values. #### rf_tile_min @@ -450,7 +449,7 @@ Computes the mean of cells in each row of column `tile`, ignoring nodata values. Double rf_tile_min(Tile tile) -Computes the min of cells in each row of column `tile`, ignoring nodata values. +Computes the min of cells in each row of column `tile`, ignoring NoData values. #### rf_tile_max @@ -458,7 +457,7 @@ Computes the min of cells in each row of column `tile`, ignoring nodata values. Double rf_tile_max(Tile tile) -Computes the max of cells in each row of column `tile`, ignoring nodata values. +Computes the max of cells in each row of column `tile`, ignoring NoData values. #### rf_no_data_cells @@ -466,7 +465,7 @@ Computes the max of cells in each row of column `tile`, ignoring nodata values. Long rf_no_data_cells(Tile tile) -Return the count of nodata cells in the `tile`. +Return the count of NoData cells in the `tile`. #### rf_data_cells @@ -478,19 +477,19 @@ Return the count of data cells in the `tile`. Boolean rf_exists(Tile tile) -Returns true if any cells in the tile are true (non-zero and not nodata). +Returns true if any cells in the tile are true (non-zero and not NoData). #### rf_for_all Boolean rf_for_all(Tile tile) -Returns true if all cells in the tile are true (non-zero and not nodata). See also @ref:[`rf_is_no_data_tile](reference.md#rf-is-no-data-tile), which tests that all cells are nodata. +Returns true if all cells in the tile are true (non-zero and not NoData). See also @ref:[`rf_is_no_data_tile](reference.md#rf-is-no-data-tile), which tests that all cells are NoData. #### rf_tile_stats Struct[Long, Long, Double, Double, Double, Double] rf_tile_stats(Tile tile) -Computes the following statistics of cells in each row of column `tile`: data cell count, nodata cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring nodata values. +Computes the following statistics of cells in each row of column `tile`: data cell count, NoData cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring NoData values. #### rf_tile_histogram @@ -547,7 +546,7 @@ SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).mean` -Aggregates over the `tile` and return the mean of cell values, ignoring nodata. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.mean`. +Aggregates over the `tile` and return the mean of cell values, ignoring NoData. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.mean`. #### rf_agg_data_cells @@ -571,14 +570,14 @@ rf.agg(F.sum(rf_data_cells(rf.tile)).alias('agg_data_cell')) _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` -Aggregates over the `tile` and return the count of nodata cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.noDataCells`. C.F. @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells) a row-wise count of no data cells. +Aggregates over the `tile` and return the count of NoData cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.noDataCells`. C.F. @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells) a row-wise count of no data cells. #### rf_agg_stats Struct[Long, Long, Double, Double, Double, Double] rf_agg_stats(Tile tile) -Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of nodata cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of nodata. +Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of NoData. #### rf_agg_approx_histogram @@ -677,7 +676,7 @@ Compute the cell-local count of data cells over Tiles in a column. Returned `til Tile rf_agg_local_no_data_cells(Tile tile) -Compute the cell-local count of nodata cells over Tiles in a column. Returned `tile` has a cell type of `int32`. +Compute the cell-local count of NoData cells over Tiles in a column. Returned `tile` has a cell type of `int32`. #### rf_agg_local_stats From 76ad2fe4965fe8169d266aa541aa7616fcbf5a40 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 17 Jul 2019 17:17:43 -0400 Subject: [PATCH 230/380] Fix some docs links Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/raster-catalogs.pymd | 5 +++-- pyrasterframes/src/main/python/docs/raster-read.pymd | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd index 1f89a7343..55d5ec68f 100644 --- a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd +++ b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd @@ -5,7 +5,7 @@ While much interesting processing can be done on a @ref:[single raster file](ras A _Catalog_ can have one or two dimensions: * One-D: A single column containing one or many URLs across the rows. All referenced rasters represent the same content type. For example, a column of URLs to Landsat 8 NIR rasters covering Europe. Each row represents different places and times. -* Two-D: Many columns containing raster URLs. Each column references the same content type, and each row represents the same place and time. For example, red-, green-, and blue-band columns for scenes covering Europe. Each row reperesents a single spatiotemporal location (or scene) with the same dimensions, extent, CRS, etc across the row. +* Two-D: Many columns containing raster URLs. Each column references the same content type, and each row represents the same place and time. For example, red-, green-, and blue-band columns for scenes covering Europe. Each row reperesents a single spatiotemporal location (or scene) with the same dimensions, extent, [_CRS_][CRS], etc across the row. ## Creating a Catalog @@ -164,4 +164,5 @@ root ``` [MODIS]: https://docs.opendata.aws/modis-pds/readme.html -[Landsat]: https://docs.opendata.aws/landsat-pds/readme.html \ No newline at end of file +[Landsat]: https://docs.opendata.aws/landsat-pds/readme.html +[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index a95942fb0..29cb55c14 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -40,7 +40,7 @@ You can also see that the single raster has been broken out into many arbitrary rf.groupby(rf.proj_raster_path).count().show() ``` -Let's select a single tile and view it. The tile preview image as well as the string representation provide some basic information about the tile: it's dimensions as number of columns and rows, and the cell type, or data type of all the cells in the tile. For more about cell types, refer to @ref:[the NoData page](noData-handling.md#cell-types). +Let's select a single tile and view it. The tile preview image as well as the string representation provide some basic information about the tile: it's dimensions as number of columns and rows, and the cell type, or data type of all the cells in the tile. For more about cell types, refer to @ref:[this discussion](nodata-handling.md#cell-types). ```python show_tile_sample tile = rf.select(rf_tile("proj_raster")).first()[0] @@ -172,4 +172,5 @@ mb2 = spark.read.raster(catalog=spark.createDataFrame(mb_cat), ) mb2.printSchema() ``` - \ No newline at end of file + +[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system \ No newline at end of file From e5deda712d95fdab3f8121934eb21eb072b5c2c8 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 22 Jul 2019 13:10:28 -0400 Subject: [PATCH 231/380] time series docs Signed-off-by: Jason T. Brown --- .../src/main/python/docs/time-series.pymd | 117 +++++++++++++++++- pyrasterframes/src/main/python/setup.py | 1 + 2 files changed, 117 insertions(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/time-series.pymd b/pyrasterframes/src/main/python/docs/time-series.pymd index 304f05a9d..6edd61ed1 100644 --- a/pyrasterframes/src/main/python/docs/time-series.pymd +++ b/pyrasterframes/src/main/python/docs/time-series.pymd @@ -1,4 +1,119 @@ # Time Series -/[ Example of generating time series of NDVI as visual phenology indicators. /] +## Analysis Plan +```python setup, echo=False +from IPython.display import display +import pyrasterframes +from pyrasterframes.rasterfunctions import * +import pyrasterframes.rf_ipython + +spark = pyrasterframes.get_spark_session() +``` + +In this example we will show how the flexibility of the DataFrame concept for raster data allows a simple and intuitive way to extract a time series from Earth observation data. We will start with our @ref:[built-in MODIS data catalog](raster-catalogs.md#using-built-in-experimental-catalogs). + +```python catalog +cat = spark.read.format('aws-pds-modis-catalog').load().repartition(200) +cat.printSchema() +``` + +We will summarize the change in NDVI over 2018 in the Cuyahoga Valley National Park in Ohio USA. First, we will retrieve open vector data delineating the park boundary from the US National Park Service's LandsNet. + +```python get_park_boundary +import requests +import geopandas +nps_data_query_url = 'https://services1.arcgis.com/fBc8EJBxQRMcHlei/arcgis/rest/services/NPS_Park_Boundaries/FeatureServer/0/query?where=1%3D1&outFields=*&geometry=-82.451%2C41.075%2C-80.682%2C41.436&geometryType=esriGeometryEnvelope&inSR=4326&spatialRel=esriSpatialRelIntersects&outSR=4326&f=json' +r = requests.get(nps_data_query_url) +with open('/tmp/parks.geojson', 'wb') as f: + for chunk in r.iter_content(chunk_size=128): + f.write(chunk) + +park_df = geopandas.read_file('/tmp/parks.geojson') +park_geo = park_df[park_df.UNIT_CODE=='CUVA'].geometry[0] + +park_geo.wkt[:100] +``` + +The entire park boundary is contained in MODIS granule h11 v4. We will simply filter on this granule, rather than using a proper @ref:[spatial relation](vector-data.md#geomesa-functions-and-spatial-relations). The time period selected should show the change in plant vigor as leaves emerge over the spring into early summer. + +```python query_catalog +from pyspark.sql.functions import lit +park_cat = cat.filter( + (cat.granule_id == 'h11v04') & + (cat.acquisition_date > lit('2018-02-19')) & + (cat.acquisition_date < lit('2018-07-01')) + ) +park_cat.printSchema() +``` + +## Catalog Read + +Now we have a catalog with several months of MODIS data for a single granule. However the granule is larger than our park boundary. We will combine the park geometry with the catalog, and read only the bands of interest to compute NDVI, which we discussed @ref:[earlier](local-algebra.md#computing-ndvi). + +```python read_catalog +raster_cols = ['B01', 'B02',] # red and near-infrared respectively +park_rf = spark.read.raster(catalog=park_cat.select(['acquisition_date', 'granule_id'] + raster_cols), + catalog_col_names=raster_cols, + ) \ + .withColumn('park', st_geomFromWKT(lit(park_geo.wkt))) +park_rf.createOrReplaceTempView('catalog_read') +park_rf.printSchema() +``` + +## Vector and Raster Data Interaction + +Now we have the vector representation of the park boundary alongside the tiles of red and near infrared bands. Next we need to create a tile representation of the park to allow us to limit the time series analysis to pixels within the park. This is similar to the masking operation demonstrated in @ref:[NoData handling](nodata-handling.md#masking). + +We do this using two SQL transformation. This demonstrates that we can use any `rf_` or `st_` function in SQL. The first one will reproject the park boundary from coordinates to the MODIS sinusoidal projection. The second one will create a new tile aligned with the imagery containing value 1 where the pixels are contained within the park and NoData elsewhere. + +```python burn_in +cr_1 = spark.sql(""" +SELECT *, + st_reproject(park, 'EPSG:4326', rf_crs(B01).crsProj4) as park_native +FROM catalog_read +""") +cr_1.createOrReplaceTempView('cr_1') + +cr_2 = spark.sql(""" +SELECT *, + rf_rasterize(park_native, rf_geometry(B01), 1, rf_dimensions(B01).cols, rf_dimensions(B01).rows) as park_tile +FROM cr_1 +""").where(rf_tile_sum('park_tile') > 0) +cr_2.printSchema() +``` + +## Create Time Series + +Next we will compute NDVI as the normalized difference of near infrared (band 2) and red (band 1). The tiles are masked by the `park_tile`. We will then aggregate across the remaining values to arrive at an average NDVI for each week of the year. Note that the computation is creating a weighted average, weighting by the number of valid observations per week. + +```python ndvi_time_series +from pyspark.sql.functions import col, year, weekofyear, month +from pyspark.sql.functions import sum as sql_sum + +rf_ndvi = cr_2.withColumn('ndvi', rf_normalized_difference('B02', 'B01')) \ + .withColumn('ndvi_masked', rf_mask('ndvi', 'park_tile')) + +time_series = rf_ndvi \ + .withColumn('ndvi_wt', rf_tile_sum('ndvi_masked')) \ + .withColumn('wt', rf_data_cells('ndvi_masked')) \ + .groupby(year('acquisition_date').alias('year'), weekofyear('acquisition_date').alias('week')) \ + .agg(sql_sum('ndvi_wt').alias('ndvi_wt'), sql_sum('wt').alias('wt')) \ + .withColumn('ndvi', col('ndvi_wt') / col('wt')) + +``` + +Finally we will take a look at the NDVI over time. + +```python time_series_display +import matplotlib.pyplot as plt + +time_series_pdf = time_series.toPandas() +time_series_pdf = time_series_pdf.sort_values('week') +plt.plot(time_series_pdf['week'], time_series_pdf['ndvi'], 'go-') +plt.xlabel('Week of year, 2018') +plt.ylabel('NDVI') +plt.title('Cuyahoga Valley NP Green-up') +``` + +We can see two fairly clear elbows in the curve at week 17 and week 21, indicating the start and end of the green up period. Estimation of such parameters is one technique [phenology](https://en.wikipedia.org/wiki/Phenology) researchers use to monitor changes in climate and environment! diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 2c1c9e753..91d5cd188 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -123,6 +123,7 @@ def doctype(self): 'matplotlib<3.0.0', 'pandas', 'geopandas', + 'requests', 'pytest-runner', 'setuptools>=0.8', 'ipython==6.2.1', From 6eb934bd9c82a3314caca3aecf29b7c6c152add3 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 22 Jul 2019 13:22:35 -0400 Subject: [PATCH 232/380] Add numpy interop outline to populate; tweaks of opportunity Signed-off-by: Jason T. Brown --- .../expressions/localops/NormalizedDifference.scala | 2 +- pyrasterframes/README.md | 2 +- pyrasterframes/src/main/python/docs/pandas-numpy.md | 8 ++++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala index 079fd7273..e62ccfc37 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/NormalizedDifference.scala @@ -38,7 +38,7 @@ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback * right - second tile argument""", examples = """ Examples: - > SELECT _FUNC_(nir, red); + > SELECT _FUNC_(nir, red) as ndvi; ...""" ) case class NormalizedDifference(left: Expression, right: Expression) extends BinaryRasterOp with CodegenFallback { diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index a7c3b3235..b857762f5 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -135,7 +135,7 @@ Observe the output messages such as: [info] Python .whl file written to '/Users/monty/rasterframes/pyrasterframes/target/python/dist/pyrasterframes-0.8.0.dev0-py2.py3-none-any.whl' -This wheel is suitable for publishing to a package index. See [https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives](packaging.python.org). +This wheel is suitable for publishing to a package index. See [packaging.python.org](https://packaging.python.org/tutorials/packaging-projects/#uploading-the-distribution-archives). ## Build Internals diff --git a/pyrasterframes/src/main/python/docs/pandas-numpy.md b/pyrasterframes/src/main/python/docs/pandas-numpy.md index 35c124f61..812825170 100644 --- a/pyrasterframes/src/main/python/docs/pandas-numpy.md +++ b/pyrasterframes/src/main/python/docs/pandas-numpy.md @@ -1,2 +1,10 @@ # Pandas and NumPy Interoperabilty +\[ be sure to discuss the performance implications; basically do as much on spark as possible and expect sluggish collect and udt applications \] + +* Small/realistic DF toPandas, + * inspect contents of what you get; t.cells is np ndarray + * reference to writing page section on previews. +* UDT on tile; log1p from test_udf_on_tile_type_output +* Bonus : pandas +* Array to spark dataframe; using the Tile class From 0642a97b22cd559c4e728ff723817742fdfae23a Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 18 Jul 2019 16:50:16 -0400 Subject: [PATCH 233/380] Fix for #190; L8 catalog use Extent schema not envelope Signed-off-by: Jason T. Brown --- .../awspds/L8CatalogRelationTest.scala | 23 +++++++++++++++++-- .../datasource/awspds/PDSFields.scala | 2 +- 2 files changed, 22 insertions(+), 3 deletions(-) diff --git a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala index cfc901b9a..9b6d8480f 100644 --- a/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala +++ b/experimental/src/it/scala/org/locationtech/rasterframes/experimental/datasource/awspds/L8CatalogRelationTest.scala @@ -62,10 +62,29 @@ class L8CatalogRelationTest extends TestEnvironment { WHERE st_intersects(st_geometry(bounds_wgs84), st_geomFromText('LINESTRING (-39.551 -7.1881, -72.2461 -45.7062)')) AND acquisition_date > to_timestamp('2017-11-01') AND - acquisition_date <= to_timestamp('2017-11-03') + acquisition_date <= to_timestamp('2017-12-13') """) - scenes.count() shouldBe > (200L) + scenes.count() shouldBe > (100L) + } + + it("should construct expected extents") { + catalog.createOrReplaceTempView("l8_catalog") + + catalog.filter($"bounds_wgs84.xmin" > $"bounds_wgs84.xmax").count() shouldBe (0) + catalog.filter($"bounds_wgs84.ymin" > $"bounds_wgs84.ymax").count() shouldBe (0) + + val geo_area_row = spark.sql( + """ + SELECT min(st_area(st_geometry(bounds_wgs84))) AS area + FROM l8_catalog + WHERE st_intersects(st_geometry(bounds_wgs84), st_geomFromText('LINESTRING(-78.035 39.004,-80.166 37.241)')) AND + acquisition_date > to_timestamp('2017-11-01') AND + acquisition_date <= to_timestamp('2017-11-16') + """).first() + val geo_area = geo_area_row.getDouble(0) + geo_area shouldBe < (6.5) + geo_area shouldBe > (4.5) } } diff --git a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala index a0af40148..40f8949f7 100644 --- a/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala +++ b/experimental/src/main/scala/org/locationtech/rasterframes/experimental/datasource/awspds/PDSFields.scala @@ -46,7 +46,7 @@ trait PDSFields { final val ROW = StructField("row", ShortType, false) final val BOUNDS = StructField(GEOMETRY_COLUMN.columnName, JTSTypes.GeometryTypeInstance, false) final def BOUNDS_WGS84 = StructField( - "bounds_wgs84", StandardEncoders.envelopeEncoder.schema, false + "bounds_wgs84", StandardEncoders.extentEncoder.schema, false ) } From 4b2ecf7987efa0e73386bbfbbf51328dda02035e Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Tue, 23 Jul 2019 11:29:09 -0400 Subject: [PATCH 234/380] convert function ref code chunks to running code Signed-off-by: Courtney Whalen --- .../src/main/python/docs/reference.pymd | 252 +++++++----------- 1 file changed, 95 insertions(+), 157 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index f2866fbd3..da268f32f 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -1,6 +1,6 @@ # Function Reference -RasterFrames provides SQL and Python bindings to many UDFs using the `Tile` column type. In Spark SQL, the functions are already registered in the SQL engine; they are usually prefixed with `rf_`. In Python, they are available in the `pyrasterframes.rasterfunctions` module. +RasterFrames provides SQL and Python bindings to many UDFs using the `Tile` column type. In Spark SQL, the functions are already registered in the SQL engine; they are usually prefixed with `rf_`. In Python, they are available in the `pyrasterframes.rasterfunctions` module. The convention in this document will be to define the function signature as below, with its return type, the function name, and named arguments with their types. @@ -39,7 +39,7 @@ RasterFrames provides some additional functions for vector geometry operations. Geometry st_reproject(Geometry geom, String origin_crs, String destination_crs) -Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. +Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. #### st_extent @@ -50,11 +50,11 @@ Extracts the bounding box (extent/envelope) of the geometry. See also GeoMesa [st_envelope](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#st-envelope) which returns a Geometry type. -#### st_geometry +#### st_geometry Geometry st_geometry(Struct[Double xmin, Double xmax, Double ymin, Double ymax] extent) - -Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`](reference.md#st-extent) or @ref:[`rf_extent`](reference.md#rf-extent). + +Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`](reference.md#st-extent) or @ref:[`rf_extent`](reference.md#rf-extent). ### Tile Metadata and Mutation @@ -63,29 +63,26 @@ Functions to access and change the particulars of a `tile`: its shape and the da #### rf_cell_types Array[String] rf_cell_types() - + Print an array of possible cell type names, as below. These names are used in other functions. See @ref:[discussion on NoData](reference.md#masking-and-NoData) for additional details. -```python -rf_cell_types() -``` #### rf_dimensions Struct[Int, Int] rf_dimensions(Tile tile) - + Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. #### rf_cell_type Struct[String] rf_cell_type(Tile tile) - -Get the cell type of the `tile`. The cell type can be changed with @ref:[rf_convert_cell_type](reference.md#rf-convert-cell-type). + +Get the cell type of the `tile`. The cell type can be changed with @ref:[rf_convert_cell_type](reference.md#rf-convert-cell-type). #### rf_tile Tile rf_tile(ProjectedRasterTile proj_raster) - + Get the `tile` from the `ProjectedRasterTile` or `RasterSource` type tile column. #### rf_extent @@ -99,23 +96,23 @@ Fetches the extent (bounding box or envelope) of a `ProjectedRasterTile` or `Ras Struct[String] rf_crs(ProjectedRasterTile proj_raster) Struct[String] rf_crs(RasterSource proj_raster) - + Fetch the [proj4](https://proj4.org/) string representation of the coordinate reference system of a `ProjectedRasterTile` or `RasterSource` type tile columns. #### rf_convert_cell_type Tile rf_convert_cell_type(Tile tileCol, String cellType) -Convert `tileCol` to a different cell type. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. +Convert `tileCol` to a different cell type. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. #### rf_resample Tile rf_resample(Tile tile, Double factor) Tile rf_resample(Tile tile, Int factor) Tile rf_resample(Tile tile, Tile shape_tile) - -Change the tile dimension. Passing a numeric `factor` will scale the number of columns and rows in the tile: 1.0 is the same number of columns and row; less than one downsamples the tile; and greater than one upsamples the tile. Passing a `shape_tile` as the second argument outputs `tile` having the same number of columns and rows as `shape_tile`. All resampling is by nearest neighbor method. + +Change the tile dimension. Passing a numeric `factor` will scale the number of columns and rows in the tile: 1.0 is the same number of columns and row; less than one downsamples the tile; and greater than one upsamples the tile. Passing a `shape_tile` as the second argument outputs `tile` having the same number of columns and rows as `shape_tile`. All resampling is by nearest neighbor method. ### Tile Creation @@ -142,7 +139,7 @@ Create a `tile` of shape `tile_columns` by `tile_rows` full of ones, with the sp #### rf_make_constant_tile Tile rf_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, String cell_type_name) - + Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. @@ -150,7 +147,7 @@ Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with #### rf_rasterize Tile rf_rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows) - + Convert a vector Geometry `geom` into a Tile representation. The `value` will be "burned-in" to the returned `tile` where the `geom` intersects the `tile_bounds`. Returned `tile` will have shape `tile_columns` by `tile_rows`. Values outside the `geom` will be assigned a NoData value. Returned `tile` has cell type `int32`, note that `value` is of type Int. @@ -165,7 +162,7 @@ spark.sql(""" SELECT rf_render_ascii( rf_rasterize(tri, b, 8, 10, 10)) -FROM +FROM ( SELECT st_geomFromWKT('POLYGON((1.5 0.5, 1.5 1.5, 0.5 0.5, 1.5 0.5))') AS tri, st_geomFromWKT('POLYGON((0.0 0.0, 2.0 0.0, 2.0 2.0, 0.0 2.0, 0.0 0.0))') AS b ) r @@ -176,13 +173,13 @@ FROM #### rf_array_to_tile Tile rf_array_to_tile(Array arrayCol, Int numCols, Int numRows) - + Python only. Create a `tile` from a Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), filling values in row-major order. #### rf_assemble_tile Tile rf_assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, String cellType) - + Python only. Create a Tile from a column of cell data with location indices. This function is the inverse of @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles). Intended use is with a `groupby`, producing one row with a new `tile` per group. The `numCols`, `numRows` and `cellType` arguments are literal values, others are column expressions. Valid values for `cellType` can be found with function @ref:[`rf_cell_types`](reference.md#rf-cell-types). ### Masking and NoData @@ -196,53 +193,53 @@ Masking is a raster operation that sets specific cells to NoData based on the va #### rf_mask Tile rf_mask(Tile tile, Tile mask) - + Where the `mask` contains NoData, replace values in the `tile` with NoData. Returned `tile` cell type will be coerced to one supporting NoData if it does not already. See also @[`rf_rasterize`](reference.md#rf-rasterize). - + #### rf_inverse_mask Tile rf_inverse_mask(Tile tile, Tile mask) - -Where the `mask` _does not_ contain NoData, replace values in `tile` with NoData. + +Where the `mask` _does not_ contain NoData, replace values in `tile` with NoData. #### rf_mask_by_value Tile rf_mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value) - -Generate a `tile` with the values from `data_tile`, with NoData in cells where the `mask_tile` is equal to `mask_value`. + +Generate a `tile` with the values from `data_tile`, with NoData in cells where the `mask_tile` is equal to `mask_value`. #### rf_is_no_data_tile Boolean rf_is_no_data_tile(Tile) - + Returns true if `tile` contains only NoData. By definition returns false if cell type does not support NoData. To count NoData cells or data cells, see @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_local_no_data_cells`](reference.md#rf-agg-local-no-data-cells), and @ref:[`rf_agg_local_data_cells`](reference.md#rf-agg-local-data-cells). This function is distinguished from @ref:[`rf_for_all`](reference.md#rf-for-all), which tests that values are not NoData and nonzero. #### rf_with_no_data Tile rf_with_no_data(Tile tile, Double no_data_value) - + Python only. Return a `tile` column marking as NoData all cells equal to `no_data_value`. The `no_data_value` argument is a literal Double, not a Column expression. -If input `tile` had a NoData value already, the behaviour depends on if its cell type is floating point or not. For floating point cell type `tile`, NoData values on the input `tile` remain NoData values on the output. For integral cell type `tile`s, the previous NoData values become literal values. +If input `tile` had a NoData value already, the behaviour depends on if its cell type is floating point or not. For floating point cell type `tile`, NoData values on the input `tile` remain NoData values on the output. For integral cell type `tile`s, the previous NoData values become literal values. ### Local Map Algebra -[Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single tile (unary), between a `tile` and a scalar, between two `tile`s, or across many `tile`s. +[Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single tile (unary), between a `tile` and a scalar, between two `tile`s, or across many `tile`s. The binary local map algebra functions have similar variations in the Python API depending on the left hand side type: - `rf_local_op`: applies `op` to two columns; the right hand side can be a `tile` or a numeric column. - `rf_local_op_double`: applies `op` to a `tile` and a literal scalar, coercing the `tile` to a floating point type - `rf_local_op_int`: applies `op` to a `tile` and a literal scalar, without coercing the `tile` to a floating point type - + The SQL API does not require the `rf_local_op_double` or `rf_local_op_int` forms (just `rf_local_op`). Local map algebra operations for more than two tiles are implemented to work across rows in the data frame. As such, they are @ref:[aggregate functions](reference.md#tile-local-aggregate-statistics). @@ -252,7 +249,7 @@ Local map algebra operations for more than two tiles are implemented to work acr Tile rf_local_add(Tile tile1, Tile rhs) Tile rf_local_add_int(Tile tile1, Int rhs) Tile rf_local_add_double(Tile tile1, Double rhs) - + Returns a `tile` column containing the element-wise sum of `tile1` and `rhs`. @@ -261,7 +258,7 @@ Returns a `tile` column containing the element-wise sum of `tile1` and `rhs`. Tile rf_local_subtract(Tile tile1, Tile rhs) Tile rf_local_subtract_int(Tile tile1, Int rhs) Tile rf_local_subtract_double(Tile tile1, Double rhs) - + Returns a `tile` column containing the element-wise difference of `tile1` and `rhs`. @@ -271,7 +268,7 @@ Returns a `tile` column containing the element-wise difference of `tile1` and `r Tile rf_local_multiply(Tile tile1, Tile rhs) Tile rf_local_multiply_int(Tile tile1, Int rhs) Tile rf_local_multiply_double(Tile tile1, Double rhs) - + Returns a `tile` column containing the element-wise product of `tile1` and `rhs`. This is **not** the matrix multiplication of `tile1` and `rhs`. @@ -281,71 +278,71 @@ Returns a `tile` column containing the element-wise product of `tile1` and `rhs` Tile rf_local_divide(Tile tile1, Tile rhs) Tile rf_local_divide_int(Tile tile1, Int rhs) Tile rf_local_divide_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise quotient of `tile1` and `rhs`. +Returns a `tile` column containing the element-wise quotient of `tile1` and `rhs`. -#### rf_normalized_difference + +#### rf_normalized_difference Tile rf_normalized_difference(Tile tile1, Tile tile2) - -Compute the normalized difference of the the two `tile`s: `(tile1 - tile2) / (tile1 + tile2)`. Result is always floating point cell type. This function has no scalar variant. + +Compute the normalized difference of the the two `tile`s: `(tile1 - tile2) / (tile1 + tile2)`. Result is always floating point cell type. This function has no scalar variant. #### rf_local_less Tile rf_local_less(Tile tile1, Tile rhs) Tile rf_local_less_int(Tile tile1, Int rhs) Tile rf_local_less_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise evaluation of `tile1` is less than `rhs`. + +Returns a `tile` column containing the element-wise evaluation of `tile1` is less than `rhs`. #### rf_local_less_equal Tile rf_local_less_equal(Tile tile1, Tile rhs) Tile rf_local_less_equal_int(Tile tile1, Int rhs) Tile rf_local_less_equal_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise evaluation of `tile1` is less than or equal to `rhs`. + +Returns a `tile` column containing the element-wise evaluation of `tile1` is less than or equal to `rhs`. #### rf_local_greater Tile rf_local_greater(Tile tile1, Tile rhs) Tile rf_local_greater_int(Tile tile1, Int rhs) Tile rf_local_greater_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than `rhs`. + +Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than `rhs`. #### rf_local_greater_equal Tile rf_local_greater_equal(Tile tile1, Tile rhs) Tile rf_local_greater_equal_int(Tile tile1, Int rhs) Tile rf_local_greater_equal_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than or equal to `rhs`. + +Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than or equal to `rhs`. #### rf_local_equal Tile rf_local_equal(Tile tile1, Tile rhs) Tile rf_local_equal_int(Tile tile1, Int rhs) Tile rf_local_equal_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise equality of `tile1` and `rhs`. + +Returns a `tile` column containing the element-wise equality of `tile1` and `rhs`. #### rf_local_unequal Tile rf_local_unequal(Tile tile1, Tile rhs) Tile rf_local_unequal_int(Tile tile1, Int rhs) Tile rf_local_unequal_double(Tile tile1, Double rhs) - -Returns a `tile` column containing the element-wise inequality of `tile1` and `rhs`. + +Returns a `tile` column containing the element-wise inequality of `tile1` and `rhs`. #### rf_round @@ -358,7 +355,7 @@ Round cell values to the nearest integer without changing the cell type. Tile rf_abs(Tile tile) Compute the absolute value of cell value. - + #### rf_exp Tile rf_exp(Tile tile) @@ -412,34 +409,26 @@ Performs natural logarithm of cell values plus one. Inverse of @ref:[`rf_expm1`] The following functions compute a statistical summary per row of a `tile` column. The statistics are computed across the cells of a single `tile`, within each DataFrame Row. Consider the following example. ```python -import pyspark.functions as F +import pyspark.sql.functions as F spark.sql(""" - SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t + SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION - SELECT 2 as id, rf_local_multiply(rf_tile_ones(5, 5, 'float32'), 3) as t + SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t """).select(F.col('id'), rf_tile_sum(F.col('t'))).show() - - -+---+-----------+ -| id|rf_tile_sum(t)| -+---+-----------+ -| 2| 75.0| -| 1| 25.0| -+---+-----------+ ``` #### rf_tile_sum Double rf_tile_sum(Tile tile) - + Computes the sum of cells in each row of column `tile`, ignoring NoData values. #### rf_tile_mean Double rf_tile_mean(Tile tile) - + Computes the mean of cells in each row of column `tile`, ignoring NoData values. @@ -447,7 +436,7 @@ Computes the mean of cells in each row of column `tile`, ignoring NoData values. #### rf_tile_min Double rf_tile_min(Tile tile) - + Computes the min of cells in each row of column `tile`, ignoring NoData values. @@ -455,7 +444,7 @@ Computes the min of cells in each row of column `tile`, ignoring NoData values. #### rf_tile_max Double rf_tile_max(Tile tile) - + Computes the max of cells in each row of column `tile`, ignoring NoData values. @@ -463,21 +452,21 @@ Computes the max of cells in each row of column `tile`, ignoring NoData values. #### rf_no_data_cells Long rf_no_data_cells(Tile tile) - + Return the count of NoData cells in the `tile`. #### rf_data_cells Long rf_data_cells(Tile tile) - + Return the count of data cells in the `tile`. #### rf_exists Boolean rf_exists(Tile tile) - -Returns true if any cells in the tile are true (non-zero and not NoData). + +Returns true if any cells in the tile are true (non-zero and not NoData). #### rf_for_all @@ -488,14 +477,14 @@ Returns true if all cells in the tile are true (non-zero and not NoData). See al #### rf_tile_stats Struct[Long, Long, Double, Double, Double, Double] rf_tile_stats(Tile tile) - -Computes the following statistics of cells in each row of column `tile`: data cell count, NoData cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring NoData values. + +Computes the following statistics of cells in each row of column `tile`: data cell count, NoData cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring NoData values. #### rf_tile_histogram Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_tile_histogram(Tile tile) - + Computes a statistical summary of cell values within each row of `tile`. Resulting column has the below schema. Note that several of the other `tile` statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) which computes the statistics across all rows in a group. ``` @@ -517,33 +506,20 @@ Computes a statistical summary of cell values within each row of `tile`. Resulti These functions compute statistical summaries over all of the cell values *and* across all the rows in the DataFrame or group. Example use below computes a single double-valued mean per month, across all data cells in the `red_band` `tile` type column. This would return at most twelve rows. - -```python -from pyspark.functions import month -from pyrasterframes.functions import rf_agg_mean -rf.groupby(month(rf.datetime)).agg(rf_agg_mean(rf.red_band).alias('red_mean_monthly')) -``` - Continuing our example from the @ref:[Tile Statistics](reference.md#tile-statistics) section, consider the following. Note that only a single row is returned. It is averaging 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. -```python +```python spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t """).agg(rf_agg_mean(F.col('t'))).show(10, False) - -+--------------+ -|rf_agg_mean(t)| -+--------------+ -|2.0 | -+--------------+ ``` #### rf_agg_mean Double rf_agg_mean(Tile tile) - + _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).mean` Aggregates over the `tile` and return the mean of cell values, ignoring NoData. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.mean`. @@ -552,22 +528,15 @@ Aggregates over the `tile` and return the mean of cell values, ignoring NoData. #### rf_agg_data_cells Long rf_agg_data_cells(Tile tile) - -_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` -Aggregates over the `tile` and return the count of data cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.dataCells`. C.F. `data_cells`; equivalent code: +_SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` -```python -rf.select(rf_agg_data_cells(rf.tile).alias('agg_data_cell')) -# Equivalent to -import pyspark.sql.functions as F -rf.agg(F.sum(rf_data_cells(rf.tile)).alias('agg_data_cell')) -``` +Aggregates over the `tile` and return the count of data cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.dataCells`. #### rf_agg_no_data_cells Long rf_agg_no_data_cells(Tile tile) - + _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` Aggregates over the `tile` and return the count of NoData cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.noDataCells`. C.F. @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells) a row-wise count of no data cells. @@ -575,16 +544,16 @@ Aggregates over the `tile` and return the count of NoData cells. Equivalent to @ #### rf_agg_stats Struct[Long, Long, Double, Double, Double, Double] rf_agg_stats(Tile tile) - -Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of NoData. + +Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of NoData. #### rf_agg_approx_histogram Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_agg_approx_histogram(Tile tile) - -Aggregates over the `tile` return statistical summaries of the cell values, including a histogram, in the below schema. The `bins` array is of tuples of histogram values and counts. Typically values are plotted on the x-axis and counts on the y-axis. + +Aggregates over the `tile` return statistical summaries of the cell values, including a histogram, in the below schema. The `bins` array is of tuples of histogram values and counts. Typically values are plotted on the x-axis and counts on the y-axis. Note that several of the other cell value statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function which operates on a single row at a time. @@ -605,71 +574,48 @@ Note that several of the other cell value statistics functions are convenience m ### Tile Local Aggregate Statistics -Local statistics compute the element-wise statistics across a DataFrame or group of `tile`s, resulting in a `tile` that has the same dimension. +Local statistics compute the element-wise statistics across a DataFrame or group of `tile`s, resulting in a `tile` that has the same dimension. Consider again our example for Tile Statistics and Aggregate Tile Statistics, this time apply @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean). We see that it is computing the element-wise mean across the two rows. In this case it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. ```python -import pyspark.functions as F +import pyspark.sql.functions as F alm = spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION -SELECT 2 as id, rf_local_multiply(rf_tile_ones(5, 5, 'float32'), 3) as t +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t """).agg(rf_agg_local_mean(F.col('t')).alias('l')) \ ## local_agg_mean returns a tile alm.select(rf_dimensions(alm.l)).show() -## -+----------------+ -|rf_dimensions(l)| -+----------------+ -| [5, 5]| -+----------------+ -## alm.select(rf_explode_tiles(alm.l)).show(10, False) -## -+------------+---------+---+ -|column_index|row_index|l | -+------------+---------+---+ -|0 |0 |2.0| -|1 |0 |2.0| -|2 |0 |2.0| -|3 |0 |2.0| -|4 |0 |2.0| -|0 |1 |2.0| -|1 |1 |2.0| -|2 |1 |2.0| -|3 |1 |2.0| -|4 |1 |2.0| -+------------+---------+---+ -only showing top 10 rows ``` -#### rf_agg_local_max +#### rf_agg_local_max Tile rf_agg_local_max(Tile tile) - -Compute the cell-local maximum operation over Tiles in a column. -#### rf_agg_local_min +Compute the cell-local maximum operation over Tiles in a column. + +#### rf_agg_local_min Tile rf_agg_local_min(Tile tile) -Compute the cell-local minimum operation over Tiles in a column. +Compute the cell-local minimum operation over Tiles in a column. -#### rf_agg_local_mean +#### rf_agg_local_mean Tile rf_agg_local_mean(Tile tile) - -Compute the cell-local mean operation over Tiles in a column. -#### rf_agg_local_data_cells +Compute the cell-local mean operation over Tiles in a column. + +#### rf_agg_local_data_cells Tile rf_agg_local_data_cells(Tile tile) - + Compute the cell-local count of data cells over Tiles in a column. Returned `tile` has a cell type of `int32`. #### rf_agg_local_no_data_cells @@ -678,14 +624,14 @@ Compute the cell-local count of data cells over Tiles in a column. Returned `til Compute the cell-local count of NoData cells over Tiles in a column. Returned `tile` has a cell type of `int32`. -#### rf_agg_local_stats +#### rf_agg_local_stats Struct[Tile, Tile, Tile, Tile, Tile] rf_agg_local_stats(Tile tile) - + Compute cell-local aggregate count, minimum, maximum, mean, and variance for a column of Tiles. Returns a struct of five `tile`s. -### Converting Tiles +### Converting Tiles RasterFrames provides several ways to convert a `tile` into other data structures. See also functions for @ref:[creating tiles](reference.md#tile-creation). @@ -698,15 +644,8 @@ Create a row for each cell in `tile` columns. Many `tile` columns can be passed #### rf_explode_tiles_sample Int, Int, Numeric* rf_explode_tiles_sample(Double sample_frac, Long seed, Tile* tile) - -Python only. As with @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles), but taking a randomly sampled subset of cells. Equivalent to the below, but this implementation is optimized for speed. Parameter `sample_frac` should be between 0.0 and 1.0. -```python -df.select(df.id, rf_explode_tiles(df.tile1, df.tile2, df.tile3)) \ - .sample(False, 0.05, 8675309) -# Equivalent result, faster -df.select(df.id, rf_explode_tiles_sample(0.05, 8675309, df.tile1, df.tile2, df.tile3)) -``` +Python only. As with @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles), but taking a randomly sampled subset of cells. Equivalent to the below, but this implementation is optimized for speed. Parameter `sample_frac` should be between 0.0 and 1.0. #### rf_tile_to_array_int @@ -717,7 +656,7 @@ Convert Tile column to Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/ #### rf_tile_to_array_double Array rf_tile_to_arry_double(Tile tile) - + Convert tile column to Spark [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Integral cell types will be coerced to floats. #### rf_render_ascii @@ -734,4 +673,3 @@ Render Tile cell values as numeric values, for debugging purposes. [RasterFunctions]: org.locationtech.rasterframes.RasterFunctions [scaladoc]: latest/api/index.html - From 51ef846fc442d941537129d474394f2fc43b6b69 Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Tue, 23 Jul 2019 14:43:01 -0400 Subject: [PATCH 235/380] fix tile stats and histogram functions; promote headings up 1 level; remove rf_cell_types Signed-off-by: Courtney Whalen --- .../src/main/python/docs/reference.pymd | 211 ++++++++---------- 1 file changed, 90 insertions(+), 121 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index da268f32f..60ae7285e 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -10,7 +10,7 @@ ReturnDataType function_name(InputDataType argument1, InputDataType argument2) For the Scala documentation on these functions, see @scaladoc[`RasterFunctions`][RasterFunctions]. The full Scala API documentation can be found [here][scaladoc]. -## List of Available SQL and Python Functions +# List of Available SQL and Python Functions @@toc { depth=3 } @@ -28,13 +28,13 @@ become available for use with DataFrames. You can view all of the available func [fn for fn in dir() if fn.startswith('rf_') or fn.startswith('st_')] ``` -### Vector Operations +## Vector Operations Various LocationTech GeoMesa user-defined functions (UDFs) to deal with `geomtery` type columns are provided in the SQL engine and within the `pyrasterframes.rasterfunctions` Python module. These are documented in the [LocationTech GeoMesa Spark SQL documentation](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#). These functions are all prefixed with `st_`. RasterFrames provides some additional functions for vector geometry operations. -#### st_reproject +### st_reproject Geometry st_reproject(Geometry geom, String origin_crs, String destination_crs) @@ -42,7 +42,7 @@ RasterFrames provides some additional functions for vector geometry operations. Reproject the vector `geom` from `origin_crs` to `destination_crs`. Both `_crs` arguments are either [proj4](https://proj4.org/usage/quickstart.html) strings, [EPSG codes](https://www.epsg-registry.org/) codes or [OGC WKT](https://www.opengeospatial.org/standards/wkt-crs) for coordinate reference systems. -#### st_extent +### st_extent Struct[Double xmin, Double xmax, Double ymin, Double ymax] st_extent(Geometry geom) @@ -50,62 +50,55 @@ Extracts the bounding box (extent/envelope) of the geometry. See also GeoMesa [st_envelope](https://www.geomesa.org/documentation/user/spark/sparksql_functions.html#st-envelope) which returns a Geometry type. -#### st_geometry +### st_geometry Geometry st_geometry(Struct[Double xmin, Double xmax, Double ymin, Double ymax] extent) Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`](reference.md#st-extent) or @ref:[`rf_extent`](reference.md#rf-extent). -### Tile Metadata and Mutation +## Tile Metadata and Mutation -Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and NoData](reference.md#masking-and-NoData) for additional discussion of cell types. +Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and NoData](nodata-handling.md#masking-and-NoData) for additional discussion of cell types. -#### rf_cell_types - - Array[String] rf_cell_types() - -Print an array of possible cell type names, as below. These names are used in other functions. See @ref:[discussion on NoData](reference.md#masking-and-NoData) for additional details. - - -#### rf_dimensions +### rf_dimensions Struct[Int, Int] rf_dimensions(Tile tile) Get number of columns and rows in the `tile`, as a Struct of `cols` and `rows`. -#### rf_cell_type +### rf_cell_type Struct[String] rf_cell_type(Tile tile) Get the cell type of the `tile`. The cell type can be changed with @ref:[rf_convert_cell_type](reference.md#rf-convert-cell-type). -#### rf_tile +### rf_tile Tile rf_tile(ProjectedRasterTile proj_raster) Get the `tile` from the `ProjectedRasterTile` or `RasterSource` type tile column. -#### rf_extent +### rf_extent Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(ProjectedRasterTile proj_raster) Struct[Double xmin, Double xmax, Double ymin, Double ymax] rf_extent(RasterSource proj_raster) Fetches the extent (bounding box or envelope) of a `ProjectedRasterTile` or `RasterSource` type tile columns. -#### rf_crs +### rf_crs Struct[String] rf_crs(ProjectedRasterTile proj_raster) Struct[String] rf_crs(RasterSource proj_raster) Fetch the [proj4](https://proj4.org/) string representation of the coordinate reference system of a `ProjectedRasterTile` or `RasterSource` type tile columns. -#### rf_convert_cell_type +### rf_convert_cell_type Tile rf_convert_cell_type(Tile tileCol, String cellType) Convert `tileCol` to a different cell type. Available cell types can be retrieved with the @ref:[rf_cell_types](reference.md#rf-cell-types) function. -#### rf_resample +### rf_resample Tile rf_resample(Tile tile, Double factor) Tile rf_resample(Tile tile, Int factor) @@ -114,11 +107,11 @@ Convert `tileCol` to a different cell type. Available cell types can be retrieve Change the tile dimension. Passing a numeric `factor` will scale the number of columns and rows in the tile: 1.0 is the same number of columns and row; less than one downsamples the tile; and greater than one upsamples the tile. Passing a `shape_tile` as the second argument outputs `tile` having the same number of columns and rows as `shape_tile`. All resampling is by nearest neighbor method. -### Tile Creation +## Tile Creation Functions to create a new Tile column, either from scratch or from existing data not yet in a `tile`. -#### rf_make_zeros_tile +### rf_make_zeros_tile ``` Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, String cell_type_name) @@ -127,7 +120,7 @@ Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, String cell_type_name) Create a `tile` of shape `tile_columns` by `tile_rows` full of zeros, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. -#### rf_make_ones_tile +### rf_make_ones_tile ``` Tile rf_make_ones_tile(Int tile_columns, Int tile_rows, String cell_type_name) @@ -136,7 +129,7 @@ Tile rf_make_ones_tile(Int tile_columns, Int tile_rows, String cell_type_name) Create a `tile` of shape `tile_columns` by `tile_rows` full of ones, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. -#### rf_make_constant_tile +### rf_make_constant_tile Tile rf_make_constant_tile(Numeric constant, Int tile_columns, Int tile_rows, String cell_type_name) @@ -144,7 +137,7 @@ Create a `tile` of shape `tile_columns` by `tile_rows` full of ones, with the sp Create a `tile` of shape `tile_columns` by `tile_rows` full of `constant`, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. -#### rf_rasterize +### rf_rasterize Tile rf_rasterize(Geometry geom, Geometry tile_bounds, Int value, Int tile_columns, Int tile_rows) @@ -170,19 +163,19 @@ FROM ``` -#### rf_array_to_tile +### rf_array_to_tile Tile rf_array_to_tile(Array arrayCol, Int numCols, Int numRows) Python only. Create a `tile` from a Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), filling values in row-major order. -#### rf_assemble_tile +### rf_assemble_tile Tile rf_assemble_tile(Int colIndex, Int rowIndex, Numeric cellData, Int numCols, Int numRows, String cellType) Python only. Create a Tile from a column of cell data with location indices. This function is the inverse of @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles). Intended use is with a `groupby`, producing one row with a new `tile` per group. The `numCols`, `numRows` and `cellType` arguments are literal values, others are column expressions. Valid values for `cellType` can be found with function @ref:[`rf_cell_types`](reference.md#rf-cell-types). -### Masking and NoData +## Masking and NoData See @ref:[NoData handling](nodata-handling.md) for conceptual discussion of cell types and NoData. @@ -190,7 +183,7 @@ There are statistical functions of the count of data and NoData values per `tile Masking is a raster operation that sets specific cells to NoData based on the values in another raster. -#### rf_mask +### rf_mask Tile rf_mask(Tile tile, Tile mask) @@ -201,26 +194,26 @@ Returned `tile` cell type will be coerced to one supporting NoData if it does no See also @[`rf_rasterize`](reference.md#rf-rasterize). -#### rf_inverse_mask +### rf_inverse_mask Tile rf_inverse_mask(Tile tile, Tile mask) Where the `mask` _does not_ contain NoData, replace values in `tile` with NoData. -#### rf_mask_by_value +### rf_mask_by_value Tile rf_mask_by_value(Tile data_tile, Tile mask_tile, Int mask_value) Generate a `tile` with the values from `data_tile`, with NoData in cells where the `mask_tile` is equal to `mask_value`. -#### rf_is_no_data_tile +### rf_is_no_data_tile Boolean rf_is_no_data_tile(Tile) Returns true if `tile` contains only NoData. By definition returns false if cell type does not support NoData. To count NoData cells or data cells, see @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells), @ref:[`rf_data_cells`](reference.md#rf-data-cells), @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells), @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells), @ref:[`rf_agg_local_no_data_cells`](reference.md#rf-agg-local-no-data-cells), and @ref:[`rf_agg_local_data_cells`](reference.md#rf-agg-local-data-cells). This function is distinguished from @ref:[`rf_for_all`](reference.md#rf-for-all), which tests that values are not NoData and nonzero. -#### rf_with_no_data +### rf_with_no_data Tile rf_with_no_data(Tile tile, Double no_data_value) @@ -230,7 +223,7 @@ The `no_data_value` argument is a literal Double, not a Column expression. If input `tile` had a NoData value already, the behaviour depends on if its cell type is floating point or not. For floating point cell type `tile`, NoData values on the input `tile` remain NoData values on the output. For integral cell type `tile`s, the previous NoData values become literal values. -### Local Map Algebra +## Local Map Algebra [Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single tile (unary), between a `tile` and a scalar, between two `tile`s, or across many `tile`s. @@ -244,7 +237,7 @@ The SQL API does not require the `rf_local_op_double` or `rf_local_op_int` forms Local map algebra operations for more than two tiles are implemented to work across rows in the data frame. As such, they are @ref:[aggregate functions](reference.md#tile-local-aggregate-statistics). -#### rf_local_add +### rf_local_add Tile rf_local_add(Tile tile1, Tile rhs) Tile rf_local_add_int(Tile tile1, Int rhs) @@ -253,7 +246,7 @@ Local map algebra operations for more than two tiles are implemented to work acr Returns a `tile` column containing the element-wise sum of `tile1` and `rhs`. -#### rf_local_subtract +### rf_local_subtract Tile rf_local_subtract(Tile tile1, Tile rhs) Tile rf_local_subtract_int(Tile tile1, Int rhs) @@ -263,7 +256,7 @@ Returns a `tile` column containing the element-wise sum of `tile1` and `rhs`. Returns a `tile` column containing the element-wise difference of `tile1` and `rhs`. -#### rf_local_multiply +### rf_local_multiply Tile rf_local_multiply(Tile tile1, Tile rhs) Tile rf_local_multiply_int(Tile tile1, Int rhs) @@ -273,7 +266,7 @@ Returns a `tile` column containing the element-wise difference of `tile1` and `r Returns a `tile` column containing the element-wise product of `tile1` and `rhs`. This is **not** the matrix multiplication of `tile1` and `rhs`. -#### rf_local_divide +### rf_local_divide Tile rf_local_divide(Tile tile1, Tile rhs) Tile rf_local_divide_int(Tile tile1, Int rhs) @@ -283,14 +276,14 @@ Returns a `tile` column containing the element-wise product of `tile1` and `rhs` Returns a `tile` column containing the element-wise quotient of `tile1` and `rhs`. -#### rf_normalized_difference +### rf_normalized_difference Tile rf_normalized_difference(Tile tile1, Tile tile2) Compute the normalized difference of the the two `tile`s: `(tile1 - tile2) / (tile1 + tile2)`. Result is always floating point cell type. This function has no scalar variant. -#### rf_local_less +### rf_local_less Tile rf_local_less(Tile tile1, Tile rhs) Tile rf_local_less_int(Tile tile1, Int rhs) @@ -299,7 +292,7 @@ Compute the normalized difference of the the two `tile`s: `(tile1 - tile2) / (ti Returns a `tile` column containing the element-wise evaluation of `tile1` is less than `rhs`. -#### rf_local_less_equal +### rf_local_less_equal Tile rf_local_less_equal(Tile tile1, Tile rhs) Tile rf_local_less_equal_int(Tile tile1, Int rhs) @@ -308,7 +301,7 @@ Returns a `tile` column containing the element-wise evaluation of `tile1` is les Returns a `tile` column containing the element-wise evaluation of `tile1` is less than or equal to `rhs`. -#### rf_local_greater +### rf_local_greater Tile rf_local_greater(Tile tile1, Tile rhs) Tile rf_local_greater_int(Tile tile1, Int rhs) @@ -317,7 +310,7 @@ Returns a `tile` column containing the element-wise evaluation of `tile1` is les Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than `rhs`. -#### rf_local_greater_equal +### rf_local_greater_equal Tile rf_local_greater_equal(Tile tile1, Tile rhs) Tile rf_local_greater_equal_int(Tile tile1, Int rhs) @@ -326,7 +319,7 @@ Returns a `tile` column containing the element-wise evaluation of `tile1` is gre Returns a `tile` column containing the element-wise evaluation of `tile1` is greater than or equal to `rhs`. -#### rf_local_equal +### rf_local_equal Tile rf_local_equal(Tile tile1, Tile rhs) Tile rf_local_equal_int(Tile tile1, Int rhs) @@ -335,7 +328,7 @@ Returns a `tile` column containing the element-wise evaluation of `tile1` is gre Returns a `tile` column containing the element-wise equality of `tile1` and `rhs`. -#### rf_local_unequal +### rf_local_unequal Tile rf_local_unequal(Tile tile1, Tile rhs) Tile rf_local_unequal_int(Tile tile1, Int rhs) @@ -344,67 +337,67 @@ Returns a `tile` column containing the element-wise equality of `tile1` and `rhs Returns a `tile` column containing the element-wise inequality of `tile1` and `rhs`. -#### rf_round +### rf_round Tile rf_round(Tile tile) Round cell values to the nearest integer without changing the cell type. -#### rf_abs +### rf_abs Tile rf_abs(Tile tile) Compute the absolute value of cell value. -#### rf_exp +### rf_exp Tile rf_exp(Tile tile) Performs cell-wise exponential. -#### rf_exp10 +### rf_exp10 Tile rf_exp10(Tile tile) Compute 10 to the power of cell values. -#### rf_exp2 +### rf_exp2 Tile rf_exp2(Tile tile) Compute 2 to the power of cell values. -#### rf_expm1 +### rf_expm1 Tile rf_expm1(Tile tile) Performs cell-wise exponential, then subtract one. Inverse of @ref:[`log1p`](reference.md#log1p). -#### rf_log +### rf_log Tile rf_log(Tile tile) Performs cell-wise natural logarithm. -#### rf_log10 +### rf_log10 Tile rf_log10(Tile tile) Performs cell-wise logarithm with base 10. -#### rf_log2 +### rf_log2 Tile rf_log2(Tile tile) Performs cell-wise logarithm with base 2. -#### rf_log1p +### rf_log1p Tile rf_log1p(Tile tile) Performs natural logarithm of cell values plus one. Inverse of @ref:[`rf_expm1`](reference.md#rf-expm1). -### Tile Statistics +## Tile Statistics The following functions compute a statistical summary per row of a `tile` column. The statistics are computed across the cells of a single `tile`, within each DataFrame Row. Consider the following example. @@ -418,14 +411,14 @@ spark.sql(""" ``` -#### rf_tile_sum +### rf_tile_sum Double rf_tile_sum(Tile tile) Computes the sum of cells in each row of column `tile`, ignoring NoData values. -#### rf_tile_mean +### rf_tile_mean Double rf_tile_mean(Tile tile) @@ -433,7 +426,7 @@ Computes the sum of cells in each row of column `tile`, ignoring NoData values. Computes the mean of cells in each row of column `tile`, ignoring NoData values. -#### rf_tile_min +### rf_tile_min Double rf_tile_min(Tile tile) @@ -441,7 +434,7 @@ Computes the mean of cells in each row of column `tile`, ignoring NoData values. Computes the min of cells in each row of column `tile`, ignoring NoData values. -#### rf_tile_max +### rf_tile_max Double rf_tile_max(Tile tile) @@ -449,60 +442,52 @@ Computes the min of cells in each row of column `tile`, ignoring NoData values. Computes the max of cells in each row of column `tile`, ignoring NoData values. -#### rf_no_data_cells +### rf_no_data_cells Long rf_no_data_cells(Tile tile) Return the count of NoData cells in the `tile`. -#### rf_data_cells +### rf_data_cells Long rf_data_cells(Tile tile) Return the count of data cells in the `tile`. -#### rf_exists +### rf_exists Boolean rf_exists(Tile tile) Returns true if any cells in the tile are true (non-zero and not NoData). -#### rf_for_all +### rf_for_all Boolean rf_for_all(Tile tile) Returns true if all cells in the tile are true (non-zero and not NoData). See also @ref:[`rf_is_no_data_tile](reference.md#rf-is-no-data-tile), which tests that all cells are NoData. -#### rf_tile_stats +### rf_tile_stats Struct[Long, Long, Double, Double, Double, Double] rf_tile_stats(Tile tile) -Computes the following statistics of cells in each row of column `tile`: data cell count, NoData cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring NoData values. +Computes the following statistics of cells in each row of column `tile`: data cell count, NoData cell count, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance are computed ignoring NoData values. Resulting column has the below schema. +```python echo=False +spark.sql("SELECT rf_tile_stats(rf_make_ones_tile(5, 5, 'float32')) as tile_stats").printSchema() +``` -#### rf_tile_histogram +### rf_tile_histogram - Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_tile_histogram(Tile tile) + Struct[Array[Struct[Double, Long]]] rf_tile_histogram(Tile tile) -Computes a statistical summary of cell values within each row of `tile`. Resulting column has the below schema. Note that several of the other `tile` statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) which computes the statistics across all rows in a group. +Computes a count of cell values within each row of `tile`. The `bins` array is of tuples of histogram values and counts. Typically values are plotted on the x-axis and counts on the y-axis. Resulting column has the below schema. Related is the @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) which computes the statistics across all rows in a group. -``` - |-- tile_histogram: struct (nullable = true) - | |-- stats: struct (nullable = true) - | | |-- dataCells: long (nullable = false) - | | |-- noDataCells: long (nullable = false) - | | |-- min: double (nullable = false) - | | |-- max: double (nullable = false) - | | |-- mean: double (nullable = false) - | | |-- variance: double (nullable = false) - | |-- bins: array (nullable = true) - | | |-- element: struct (containsNull = true) - | | | |-- value: double (nullable = false) - | | | |-- count: long (nullable = false) +```python echo=False +spark.sql("SELECT rf_tile_histogram(rf_make_ones_tile(5, 5, 'float32')) as tile_histogram").printSchema() ``` -### Aggregate Tile Statistics +## Aggregate Tile Statistics These functions compute statistical summaries over all of the cell values *and* across all the rows in the DataFrame or group. Example use below computes a single double-valued mean per month, across all data cells in the `red_band` `tile` type column. This would return at most twelve rows. @@ -516,7 +501,7 @@ SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t """).agg(rf_agg_mean(F.col('t'))).show(10, False) ``` -#### rf_agg_mean +### rf_agg_mean Double rf_agg_mean(Tile tile) @@ -525,7 +510,7 @@ _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).mean` Aggregates over the `tile` and return the mean of cell values, ignoring NoData. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.mean`. -#### rf_agg_data_cells +### rf_agg_data_cells Long rf_agg_data_cells(Tile tile) @@ -533,7 +518,7 @@ _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` Aggregates over the `tile` and return the count of data cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.dataCells`. -#### rf_agg_no_data_cells +### rf_agg_no_data_cells Long rf_agg_no_data_cells(Tile tile) @@ -541,38 +526,22 @@ _SQL_: @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`(tile).dataCells` Aggregates over the `tile` and return the count of NoData cells. Equivalent to @ref:[`rf_agg_stats`](reference.md#rf-agg-stats)`.noDataCells`. C.F. @ref:[`rf_no_data_cells`](reference.md#rf-no-data-cells) a row-wise count of no data cells. -#### rf_agg_stats +### rf_agg_stats Struct[Long, Long, Double, Double, Double, Double] rf_agg_stats(Tile tile) Aggregates over the `tile` and returns statistical summaries of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. The minimum, maximum, mean, and variance ignore the presence of NoData. -#### rf_agg_approx_histogram - - Struct[Struct[Long, Long, Double, Double, Double, Double], Array[Struct[Double, Long]]] rf_agg_approx_histogram(Tile tile) +### rf_agg_approx_histogram + Struct[Array[Struct[Double, Long]]] rf_agg_approx_histogram(Tile tile) -Aggregates over the `tile` return statistical summaries of the cell values, including a histogram, in the below schema. The `bins` array is of tuples of histogram values and counts. Typically values are plotted on the x-axis and counts on the y-axis. -Note that several of the other cell value statistics functions are convenience methods to extract parts of this result. Related is the @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function which operates on a single row at a time. +Aggregates over the `tile` return a count of each cell value to create a histogram with values are plotted on the x-axis and counts on the y-axis. Related is the @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function which operates on a single row at a time. -``` - |-- agg_approx_histogram: struct (nullable = true) - | |-- stats: struct (nullable = true) - | | |-- dataCells: long (nullable = false) - | | |-- noDataCells: long (nullable = false) - | | |-- min: double (nullable = false) - | | |-- max: double (nullable = false) - | | |-- mean: double (nullable = false) - | | |-- variance: double (nullable = false) - | |-- bins: array (nullable = true) - | | |-- element: struct (containsNull = true) - | | | |-- value: double (nullable = false) - | | | |-- count: long (nullable = false) -``` -### Tile Local Aggregate Statistics +## Tile Local Aggregate Statistics Local statistics compute the element-wise statistics across a DataFrame or group of `tile`s, resulting in a `tile` that has the same dimension. @@ -594,78 +563,78 @@ alm.select(rf_explode_tiles(alm.l)).show(10, False) ``` -#### rf_agg_local_max +### rf_agg_local_max Tile rf_agg_local_max(Tile tile) Compute the cell-local maximum operation over Tiles in a column. -#### rf_agg_local_min +### rf_agg_local_min Tile rf_agg_local_min(Tile tile) Compute the cell-local minimum operation over Tiles in a column. -#### rf_agg_local_mean +### rf_agg_local_mean Tile rf_agg_local_mean(Tile tile) Compute the cell-local mean operation over Tiles in a column. -#### rf_agg_local_data_cells +### rf_agg_local_data_cells Tile rf_agg_local_data_cells(Tile tile) Compute the cell-local count of data cells over Tiles in a column. Returned `tile` has a cell type of `int32`. -#### rf_agg_local_no_data_cells +### rf_agg_local_no_data_cells Tile rf_agg_local_no_data_cells(Tile tile) Compute the cell-local count of NoData cells over Tiles in a column. Returned `tile` has a cell type of `int32`. -#### rf_agg_local_stats +### rf_agg_local_stats Struct[Tile, Tile, Tile, Tile, Tile] rf_agg_local_stats(Tile tile) Compute cell-local aggregate count, minimum, maximum, mean, and variance for a column of Tiles. Returns a struct of five `tile`s. -### Converting Tiles +## Converting Tiles RasterFrames provides several ways to convert a `tile` into other data structures. See also functions for @ref:[creating tiles](reference.md#tile-creation). -#### rf_explode_tiles +### rf_explode_tiles Int, Int, Numeric* rf_explode_tiles(Tile* tile) Create a row for each cell in `tile` columns. Many `tile` columns can be passed in, and the returned DataFrame will have one numeric column per input. There will also be columns for `column_index` and `row_index`. Inverse of @ref:[`rf_assemble_tile`](reference.md#rf-assemble-tile). When using this function, be sure to have a unique identifier for rows in order to successfully invert the operation. -#### rf_explode_tiles_sample +### rf_explode_tiles_sample Int, Int, Numeric* rf_explode_tiles_sample(Double sample_frac, Long seed, Tile* tile) Python only. As with @ref:[`rf_explode_tiles`](reference.md#rf-explode-tiles), but taking a randomly sampled subset of cells. Equivalent to the below, but this implementation is optimized for speed. Parameter `sample_frac` should be between 0.0 and 1.0. -#### rf_tile_to_array_int +### rf_tile_to_array_int Array rf_tile_to_array_int(Tile tile) Convert Tile column to Spark SQL [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Float cell types will be coerced to integral type by flooring. -#### rf_tile_to_array_double +### rf_tile_to_array_double Array rf_tile_to_arry_double(Tile tile) Convert tile column to Spark [Array](http://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.types.ArrayType), in row-major order. Integral cell types will be coerced to floats. -#### rf_render_ascii +### rf_render_ascii String rf_render_ascii(Tile tile) Pretty print the tile values as plain text. -#### rf_render_matrix +### rf_render_matrix String rf_render_matrix(Tile tile) From 1a59195c920c0abc975c12ecfb12a159df841b4e Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Tue, 23 Jul 2019 15:09:32 -0400 Subject: [PATCH 236/380] change link on line 61 to go to nodata-handling.md Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/reference.pymd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index 60ae7285e..b4749aeef 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -58,7 +58,7 @@ Convert an extent to a Geometry. The extent likely comes from @ref:[`st_extent`] ## Tile Metadata and Mutation -Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See below section on @ref:[masking and NoData](nodata-handling.md#masking-and-NoData) for additional discussion of cell types. +Functions to access and change the particulars of a `tile`: its shape and the data type of its cells. See section on @ref:["NoData" handling](nodata-handling.md) for additional discussion of cell types. ### rf_dimensions From b8435bfe552fa3056dbeebfeaef685db7073b9ea Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 24 Jul 2019 10:10:13 -0400 Subject: [PATCH 237/380] raster reader can take a Pandas DataFrame or geopandas GeoDF Signed-off-by: Jason T. Brown --- .../main/python/pyrasterframes/__init__.py | 21 ++++++- .../main/python/tests/PyRasterFramesTests.py | 58 ++++++++++++++++++- 2 files changed, 76 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 2af1677a1..4018a57a3 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -112,12 +112,19 @@ def _raster_reader( lazy_tiles=True, **options): + from pandas import DataFrame as PdDataFrame + def to_csv(comp): if isinstance(comp, str): return comp else: return ','.join(str(v) for v in comp) + def temp_name(): + """ Create a random name for a temporary view """ + import uuid + return str(uuid.uuid4()).replace('-', '') + if band_indexes is None: band_indexes = [0] @@ -136,14 +143,24 @@ def to_csv(comp): "catalogColumns": to_csv(catalog_col_names) }) elif isinstance(catalog, DataFrame): - import uuid # Create a random view name - tmp_name = str(uuid.uuid4()).replace('-', '') + tmp_name = temp_name() catalog.createOrReplaceTempView(tmp_name) options.update({ "catalogTable": tmp_name, "catalogColumns": to_csv(catalog_col_names) }) + elif isinstance(catalog, PdDataFrame): + # Handle to active spark session + session = SparkContext._active_spark_context._rf_context._spark_session + # Create a random view name + tmp_name = temp_name() + spark_catalog = session.createDataFrame(catalog) + spark_catalog.createOrReplaceTempView(tmp_name) + options.update({ + "catalogTable": tmp_name, + "catalogColumns": to_csv(catalog_col_names) + }) return df_reader \ .format("raster") \ diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 6fd925459..a3080b6a2 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -704,6 +704,19 @@ def test_handle_lazy_eval(self): self.assertGreater(tdf.count(), 0) self.assertIsNotNone(tdf.first()) + def test_strict_eval(self): + df_lazy = self.spark.read.raster(self.img_uri, lazy_tiles=True) + # when doing Show on a lazy tile we will see something like RasterRefTile(RasterRef(JVMGeoTiffRasterSource(... + # use this trick to get the `show` string + show_str_lazy = df_lazy.select('proj_raster')._jdf.showString(1, -1, False) + self.assertTrue('RasterRef' in show_str_lazy) + + # again for strict + df_strict = self.spark.read.raster(self.img_uri, lazy_tiles=False) + show_str_strict = df_strict.select('proj_raster')._jdf.showString(1, -1, False) + self.assertTrue('RasterRef' not in show_str_lazy) + + def test_prt_functions(self): df = self.spark.read.raster(self.img_uri) \ .withColumn('crs', rf_crs('proj_raster')) \ @@ -725,7 +738,7 @@ def l8path(b): df = self.spark.read.raster( tile_dimensions=(tile_size, tile_size), paths=path_param, - lazy_tiles=False + lazy_tiles=True, ).cache() # schema is tile_path and tile @@ -780,6 +793,49 @@ def path(scene, band): b1_paths = [s.format('1') for s in scene_dict.values()] self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) + def test_raster_source_catalog_reader_with_pandas(self): + import pandas as pd + import geopandas + from shapely.geometry import Point + + scene_dict = { + 1: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/041/LC08_L1TP_015041_20190305_20190309_01_T1/LC08_L1TP_015041_20190305_20190309_01_T1_B{}.TIF', + 2: 'http://landsat-pds.s3.amazonaws.com/c1/L8/015/042/LC08_L1TP_015042_20190305_20190309_01_T1/LC08_L1TP_015042_20190305_20190309_01_T1_B{}.TIF', + 3: 'http://landsat-pds.s3.amazonaws.com/c1/L8/016/041/LC08_L1TP_016041_20190224_20190309_01_T1/LC08_L1TP_016041_20190224_20190309_01_T1_B{}.TIF', + } + + def path(scene, band): + assert band in range(1, 12) + p = scene_dict[scene] + return p.format(band) + + # Create a pandas dataframe (makes it easy to create spark df) + path_pandas = pd.DataFrame([ + {'b1': path(1, 1), 'b2': path(1, 2), 'b3': path(1, 3), 'geo': Point(1, 1)}, + {'b1': path(2, 1), 'b2': path(2, 2), 'b3': path(2, 3), 'geo': Point(2, 2)}, + {'b1': path(3, 1), 'b2': path(3, 2), 'b3': path(3, 3), 'geo': Point(3, 3)}, + ]) + + # here a subtle difference with the test_raster_source_catalog_reader test, feed the DataFrame not a CSV and not an already created spark DF. + df = self.spark.read.raster( + catalog=path_pandas, + catalog_col_names=['b1', 'b2', 'b3'] + ) + self.assertEqual(len(df.columns), 7) # three path cols, three tile cols, and geo + self.assertTrue('geo' in df.columns) + self.assertTrue(df.select('b1_path').distinct().count() == 3) + + + # Same test with geopandas + geo_df = geopandas.GeoDataFrame(path_pandas, crs={'init': 'EPSG:4326'}, geometry='geo') + df2 = self.spark.read.raster( + catalog=geo_df, + catalog_col_names=['b1', 'b2', 'b3'] + ) + self.assertEqual(len(df2.columns), 7) # three path cols, three tile cols, and geo + self.assertTrue('geo' in df2.columns) + self.assertTrue(df2.select('b1_path').distinct().count() == 3) + def suite(): function_tests = unittest.TestSuite() From 1e8b95a293d457e15bea37efc533192bc895c425 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 23 Jul 2019 15:14:51 -0400 Subject: [PATCH 238/380] Small docs tweaks lingering from PR 187 Signed-off-by: Jason T. Brown --- .../src/main/python/docs/nodata-handling.pymd | 52 ++++++++++--------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index 795771577..d9ef1feb5 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -10,8 +10,6 @@ RasterFrames provides a variety of functions to inspect and manage NoData within To understand how NoData is handled in RasterFrames, we first need to understand the different underlying types of data called cell types. The cell types are GeoTrellis `CellType`s, so the [GeoTrellis documentation](https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html?#working-with-cell-values) is a valuable resource on how these are defined. -Use the function `rf_cell_type` to find the cell type of a specific set of raster data. - ```python setup, echo=False import pyrasterframes from pyrasterframes.rasterfunctions import * @@ -21,23 +19,27 @@ from IPython.display import display spark = pyrasterframes.get_spark_session() ``` -```python ct_from_sen -spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') \ - .select(rf_cell_type('proj_raster')).distinct().show() +The `CellType` class from the `rf_types` submodule allows us to create a representation of any valid cell type. There are convenience methods to create instances for a variety of basic types. + +```python celltype_ctors +from pyrasterframes.rf_types import CellType +import inspect + +[c[0] for c in inspect.getmembers(CellType, inspect.ismethod)] ``` -The function `rf_cell_types` provides a convenient list of basic cell types. Note that this list is not exhaustive. +We can also inspect the cell type of a given _tile_ or `proj_raster` column. -```python -rf_cell_types() +```python ct_from_sen +spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') \ + .select(rf_cell_type('proj_raster')).distinct().show() ``` ### Understanding Cell Types and NoData -Use the `CellType` class to learn more about a specific cell type. +Use the methods on the `CellType` class to learn more about a specific cell type. Take for example the cell type of our sample data above. ```python -from pyrasterframes.rf_types import CellType ct = CellType('uint16raw') ct, ct.is_floating_point(), ct.has_no_data() ``` @@ -85,30 +87,30 @@ Drawing on @ref:[local map algebra](local-algebra.md) techniques, we will create ```python def_mask from pyspark.sql.functions import lit -unmasked = unmasked.withColumn('nodata', rf_local_equal('scl', lit(0))) -unmasked = unmasked.withColumn('defect', rf_local_equal('scl', lit(1))) -unmasked = unmasked.withColumn('cloud8', rf_local_equal('scl', lit(8))) -unmasked = unmasked.withColumn('cloud9', rf_local_equal('scl', lit(9))) -unmasked = unmasked.withColumn('cirrus', rf_local_equal('scl', lit(10))) +mask_part = unmasked.withColumn('nodata', rf_local_equal('scl', lit(0))) \ + .withColumn('defect', rf_local_equal('scl', lit(1))) \ + .withColumn('cloud8', rf_local_equal('scl', lit(8))) \ + .withColumn('cloud9', rf_local_equal('scl', lit(9))) \ + .withColumn('cirrus', rf_local_equal('scl', lit(10))) -unmasked = unmasked.withColumn('mask', rf_local_add('nodata', 'defect')) -unmasked = unmasked.withColumn('mask', rf_local_add('mask', 'cloud8')) -unmasked = unmasked.withColumn('mask', rf_local_add('mask', 'cloud9')) -unmasked = unmasked.withColumn('mask', rf_local_add('mask', 'cirrus')) +one_mask = mask_part.withColumn('mask', rf_local_add('nodata', 'defect')) \ + .withColumn('mask', rf_local_add('mask', 'cloud8')) \ + .withColumn('mask', rf_local_add('mask', 'cloud9')) \ + .withColumn('mask', rf_local_add('mask', 'cirrus')) -unmasked.select(rf_cell_type('mask')).distinct().show() +one_mask.select(rf_cell_type('mask')).distinct().show() ``` Now we will use the @ref:[`rf_mask_by_value`](reference.md#rf-mask-by-value) to designate the cloudy and other unwanted pixels as NoData in the blue column. Because there is not a NoData already defined, we will choose one. Note that in this particular example the minimum value is greater than zero, so we can use 0 as the NoData value. ```python pick_nd -unmasked.agg(rf_agg_stats('blue').min.alias('blue_min')).show() +one_mask.agg(rf_agg_stats('blue').min.alias('blue_min')).show() ``` We can now construct the cell type string for our blue band's cell type, but designating 0 as NoData. ```python get_ct_string -blue_ct = unmasked.select(rf_cell_type('blue')).distinct().first()[0][0] +blue_ct = one_mask.select(rf_cell_type('blue')).distinct().first()[0][0] masked_blue_ct = CellType(blue_ct).with_no_data_value(0) masked_blue_ct.cell_type_name ``` @@ -117,9 +119,9 @@ Convert the cell type and apply the mask. Since the mask column is bit type, the ```python mask_blu with_nd = rf_convert_cell_type('blue', masked_blue_ct.cell_type_name) -masked = unmasked.withColumn('blue_masked', - rf_mask_by_value(with_nd, 'mask', lit(1))) \ - .drop('nodata', 'defect', 'cloud8', 'cloud9', 'cirrus', 'blue') +masked = one_mask.withColumn('blue_masked', + rf_mask_by_value(with_nd, 'mask', lit(1))) \ + .drop('nodata', 'defect', 'cloud8', 'cloud9', 'cirrus', 'blue') ``` We can verify that the number of NoData cells in the resulting `blue_masked` column matches the total of the bit-type `mask` tile. From ea5a93a6b0b537b3fc227a4f9669d43681da0bb6 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 23 Jul 2019 14:34:39 -0400 Subject: [PATCH 239/380] Move numpy-pandas doc to pymd format; initial content Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/index.md | 2 +- .../src/main/python/docs/numpy-pandas.pymd | 119 ++++++++++++++++++ .../src/main/python/docs/pandas-numpy.md | 10 -- 3 files changed, 120 insertions(+), 11 deletions(-) create mode 100644 pyrasterframes/src/main/python/docs/numpy-pandas.pymd delete mode 100644 pyrasterframes/src/main/python/docs/pandas-numpy.md diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index 63a0d57a0..4dbe19c47 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -43,7 +43,7 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi * [Raster Data I/O](raster-io.md) * [Vector Data](vector-data.md) * [Raster Processing](raster-processing.md) -* [Pandas, NumPy & RasterFrames](pandas-numpy.md) +* [Numpy, Pandas, & RasterFrames](numpy-pandas.md) * [UDF Reference](reference.md) * [Release Notes](release-notes.md) @@@ diff --git a/pyrasterframes/src/main/python/docs/numpy-pandas.pymd b/pyrasterframes/src/main/python/docs/numpy-pandas.pymd new file mode 100644 index 000000000..7bfde9356 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/numpy-pandas.pymd @@ -0,0 +1,119 @@ +# NumPy and Pandas Interoperabilty + +In the Python Spark API, the work of distributed computing over the DataFrame is done on many executors (the Spark term for workers) inside Java virual machines (JVM). Most calls to `pyspark` are passed to a Java process via the `py4j` library. The user can also ask for data inside the JVM to be brought over to the Python driver (the Spark term for the client application). When dealing with _tiles_, the driver will recieve this data a lightweight wrapper object around a NumPy ndarray. It is also possible to write lambda functions against NumPy arrays and evaluate them in the Spark DataFrame. + +## Performance Considerations + +When working with large, distributed datasets in Spark care is required when invoking _actions_ on the data. In general _transformations_ are lazily evaluated in Spark, meaning the code runs fast and it doesn't move any data around. But _actions_ cause the evaluation to happen, meaning all the lazily planned _transformations_ are going to be computed and data is going to be processed and moved around. In general, if a [`pyspark` function](https://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html) returns a DataFrame, it is probably a _transformation_ and otherwise it is an _action_. + +When many _actions_ are invoked, a lot of data can flow from executors to the driver. In `pyspark` the data then has to move from the driver JVM to the Python process running the driver. When that happens if there are any _tiles_ in the data, they will be converted to a Python [`Tile`](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/src/main/python/pyrasterframes/rf_types.py) object. In practical work with Earth observation data, the _tiles_ are frequently 256 by 256 arrays, which may be 100kb or more each. Individually they are small, a DataFrame can easily have dozens of such tile columns and millions of rows. + +All of this discussion reinforces important principle for working with Spark: understanding the cost of an _action_ is important; and use of @ref:[aggreates](aggregation.md), summaries, or samples to manage the cost of _actions_. + +## The `Tile` Class + +In Python, _tiles_ are represented with the `rf_types.Tile` class. This is a NumPy `ndarray` with two dimensions, along with some additional metadata allowing correct conversion to the GeoTrellis @ref:[cell type](nodata-handling.md#cell-types). + +```python tile_intro +from pyrasterframes.rf_types import Tile +import numpy as np + +t = Tile(np.random.randn(4, 4)) +print(str(t)) +``` + +You can access the NumPy array with the `cells` member of `Tile`. + +```python tile_cells +t.cells.shape, t.cells.nbytes +``` + +## DataFrame `toPandas` + +As discussed in the @ref:[raster writing chapter](raster-write.md#dataframe-samples), a pretty display of Pandas DataFrame containing _tiles_ is available by importing the `rf_ipython` submodule. In addition, as discussed in the @ref:[vector data chapter](vector-data.md), any geometry type in the Spark dataframe will be converted into a Shapely geometry. Taken together, we can can easily get the spatial information and raster data as a NumPy array, all within a Pandas DataFrame. + +```python spark_session, echo=False +import pyrasterframes +from pyrasterframes.rasterfunctions import * +from IPython.display import display +spark = pyrasterframes.get_spark_session() + +``` + +```python toPandas +import pyrasterframes.rf_ipython +from pyspark.sql.functions import lit, col + +cat = spark.read.format('aws-pds-modis-catalog').load() \ + .filter( + (col('granule_id') == 'h11v04') & + (col('acquisition_date') > lit('2018-02-19')) & + (col('acquisition_date') < lit('2018-02-22')) + ) + +spark_df = spark.read.raster(catalog=cat, catalog_col_names=['B01']) \ + .select( + 'acquisition_date', + 'granule_id', + rf_tile('B01').alias('tile'), + rf_geometry('B01').alias('tile_geom') + ) + +pandas_df = spark_df.limit(10).toPandas() +pandas_df.iloc[0].apply(lambda v: type(v)) +``` + +## User Defined Functions + +As we demonstrated with @ref:[vector data](vector-data.md#shapely-geometry-support), we can also make use of the `Tile` type to create [user-defined functions (UDF)](https://spark.apache.org/docs/2.3.2/api/python/pyspark.sql.html#pyspark.sql.functions.udf) that can take a _tile_ as input, return a _tile_ as output, or both. Here is a trivial and **inefficient** example of doing both. A serious performance implication of user defined functions in Python is that all the executors must move the Java objects to Python, evaluate the function, then move the Python objects back to Java. Use the many @ref:[built-in functions](reference.md) wherever possible, and ask the [community](https://gitter.im/s22s/raster-frames) if you have an idea for a function that should be included. + +We will demonstrate creating a UDF that is logically equivalent to a built in function. We'll quickly show that the resulting _tiles_ are approximately equivalent. The reason they are not exactly the same is because one is computed in Python and the other is computed in Java. + +```python udf +from pyrasterframes.rf_types import TileUDT +from pyspark.sql.functions import udf + +@udf(TileUDT()) +def my_udf(t): + import numpy as np + return Tile(np.log1p(t.cells)) + +udf_df = spark_df.limit(1).select( + my_udf('tile').alias('udf_result'), + rf_log1p('tile').alias('built_in_result') + ).toPandas() + +row = udf_df.iloc[0] +diff = row['udf_result'] - row['built_in_result'] +print(type(diff)) +np.abs(diff.cells).max() +``` + +We can also inspect an image of the difference between the two _tiles_; it is just random noise. Both tiles have the same structure of NoData, the white areas. + +```python udf_diff_noise_tile +display(diff) +``` + +## Creating a Spark DataFrame + +You can also create a Spark DataFrame with a column full of `Tile` objects or Shapely geomtery objects. + +The example below will create a Pandas DataFrame with ten rows of noise tiles and random Points. We will then create a Spark DataFrame from it. + +```python create_spark_df +import pandas as pd +from shapely.geometry import Point + +pandas_df = pd.DataFrame([ + { + 'tile': Tile(np.random.randn(100, 100)), + 'geom': Point(-90 + 90 * np.random.random((2, 1))) + } for _ in range(10) + ]) + +spark_df = spark.createDataFrame(pandas_df) + +spark_df.printSchema() +spark_df.count() +``` diff --git a/pyrasterframes/src/main/python/docs/pandas-numpy.md b/pyrasterframes/src/main/python/docs/pandas-numpy.md deleted file mode 100644 index 812825170..000000000 --- a/pyrasterframes/src/main/python/docs/pandas-numpy.md +++ /dev/null @@ -1,10 +0,0 @@ -# Pandas and NumPy Interoperabilty - -\[ be sure to discuss the performance implications; basically do as much on spark as possible and expect sluggish collect and udt applications \] - -* Small/realistic DF toPandas, - * inspect contents of what you get; t.cells is np ndarray - * reference to writing page section on previews. -* UDT on tile; log1p from test_udf_on_tile_type_output -* Bonus : pandas -* Array to spark dataframe; using the Tile class From d2be387cfe0d58fae205a8635f4f90bcc54b824c Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 23 Jul 2019 11:30:10 -0400 Subject: [PATCH 240/380] Docs on raster write: samples, parquet Signed-off-by: Jason T. Brown --- .../src/main/python/docs/raster-io.md | 7 +- .../src/main/python/docs/raster-read.pymd | 4 +- .../src/main/python/docs/raster-write.pymd | 131 +++++++++++++++++- 3 files changed, 132 insertions(+), 10 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-io.md b/pyrasterframes/src/main/python/docs/raster-io.md index d10bab8f1..3880d8629 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.md +++ b/pyrasterframes/src/main/python/docs/raster-io.md @@ -2,19 +2,18 @@ The standard mechanism by which any data is brought in and out of a Spark Dataframe is the [Spark SQL DataSource][DS]. RasterFrames provides specialized DataSources for geospatial raster data and maintains compatibility with existing general purpose DataSources, such as Parquet. -Three types of DataSources will be introduced: - * @ref:[Catalog Readers](raster-catalogs.md) - `aws-pds-l8-catalog`: built-in catalog over [Landsat on AWS][Landsat] - `aws-pds-modis-catalog`: built-in catalog over [MODIS on AWS][MODIS] - `geotrellis-catalog`: for enumerating [GeoTrellis layers][GTLayer] * @ref:[Raster Readers](raster-read.md) - - `raster`: the standard reader for most raster data + - `raster`: the standard reader for most raster data, including single raster files or catalogs - `geotiff`: a simplified reader for reading a single GeoTIFF file - `geotrellis`: for reading a [GeoTrellis layer][GTLayer]) * @ref:[Raster Writers](raster-write.md) - - `geotrellis`: for creating a [GeoTrellis layer][GTLayer] + - @ref:[Tile](raster-write.md#tile-samples) and @ref:[DataFrame](raster-write.md#dataframe-samples) samples - `geotiff`: beta writer to GeoTiff file + - `geotrellis`: creating a [GeoTrellis layer][GTLayer] - [`parquet`][Parquet]: general purpose writer There is also support for @ref:[vector data](vector-data.md) for masking and data labeling. diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 29cb55c14..aabca0ca6 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -12,13 +12,15 @@ RasterFrames registers a DataSource named `raster` that enables reading of GeoTI ## Single Raster -The simplest form is reading a single raster from a single URI: +The simplest form is reading a single raster from a single URI. ```python read_one_uri rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') rf.printSchema() ``` +The file at the address above is a valid [Cloud Optimized GeoTIFF (COG)](https://www.cogeo.org/), which RasterFrames fully supports. RasterFrames will take advantage of the optimizations in the COG format to enable more efficient reading compared to vanilla GeoTIFFs. + Let's unpack the `proj_raster` column and look at the contents in more detail. It contains a [_CRS_][CRS], a spatial _extent_ measured in that CRS, and a two-dimensional array of numeric values called a _tile_. ```python unpack_schema diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index 1c4e4edb5..ba4af68db 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -1,11 +1,132 @@ -## Writing Raster Data +# Writing Raster Data -### Overviews +RasterFrames is oriented toward large scale analyses of spatial data. The primary output for most use cases may be a @ref:[statistical summary](aggregation.md), a @ref:[machine learning model](spark-ml.md), or some other result that is generally much smaller than the input data set. -### GeoTIFFs +However there are times in any analysis where writing a representative sample of the work in progress provides invaluable feedback on the process and results. -### Tile Samples +```python imports, echo=False +import pyrasterframes +from pyrasterframes.rasterfunctions import * +from IPython.display import display +spark = pyrasterframes.get_spark_session() +``` -### GeoTrellis Layers +## Tile Samples +When collecting a _tile_ (see discussion of the RasterFrame @ref:[schema](raster-read.md#single-raster) for orientation to the concept) to the Python Spark driver, we have some convenience methods to quickly visualize the _tile_. +In an IPython or Jupyter interpreter a `Tile` object will be displayed as an image with limited metadata. + +```python tile_sample +raster_url = 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/' \ + 'MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF' +spark_df = spark.read.raster(raster_url) +tile = spark_df.select(rf_tile('proj_raster').alias('tile')).first()['tile'] +tile +``` + +```python display_tile, echo=False, output=True +display(tile) # IPython.display function +``` + +## DataFrame Samples + +Within an IPython or Jupyter interpreter a Pandas DataFrame containing a column of _tiles_ will be rendered as the samples discussed above. Simply import the `rf_ipython` submodule to enable enhanced HTML rendering of a Pandas DataFrame. + +In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](pandas-numpy.md). + +```python toPandas, evaluate=True +import pyrasterframes.rf_ipython + +pandas_df = spark.read.raster(raster_url, tile_dimensions=(64, 64)) \ + .select( + rf_extent('proj_raster').alias('extent'), + rf_tile('proj_raster').alias('tile'), + ).limit(5).toPandas() +pandas_df.dtypes +``` + +Viewing the DataFrame in Jupyter looks like this. + +```python, evaluate=False +pandas_df +``` + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          extenttile
          0(-7783653.637667, 1082298.5058092135, -7754001.623809213, 1111950.519667)Image
          1(-7754001.623809214, 1082298.5058092135, -7724349.609951426, 1111950.519667)Image
          2(-7724349.609951427, 1082298.5058092135, -7694697.59609364, 1111950.519667)Image
          3(-7694697.596093641, 1082298.5058092135, -7665045.582235852, 1111950.519667)Image
          4(-7665045.582235853, 1082298.5058092135, -7635393.568378066, 1111950.519667)Image
          +
          + + +## GeoTIFFs + +GeoTIFF is one of the most common file formats for spatial data. + +\[ See issue https://s22s.myjetbrains.com/youtrack/issue/RF-71 \] + +## GeoTrellis Layers + +[GeoTrellis][GeoTrellis] is one of the key libraries that RasterFrames builds upon. It provides a Scala language API to working with large raster data with Apache Spark. Ingesting raster data into a Layer is one of the key concepts for creating a dataset for processing on Spark. RasterFrames write data from an appropriate DataFrame into a GeoTrellis Layer. + +\[ More details see https://s22s.myjetbrains.com/youtrack/issue/RF-72 \] + + +## Parquet + +You can write the Spark DataFrame to an [Apache Parquet][Parquet] "file". This format is designed to work across different projects in the Hadoop ecosystem. It also provides a variety of optimizations for query against data written in the format. + +```python, evaluate=False +spark_df.withColumn('exp', rf_expm1('proj_raster')) \ + .write.mode('append').parquet('hdfs:///rf-user/sample.pq') +``` + +[GeoTrellis]: https://geotrellis.readthedocs.io/en/latest/ +[Parquet]: https://spark.apache.org/docs/latest/sql-data-sources-parquet.html \ No newline at end of file From bd0f5b237a02fdef18bb116c35641878de4c81e2 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 25 Jul 2019 10:09:01 -0400 Subject: [PATCH 241/380] Exposed geotiff writing extension in Python. --- .../rasterframes/ref/RasterSource.scala | 2 +- .../src/main/python/pyrasterframes/__init__.py | 11 +++++++---- .../src/main/python/tests/PyRasterFramesTests.py | 14 ++++++++++++++ 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 287bb8064..4221166e3 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -145,7 +145,7 @@ object RasterSource extends LazyLogging { object IsDefaultGeoTiff { def unapply(source: URI): Boolean = source.getScheme match { - case "file" | "http" | "https" | "s3" => true + case "file" | "http" | "https" | "s3" | "" => true case _ => false } } diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 2af1677a1..713629f18 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -25,7 +25,7 @@ from __future__ import absolute_import from pyspark import SparkContext -from pyspark.sql import SparkSession, DataFrame, DataFrameReader +from pyspark.sql import SparkSession, DataFrame, DataFrameReader, DataFrameWriter from pyspark.sql.column import _to_java_column # Import RasterFrameLayer types and functions @@ -150,6 +150,11 @@ def to_csv(comp): .load(path, **options) +def _geotiff_writer(df_writer, format_key, path, **options): + """ Saves the dataframe to a file of the given type at the given path.""" + return df_writer.format(format_key).save(path=path, options=options) + + # Patch new method on SparkSession to mirror Scala approach SparkSession.withRasterFrames = _rf_init SparkSession.Builder.withKryoSerialization = _kryo_init @@ -163,8 +168,6 @@ def to_csv(comp): # Add DataSource convenience methods to the DataFrameReader DataFrameReader.raster = _raster_reader DataFrameReader.geojson = lambda df_reader, path: _aliased_reader(df_reader, "geojson", path) - - -# Legacy readers DataFrameReader.geotiff = lambda df_reader, path: _layer_reader(df_reader, "geotiff", path) DataFrameReader.geotrellis = lambda df_reader, path: _layer_reader(df_reader, "geotrellis", path) +DataFrameWriter.geotiff = lambda df_writer, path: _geotiff_writer(df_writer, "geotiff", path) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 6fd925459..d6b9cd485 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -781,6 +781,20 @@ def path(scene, band): self.assertTrue(all([row.b1_path in b1_paths for row in b1_paths_maybe])) +class GeoTiffWriter(TestEnvironment): + def test_identity_write(self): + import tempfile + import os + + rf = self.spark.read.geotiff(self.img_uri) + + dest = os.path.join(tempfile.tempdir, "pyrf-test.tif") + rf.write.geotiff(dest) + + rf2 = self.spark.read.geotiff(dest) + self.assertEqual(rf2.count(), rf.count()) + + def suite(): function_tests = unittest.TestSuite() return function_tests From 04a0005225fb5d3a9c455dbf343192e76580000f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 25 Jul 2019 13:08:30 -0400 Subject: [PATCH 242/380] Initial steps toward writing unstructured RasterFrames to GeoTiff. --- .../encoders/StandardEncoders.scala | 3 +- .../ProjectedLayerMetadataAggregate.scala | 177 ++++++++++++++++++ .../extensions/DataFrameMethods.scala | 6 +- .../test/scala/examples/Classification.scala | 161 ---------------- core/src/test/scala/examples/Clustering.scala | 108 ----------- core/src/test/scala/examples/Scratch.scala | 42 ----- core/src/test/scala/examples/Tour.scala | 140 -------------- .../rasterframes/RasterFunctionsSpec.scala | 3 +- .../rasterframes/TestEnvironment.scala | 2 +- .../ProjectedLayerMetadataAggregateTest.scala | 59 ++++++ .../geotiff/GeoTiffCollectionRelation.scala | 1 + .../geotiff/GeoTiffDataSource.scala | 94 +++++----- .../datasource/geotiff/package.scala | 32 +++- .../src/main/python/docs/architecture.md | 12 +- .../src/main/python/docs/raster-write.pymd | 56 +----- .../python/docs/static/df-samples-output.md | 53 ++++++ .../docs/{ => static}/rasterframe-anatomy.png | Bin .../rasterframes-data-sources.png | Bin .../rasterframes-locationtech-stack.png | Bin .../main/python/pyrasterframes/__init__.py | 5 +- .../main/python/tests/GeoTiffWriterTests.py | 53 ++++++ .../main/python/tests/PyRasterFramesTests.py | 13 -- 22 files changed, 434 insertions(+), 586 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala delete mode 100644 core/src/test/scala/examples/Classification.scala delete mode 100644 core/src/test/scala/examples/Clustering.scala delete mode 100644 core/src/test/scala/examples/Scratch.scala delete mode 100644 core/src/test/scala/examples/Tour.scala create mode 100644 core/src/test/scala/org/locationtech/rasterframes/expressions/ProjectedLayerMetadataAggregateTest.scala create mode 100644 pyrasterframes/src/main/python/docs/static/df-samples-output.md rename pyrasterframes/src/main/python/docs/{ => static}/rasterframe-anatomy.png (100%) rename pyrasterframes/src/main/python/docs/{ => static}/rasterframes-data-sources.png (100%) rename pyrasterframes/src/main/python/docs/{ => static}/rasterframes-locationtech-stack.png (100%) create mode 100644 pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala index badce6283..256da58d8 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/StandardEncoders.scala @@ -24,7 +24,6 @@ package org.locationtech.rasterframes.encoders import java.net.URI import java.sql.Timestamp -import org.locationtech.rasterframes.model._ import org.locationtech.rasterframes.stats.{CellHistogram, CellStatistics, LocalCellStatistics} import org.locationtech.jts.geom.Envelope import geotrellis.proj4.CRS @@ -32,6 +31,7 @@ import geotrellis.raster.{CellSize, CellType, Raster, Tile, TileLayout} import geotrellis.spark.tiling.LayoutDefinition import geotrellis.spark.{KeyBounds, SpaceTimeKey, SpatialKey, TemporalKey, TemporalProjectedExtent, TileLayerMetadata} import geotrellis.vector.{Extent, ProjectedExtent} +import org.apache.spark.sql.{Encoder, Encoders} import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.locationtech.geomesa.spark.jts.encoders.SpatialEncoders import org.locationtech.rasterframes.model.{CellContext, Cells, TileContext, TileDataContext} @@ -70,6 +70,7 @@ trait StandardEncoders extends SpatialEncoders { implicit def cellsEncoder: ExpressionEncoder[Cells] = Cells.encoder implicit def tileContextEncoder: ExpressionEncoder[TileContext] = TileContext.encoder implicit def tileDataContextEncoder: ExpressionEncoder[TileDataContext] = TileDataContext.encoder + implicit def extentTilePairEncoder: Encoder[(ProjectedExtent, Tile)] = Encoders.tuple(projectedExtentEncoder, singlebandTileEncoder) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala new file mode 100644 index 000000000..20d827489 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala @@ -0,0 +1,177 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.aggregates + +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer +import org.locationtech.rasterframes.encoders.CatalystSerializer._ +import org.locationtech.rasterframes.model.TileDimensions +import geotrellis.proj4.{CRS, Transform} +import geotrellis.raster._ +import geotrellis.raster.reproject.{Reproject, ReprojectRasterExtent} +import geotrellis.spark.tiling.{FloatingLayoutScheme, LayoutLevel} +import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} +import geotrellis.vector.Extent +import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} +import org.apache.spark.sql.types.{DataType, StructField, StructType} +import org.apache.spark.sql.{Column, Row, TypedColumn} + +class ProjectedLayerMetadataAggregate(destCRS: CRS, destDims: TileDimensions) extends UserDefinedAggregateFunction { + import ProjectedLayerMetadataAggregate._ + + override def inputSchema: StructType = CatalystSerializer[InputRecord].schema + + override def bufferSchema: StructType = CatalystSerializer[BufferRecord].schema + + override def dataType: DataType = CatalystSerializer[TileLayerMetadata[SpatialKey]].schema + + override def deterministic: Boolean = true + + override def initialize(buffer: MutableAggregationBuffer): Unit = () + + override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { + if(!input.isNullAt(0)) { + val in = input.to[InputRecord] + + if(buffer.isNullAt(0)) { + in.toBufferRecord(destCRS).write(buffer) + } + else { + val br = buffer.to[BufferRecord] + br.merge(in.toBufferRecord(destCRS)).write(buffer) + } + } + } + + override def merge(buffer1: MutableAggregationBuffer, buffer2: Row): Unit = { + (buffer1.isNullAt(0), buffer2.isNullAt(0)) match { + case (false, false) ⇒ + val left = buffer1.to[BufferRecord] + val right = buffer2.to[BufferRecord] + left.merge(right).write(buffer1) + case (true, false) ⇒ buffer2.to[BufferRecord].write(buffer1) + case _ ⇒ () + } + } + + override def evaluate(buffer: Row): Any = { + import org.locationtech.rasterframes.encoders.CatalystSerializer._ + val buf = buffer.to[BufferRecord] + val LayoutLevel(_, layout) = FloatingLayoutScheme(destDims.cols, destDims.rows).levelFor(buf.extent, buf.cellSize) + val kb = KeyBounds(layout.mapTransform(buf.extent)) + TileLayerMetadata(buf.cellType, layout, buf.extent, destCRS, kb).toRow + } +} + +object ProjectedLayerMetadataAggregate { + import org.locationtech.rasterframes.encoders.StandardEncoders._ + + /** Primary user facing constructor */ + def apply(destCRS: CRS, extent: Column, crs: Column, cellType: Column, tileSize: Column): TypedColumn[Any, TileLayerMetadata[SpatialKey]] = + // Ordering must match InputRecord schema + new ProjectedLayerMetadataAggregate(destCRS, TileDimensions(NOMINAL_TILE_SIZE, NOMINAL_TILE_SIZE))(extent, crs, cellType, tileSize).as[TileLayerMetadata[SpatialKey]] + + def apply(destCRS: CRS, destDims: TileDimensions, extent: Column, crs: Column, cellType: Column, tileSize: Column): TypedColumn[Any, TileLayerMetadata[SpatialKey]] = + // Ordering must match InputRecord schema + new ProjectedLayerMetadataAggregate(destCRS, destDims)(extent, crs, cellType, tileSize).as[TileLayerMetadata[SpatialKey]] + + + private[expressions] + case class InputRecord(extent: Extent, crs: CRS, cellType: CellType, tileSize: TileDimensions) { self ⇒ + def toBufferRecord(destCRS: CRS): BufferRecord = { + val transform = Transform(crs, destCRS) + + val re = ReprojectRasterExtent( + RasterExtent(extent, tileSize.cols, tileSize.rows), + transform, Reproject.Options.DEFAULT + ) + + BufferRecord( + re.extent, + cellType, + re.cellSize + ) + } + } + + private[expressions] + object InputRecord { + implicit val serializer: CatalystSerializer[InputRecord] = new CatalystSerializer[InputRecord]{ + override def schema: StructType = StructType(Seq( + StructField("extent", CatalystSerializer[Extent].schema, false), + StructField("crs", CatalystSerializer[CRS].schema, false), + StructField("cellType", CatalystSerializer[CellType].schema, false), + StructField("tileSize", CatalystSerializer[TileDimensions].schema, false) + )) + + override protected def to[R](t: InputRecord, io: CatalystIO[R]): R = + throw new IllegalStateException("InputRecord is input only.") + + override protected def from[R](t: R, io: CatalystIO[R]): InputRecord = InputRecord( + io.get[Extent](t, 0), + io.get[CRS](t, 1), + io.get[CellType](t, 2), + io.get[TileDimensions](t, 3) + ) + } + } + + private[expressions] + case class BufferRecord(extent: Extent, cellType: CellType, cellSize: CellSize) { + def merge(that: BufferRecord): BufferRecord = { + val ext = this.extent.combine(that.extent) + val ct = this.cellType.union(that.cellType) + val cs = if (this.cellSize.resolution < that.cellSize.resolution) this.cellSize else that.cellSize + BufferRecord(ext, ct, cs) + } + + def write(buffer: MutableAggregationBuffer): Unit = { + val encoded = (this).toRow + for(i <- 0 until encoded.size) { + buffer(i) = encoded(i) + } + } + } + + private[expressions] + object BufferRecord { + implicit val serializer: CatalystSerializer[BufferRecord] = new CatalystSerializer[BufferRecord] { + override def schema: StructType = StructType(Seq( + StructField("extent", CatalystSerializer[Extent].schema, true), + StructField("cellType", CatalystSerializer[CellType].schema, true), + StructField("cellSize", CatalystSerializer[CellSize].schema, true) + )) + + override protected def to[R](t: BufferRecord, io: CatalystIO[R]): R = io.create( + io.to(t.extent), + io.to(t.cellType), + io.to(t.cellSize) + ) + + override protected def from[R](t: R, io: CatalystIO[R]): BufferRecord = BufferRecord( + io.get[Extent](t, 0), + io.get[CellType](t, 1), + io.get[CellSize](t, 2) + ) + } + } +} \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 43177117b..ed861fc4c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -219,7 +219,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada RasterJoin(self, right, joinExpr, leftExtent, leftCRS, rightExtent, rightCRS) /** - * Convert DataFrame into a RasterFrameLayer + * Convert DataFrame already in a uniform gridding into a RasterFrameLayer * * @param spatialKey The column where the spatial key is stored * @param tlm Metadata describing layout under which tiles were created. Note: no checking is @@ -228,11 +228,12 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada * @return Encoded RasterFrameLayer */ @throws[IllegalArgumentException] + private[rasterframes] def asLayer(spatialKey: Column, tlm: TileLayerMetadata[SpatialKey]): RasterFrameLayer = setSpatialColumnRole(spatialKey, tlm).asLayer /** - * Convert DataFrame into a RasterFrameLayer + * Convert DataFrame already in a uniform gridding into a RasterFrameLayer * * @param spatialKey The column where the spatial key is stored * @param temporalKey The column tagged under the temporal role @@ -242,6 +243,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada * @return Encoded RasterFrameLayer */ @throws[IllegalArgumentException] + private[rasterframes] def asLayer(spatialKey: Column, temporalKey: Column, tlm: TileLayerMetadata[SpaceTimeKey]): RasterFrameLayer = setSpatialColumnRole(spatialKey, tlm) .setTemporalColumnRole(temporalKey) diff --git a/core/src/test/scala/examples/Classification.scala b/core/src/test/scala/examples/Classification.scala deleted file mode 100644 index 6f234e45c..000000000 --- a/core/src/test/scala/examples/Classification.scala +++ /dev/null @@ -1,161 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2017 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - */ - -package examples - -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.ml.TileExploder -import geotrellis.raster._ -import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.raster.render.{ColorRamps, IndexedColorMap} -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.classification.DecisionTreeClassifier -import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator -import org.apache.spark.ml.feature.VectorAssembler -import org.apache.spark.ml.tuning.{CrossValidator, ParamGridBuilder} -import org.apache.spark.sql._ -import org.locationtech.rasterframes.ml.{NoDataFilter, TileExploder} - -object Classification extends App { - -// // Utility for reading imagery from our test data set - def readTiff(name: String) = GeoTiffReader.readSingleband(getClass.getResource(s"/$name").getPath) - - implicit val spark = SparkSession.builder() - .master("local[*]") - .appName(getClass.getName) - .getOrCreate() - .withRasterFrames - - import spark.implicits._ - - // The first step is to load multiple bands of imagery and construct - // a single RasterFrameLayer from them. - val filenamePattern = "L8-%s-Elkton-VA.tiff" - val bandNumbers = 2 to 7 - val bandColNames = bandNumbers.map(b ⇒ s"band_$b").toArray - val tileSize = 10 - - // For each identified band, load the associated image file - val joinedRF = bandNumbers - .map { b ⇒ (b, filenamePattern.format("B" + b)) } - .map { case (b, f) ⇒ (b, readTiff(f)) } - .map { case (b, t) ⇒ t.projectedRaster.toLayer(tileSize, tileSize, s"band_$b") } - .reduce(_ spatialJoin _) - - // We should see a single spatial_key column along with 4 columns of tiles. - joinedRF.printSchema() - - // Similarly pull in the target label data. - val targetCol = "target" - - // Load the target label raster. We have to convert the cell type to - // Double to meet expectations of SparkML - val target = readTiff(filenamePattern.format("Labels")) - .mapTile(_.convert(DoubleConstantNoDataCellType)) - .projectedRaster - .toLayer(tileSize, tileSize, targetCol) - - // Take a peek at what kind of label data we have to work with. - target.select(rf_agg_stats(target(targetCol))).show - - val abt = joinedRF.spatialJoin(target) - - // SparkML requires that each observation be in its own row, and those - // observations be packed into a single `Vector`. The first step is to - // "explode" the tiles into a single row per cell/pixel - val exploder = new TileExploder() - - val noDataFilter = new NoDataFilter() - .setInputCols(bandColNames :+ targetCol) - - // To "vectorize" the the band columns we use the SparkML `VectorAssembler` - val assembler = new VectorAssembler() - .setInputCols(bandColNames) - .setOutputCol("features") - - // Using a decision tree for classification - val classifier = new DecisionTreeClassifier() - .setLabelCol(targetCol) - .setFeaturesCol(assembler.getOutputCol) - - // Assemble the model pipeline - val pipeline = new Pipeline() - .setStages(Array(exploder, noDataFilter, assembler, classifier)) - - // Configure how we're going to evaluate our model's performance. - val evaluator = new MulticlassClassificationEvaluator() - .setLabelCol(targetCol) - .setPredictionCol("prediction") - .setMetricName("f1") - - // Use a parameter grid to determine what the optimal max tree depth is for this data - val paramGrid = new ParamGridBuilder() - //.addGrid(classifier.maxDepth, Array(1, 2, 3, 4)) - .build() - - // Configure the cross validator - val trainer = new CrossValidator() - .setEstimator(pipeline) - .setEvaluator(evaluator) - .setEstimatorParamMaps(paramGrid) - .setNumFolds(4) - - // Push the "go" button - val model = trainer.fit(abt) - - // Format the `paramGrid` settings resultant model - val metrics = model.getEstimatorParamMaps - .map(_.toSeq.map(p ⇒ s"${p.param.name} = ${p.value}")) - .map(_.mkString(", ")) - .zip(model.avgMetrics) - - // Render the parameter/performance association - metrics.toSeq.toDF("params", "metric").show(false) - - // Score the original data set, including cells - // without target values. - val scored = model.bestModel.transform(joinedRF) - - // Add up class membership results - scored.groupBy($"prediction" as "class").count().show - - scored.show(10) - - val tlm = joinedRF.tileLayerMetadata.left.get - - val retiled = scored.groupBy($"spatial_key").agg( - rf_assemble_tile( - $"column_index", $"row_index", $"prediction", - tlm.tileCols, tlm.tileRows, IntConstantNoDataCellType - ) - ) - - val rf = retiled.asLayer($"spatial_key", tlm) - - val raster = rf.toRaster($"prediction", 186, 169) - - val clusterColors = IndexedColorMap.fromColorMap( - ColorRamps.Viridis.toColorMap((0 until 3).toArray) - ) - - raster.tile.renderPng(clusterColors).write("target/scala-2.11/tut/ml/classified.png") - - spark.stop() -} diff --git a/core/src/test/scala/examples/Clustering.scala b/core/src/test/scala/examples/Clustering.scala deleted file mode 100644 index 66e7e58b1..000000000 --- a/core/src/test/scala/examples/Clustering.scala +++ /dev/null @@ -1,108 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2017 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - */ - -package examples - -import org.locationtech.rasterframes._ -import geotrellis.raster.ByteConstantNoDataCellType -import geotrellis.raster.io.geotiff.reader.GeoTiffReader -import geotrellis.raster.render.{ColorRamps, IndexedColorMap} -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.clustering.{KMeans, KMeansModel} -import org.apache.spark.ml.feature.VectorAssembler -import org.apache.spark.sql._ -import org.locationtech.rasterframes.ml.TileExploder - -object Clustering extends App { - - // Utility for reading imagery from our test data set - def readTiff(name: String) = GeoTiffReader.readSingleband(getClass.getResource(s"/$name").getPath) - - implicit val spark = SparkSession.builder().master("local[*]").appName(getClass.getName).getOrCreate().withRasterFrames - - import spark.implicits._ - - // The first step is to load multiple bands of imagery and construct - // a single RasterFrameLayer from them. - val filenamePattern = "L8-B%d-Elkton-VA.tiff" - val bandNumbers = 1 to 7 - val bandColNames = bandNumbers.map(b ⇒ s"band_$b").toArray - - // For each identified band, load the associated image file - val joinedRF = bandNumbers - .map { b ⇒ (b, filenamePattern.format(b)) } - .map { case (b,f) ⇒ (b, readTiff(f)) } - .map { case (b, t) ⇒ t.projectedRaster.toLayer(s"band_$b") } - .reduce(_ spatialJoin _) - - // We should see a single spatial_key column along with 4 columns of tiles. - joinedRF.printSchema() - - // SparkML requires that each observation be in its own row, and those - // observations be packed into a single `Vector`. The first step is to - // "explode" the tiles into a single row per cell/pixel - val exploder = new TileExploder() - - // To "vectorize" the the band columns we use the SparkML `VectorAssembler` - val assembler = new VectorAssembler() - .setInputCols(bandColNames) - .setOutputCol("features") - - // Configure our clustering algorithm - val k = 5 - val kmeans = new KMeans().setK(k) - - // Combine the two stages - val pipeline = new Pipeline().setStages(Array(exploder, assembler, kmeans)) - - // Compute clusters - val model = pipeline.fit(joinedRF) - - // Run the data through the model to assign cluster IDs to each - val clustered = model.transform(joinedRF) - clustered.show(8) - - // If we want to inspect the model statistics, the SparkML API requires us to go - // through this unfortunate contortion: - val clusterResults = model.stages.collect{ case km: KMeansModel ⇒ km}.head - - // Compute sum of squared distances of points to their nearest center - val metric = clusterResults.computeCost(clustered) - println("Within set sum of squared errors: " + metric) - - val tlm = joinedRF.tileLayerMetadata.left.get - - val retiled = clustered.groupBy($"spatial_key").agg( - rf_assemble_tile( - $"column_index", $"row_index", $"prediction", - tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) - ) - - val rf = retiled.asLayer($"spatial_key", tlm) - - val raster = rf.toRaster($"prediction", 186, 169) - - val clusterColors = IndexedColorMap.fromColorMap( - ColorRamps.Viridis.toColorMap((0 until k).toArray) - ) - - raster.tile.renderPng(clusterColors).write("clustered.png") - - spark.stop() -} diff --git a/core/src/test/scala/examples/Scratch.scala b/core/src/test/scala/examples/Scratch.scala deleted file mode 100644 index 151fc2b34..000000000 --- a/core/src/test/scala/examples/Scratch.scala +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2017 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - */ - -package examples - -import org.locationtech.rasterframes._ -import org.apache.spark.sql._ - -/** - * Boilerplate test run file - * - * @since 10/8/17 - */ -object Scratch extends App { - implicit val spark = SparkSession.builder() - .master("local[*]") - .appName(getClass.getName) - .withKryoSerialization - .getOrCreate() - .withRasterFrames - - // import spark.implicits._ - - // Your Spark code here..... - -} diff --git a/core/src/test/scala/examples/Tour.scala b/core/src/test/scala/examples/Tour.scala deleted file mode 100644 index 0c2896949..000000000 --- a/core/src/test/scala/examples/Tour.scala +++ /dev/null @@ -1,140 +0,0 @@ -/* - * This software is licensed under the Apache 2 license, quoted below. - * - * Copyright 2017 Astraea, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); you may not - * use this file except in compliance with the License. You may obtain a copy of - * the License at - * - * [http://www.apache.org/licenses/LICENSE-2.0] - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations under - * the License. - * - */ - -package examples - -import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ -import geotrellis.raster.io.geotiff._ -import geotrellis.raster.{ByteConstantNoDataCellType, Tile} -import org.locationtech.rasterframes._ -import geotrellis.raster.render.{ColorRamps, IndexedColorMap} -import org.apache.spark.ml.Pipeline -import org.apache.spark.ml.clustering.KMeans -import org.apache.spark.ml.feature.VectorAssembler -import org.locationtech.rasterframes.ml.TileExploder - -/** - * Example tour of some general features in RasterFrames - * - * @since 10/24/17 - */ -object Tour extends App { - implicit val spark = SparkSession.builder() - .master("local[*]") - .appName(getClass.getName) - .getOrCreate() - .withRasterFrames - - import spark.implicits._ - - // Read in a geo-referenced image - val scene = SinglebandGeoTiff("src/test/resources/L8-B8-Robinson-IL.tiff") - - // Convert it to a raster frame, discretizing it into the given tile size. - val rf = scene.projectedRaster.toLayer(64, 64) - - // See how many tiles we have after discretization - println("Tile count: " + rf.count()) - - // Take a peek at what we're working with - rf.show(8, false) - - // Confirm we have equally sized tiles - rf.select(rf_dimensions($"tile")).distinct().show() - - // Count the number of no-data cells - rf.select(rf_agg_no_data_cells($"tile")).show(false) - - // Compute per-tile statistics - rf.select(rf_tile_stats($"tile")).show(8, false) - - // Compute some aggregate stats over all cells - rf.select(rf_agg_stats($"tile")).show(false) - - // Create a Spark UDT to perform contrast adjustment via GeoTrellis - val contrast = udf((t: Tile) ⇒ t.sigmoidal(0.2, 10)) - - // Let's contrast adjust the tile column - val withAdjusted = rf.withColumn("adjusted", contrast($"tile")).asLayer - - // Show the stats for the adjusted version - withAdjusted.select(rf_agg_stats($"adjusted")).show(false) - - // Reassemble into a raster and save to a file - val raster = withAdjusted.toRaster($"adjusted", 774, 500) - GeoTiff(raster).write("contrast-adjusted.tiff") - - // Perform some arbitrary local ops between columns and render - val withOp = withAdjusted.withColumn("op", rf_local_subtract($"tile", $"adjusted")).asLayer - val raster2 = withOp.toRaster($"op", 774, 500) - GeoTiff(raster2).write("with-op.tiff") - - - // Perform k-means clustering - val k = 4 - - // SparkML doesn't like NoData/NaN values, so we set the no-data value to something less offensive - val forML = rf.select(rf.spatialKeyColumn, rf_with_no_data($"tile", 99999) as "tile").asLayer - - // First we instantiate the transformer that converts tile rows into cell rows. - val exploder = new TileExploder() - - // This transformer wraps the pixel values in a vector. - // Could use this with multiple bands - val assembler = new VectorAssembler(). - setInputCols(Array("tile")). - setOutputCol("features") - - // Or clustering algorithm - val kmeans = new KMeans().setK(k) - - // Construct the ML pipeline - val pipeline = new Pipeline().setStages(Array(exploder, assembler, kmeans)) - - // Compute the model - val model = pipeline.fit(forML) - - // Score the data - val clusteredCells = model.transform(forML) - - clusteredCells.show() - - clusteredCells.groupBy("prediction").count().show - - // Reassembling the clustering results takes a number of steps. - val tlm = rf.tileLayerMetadata.left.get - - // RasterFrames provides a special aggregation function for assembling tiles from cells with column/row indexes - val retiled = clusteredCells.groupBy(forML.spatialKeyColumn).agg( - rf_assemble_tile($"column_index", $"row_index", $"prediction", tlm.tileCols, tlm.tileRows, ByteConstantNoDataCellType) - ) - - val clusteredRF = retiled.asLayer($"spatial_key", tlm) - - val raster3 = clusteredRF.toRaster($"prediction", 774, 500) - - val clusterColors = IndexedColorMap.fromColorMap( - ColorRamps.Viridis.toColorMap((0 until k).toArray) - ) - - GeoTiff(raster3).copy(options = GeoTiffOptions(clusterColors)).write("clustered.tiff") - - spark.stop() -} diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 84f00d30b..5059fd6b9 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -35,8 +35,7 @@ import org.locationtech.rasterframes.stats._ import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.scalatest.{FunSpec, Matchers} -class RasterFunctionsSpec extends FunSpec - with TestEnvironment with Matchers with RasterMatchers { +class RasterFunctionsSpec extends TestEnvironment with RasterMatchers { import spark.implicits._ val extent = Extent(10, 20, 30, 40) diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala index 0600b4745..87ab2559d 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestEnvironment.scala @@ -40,12 +40,12 @@ trait TestEnvironment extends FunSpec with GeoTrellisTestEnvironment override def sparkMaster: String = "local[*]" override implicit def sc: SparkContext = { _sc.setLogLevel("ERROR"); _sc } - //p.setProperty(“spark.driver.allowMultipleContexts”, “true”) lazy val sqlContext: SQLContext = { val session = SparkSession.builder .config(_sc.getConf) .config("spark.sql.crossJoin.enabled", true) + .withKryoSerialization .getOrCreate() session.sqlContext.withRasterFrames } diff --git a/core/src/test/scala/org/locationtech/rasterframes/expressions/ProjectedLayerMetadataAggregateTest.scala b/core/src/test/scala/org/locationtech/rasterframes/expressions/ProjectedLayerMetadataAggregateTest.scala new file mode 100644 index 000000000..4d4949357 --- /dev/null +++ b/core/src/test/scala/org/locationtech/rasterframes/expressions/ProjectedLayerMetadataAggregateTest.scala @@ -0,0 +1,59 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions + +import geotrellis.raster.Tile +import geotrellis.spark._ +import geotrellis.spark.tiling.FloatingLayoutScheme +import geotrellis.vector.{Extent, ProjectedExtent} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.serialized_literal +import org.locationtech.rasterframes.expressions.aggregates.ProjectedLayerMetadataAggregate +import org.locationtech.rasterframes.model.TileDimensions + +class ProjectedLayerMetadataAggregateTest extends TestEnvironment { + + import spark.implicits._ + + describe("ProjectedLayerMetadataAggregate") { + it("should collect metadata from RasterFrame") { + val image = TestData.sampleGeoTiff + val rf = image.projectedRaster.toLayer(60, 65) + val crs = rf.crs + + val df = rf.withExtent() + .select($"extent", $"tile").as[(Extent, Tile)] + + val tileDims = rf.tileLayerMetadata.merge.tileLayout.tileDimensions + + val (_, tlm) = df + .map { case (ext, tile) => (ProjectedExtent(ext, crs), tile) } + .rdd.collectMetadata[SpatialKey](FloatingLayoutScheme(tileDims._1, tileDims._2)) + + val md = df.select(ProjectedLayerMetadataAggregate(crs, TileDimensions(tileDims), $"extent", + serialized_literal(crs), rf_cell_type($"tile"), rf_dimensions($"tile"))) + val tlm2 = md.first() + + tlm2 should be(tlm) + } + } +} diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala index 3c3151783..3148a67d0 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffCollectionRelation.scala @@ -37,6 +37,7 @@ import org.locationtech.rasterframes.datasource.geotiff.GeoTiffCollectionRelatio import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.util._ +private[geotiff] case class GeoTiffCollectionRelation(sqlContext: SQLContext, uri: URI, bandCount: Int) extends BaseRelation with PrunedScan { override def schema: StructType = StructType(Seq( diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index c62d1a7e3..a080b9691 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -21,16 +21,18 @@ package org.locationtech.rasterframes.datasource.geotiff -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.datasource._ -import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} -import org.apache.spark.sql.types.LongType -import org.apache.spark.sql.{DataFrame, SQLContext, SaveMode, functions ⇒ F} -import _root_.geotrellis.raster.io.geotiff.{GeoTiffOptions, MultibandGeoTiff, Tags, Tiled} import _root_.geotrellis.raster.io.geotiff.compression._ import _root_.geotrellis.raster.io.geotiff.tags.codes.ColorSpace +import _root_.geotrellis.raster.io.geotiff.{GeoTiffOptions, MultibandGeoTiff, Tags, Tiled} +import com.typesafe.scalalogging.LazyLogging +import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} +import org.apache.spark.sql._ +import org.apache.spark.sql.functions._ +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource._ +import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate +import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition +import org.locationtech.rasterframes.util._ /** * Spark SQL data source over GeoTIFF files. @@ -58,42 +60,47 @@ class GeoTiffDataSource extends DataSourceRegister else GeoTiffRelation(sqlContext, p) } + def createLayer(df: DataFrame, parameters: Map[String, String], tileCols: Seq[Column]): RasterFrameLayer = { + require(tileCols.nonEmpty, "need at least one tile column") + + +// val prd = ProjectedRasterDefinition() +// val crsCol = col("crs") +// val extentCol = col("extent") +// df.agg(TileRasterizerAggregate(prd, crsCol, extentCol, tileCols.head)) + ??? + } + override def createRelation(sqlContext: SQLContext, mode: SaveMode, parameters: Map[String, String], data: DataFrame): BaseRelation = { val pathO = path(parameters) require(pathO.isDefined, "Valid URI 'path' parameter required.") require(pathO.get.getScheme == "file" || pathO.get.getScheme == null, "Currently only 'file://' destinations are supported") sqlContext.withRasterFrames - require(data.isLayer, "GeoTIFF can only be constructed from a RasterFrameLayer") - val rf = data.certify + val compress = parameters.get(GeoTiffDataSource.COMPRESS_PARAM).exists(_.toBoolean) + val tcols = data.tileColumns - // If no desired image size is given, write at full size. - lazy val (fullResCols, fullResRows) = { - // get the layout size given that the tiles may be heterogenously sized - // first get any valid row and column in the spatial key structure - val sk = rf.select(SPATIAL_KEY_COLUMN).first() - - val tc = rf.tileColumns.head - - val c = rf - .where(SPATIAL_KEY_COLUMN("row") === sk.row) - .agg( - F.sum(rf_dimensions(tc)("cols") cast(LongType)) - ).first() - .getLong(0) - - val r = rf - .where(SPATIAL_KEY_COLUMN("col") === sk.col) - .agg( - F.sum(rf_dimensions(tc)("rows") cast(LongType)) - ).first() - .getLong(0) - - (c, r) + require(tcols.nonEmpty, "Could not find any tile columns.") + + val tags = Tags( + RFBuildInfo.toMap.filter(_._1.startsWith("rf")).mapValues(_.toString), + tcols.map(c ⇒ Map("RF_COL" -> c.columnName)).toList + ) + + // We make some assumptions here.... eventually have column metadata encode this. + val colorSpace = tcols.size match { + case 3 | 4 ⇒ ColorSpace.RGB + case _ ⇒ ColorSpace.BlackIsZero } - val cols = numParam(GeoTiffDataSource.IMAGE_WIDTH_PARAM, parameters).getOrElse(fullResCols) - val rows = numParam(GeoTiffDataSource.IMAGE_HEIGHT_PARAM, parameters).getOrElse(fullResRows) + val tiffOptions = GeoTiffOptions(Tiled, if (compress) DeflateCompression else NoCompression, colorSpace) + + val layer = if(data.isLayer) data.certify else createLayer(data, parameters, tcols) + + val tlm = layer.tileLayerMetadata.merge + // If no desired image size is given, write at full size. + val cols = numParam(GeoTiffDataSource.IMAGE_WIDTH_PARAM, parameters).getOrElse(tlm.gridBounds.width.toLong) + val rows = numParam(GeoTiffDataSource.IMAGE_HEIGHT_PARAM, parameters).getOrElse(tlm.gridBounds.height.toLong) require(cols <= Int.MaxValue && rows <= Int.MaxValue, s"Can't construct a GeoTIFF of size $cols x $rows. (Too big!)") @@ -101,22 +108,9 @@ class GeoTiffDataSource extends DataSourceRegister if(cols.toDouble * rows * 64.0 > Runtime.getRuntime.totalMemory() * 0.5) logger.warn(s"You've asked for the construction of a very large image ($cols x $rows), destined for ${pathO.get}. Out of memory error likely.") - val tcols = rf.tileColumns - val raster = rf.toMultibandRaster(tcols, cols.toInt, rows.toInt) + val raster = layer.toMultibandRaster(tcols, cols.toInt, rows.toInt) - // We make some assumptions here.... eventually have column metadata encode this. - val colorSpace = tcols.size match { - case 3 | 4 ⇒ ColorSpace.RGB - case _ ⇒ ColorSpace.BlackIsZero - } - - val compress = parameters.get(GeoTiffDataSource.COMPRESS_PARAM).map(_.toBoolean).getOrElse(false) - val options = GeoTiffOptions(Tiled, if (compress) DeflateCompression else NoCompression, colorSpace) - val tags = Tags( - RFBuildInfo.toMap.filter(_._1.startsWith("rf")).mapValues(_.toString), - tcols.map(c ⇒ Map("RF_COL" -> c.columnName)).toList - ) - val geotiff = new MultibandGeoTiff(raster.tile, raster.extent, raster.crs, tags, options) + val geotiff = new MultibandGeoTiff(raster.tile, raster.extent, raster.crs, tags, tiffOptions) logger.debug(s"Writing DataFrame to GeoTIFF ($cols x $rows) at ${pathO.get}") geotiff.write(pathO.get.getPath) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala index f89ebc2d6..8c7b644d5 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala @@ -29,25 +29,47 @@ import shapeless.tag package object geotiff { /** Tagged type construction for enabling type-safe extension methods for loading - * a RasterFrameLayer in expected form. */ + * a RasterFrameLayer from a single GeoTiff. */ type GeoTiffRasterFrameReader = DataFrameReader @@ GeoTiffRasterFrameReaderTag trait GeoTiffRasterFrameReaderTag + /** Tagged type construction for enabling type-safe extension methods for writing + * a RasterFrame to a geotiff. */ + type GeoTiffRasterFrameWriter[T] = DataFrameWriter[T] @@ GeoTiffRasterFrameWriterTag + trait GeoTiffRasterFrameWriterTag + /** Adds `geotiff` format specifier to `DataFrameReader`. */ implicit class DataFrameReaderHasGeoTiffFormat(val reader: DataFrameReader) { @deprecated("Use `raster` instead.", "7/1/2019") def geotiff: GeoTiffRasterFrameReader = - tag[GeoTiffRasterFrameReaderTag][DataFrameReader](reader.format(GeoTiffDataSource.SHORT_NAME)) + tag[GeoTiffRasterFrameReaderTag][DataFrameReader]( + reader.format(GeoTiffDataSource.SHORT_NAME) + ) } implicit class DataFrameWriterHasGeoTiffFormat[T](val writer: DataFrameWriter[T]) { - @deprecated("Use `raster` instead.", "7/1/2019") - def geotiff: DataFrameWriter[T] = writer.format(GeoTiffDataSource.SHORT_NAME) + def geotiff: GeoTiffRasterFrameWriter[T] = + tag[GeoTiffRasterFrameWriterTag][DataFrameWriter[T]]( + writer.format(GeoTiffDataSource.SHORT_NAME) + ) + + def withDimensions(cols: Int, rows: Int): GeoTiffRasterFrameWriter[T] = + tag[GeoTiffRasterFrameWriterTag][DataFrameWriter[T]]( + writer + .option(GeoTiffDataSource.IMAGE_WIDTH_PARAM, cols) + .option(GeoTiffDataSource.IMAGE_HEIGHT_PARAM, rows) + ) + + def withCompression: GeoTiffRasterFrameWriter[T] = + tag[GeoTiffRasterFrameWriterTag][DataFrameWriter[T]]( + writer + .option(GeoTiffDataSource.COMPRESS_PARAM, true) + ) } /** Adds `loadLayer` to appropriately tagged `DataFrameReader` */ implicit class GeoTiffReaderWithRF(val reader: GeoTiffRasterFrameReader) { @deprecated("Use `raster` instead.", "7/1/2019") - def loadRF(path: URI): RasterFrameLayer = reader.load(path.toASCIIString).asLayer + def loadLayer(path: URI): RasterFrameLayer = reader.load(path.toASCIIString).asLayer } } diff --git a/pyrasterframes/src/main/python/docs/architecture.md b/pyrasterframes/src/main/python/docs/architecture.md index 5dc5735a5..d8650689e 100644 --- a/pyrasterframes/src/main/python/docs/architecture.md +++ b/pyrasterframes/src/main/python/docs/architecture.md @@ -5,7 +5,7 @@ RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO [JTS](https://github.com/locationtech/jts), and [SFCurve](https://github.com/locationtech/sfcurve) (see below). -![LocationTech Stack](rasterframes-locationtech-stack.png) +![LocationTech Stack](static/rasterframes-locationtech-stack.png) ## Concepts @@ -19,17 +19,15 @@ RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO > * Projected Raster > * Layer -RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As showin in Figure 2, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. +RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. -![RasterFrame Anatomy](rasterframe-anatomy.png) +![RasterFrame Anatomy](static/rasterframe-anatomy.png) Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. -> Update to match components in raster-io.md - -![RasterFrame Data Sources](rasterframes-data-sources.png) - +> TODO: Update to match components in raster-io.md +![RasterFrame Data Sources](static/rasterframes-data-sources.png) [R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index ba4af68db..0097cb1b3 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -33,7 +33,7 @@ display(tile) # IPython.display function Within an IPython or Jupyter interpreter a Pandas DataFrame containing a column of _tiles_ will be rendered as the samples discussed above. Simply import the `rf_ipython` submodule to enable enhanced HTML rendering of a Pandas DataFrame. -In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](pandas-numpy.md). +In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](numpy-pandas.md). ```python toPandas, evaluate=True import pyrasterframes.rf_ipython @@ -52,59 +52,11 @@ Viewing the DataFrame in Jupyter looks like this. pandas_df ``` +@@include[df-samples-output.md](static/df-samples-output.md) -
          - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
          extenttile
          0(-7783653.637667, 1082298.5058092135, -7754001.623809213, 1111950.519667)Image
          1(-7754001.623809214, 1082298.5058092135, -7724349.609951426, 1111950.519667)Image
          2(-7724349.609951427, 1082298.5058092135, -7694697.59609364, 1111950.519667)Image
          3(-7694697.596093641, 1082298.5058092135, -7665045.582235852, 1111950.519667)Image
          4(-7665045.582235853, 1082298.5058092135, -7635393.568378066, 1111950.519667)Image
          -
          +## PNG Overviews +It is oftentimes convenient to have a simple overview image of the data, particularly if it spans a very wide area. ## GeoTIFFs diff --git a/pyrasterframes/src/main/python/docs/static/df-samples-output.md b/pyrasterframes/src/main/python/docs/static/df-samples-output.md new file mode 100644 index 000000000..a7f56faf2 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/static/df-samples-output.md @@ -0,0 +1,53 @@ + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          extenttile
          0(-7783653.637667, 1082298.5058092135, -7754001.623809213, 1111950.519667)Image
          1(-7754001.623809214, 1082298.5058092135, -7724349.609951426, 1111950.519667)Image
          2(-7724349.609951427, 1082298.5058092135, -7694697.59609364, 1111950.519667)Image
          3(-7694697.596093641, 1082298.5058092135, -7665045.582235852, 1111950.519667)Image
          4(-7665045.582235853, 1082298.5058092135, -7635393.568378066, 1111950.519667)Image
          +
          diff --git a/pyrasterframes/src/main/python/docs/rasterframe-anatomy.png b/pyrasterframes/src/main/python/docs/static/rasterframe-anatomy.png similarity index 100% rename from pyrasterframes/src/main/python/docs/rasterframe-anatomy.png rename to pyrasterframes/src/main/python/docs/static/rasterframe-anatomy.png diff --git a/pyrasterframes/src/main/python/docs/rasterframes-data-sources.png b/pyrasterframes/src/main/python/docs/static/rasterframes-data-sources.png similarity index 100% rename from pyrasterframes/src/main/python/docs/rasterframes-data-sources.png rename to pyrasterframes/src/main/python/docs/static/rasterframes-data-sources.png diff --git a/pyrasterframes/src/main/python/docs/rasterframes-locationtech-stack.png b/pyrasterframes/src/main/python/docs/static/rasterframes-locationtech-stack.png similarity index 100% rename from pyrasterframes/src/main/python/docs/rasterframes-locationtech-stack.png rename to pyrasterframes/src/main/python/docs/static/rasterframes-locationtech-stack.png diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index 20fa381e6..f992b2534 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -167,7 +167,7 @@ def temp_name(): .load(path, **options) -def _geotiff_writer(df_writer, format_key, path, **options): +def _aliased_writer(df_writer, format_key, path, **options): """ Saves the dataframe to a file of the given type at the given path.""" return df_writer.format(format_key).save(path=path, options=options) @@ -186,5 +186,6 @@ def _geotiff_writer(df_writer, format_key, path, **options): DataFrameReader.raster = _raster_reader DataFrameReader.geojson = lambda df_reader, path: _aliased_reader(df_reader, "geojson", path) DataFrameReader.geotiff = lambda df_reader, path: _layer_reader(df_reader, "geotiff", path) +DataFrameWriter.geotiff = lambda df_writer, path: _aliased_writer(df_writer, "geotiff", path) DataFrameReader.geotrellis = lambda df_reader, path: _layer_reader(df_reader, "geotrellis", path) -DataFrameWriter.geotiff = lambda df_writer, path: _geotiff_writer(df_writer, "geotiff", path) +DataFrameWriter.geotrellis = lambda df_writer, path: _aliased_writer(df_writer, "geotrellis", path) \ No newline at end of file diff --git a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py new file mode 100644 index 000000000..7bdf1d1e0 --- /dev/null +++ b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py @@ -0,0 +1,53 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import os +import tempfile + +from . import TestEnvironment + + +class GeoTiffWriter(TestEnvironment): + + @staticmethod + def _tmpfile(): + return os.path.join(tempfile.tempdir, "pyrf-test.tif") + + def test_identity_write(self): + rf = self.spark.read.geotiff(self.img_uri) + + dest = self._tmpfile() + rf.write.geotiff(dest) + + rf2 = self.spark.read.geotiff(dest) + self.assertEqual(rf2.count(), rf.count()) + + os.remove(dest) + + def test_unstructured_write(self): + rf = self.spark.read.raster(self.img_uri) + + dest = self._tmpfile() + rf.write.geotiff(dest) + + rf2 = self.spark.read.raster(dest) + self.assertEqual(rf2.count(), rf.count()) + + os.remove(dest) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 2bfcbfc94..ccdc952b4 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -837,19 +837,6 @@ def path(scene, band): self.assertTrue(df2.select('b1_path').distinct().count() == 3) -class GeoTiffWriter(TestEnvironment): - def test_identity_write(self): - import tempfile - import os - - rf = self.spark.read.geotiff(self.img_uri) - - dest = os.path.join(tempfile.tempdir, "pyrf-test.tif") - rf.write.geotiff(dest) - - rf2 = self.spark.read.geotiff(dest) - self.assertEqual(rf2.count(), rf.count()) - def suite(): function_tests = unittest.TestSuite() From a5adce50270711d71eb1397e38a5b3f482d41314 Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Thu, 25 Jul 2019 13:49:16 -0400 Subject: [PATCH 243/380] add picture, fix display for pyweave Signed-off-by: Eric Culbertson --- pyrasterframes/src/main/python/docs/local-algebra.pymd | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/local-algebra.pymd b/pyrasterframes/src/main/python/docs/local-algebra.pymd index c90f24322..f5f215974 100644 --- a/pyrasterframes/src/main/python/docs/local-algebra.pymd +++ b/pyrasterframes/src/main/python/docs/local-algebra.pymd @@ -14,6 +14,10 @@ spark = create_rf_spark_session() [Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single `tile`, between a `tile` and a scalar, between two `tile`s, or among many `tile`s. These operations are common in processing of earth observation and other image data. +local op + +Credit: [GISGeography](https://gisgeography.com) + ## Computing NDVI @@ -57,10 +61,9 @@ df.printSchema() We can inspect a sample of the data. Yellow indicates very healthy vegetation, and purple represents bare soil or impervious surfaces. ```python -df.select(rf_tile('ndvi').alias('ndvi')).limit(5).toPandas() -``` -**TODO** fix the display once issue #166 fix. +display(df.select(rf_tile('ndvi').alias('ndvi')).first()['ndvi']) +``` We continue examining NDVI in the @ref:[time series](time-series.md) section. From 17f7a2bac7efa9423f18c81a2cfe51b5e4028a2a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 25 Jul 2019 16:14:01 -0400 Subject: [PATCH 244/380] Added ability to write unstructured RasterFrame to GeoTiff. --- .../encoders/CatalystSerializer.scala | 5 + .../expressions/DynamicExtractors.scala | 14 +- .../expressions/SpatialRelation.scala | 3 +- .../aggregates/TileRasterizerAggregate.scala | 20 ++- .../transformers/SetCellType.scala | 2 +- .../extensions/DataFrameMethods.scala | 99 +++++++------ .../rasterframes/extensions/RasterJoin.scala | 35 +---- .../extensions/ReprojectToLayer.scala | 49 +++++++ .../rasterframes/functions/package.scala | 38 ++++- .../rasterframes/rasterframes.scala | 2 + .../rasterframes/ExtensionMethodSpec.scala | 9 ++ .../rasterframes/RasterFunctionsSpec.scala | 1 - .../locationtech/rasterframes/TestData.scala | 4 +- .../geotiff/GeoTiffDataSource.scala | 135 ++++++++++++------ .../datasource/geotiff/package.scala | 6 + .../geotiff/GeoTiffDataSourceSpec.scala | 20 ++- 16 files changed, 304 insertions(+), 138 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/extensions/ReprojectToLayer.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala index 921d0bb67..831411557 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/encoders/CatalystSerializer.scala @@ -154,4 +154,9 @@ object CatalystSerializer extends StandardSerializers { implicit class WithFromRow(val r: Row) extends AnyVal { def to[T >: Null: CatalystSerializer]: T = if (r == null) null else CatalystSerializer[T].fromRow(r) } + + implicit class WithTypeConformity(val left: DataType) extends AnyVal { + def conformsTo[T >: Null: CatalystSerializer]: Boolean = + org.apache.spark.sql.rf.WithTypeConformity(left).conformsTo(schemaOf[T]) + } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala index ecc9698f2..a7144a8f2 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala @@ -24,7 +24,7 @@ package org.locationtech.rasterframes.expressions import geotrellis.raster.{CellGrid, Tile} import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow -import org.apache.spark.sql.rf.{TileUDT, _} +import org.apache.spark.sql.rf.{TileUDT, RasterSourceUDT} import org.apache.spark.sql.types._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.model.TileContext @@ -38,7 +38,7 @@ object DynamicExtractors { case _: TileUDT => (row: InternalRow) => (row.to[Tile](TileUDT.tileSerializer), None) - case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => + case t if t.conformsTo[ProjectedRasterTile] => (row: InternalRow) => { val prt = row.to[ProjectedRasterTile] (prt, Some(TileContext(prt))) @@ -48,7 +48,7 @@ object DynamicExtractors { lazy val rowTileExtractor: PartialFunction[DataType, Row => (Tile, Option[TileContext])] = { case _: TileUDT => (row: Row) => (row.to[Tile](TileUDT.tileSerializer), None) - case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => + case t if t.conformsTo[ProjectedRasterTile] => (row: Row) => { val prt = row.to[ProjectedRasterTile] (prt, Some(TileContext(prt))) @@ -59,9 +59,9 @@ object DynamicExtractors { lazy val projectedRasterLikeExtractor: PartialFunction[DataType, InternalRow ⇒ ProjectedRasterLike] = { case _: RasterSourceUDT ⇒ (row: InternalRow) => row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) - case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => + case t if t.conformsTo[ProjectedRasterTile] => (row: InternalRow) => row.to[ProjectedRasterTile] - case t if t.conformsTo(schemaOf[RasterRef]) => + case t if t.conformsTo[RasterRef] => (row: InternalRow) => row.to[RasterRef] } @@ -71,9 +71,9 @@ object DynamicExtractors { (row: InternalRow) => row.to[Tile](TileUDT.tileSerializer) case _: RasterSourceUDT => (row: InternalRow) => row.to[RasterSource](RasterSourceUDT.rasterSourceSerializer) - case t if t.conformsTo(schemaOf[RasterRef]) ⇒ + case t if t.conformsTo[RasterRef] ⇒ (row: InternalRow) => row.to[RasterRef] - case t if t.conformsTo(schemaOf[ProjectedRasterTile]) => + case t if t.conformsTo[ProjectedRasterTile] => (row: InternalRow) => row.to[ProjectedRasterTile] } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala index 34e44b082..1d6697048 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/SpatialRelation.scala @@ -30,7 +30,6 @@ import org.apache.spark.sql.catalyst.encoders.ExpressionEncoder import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{ScalaUDF, _} import org.apache.spark.sql.jts.AbstractGeometryUDT -import org.apache.spark.sql.rf.WithTypeConformity import org.apache.spark.sql.types._ import org.locationtech.geomesa.spark.jts.udf.SpatialRelationFunctions._ @@ -48,7 +47,7 @@ abstract class SpatialRelation extends BinaryExpression case r: InternalRow ⇒ expr.dataType match { case udt: AbstractGeometryUDT[_] ⇒ udt.deserialize(r) - case dt if dt.conformsTo(schemaOf[Extent]) => + case dt if dt.conformsTo[Extent] => val extent = r.to[Extent] extent.jtsGeom } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala index c68b8aecb..a93abb15b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala @@ -21,16 +21,17 @@ package org.locationtech.rasterframes.expressions.aggregates -import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.encoders.CatalystSerializer._ import geotrellis.proj4.CRS +import geotrellis.raster.reproject.Reproject import geotrellis.raster.resample.ResampleMethod import geotrellis.raster.{ArrayTile, CellType, Raster, Tile} +import geotrellis.spark.TileLayerMetadata import geotrellis.vector.Extent import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} import org.apache.spark.sql.types.{DataType, StructField, StructType} import org.apache.spark.sql.{Column, Row, TypedColumn} -import geotrellis.raster.reproject.Reproject +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition /** @@ -87,10 +88,21 @@ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefine } object TileRasterizerAggregate { - val nodeName = "tile_rasterizer_aggregate" + val nodeName = "rf_tile_rasterizer_aggregate" /** Convenience grouping of parameters needed for running aggregate. */ case class ProjectedRasterDefinition(cols: Int, rows: Int, cellType: CellType, crs: CRS, extent: Extent, sampler: ResampleMethod = ResampleMethod.DEFAULT) + object ProjectedRasterDefinition { + def apply(tlm: TileLayerMetadata[_]): ProjectedRasterDefinition = apply(tlm, ResampleMethod.DEFAULT) + + def apply(tlm: TileLayerMetadata[_], sampler: ResampleMethod): ProjectedRasterDefinition = { + val actualSize = tlm.layout.toRasterExtent().gridBoundsFor(tlm.extent) + val cols = actualSize.width + val rows = actualSize.height + new ProjectedRasterDefinition(cols, rows, tlm.cellType, tlm.crs, tlm.extent, sampler) + } +} + def apply(prd: ProjectedRasterDefinition, crsCol: Column, extentCol: Column, tileCol: Column): TypedColumn[Any, Raster[Tile]] = new TileRasterizerAggregate(prd)(crsCol, extentCol, tileCol).as(nodeName).as[Raster[Tile]] } \ No newline at end of file diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala index 772432d1f..6990e34df 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/SetCellType.scala @@ -32,7 +32,7 @@ import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.{TypeCheckFailure, import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback import org.apache.spark.sql.catalyst.expressions.{BinaryExpression, Expression} import org.apache.spark.sql.functions.lit -import org.apache.spark.sql.rf._ +import org.apache.spark.sql.rf.{TileUDT, WithTypeConformity} import org.apache.spark.sql.types._ import org.apache.spark.sql.{Column, TypedColumn} import org.apache.spark.unsafe.types.UTF8String diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index ed861fc4c..0e224a1de 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -21,20 +21,23 @@ package org.locationtech.rasterframes.extensions -import org.locationtech.rasterframes.StandardColumns._ -import org.locationtech.rasterframes.util._ -import org.locationtech.rasterframes.RasterFrameLayer -import geotrellis.raster.Tile +import geotrellis.proj4.CRS +import geotrellis.raster.{MultibandTile, Tile} import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} import geotrellis.util.MethodExtensions +import geotrellis.vector.{Extent, ProjectedExtent} +import org.apache.spark.rdd.RDD import org.apache.spark.sql.catalyst.expressions.Attribute import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} -import spray.json.JsonFormat +import org.locationtech.rasterframes.{MetadataKeys, RasterFrameLayer} +import org.locationtech.rasterframes.StandardColumns._ +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.StandardEncoders._ import org.locationtech.rasterframes.expressions.DynamicExtractors -import org.locationtech.rasterframes.MetadataKeys +import org.locationtech.rasterframes.util._ +import spray.json.JsonFormat import scala.util.Try @@ -91,7 +94,19 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def tileColumns: Seq[Column] = self.schema.fields .filter(f => DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) - .map(f ⇒ self.col(f.name).as[Tile]) + .map(f ⇒ self.col(f.name)) + + /** Get the columns that look like `Extent`s. */ + def extentColumns: Seq[Column] = + self.schema.fields + .filter(_.dataType.conformsTo[Extent]) + .map(f => self.col(f.name)) + + /** Get the columns that look like `CRS`s. */ + def crsColumns: Seq[Column] = + self.schema.fields + .filter(_.dataType.conformsTo[CRS]) + .map(f => self.col(f.name)) /** Get the columns that are not of type `Tile` */ def notTileColumns: Seq[Column] = @@ -135,38 +150,6 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def withPrefixedColumnNames(prefix: String): DF = self.columns.foldLeft(self)((df, c) ⇒ df.withColumnRenamed(c, s"$prefix$c").asInstanceOf[DF]) - /** Converts this DataFrame to a RasterFrameLayer after ensuring it has: - * - *
            - *
          1. a space or space-time key column - *
          2. one or more tile columns - *
          3. tile layout metadata - *
              - * - * If any of the above are violated, and [[IllegalArgumentException]] is thrown. - * - * @return validated RasterFrameLayer - * @throws IllegalArgumentException when constraints are not met. - */ - @throws[IllegalArgumentException] - def asLayer: RasterFrameLayer = { - val potentialRF = certifyRasterframe(self) - - require( - potentialRF.findSpatialKeyField.nonEmpty, - "A RasterFrameLayer requires a column identified as a spatial key" - ) - - require(potentialRF.tileColumns.nonEmpty, "A RasterFrameLayer requires at least one tile column") - - require( - Try(potentialRF.tileLayerMetadata).isSuccess, - "A RasterFrameLayer requires embedded TileLayerMetadata" - ) - - potentialRF - } - /** * Performs a jeft join on the dataframe `right` to this one, reprojecting and merging tiles as necessary. * The operation is logically a "left outer" join, with the left side also determining the target CRS and extents. @@ -218,6 +201,42 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada def rasterJoin(right: DataFrame, joinExpr: Column, leftExtent: Column, leftCRS: Column, rightExtent: Column, rightCRS: Column): DataFrame = RasterJoin(self, right, joinExpr, leftExtent, leftCRS, rightExtent, rightCRS) + + /** Layout contents of RasterFrame to a layer. Assumes CRS and extent columns exist. */ + def toLayer(tlm: TileLayerMetadata[SpatialKey]): RasterFrameLayer = ReprojectToLayer(self, tlm) + + /** Coerces this DataFrame to a RasterFrameLayer after ensuring it has: + * + *
                + *
              1. a space or space-time key column + *
              2. one or more tile columns + *
              3. tile layout metadata + *
                  + * + * If any of the above are violated, and [[IllegalArgumentException]] is thrown. + * + * @return validated RasterFrameLayer + * @throws IllegalArgumentException when constraints are not met. + */ + @throws[IllegalArgumentException] + def asLayer: RasterFrameLayer = { + val potentialRF = certifyRasterframe(self) + + require( + potentialRF.findSpatialKeyField.nonEmpty, + "A RasterFrameLayer requires a column identified as a spatial key" + ) + + require(potentialRF.tileColumns.nonEmpty, "A RasterFrameLayer requires at least one tile column") + + require( + Try(potentialRF.tileLayerMetadata).isSuccess, + "A RasterFrameLayer requires embedded TileLayerMetadata" + ) + + potentialRF + } + /** * Convert DataFrame already in a uniform gridding into a RasterFrameLayer * @@ -273,7 +292,7 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada * * @return true if all constraints are fulfilled, false otherwise. */ - def isLayer: Boolean = Try(asLayer).isSuccess + def isAlreadyLayer: Boolean = Try(asLayer).isSuccess /** Internal method for slapping the RasterFreameLayer seal of approval on a DataFrame. * Only call if if you are sure it has a spatial key and tile columns and TileLayerMetadata. */ diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala index 83f85fdd0..e0cec7a8c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/RasterJoin.scala @@ -20,48 +20,15 @@ */ package org.locationtech.rasterframes.extensions -import geotrellis.proj4.CRS -import geotrellis.raster._ -import geotrellis.raster.reproject.Reproject -import geotrellis.vector.Extent import org.apache.spark.sql._ import org.apache.spark.sql.functions._ import org.locationtech.rasterframes._ -import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.model.TileDimensions +import org.locationtech.rasterframes.functions.reproject_and_merge import org.locationtech.rasterframes.util._ import scala.util.Random object RasterJoin { - private val projOpts = Reproject.Options.DEFAULT - - val reproject_and_merge_f: (Row, Row, Seq[Tile], Seq[Row], Seq[Row], Row) => Tile = (leftExtentEnc: Row, leftCRSEnc: Row, tiles: Seq[Tile], rightExtentEnc: Seq[Row], rightCRSEnc: Seq[Row], leftDimsEnc: Row) => { - if (tiles.isEmpty) null - else { - require(tiles.length == rightExtentEnc.length && tiles.length == rightCRSEnc.length, "size mismatch") - - val leftExtent = leftExtentEnc.to[Extent] - val leftDims = leftDimsEnc.to[TileDimensions] - val leftCRS = leftCRSEnc.to[CRS] - val rightExtents = rightExtentEnc.map(_.to[Extent]) - val rightCRSs = rightCRSEnc.map(_.to[CRS]) - - val cellType = tiles.map(_.cellType).reduceOption(_ union _).getOrElse(tiles.head.cellType) - - val dest: Tile = ArrayTile.empty(cellType, leftDims.cols, leftDims.rows) - //is there a GT function to do all this? - tiles.zip(rightExtents).zip(rightCRSs).map { - case ((tile, extent), crs) => - tile.reproject(extent, crs, leftCRS, projOpts) - }.foldLeft(dest)((d, t) => - d.merge(leftExtent, t.extent, t.tile, projOpts.method) - ) - } - } - - // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. - def reproject_and_merge = udf(reproject_and_merge_f).withName("reproject_and_merge") def apply(left: DataFrame, right: DataFrame): DataFrame = { val df = apply(left, right, left("extent"), left("crs"), right("extent"), right("crs")) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/ReprojectToLayer.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/ReprojectToLayer.scala new file mode 100644 index 000000000..c396deaee --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/ReprojectToLayer.scala @@ -0,0 +1,49 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.extensions + +import geotrellis.spark.{SpatialKey, TileLayerMetadata} +import org.apache.spark.sql._ +import org.apache.spark.sql.functions.broadcast +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.util._ +object ReprojectToLayer { + + def apply(df: DataFrame, tlm: TileLayerMetadata[SpatialKey]): RasterFrameLayer = { + // create a destination dataframe with crs and extend columns + // use RasterJoin to do the rest. + val gb = tlm.gridBounds + val crs = tlm.crs + + val gridItems = for { + (col, row) <- gb.coordsIter + sk = SpatialKey(col, row) + e = tlm.mapTransform(sk) + } yield (sk, e, crs) + + val dest = df.sparkSession.createDataFrame(gridItems.toSeq) + .toDF(SPATIAL_KEY_COLUMN.columnName, EXTENT_COLUMN.columnName, CRS_COLUMN.columnName) + val joined = RasterJoin(broadcast(dest), df) + + joined.asLayer(SPATIAL_KEY_COLUMN, tlm) + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index 427dc504c..51c78a34b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -19,12 +19,16 @@ * */ package org.locationtech.rasterframes +import geotrellis.proj4.CRS import geotrellis.raster.{Tile, _} +import geotrellis.raster.reproject.Reproject import geotrellis.vector.Extent -import org.apache.spark.sql.SQLContext +import org.apache.spark.sql.functions.udf +import org.apache.spark.sql.{Row, SQLContext} import org.locationtech.jts.geom.Geometry +import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.jts.ReprojectionTransformer -import org.locationtech.rasterframes.model.LazyCRS +import org.locationtech.rasterframes.model.{LazyCRS, TileDimensions} /** * Module utils. @@ -100,6 +104,36 @@ package object functions { private[rasterframes] val tileOnes: (Int, Int, String) ⇒ Tile = (cols, rows, cellTypeName) ⇒ makeConstantTile(1, cols, rows, cellTypeName) + val reproject_and_merge_f: (Row, Row, Seq[Tile], Seq[Row], Seq[Row], Row) => Tile = (leftExtentEnc: Row, leftCRSEnc: Row, tiles: Seq[Tile], rightExtentEnc: Seq[Row], rightCRSEnc: Seq[Row], leftDimsEnc: Row) => { + if (tiles.isEmpty) null + else { + require(tiles.length == rightExtentEnc.length && tiles.length == rightCRSEnc.length, "size mismatch") + + val leftExtent = leftExtentEnc.to[Extent] + val leftDims = leftDimsEnc.to[TileDimensions] + val leftCRS = leftCRSEnc.to[CRS] + val rightExtents = rightExtentEnc.map(_.to[Extent]) + val rightCRSs = rightCRSEnc.map(_.to[CRS]) + + val cellType = tiles.map(_.cellType).reduceOption(_ union _).getOrElse(tiles.head.cellType) + + // TODO: how to allow control over... expression? + val projOpts = Reproject.Options.DEFAULT + val dest: Tile = ArrayTile.empty(cellType, leftDims.cols, leftDims.rows) + //is there a GT function to do all this? + tiles.zip(rightExtents).zip(rightCRSs).map { + case ((tile, extent), crs) => + tile.reproject(extent, crs, leftCRS, projOpts) + }.foldLeft(dest)((d, t) => + d.merge(leftExtent, t.extent, t.tile, projOpts.method) + ) + } + } + + // NB: Don't be tempted to make this a `val`. Spark will barf if `withRasterFrames` hasn't been called first. + def reproject_and_merge = udf(reproject_and_merge_f) + .withName("reproject_and_merge") + private[rasterframes] val cellTypes: () ⇒ Seq[String] = () ⇒ Seq( diff --git a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala index a58f851a0..1517e8f0e 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/rasterframes.scala @@ -125,6 +125,8 @@ package object rasterframes extends StandardColumns trait StandardLayerKey[T] extends Serializable { val selfType: TypeTag[T] def isType[R: TypeTag]: Boolean = typeOf[R] =:= selfType.tpe + def coerce[K >: T](tlm: TileLayerMetadata[_]): TileLayerMetadata[K] = + tlm.asInstanceOf[TileLayerMetadata[K]] } object StandardLayerKey { def apply[T: StandardLayerKey]: StandardLayerKey[T] = implicitly diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index 3b30a38ae..4b917b86e 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -55,6 +55,15 @@ class ExtensionMethodSpec extends TestEnvironment with TestData with SubdivideSu } } describe("Miscellaneous extensions") { + import spark.implicits._ + it("should find multiple extent columns") { + val df = Seq((extent, "fred", extent, 34.0)).toDF("e1", "s", "e2", "n") + df.extentColumns.size should be(2) + } + it("should find multiple crs columns") { + val df = Seq((pe.crs, "fred", pe.crs, 34.0)).toDF("c1", "s", "c2", "n") + df.crsColumns.size should be (2) + } it("should split TileLayout") { val tl1 = TileLayout(2, 3, 10, 10) assert(tl1.subdivide(0) === tl1) diff --git a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala index 5059fd6b9..caccd74ca 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/RasterFunctionsSpec.scala @@ -33,7 +33,6 @@ import org.locationtech.rasterframes.model.TileDimensions import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} import org.locationtech.rasterframes.stats._ import org.locationtech.rasterframes.tiles.ProjectedRasterTile -import org.scalatest.{FunSpec, Matchers} class RasterFunctionsSpec extends TestEnvironment with RasterMatchers { import spark.implicits._ diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index d47fafbc1..584a01ef6 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -124,7 +124,9 @@ trait TestData { readSingleband(s"NAIP-VA-b$band.tiff") } - def rgbCogSample = readMultiband("LC08_RGB_Norfolk_COG.tiff") + def rgbCogSample = readMultiband("LC08_RGB_Norfolk_COG.tiff") + + def rgbCogSamplePath = getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI def sampleTileLayerRDD(implicit spark: SparkSession): TileLayerRDD[SpatialKey] = { val rf = sampleGeoTiff.projectedRaster.toLayer(128, 128) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index a080b9691..98e161b18 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -21,17 +21,23 @@ package org.locationtech.rasterframes.datasource.geotiff +import java.net.URI + +import _root_.geotrellis.proj4.CRS import _root_.geotrellis.raster.io.geotiff.compression._ import _root_.geotrellis.raster.io.geotiff.tags.codes.ColorSpace import _root_.geotrellis.raster.io.geotiff.{GeoTiffOptions, MultibandGeoTiff, Tags, Tiled} +import _root_.geotrellis.raster._ import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} import org.apache.spark.sql._ import org.apache.spark.sql.functions._ +import org.apache.spark.sql.rf.TileUDT import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource._ -import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate +import org.locationtech.rasterframes.expressions.aggregates.{ProjectedLayerMetadataAggregate, TileRasterizerAggregate} import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition +import org.locationtech.rasterframes.model.{LazyCRS, TileDimensions} import org.locationtech.rasterframes.util._ /** @@ -41,17 +47,15 @@ import org.locationtech.rasterframes.util._ class GeoTiffDataSource extends DataSourceRegister with RelationProvider with CreatableRelationProvider with DataSourceOptions with LazyLogging { - def shortName() = GeoTiffDataSource.SHORT_NAME + import GeoTiffDataSource._ - def path(parameters: Map[String, String]) = - uriParam(PATH_PARAM, parameters) + def shortName() = GeoTiffDataSource.SHORT_NAME def createRelation(sqlContext: SQLContext, parameters: Map[String, String]) = { - val pathO = path(parameters) - require(pathO.isDefined, "Valid URI 'path' parameter required.") + require(parameters.path.isDefined, "Valid URI 'path' parameter required.") sqlContext.withRasterFrames - val p = pathO.get + val p = parameters.path.get if(p.getPath.contains("*")) { val bandCount = parameters.get(GeoTiffDataSource.BAND_COUNT_PARAM).map(_.toInt).getOrElse(1) @@ -60,61 +64,87 @@ class GeoTiffDataSource extends DataSourceRegister else GeoTiffRelation(sqlContext, p) } - def createLayer(df: DataFrame, parameters: Map[String, String], tileCols: Seq[Column]): RasterFrameLayer = { - require(tileCols.nonEmpty, "need at least one tile column") + override def createRelation(sqlContext: SQLContext, mode: SaveMode, parameters: Map[String, String], df: DataFrame): BaseRelation = { + require(parameters.path.isDefined, "Valid URI 'path' parameter required.") + val path = parameters.path.get + require(path.getScheme == "file" || path.getScheme == null, + "Currently only 'file://' destinations are supported") + sqlContext.withRasterFrames + val tileCols = df.tileColumns -// val prd = ProjectedRasterDefinition() -// val crsCol = col("crs") -// val extentCol = col("extent") -// df.agg(TileRasterizerAggregate(prd, crsCol, extentCol, tileCols.head)) - ??? - } + require(tileCols.nonEmpty, "Could not find any tile columns.") - override def createRelation(sqlContext: SQLContext, mode: SaveMode, parameters: Map[String, String], data: DataFrame): BaseRelation = { - val pathO = path(parameters) - require(pathO.isDefined, "Valid URI 'path' parameter required.") - require(pathO.get.getScheme == "file" || pathO.get.getScheme == null, "Currently only 'file://' destinations are supported") - sqlContext.withRasterFrames + val raster = if(df.isAlreadyLayer) { + val layer = df.certify + val tlm = layer.tileLayerMetadata.merge + + // If no desired image size is given, write at full size. + val TileDimensions(cols, rows) = parameters.rasterDimensions + .getOrElse { + val actualSize = tlm.layout.toRasterExtent().gridBoundsFor(tlm.extent) + TileDimensions(actualSize.width, actualSize.height) + } + + // Should we really play traffic cop here? + if(cols.toDouble * rows * 64.0 > Runtime.getRuntime.totalMemory() * 0.5) + logger.warn(s"You've asked for the construction of a very large image ($cols x $rows), destined for ${path}. Out of memory error likely.") + + layer.toMultibandRaster(tileCols, cols.toInt, rows.toInt) + } + else { + require(parameters.crs.nonEmpty, "A destination CRS must be provided") + require(tileCols.nonEmpty, "need at least one tile column") + + val destCRS = parameters.crs.get + + val crsCols = df.crsColumns + require(crsCols.size == 1, "Exactly one CRS column must be in DataFrame") + val extentCols = df.extentColumns + require(extentCols.size == 1, "Exactly one Extent column must be in DataFrame") + + val tlm = df + .select(ProjectedLayerMetadataAggregate( + destCRS, extentCols.head, crsCols.head, rf_cell_type(tileCols.head), rf_dimensions(tileCols.head) + )) + .first() + + val config = ProjectedRasterDefinition(tlm) - val compress = parameters.get(GeoTiffDataSource.COMPRESS_PARAM).exists(_.toBoolean) - val tcols = data.tileColumns + val aggs = tileCols + .map(t => TileRasterizerAggregate( + config, crsCols.head, extentCols.head, rf_tile(t))("tile").as(t.columnName) + ) - require(tcols.nonEmpty, "Could not find any tile columns.") + val agg = df.select(aggs: _*) + + val row = agg.first() + + val bands = for(i <- 0 until row.size) yield row.getAs[Tile](i) + + ProjectedRaster(MultibandTile(bands), tlm.extent, tlm.crs) + } val tags = Tags( RFBuildInfo.toMap.filter(_._1.startsWith("rf")).mapValues(_.toString), - tcols.map(c ⇒ Map("RF_COL" -> c.columnName)).toList + tileCols.map(c ⇒ Map("RF_COL" -> c.columnName)).toList ) // We make some assumptions here.... eventually have column metadata encode this. - val colorSpace = tcols.size match { + val colorSpace = tileCols.size match { case 3 | 4 ⇒ ColorSpace.RGB case _ ⇒ ColorSpace.BlackIsZero } - val tiffOptions = GeoTiffOptions(Tiled, if (compress) DeflateCompression else NoCompression, colorSpace) - - val layer = if(data.isLayer) data.certify else createLayer(data, parameters, tcols) - - val tlm = layer.tileLayerMetadata.merge - // If no desired image size is given, write at full size. - val cols = numParam(GeoTiffDataSource.IMAGE_WIDTH_PARAM, parameters).getOrElse(tlm.gridBounds.width.toLong) - val rows = numParam(GeoTiffDataSource.IMAGE_HEIGHT_PARAM, parameters).getOrElse(tlm.gridBounds.height.toLong) - - require(cols <= Int.MaxValue && rows <= Int.MaxValue, s"Can't construct a GeoTIFF of size $cols x $rows. (Too big!)") - - // Should we really play traffic cop here? - if(cols.toDouble * rows * 64.0 > Runtime.getRuntime.totalMemory() * 0.5) - logger.warn(s"You've asked for the construction of a very large image ($cols x $rows), destined for ${pathO.get}. Out of memory error likely.") - - val raster = layer.toMultibandRaster(tcols, cols.toInt, rows.toInt) + val tiffOptions = GeoTiffOptions(Tiled, + if (parameters.compress) DeflateCompression else NoCompression, colorSpace + ) val geotiff = new MultibandGeoTiff(raster.tile, raster.extent, raster.crs, tags, tiffOptions) - logger.debug(s"Writing DataFrame to GeoTIFF ($cols x $rows) at ${pathO.get}") - geotiff.write(pathO.get.getPath) - GeoTiffRelation(sqlContext, pathO.get) + logger.debug(s"Writing DataFrame to GeoTIFF (${geotiff.cols} x ${geotiff.rows}) at ${path}") + geotiff.write(path.getPath) + GeoTiffRelation(sqlContext, path) } } @@ -124,5 +154,22 @@ object GeoTiffDataSource { final val IMAGE_WIDTH_PARAM = "imageWidth" final val IMAGE_HEIGHT_PARAM = "imageWidth" final val COMPRESS_PARAM = "compress" + final val CRS_PARAM = "crs" final val BAND_COUNT_PARAM = "bandCount" + + private[geotiff] + implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { + def path: Option[URI] = uriParam(PATH_PARAM, parameters) + def compress: Boolean = parameters.get(COMPRESS_PARAM).exists(_.toBoolean) + def crs: Option[CRS] = parameters.get(CRS_PARAM).map(s => LazyCRS(s)) + def rasterDimensions: Option[TileDimensions] = { + numParam(IMAGE_WIDTH_PARAM, parameters) + .zip(numParam(IMAGE_HEIGHT_PARAM, parameters)) + .map { case (cols, rows) => + require(cols <= Int.MaxValue && rows <= Int.MaxValue, + s"Can't construct a GeoTIFF of size $cols x $rows. (Too big!)") + TileDimensions(cols.toInt, rows.toInt) + }.headOption + } + } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala index 8c7b644d5..75bdc7e76 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/package.scala @@ -24,6 +24,7 @@ import java.net.URI import org.apache.spark.sql.{DataFrameReader, DataFrameWriter} import org.locationtech.rasterframes._ +import _root_.geotrellis.proj4.CRS import shapeless.tag.@@ import shapeless.tag @@ -65,6 +66,11 @@ package object geotiff { writer .option(GeoTiffDataSource.COMPRESS_PARAM, true) ) + def withCRS(crs: CRS): GeoTiffRasterFrameWriter[T] = + tag[GeoTiffRasterFrameWriterTag][DataFrameWriter[T]]( + writer + .option(GeoTiffDataSource.CRS_PARAM, crs.toProj4String) + ) } /** Adds `loadLayer` to appropriately tagged `DataFrameReader` */ diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index aecf2d848..4c160034e 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -22,6 +22,7 @@ package org.locationtech.rasterframes.datasource.geotiff import java.nio.file.Paths +import geotrellis.proj4.LatLng import org.locationtech.rasterframes._ import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.TestEnvironment @@ -88,16 +89,31 @@ class GeoTiffDataSourceSpec assert(write(rf)) } - it("should write GeoTIFF") { + it("should write GeoTIFF from layer") { val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer logger.info(s"Read extent: ${rf.tileLayerMetadata.merge.extent}") - val out = Paths.get("target", "example-geotiff.tiff") + val out = Paths.get("target", "example-geotiff.tif") logger.info(s"Writing to $out") noException shouldBe thrownBy { rf.write.format("geotiff").save(out.toString) } } + + it("should write GeoTIFF without layer") { + import org.locationtech.rasterframes.datasource.raster._ + val pr = col("proj_raster_b0") + val rf = spark.read.raster.withBandIndexes(0, 1, 2).load(rgbCogSamplePath.toASCIIString) + .withColumn("extent", rf_extent(pr)) + .withColumn("crs", rf_crs(pr)) + + val out = Paths.get("target", "example2-geotiff.tif") + logger.info(s"Writing to $out") + noException shouldBe thrownBy { + rf.write.geotiff.withCRS(LatLng).save(out.toString) + } + + } } } From c802d2887c7238c73dbd1d0f1654ef5e04a1b73d Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Tue, 23 Jul 2019 15:33:44 -0400 Subject: [PATCH 245/380] move example code to aggregation Signed-off-by: Courtney Whalen --- .../src/main/python/docs/reference.pymd | 42 +------------------ 1 file changed, 2 insertions(+), 40 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index b4749aeef..620c306f1 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -399,17 +399,7 @@ Performs natural logarithm of cell values plus one. Inverse of @ref:[`rf_expm1`] ## Tile Statistics -The following functions compute a statistical summary per row of a `tile` column. The statistics are computed across the cells of a single `tile`, within each DataFrame Row. Consider the following example. - -```python -import pyspark.sql.functions as F -spark.sql(""" - SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t - UNION - SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t - """).select(F.col('id'), rf_tile_sum(F.col('t'))).show() -``` - +The following functions compute a statistical summary per row of a `tile` column. The statistics are computed across the cells of a single `tile`, within each DataFrame Row. ### rf_tile_sum @@ -489,17 +479,7 @@ spark.sql("SELECT rf_tile_histogram(rf_make_ones_tile(5, 5, 'float32')) as tile_ ## Aggregate Tile Statistics -These functions compute statistical summaries over all of the cell values *and* across all the rows in the DataFrame or group. Example use below computes a single double-valued mean per month, across all data cells in the `red_band` `tile` type column. This would return at most twelve rows. - -Continuing our example from the @ref:[Tile Statistics](reference.md#tile-statistics) section, consider the following. Note that only a single row is returned. It is averaging 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. - -```python -spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t -UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t -""").agg(rf_agg_mean(F.col('t'))).show(10, False) -``` +These functions compute statistical summaries over all of the cell values *and* across all the rows in the DataFrame or group. ### rf_agg_mean @@ -545,24 +525,6 @@ Aggregates over the `tile` return a count of each cell value to create a histogr Local statistics compute the element-wise statistics across a DataFrame or group of `tile`s, resulting in a `tile` that has the same dimension. -Consider again our example for Tile Statistics and Aggregate Tile Statistics, this time apply @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean). We see that it is computing the element-wise mean across the two rows. In this case it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. - - -```python -import pyspark.sql.functions as F -alm = spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t -UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t -""").agg(rf_agg_local_mean(F.col('t')).alias('l')) \ - -## local_agg_mean returns a tile -alm.select(rf_dimensions(alm.l)).show() - -alm.select(rf_explode_tiles(alm.l)).show(10, False) -``` - - ### rf_agg_local_max Tile rf_agg_local_max(Tile tile) From 8ddc1323fabbc3ddb68d39a95127674c2c21e93a Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Tue, 23 Jul 2019 17:11:44 -0400 Subject: [PATCH 246/380] aggregation functions Signed-off-by: Courtney Whalen --- .../src/main/python/docs/aggregation.pymd | 49 ++++++++++++++++++- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index 21dd89998..8fa04e35c 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -10,13 +10,58 @@ import os spark = create_rf_spark_session() ``` -## Cell Counts & Tile Mean +There are 2 types of aggregate functions: aggregate tile and aggregate tile local. In the aggregate tile functions, we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the aggregate tile local functions, we are computing the element-wise statistics across a DataFrame or group of tiles. + +## Tile Mean + +We can illustrate this difference in computing tile mean. In the first code block we are using @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to average 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned. + +```python +import pyspark.sql.functions as F + +spark.sql(""" +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t +UNION +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t +""").agg(rf_agg_mean(F.col('t'))).show(10, False) +``` + + +In this code block, we are using @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) instead of @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to compute the element-wise mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. + +```python +import pyspark.sql.functions as F + +alm = spark.sql(""" +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t +UNION +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t +""").agg(rf_agg_local_mean(F.col('t')).alias('l')) \ + +## local_agg_mean returns a tile +alm.select(rf_dimensions(alm.l)).show() + +alm.select(rf_explode_tiles(alm.l)).show(10, False) +``` + +## Cell Counts + +We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 387,000 data cells and 1,000 NoData cells in this DataFrame. ```python rf = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B8-Robinson-IL.tiff')) rf.show(5, False) -stats = rf.agg(rf_agg_no_data_cells('tile'), rf_agg_data_cells('tile'), rf_agg_mean('tile')) +stats = rf.agg(rf_agg_data_cells('tile'), rf_agg_no_data_cells('tile')) stats.show(5, False) ``` +## Statistical Summaries + +The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. + +```python +rf = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B8-Robinson-IL.tiff')) +stats = rf.agg(rf_agg_stats('tile').alias("stats")) +stats.select("stats.data_cells", "stats.no_data_cells", "stats.min", "stats.max", "stats.mean", "stats.variance").show() +``` From 5629390b4568d1e2f9ad74358ff4ebaba87ef8dc Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Wed, 24 Jul 2019 12:02:26 -0400 Subject: [PATCH 247/380] add tile aggregates Signed-off-by: Courtney Whalen --- .../src/main/python/docs/aggregation.pymd | 40 +++++++++++-------- 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index 8fa04e35c..e10c5c505 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -10,11 +10,23 @@ import os spark = create_rf_spark_session() ``` -There are 2 types of aggregate functions: aggregate tile and aggregate tile local. In the aggregate tile functions, we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the aggregate tile local functions, we are computing the element-wise statistics across a DataFrame or group of tiles. +There are 3 types of aggregate functions: tile aggregate, DataFrame aggregate, and element-wise local aggregate. In the tile aggregate functions, we are computing a statistical summary per row of a `tile` column in a DataFrame. In the DataFrame aggregate functions, we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the element-wise local aggregate functions, we are computing the element-wise statistical summary across a DataFrame or group of tiles. ## Tile Mean -We can illustrate this difference in computing tile mean. In the first code block we are using @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to average 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned. +We can illustrate this difference in computing tile mean. In the first code block we are using @ref:[`rf_tile_mean`](reference.md#rf-tile-mean) to computer the tile aggregate mean of cells in each row of column `tile`. The mean of each tile is computed separately, so the first mean is 1.0 and the second mean is 3.0. + +```python +import pyspark.sql.functions as F + +spark.sql(""" +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t +UNION +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t +""").select(F.col('id'), rf_tile_mean(F.col('t'))).show(10, False) +``` + +In this next code block we are using @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to compute the DataFrame aggregate, which averages 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned since the average is computed over the full DataFrame. ```python import pyspark.sql.functions as F @@ -27,7 +39,7 @@ SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t ``` -In this code block, we are using @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) instead of @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to compute the element-wise mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. +In this code block, we are using @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. ```python import pyspark.sql.functions as F @@ -36,32 +48,26 @@ alm = spark.sql(""" SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t UNION SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t -""").agg(rf_agg_local_mean(F.col('t')).alias('l')) \ - -## local_agg_mean returns a tile -alm.select(rf_dimensions(alm.l)).show() - +""").agg(rf_agg_local_mean(F.col('t')).alias('l')) alm.select(rf_explode_tiles(alm.l)).show(10, False) ``` ## Cell Counts -We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 387,000 data cells and 1,000 NoData cells in this DataFrame. +We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 3,348,900 data cells and 0 NoData cells in this DataFrame. ```python -rf = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B8-Robinson-IL.tiff')) -rf.show(5, False) - -stats = rf.agg(rf_agg_data_cells('tile'), rf_agg_no_data_cells('tile')) +rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') +stats = rf.select(rf_tile("proj_raster").alias("tile")).agg(rf_agg_data_cells('tile'), rf_agg_no_data_cells('tile')) stats.show(5, False) ``` ## Statistical Summaries -The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. +The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. You can use the @ref:[`rf_tile_stats`](reference.md#rf-tile-stats) to compute summary statistics separately for each row in a `tile` column and you can use the @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) to compute the local element-wise summary statistics. ```python -rf = spark.read.geotiff(os.path.join(resource_dir(), 'L8-B8-Robinson-IL.tiff')) -stats = rf.agg(rf_agg_stats('tile').alias("stats")) -stats.select("stats.data_cells", "stats.no_data_cells", "stats.min", "stats.max", "stats.mean", "stats.variance").show() +rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') +stats = rf.select(rf_tile("proj_raster").alias("tile")).agg(rf_agg_stats('tile').alias("stats")) +stats.select("stats.min", "stats.max", "stats.mean", "stats.variance").show(1, False) ``` From dff53a9b14f7f954867fdfb3106d81dec4cb820d Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Wed, 24 Jul 2019 12:16:59 -0400 Subject: [PATCH 248/380] add links Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/aggregation.pymd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index e10c5c505..862797c20 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -10,7 +10,7 @@ import os spark = create_rf_spark_session() ``` -There are 3 types of aggregate functions: tile aggregate, DataFrame aggregate, and element-wise local aggregate. In the tile aggregate functions, we are computing a statistical summary per row of a `tile` column in a DataFrame. In the DataFrame aggregate functions, we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the element-wise local aggregate functions, we are computing the element-wise statistical summary across a DataFrame or group of tiles. +There are 3 types of aggregate functions: tile aggregate, DataFrame aggregate, and element-wise local aggregate. In the @ref:[`tile aggregate functions`](reference.md#tile-statistics), we are computing a statistical summary per row of a `tile` column in a DataFrame. In the @ref:[`DataFrame aggregate functions`](reference.md#aggregate-tile-statistics), we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the @ref:[`element-wise local aggregate functions`](reference.md#tile-local-aggregate-statistics), we are computing the element-wise statistical summary across a DataFrame or group of tiles. ## Tile Mean @@ -69,5 +69,6 @@ The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over al ```python rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') stats = rf.select(rf_tile("proj_raster").alias("tile")).agg(rf_agg_stats('tile').alias("stats")) +stats.printSchema() stats.select("stats.min", "stats.max", "stats.mean", "stats.variance").show(1, False) ``` From fc270e15bc801f440d90c9134c93d82fbd0fe18c Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Thu, 25 Jul 2019 13:41:03 -0400 Subject: [PATCH 249/380] jason's edits Signed-off-by: Courtney Whalen --- .../src/main/python/docs/aggregation.pymd | 76 +++++++++++-------- 1 file changed, 44 insertions(+), 32 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index 862797c20..7233fc83e 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -10,65 +10,77 @@ import os spark = create_rf_spark_session() ``` -There are 3 types of aggregate functions: tile aggregate, DataFrame aggregate, and element-wise local aggregate. In the @ref:[`tile aggregate functions`](reference.md#tile-statistics), we are computing a statistical summary per row of a `tile` column in a DataFrame. In the @ref:[`DataFrame aggregate functions`](reference.md#aggregate-tile-statistics), we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the @ref:[`element-wise local aggregate functions`](reference.md#tile-local-aggregate-statistics), we are computing the element-wise statistical summary across a DataFrame or group of tiles. +There are 3 types of aggregate functions: tile aggregate, DataFrame aggregate, and element-wise local aggregate. In the @ref:[tile aggregate functions](reference.md#tile-statistics), we are computing a statistical summary per row of a `tile` column in a DataFrame. In the @ref:[DataFrame aggregate functions](reference.md#aggregate-tile-statistics), we are computing statistical summaries over all of the cell values *and* across all of the rows in the DataFrame or group. In the @ref:[element-wise local aggregate functions](reference.md#tile-local-aggregate-statistics), we are computing the element-wise statistical summary across a DataFrame or group of tiles. -## Tile Mean +## Tile Mean Example -We can illustrate this difference in computing tile mean. In the first code block we are using @ref:[`rf_tile_mean`](reference.md#rf-tile-mean) to computer the tile aggregate mean of cells in each row of column `tile`. The mean of each tile is computed separately, so the first mean is 1.0 and the second mean is 3.0. +We can illustrate these differences in computing an aggregate mean. First, we create a sample DataFrame of 2 tiles where the first tile is composed of 25 values of 1.0 and the second tile is composed of 25 values of 3.0. In this first code block we are using the @ref:[`rf_tile_mean`](reference.md#rf-tile-mean) function to compute the tile aggregate mean of cells in each row of column `tile`. The mean of each tile is computed separately, so the first mean is 1.0 and the second mean is 3.0. Notice that the number of rows in the DataFrame is the same before and after the aggregation. ```python import pyspark.sql.functions as F -spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t +rf = spark.sql(""" +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as tile UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t -""").select(F.col('id'), rf_tile_mean(F.col('t'))).show(10, False) +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as tile +""") + +rf.show(10, False) + +rf.select(F.col('id'), rf_tile_mean(F.col('tile'))).show(10, False) ``` -In this next code block we are using @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to compute the DataFrame aggregate, which averages 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned since the average is computed over the full DataFrame. +In the next code block we are using @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to compute the DataFrame aggregate, which averages 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned since the average is computed over the full DataFrame. ```python -import pyspark.sql.functions as F - -spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t -UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as t -""").agg(rf_agg_mean(F.col('t'))).show(10, False) +rf.agg(rf_agg_mean(F.col('tile'))).show(10, False) ``` - -In this code block, we are using @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. +In the third code block we are using @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. ```python -import pyspark.sql.functions as F - -alm = spark.sql(""" -SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as t -UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as t -""").agg(rf_agg_local_mean(F.col('t')).alias('l')) -alm.select(rf_explode_tiles(alm.l)).show(10, False) +rf.agg(rf_agg_local_mean(F.col('tile'))).show(10, False) ``` -## Cell Counts +## Cell Counts Example -We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 3,348,900 data cells and 0 NoData cells in this DataFrame. +We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 313 data cells and 5,788,522 NoData cells in this DataFrame. See section on @ref:["NoData" handling](nodata-handling.md) for additional discussion on handling missing data. ```python -rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') -stats = rf.select(rf_tile("proj_raster").alias("tile")).agg(rf_agg_data_cells('tile'), rf_agg_no_data_cells('tile')) +rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/MCD43A4.006/06/11/2007247/MCD43A4.A2007247.h06v11.006.2016118065909_B02.TIF') +stats = rf.agg(rf_agg_data_cells('proj_raster'), rf_agg_no_data_cells('proj_raster')) + stats.show(5, False) ``` ## Statistical Summaries -The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance. You can use the @ref:[`rf_tile_stats`](reference.md#rf-tile-stats) to compute summary statistics separately for each row in a `tile` column and you can use the @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) to compute the local element-wise summary statistics. +The statistical summary functions return a summary of cell values: number of data cells, number of NoData cells, minimum, maximum, mean, and variance, which can be computed as a tile aggregate, a DataFrame aggregate, or an element-wise local aggregate. + +The @ref:[`rf_tile_stats`](reference.md#rf-tile-stats) function computes summary statistics separately for each row in a `tile` column as shown below. ```python rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B02.tif') -stats = rf.select(rf_tile("proj_raster").alias("tile")).agg(rf_agg_stats('tile').alias("stats")) +stats = rf.select(rf_tile_stats('proj_raster').alias('stats')) + stats.printSchema() -stats.select("stats.min", "stats.max", "stats.mean", "stats.variance").show(1, False) +stats.select("stats.min", "stats.max", "stats.mean", "stats.variance").show(10, False) +``` + +The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of all cell values as shown below. + +```python +rf.agg(rf_agg_stats('proj_raster').alias('stats')).select("stats.min", "stats.max", "stats.mean", "stats.variance").show(10, False) +``` + +The @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) function computes the element-wise local aggregate statistical summary as shown below. + +```python +rf.agg(rf_agg_local_stats('proj_raster').alias('stats')).select("stats.min", "stats.max", "stats.mean", "stats.variance").show(10, False) +``` + +## Histogram + +```python +rf.agg(rf_tile_histogram('proj_raster').alias('tile_histogram')).select("tile_histogram.bins").collect() ``` From 435af71644ca22914bc8f5ea2481033d9b62d6ab Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Thu, 25 Jul 2019 16:36:37 -0400 Subject: [PATCH 250/380] add histogram & pretty printing Signed-off-by: Courtney Whalen --- .../src/main/python/docs/aggregation.pymd | 61 +++++++++++++++---- 1 file changed, 49 insertions(+), 12 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index 7233fc83e..f70f52198 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -14,7 +14,7 @@ There are 3 types of aggregate functions: tile aggregate, DataFrame aggregate, a ## Tile Mean Example -We can illustrate these differences in computing an aggregate mean. First, we create a sample DataFrame of 2 tiles where the first tile is composed of 25 values of 1.0 and the second tile is composed of 25 values of 3.0. In this first code block we are using the @ref:[`rf_tile_mean`](reference.md#rf-tile-mean) function to compute the tile aggregate mean of cells in each row of column `tile`. The mean of each tile is computed separately, so the first mean is 1.0 and the second mean is 3.0. Notice that the number of rows in the DataFrame is the same before and after the aggregation. +We can illustrate these differences in computing an aggregate mean. First, we create a sample DataFrame of 2 tiles where the first tile is composed of 25 values of 1.0 and the second tile is composed of 25 values of 3.0. ```python import pyspark.sql.functions as F @@ -22,32 +22,36 @@ import pyspark.sql.functions as F rf = spark.sql(""" SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as tile UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3.0) as tile +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as tile """) -rf.show(10, False) +rf.select("id", rf_render_matrix("tile")).show(10, False) +``` + +In this code block we are using the @ref:[`rf_tile_mean`](reference.md#rf-tile-mean) function to compute the tile aggregate mean of cells in each row of column `tile`. The mean of each tile is computed separately, so the first mean is 1.0 and the second mean is 3.0. Notice that the number of rows in the DataFrame is the same before and after the aggregation. +```python rf.select(F.col('id'), rf_tile_mean(F.col('tile'))).show(10, False) ``` -In the next code block we are using @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) to compute the DataFrame aggregate, which averages 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned since the average is computed over the full DataFrame. +In this code block we are using the @ref:[`rf_agg_mean`](reference.md#rf-agg-mean) function to compute the DataFrame aggregate, which averages 25 values of 1.0 and 25 values of 3.0, across the fifty cells in two rows. Note that only a single row is returned since the average is computed over the full DataFrame. ```python rf.agg(rf_agg_mean(F.col('tile'))).show(10, False) ``` -In the third code block we are using @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. +In this code block we are using the @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) function to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. To compute an element-wise local aggregate, tiles need have the same dimensions as in the example below where both tiles have 5 rows and 5 columns. If we tried to compute a local aggregate over the DataFrame without equal tile dimensions, we would get a runtime error. ```python -rf.agg(rf_agg_local_mean(F.col('tile'))).show(10, False) +rf.agg(rf_agg_local_mean(F.col('tile')).alias("local_mean")).select(rf_render_matrix("local_mean")).show(10, False) ``` ## Cell Counts Example -We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 313 data cells and 5,788,522 NoData cells in this DataFrame. See section on @ref:["NoData" handling](nodata-handling.md) for additional discussion on handling missing data. +We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 3,842,290 data cells and 19,417,342 NoData cells in this DataFrame. See section on @ref:["NoData" handling](nodata-handling.md) for additional discussion on handling missing data. ```python -rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/MCD43A4.006/06/11/2007247/MCD43A4.A2007247.h06v11.006.2016118065909_B02.TIF') +rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/MCD43A4.006/11/05/2018233/MCD43A4.A2018233.h11v05.006.2018242035530_B02.TIF') stats = rf.agg(rf_agg_data_cells('proj_raster'), rf_agg_no_data_cells('proj_raster')) stats.show(5, False) @@ -64,23 +68,56 @@ rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B0 stats = rf.select(rf_tile_stats('proj_raster').alias('stats')) stats.printSchema() -stats.select("stats.min", "stats.max", "stats.mean", "stats.variance").show(10, False) +stats.select('stats.min', 'stats.max', 'stats.mean', 'stats.variance').show(10, False) ``` The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of all cell values as shown below. ```python -rf.agg(rf_agg_stats('proj_raster').alias('stats')).select("stats.min", "stats.max", "stats.mean", "stats.variance").show(10, False) +rf.agg(rf_agg_stats('proj_raster').alias('stats')).select('stats.min', 'stats.max', 'stats.mean', 'stats.variance').show(10, False) ``` The @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) function computes the element-wise local aggregate statistical summary as shown below. ```python -rf.agg(rf_agg_local_stats('proj_raster').alias('stats')).select("stats.min", "stats.max", "stats.mean", "stats.variance").show(10, False) +rf = spark.sql(""" +SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as tile +UNION +SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as tile +UNION +SELECT 3 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 5) as tile +""").agg(rf_agg_local_stats('tile').alias('stats')) + +rf.select(rf_render_matrix('stats.min'), rf_render_matrix('stats.max'), rf_render_matrix('stats.mean'), rf_render_matrix('stats.variance')).show(10, False) ``` ## Histogram +The @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function computes a count of cell values within each row of tile and outputs a `bins` array with the below schema. In the graph below, we have plotted values on the x-axis and counts on the y-axis to create the histogram. There are 100 rows of `tile` in this DataFrame, but this histogram was just computed for the `tile` in the first row. + ```python -rf.agg(rf_tile_histogram('proj_raster').alias('tile_histogram')).select("tile_histogram.bins").collect() +import matplotlib.pyplot as plt + +rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/MCD43A4.006/11/05/2018233/MCD43A4.A2018233.h11v05.006.2018242035530_B02.TIF') + +hist_df = rf.select(rf_tile_histogram('proj_raster').alias('tile_histogram')).select('tile_histogram.bins') +hist_df.printSchema() + +bins_list = hist_df.collect() +values = [int(row['value']) for row in bins_list[0].bins] +counts = [int(row['count']) for row in bins_list[0].bins] + +plt.bar(values, counts) +plt.show() +``` + +The @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) function computes a count of cell values across all of the rows of `tile` in a DataFrame or group. The histogram is shown below. The range of the y-axis is significantly wider than the range of the y-axis on the previous histogram since this computation is across all cell values in the DataFrame. + +```python +bins_list = rf.agg(rf_agg_approx_histogram('proj_raster').alias('tile_histogram')).select('tile_histogram.bins').collect() +values = [int(row['value']) for row in bins_list[0].bins] +counts = [int(row['count']) for row in bins_list[0].bins] + +plt.bar(values, counts, width=10) +plt.show() ``` From 0a87705aa436b11b65faf0e6d214eea5d5fa119a Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Thu, 25 Jul 2019 16:39:21 -0400 Subject: [PATCH 251/380] fix wording of rf_agg_approx_histogram description Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/reference.pymd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index 620c306f1..e04ee2387 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -518,7 +518,7 @@ Aggregates over the `tile` and returns statistical summaries of cell values: num Struct[Array[Struct[Double, Long]]] rf_agg_approx_histogram(Tile tile) -Aggregates over the `tile` return a count of each cell value to create a histogram with values are plotted on the x-axis and counts on the y-axis. Related is the @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function which operates on a single row at a time. +Aggregates over all of the rows in DataFrame of `tile` and returns a count of each cell value to create a histogram with values are plotted on the x-axis and counts on the y-axis. Related is the @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function which operates on a single row at a time. ## Tile Local Aggregate Statistics From 413962d2ac0b13de7551d3e09a4d9965ade25a0e Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Thu, 25 Jul 2019 16:56:03 -0400 Subject: [PATCH 252/380] fix wording Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/aggregation.pymd | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index f70f52198..ffa26de91 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -40,7 +40,9 @@ In this code block we are using the @ref:[`rf_agg_mean`](reference.md#rf-agg-mea rf.agg(rf_agg_mean(F.col('tile'))).show(10, False) ``` -In this code block we are using the @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) function to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. To compute an element-wise local aggregate, tiles need have the same dimensions as in the example below where both tiles have 5 rows and 5 columns. If we tried to compute a local aggregate over the DataFrame without equal tile dimensions, we would get a runtime error. +In this code block we are using the @ref:[`rf_agg_local_mean`](reference.md#rf-agg-local-mean) function to compute the element-wise local aggregate mean across the two rows. In this example it is computing the mean of one value of 1.0 and one value of 3.0 to arrive at the element-wise mean, but doing so twenty-five times, one for each position in the `tile`. + +To compute an element-wise local aggregate, tiles need have the same dimensions as in the example below where both tiles have 5 rows and 5 columns. If we tried to compute an element-wise local aggregate over the DataFrame without equal tile dimensions, we would get a runtime error. ```python rf.agg(rf_agg_local_mean(F.col('tile')).alias("local_mean")).select(rf_render_matrix("local_mean")).show(10, False) @@ -48,7 +50,7 @@ rf.agg(rf_agg_local_mean(F.col('tile')).alias("local_mean")).select(rf_render_ma ## Cell Counts Example -We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 3,842,290 data cells and 19,417,342 NoData cells in this DataFrame. See section on @ref:["NoData" handling](nodata-handling.md) for additional discussion on handling missing data. +We can also count the total number of data and NoData cells over all the tiles in a DataFrame using @ref:[`rf_agg_data_cells`](reference.md#rf-agg-data-cells) and @ref:[`rf_agg_no_data_cells`](reference.md#rf-agg-no-data-cells). There are 3,842,290 data cells and 1,941,734 NoData cells in this DataFrame. See section on @ref:["NoData" handling](nodata-handling.md) for additional discussion on handling missing data. ```python rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/MCD43A4.006/11/05/2018233/MCD43A4.A2018233.h11v05.006.2018242035530_B02.TIF') @@ -77,7 +79,7 @@ The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over al rf.agg(rf_agg_stats('proj_raster').alias('stats')).select('stats.min', 'stats.max', 'stats.mean', 'stats.variance').show(10, False) ``` -The @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) function computes the element-wise local aggregate statistical summary as shown below. +The @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) function computes the element-wise local aggregate statistical summary as shown below. The DataFrame used in the previous two code blocks, has unequal tile dimensions, so a different DataFrame is used in this code block to avoid a runtime error. ```python rf = spark.sql(""" @@ -93,7 +95,7 @@ rf.select(rf_render_matrix('stats.min'), rf_render_matrix('stats.max'), rf_rende ## Histogram -The @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function computes a count of cell values within each row of tile and outputs a `bins` array with the below schema. In the graph below, we have plotted values on the x-axis and counts on the y-axis to create the histogram. There are 100 rows of `tile` in this DataFrame, but this histogram was just computed for the `tile` in the first row. +The @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function computes a count of cell values within each row of tile and outputs a `bins` array with the schema below. In the graph below, we have plotted `value` on the x-axis and `count` on the y-axis to create the histogram. There are 100 rows of `tile` in this DataFrame, but this histogram was just computed for the `tile` in the first row. ```python import matplotlib.pyplot as plt @@ -111,7 +113,7 @@ plt.bar(values, counts) plt.show() ``` -The @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) function computes a count of cell values across all of the rows of `tile` in a DataFrame or group. The histogram is shown below. The range of the y-axis is significantly wider than the range of the y-axis on the previous histogram since this computation is across all cell values in the DataFrame. +The @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) function computes a count of cell values across all of the rows of `tile` in a DataFrame or group. In the example below, the range of the y-axis is significantly wider than the range of the y-axis on the previous histogram since this histogram was computed for all cell values in the DataFrame. ```python bins_list = rf.agg(rf_agg_approx_histogram('proj_raster').alias('tile_histogram')).select('tile_histogram.bins').collect() From dd69c159f26dbd8eee91bf175fd888b60fb9d456 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 26 Jul 2019 09:19:59 -0400 Subject: [PATCH 253/380] Some minor style tweaks to aggregation docs Signed-off-by: Jason T. Brown --- .../src/main/python/docs/aggregation.pymd | 32 ++++++++++++------- 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/aggregation.pymd b/pyrasterframes/src/main/python/docs/aggregation.pymd index ffa26de91..13143d280 100644 --- a/pyrasterframes/src/main/python/docs/aggregation.pymd +++ b/pyrasterframes/src/main/python/docs/aggregation.pymd @@ -76,7 +76,9 @@ stats.select('stats.min', 'stats.max', 'stats.mean', 'stats.variance').show(10, The @ref:[`rf_agg_stats`](reference.md#rf-agg-stats) function aggregates over all of the tiles in a DataFrame and returns a statistical summary of all cell values as shown below. ```python -rf.agg(rf_agg_stats('proj_raster').alias('stats')).select('stats.min', 'stats.max', 'stats.mean', 'stats.variance').show(10, False) +rf.agg(rf_agg_stats('proj_raster').alias('stats')) \ + .select('stats.min', 'stats.max', 'stats.mean', 'stats.variance') \ + .show(10, False) ``` The @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) function computes the element-wise local aggregate statistical summary as shown below. The DataFrame used in the previous two code blocks, has unequal tile dimensions, so a different DataFrame is used in this code block to avoid a runtime error. @@ -85,41 +87,47 @@ The @ref:[`rf_agg_local_stats`](reference.md#rf-agg-local-stats) function comput rf = spark.sql(""" SELECT 1 as id, rf_make_ones_tile(5, 5, 'float32') as tile UNION -SELECT 2 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 3) as tile +SELECT 2 as id, rf_make_constant_tile(3, 5, 5, 'float32') as tile UNION -SELECT 3 as id, rf_local_multiply(rf_make_ones_tile(5, 5, 'float32'), 5) as tile +SELECT 3 as id, rf_make_constant_tile(5, 5, 5, 'float32') as tile """).agg(rf_agg_local_stats('tile').alias('stats')) -rf.select(rf_render_matrix('stats.min'), rf_render_matrix('stats.max'), rf_render_matrix('stats.mean'), rf_render_matrix('stats.variance')).show(10, False) +agg_local_stats = rf.select('stats.min', 'stats.max', 'stats.mean', 'stats.variance').collect() + +for r in agg_local_stats: + for stat in r.asDict(): + print(stat, ':\n', r[stat], '\n') ``` ## Histogram -The @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function computes a count of cell values within each row of tile and outputs a `bins` array with the schema below. In the graph below, we have plotted `value` on the x-axis and `count` on the y-axis to create the histogram. There are 100 rows of `tile` in this DataFrame, but this histogram was just computed for the `tile` in the first row. +The @ref:[`rf_tile_histogram`](reference.md#rf-tile-histogram) function computes a count of cell values within each row of tile and outputs a `bins` array with the schema below. In the graph below, we have plotted `value` on the x-axis and `count` on the y-axis to create the histogram. There are 100 rows of `tile` in this DataFrame, but this histogram is just computed for the `tile` in the first row. ```python import matplotlib.pyplot as plt rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/MCD43A4.006/11/05/2018233/MCD43A4.A2018233.h11v05.006.2018242035530_B02.TIF') -hist_df = rf.select(rf_tile_histogram('proj_raster').alias('tile_histogram')).select('tile_histogram.bins') +hist_df = rf.select(rf_tile_histogram('proj_raster')['bins'].alias('bins')) hist_df.printSchema() -bins_list = hist_df.collect() -values = [int(row['value']) for row in bins_list[0].bins] -counts = [int(row['count']) for row in bins_list[0].bins] +bins_row = hist_df.first() +values = [int(row['value']) for row in bins_row.bins] +counts = [int(row['count']) for row in bins_row.bins] -plt.bar(values, counts) +plt.hist(values, weights=counts, bins=100) plt.show() ``` The @ref:[`rf_agg_approx_histogram`](reference.md#rf-agg-approx-histogram) function computes a count of cell values across all of the rows of `tile` in a DataFrame or group. In the example below, the range of the y-axis is significantly wider than the range of the y-axis on the previous histogram since this histogram was computed for all cell values in the DataFrame. ```python -bins_list = rf.agg(rf_agg_approx_histogram('proj_raster').alias('tile_histogram')).select('tile_histogram.bins').collect() +bins_list = rf.agg( + rf_agg_approx_histogram('proj_raster')['bins'].alias('bins') + ).collect() values = [int(row['value']) for row in bins_list[0].bins] counts = [int(row['count']) for row in bins_list[0].bins] -plt.bar(values, counts, width=10) +plt.hist(values, weights=counts, bins=100) plt.show() ``` From b333438f5547fc5116fa5970868b7b4994e06968 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 26 Jul 2019 10:59:57 -0400 Subject: [PATCH 254/380] Remove stray paren from Tile PNG header Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py b/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py index 771b8b19e..141e4aad4 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_ipython.py @@ -43,7 +43,7 @@ def tile_to_png(tile): axis.xaxis.set_ticks([]) axis.yaxis.set_ticks([]) - axis.set_title('{}, {})'.format(tile.dimensions(), tile.cell_type.__repr__())) # compact metadata as title + axis.set_title('{}, {}'.format(tile.dimensions(), tile.cell_type.__repr__())) # compact metadata as title with io.BytesIO() as output: canvas.print_png(output) From 935312a70086e10296c1d4e3038f89c892f09c7a Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Jul 2019 11:01:35 -0400 Subject: [PATCH 255/380] GeoTiff writing example. --- .../extensions/DataFrameMethods.scala | 7 +++ .../geotiff/GeoTiffDataSource.scala | 29 +++++++---- .../geotiff/GeoTiffDataSourceSpec.scala | 48 +++++++++++++++++-- .../src/main/python/docs/__init__.py | 26 +++++++++- .../src/main/python/docs/raster-write.pymd | 48 +++++++++++++++---- .../main/python/pyrasterframes/__init__.py | 38 +++++++++++++-- pyrasterframes/src/main/python/setup.py | 1 + .../main/python/tests/GeoTiffWriterTests.py | 14 +++++- 8 files changed, 180 insertions(+), 31 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 0e224a1de..3735eef37 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -36,6 +36,7 @@ import org.locationtech.rasterframes.StandardColumns._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.StandardEncoders._ import org.locationtech.rasterframes.expressions.DynamicExtractors +import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.locationtech.rasterframes.util._ import spray.json.JsonFormat @@ -96,6 +97,12 @@ trait DataFrameMethods[DF <: DataFrame] extends MethodExtensions[DF] with Metada .filter(f => DynamicExtractors.tileExtractor.isDefinedAt(f.dataType)) .map(f ⇒ self.col(f.name)) + /** Get the columns that look like `ProjectedRasterTile`s. */ + def projRasterColumns: Seq[Column] = + self.schema.fields + .filter(_.dataType.conformsTo[ProjectedRasterTile]) + .map(f => self.col(f.name)) + /** Get the columns that look like `Extent`s. */ def extentColumns: Seq[Column] = self.schema.fields diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 98e161b18..1b639a1f5 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -98,22 +98,35 @@ class GeoTiffDataSource extends DataSourceRegister val destCRS = parameters.crs.get - val crsCols = df.crsColumns - require(crsCols.size == 1, "Exactly one CRS column must be in DataFrame") - val extentCols = df.extentColumns - require(extentCols.size == 1, "Exactly one Extent column must be in DataFrame") + val (extCol, crsCol) = { + val prCols = df.projRasterColumns + if(prCols.nonEmpty) { + (rf_extent(prCols.head), rf_crs(prCols.head)) + } + else { + val crsCols = df.crsColumns + require(crsCols.size == 1, "Exactly one CRS column must be in DataFrame") + val extentCols = df.extentColumns + require(extentCols.size == 1, "Exactly one Extent column must be in DataFrame") + (extentCols.head, crsCols.head) + } + } val tlm = df .select(ProjectedLayerMetadataAggregate( - destCRS, extentCols.head, crsCols.head, rf_cell_type(tileCols.head), rf_dimensions(tileCols.head) + destCRS, extCol, crsCol, rf_cell_type(tileCols.head), rf_dimensions(tileCols.head) )) .first() - val config = ProjectedRasterDefinition(tlm) + val c = ProjectedRasterDefinition(tlm) + + val config = parameters.rasterDimensions.map { dims => + c.copy(cols = dims.cols, rows = dims.rows) + }.getOrElse(c) val aggs = tileCols .map(t => TileRasterizerAggregate( - config, crsCols.head, extentCols.head, rf_tile(t))("tile").as(t.columnName) + config, crsCol, extCol, rf_tile(t))("tile").as(t.columnName) ) val agg = df.select(aggs: _*) @@ -152,7 +165,7 @@ object GeoTiffDataSource { final val SHORT_NAME = "geotiff" final val PATH_PARAM = "path" final val IMAGE_WIDTH_PARAM = "imageWidth" - final val IMAGE_HEIGHT_PARAM = "imageWidth" + final val IMAGE_HEIGHT_PARAM = "imageHeight" final val COMPRESS_PARAM = "compress" final val CRS_PARAM = "crs" final val BAND_COUNT_PARAM = "bandCount" diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 4c160034e..866fa4966 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -22,7 +22,7 @@ package org.locationtech.rasterframes.datasource.geotiff import java.nio.file.Paths -import geotrellis.proj4.LatLng +import geotrellis.proj4._ import org.locationtech.rasterframes._ import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.TestEnvironment @@ -105,14 +105,52 @@ class GeoTiffDataSourceSpec import org.locationtech.rasterframes.datasource.raster._ val pr = col("proj_raster_b0") val rf = spark.read.raster.withBandIndexes(0, 1, 2).load(rgbCogSamplePath.toASCIIString) - .withColumn("extent", rf_extent(pr)) - .withColumn("crs", rf_crs(pr)) val out = Paths.get("target", "example2-geotiff.tif") logger.info(s"Writing to $out") - noException shouldBe thrownBy { - rf.write.geotiff.withCRS(LatLng).save(out.toString) + + withClue("explicit extent/crs") { + noException shouldBe thrownBy { + rf + .withColumn("extent", rf_extent(pr)) + .withColumn("crs", rf_crs(pr)) + .write.geotiff.withCRS(LatLng).save(out.toString) + } + } + + withClue("without explicit extent/crs") { + noException shouldBe thrownBy { + rf + .write.geotiff.withCRS(LatLng).save(out.toString) + } + } + withClue("with downsampling") { + noException shouldBe thrownBy { + rf + .write.geotiff + .withCRS(LatLng) + .withDimensions(128, 128) + .save(out.toString) + } } + } + + def s(band: Int): String = + s"https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/" + + s"MCD43A4.A2019059.h11v08.006.2019072203257_B0${band}.TIF" + + it("shoud write multiband") { + import org.locationtech.rasterframes.datasource.raster._ + + val cat = s""" +red,green,blue +${s(1)},${s(4)},${s(3)} +""" + val scene = spark.read.raster.fromCSV(cat, "red", "green", "blue").load() + scene.write.geotiff + .withCRS(LatLng) + .withDimensions(256, 256) + .save("geotiff-overview.tif") } } diff --git a/pyrasterframes/src/main/python/docs/__init__.py b/pyrasterframes/src/main/python/docs/__init__.py index a1949f49c..d1a64afb9 100644 --- a/pyrasterframes/src/main/python/docs/__init__.py +++ b/pyrasterframes/src/main/python/docs/__init__.py @@ -1,11 +1,35 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + import os +def docs_dir(): + return os.path.dirname(os.path.realpath(__file__)) + + # This is temporary until we port to run on web assets. def resource_dir(): # we may consider using gitpython which I think would be appropriate in the context of building docs # see https://stackoverflow.com/a/41920796/2787937 - here = os.path.dirname(os.path.realpath(__file__)) + here = docs_dir() test_resource = os.path.realpath(os.path.join(here, '..', '..', '..', 'src', 'test', 'resources')) return test_resource diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index 0097cb1b3..458be4c29 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -18,8 +18,10 @@ When collecting a _tile_ (see discussion of the RasterFrame @ref:[schema](raster In an IPython or Jupyter interpreter a `Tile` object will be displayed as an image with limited metadata. ```python tile_sample -raster_url = 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/' \ - 'MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF' +def scene(band): + return 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/' \ + 'MCD43A4.A2019059.h11v08.006.2019072203257_B{}.TIF'.format(band) +raster_url = scene('02') spark_df = spark.read.raster(raster_url) tile = spark_df.select(rf_tile('proj_raster').alias('tile')).first()['tile'] tile @@ -35,7 +37,7 @@ Within an IPython or Jupyter interpreter a Pandas DataFrame containing a column In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](numpy-pandas.md). -```python toPandas, evaluate=True +```python to_pandas, evaluate=True import pyrasterframes.rf_ipython pandas_df = spark.read.raster(raster_url, tile_dimensions=(64, 64)) \ @@ -48,21 +50,47 @@ pandas_df.dtypes Viewing the DataFrame in Jupyter looks like this. -```python, evaluate=False +```python show_pandas, evaluate=False pandas_df ``` @@include[df-samples-output.md](static/df-samples-output.md) -## PNG Overviews - -It is oftentimes convenient to have a simple overview image of the data, particularly if it spans a very wide area. ## GeoTIFFs -GeoTIFF is one of the most common file formats for spatial data. +GeoTIFF is one of the most common file formats for spatial data, providing flexibility in data encoding, representation, and storage. RasterFrames provides a specialized Spark DataFrame writer for rendering a RasterFrame to a GeoTiff. + +One downside to GeoTIFF is that it is not a big data native format. To create a GeoTIFF all the data to be encoded has to be in the memory of one compute node (in Spark parlance, this is a "collect"), limiting it's maximum size substantially compared to that of a full cluster environment. When rendering GeoTIFFs in RasterFrames, you either need to specify the dimensions of the output raster, or be aware of how big the collected data will end up being. + +Fortunately, we can use the cluster computing capability to downlample the data into a more manageble saze. For sake of example, let's render a simple RGB overview image of our scene as a small raster: + +```python write_geotiff +import os.path +from docs import docs_dir +cat = """ +red,green,blue +{},{},{} +""".format(scene('01'), scene('04'), scene('03')) +outfile = os.path.join(docs_dir(), 'geotiff-overview.tif') +rf = spark.read.raster(catalog=cat, catalog_col_names=['red', 'green', 'blue']) +rf.write.geotiff(outfile, crs='EPSG:4326', raster_dimensions=(256, 256)) +``` + +Wiew it with `rasterio` to check the results: + +```python view_geotiff +import rasterio +import numpy as np +from rasterio.plot import show, show_hist + +with rasterio.open(outfile) as src: + cells = np.clip(src.read(), 0, 1800).astype('float32') + show(cells) + show_hist(src, bins=50, lw=0.0, stacked=False, alpha=0.3, + histtype='stepfilled', title="Overview Histogram") +``` -\[ See issue https://s22s.myjetbrains.com/youtrack/issue/RF-71 \] ## GeoTrellis Layers @@ -75,7 +103,7 @@ GeoTIFF is one of the most common file formats for spatial data. You can write the Spark DataFrame to an [Apache Parquet][Parquet] "file". This format is designed to work across different projects in the Hadoop ecosystem. It also provides a variety of optimizations for query against data written in the format. -```python, evaluate=False +```python write_parquet, evaluate=False spark_df.withColumn('exp', rf_expm1('proj_raster')) \ .write.mode('append').parquet('hdfs:///rf-user/sample.pq') ``` diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index f992b2534..dcc0da624 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -102,6 +102,12 @@ def _aliased_reader(df_reader, format_key, path, **options): """ Loads the file of the given type at the given path.""" return df_reader.format(format_key).load(path, **options) + +def _aliased_writer(df_writer, format_key, path, **options): + """ Saves the dataframe to a file of the given type at the given path.""" + return df_writer.format(format_key).save(path, **options) + + def _raster_reader( df_reader, path=None, @@ -167,10 +173,32 @@ def temp_name(): .load(path, **options) -def _aliased_writer(df_writer, format_key, path, **options): - """ Saves the dataframe to a file of the given type at the given path.""" - return df_writer.format(format_key).save(path=path, options=options) +def _geotiff_writer( + df_writer, + path=None, + crs=None, + raster_dimensions=None, + **options): + + if raster_dimensions is not None: + if isinstance(raster_dimensions, tuple): + options.update({ + "imageWidth": raster_dimensions[0], + "imageHeight": raster_dimensions[1] + }) + elif isinstance(raster_dimensions, str): + parts = raster_dimensions.split(',') + options.update({ + "imageWidth": parts[0], + "imageHeight": parts[1] + }) + + if crs is not None: + options.update({ + "crs": crs + }) + return _aliased_writer(df_writer, "geotiff", path, **options) # Patch new method on SparkSession to mirror Scala approach SparkSession.withRasterFrames = _rf_init @@ -186,6 +214,6 @@ def _aliased_writer(df_writer, format_key, path, **options): DataFrameReader.raster = _raster_reader DataFrameReader.geojson = lambda df_reader, path: _aliased_reader(df_reader, "geojson", path) DataFrameReader.geotiff = lambda df_reader, path: _layer_reader(df_reader, "geotiff", path) -DataFrameWriter.geotiff = lambda df_writer, path: _aliased_writer(df_writer, "geotiff", path) +DataFrameWriter.geotiff = _geotiff_writer DataFrameReader.geotrellis = lambda df_reader, path: _layer_reader(df_reader, "geotrellis", path) -DataFrameWriter.geotrellis = lambda df_writer, path: _aliased_writer(df_writer, "geotrellis", path) \ No newline at end of file +DataFrameWriter.geotrellis = lambda df_writer, path: _aliased_writer(df_writer, "geotrellis", path) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 91d5cd188..dfd8b704b 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -135,6 +135,7 @@ def doctype(self): 'pypandoc', 'numpy>=1.7', 'pandas', + 'rasterio' ], packages=[ 'pyrasterframes', diff --git a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py index 7bdf1d1e0..135d88a88 100644 --- a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py +++ b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py @@ -22,6 +22,7 @@ import tempfile from . import TestEnvironment +import rasterio class GeoTiffWriter(TestEnvironment): @@ -43,11 +44,20 @@ def test_identity_write(self): def test_unstructured_write(self): rf = self.spark.read.raster(self.img_uri) - dest = self._tmpfile() - rf.write.geotiff(dest) + rf.write.geotiff(dest, crs='EPSG:32616') rf2 = self.spark.read.raster(dest) self.assertEqual(rf2.count(), rf.count()) os.remove(dest) + + def test_downsampled_write(self): + rf = self.spark.read.raster(self.img_uri) + dest = self._tmpfile() + rf.write.geotiff(dest, crs='EPSG:32616', raster_dimensions=(128, 128)) + + with rasterio.open(dest) as f: + self.assertEqual((f.width, f.height), (128, 128)) + + os.remove(dest) From f67ce464be89f3a602afb89266c50e8dce85a4ca Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Jul 2019 14:04:40 -0400 Subject: [PATCH 256/380] Added capability to specify GDAL `vsixxx` paths. Updated docs on URI schemes. --- core/src/main/resources/reference.conf | 2 +- .../rasterframes/ref/GDALRasterSource.scala | 4 ++- .../rasterframes/ref/RasterSource.scala | 2 +- core/src/test/resources/L8-archive.zip | Bin 0 -> 59826 bytes .../rasterframes/ref/RasterSourceSpec.scala | 11 +++++++ .../src/main/python/docs/raster-read.pymd | 31 ++++++++++-------- pyrasterframes/src/main/python/setup.py | 1 + 7 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 core/src/test/resources/L8-archive.zip diff --git a/core/src/main/resources/reference.conf b/core/src/main/resources/reference.conf index ef635bb61..e7d3e57f5 100644 --- a/core/src/main/resources/reference.conf +++ b/core/src/main/resources/reference.conf @@ -12,7 +12,7 @@ vlm.gdal { //CPL_DEBUG = "OFF" AWS_REQUEST_PAYER = "requester" GDAL_DISABLE_READDIR_ON_OPEN = "YES" - CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.tiff,.jp2,.mrf,.idx,.lrc,.mrf.aux.xml" + CPL_VSIL_CURL_ALLOWED_EXTENSIONS = ".tif,.tiff,.jp2,.mrf,.idx,.lrc,.mrf.aux.xml,.vrt" } // set this to `false` if CPL_DEBUG is `ON` useExceptions = true diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala index eabbac002..52b8d0070 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala @@ -34,7 +34,9 @@ case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSour @transient private lazy val gdal: VLMRasterSource = { - val cleaned = source.toASCIIString.replace("gdal+", "") + val cleaned = source.toASCIIString + .replace("gdal+", "") + .replace("gdal:/", "") // VSIPath doesn't like single slash "file:/path..." val tweaked = if (cleaned.matches("^file:/[^/].*")) diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 4221166e3..937587c38 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -140,7 +140,7 @@ object RasterSource extends LazyLogging { /** Extractor for determining if a scheme indicates GDAL preference. */ def unapply(source: URI): Boolean = - gdalOnly(source) || ((preferGdal || source.getScheme.startsWith("gdal+")) && hasGDAL) + gdalOnly(source) || ((preferGdal || source.getScheme.startsWith("gdal")) && hasGDAL) } object IsDefaultGeoTiff { diff --git a/core/src/test/resources/L8-archive.zip b/core/src/test/resources/L8-archive.zip new file mode 100644 index 0000000000000000000000000000000000000000..93afb4db4df92c0dbd0a192a27d84f58c8fcedbe GIT binary patch literal 59826 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
                  PV|O;$jlL4lBuE6{Nk30D9!D1y9Pt;XX4 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 2.4) is installed. It is the only driver that can read non-GeoTIFF files. If GDAL is not available, either the _Java I/O` or _Hadoop_ driver will be selected, depending on scheme. + + +| Prefix | GDAL | Java I/O | Hadoop | +| ------------------- | ----------- | -------- | ------ | +| `gdal:////` | ✔︎ | -︎ | - | +| `file://` | ✔︎ | ✔︎ | - | +| `http://` | ✔︎ | ✔︎ | - | +| `https://` | ✔︎ | ✔︎ | - | +| `ftp://` | `/vsicurl/` | ✔ | - | +| `s3://` | `/vsis3/` ︎ | ✔︎ | - | +| `hdfs://` | `/vsihdfs/` ︎| - | ✔︎ | +| `s3n://` | - ︎ | - | ✔︎ | +| `s3a://` | - ︎ | - | ✔︎ | +| `wasb://` | `/vsiaz/` ︎ | - | ✔︎ | +| `wasbs://` | - ︎ | - | ✔︎ | + +Specific [GDAL Virtual File System drivers](https://gdal.org/user/virtual_file_systems.html) can be selected using the `gdal:////` syntax. For example If you have a `archive.zip` file containing a GeoTiff named `my-file-inside.tif`, you can address it with `gdal://vsizip//path/to/archive.zip/my-file-inside.tif`. See the GDAL documentation for the format of the URIs after the `gdal:/` prefix (which is stripped off before passing the rest of the path to GDAL). ## Raster Catalogs diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index dfd8b704b..a4811824b 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -134,6 +134,7 @@ def doctype(self): 'pytest==3.4.2', 'pypandoc', 'numpy>=1.7', + 'shapley', 'pandas', 'rasterio' ], From 51b5a2f9f2cc66d74b26eec1f6e241369a914db6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Jul 2019 14:12:52 -0400 Subject: [PATCH 257/380] Regression fix. --- .../org/locationtech/rasterframes/ExtensionMethodSpec.scala | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index 4b917b86e..05179c67d 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -25,6 +25,7 @@ import geotrellis.proj4.LatLng import geotrellis.raster.{ByteCellType, GridBounds, TileLayout} import geotrellis.spark.tiling.{CRSWorldExtent, LayoutDefinition} import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} +import org.apache.spark.sql.{Encoder, Encoders} import org.locationtech.rasterframes.util.SubdivideSupport /** @@ -61,6 +62,7 @@ class ExtensionMethodSpec extends TestEnvironment with TestData with SubdivideSu df.extentColumns.size should be(2) } it("should find multiple crs columns") { + implicit val enc = Encoders.tuple(crsEncoder, Encoders.STRING, crsEncoder, Encoders.scalaDouble) val df = Seq((pe.crs, "fred", pe.crs, 34.0)).toDF("c1", "s", "c2", "n") df.crsColumns.size should be (2) } From b7e38c289921814ad63126d268e71d87749cd99a Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 24 Jul 2019 16:54:22 -0400 Subject: [PATCH 258/380] Correct NoDataFilter implementation in Python; supervised ML doc example Signed-off-by: Jason T. Brown --- .../src/main/python/docs/deep-learning.pymd | 6 + .../src/main/python/docs/machine-learning.md | 15 ++ .../src/main/python/docs/raster-processing.md | 2 +- .../main/python/docs/supervised-learning.pymd | 197 ++++++++++++++++++ ...ark-ml.pymd => unsupervised-learning.pymd} | 4 +- .../main/python/pyrasterframes/rf_types.py | 11 +- .../resources/L8-Labels-Elkton-VA.geojson | 9 + 7 files changed, 235 insertions(+), 9 deletions(-) create mode 100644 pyrasterframes/src/main/python/docs/deep-learning.pymd create mode 100644 pyrasterframes/src/main/python/docs/machine-learning.md create mode 100644 pyrasterframes/src/main/python/docs/supervised-learning.pymd rename pyrasterframes/src/main/python/docs/{spark-ml.pymd => unsupervised-learning.pymd} (90%) create mode 100644 pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson diff --git a/pyrasterframes/src/main/python/docs/deep-learning.pymd b/pyrasterframes/src/main/python/docs/deep-learning.pymd new file mode 100644 index 000000000..5aba5e997 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/deep-learning.pymd @@ -0,0 +1,6 @@ +# Deep Learning + +> Using RasterFrames and `pandas_udf`s to feed tiles/chips into Keras. + +_TODO_ + diff --git a/pyrasterframes/src/main/python/docs/machine-learning.md b/pyrasterframes/src/main/python/docs/machine-learning.md new file mode 100644 index 000000000..198cefca5 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/machine-learning.md @@ -0,0 +1,15 @@ +# Machine Learning + +RasterFrames provides facilities to train and predict with a wide variety of machine learning models through [Spark ML Pipelines](https://spark.apache.org/docs/latest/ml-guide.html). This library provides a variety of pipeline components for supervised learning, unsupervised learning, and data preparation that can be used to represent and repeatably conduct a variety of tasks in machine learning. + +Furthermore, through the use of [`pandas_udf`s](https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#pandas-udfs-aka-vectorized-udfs), `Tile`s in RasterFrames can be piped into deep learning frameworks, such as [Keras](https://keras.io/) or [TensorFlow](https://www.tensorflow.org/). + +The following sections provide some examples on how to integrate these workflows with RasterFrames. + +@@@ index + +* @ref:[Unsupervised Machine Learning](unsupervised-learning.md) +* @ref:[Supervised Machine Learning](supervised-learning.md) +* @ref:[Deep Learning](deep-learning.md) + +@@@ diff --git a/pyrasterframes/src/main/python/docs/raster-processing.md b/pyrasterframes/src/main/python/docs/raster-processing.md index 3ac4c8ac4..2f236429b 100644 --- a/pyrasterframes/src/main/python/docs/raster-processing.md +++ b/pyrasterframes/src/main/python/docs/raster-processing.md @@ -6,7 +6,7 @@ * @ref:["NoData" Handling](nodata-handling.md) * @ref:[Aggregation](aggregation.md) * @ref:[Time Series](time-series.md) -* @ref:[Machine Learning](spark-ml.md) +* @ref:[Machine Learning](machine-learning.md) @@@ diff --git a/pyrasterframes/src/main/python/docs/supervised-learning.pymd b/pyrasterframes/src/main/python/docs/supervised-learning.pymd new file mode 100644 index 000000000..cf99a4a60 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/supervised-learning.pymd @@ -0,0 +1,197 @@ +# Supervised Machine Learning + +In this example we will demonstrate how to fit and score an unsupervised learning model with a sample of Sentinel-2 data and labels from the US [National Land Cover Dataset](https://www.mrlc.gov/) (NLCD). + +```python, setup, echo=False +from IPython.core.display import display +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +import pandas as pd +from docs import resource_dir_uri + +import os + +spark = create_rf_spark_session() +``` + +## Create and Read Raster Catalog + +We import various Spark components that we need to construct our [Pipeline](https://spark.apache.org/docs/latest/ml-pipeline.html). + +```python, imports, echo=True +from pyrasterframes import TileExploder +from pyrasterframes.rf_types import NoDataFilter + +from pyspark.ml.feature import VectorAssembler +from pyspark.ml.classification import DecisionTreeClassifier +from pyspark.ml.evaluation import MulticlassClassificationEvaluator +from pyspark.ml import Pipeline +``` + +The first step is to create a Spark DataFrame of our imagery data. To achieve that we will create @ref:[a catalog DataFrame](raster-catalogs.md#creating-a-catalog). In the catalog, each row represents a distinct area and time; and each column is the URI to a band's image product. The resulting Spark DataFrame may have many rows per URI, with a column corresponding to each band. + +```python, read_bands, term=True +uri_base = 's3://s22s-test-geotiffs/luray_snp/{}.tif' +bands = ['B01', 'B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B09', 'B11', 'B12'] +cols = ['SCL'] + bands + +catalog_df = pd.DataFrame([ + {b: uri_base.format(b) for b in cols} +]) + +df = spark.read.raster(catalog=catalog_df, + catalog_col_names=cols, + tile_dimensions=(128, 128) + ).repartition(100) + +df = df.select( + rf_crs(df.B01).alias('crs'), + rf_extent(df.B01).alias('extent'), + rf_tile(df.SCL).alias('scl'), + rf_tile(df.B01).alias('B01'), + rf_tile(df.B02).alias('B02'), + rf_tile(df.B03).alias('B03'), + rf_tile(df.B04).alias('B04'), + rf_tile(df.B05).alias('B05'), + rf_tile(df.B06).alias('B06'), + rf_tile(df.B07).alias('B07'), + rf_tile(df.B08).alias('B08'), + rf_tile(df.B09).alias('B09'), + rf_tile(df.B11).alias('B11'), + rf_tile(df.B12).alias('B12'), +) +df.printSchema() +``` + +## Data Prep + +### Label Data + +[](https://github.com/locationtech/rasterframes/blob/develop/core/src/test/resources/L8-Labels-Elkton-VA.geojson) + +```python +crses = df.select('crs.crsProj4').distinct().collect() +print('Found ', len(crses), 'distinct CRS.') +crs = crses[0][0] + +label_df = spark.read.geojson(os.path.join(resource_dir_uri(), "L8-Labels-Elkton-VA.geojson")) \ + .select('id', st_reproject('geometry', 'EPSG:4326', crs).alias('geometry')) \ + .hint('broadcast') + +df_joined = df.join(label_df, st_intersects(st_geometry('extent'), 'geometry')) + +df_joined.createOrReplaceTempView('df_joined') +df_labeled = spark.sql(""" +SELECT *, rf_rasterize(geometry, st_geometry(extent), id, rf_dimensions(B01).cols, rf_dimensions(B01).rows) AS label +FROM df_joined +""") +``` + + + +## Masking NoData + +We will follow the same procedure as demonstrated in the @ref:[quality masking](nodata-handling.md#masking) section of the chapter on NoData. Instead of actually masking we will just sort on the mask cell values later in the process + +```python make_mask +from pyspark.sql.functions import lit + +mask_part = df_labeled.withColumn('nodata', rf_local_equal('scl', lit(0))) \ + .withColumn('defect', rf_local_equal('scl', lit(1))) \ + .withColumn('cloud8', rf_local_equal('scl', lit(8))) \ + .withColumn('cloud9', rf_local_equal('scl', lit(9))) \ + .withColumn('cirrus', rf_local_equal('scl', lit(10))) + +df_mask = mask_part.withColumn('mask', rf_local_add('nodata', 'defect')) \ + .withColumn('mask', rf_local_add('mask', 'cloud8')) \ + .withColumn('mask', rf_local_add('mask', 'cloud9')) \ + .withColumn('mask', rf_local_add('mask', 'cirrus')) \ + .drop('nodata', 'defect', 'cloud8', 'cloud9', 'cirrus') + +df_mask.printSchema() +``` + + +## Create ML Pipeline + +The data preparation modeling pipeline is next. SparkML requires that each observation be in its own row, and those observations be packed into a single [`Vector`](https://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.linalg) object. The first step is to "explode" the tiles into a single row per cell/pixel. Then we filter out any rows that have `NoData` values (which will cause an error during training). Finally we use the SparkML `VectorAssembler` to create that `Vector`. + +```python, transformers +exploder = TileExploder() + +noDataFilter = NoDataFilter() \ + .setInputCols(cols + ['label', 'mask']) + +assembler = VectorAssembler() \ + .setInputCols(bands) \ + .setOutputCol("features") +``` + +We are going to use a decision tree for classification. You can swap out one of the other multi-class +classification algorithms if you like. With the algorithm selected we can assemble our modeling pipeline. + +```python, pipeline +classifier = DecisionTreeClassifier() \ + .setLabelCol('label') \ + .setFeaturesCol(assembler.getOutputCol()) + +pipeline = Pipeline() \ + .setStages([exploder, noDataFilter, assembler, classifier]) + +pipeline.getStages() +``` + +## Train the Model + +Push the "go button"! This will actually run each step of the Pipeline we created including fitting the decision tree model. + +```python, train +model = pipeline.fit(df_mask.filter(rf_tile_sum('label') > 0).cache()) +``` + +## Model Evaluation + +To view the model's performance .... + +```python eval +eval = MulticlassClassificationEvaluator(predictionCol=classifier.getPredictionCol(), + labelCol=classifier.getLabelCol(), + metricName='accuracy', +) + +prediction_df = model.transform(df_mask) \ + .drop(assembler.getOutputCol()).cache() +accuracy = eval.evaluate(prediction_df) +accuracy +``` + + +We can take a quick look at the resulting confusion matrix. + +```python confusion_mtrx +prediction_df.groupBy(classifier.getPredictionCol()) \ + .pivot(classifier.getLabelCol()) \ + .count().show(20, False) +``` + +## Visualize Prediction + +We can recreate the tiled data structure using the metadata added by the `TileExploder` pipeline stage. + +```python assemble_prediction +model.transform(df_mask.drop('label')).createOrReplaceTempView('scored') +retiled = spark.sql(""" +SELECT extent, crs, rf_assemble_tile(column_index, row_index, prediction, 128, 128) as prediction +FROM scored +GROUP BY extent, crs +""") + +retiled.printSchema() +``` + +Take a look at a sample of the resulting output. + +```python display_prediction +display(retiled.select('prediction').first()['prediction']) +``` + diff --git a/pyrasterframes/src/main/python/docs/spark-ml.pymd b/pyrasterframes/src/main/python/docs/unsupervised-learning.pymd similarity index 90% rename from pyrasterframes/src/main/python/docs/spark-ml.pymd rename to pyrasterframes/src/main/python/docs/unsupervised-learning.pymd index d871a8831..13dd58a44 100644 --- a/pyrasterframes/src/main/python/docs/spark-ml.pymd +++ b/pyrasterframes/src/main/python/docs/unsupervised-learning.pymd @@ -1,6 +1,4 @@ -# Machine Learning with RasterFrames - -RasterFrames provides access to train and predict with a wide variety of machine learning models through [Spark ML Pipelines](https://spark.apache.org/docs/latest/ml-guide.html). This library provides a variety of pipeline components for supervised learning, unsupervised learning, and data preparation that can be used to repeatably represent a variety of tasks in machine learning. +# Unsupervised Machine Learning In this example we will demonstrate how to fit and score an unsupervised learning model with a [sample of Landsat 8 data](https://github.com/locationtech/rasterframes/tree/develop/pyrasterframes/src/test/resources). diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index ffe2aa925..b3f743bf1 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -25,13 +25,16 @@ class here provides the PyRasterFrames entry point. """ -from pyspark.sql.types import UserDefinedType from pyspark import SparkContext from pyspark.sql import DataFrame, Column -from pyspark.sql.types import (StructType, StructField, BinaryType, DoubleType, ShortType, IntegerType, StringType) +from pyspark.sql.types import (UserDefinedType, StructType, StructField, BinaryType, DoubleType, ShortType, IntegerType, StringType) + +from pyspark.ml.param.shared import HasInputCols from pyspark.ml.wrapper import JavaTransformer from pyspark.ml.util import JavaMLReadable, JavaMLWritable + from pyrasterframes.rf_context import RFContext + import numpy as np __all__ = ['RasterFrameLayer', 'Tile', 'TileUDT', 'CellType', 'RasterSourceUDT', 'TileExploder', 'NoDataFilter'] @@ -464,7 +467,7 @@ def __init__(self): self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.TileExploder", self.uid) -class NoDataFilter(JavaTransformer, JavaMLReadable, JavaMLWritable): +class NoDataFilter(JavaTransformer, HasInputCols, JavaMLReadable, JavaMLWritable): """ Python wrapper for NoDataFilter.scala """ @@ -473,5 +476,3 @@ def __init__(self): super(NoDataFilter, self).__init__() self._java_obj = self._new_java_obj("org.locationtech.rasterframes.ml.NoDataFilter", self.uid) - def setInputCols(self, values): - self._java_obj.setInputCols(values) diff --git a/pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson b/pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson new file mode 100644 index 000000000..076158b56 --- /dev/null +++ b/pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson @@ -0,0 +1,9 @@ +{ +"type": "FeatureCollection", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "id": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.638383330417554, 38.391061314584398 ], [ -78.637172448825936, 38.395449766458547 ], [ -78.629215101908301, 38.396549823989744 ], [ -78.630786820138638, 38.392028667955493 ], [ -78.634228219464887, 38.390206983429579 ], [ -78.638383330417554, 38.391061314584398 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.625973620483947, 38.384086145975928 ], [ -78.619781683426993, 38.388373376437947 ], [ -78.613688820548219, 38.386918574305838 ], [ -78.611752103843472, 38.388980469097866 ], [ -78.612829995997004, 38.39138397517295 ], [ -78.604257166078241, 38.392259658270049 ], [ -78.609485512325875, 38.382139853466676 ], [ -78.625973620483947, 38.384086145975928 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.65213631116778, 38.386854807768536 ], [ -78.647983519633271, 38.385930966410982 ], [ -78.650653269705685, 38.383182700685978 ], [ -78.652397953903673, 38.384268357728601 ], [ -78.65213631116778, 38.386854807768536 ] ] ] } } +] +} From 7f2e66825c90b515d82ec29d13c0b9a01970b4be Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 25 Jul 2019 09:12:16 -0400 Subject: [PATCH 259/380] Remove deep learning page, for now Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/deep-learning.pymd | 6 ------ pyrasterframes/src/main/python/docs/machine-learning.md | 3 --- 2 files changed, 9 deletions(-) delete mode 100644 pyrasterframes/src/main/python/docs/deep-learning.pymd diff --git a/pyrasterframes/src/main/python/docs/deep-learning.pymd b/pyrasterframes/src/main/python/docs/deep-learning.pymd deleted file mode 100644 index 5aba5e997..000000000 --- a/pyrasterframes/src/main/python/docs/deep-learning.pymd +++ /dev/null @@ -1,6 +0,0 @@ -# Deep Learning - -> Using RasterFrames and `pandas_udf`s to feed tiles/chips into Keras. - -_TODO_ - diff --git a/pyrasterframes/src/main/python/docs/machine-learning.md b/pyrasterframes/src/main/python/docs/machine-learning.md index 198cefca5..075454ba6 100644 --- a/pyrasterframes/src/main/python/docs/machine-learning.md +++ b/pyrasterframes/src/main/python/docs/machine-learning.md @@ -2,14 +2,11 @@ RasterFrames provides facilities to train and predict with a wide variety of machine learning models through [Spark ML Pipelines](https://spark.apache.org/docs/latest/ml-guide.html). This library provides a variety of pipeline components for supervised learning, unsupervised learning, and data preparation that can be used to represent and repeatably conduct a variety of tasks in machine learning. -Furthermore, through the use of [`pandas_udf`s](https://spark.apache.org/docs/latest/sql-pyspark-pandas-with-arrow.html#pandas-udfs-aka-vectorized-udfs), `Tile`s in RasterFrames can be piped into deep learning frameworks, such as [Keras](https://keras.io/) or [TensorFlow](https://www.tensorflow.org/). - The following sections provide some examples on how to integrate these workflows with RasterFrames. @@@ index * @ref:[Unsupervised Machine Learning](unsupervised-learning.md) * @ref:[Supervised Machine Learning](supervised-learning.md) -* @ref:[Deep Learning](deep-learning.md) @@@ From 6502d0dc01f95da986effcaece68ddc84ce6807c Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 25 Jul 2019 10:01:54 -0400 Subject: [PATCH 260/380] Add new label data set for supervised learning docs; flesh out initial text Signed-off-by: Jason T. Brown --- .../src/main/python/docs/raster-write.pymd | 2 +- .../main/python/docs/supervised-learning.pymd | 72 ++++++++++--------- .../src/test/resources/luray-labels.geojson | 18 +++++ 3 files changed, 59 insertions(+), 33 deletions(-) create mode 100644 pyrasterframes/src/test/resources/luray-labels.geojson diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index ba4af68db..86f88a7ee 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -33,7 +33,7 @@ display(tile) # IPython.display function Within an IPython or Jupyter interpreter a Pandas DataFrame containing a column of _tiles_ will be rendered as the samples discussed above. Simply import the `rf_ipython` submodule to enable enhanced HTML rendering of a Pandas DataFrame. -In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](pandas-numpy.md). +In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](numpy-pandas.md). ```python toPandas, evaluate=True import pyrasterframes.rf_ipython diff --git a/pyrasterframes/src/main/python/docs/supervised-learning.pymd b/pyrasterframes/src/main/python/docs/supervised-learning.pymd index cf99a4a60..5c00a71d1 100644 --- a/pyrasterframes/src/main/python/docs/supervised-learning.pymd +++ b/pyrasterframes/src/main/python/docs/supervised-learning.pymd @@ -1,6 +1,6 @@ # Supervised Machine Learning -In this example we will demonstrate how to fit and score an unsupervised learning model with a sample of Sentinel-2 data and labels from the US [National Land Cover Dataset](https://www.mrlc.gov/) (NLCD). +In this example we will demonstrate how to fit and score an unsupervised learning model with a sample of Sentinel-2 data and hand-drawn vector labels over different [land cover](https://en.wikipedia.org/wiki/Land_cover) types. ```python, setup, echo=False from IPython.core.display import display @@ -16,19 +16,7 @@ spark = create_rf_spark_session() ## Create and Read Raster Catalog -We import various Spark components that we need to construct our [Pipeline](https://spark.apache.org/docs/latest/ml-pipeline.html). - -```python, imports, echo=True -from pyrasterframes import TileExploder -from pyrasterframes.rf_types import NoDataFilter - -from pyspark.ml.feature import VectorAssembler -from pyspark.ml.classification import DecisionTreeClassifier -from pyspark.ml.evaluation import MulticlassClassificationEvaluator -from pyspark.ml import Pipeline -``` - -The first step is to create a Spark DataFrame of our imagery data. To achieve that we will create @ref:[a catalog DataFrame](raster-catalogs.md#creating-a-catalog). In the catalog, each row represents a distinct area and time; and each column is the URI to a band's image product. The resulting Spark DataFrame may have many rows per URI, with a column corresponding to each band. +The first step is to create a Spark DataFrame of our imagery data. To achieve that we will create @ref:[a catalog DataFrame](raster-catalogs.md#creating-a-catalog). In the catalog, each row represents a distinct area and time; and each column is the URI to a band's image product. In this example our catalog just has one row. After reading the catalog, the resulting Spark DataFrame may have many rows per URI, with a column corresponding to each band. ```python, read_bands, term=True uri_base = 's3://s22s-test-geotiffs/luray_snp/{}.tif' @@ -67,14 +55,16 @@ df.printSchema() ### Label Data -[](https://github.com/locationtech/rasterframes/blob/develop/core/src/test/resources/L8-Labels-Elkton-VA.geojson) +The land classification labels are based on a smalls set of hand drawn polygons in the geojson file [here](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/src/test/resources/luray-labels.geojson). The property `id` indicates the type of land cover in each area. For these integer values 1 is forest, 2 is cropland, 3 is developed areas. + +We will create a very small Spark DataFrame of the label shapes and then join it to the raster DataFrame. Such joins are typically expensive but in this case both datasets are quite small. After the raster and vector data are joined, we will convert the vector shapes into _tiles_ using the @ref:[`rf_rasterize`](reference.md#rf-rasterize) function. This procedure is sometimes called "burning in" a geometry into a raster. The values in the resulting _tiles_ are the `id` property of the geojson; which we will use as labels in our supervised learning task. ```python crses = df.select('crs.crsProj4').distinct().collect() print('Found ', len(crses), 'distinct CRS.') crs = crses[0][0] -label_df = spark.read.geojson(os.path.join(resource_dir_uri(), "L8-Labels-Elkton-VA.geojson")) \ +label_df = spark.read.geojson(os.path.join(resource_dir_uri(), 'luray-labels.geojson')) \ .select('id', st_reproject('geometry', 'EPSG:4326', crs).alias('geometry')) \ .hint('broadcast') @@ -87,11 +77,9 @@ FROM df_joined """) ``` - - ## Masking NoData -We will follow the same procedure as demonstrated in the @ref:[quality masking](nodata-handling.md#masking) section of the chapter on NoData. Instead of actually masking we will just sort on the mask cell values later in the process +To filter only for good quality pixels, we follow the same procedure as demonstrated in the @ref:[quality masking](nodata-handling.md#masking) section of the chapter on NoData. Instead of actually masking we will just sort on the mask cell values later in the process. ```python make_mask from pyspark.sql.functions import lit @@ -111,10 +99,23 @@ df_mask = mask_part.withColumn('mask', rf_local_add('nodata', 'defect')) \ df_mask.printSchema() ``` - ## Create ML Pipeline -The data preparation modeling pipeline is next. SparkML requires that each observation be in its own row, and those observations be packed into a single [`Vector`](https://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.linalg) object. The first step is to "explode" the tiles into a single row per cell/pixel. Then we filter out any rows that have `NoData` values (which will cause an error during training). Finally we use the SparkML `VectorAssembler` to create that `Vector`. +We import various Spark components that we need to construct our [Pipeline](https://spark.apache.org/docs/latest/ml-pipeline.html). These are the objects that will work in sequence to conduct the data preparation and modeling. + +```python, imports, echo=True +from pyrasterframes import TileExploder +from pyrasterframes.rf_types import NoDataFilter + +from pyspark.ml.feature import VectorAssembler +from pyspark.ml.classification import DecisionTreeClassifier +from pyspark.ml.evaluation import MulticlassClassificationEvaluator +from pyspark.ml import Pipeline +``` + +SparkML requires that each observation be in its own row, and those observations be packed into a single [`Vector`](https://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.linalg) object. The first step is to "explode" the tiles into a single row per cell/pixel with the `TileExploder` (see also @ref:[`rf_explode_tiles`](reference.md#rf_explode_tiles)). Then we filter out any rows that have `NoData` values (which will cause an error during training). Finally we use the SparkML `VectorAssembler` to create that `Vector`. + +It is worth discussing a couple of interesting things about the `NoDataFilter`. First we filter by the mask column. This achieves the filtering of observations only to the good pixels, without having to explicitly mask and assign NoData in all eleven columns of raster data. The other column specified is the `label` column. When it is time to score the model, the pipeline will ignore the fact that there is no `label` column on the input DataFrame. ```python, transformers exploder = TileExploder() @@ -151,35 +152,38 @@ model = pipeline.fit(df_mask.filter(rf_tile_sum('label') > 0).cache()) ## Model Evaluation -To view the model's performance .... +To view the model's performance, we first call the pipeline's `transform` method on the training dataset. This transformed dataset will have the model's prediction included in each row. We next construct an evaluator and pass it the transformed dataset to easily compute the performance metric. We could also use a variety of DataFrame or SQL transformations to compute our metric if we like. ```python eval +prediction_df = model.transform(df_mask) \ + .drop(assembler.getOutputCol()).cache() +prediction_df.printSchema() + eval = MulticlassClassificationEvaluator(predictionCol=classifier.getPredictionCol(), labelCol=classifier.getLabelCol(), metricName='accuracy', ) -prediction_df = model.transform(df_mask) \ - .drop(assembler.getOutputCol()).cache() accuracy = eval.evaluate(prediction_df) -accuracy +print("\nAccuracy:", accuracy) ``` - -We can take a quick look at the resulting confusion matrix. +As an example of using the flexibility provided by DataFrames, the code below computes and displays the confusion matrix. ```python confusion_mtrx prediction_df.groupBy(classifier.getPredictionCol()) \ .pivot(classifier.getLabelCol()) \ - .count().show(20, False) + .count() \ + .sort(classifier.getPredictionCol()).show(20, False) ``` ## Visualize Prediction -We can recreate the tiled data structure using the metadata added by the `TileExploder` pipeline stage. +Because the pipeline included a `TileExploder`, we will recreate the tiled data structure. The explosion transformation includes metadata enabling us to recreate the _tiles_. See the @ref:[`rf_assemble_tile`](reference.md#rf-assemble-tile) function documentation for more details. In this case, the pipeline is scoring on all areas, regardless of whether they intersect the label polygons. This is simply done by removing the `label` column, as @ref:[discussed above](supervised-learning.md#create-ml-pipeline). ```python assemble_prediction -model.transform(df_mask.drop('label')).createOrReplaceTempView('scored') +scored = model.transform(df_mask.drop('label')).createOrReplaceTempView('scored') + retiled = spark.sql(""" SELECT extent, crs, rf_assemble_tile(column_index, row_index, prediction, 128, 128) as prediction FROM scored @@ -189,9 +193,13 @@ GROUP BY extent, crs retiled.printSchema() ``` -Take a look at a sample of the resulting output. +Take a look at a sample of the resulting output. Recall the label coding: 1 is forest (purple), 2 is cropland (green) and 3 is developed areas(yellow). ```python display_prediction -display(retiled.select('prediction').first()['prediction']) +display( + retiled.select('prediction') \ + .sort(-rf_tile_sum(rf_local_equal('prediction', lit(3.0)))) \ + .first()['prediction'] +) ``` diff --git a/pyrasterframes/src/test/resources/luray-labels.geojson b/pyrasterframes/src/test/resources/luray-labels.geojson new file mode 100644 index 000000000..bdcbcb504 --- /dev/null +++ b/pyrasterframes/src/test/resources/luray-labels.geojson @@ -0,0 +1,18 @@ +{ +"type": "FeatureCollection", +"name": "L8-Labels-Elkton-VA", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, +"features": [ +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.074908035755897, 38.325593965393153 ], [ -78.078776658402262, 38.327823897217776 ], [ -78.092819443861529, 38.32571146899194 ], [ -78.100161396610659, 38.313995346890302 ], [ -78.089376916671426, 38.31282539893752 ], [ -78.077634077459933, 38.317374423878938 ], [ -78.073898621221971, 38.322204512883999 ], [ -78.074908035755897, 38.325593965393153 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.369170650882523, 38.58065284389172 ], [ -78.383640370680567, 38.54472654334991 ], [ -78.327374251542963, 38.538843940894999 ], [ -78.314259254758397, 38.575748016690518 ], [ -78.369170650882523, 38.58065284389172 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.565452768282938, 38.692698239200176 ], [ -77.54853756075201, 38.687441203624303 ], [ -77.547985098699257, 38.68151785733005 ], [ -77.564314874957617, 38.685855270536351 ], [ -77.565452768282938, 38.692698239200176 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.625973620483947, 38.384086145975928 ], [ -78.619781683426993, 38.388373376437947 ], [ -78.613688820548219, 38.386918574305838 ], [ -78.609339103717076, 38.395958714056761 ], [ -78.600276924123435, 38.395057914051847 ], [ -78.598004559194038, 38.384358026518214 ], [ -78.600712105415838, 38.372726630839622 ], [ -78.61155677616398, 38.374617746567012 ], [ -78.625973620483947, 38.384086145975928 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 3 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.499872299697259, 38.265959576364672 ], [ -77.490962536589549, 38.262548509310811 ], [ -77.494072526256261, 38.251792574227593 ], [ -77.508081452628034, 38.250717051596098 ], [ -77.512193148300739, 38.258543877561848 ], [ -77.499872299697259, 38.265959576364672 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.896560416594369, 38.384489202082833 ], [ -77.885446228394855, 38.379901618618995 ], [ -77.886558613990559, 38.386926446793112 ], [ -77.892167110596205, 38.388029313414151 ], [ -77.896560416594369, 38.384489202082833 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.104587721849782, 38.230347976602772 ], [ -78.096623830061731, 38.232933469701152 ], [ -78.093733463904584, 38.227058631140601 ], [ -78.100422718389751, 38.223567355393556 ], [ -78.104587721849782, 38.230347976602772 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.09500918449011, 38.235516869468242 ], [ -78.084617397721388, 38.240823731215684 ], [ -78.079911154013928, 38.23752678606543 ], [ -78.084755595273549, 38.232321061869477 ], [ -78.09500918449011, 38.235516869468242 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 3 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.505050042952476, 38.306327713885693 ], [ -77.5048207527187, 38.300040419530752 ], [ -77.511898783174473, 38.289086070422542 ], [ -77.522735680615511, 38.292059924398963 ], [ -77.514377553898413, 38.300185554775908 ], [ -77.513706480506912, 38.310493467061114 ], [ -77.505050042952476, 38.306327713885693 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.89809802814473, 38.532542129891446 ], [ -77.901444154311747, 38.525317699576725 ], [ -77.893247775998773, 38.518264149754522 ], [ -77.897703956491853, 38.513453996400983 ], [ -77.901049016994193, 38.520378827806503 ], [ -77.916274443433977, 38.528730212529119 ], [ -77.909492522815626, 38.535864361205661 ], [ -77.89809802814473, 38.532542129891446 ] ] ] } }, +{ "type": "Feature", "properties": { "id": 3 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -77.516032435253635, 38.794413501916893 ], [ -77.523118384311459, 38.785034143507744 ], [ -77.505102142982878, 38.775534328871899 ], [ -77.504411687954828, 38.760891842932352 ], [ -77.483604951868131, 38.747060201442238 ], [ -77.463488423830327, 38.747867575574077 ], [ -77.449558893048575, 38.757506997981018 ], [ -77.516032435253635, 38.794413501916893 ] ] ] } } +] +} From 83e22b777ab1e1232ad3893f41915620ee203711 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 26 Jul 2019 09:44:23 -0400 Subject: [PATCH 261/380] Update link to numpy doc Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/raster-write.pymd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index 86f88a7ee..31ea98402 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -1,6 +1,6 @@ # Writing Raster Data -RasterFrames is oriented toward large scale analyses of spatial data. The primary output for most use cases may be a @ref:[statistical summary](aggregation.md), a @ref:[machine learning model](spark-ml.md), or some other result that is generally much smaller than the input data set. +RasterFrames is oriented toward large scale analyses of spatial data. The primary output for most use cases may be a @ref:[statistical summary](aggregation.md), a @ref:[machine learning model](machine-learning.md), or some other result that is generally much smaller than the input data set. However there are times in any analysis where writing a representative sample of the work in progress provides invaluable feedback on the process and results. From c26d33f335cb715833cbac8d50740d1c2f816abd Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Sat, 27 Jul 2019 16:11:05 -0400 Subject: [PATCH 262/380] Tweaks from PR feedback Signed-off-by: Jason T. Brown --- .../main/python/docs/supervised-learning.pymd | 72 +++++++++++++------ 1 file changed, 49 insertions(+), 23 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/supervised-learning.pymd b/pyrasterframes/src/main/python/docs/supervised-learning.pymd index 5c00a71d1..c7ffaca75 100644 --- a/pyrasterframes/src/main/python/docs/supervised-learning.pymd +++ b/pyrasterframes/src/main/python/docs/supervised-learning.pymd @@ -1,12 +1,14 @@ # Supervised Machine Learning -In this example we will demonstrate how to fit and score an unsupervised learning model with a sample of Sentinel-2 data and hand-drawn vector labels over different [land cover](https://en.wikipedia.org/wiki/Land_cover) types. +In this example we will demonstrate how to fit and score a supervised learning model with a sample of Sentinel-2 data and hand-drawn vector labels over different [land cover](https://en.wikipedia.org/wiki/Land_cover) types. ```python, setup, echo=False from IPython.core.display import display from pyrasterframes.utils import create_rf_spark_session from pyrasterframes.rasterfunctions import * import pandas as pd +import numpy as np +import matplotlib.pyplot as plt from docs import resource_dir_uri import os @@ -18,6 +20,8 @@ spark = create_rf_spark_session() The first step is to create a Spark DataFrame of our imagery data. To achieve that we will create @ref:[a catalog DataFrame](raster-catalogs.md#creating-a-catalog). In the catalog, each row represents a distinct area and time; and each column is the URI to a band's image product. In this example our catalog just has one row. After reading the catalog, the resulting Spark DataFrame may have many rows per URI, with a column corresponding to each band. +The imagery for feature data will come from [eleven bands of 60 meter resolution Sentinel 2](https://earth.esa.int/web/sentinel/user-guides/sentinel-2-msi/resolutions/spatial) imagery. We also will use the [scene classification (SCL)](https://earth.esa.int/web/sentinel/technical-guides/sentinel-2-msi/level-2a/algorithm) data to identify high quality, non-cloudy pixels. + ```python, read_bands, term=True uri_base = 's3://s22s-test-geotiffs/luray_snp/{}.tif' bands = ['B01', 'B02', 'B03', 'B04', 'B05', 'B06', 'B07', 'B08', 'B09', 'B11', 'B12'] @@ -55,11 +59,13 @@ df.printSchema() ### Label Data -The land classification labels are based on a smalls set of hand drawn polygons in the geojson file [here](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/src/test/resources/luray-labels.geojson). The property `id` indicates the type of land cover in each area. For these integer values 1 is forest, 2 is cropland, 3 is developed areas. +The land classification labels are based on a small set of hand drawn polygons in the geojson file [here](https://github.com/locationtech/rasterframes/blob/develop/pyrasterframes/src/test/resources/luray-labels.geojson). The property `id` indicates the type of land cover in each area. For these integer values 1 is forest, 2 is cropland and 3 is developed areas. + +We will create a very small Spark DataFrame of the label shapes and then join it to the raster DataFrame. Such joins are typically expensive, but in this case both datasets are quite small. To speed up the join for the small vector DataFrame, we put the `broadcast` hint on it. Spark will put a copy of it on each Spark executor. -We will create a very small Spark DataFrame of the label shapes and then join it to the raster DataFrame. Such joins are typically expensive but in this case both datasets are quite small. After the raster and vector data are joined, we will convert the vector shapes into _tiles_ using the @ref:[`rf_rasterize`](reference.md#rf-rasterize) function. This procedure is sometimes called "burning in" a geometry into a raster. The values in the resulting _tiles_ are the `id` property of the geojson; which we will use as labels in our supervised learning task. +After the raster and vector data are joined, we will convert the vector shapes into _tiles_ using the @ref:[`rf_rasterize`](reference.md#rf-rasterize) function. This procedure is sometimes called "burning in" a geometry into a raster. The values in the resulting _tile_ cells are the `id` property of the geojson; which we will use as labels in our supervised learning task. In areas where the geometry does not intersect, the cells will contain a NoData. -```python +```python join_and_rasterize crses = df.select('crs.crsProj4').distinct().collect() print('Found ', len(crses), 'distinct CRS.') crs = crses[0][0] @@ -77,9 +83,9 @@ FROM df_joined """) ``` -## Masking NoData +## Masking Poor Quality Cells -To filter only for good quality pixels, we follow the same procedure as demonstrated in the @ref:[quality masking](nodata-handling.md#masking) section of the chapter on NoData. Instead of actually masking we will just sort on the mask cell values later in the process. +To filter only for good quality pixels, we follow roughly the same procedure as demonstrated in the @ref:[quality masking](nodata-handling.md#masking) section of the chapter on NoData. Instead of actually setting NoData values in the unwanted cells of any of the imagery bands, we will just on filter out the mask cell values later in the process. ```python make_mask from pyspark.sql.functions import lit @@ -90,11 +96,16 @@ mask_part = df_labeled.withColumn('nodata', rf_local_equal('scl', lit(0))) \ .withColumn('cloud9', rf_local_equal('scl', lit(9))) \ .withColumn('cirrus', rf_local_equal('scl', lit(10))) -df_mask = mask_part.withColumn('mask', rf_local_add('nodata', 'defect')) \ +df_mask_inv = mask_part.withColumn('mask', rf_local_add('nodata', 'defect')) \ .withColumn('mask', rf_local_add('mask', 'cloud8')) \ .withColumn('mask', rf_local_add('mask', 'cloud9')) \ .withColumn('mask', rf_local_add('mask', 'cirrus')) \ .drop('nodata', 'defect', 'cloud8', 'cloud9', 'cirrus') +# at this point the mask contains 0 for good cells and 1 for defect, etc +# convert cell type and set value 1 to NoData +df_mask = df_mask_inv.withColumn('mask', + rf_with_no_data(rf_convert_cell_type('mask', 'uint8'), 1.0) +) df_mask.printSchema() ``` @@ -113,23 +124,22 @@ from pyspark.ml.evaluation import MulticlassClassificationEvaluator from pyspark.ml import Pipeline ``` -SparkML requires that each observation be in its own row, and those observations be packed into a single [`Vector`](https://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.linalg) object. The first step is to "explode" the tiles into a single row per cell/pixel with the `TileExploder` (see also @ref:[`rf_explode_tiles`](reference.md#rf_explode_tiles)). Then we filter out any rows that have `NoData` values (which will cause an error during training). Finally we use the SparkML `VectorAssembler` to create that `Vector`. +SparkML requires that each observation be in its own row, and those observations be packed into a single [`Vector`](https://spark.apache.org/docs/latest/api/python/pyspark.ml.html#module-pyspark.ml.linalg) object. The first step is to "explode" the tiles into a single row per cell or pixel with the `TileExploder` (see also @ref:[`rf_explode_tiles`](reference.md#rf_explode_tiles)). If a _tile_ cell contains a NoData it will become a null value after the exploder stage. Then we filter out any rows that missing or null values, which will cause an error during training. Finally we use the SparkML `VectorAssembler` to create that `Vector`. -It is worth discussing a couple of interesting things about the `NoDataFilter`. First we filter by the mask column. This achieves the filtering of observations only to the good pixels, without having to explicitly mask and assign NoData in all eleven columns of raster data. The other column specified is the `label` column. When it is time to score the model, the pipeline will ignore the fact that there is no `label` column on the input DataFrame. +It is worth discussing a couple of interesting things about the `NoDataFilter`. First, we filter out missing values in the mask column. Recall above we set undesirable pixels to NoData, so they will be removed at this stage. The other column for the `NoDataFilter` is the `label` column. When it is time to score the model, the pipeline will ignore the fact that there is no `label` column on the input DataFrame. ```python, transformers exploder = TileExploder() noDataFilter = NoDataFilter() \ - .setInputCols(cols + ['label', 'mask']) + .setInputCols(['label', 'mask']) assembler = VectorAssembler() \ .setInputCols(bands) \ .setOutputCol("features") ``` -We are going to use a decision tree for classification. You can swap out one of the other multi-class -classification algorithms if you like. With the algorithm selected we can assemble our modeling pipeline. +We are going to use a decision tree for classification. You can swap out one of the other multi-class classification algorithms if you like. With the algorithm selected we can assemble our modeling pipeline. ```python, pipeline classifier = DecisionTreeClassifier() \ @@ -144,7 +154,7 @@ pipeline.getStages() ## Train the Model -Push the "go button"! This will actually run each step of the Pipeline we created including fitting the decision tree model. +Push the "go button"! This will actually run each step of the Pipeline we created including fitting the decision tree model. We filter the dataframe for only tiles intersecting the label raster, because the label shapes are relatively sparse over the imagery. It would be logically equivalent to either include or exclude this, but it is more efficient to do this filter because it will mean less data going into the pipeline. ```python, train model = pipeline.fit(df_mask.filter(rf_tile_sum('label') > 0).cache()) @@ -152,7 +162,7 @@ model = pipeline.fit(df_mask.filter(rf_tile_sum('label') > 0).cache()) ## Model Evaluation -To view the model's performance, we first call the pipeline's `transform` method on the training dataset. This transformed dataset will have the model's prediction included in each row. We next construct an evaluator and pass it the transformed dataset to easily compute the performance metric. We could also use a variety of DataFrame or SQL transformations to compute our metric if we like. +To view the model's performance, we first call the pipeline's `transform` method on the training dataset. This transformed dataset will have the model's prediction included in each row. We next construct an evaluator and pass it the transformed dataset to easily compute the performance metric. We can also create custom metrics using a variety of DataFrame or SQL transformations. ```python eval prediction_df = model.transform(df_mask) \ @@ -168,7 +178,7 @@ accuracy = eval.evaluate(prediction_df) print("\nAccuracy:", accuracy) ``` -As an example of using the flexibility provided by DataFrames, the code below computes and displays the confusion matrix. +As an example of using the flexibility provided by DataFrames, the code below computes and displays the confusion matrix. The categories down the rows are the predictions, and the truth labels are across the columns. ```python confusion_mtrx prediction_df.groupBy(classifier.getPredictionCol()) \ @@ -182,10 +192,15 @@ prediction_df.groupBy(classifier.getPredictionCol()) \ Because the pipeline included a `TileExploder`, we will recreate the tiled data structure. The explosion transformation includes metadata enabling us to recreate the _tiles_. See the @ref:[`rf_assemble_tile`](reference.md#rf-assemble-tile) function documentation for more details. In this case, the pipeline is scoring on all areas, regardless of whether they intersect the label polygons. This is simply done by removing the `label` column, as @ref:[discussed above](supervised-learning.md#create-ml-pipeline). ```python assemble_prediction -scored = model.transform(df_mask.drop('label')).createOrReplaceTempView('scored') +scored = model.transform(df_mask.drop('label')) +scored.createOrReplaceTempView('scored') retiled = spark.sql(""" -SELECT extent, crs, rf_assemble_tile(column_index, row_index, prediction, 128, 128) as prediction +SELECT extent, crs, + rf_assemble_tile(column_index, row_index, prediction, 128, 128) as prediction, + rf_assemble_tile(column_index, row_index, B04, 128, 128) as red, + rf_assemble_tile(column_index, row_index, B03, 128, 128) as grn, + rf_assemble_tile(column_index, row_index, B02, 128, 128) as blu, FROM scored GROUP BY extent, crs """) @@ -193,13 +208,24 @@ GROUP BY extent, crs retiled.printSchema() ``` -Take a look at a sample of the resulting output. Recall the label coding: 1 is forest (purple), 2 is cropland (green) and 3 is developed areas(yellow). +Take a look at a sample of the resulting output and the corresponding area's red-green-blue composite image. -```python display_prediction -display( - retiled.select('prediction') \ +```python display_rgb +sample = retiled.select('prediction', 'red', 'grn', 'blu') \ .sort(-rf_tile_sum(rf_local_equal('prediction', lit(3.0)))) \ - .first()['prediction'] -) + .first() + +sample_prediction = sample['prediction'] + +red = sample['red'].cells +grn = sample['grn'].cells +blu = sample['blu'].cells +sample_rgb = np.concatenate([red[ :, :, None], grn[:, :, None] , blu[ :, :, None]], axis=2) +np.imshow(sample_rgb) ``` +Recall the label coding: 1 is forest (purple), 2 is cropland (green) and 3 is developed areas(yellow). + +```python display_prediction +display(sample_prediction) +``` From e62ef2edde809c63f5c0a9daa2f494ed12d8363f Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Sat, 27 Jul 2019 16:15:13 -0400 Subject: [PATCH 263/380] Remove dupe of test l8 label geojson, not needed Signed-off-by: Jason T. Brown --- .../src/test/resources/L8-Labels-Elkton-VA.geojson | 9 --------- 1 file changed, 9 deletions(-) delete mode 100644 pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson diff --git a/pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson b/pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson deleted file mode 100644 index 076158b56..000000000 --- a/pyrasterframes/src/test/resources/L8-Labels-Elkton-VA.geojson +++ /dev/null @@ -1,9 +0,0 @@ -{ -"type": "FeatureCollection", -"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } }, -"features": [ -{ "type": "Feature", "properties": { "id": 0 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.638383330417554, 38.391061314584398 ], [ -78.637172448825936, 38.395449766458547 ], [ -78.629215101908301, 38.396549823989744 ], [ -78.630786820138638, 38.392028667955493 ], [ -78.634228219464887, 38.390206983429579 ], [ -78.638383330417554, 38.391061314584398 ] ] ] } }, -{ "type": "Feature", "properties": { "id": 1 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.625973620483947, 38.384086145975928 ], [ -78.619781683426993, 38.388373376437947 ], [ -78.613688820548219, 38.386918574305838 ], [ -78.611752103843472, 38.388980469097866 ], [ -78.612829995997004, 38.39138397517295 ], [ -78.604257166078241, 38.392259658270049 ], [ -78.609485512325875, 38.382139853466676 ], [ -78.625973620483947, 38.384086145975928 ] ] ] } }, -{ "type": "Feature", "properties": { "id": 2 }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -78.65213631116778, 38.386854807768536 ], [ -78.647983519633271, 38.385930966410982 ], [ -78.650653269705685, 38.383182700685978 ], [ -78.652397953903673, 38.384268357728601 ], [ -78.65213631116778, 38.386854807768536 ] ] ] } } -] -} From 617053543e7e1ff27d537aaf026e20b0ac8ee958 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 29 Jul 2019 10:03:13 -0400 Subject: [PATCH 264/380] Fix image rendering in the supervised ML docs Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/supervised-learning.pymd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/supervised-learning.pymd b/pyrasterframes/src/main/python/docs/supervised-learning.pymd index c7ffaca75..a13b39b7b 100644 --- a/pyrasterframes/src/main/python/docs/supervised-learning.pymd +++ b/pyrasterframes/src/main/python/docs/supervised-learning.pymd @@ -200,7 +200,7 @@ SELECT extent, crs, rf_assemble_tile(column_index, row_index, prediction, 128, 128) as prediction, rf_assemble_tile(column_index, row_index, B04, 128, 128) as red, rf_assemble_tile(column_index, row_index, B03, 128, 128) as grn, - rf_assemble_tile(column_index, row_index, B02, 128, 128) as blu, + rf_assemble_tile(column_index, row_index, B02, 128, 128) as blu FROM scored GROUP BY extent, crs """) @@ -221,7 +221,8 @@ red = sample['red'].cells grn = sample['grn'].cells blu = sample['blu'].cells sample_rgb = np.concatenate([red[ :, :, None], grn[:, :, None] , blu[ :, :, None]], axis=2) -np.imshow(sample_rgb) +mins = np.nanmin(sample_rgb, axis=(0,1)) +plt.imshow((sample_rgb - mins)/ (np.nanmax(sample_rgb, axis=(0,1)) - mins)) ``` Recall the label coding: 1 is forest (purple), 2 is cropland (green) and 3 is developed areas(yellow). From 7f71409fb2e82a5d95ac46af2df52fa98fb15c81 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 29 Jul 2019 13:03:48 -0400 Subject: [PATCH 265/380] Expanded the TOC to include machine learning usbsections --- build.sbt | 1 + pyrasterframes/src/main/python/docs/machine-learning.md | 7 +++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/build.sbt b/build.sbt index 6ffcffa4e..365ccb73f 100644 --- a/build.sbt +++ b/build.sbt @@ -139,6 +139,7 @@ lazy val docs = project "version" -> version.value, "scaladoc.org.apache.spark.sql.rf" -> "http://rasterframes.io/latest" ), + paradoxNavigationExpandDepth := Some(3), paradoxTheme := Some(builtinParadoxTheme("generic")), makeSite := makeSite.dependsOn(Compile / unidoc).dependsOn(Compile / paradox).value, Compile / paradox / sourceDirectories += (pyrasterframes / Python / doc / target).value, diff --git a/pyrasterframes/src/main/python/docs/machine-learning.md b/pyrasterframes/src/main/python/docs/machine-learning.md index 075454ba6..aadebde8e 100644 --- a/pyrasterframes/src/main/python/docs/machine-learning.md +++ b/pyrasterframes/src/main/python/docs/machine-learning.md @@ -6,7 +6,10 @@ The following sections provide some examples on how to integrate these workflows @@@ index -* @ref:[Unsupervised Machine Learning](unsupervised-learning.md) -* @ref:[Supervised Machine Learning](supervised-learning.md) +* [Unsupervised Machine Learning](unsupervised-learning.md) +* [Supervised Machine Learning](supervised-learning.md) @@@ + + +@@toc { depth=2 } \ No newline at end of file From fca70aa5bce8309e5dc4d8f5394aeb06373720b2 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 23 Jul 2019 09:37:11 -0400 Subject: [PATCH 266/380] Fixes to TravisCI build to handle pinning of Python and Java version to support PySpark. --- .travis.yml | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/.travis.yml b/.travis.yml index 81febf1a2..9f876fb9e 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,9 @@ sudo: false dist: xenial -language: scala +language: python + +python: + - "3.7" cache: directories: @@ -11,30 +14,24 @@ cache: scala: - 2.11.11 -jdk: - - openjdk8 - -python: - - "3.7" +env: + - COURSIER_VERBOSITY=-1 JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64 addons: apt: packages: + - openjdk-8-jdk - pandoc - - python-pip install: - - pip install setuptools - -sbt_args: -no-colors + - pip install --user rasterio shapely pandas numpy + - wget -O - https://piccolo.link/sbt-1.2.8.tgz | tar xzf - script: - - sbt test - - sbt it:test + - sbt/bin/sbt -java-home $JAVA_HOME -batch test + - sbt/bin/sbt -java-home $JAVA_HOME -batch it:test # - sbt -Dfile.encoding=UTF8 clean coverage test coverageReport # Tricks to avoid unnecessary cache updates - find $HOME/.sbt -name "*.lock" | xargs rm - find $HOME/.ivy2 -name "ivydata-*.properties" | xargs rm -#after_success: -# - bash <(curl -s https://codecov.io/bash) \ No newline at end of file From 4aef6eababd3aafcc9344824000816a8273ca4f4 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 30 Jul 2019 08:45:28 -0400 Subject: [PATCH 267/380] pip '--user' not available in virtualenv. --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 9f876fb9e..9df6d0290 100644 --- a/.travis.yml +++ b/.travis.yml @@ -24,7 +24,7 @@ addons: - pandoc install: - - pip install --user rasterio shapely pandas numpy + - pip install rasterio shapely pandas numpy - wget -O - https://piccolo.link/sbt-1.2.8.tgz | tar xzf - script: From 430468f1bd95a71243d6260ff2af9141686e1b6b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 30 Jul 2019 11:09:52 -0400 Subject: [PATCH 268/380] Added "concepts" page. --- .../src/main/python/docs/architecture.md | 37 ----------- .../src/main/python/docs/concepts.md | 62 +++++++++++++++++++ .../src/main/python/docs/description.md | 26 +++++++- pyrasterframes/src/main/python/docs/index.md | 8 ++- .../src/main/python/docs/languages.md | 2 + .../src/main/python/docs/nodata-handling.pymd | 2 +- .../src/main/python/docs/numpy-pandas.pymd | 2 +- .../src/main/python/docs/raster-processing.md | 2 + 8 files changed, 97 insertions(+), 44 deletions(-) delete mode 100644 pyrasterframes/src/main/python/docs/architecture.md create mode 100644 pyrasterframes/src/main/python/docs/concepts.md create mode 100644 pyrasterframes/src/main/python/docs/languages.md diff --git a/pyrasterframes/src/main/python/docs/architecture.md b/pyrasterframes/src/main/python/docs/architecture.md deleted file mode 100644 index d8650689e..000000000 --- a/pyrasterframes/src/main/python/docs/architecture.md +++ /dev/null @@ -1,37 +0,0 @@ -# Architecture - -RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO operations. It does this with the help of several other LocationTech projects: -[GeoTrellis](https://geotrellis.io/), [GeoMesa](https://www.geomesa.org/), -[JTS](https://github.com/locationtech/jts), and -[SFCurve](https://github.com/locationtech/sfcurve) (see below). - -![LocationTech Stack](static/rasterframes-locationtech-stack.png) - - -## Concepts - -> * Cell -> * Cell Type -> * Tile -> * Extent -> * Coordinate Reference System (CRS) -> * Projected Extent -> * Projected Raster -> * Layer - -RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. - -![RasterFrame Anatomy](static/rasterframe-anatomy.png) - -Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. - -> TODO: Update to match components in raster-io.md - -![RasterFrame Data Sources](static/rasterframes-data-sources.png) - - -[R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame -[Pandas]:https://pandas.pydata.org/ -[GeoJSON]:https://en.wikipedia.org/wiki/GeoJSON -[GTLayer]:https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html#layouts-and-tile-layers -[PDS]:https://registry.opendata.aws/modis/ diff --git a/pyrasterframes/src/main/python/docs/concepts.md b/pyrasterframes/src/main/python/docs/concepts.md new file mode 100644 index 000000000..19537376a --- /dev/null +++ b/pyrasterframes/src/main/python/docs/concepts.md @@ -0,0 +1,62 @@ +# Concepts + +There are a number of EO concepts that crop up in the discussion of RasterFrames features. We'll cover these briefly in the sections below. However, here are a few links providing a more extensive introduction to working with Earth observation data. + +* [_Fundamentals of Remote Sensing_](https://www.nrcan.gc.ca/maps-tools-and-publications/satellite-imagery-and-air-photos/tutorial-fundamentals-remote-sensing/9309) +* [_Newcomers Earth Observation Guide_](https://business.esa.int/newcomers-earth-observation-guide) +* [_Earth Observation Markets and Applications_](https://www.ofcom.org.uk/__data/assets/pdf_file/0021/82047/introduction_eo_for_ofcom_june_2015_no_video.pdf) + +## Cell + +A cell is a single sample from a sensor encoded as a scalar value asssociated with a specific spatiotemporal location and time. It can be thought of as an image pixel associated with a place and time. + +## Cell Type + +A numeric cell value may be encoded in a number of different computer numeric formats. There are typically three characteristics used to describe a cell type: +* word size (bit-width) +* signed vs unsigned +* integral vs floating-point + + +The cell types most frequent in RasterFrames are as follows: + +| Name | Abbreviation | Description | Range | +| --- | --- | --- | --- | +| Byte | `int8` | Signed 8-bit integral | -128 to 127 | +| Unsigned Byte | `uint8` | Unsigned 8-bit integral | 0 to 255 | +| Short | `int16` | Signed 16-bit integral | -32,768 to 32,767 | +| Unsigned Short | `uint16` | Unsigned 16-bit integral | 0 to 65,535 | +| Int | `int32` | Signed 32-bit integral | -2,147,483,648 to 2,147,483,647 | +| Unsigned Int | `uint32` | Unsigned 32-bit integral | 0 to 4,294,967,295 | +| Float | `float32` | 32-bit floating-point | -3.4028235E38 to 3.4028235E38 | +| Double | `float64` | 64-bit floating-point | -1.7976931348623157E308 to 1.7976931348623157E308 | + +See the section on [“NoData” Handling](nodata-handling.md) for additional discussion on cell types. + +## NoData + +A "NoData" (or N/A) value is a specifically identified value for a cell type used to indicate the absence of data. See the section on @ref:[“NoData” Handling](nodata-handling.md) for additional discussion on NoData + +## Scene + +A scene (or granule) is a discrete instance of EO data with a specific extent (region), date-time, and projection/CRS. + +## Coordinate Reference System (CRS) + +A coordinate reference system (or spatial reference system) is a set of mathematical constructs used to map cells to specific locations on the Earth (or other surface). A CRS typcially accompanies any EO data so it can be precicely located. + +## Extent + +An extent (or bounding box) is a rectangular region specifying the geospatial coverage of a two-dimensional array of cells in a singular CRS. + +## Tile + +A tile (sometimes called a "chip") is a sub-region of a scene, usually square, usually with dimensions that are some power of 2. It is usually encoded as a two-dimensional array, or a a one-dimensional array with width/height dimensions. Tiles may be singleband or multiband (multi-channel). The tile is the primary discretization unit used in RasterFrames; the bands of a scene are separated into different columns, and the band's raster is carved up into tiles for each row. + +## Projected Extent + +An extent paired with a CRS + +## Projected Raster + +A tile or scene paired with a CRS and extent. diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md index 49df72744..64d6eba06 100644 --- a/pyrasterframes/src/main/python/docs/description.md +++ b/pyrasterframes/src/main/python/docs/description.md @@ -1,4 +1,8 @@ -# Description +# Overview + +RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. + +## Context We have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. @@ -8,7 +12,25 @@ RasterFrames®, an incubating Eclipse Foundation LocationTech project, brings to > Of the 1,738 operational satellites currently orbiting the earth (as of 9/[20]17), 596 are earth observation satellites and 477 of these are non-military assets (ie available to civil society including commercial entities and governments for earth observation, according to the Union of Concerned Scientists). This number is expected to increase significantly over the next ten years. The 200 or so planned remote sensing satellites have a value of over 27 billion USD (Forecast International). This estimate does not include the burgeoning fleets of smallsats as well as micro, nano and even smaller satellites... All this enthusiasm has, not unexpectedly, led to a veritable fire-hose of remotely sensed data which is becoming difficult to navigate even for seasoned experts. -RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is accessible to general analysts while handling the rapidly growing data footprint. +## Benefit + +By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. + + +## Architecture + +RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO operations. It does this with the help of several other LocationTech projects: +[GeoTrellis](https://geotrellis.io/), [GeoMesa](https://www.geomesa.org/), +[JTS](https://github.com/locationtech/jts), and +[SFCurve](https://github.com/locationtech/sfcurve) (see below). + +![LocationTech Stack](static/rasterframes-locationtech-stack.png) + +RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. + +![RasterFrame Anatomy](static/rasterframe-anatomy.png) + +Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. See @ref:[Raster Data I/O](raster-io.md) for details. [R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame [Pandas]:https://pandas.pydata.org/ diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index 4dbe19c47..5045d3c5a 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -38,13 +38,15 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi @@@ @@@ index -* [Description](description.md) +* [Overview](description.md) +* [Concepts](concepts.md) * [Getting Started](getting-started.md) +* [API Languages](languages.md) * [Raster Data I/O](raster-io.md) * [Vector Data](vector-data.md) * [Raster Processing](raster-processing.md) -* [Numpy, Pandas, & RasterFrames](numpy-pandas.md) -* [UDF Reference](reference.md) +* [Numpy and Pandas](numpy-pandas.md) +* [Function Reference](reference.md) * [Release Notes](release-notes.md) @@@ diff --git a/pyrasterframes/src/main/python/docs/languages.md b/pyrasterframes/src/main/python/docs/languages.md new file mode 100644 index 000000000..25fb55909 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/languages.md @@ -0,0 +1,2 @@ +# API Languages + diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index d9ef1feb5..4689f306d 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -2,7 +2,7 @@ ## What is NoData? -In raster operations, the preservation and correct processing of missing observations is very important. In [most dataframes and scientific computing](https://www.oreilly.com/learning/handling-missing-data), the idea of missing data is expressed as a null or NaN value. A great deal of raster data is stored for space efficiency. This typically leads to use of integral values and a "sentinel" value to represent missing observations. This sentinel value varies across data products and is usually called the NoData value. +In raster operations, the preservation and correct processing of missing observations is very important. In [most dataframes and scientific computing](https://www.oreilly.com/learning/handling-missing-data), the idea of missing data is expressed as a `null` or `NaN` value. A great deal of raster data is stored for space efficiency. This typically leads to use of integral values and a "sentinel" value to represent missing observations. This sentinel value varies across data products and is usually called the "NoData" value. RasterFrames provides a variety of functions to inspect and manage NoData within `tile`s. diff --git a/pyrasterframes/src/main/python/docs/numpy-pandas.pymd b/pyrasterframes/src/main/python/docs/numpy-pandas.pymd index 7bfde9356..7edd65802 100644 --- a/pyrasterframes/src/main/python/docs/numpy-pandas.pymd +++ b/pyrasterframes/src/main/python/docs/numpy-pandas.pymd @@ -1,4 +1,4 @@ -# NumPy and Pandas Interoperabilty +# NumPy and Pandas In the Python Spark API, the work of distributed computing over the DataFrame is done on many executors (the Spark term for workers) inside Java virual machines (JVM). Most calls to `pyspark` are passed to a Java process via the `py4j` library. The user can also ask for data inside the JVM to be brought over to the Python driver (the Spark term for the client application). When dealing with _tiles_, the driver will recieve this data a lightweight wrapper object around a NumPy ndarray. It is also possible to write lambda functions against NumPy arrays and evaluate them in the Spark DataFrame. diff --git a/pyrasterframes/src/main/python/docs/raster-processing.md b/pyrasterframes/src/main/python/docs/raster-processing.md index 2f236429b..a16b2bb7d 100644 --- a/pyrasterframes/src/main/python/docs/raster-processing.md +++ b/pyrasterframes/src/main/python/docs/raster-processing.md @@ -12,3 +12,5 @@ Explore what you can do with RasterFrames to work with, analyze, manipulate, and summarize Earth observation data. + +@@toc { depth=1 } \ No newline at end of file From aa67956b541c00e4e423ec4831fddec8f45f8859 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 30 Jul 2019 12:06:50 -0400 Subject: [PATCH 269/380] Fix python raster reader strict eval test condition Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/tests/PyRasterFramesTests.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index a3080b6a2..33b848368 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -714,7 +714,7 @@ def test_strict_eval(self): # again for strict df_strict = self.spark.read.raster(self.img_uri, lazy_tiles=False) show_str_strict = df_strict.select('proj_raster')._jdf.showString(1, -1, False) - self.assertTrue('RasterRef' not in show_str_lazy) + self.assertTrue('RasterRef' not in show_str_strict) def test_prt_functions(self): From f69227a12f07d51613ec5ad2fff5de5c2f65acf6 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 30 Jul 2019 13:27:52 -0400 Subject: [PATCH 270/380] Tighten up python Tile equality test for nodata/masked cells; fix test_matmul Signed-off-by: Jason T. Brown --- .../src/main/python/pyrasterframes/rf_types.py | 3 ++- .../src/main/python/tests/PyRasterFramesTests.py | 10 +++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py index ffe2aa925..3ce84b932 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rf_types.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rf_types.py @@ -295,7 +295,8 @@ def __init__(self, cells, cell_type=None): def __eq__(self, other): if type(other) is type(self): - return self.cell_type == other.cell_type and np.ma.allequal(self.cells, other.cells) + return self.cell_type == other.cell_type and \ + np.ma.allequal(self.cells, other.cells, fill_value=True) else: return False diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 33b848368..49529bd98 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -532,8 +532,6 @@ def less_pi(t): class TileOps(TestEnvironment): - from pyrasterframes.rf_types import Tile - def setUp(self): # convenience so we can assert around Tile() == Tile() self.t1 = Tile(np.array([[1, 2], @@ -589,9 +587,11 @@ def test_matmul(self): # r1 = self.t1 @ self.t2 r1 = self.t1.__matmul__(self.t2) - nd = r1.cell_type.no_data_value() - e1 = Tile(np.ma.masked_equal(np.array([[nd, 10], - [nd, nd]], dtype=r1.cell_type.to_numpy_dtype()), nd)) + # The behavior of np.matmul with masked arrays is not well documented + # it seems to treat the 2nd arg as if not a MaskedArray + e1 = Tile(np.matmul(self.t1.cells, self.t2.cells), r1.cell_type) + + self.assertTrue(r1 == e1, "{} was not equal to {}".format(r1, e1)) self.assertEqual(r1, e1) From eb0fbf5354a0766b595774d77eee6f1320cd540d Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 30 Jul 2019 14:19:07 -0400 Subject: [PATCH 271/380] Simplify python test_sql that has been failing on travis Signed-off-by: Jason T. Brown --- .../main/python/tests/PyRasterFramesTests.py | 39 ++++++++----------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index 49529bd98..f93383555 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -228,28 +228,23 @@ def test_aggregations(self): self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) def test_sql(self): - self.rf.createOrReplaceTempView("rf") - - dims = self.rf.withColumn('dims', rf_dimensions('tile')).first().dims - dims_str = """{}, {}""".format(dims.cols, dims.rows) - - self.spark.sql("""SELECT tile, rf_make_constant_tile(1, {}, 'uint16') AS One, - rf_make_constant_tile(2, {}, 'uint16') AS Two FROM rf""".format(dims_str, dims_str)) \ - .createOrReplaceTempView("r3") - - ops = self.spark.sql("""SELECT tile, rf_local_add(tile, One) AS AndOne, - rf_local_subtract(tile, One) AS LessOne, - rf_local_multiply(tile, Two) AS TimesTwo, - rf_local_divide(tile, Two) AS OverTwo - FROM r3""") - - # ops.printSchema - statsRow = ops.select(rf_tile_mean('tile').alias('base'), - rf_tile_mean("AndOne").alias('plus_one'), - rf_tile_mean("LessOne").alias('minus_one'), - rf_tile_mean("TimesTwo").alias('double'), - rf_tile_mean("OverTwo").alias('half')) \ - .first() + self.rf.createOrReplaceTempView("rf_test_sql") + + self.spark.sql("""SELECT tile, + rf_local_add(tile, 1) AS and_one, + rf_local_subtract(tile, 1) AS less_one, + rf_local_multiply(tile, 2) AS times_two, + rf_local_divide(tile, 2) AS over_two + FROM rf_test_sql""").createOrReplaceTempView('rf_test_sql_1') + + statsRow = self.spark.sql(""" + SELECT rf_tile_mean(tile) as base, + rf_tile_mean(and_one) as plus_one, + rf_tile_mean(less_one) as minus_one, + rf_tile_mean(times_two) as double, + rf_tile_mean(over_two) as half + FROM rf_test_sql_1 + """).first() self.assertTrue(self.rounded_compare(statsRow.base, statsRow.plus_one - 1)) self.assertTrue(self.rounded_compare(statsRow.base, statsRow.minus_one + 1)) From 767624bd68d53577d7274554dabc23c77215d681 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 30 Jul 2019 16:35:40 -0400 Subject: [PATCH 272/380] Changed ReprojectGeometry to accept either CRS struct or a StringType. --- .../expressions/DynamicExtractors.scala | 14 +- .../rasterframes/expressions/package.scala | 5 +- .../transformers/ReprojectGeometry.scala | 29 ++-- .../extensions/DataFrameMethods.scala | 6 +- .../rasterframes/functions/package.scala | 17 +- .../util/ZeroSevenCompatibilityKit.scala | 4 +- .../rasterframes/ReprojectGeometrySpec.scala | 129 +++++++++------- .../geotiff/GeoTiffDataSource.scala | 8 +- .../src/main/python/docs/languages.md | 2 - .../python/pyrasterframes/rasterfunctions.py | 14 +- pyrasterframes/src/main/python/setup.py | 4 +- .../main/python/tests/GeoTiffWriterTests.py | 1 + .../main/python/tests/PyRasterFramesTests.py | 118 +------------- .../src/main/python/tests/VectorTypesTests.py | 145 ++++++++++++++++++ .../rasterframes/py/PyRFContext.scala | 8 +- 15 files changed, 279 insertions(+), 225 deletions(-) delete mode 100644 pyrasterframes/src/main/python/docs/languages.md create mode 100644 pyrasterframes/src/main/python/tests/VectorTypesTests.py diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala index a7144a8f2..6a7e6e421 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/DynamicExtractors.scala @@ -21,13 +21,15 @@ package org.locationtech.rasterframes.expressions +import geotrellis.proj4.CRS import geotrellis.raster.{CellGrid, Tile} import org.apache.spark.sql.Row import org.apache.spark.sql.catalyst.InternalRow -import org.apache.spark.sql.rf.{TileUDT, RasterSourceUDT} +import org.apache.spark.sql.rf.{RasterSourceUDT, TileUDT} import org.apache.spark.sql.types._ +import org.apache.spark.unsafe.types.UTF8String import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.model.TileContext +import org.locationtech.rasterframes.model.{LazyCRS, TileContext} import org.locationtech.rasterframes.ref.{ProjectedRasterLike, RasterRef, RasterSource} import org.locationtech.rasterframes.tiles.ProjectedRasterTile @@ -77,6 +79,13 @@ object DynamicExtractors { (row: InternalRow) => row.to[ProjectedRasterTile] } + lazy val crsExtractor: PartialFunction[DataType, Any => CRS] = { + case _: StringType => + (v: Any) => LazyCRS(v.asInstanceOf[UTF8String].toString) + case t if t.conformsTo[CRS] => + (v: Any) => v.asInstanceOf[InternalRow].to[CRS] + } + sealed trait TileOrNumberArg sealed trait NumberArg extends TileOrNumberArg case class TileArg(tile: Tile, ctx: Option[TileContext]) extends TileOrNumberArg @@ -113,4 +122,5 @@ object DynamicExtractors { case c: Char => IntegerArg(c.toInt) } } + } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala index 776412e1c..8a8b70e00 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/package.scala @@ -127,9 +127,6 @@ package object expressions { registry.registerExpression[DebugRender.RenderAscii]("rf_render_ascii") registry.registerExpression[DebugRender.RenderMatrix]("rf_render_matrix") - - // TODO: Replace registration in `org.locationtech.rasterframes.functions.register` - // TODO: with this once String columns are supported as well. - // registry.registerExpression[transformers.ReprojectGeometry]("st_reproject") + registry.registerExpression[transformers.ReprojectGeometry]("st_reproject") } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala index 89ad88fae..9c1ab2234 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/transformers/ReprojectGeometry.scala @@ -27,12 +27,14 @@ import org.locationtech.rasterframes.encoders.serialized_literal import org.locationtech.jts.geom.Geometry import geotrellis.proj4.CRS import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.analysis.TypeCheckResult +import org.apache.spark.sql.catalyst.analysis.TypeCheckResult.TypeCheckFailure import org.apache.spark.sql.catalyst.expressions._ import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback -import org.apache.spark.sql.jts.JTSTypes +import org.apache.spark.sql.jts.{AbstractGeometryUDT, JTSTypes} import org.apache.spark.sql.types.DataType import org.apache.spark.sql.{Column, TypedColumn} -import org.locationtech.rasterframes.encoders.CatalystSerializer +import org.locationtech.rasterframes.expressions.DynamicExtractors import org.locationtech.rasterframes.jts.ReprojectionTransformer import org.locationtech.rasterframes.model.LazyCRS @@ -49,19 +51,22 @@ import org.locationtech.rasterframes.model.LazyCRS ...""" ) case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: Expression) extends Expression - with CodegenFallback with ExpectsInputTypes { - - // TODO: Replace registration in `org.locationtech.rasterframes.functions.register` - // TODO: with proper Expression supporting String columns as well. + with CodegenFallback { override def nodeName: String = "st_reproject" override def dataType: DataType = JTSTypes.GeometryTypeInstance override def nullable: Boolean = geometry.nullable || srcCRS.nullable || dstCRS.nullable override def children: Seq[Expression] = Seq(geometry, srcCRS, dstCRS) - private def crsSerde = CatalystSerializer[CRS] - override val inputTypes = Seq( - dataType, crsSerde.schema, crsSerde.schema - ) + + override def checkInputDataTypes(): TypeCheckResult = { + if (!geometry.dataType.isInstanceOf[AbstractGeometryUDT[_]]) + TypeCheckFailure(s"Input type '${geometry.dataType}' does not conform to a geometry type.") + else if(!DynamicExtractors.crsExtractor.isDefinedAt(srcCRS.dataType)) + TypeCheckFailure(s"Input type '${srcCRS.dataType}' cannot be interpreted as a CRS.") + else if(!DynamicExtractors.crsExtractor.isDefinedAt(dstCRS.dataType)) + TypeCheckFailure(s"Input type '${dstCRS.dataType}' cannot be interpreted as a CRS.") + else TypeCheckResult.TypeCheckSuccess + } /** Reprojects a geometry column from one CRS to another. */ val reproject: (Geometry, CRS, CRS) ⇒ Geometry = @@ -71,8 +76,8 @@ case class ReprojectGeometry(geometry: Expression, srcCRS: Expression, dstCRS: E } override def eval(input: InternalRow): Any = { - val src = srcCRS.eval(input).asInstanceOf[InternalRow].to[CRS] - val dst = dstCRS.eval(input).asInstanceOf[InternalRow].to[CRS] + val src = DynamicExtractors.crsExtractor(srcCRS.dataType)(srcCRS.eval(input)) + val dst = DynamicExtractors.crsExtractor(dstCRS.dataType)(dstCRS.eval(input)) (src, dst) match { // Optimized pass-through case. case (s: LazyCRS, r: LazyCRS) if s.encoded == r.encoded => geometry.eval(input) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 3735eef37..1e94ff3ca 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -22,22 +22,20 @@ package org.locationtech.rasterframes.extensions import geotrellis.proj4.CRS -import geotrellis.raster.{MultibandTile, Tile} import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} import geotrellis.util.MethodExtensions -import geotrellis.vector.{Extent, ProjectedExtent} -import org.apache.spark.rdd.RDD +import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.expressions.Attribute import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} -import org.locationtech.rasterframes.{MetadataKeys, RasterFrameLayer} import org.locationtech.rasterframes.StandardColumns._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.StandardEncoders._ import org.locationtech.rasterframes.expressions.DynamicExtractors import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.{MetadataKeys, RasterFrameLayer} import spray.json.JsonFormat import scala.util.Try diff --git a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala index 51c78a34b..87894188a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/functions/package.scala @@ -20,15 +20,14 @@ */ package org.locationtech.rasterframes import geotrellis.proj4.CRS -import geotrellis.raster.{Tile, _} import geotrellis.raster.reproject.Reproject +import geotrellis.raster.{Tile, _} import geotrellis.vector.Extent import org.apache.spark.sql.functions.udf import org.apache.spark.sql.{Row, SQLContext} import org.locationtech.jts.geom.Geometry import org.locationtech.rasterframes.encoders.CatalystSerializer._ -import org.locationtech.rasterframes.jts.ReprojectionTransformer -import org.locationtech.rasterframes.model.{LazyCRS, TileDimensions} +import org.locationtech.rasterframes.model.TileDimensions /** * Module utils. @@ -167,24 +166,12 @@ package object functions { } } - /** Reporjects a geometry column from one CRS to another, where CRS are defined in Proj4 format. */ - private[rasterframes] val reprojectGeometryCRSName: (Geometry, String, String) ⇒ Geometry = - (sourceGeom, srcName, dstName) ⇒ { - val src = LazyCRS(srcName) - val dst = LazyCRS(dstName) - val trans = new ReprojectionTransformer(src, dst) - trans.transform(sourceGeom) - } - def register(sqlContext: SQLContext): Unit = { sqlContext.udf.register("rf_make_constant_tile", makeConstantTile) sqlContext.udf.register("rf_make_zeros_tile", tileZeros) sqlContext.udf.register("rf_make_ones_tile", tileOnes) - sqlContext.udf.register("rf_cell_types", cellTypes) sqlContext.udf.register("rf_rasterize", rasterize) - // TODO: replace this with full ReprojectGeometry with String handling. - sqlContext.udf.register("st_reproject", reprojectGeometryCRSName) sqlContext.udf.register("rf_array_to_tile", arrayToTile) } } diff --git a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala index d937dd290..5826ad09a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/util/ZeroSevenCompatibilityKit.scala @@ -324,6 +324,8 @@ object ZeroSevenCompatibilityKit { def ub[A, B](f: A => B)(a: Seq[A]): B = f(a.head) /** Binary expression builder builder. */ def bb[A, B](f: (A, A) => B)(a: Seq[A]): B = f(a.head, a.last) + /** Trinary expression builder builder. */ + def tb[A, B](f: (A, A, A) => B)(a: Seq[A]): B = f(a.head, a.tail.head, a.last) // Expression-oriented functions have a different registration scheme // Currently have to register with the `builtin` registry due to Spark data hiding. @@ -361,11 +363,11 @@ object ZeroSevenCompatibilityKit { registry.registerFunc("rf_localAggMin", ub(LocalTileOpAggregate.LocalMinUDAF.apply)) registry.registerFunc("rf_localAggCount", ub(LocalCountAggregate.LocalDataCellsUDAF.apply)) registry.registerFunc("rf_localAggMean", ub(LocalMeanAggregate.apply)) + registry.registerFunc("rf_reprojectGeometry", tb(ReprojectGeometry.apply)) sqlContext.udf.register("rf_makeConstantTile", F.makeConstantTile) sqlContext.udf.register("rf_tileZeros", F.tileZeros) sqlContext.udf.register("rf_tileOnes", F.tileOnes) sqlContext.udf.register("rf_cellTypes", F.cellTypes) - sqlContext.udf.register("rf_reprojectGeometry", F.reprojectGeometryCRSName) } } diff --git a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index 46805a441..2c5d801d0 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -24,75 +24,98 @@ package org.locationtech.rasterframes import geotrellis.proj4.{CRS, LatLng, Sinusoidal, WebMercator} import org.apache.spark.sql.Encoders import org.locationtech.jts.geom._ -import org.scalatest.{FunSpec, Matchers} /** * Test for geometry reprojection. * * @since 11/29/18 */ -class ReprojectGeometrySpec extends FunSpec - with TestEnvironment with Matchers { - import spark.implicits._ +class ReprojectGeometrySpec extends TestEnvironment { + // Note: Test data copied from ReprojectSpec in GeoTrellis + val fact = new GeometryFactory() + val latLng: Geometry = fact.createLineString(Array( + new Coordinate(-111.09374999999999, 34.784483415461345), + new Coordinate(-111.09374999999999, 43.29919735147067), + new Coordinate(-75.322265625, 43.29919735147067), + new Coordinate(-75.322265625, 34.784483415461345), + new Coordinate(-111.09374999999999, 34.784483415461345) + )) + + val webMercator: Geometry = fact.createLineString(Array( + new Coordinate(-12366899.680315234, 4134631.734001753), + new Coordinate(-12366899.680315234, 5357624.186564572), + new Coordinate(-8384836.254770693, 5357624.186564572), + new Coordinate(-8384836.254770693, 4134631.734001753), + new Coordinate(-12366899.680315234, 4134631.734001753) + )) describe("Geometry reprojection") { - it("should allow reprojection geometry") { - // Note: Test data copied from ReprojectSpec in GeoTrellis - val fact = new GeometryFactory() - val latLng: Geometry = fact.createLineString(Array( - new Coordinate(-111.09374999999999, 34.784483415461345), - new Coordinate(-111.09374999999999, 43.29919735147067), - new Coordinate(-75.322265625, 43.29919735147067), - new Coordinate(-75.322265625, 34.784483415461345), - new Coordinate(-111.09374999999999, 34.784483415461345) - )) - - val webMercator: Geometry = fact.createLineString(Array( - new Coordinate(-12366899.680315234, 4134631.734001753), - new Coordinate(-12366899.680315234, 5357624.186564572), - new Coordinate(-8384836.254770693, 5357624.186564572), - new Coordinate(-8384836.254770693, 4134631.734001753), - new Coordinate(-12366899.680315234, 4134631.734001753) - )) - - withClue("both literal crs") { - - val df = Seq((latLng, webMercator)).toDF("ll", "wm") - - val rp = df.select( - st_reproject($"ll", LatLng, WebMercator) as "wm2", - st_reproject($"wm", WebMercator, LatLng) as "ll2", - st_reproject(st_reproject($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" - ).as[(Geometry, Geometry, Geometry)] - - - val (wm2, ll2, wm3) = rp.first() - - wm2 should matchGeom(webMercator, 0.00001) - ll2 should matchGeom(latLng, 0.00001) - wm3 should matchGeom(webMercator, 0.00001) - } + import spark.implicits._ + + it("should handle two literal CRSs") { + + val df = Seq((latLng, webMercator)).toDF("ll", "wm") + + val rp = df.select( + st_reproject($"ll", LatLng, WebMercator) as "wm2", + st_reproject($"wm", WebMercator, LatLng) as "ll2", + st_reproject(st_reproject($"ll", LatLng, Sinusoidal), Sinusoidal, WebMercator) as "wm3" + ).as[(Geometry, Geometry, Geometry)] + + + val (wm2, ll2, wm3) = rp.first() + + wm2 should matchGeom(webMercator, 0.00001) + ll2 should matchGeom(latLng, 0.00001) + wm3 should matchGeom(webMercator, 0.00001) + } - withClue("one literal crs") { - implicit val enc = Encoders.tuple(jtsGeometryEncoder, jtsGeometryEncoder, crsEncoder) + it("should handle one literal crs") { + implicit val enc = Encoders.tuple(jtsGeometryEncoder, jtsGeometryEncoder, crsEncoder) + val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") - val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") + val rp = df.select( + st_reproject($"ll", $"llCRS", WebMercator) as "wm2", + st_reproject($"wm", WebMercator, $"llCRS") as "ll2", + st_reproject(st_reproject($"ll", $"llCRS", Sinusoidal), Sinusoidal, WebMercator) as "wm3" + ).as[(Geometry, Geometry, Geometry)] - val rp = df.select( - st_reproject($"ll", $"llCRS", WebMercator) as "wm2", - st_reproject($"wm", WebMercator, $"llCRS") as "ll2", - st_reproject(st_reproject($"ll", $"llCRS", Sinusoidal), Sinusoidal, WebMercator) as "wm3" - ).as[(Geometry, Geometry, Geometry)] + val (wm2, ll2, wm3) = rp.first() - val (wm2, ll2, wm3) = rp.first() + wm2 should matchGeom(webMercator, 0.00001) + ll2 should matchGeom(latLng, 0.00001) + wm3 should matchGeom(webMercator, 0.00001) + } - wm2 should matchGeom(webMercator, 0.00001) - ll2 should matchGeom(latLng, 0.00001) - wm3 should matchGeom(webMercator, 0.00001) + it("should accept other geometry types") { + val df = Seq(1, 2, 3).toDF("id") + noException shouldBe thrownBy { + df.select(st_reproject(st_makePoint($"id", $"id"), WebMercator, Sinusoidal)).count() } } - } + it("should work in SQL") { + implicit val enc = Encoders.tuple(jtsGeometryEncoder, jtsGeometryEncoder, crsEncoder) + val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") + df.createOrReplaceTempView("geom") + + val rp = spark.sql( + """ + | SELECT st_reproject(ll, llCRS, 'EPSG:3857') as wm2, + | st_reproject(wm, 'EPSG:3857', llCRS) as ll2, + | st_reproject(st_reproject(ll, llCRS, '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs'), '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs', 'EPSG:3857') as wm3 + | FROM geom + """.stripMargin).as[(Geometry, Geometry, Geometry)] + + val (wm2, ll2, wm3) = rp.first() + + wm2 should matchGeom(webMercator, 0.00001) + ll2 should matchGeom(latLng, 0.00001) + wm3 should matchGeom(webMercator, 0.00001) + + checkDocs("st_reproject") + } + } } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 1b639a1f5..92640654f 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -24,19 +24,17 @@ package org.locationtech.rasterframes.datasource.geotiff import java.net.URI import _root_.geotrellis.proj4.CRS +import _root_.geotrellis.raster._ import _root_.geotrellis.raster.io.geotiff.compression._ import _root_.geotrellis.raster.io.geotiff.tags.codes.ColorSpace import _root_.geotrellis.raster.io.geotiff.{GeoTiffOptions, MultibandGeoTiff, Tags, Tiled} -import _root_.geotrellis.raster._ import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ -import org.apache.spark.sql.rf.TileUDT +import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource._ -import org.locationtech.rasterframes.expressions.aggregates.{ProjectedLayerMetadataAggregate, TileRasterizerAggregate} import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition +import org.locationtech.rasterframes.expressions.aggregates.{ProjectedLayerMetadataAggregate, TileRasterizerAggregate} import org.locationtech.rasterframes.model.{LazyCRS, TileDimensions} import org.locationtech.rasterframes.util._ diff --git a/pyrasterframes/src/main/python/docs/languages.md b/pyrasterframes/src/main/python/docs/languages.md deleted file mode 100644 index 25fb55909..000000000 --- a/pyrasterframes/src/main/python/docs/languages.md +++ /dev/null @@ -1,2 +0,0 @@ -# API Languages - diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index e342842d9..74d48369d 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -91,12 +91,10 @@ def rf_rasterize(geometry_col, bounds_col, value_col, num_cols, num_rows): num_rows)) -def st_reproject(geometry_col, src_crs_name, dst_crs_name): - """Reproject a column of geometry given the CRS names of the source and destination. - Currently supported registries are EPSG, ESRI, WORLD, NAD83, & NAD27. - An example of a valid CRS name is EPSG:3005.""" +def st_reproject(geometry_col, src_crs, dst_crs): + """Reproject a column of geometry given the CRSs of the source and destination.""" jfcn = RFContext.active().lookup('st_reproject') - return Column(jfcn(_to_java_column(geometry_col), src_crs_name, dst_crs_name)) + return Column(jfcn(_to_java_column(geometry_col), _to_java_column(src_crs), _to_java_column(dst_crs))) def rf_explode_tiles(*tile_cols): @@ -514,6 +512,12 @@ def rf_crs(tile_col): return _apply_column_function('rf_crs', tile_col) +def rf_mk_crs(crs_text): + """Resolve CRS from text identifier. Supported registries are EPSG, ESRI, WORLD, NAD83, & NAD27. + An example of a valid CRS name is EPSG:3005.""" + return Column(_context_call('_make_crs_literal', crs_text)) + + def st_extent(geom_col): """Compute the extent/bbox of a Geometry (a tile with embedded extent and CRS)""" return _apply_column_function('st_extent', geom_col) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index a4811824b..a76031b6b 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -90,10 +90,12 @@ def run(self): print(traceback.format_exc()) exit(1) + class PweaveNotebooks(PweaveDocs): def doctype(self): return "notebook" + setup( name='pyrasterframes', description='Access and process geospatial raster data in PySpark DataFrames', @@ -134,7 +136,7 @@ def doctype(self): 'pytest==3.4.2', 'pypandoc', 'numpy>=1.7', - 'shapley', + 'shapely', 'pandas', 'rasterio' ], diff --git a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py index 135d88a88..6c4f21b2a 100644 --- a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py +++ b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py @@ -61,3 +61,4 @@ def test_downsampled_write(self): self.assertEqual((f.width, f.height), (128, 128)) os.remove(dest) + diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index ccdc952b4..8a0ab12e0 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -21,129 +21,13 @@ import unittest import numpy as np -import geomesa_pyspark.types from pyrasterframes.rasterfunctions import * from pyrasterframes.rf_types import * -from pyspark.sql import SQLContext, Column +from pyspark.sql import SQLContext from pyspark.sql.functions import * from . import TestEnvironment -class VectorTypes(TestEnvironment): - - def setUp(self): - self.create_layer() - import pandas as pd - self.pandas_df = pd.DataFrame({ - 'eye': ['a', 'b', 'c', 'd'], - 'x': [0.0, 1.0, 2.0, 3.0], - 'y': [-4.0, -3.0, -2.0, -1.0], - }) - df = self.spark.createDataFrame(self.pandas_df) - df = df.withColumn("point_geom", - st_point(df.x, df.y) - ) - self.df = df.withColumn("poly_geom", st_bufferPoint(df.point_geom, lit(1250.0))) - - def test_spatial_relations(self): - from pyspark.sql.functions import udf, sum - from geomesa_pyspark.types import PointUDT - import shapely - import numpy.testing - - # Use python shapely UDT in a UDF - @udf("double") - def area_fn(g): - return g.area - - @udf("double") - def length_fn(g): - return g.length - - df = self.df.withColumn("poly_area", area_fn(self.df.poly_geom)) - df = df.withColumn("poly_len", length_fn(df.poly_geom)) - - # Return UDT in a UDF! - def some_point(g): - return g.representative_point() - - some_point_udf = udf(some_point, PointUDT()) - - df = df.withColumn("any_point", some_point_udf(df.poly_geom)) - # spark-side UDF/UDT are correct - intersect_total = df.agg(sum( - st_intersects(df.poly_geom, df.any_point).astype('double') - ).alias('s')).collect()[0].s - self.assertTrue(intersect_total == df.count()) - - # Collect to python driver in shapely UDT - pandas_df_out = df.toPandas() - - # Confirm we get a shapely type back from st_* function and UDF - self.assertIsInstance(pandas_df_out.poly_geom.iloc[0], shapely.geometry.Polygon) - self.assertIsInstance(pandas_df_out.any_point.iloc[0], shapely.geometry.Point) - - # And our spark-side manipulations were correct - xs_correct = pandas_df_out.point_geom.apply(lambda g: g.coords[0][0]) == self.pandas_df.x - self.assertTrue(all(xs_correct)) - - centroid_ys = pandas_df_out.poly_geom.apply(lambda g: - g.centroid.coords[0][1]).tolist() - numpy.testing.assert_almost_equal(centroid_ys, self.pandas_df.y.tolist()) - - # Including from UDF's - numpy.testing.assert_almost_equal( - pandas_df_out.poly_geom.apply(lambda g: g.area).values, - pandas_df_out.poly_area.values - ) - numpy.testing.assert_almost_equal( - pandas_df_out.poly_geom.apply(lambda g: g.length).values, - pandas_df_out.poly_len.values - ) - - def test_rasterize(self): - from geomesa_pyspark.types import PolygonUDT - # simple test that raster contents are not invalid - - # create a udf to buffer (the bounds) polygon - def _buffer(g, d): - return g.buffer(d) - - @udf("double") - def area(g): - return g.area - - buffer_udf = udf(_buffer, PolygonUDT()) - - buf_cells = 10 - with_poly = self.rf.withColumn('poly', buffer_udf(self.rf.geometry, lit(-15 * buf_cells))) # cell res is 15x15 - area = with_poly.select(area('poly') < area('geometry')) - area_result = area.collect() - self.assertTrue(all([r[0] for r in area_result])) - - cols = 194 - rows = 250 - with_raster = with_poly.withColumn('rasterized', rf_rasterize('poly', 'geometry', lit(16), cols, rows)) - # expect a 4 by 4 cell - result = with_raster.select(rf_tile_sum(rf_local_equal_int(with_raster.rasterized, 16)), - rf_tile_sum(with_raster.rasterized)) - expected_burned_in_cells = (cols - 2 * buf_cells) * (rows - 2 * buf_cells) - self.assertEqual(result.first()[0], float(expected_burned_in_cells)) - self.assertEqual(result.first()[1], 16. * expected_burned_in_cells) - - def test_reproject(self): - reprojected = self.rf.withColumn('reprojected', st_reproject('center', 'EPSG:4326', 'EPSG:3857')) - reprojected.show() - self.assertEqual(reprojected.count(), 8) - - def test_geojson(self): - import os - sample = 'file://' + os.path.join(self.resource_dir, 'buildings.geojson') - geo = self.spark.read.geojson(sample) - geo.show() - self.assertEqual(geo.select('geometry').count(), 8) - - class RasterFunctions(TestEnvironment): def setUp(self): diff --git a/pyrasterframes/src/main/python/tests/VectorTypesTests.py b/pyrasterframes/src/main/python/tests/VectorTypesTests.py new file mode 100644 index 000000000..5f7946e5b --- /dev/null +++ b/pyrasterframes/src/main/python/tests/VectorTypesTests.py @@ -0,0 +1,145 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +from pyrasterframes.rasterfunctions import * +from pyspark.sql import Row +from pyspark.sql.functions import * + +from . import TestEnvironment + + +class VectorTypes(TestEnvironment): + + def setUp(self): + self.create_layer() + import pandas as pd + self.pandas_df = pd.DataFrame({ + 'eye': ['a', 'b', 'c', 'd'], + 'x': [0.0, 1.0, 2.0, 3.0], + 'y': [-4.0, -3.0, -2.0, -1.0], + }) + df = self.spark.createDataFrame(self.pandas_df) + df = df.withColumn("point_geom", + st_point(df.x, df.y) + ) + self.df = df.withColumn("poly_geom", st_bufferPoint(df.point_geom, lit(1250.0))) + + def test_spatial_relations(self): + from pyspark.sql.functions import udf, sum + from geomesa_pyspark.types import PointUDT + import shapely + import numpy.testing + + # Use python shapely UDT in a UDF + @udf("double") + def area_fn(g): + return g.area + + @udf("double") + def length_fn(g): + return g.length + + df = self.df.withColumn("poly_area", area_fn(self.df.poly_geom)) + df = df.withColumn("poly_len", length_fn(df.poly_geom)) + + # Return UDT in a UDF! + def some_point(g): + return g.representative_point() + + some_point_udf = udf(some_point, PointUDT()) + + df = df.withColumn("any_point", some_point_udf(df.poly_geom)) + # spark-side UDF/UDT are correct + intersect_total = df.agg(sum( + st_intersects(df.poly_geom, df.any_point).astype('double') + ).alias('s')).collect()[0].s + self.assertTrue(intersect_total == df.count()) + + # Collect to python driver in shapely UDT + pandas_df_out = df.toPandas() + + # Confirm we get a shapely type back from st_* function and UDF + self.assertIsInstance(pandas_df_out.poly_geom.iloc[0], shapely.geometry.Polygon) + self.assertIsInstance(pandas_df_out.any_point.iloc[0], shapely.geometry.Point) + + # And our spark-side manipulations were correct + xs_correct = pandas_df_out.point_geom.apply(lambda g: g.coords[0][0]) == self.pandas_df.x + self.assertTrue(all(xs_correct)) + + centroid_ys = pandas_df_out.poly_geom.apply(lambda g: + g.centroid.coords[0][1]).tolist() + numpy.testing.assert_almost_equal(centroid_ys, self.pandas_df.y.tolist()) + + # Including from UDF's + numpy.testing.assert_almost_equal( + pandas_df_out.poly_geom.apply(lambda g: g.area).values, + pandas_df_out.poly_area.values + ) + numpy.testing.assert_almost_equal( + pandas_df_out.poly_geom.apply(lambda g: g.length).values, + pandas_df_out.poly_len.values + ) + + def test_rasterize(self): + from geomesa_pyspark.types import PolygonUDT + # simple test that raster contents are not invalid + + # create a udf to buffer (the bounds) polygon + def _buffer(g, d): + return g.buffer(d) + + @udf("double") + def area(g): + return g.area + + buffer_udf = udf(_buffer, PolygonUDT()) + + buf_cells = 10 + with_poly = self.rf.withColumn('poly', buffer_udf(self.rf.geometry, lit(-15 * buf_cells))) # cell res is 15x15 + area = with_poly.select(area('poly') < area('geometry')) + area_result = area.collect() + self.assertTrue(all([r[0] for r in area_result])) + + cols = 194 + rows = 250 + with_raster = with_poly.withColumn('rasterized', rf_rasterize('poly', 'geometry', lit(16), cols, rows)) + # expect a 4 by 4 cell + result = with_raster.select(rf_tile_sum(rf_local_equal_int(with_raster.rasterized, 16)), + rf_tile_sum(with_raster.rasterized)) + expected_burned_in_cells = (cols - 2 * buf_cells) * (rows - 2 * buf_cells) + self.assertEqual(result.first()[0], float(expected_burned_in_cells)) + self.assertEqual(result.first()[1], 16. * expected_burned_in_cells) + + def test_parse_crs(self): + df = self.spark.createDataFrame([Row(id=1)]) + df.select(rf_mk_crs('EPSG:4326')).show() + + def test_reproject(self): + reprojected = self.rf.withColumn('reprojected', + st_reproject('center', rf_mk_crs('EPSG:4326'), rf_mk_crs('EPSG:3857'))) + reprojected.show() + self.assertEqual(reprojected.count(), 8) + + def test_geojson(self): + import os + sample = 'file://' + os.path.join(self.resource_dir, 'buildings.geojson') + geo = self.spark.read.geojson(sample) + geo.show() + self.assertEqual(geo.select('geometry').count(), 8) diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 10c83fef8..34c708175 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -22,11 +22,13 @@ package org.locationtech.rasterframes.py import java.nio.ByteBuffer +import geotrellis.proj4.CRS import geotrellis.raster.{CellType, MultibandTile} import geotrellis.spark.io._ import geotrellis.spark.{ContextRDD, MultibandTileLayerRDD, SpaceTimeKey, SpatialKey, TileLayerMetadata} import geotrellis.vector.Extent import org.apache.spark.sql._ +import org.locationtech.rasterframes import org.locationtech.rasterframes.extensions.RasterJoin import org.locationtech.rasterframes.model.LazyCRS import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} @@ -188,10 +190,8 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions def rf_local_unequal_int(col: Column, scalar: Int): Column = rf_local_unequal[Int](col, scalar) - def st_reproject(geometryCol: Column, srcName: String, dstName: String): Column = { - val src = LazyCRS(srcName) - val dst = LazyCRS(dstName) - st_reproject(geometryCol, src, dst) + def _make_crs_literal(crsText: String): Column = { + rasterframes.encoders.serialized_literal[CRS](LazyCRS(crsText)) } // return toRaster, get just the tile, and make an array out of it From c14f60d2b21946fbc83298608e0ce9381bdc9bf6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Tue, 30 Jul 2019 16:36:56 -0400 Subject: [PATCH 273/380] Started work on SQL document section. --- .../src/main/python/docs/languages.pymd | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 pyrasterframes/src/main/python/docs/languages.pymd diff --git a/pyrasterframes/src/main/python/docs/languages.pymd b/pyrasterframes/src/main/python/docs/languages.pymd new file mode 100644 index 000000000..69c9efdcb --- /dev/null +++ b/pyrasterframes/src/main/python/docs/languages.pymd @@ -0,0 +1,99 @@ +# API Languages + +One of the great powers of RasterFrames, afforded by Spark SQL, is the ability to express computation in multiple programming languages. This manual is centered around Python because that's the most common language used in data science and GIS analytics. However, Scala (the implementation language of RasterFrames) and SQL are also fully supported. Examples in Python can be mechanically translated into the other two languages without much difficulty once the naming conventions are understood. In the sections below we will show the same example program (computing average NDVI per month for a single tile in Tanzania). + +```python, imports, echo=False +from pyspark.sql.functions import month, dayofmonth, year +from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.rasterfunctions import * +import pyrasterframes.rf_ipython +import pandas as pd +import os +``` + +## Python + +Step 1: Load the catalog + +```python, step_1_python +modis = spark.read.format('aws-pds-modis-catalog').load() +``` +Step 2: Down-select data by month + +```python, step_2_python +red_nir_monthly_2017 = modis \ + .select('granule_id', month('acquisition_date').alias('month'), col('B01').alias('red'), col('B02').alias('nir')) \ + .where((year('acquisition_date') == 2017) & (dayofmonth('acquisition_date') == 15) & (col('granule_id') == 'h21v09')) +``` + +Step 3: Read tiles + +```python, step_3_python +red_nir_tiles_monthly_2017 = spark.read.raster(catalog=red_nir_monthly_2017, catalog_col_names=['red', 'nir']) +``` + +Step 4: Compute aggregates + +```python, step_4_python +result = red_nir_tiles_monthly_2017 \ + .groupBy('month') \ + .agg(first('month'), rf_agg_stats(rf_normalized_difference(col('nir'), col('red')).alias('ndvi_stats'))) \ + .where(st_intersects(st_reproject(rf_geometry(col('red')), rf_crs(col('red')), rf_mk_crs('EPSG:4326')), st_makePoint(34.870605, -4.729727))) \ + .orderBy(col('month')) +result.show() +``` + +## SQL + +For convenience we're going to evaluate SQL from the Python environment. The SQL fragments should work in the `spark-sql` shell just the same. + +```python, sql_setup +spark = create_rf_spark_session() +def sql(stmt): + return spark.sql(stmt) +``` + +Step 1: Load the catalog + +```python, step_1_sql +sql("CREATE OR REPLACE TEMPORARY VIEW modis USING `aws-pds-modis-catalog`") +``` + +Step 2: Down-select data by month + +```python, step_2_sql +sql(""" +CREATE OR REPLACE TEMPORARY VIEW red_nir_monthly_2017 AS +SELECT granule_id, month(acquisition_date) as month, B01 as red, B02 as nir +FROM modis +WHERE year(acquisition_date) = 2017 AND day(acquisition_date) = 15 AND granule_id = 'h21v09' +""") +sql('DESCRIBE red_nir_monthly_2017').show() +``` + +Step 3: Read tiles + +```python, step_3_sql +sql(""" +CREATE OR REPLACE TEMPORARY VIEW red_nir_tiles_monthly_2017 +USING raster +OPTIONS (catalogTable='red_nir_monthly_2017', catalogColumns='red,nir') +""") +``` + +Step 4: Compute aggregates + +```python, step_4_sql +sql(""" +SELECT month, ndvi_stats.* FROM ( + SELECT month, rf_agg_stats(rf_normalized_difference(nir, red)) as ndvi_stats + FROM red_nir_tiles_monthly_2017 + WHERE st_intersects(st_reproject(rf_geometry(red), rf_crs(red), 'EPSG:4326'), st_makePoint(34.870605, -4.729727)) + GROUP BY month + ORDER BY month +) +""").show() +``` + +## Scala + From 66e53f3376e5ddca25727455aa7e34ca15c09eec Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 31 Jul 2019 10:44:13 -0400 Subject: [PATCH 274/380] Updated languages.pymd with three variants of same analysis. Added `doctype` option to pweave setup subcommand. --- core/src/test/scala/Scratch.sc | 0 .../rasterframes/ReprojectGeometrySpec.scala | 3 +- docs/README.md | 19 +++- experimental/src/test/scala/ndvi.sc | 35 ++++++++ project/RFDependenciesPlugin.scala | 2 +- .../src/main/python/docs/languages.pymd | 89 ++++++++++++++++--- .../src/main/python/docs/reference.pymd | 19 +++- pyrasterframes/src/main/python/setup.py | 14 +-- .../src/main/docker/docker-compose.yml | 13 +-- 9 files changed, 158 insertions(+), 36 deletions(-) delete mode 100644 core/src/test/scala/Scratch.sc create mode 100644 experimental/src/test/scala/ndvi.sc diff --git a/core/src/test/scala/Scratch.sc b/core/src/test/scala/Scratch.sc deleted file mode 100644 index e69de29bb..000000000 diff --git a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index 2c5d801d0..23a3ddf25 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -105,7 +105,8 @@ class ReprojectGeometrySpec extends TestEnvironment { """ | SELECT st_reproject(ll, llCRS, 'EPSG:3857') as wm2, | st_reproject(wm, 'EPSG:3857', llCRS) as ll2, - | st_reproject(st_reproject(ll, llCRS, '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs'), '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs', 'EPSG:3857') as wm3 + | st_reproject(st_reproject(ll, llCRS, '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs'), + | '+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs', 'EPSG:3857') as wm3 | FROM geom """.stripMargin).as[(Geometry, Geometry, Geometry)] diff --git a/docs/README.md b/docs/README.md index e8b3071f8..7c8209b6f 100644 --- a/docs/README.md +++ b/docs/README.md @@ -67,7 +67,7 @@ To set up an environment whereby you can easily test/evaluate your code blocks d sbt:RasterFrames> pyrasterframes/doc ``` There's a command alias for this last step: `pyDocs`. -4. To evaluate a single `.pymd` file, you pass the `-f` option and the filename relative to the `python` direoctry: +4. To evaluate a single `.pymd` file, you pass the `-f` option and the filename relative to the `python` directory: ``` sbt:RasterFrames> pyrasterframes/pySetup pweave -f docs/getting-started.pymd [info] Synchronizing 44 files to '/pyrasterframes/target/python' @@ -81,11 +81,22 @@ To set up an environment whereby you can easily test/evaluate your code blocks d Processing chunk 1 named None from line 14 ... Weaved docs/getting-started.pymd to docs/getting-started.md - [success] Total time: 21 s, completed Jul 5, 2019 12:31:09 PM - sbt:RasterFrames> ``` 5. The _output_ Markdown files are written to `/pyrasterframes/target/python/docs`. _Note_: don't edit any files in the `pyrasterframes/target` directory... they will get overwritten each time `sbt` runs a command. -6. To build all the documentation and convert to a static html site, run: +6. During content development it's sometimes helpful to see the output rendered as basic HTML. To do this, add the `-d html` option to the pweave command: + ``` + sbt:RasterFrames> pyrasterframes/pySetup pweave -d html -f docs/getting-started.pymd + [info] Synchronizing 54 files to '/pyrasterframes/target/python' + [info] Running 'python setup.py pweave -d html -f docs/getting-started.pymd' in '/pyrasterframes/target/python' + running pweave + -------------------------------------------------- + Running getting-started + -------------------------------------------------- + ... + Weaved docs/getting-started.pymd to docs/getting-started.html + ``` + Note: This feature requires `pandoc` to be installed. +7. To build all the documentation and convert to a static html site, run: ```bash sbt makeSite ``` diff --git a/experimental/src/test/scala/ndvi.sc b/experimental/src/test/scala/ndvi.sc new file mode 100644 index 000000000..483d89006 --- /dev/null +++ b/experimental/src/test/scala/ndvi.sc @@ -0,0 +1,35 @@ +import geotrellis.proj4.LatLng +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.raster._ +import org.apache.spark.sql._ +import org.apache.spark.sql.functions._ + + +implicit val spark = SparkSession.builder(). + master("local[*]").appName("RasterFrames").getOrCreate().withRasterFrames +spark.sparkContext.setLogLevel("ERROR") + +import spark.implicits._ + +val modis = spark.read.format("aws-pds-modis-catalog").load() + +val red_nir_monthly_2017 = modis + .select($"granule_id", month($"acquisition_date") as "month", $"B01" as "red", $"B02" as "nir") + .where(year($"acquisition_date") === 2017 && (dayofmonth($"acquisition_date") === 15) && $"granule_id" === "h21v09") + +val red_nir_tiles_monthly_2017 = spark.read.raster + .fromCatalog(red_nir_monthly_2017, "red", "nir") + .load() + +val result = red_nir_tiles_monthly_2017 + .where(st_intersects( + st_reproject(rf_geometry($"red"), rf_crs($"red"), LatLng), + st_makePoint(34.870605, -4.729727) + )) + .groupBy("month") + .agg(rf_agg_stats(rf_normalized_difference($"nir", $"red")) as "ndvi_stats") + .orderBy("month") + .select("month", "ndvi_stats.*") + + +result.show() \ No newline at end of file diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index a4caa89c0..f351f2e3a 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -59,7 +59,7 @@ object RFDependenciesPlugin extends AutoPlugin { ), // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py - rfSparkVersion := "2.3.2", + rfSparkVersion := "2.3.3", rfGeoTrellisVersion := "2.2.0", rfGeoMesaVersion := "2.2.1", dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.58d4965" diff --git a/pyrasterframes/src/main/python/docs/languages.pymd b/pyrasterframes/src/main/python/docs/languages.pymd index 69c9efdcb..3be17b9e0 100644 --- a/pyrasterframes/src/main/python/docs/languages.pymd +++ b/pyrasterframes/src/main/python/docs/languages.pymd @@ -3,43 +3,54 @@ One of the great powers of RasterFrames, afforded by Spark SQL, is the ability to express computation in multiple programming languages. This manual is centered around Python because that's the most common language used in data science and GIS analytics. However, Scala (the implementation language of RasterFrames) and SQL are also fully supported. Examples in Python can be mechanically translated into the other two languages without much difficulty once the naming conventions are understood. In the sections below we will show the same example program (computing average NDVI per month for a single tile in Tanzania). ```python, imports, echo=False -from pyspark.sql.functions import month, dayofmonth, year +from pyspark.sql.functions import * from pyrasterframes.utils import create_rf_spark_session + from pyrasterframes.rasterfunctions import * import pyrasterframes.rf_ipython import pandas as pd import os +spark = create_rf_spark_session() ``` ## Python -Step 1: Load the catalog +### Step 1: Load the catalog ```python, step_1_python modis = spark.read.format('aws-pds-modis-catalog').load() ``` -Step 2: Down-select data by month +### Step 2: Down-select data by month ```python, step_2_python red_nir_monthly_2017 = modis \ - .select('granule_id', month('acquisition_date').alias('month'), col('B01').alias('red'), col('B02').alias('nir')) \ + .select( + col('granule_id'), + month('acquisition_date').alias('month'), + col('B01').alias('red'), + col('B02').alias('nir') + ) \ .where((year('acquisition_date') == 2017) & (dayofmonth('acquisition_date') == 15) & (col('granule_id') == 'h21v09')) ``` -Step 3: Read tiles +### Step 3: Read tiles ```python, step_3_python red_nir_tiles_monthly_2017 = spark.read.raster(catalog=red_nir_monthly_2017, catalog_col_names=['red', 'nir']) ``` -Step 4: Compute aggregates +### Step 4: Compute aggregates ```python, step_4_python result = red_nir_tiles_monthly_2017 \ + .where(st_intersects( + st_reproject(rf_geometry(col('red')), rf_crs(col('red')).crsProj4, rf_mk_crs('EPSG:4326')), + st_makePoint(lit(34.870605), lit(-4.729727))) + ) \ .groupBy('month') \ - .agg(first('month'), rf_agg_stats(rf_normalized_difference(col('nir'), col('red')).alias('ndvi_stats'))) \ - .where(st_intersects(st_reproject(rf_geometry(col('red')), rf_crs(col('red')), rf_mk_crs('EPSG:4326')), st_makePoint(34.870605, -4.729727))) \ - .orderBy(col('month')) + .agg(rf_agg_stats(rf_normalized_difference(col('nir'), col('red'))).alias('ndvi_stats')) \ + .orderBy(col('month')) \ + .select('month', 'ndvi_stats.*') result.show() ``` @@ -48,18 +59,17 @@ result.show() For convenience we're going to evaluate SQL from the Python environment. The SQL fragments should work in the `spark-sql` shell just the same. ```python, sql_setup -spark = create_rf_spark_session() def sql(stmt): return spark.sql(stmt) ``` -Step 1: Load the catalog +### Step 1: Load the catalog ```python, step_1_sql sql("CREATE OR REPLACE TEMPORARY VIEW modis USING `aws-pds-modis-catalog`") ``` -Step 2: Down-select data by month +### Step 2: Down-select data by month ```python, step_2_sql sql(""" @@ -71,7 +81,7 @@ WHERE year(acquisition_date) = 2017 AND day(acquisition_date) = 15 AND granule_i sql('DESCRIBE red_nir_monthly_2017').show() ``` -Step 3: Read tiles +### Step 3: Read tiles ```python, step_3_sql sql(""" @@ -81,7 +91,7 @@ OPTIONS (catalogTable='red_nir_monthly_2017', catalogColumns='red,nir') """) ``` -Step 4: Compute aggregates +### Step 4: Compute aggregates ```python, step_4_sql sql(""" @@ -97,3 +107,54 @@ SELECT month, ndvi_stats.* FROM ( ## Scala +### Step 1: Load the catalog + +```scala +import geotrellis.proj4.LatLng +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.datasource.raster._ +import org.apache.spark.sql._ +import org.apache.spark.sql.functions._ + + +implicit val spark = SparkSession.builder() + .master("local[*]") + .appName("RasterFrames") + .withKryoSerialization + .getOrCreate() + .withRasterFrames + +import spark.implicits._ + +val modis = spark.read.format("aws-pds-modis-catalog").load() +``` + +### Step 2: Down-select data by month + +```scala +val red_nir_monthly_2017 = modis + .select($"granule_id", month($"acquisition_date") as "month", $"B01" as "red", $"B02" as "nir") + .where(year($"acquisition_date") === 2017 && (dayofmonth($"acquisition_date") === 15) && $"granule_id" === "h21v09") +``` + +### Step 3: Read tiles + +```scala +val red_nir_tiles_monthly_2017 = spark.read.raster + .fromCatalog(red_nir_monthly_2017, "red", "nir") + .load() +``` + +### Step 4: Compute aggregates + +```scala +val result = red_nir_tiles_monthly_2017 + .where(st_intersects( + st_reproject(rf_geometry($"red"), rf_crs($"red"), LatLng), + st_makePoint(34.870605, -4.729727) + )) + .groupBy("month") + .agg(rf_agg_stats(rf_normalized_difference($"nir", $"red")) as "ndvi_stats") + .orderBy("month") + .select("month", "ndvi_stats.*") +``` \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index e04ee2387..3859c1694 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -87,10 +87,22 @@ Fetches the extent (bounding box or envelope) of a `ProjectedRasterTile` or `Ras ### rf_crs - Struct[String] rf_crs(ProjectedRasterTile proj_raster) - Struct[String] rf_crs(RasterSource proj_raster) + Struct rf_crs(ProjectedRasterTile proj_raster) + Struct rf_crs(RasterSource proj_raster) -Fetch the [proj4](https://proj4.org/) string representation of the coordinate reference system of a `ProjectedRasterTile` or `RasterSource` type tile columns. +Fetch CRS structure representing the coordinate reference system of a `ProjectedRasterTile` or `RasterSource` type tile columns. + +### rf_mk_crs + +Construct a CRS structure from one of its string representations. Three froms are supported: + + Struct rf_mk_crs(String crsText) + +* [EPSG code](https://www.epsg-registry.org/): `EPSG:` +* [Proj4 string](https://proj.org/): `+proj ` +* [WKT String](http://www.geoapi.org/3.0/javadoc/org/opengis/referencing/doc-files/WKT.html) with embedded EPSG code: `GEOGCS["", , , {,} {,}]` + +Example: `SELECT rf_mk_crs('EPSG:4326')` ### rf_convert_cell_type @@ -117,7 +129,6 @@ Functions to create a new Tile column, either from scratch or from existing data Tile rf_make_zeros_tile(Int tile_columns, Int tile_rows, String cell_type_name) ``` - Create a `tile` of shape `tile_columns` by `tile_rows` full of zeros, with the specified cell type. See function @ref:[`rf_cell_types`](reference.md#rf-cell-types) for valid values. All arguments are literal values and not column expressions. ### rf_make_ones_tile diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index a76031b6b..a8881fdfb 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -53,6 +53,7 @@ class PweaveDocs(distutils.cmd.Command): user_options = [ # The format is (long option, short option, description). ('files=', 'f', 'Specific files to pweave. Defaults to all in `docs` directory.'), + ('doctype=', 'd', 'Output format type. Defaults to `markdown`') ] def initialize_options(self): @@ -62,15 +63,15 @@ def initialize_options(self): lambda x: not path.basename(x)[:1] == '_', glob(path.join(here, 'docs', '*.pymd')) ) + self.doctype = 'markdown' def finalize_options(self): """Post-process options.""" import re if isinstance(self.files, str): self.files = filter(lambda s: len(s) > 0, re.split(',', self.files)) - - def doctype(self): - return "markdown" + if self.doctype is "html": + self.doctype = "pandoc2html" def run(self): """Run pweave.""" @@ -83,7 +84,7 @@ def run(self): try: pweave.weave( file=str(file), - doctype=self.doctype() + doctype=self.doctype ) except Exception: print(_divided('%s Failed:' % file)) @@ -92,8 +93,9 @@ def run(self): class PweaveNotebooks(PweaveDocs): - def doctype(self): - return "notebook" + def initialize_options(self): + super().initialize_options() + self.doctype = 'notebook' setup( diff --git a/rf-notebook/src/main/docker/docker-compose.yml b/rf-notebook/src/main/docker/docker-compose.yml index a093ca7fd..79d6c8dcf 100644 --- a/rf-notebook/src/main/docker/docker-compose.yml +++ b/rf-notebook/src/main/docker/docker-compose.yml @@ -7,11 +7,12 @@ services: # jupyter notebook port - "8888:8888" # spark UI ports - - "4040:4040" - - "4041:4041" - - "4042:4042" - - "4043:4043" - - "4044:4044" + - "44040:4040" + - "44041:4041" + - "44042:4042" + - "44043:4043" + - "44044:4044" # To save locally at './work' from the container: volumes: - - ../../../src/main/notebooks:/home/jovyan/work \ No newline at end of file + - ../../../src/main/notebooks:/home/jovyan/work + - ~/.rf_cache:/home/jovyan/.rf_cache \ No newline at end of file From e8d117c75c4db3effc271cf89ce0b2d67d557fea Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Wed, 31 Jul 2019 11:04:25 -0400 Subject: [PATCH 275/380] Bumped to JVM to Spark 2.3.3. --- project/RFDependenciesPlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/RFDependenciesPlugin.scala b/project/RFDependenciesPlugin.scala index a4caa89c0..f351f2e3a 100644 --- a/project/RFDependenciesPlugin.scala +++ b/project/RFDependenciesPlugin.scala @@ -59,7 +59,7 @@ object RFDependenciesPlugin extends AutoPlugin { ), // NB: Make sure to update the Spark version in pyrasterframes/python/setup.py - rfSparkVersion := "2.3.2", + rfSparkVersion := "2.3.3", rfGeoTrellisVersion := "2.2.0", rfGeoMesaVersion := "2.2.1", dependencyOverrides += "com.azavea.gdal" % "gdal-warp-bindings" % "33.58d4965" From de350b15a6e483ec58bf84838f7d03b567644b86 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 31 Jul 2019 13:19:22 -0400 Subject: [PATCH 276/380] Update release notes to reflect change at e8d117c75c4d Signed-off-by: Jason T. Brown --- docs/src/main/paradox/release-notes.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/src/main/paradox/release-notes.md b/docs/src/main/paradox/release-notes.md index 96db8e579..b02526b9a 100644 --- a/docs/src/main/paradox/release-notes.md +++ b/docs/src/main/paradox/release-notes.md @@ -4,7 +4,7 @@ ### 0.8.0 -* Upgraded to the following core dependencies: Spark 2.3.2, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. +* Upgraded to the following core dependencies: Spark 2.3.3, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. * Build `pyrasterframes` binary distribution for pip installation. * Added support for rendering RasterFrame types in IPython/Jupyter. * Added new tile functions `rf_round`, `rf_abs`, `rf_log`, `rf_log10`, `rf_log2`, `rf_log1p`, `rf_exp`, `rf_exp10`, `rf_exp2`, `rf_expm1`, `rf_resample`. From 92d9a1a63bd8f8912ff8ee78b6c5486a28adb5be Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 08:45:19 -0400 Subject: [PATCH 277/380] GeoTIFF writing post-walkthrough comments. --- .../ProjectedLayerMetadataAggregate.scala | 3 +- .../aggregates/TileRasterizerAggregate.scala | 7 ++-- .../extensions/DataFrameMethods.scala | 6 ++-- .../geotiff/GeoTiffDataSource.scala | 26 ++++++++------- .../src/main/python/docs/raster-write.pymd | 7 ++-- .../main/python/pyrasterframes/__init__.py | 32 ++++++++++++------- 6 files changed, 46 insertions(+), 35 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala index 20d827489..4af542d85 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala @@ -94,9 +94,8 @@ object ProjectedLayerMetadataAggregate { // Ordering must match InputRecord schema new ProjectedLayerMetadataAggregate(destCRS, destDims)(extent, crs, cellType, tileSize).as[TileLayerMetadata[SpatialKey]] - private[expressions] - case class InputRecord(extent: Extent, crs: CRS, cellType: CellType, tileSize: TileDimensions) { self ⇒ + case class InputRecord(extent: Extent, crs: CRS, cellType: CellType, tileSize: TileDimensions) { def toBufferRecord(destCRS: CRS): BufferRecord = { val transform = Transform(crs, destCRS) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala index a93abb15b..e1b11ae3b 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/TileRasterizerAggregate.scala @@ -58,7 +58,7 @@ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefine override def dataType: DataType = schemaOf[Raster[Tile]] override def initialize(buffer: MutableAggregationBuffer): Unit = { - buffer(0) = ArrayTile.empty(prd.cellType, prd.cols, prd.rows) + buffer(0) = ArrayTile.empty(prd.cellType, prd.totalCols, prd.totalRows) } override def update(buffer: MutableAggregationBuffer, input: Row): Unit = { @@ -90,13 +90,14 @@ class TileRasterizerAggregate(prd: ProjectedRasterDefinition) extends UserDefine object TileRasterizerAggregate { val nodeName = "rf_tile_rasterizer_aggregate" /** Convenience grouping of parameters needed for running aggregate. */ - case class ProjectedRasterDefinition(cols: Int, rows: Int, cellType: CellType, crs: CRS, extent: Extent, sampler: ResampleMethod = ResampleMethod.DEFAULT) + case class ProjectedRasterDefinition(totalCols: Int, totalRows: Int, cellType: CellType, crs: CRS, extent: Extent, sampler: ResampleMethod = ResampleMethod.DEFAULT) object ProjectedRasterDefinition { def apply(tlm: TileLayerMetadata[_]): ProjectedRasterDefinition = apply(tlm, ResampleMethod.DEFAULT) def apply(tlm: TileLayerMetadata[_], sampler: ResampleMethod): ProjectedRasterDefinition = { - val actualSize = tlm.layout.toRasterExtent().gridBoundsFor(tlm.extent) + // Try to determine the actual dimensions of our data coverage + val actualSize = tlm.layout.toRasterExtent().gridBoundsFor(tlm.extent) // <--- Do we have the math right here? val cols = actualSize.width val rows = actualSize.height new ProjectedRasterDefinition(cols, rows, tlm.cellType, tlm.crs, tlm.extent, sampler) diff --git a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala index 3735eef37..1e94ff3ca 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/extensions/DataFrameMethods.scala @@ -22,22 +22,20 @@ package org.locationtech.rasterframes.extensions import geotrellis.proj4.CRS -import geotrellis.raster.{MultibandTile, Tile} import geotrellis.spark.io._ import geotrellis.spark.{SpaceTimeKey, SpatialComponent, SpatialKey, TemporalKey, TileLayerMetadata} import geotrellis.util.MethodExtensions -import geotrellis.vector.{Extent, ProjectedExtent} -import org.apache.spark.rdd.RDD +import geotrellis.vector.Extent import org.apache.spark.sql.catalyst.expressions.Attribute import org.apache.spark.sql.types.{MetadataBuilder, StructField} import org.apache.spark.sql.{Column, DataFrame, TypedColumn} -import org.locationtech.rasterframes.{MetadataKeys, RasterFrameLayer} import org.locationtech.rasterframes.StandardColumns._ import org.locationtech.rasterframes.encoders.CatalystSerializer._ import org.locationtech.rasterframes.encoders.StandardEncoders._ import org.locationtech.rasterframes.expressions.DynamicExtractors import org.locationtech.rasterframes.tiles.ProjectedRasterTile import org.locationtech.rasterframes.util._ +import org.locationtech.rasterframes.{MetadataKeys, RasterFrameLayer} import spray.json.JsonFormat import scala.util.Try diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 1b639a1f5..749f15827 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -24,19 +24,18 @@ package org.locationtech.rasterframes.datasource.geotiff import java.net.URI import _root_.geotrellis.proj4.CRS +import _root_.geotrellis.raster._ import _root_.geotrellis.raster.io.geotiff.compression._ import _root_.geotrellis.raster.io.geotiff.tags.codes.ColorSpace import _root_.geotrellis.raster.io.geotiff.{GeoTiffOptions, MultibandGeoTiff, Tags, Tiled} -import _root_.geotrellis.raster._ +import _root_.geotrellis.spark._ import com.typesafe.scalalogging.LazyLogging -import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} import org.apache.spark.sql._ -import org.apache.spark.sql.functions._ -import org.apache.spark.sql.rf.TileUDT +import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} import org.locationtech.rasterframes._ import org.locationtech.rasterframes.datasource._ -import org.locationtech.rasterframes.expressions.aggregates.{ProjectedLayerMetadataAggregate, TileRasterizerAggregate} import org.locationtech.rasterframes.expressions.aggregates.TileRasterizerAggregate.ProjectedRasterDefinition +import org.locationtech.rasterframes.expressions.aggregates.{ProjectedLayerMetadataAggregate, TileRasterizerAggregate} import org.locationtech.rasterframes.model.{LazyCRS, TileDimensions} import org.locationtech.rasterframes.util._ @@ -96,32 +95,37 @@ class GeoTiffDataSource extends DataSourceRegister require(parameters.crs.nonEmpty, "A destination CRS must be provided") require(tileCols.nonEmpty, "need at least one tile column") + // Grab CRS to project into val destCRS = parameters.crs.get - val (extCol, crsCol) = { + // Select the anchoring Tile, Extent and CRS columns + val (extCol, crsCol, tileCol) = { + // Favor "ProjectedRaster" columns val prCols = df.projRasterColumns if(prCols.nonEmpty) { - (rf_extent(prCols.head), rf_crs(prCols.head)) + (rf_extent(prCols.head), rf_crs(prCols.head), rf_tile(prCols.head)) } else { + // If no "ProjectedRaster" column, look for single Extent and CRS columns. val crsCols = df.crsColumns require(crsCols.size == 1, "Exactly one CRS column must be in DataFrame") val extentCols = df.extentColumns require(extentCols.size == 1, "Exactly one Extent column must be in DataFrame") - (extentCols.head, crsCols.head) + (extentCols.head, crsCols.head, tileCols.head) } } - val tlm = df + // Scan table and constuct what the TileLayerMetadata would be in the specified destination CRS. + val tlm: TileLayerMetadata[SpatialKey] = df .select(ProjectedLayerMetadataAggregate( - destCRS, extCol, crsCol, rf_cell_type(tileCols.head), rf_dimensions(tileCols.head) + destCRS, extCol, crsCol, rf_cell_type(tileCol), rf_dimensions(tileCol) )) .first() val c = ProjectedRasterDefinition(tlm) val config = parameters.rasterDimensions.map { dims => - c.copy(cols = dims.cols, rows = dims.rows) + c.copy(totalCols = dims.cols, totalRows = dims.rows) }.getOrElse(c) val aggs = tileCols diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index 458be4c29..b1af4b401 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -63,7 +63,7 @@ GeoTIFF is one of the most common file formats for spatial data, providing flexi One downside to GeoTIFF is that it is not a big data native format. To create a GeoTIFF all the data to be encoded has to be in the memory of one compute node (in Spark parlance, this is a "collect"), limiting it's maximum size substantially compared to that of a full cluster environment. When rendering GeoTIFFs in RasterFrames, you either need to specify the dimensions of the output raster, or be aware of how big the collected data will end up being. -Fortunately, we can use the cluster computing capability to downlample the data into a more manageble saze. For sake of example, let's render a simple RGB overview image of our scene as a small raster: +Fortunately, we can use the cluster computing capability to downlample the data (using nearest-neighbor) into a more manageble size. For sake of example, let's render a simple RGB overview image of our scene as a small raster, reprojecting it to latitude and longitude coordinates on the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) reference ellipsoid (aka [EPSG:4326](https://spatialreference.org/ref/epsg/4326/)): ```python write_geotiff import os.path @@ -94,10 +94,9 @@ with rasterio.open(outfile) as src: ## GeoTrellis Layers -[GeoTrellis][GeoTrellis] is one of the key libraries that RasterFrames builds upon. It provides a Scala language API to working with large raster data with Apache Spark. Ingesting raster data into a Layer is one of the key concepts for creating a dataset for processing on Spark. RasterFrames write data from an appropriate DataFrame into a GeoTrellis Layer. - -\[ More details see https://s22s.myjetbrains.com/youtrack/issue/RF-72 \] +[GeoTrellis][GeoTrellis] is one of the key libraries that RasterFrames builds upon. It provides a Scala language API to working with large raster data with Apache Spark. Ingesting raster data into a Layer is one of the key concepts for creating a dataset for processing on Spark. RasterFrames write data from an appropriate DataFrame into a [GeoTrellis Layer](https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html). RasterFrames provides a `geotrellis` DataSource that supports both reading and writing of GeoTrellis layers. +> An example is forthcoming. ## Parquet diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index dcc0da624..c9ddea6cf 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -180,18 +180,25 @@ def _geotiff_writer( raster_dimensions=None, **options): + def set_dims(parts): + parts = [int(p) for p in parts] + assert(len(parts) == 2, "Expected dimensions specification to have exactly two components") + assert(all([p > 0 for p in parts]), "Expected all components in dimensions to be positive integers") + options.update({ + "imageWidth": parts[0], + "imageHeight": parts[1] + }) + try: + parts = [int(p) for p in parts] + assert(all([p > 0 for p in parts]), 'nice message') + except ValueError: + raise + if raster_dimensions is not None: - if isinstance(raster_dimensions, tuple): - options.update({ - "imageWidth": raster_dimensions[0], - "imageHeight": raster_dimensions[1] - }) + if isinstance(raster_dimensions, (list, tuple)): + set_dims(raster_dimensions) elif isinstance(raster_dimensions, str): - parts = raster_dimensions.split(',') - options.update({ - "imageWidth": parts[0], - "imageHeight": parts[1] - }) + set_dims(raster_dimensions.split(',')) if crs is not None: options.update({ @@ -200,8 +207,11 @@ def _geotiff_writer( return _aliased_writer(df_writer, "geotiff", path, **options) -# Patch new method on SparkSession to mirror Scala approach + +# Patch RasterFrames initialization method on SparkSession to mirror Scala approach SparkSession.withRasterFrames = _rf_init + +# Patch Kryo serialization initialization method on SparkSession.Builder to mirror Scala approach SparkSession.Builder.withKryoSerialization = _kryo_init # Add the 'asLayer' method to pyspark DataFrame From 42016926f4c6cb669c729e949e9c681738f31c4f Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 08:58:52 -0400 Subject: [PATCH 278/380] Regression fix. --- .../org/locationtech/rasterframes/ExtensionMethodSpec.scala | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index 4b917b86e..7652c010e 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -25,6 +25,7 @@ import geotrellis.proj4.LatLng import geotrellis.raster.{ByteCellType, GridBounds, TileLayout} import geotrellis.spark.tiling.{CRSWorldExtent, LayoutDefinition} import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} +import org.apache.spark.sql.Encoders import org.locationtech.rasterframes.util.SubdivideSupport /** @@ -61,6 +62,8 @@ class ExtensionMethodSpec extends TestEnvironment with TestData with SubdivideSu df.extentColumns.size should be(2) } it("should find multiple crs columns") { + // Not sure why implicit resolution isn't handling this properly. + implicit val enc = Encoders.tuple(crsEncoder, Encoders.STRING, crsEncoder, Encoders.scalaDouble) val df = Seq((pe.crs, "fred", pe.crs, 34.0)).toDF("c1", "s", "c2", "n") df.crsColumns.size should be (2) } @@ -70,7 +73,6 @@ class ExtensionMethodSpec extends TestEnvironment with TestData with SubdivideSu assert(tl1.subdivide(1) === tl1) assert(tl1.subdivide(2) === TileLayout(4, 6, 5, 5)) assertThrows[IllegalArgumentException](tl1.subdivide(-1)) - } it("should split KeyBounds[SpatialKey]") { val grid = GridBounds(0, 0, 9, 9) From 54e7ef1a9ee6bae6997ad16166cf7fa1e8fb211c Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 12:56:47 -0400 Subject: [PATCH 279/380] Tweaked ordering of scheme table. --- pyrasterframes/src/main/python/docs/raster-read.pymd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 522d7b6ce..1d3f8b252 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -61,10 +61,10 @@ RasterFrames relies on three different IO drivers, selected based on a combinati | `http://` | ✔︎ | ✔︎ | - | | `https://` | ✔︎ | ✔︎ | - | | `ftp://` | `/vsicurl/` | ✔ | - | -| `s3://` | `/vsis3/` ︎ | ✔︎ | - | | `hdfs://` | `/vsihdfs/` ︎| - | ✔︎ | -| `s3n://` | - ︎ | - | ✔︎ | -| `s3a://` | - ︎ | - | ✔︎ | +| `s3://` | `/vsis3/` ︎ | ✔︎ | - | +| `s3n://` | - ︎ | - | ✔︎ | +| `s3a://` | - ︎ | - | ✔︎ | | `wasb://` | `/vsiaz/` ︎ | - | ✔︎ | | `wasbs://` | - ︎ | - | ✔︎ | From 8c641098d215f3e45e5974b1804c2a743d0adb2b Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 14:02:46 -0400 Subject: [PATCH 280/380] Shapely spelling fix. --- pyrasterframes/src/main/python/setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index a4811824b..262cc7b74 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -134,7 +134,7 @@ def doctype(self): 'pytest==3.4.2', 'pypandoc', 'numpy>=1.7', - 'shapley', + 'shapely', 'pandas', 'rasterio' ], From 2c6df24b53d38895812e4e9eada5dfe9195fb1b0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 14:38:00 -0400 Subject: [PATCH 281/380] Separated out RasterFunctionsTests. --- .../geotiff/GeoTiffDataSource.scala | 3 - .../main/python/tests/PyRasterFramesTests.py | 175 --------------- .../main/python/tests/RasterFunctionsTests.py | 204 ++++++++++++++++++ 3 files changed, 204 insertions(+), 178 deletions(-) create mode 100644 pyrasterframes/src/main/python/tests/RasterFunctionsTests.py diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index b40bfa337..749f15827 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -28,10 +28,7 @@ import _root_.geotrellis.raster._ import _root_.geotrellis.raster.io.geotiff.compression._ import _root_.geotrellis.raster.io.geotiff.tags.codes.ColorSpace import _root_.geotrellis.raster.io.geotiff.{GeoTiffOptions, MultibandGeoTiff, Tags, Tiled} -<<<<<<< HEAD -======= import _root_.geotrellis.spark._ ->>>>>>> develop import com.typesafe.scalalogging.LazyLogging import org.apache.spark.sql._ import org.apache.spark.sql.sources.{BaseRelation, CreatableRelationProvider, DataSourceRegister, RelationProvider} diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index f60b8bc2e..b4f121ea7 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -28,181 +28,6 @@ from . import TestEnvironment -class RasterFunctions(TestEnvironment): - - def setUp(self): - self.create_layer() - - def test_setup(self): - self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), - "org.apache.spark.serializer.KryoSerializer") - - def test_identify_columns(self): - cols = self.rf.tile_columns() - self.assertEqual(len(cols), 1, '`tileColumns` did not find the proper number of columns.') - print("Tile columns: ", cols) - col = self.rf.spatial_key_column() - self.assertIsInstance(col, Column, '`spatialKeyColumn` was not found') - print("Spatial key column: ", col) - col = self.rf.temporal_key_column() - self.assertIsNone(col, '`temporalKeyColumn` should be `None`') - print("Temporal key column: ", col) - - def test_tile_creation(self): - base = self.spark.createDataFrame([1, 2, 3, 4], 'integer') - tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), - rf_make_ones_tile(3, 3, "int32")) - tiles.show() - self.assertEqual(tiles.count(), 4) - - def test_multi_column_operations(self): - df1 = self.rf.withColumnRenamed('tile', 't1').as_layer() - df2 = self.rf.withColumnRenamed('tile', 't2').as_layer() - df3 = df1.spatial_join(df2).as_layer() - df3 = df3.withColumn('norm_diff', rf_normalized_difference('t1', 't2')) - # df3.printSchema() - - aggs = df3.agg( - rf_agg_mean('norm_diff'), - ) - aggs.show() - row = aggs.first() - - self.assertTrue(self.rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) - - def test_general(self): - meta = self.rf.tile_layer_metadata() - self.assertIsNotNone(meta['bounds']) - df = self.rf.withColumn('dims', rf_dimensions('tile')) \ - .withColumn('type', rf_cell_type('tile')) \ - .withColumn('dCells', rf_data_cells('tile')) \ - .withColumn('ndCells', rf_no_data_cells('tile')) \ - .withColumn('min', rf_tile_min('tile')) \ - .withColumn('max', rf_tile_max('tile')) \ - .withColumn('mean', rf_tile_mean('tile')) \ - .withColumn('sum', rf_tile_sum('tile')) \ - .withColumn('stats', rf_tile_stats('tile')) \ - .withColumn('extent', st_extent('geometry')) \ - .withColumn('extent_geom1', st_geometry('extent')) \ - .withColumn('ascii', rf_render_ascii('tile')) \ - .withColumn('log', rf_log('tile')) \ - .withColumn('exp', rf_exp('tile')) \ - .withColumn('expm1', rf_expm1('tile')) \ - .withColumn('round', rf_round('tile')) \ - .withColumn('abs', rf_abs('tile')) - - df.first() - - def test_agg_mean(self): - mean = self.rf.agg(rf_agg_mean('tile')).first()['rf_agg_mean(tile)'] - self.assertTrue(self.rounded_compare(mean, 10160)) - - def test_aggregations(self): - aggs = self.rf.agg( - rf_agg_data_cells('tile'), - rf_agg_no_data_cells('tile'), - rf_agg_stats('tile'), - rf_agg_approx_histogram('tile') - ) - row = aggs.first() - - # print(row['rf_agg_data_cells(tile)']) - self.assertEqual(row['rf_agg_data_cells(tile)'], 387000) - self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) - self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) - - def test_sql(self): - self.rf.createOrReplaceTempView("rf_test_sql") - - self.spark.sql("""SELECT tile, - rf_local_add(tile, 1) AS and_one, - rf_local_subtract(tile, 1) AS less_one, - rf_local_multiply(tile, 2) AS times_two, - rf_local_divide(tile, 2) AS over_two - FROM rf_test_sql""").createOrReplaceTempView('rf_test_sql_1') - - statsRow = self.spark.sql(""" - SELECT rf_tile_mean(tile) as base, - rf_tile_mean(and_one) as plus_one, - rf_tile_mean(less_one) as minus_one, - rf_tile_mean(times_two) as double, - rf_tile_mean(over_two) as half - FROM rf_test_sql_1 - """).first() - - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.plus_one - 1)) - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.minus_one + 1)) - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.double / 2)) - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.half * 2)) - - def test_explode(self): - import pyspark.sql.functions as F - self.rf.select('spatial_key', rf_explode_tiles('tile')).show() - # +-----------+------------+---------+-------+ - # |spatial_key|column_index|row_index|tile | - # +-----------+------------+---------+-------+ - # |[2,1] |4 |0 |10150.0| - cell = self.rf.select(self.rf.spatial_key_column(), rf_explode_tiles(self.rf.tile)) \ - .where(F.col("spatial_key.col") == 2) \ - .where(F.col("spatial_key.row") == 1) \ - .where(F.col("column_index") == 4) \ - .where(F.col("row_index") == 0) \ - .select(F.col("tile")) \ - .collect()[0][0] - self.assertEqual(cell, 10150.0) - - # Test the sample version - frac = 0.01 - sample_count = self.rf.select(rf_explode_tiles_sample(frac, 1872, 'tile')).count() - print('Sample count is {}'.format(sample_count)) - self.assertTrue(sample_count > 0) - self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room - - def test_mask_by_value(self): - from pyspark.sql.functions import lit - - # create an artificial mask for values > 25000; masking value will be 4 - mask_value = 4 - - rf1 = self.rf.select(self.rf.tile, - rf_local_multiply( - rf_convert_cell_type( - rf_local_greater_int(self.rf.tile, 25000), - "uint8"), - lit(mask_value)).alias('mask')) - rf2 = rf1.select(rf1.tile, rf_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) - result = rf2.agg(rf_agg_no_data_cells(rf2.tile) < rf_agg_no_data_cells(rf2.masked)) \ - .collect()[0][0] - self.assertTrue(result) - - rf3 = rf1.select(rf1.tile, rf_inverse_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) - result = rf3.agg(rf_agg_no_data_cells(rf3.tile) < rf_agg_no_data_cells(rf3.masked)) \ - .collect()[0][0] - self.assertTrue(result) - - def test_resample(self): - from pyspark.sql.functions import lit - result = self.rf.select( - rf_tile_min(rf_local_equal( - rf_resample(rf_resample(self.rf.tile, lit(2)), lit(0.5)), - self.rf.tile)) - ).collect()[0][0] - - self.assertTrue(result == 1) # short hand for all values are true - - def test_exists_for_all(self): - df = self.rf.withColumn('should_exist', rf_make_ones_tile(5, 5, 'int8')) \ - .withColumn('should_not_exist', rf_make_zeros_tile(5, 5, 'int8')) - - should_exist = df.select(rf_exists(df.should_exist).alias('se')).take(1)[0].se - self.assertTrue(should_exist) - - should_not_exist = df.select(rf_exists(df.should_not_exist).alias('se')).take(1)[0].se - self.assertTrue(not should_not_exist) - - self.assertTrue(df.select(rf_for_all(df.should_exist).alias('se')).take(1)[0].se) - self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) - class CellTypeHandling(unittest.TestCase): diff --git a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py new file mode 100644 index 000000000..4436c6fc1 --- /dev/null +++ b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py @@ -0,0 +1,204 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +import unittest + +import numpy as np +from pyrasterframes.rasterfunctions import * +from pyrasterframes.rf_types import * +from pyspark.sql import SQLContext +from pyspark.sql.functions import * +from . import TestEnvironment + + +class RasterFunctions(TestEnvironment): + + def setUp(self): + self.create_layer() + + def test_setup(self): + self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), + "org.apache.spark.serializer.KryoSerializer") + + def test_identify_columns(self): + cols = self.rf.tile_columns() + self.assertEqual(len(cols), 1, '`tileColumns` did not find the proper number of columns.') + print("Tile columns: ", cols) + col = self.rf.spatial_key_column() + self.assertIsInstance(col, Column, '`spatialKeyColumn` was not found') + print("Spatial key column: ", col) + col = self.rf.temporal_key_column() + self.assertIsNone(col, '`temporalKeyColumn` should be `None`') + print("Temporal key column: ", col) + + def test_tile_creation(self): + base = self.spark.createDataFrame([1, 2, 3, 4], 'integer') + tiles = base.select(rf_make_constant_tile(3, 3, 3, "int32"), rf_make_zeros_tile(3, 3, "int32"), + rf_make_ones_tile(3, 3, "int32")) + tiles.show() + self.assertEqual(tiles.count(), 4) + + def test_multi_column_operations(self): + df1 = self.rf.withColumnRenamed('tile', 't1').as_layer() + df2 = self.rf.withColumnRenamed('tile', 't2').as_layer() + df3 = df1.spatial_join(df2).as_layer() + df3 = df3.withColumn('norm_diff', rf_normalized_difference('t1', 't2')) + # df3.printSchema() + + aggs = df3.agg( + rf_agg_mean('norm_diff'), + ) + aggs.show() + row = aggs.first() + + self.assertTrue(self.rounded_compare(row['rf_agg_mean(norm_diff)'], 0)) + + def test_general(self): + meta = self.rf.tile_layer_metadata() + self.assertIsNotNone(meta['bounds']) + df = self.rf.withColumn('dims', rf_dimensions('tile')) \ + .withColumn('type', rf_cell_type('tile')) \ + .withColumn('dCells', rf_data_cells('tile')) \ + .withColumn('ndCells', rf_no_data_cells('tile')) \ + .withColumn('min', rf_tile_min('tile')) \ + .withColumn('max', rf_tile_max('tile')) \ + .withColumn('mean', rf_tile_mean('tile')) \ + .withColumn('sum', rf_tile_sum('tile')) \ + .withColumn('stats', rf_tile_stats('tile')) \ + .withColumn('extent', st_extent('geometry')) \ + .withColumn('extent_geom1', st_geometry('extent')) \ + .withColumn('ascii', rf_render_ascii('tile')) \ + .withColumn('log', rf_log('tile')) \ + .withColumn('exp', rf_exp('tile')) \ + .withColumn('expm1', rf_expm1('tile')) \ + .withColumn('round', rf_round('tile')) \ + .withColumn('abs', rf_abs('tile')) + + df.first() + + def test_agg_mean(self): + mean = self.rf.agg(rf_agg_mean('tile')).first()['rf_agg_mean(tile)'] + self.assertTrue(self.rounded_compare(mean, 10160)) + + def test_aggregations(self): + aggs = self.rf.agg( + rf_agg_data_cells('tile'), + rf_agg_no_data_cells('tile'), + rf_agg_stats('tile'), + rf_agg_approx_histogram('tile') + ) + row = aggs.first() + + # print(row['rf_agg_data_cells(tile)']) + self.assertEqual(row['rf_agg_data_cells(tile)'], 387000) + self.assertEqual(row['rf_agg_no_data_cells(tile)'], 1000) + self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) + + def test_sql(self): + self.rf.createOrReplaceTempView("rf_test_sql") + + self.spark.sql("""SELECT tile, + rf_local_add(tile, 1) AS and_one, + rf_local_subtract(tile, 1) AS less_one, + rf_local_multiply(tile, 2) AS times_two, + rf_local_divide(tile, 2) AS over_two + FROM rf_test_sql""").createOrReplaceTempView('rf_test_sql_1') + + statsRow = self.spark.sql(""" + SELECT rf_tile_mean(tile) as base, + rf_tile_mean(and_one) as plus_one, + rf_tile_mean(less_one) as minus_one, + rf_tile_mean(times_two) as double, + rf_tile_mean(over_two) as half + FROM rf_test_sql_1 + """).first() + + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.plus_one - 1)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.minus_one + 1)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.double / 2)) + self.assertTrue(self.rounded_compare(statsRow.base, statsRow.half * 2)) + + def test_explode(self): + import pyspark.sql.functions as F + self.rf.select('spatial_key', rf_explode_tiles('tile')).show() + # +-----------+------------+---------+-------+ + # |spatial_key|column_index|row_index|tile | + # +-----------+------------+---------+-------+ + # |[2,1] |4 |0 |10150.0| + cell = self.rf.select(self.rf.spatial_key_column(), rf_explode_tiles(self.rf.tile)) \ + .where(F.col("spatial_key.col") == 2) \ + .where(F.col("spatial_key.row") == 1) \ + .where(F.col("column_index") == 4) \ + .where(F.col("row_index") == 0) \ + .select(F.col("tile")) \ + .collect()[0][0] + self.assertEqual(cell, 10150.0) + + # Test the sample version + frac = 0.01 + sample_count = self.rf.select(rf_explode_tiles_sample(frac, 1872, 'tile')).count() + print('Sample count is {}'.format(sample_count)) + self.assertTrue(sample_count > 0) + self.assertTrue(sample_count < (frac * 1.1) * 387000) # give some wiggle room + + def test_mask_by_value(self): + from pyspark.sql.functions import lit + + # create an artificial mask for values > 25000; masking value will be 4 + mask_value = 4 + + rf1 = self.rf.select(self.rf.tile, + rf_local_multiply( + rf_convert_cell_type( + rf_local_greater_int(self.rf.tile, 25000), + "uint8"), + lit(mask_value)).alias('mask')) + rf2 = rf1.select(rf1.tile, rf_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) + result = rf2.agg(rf_agg_no_data_cells(rf2.tile) < rf_agg_no_data_cells(rf2.masked)) \ + .collect()[0][0] + self.assertTrue(result) + + rf3 = rf1.select(rf1.tile, rf_inverse_mask_by_value(rf1.tile, rf1.mask, lit(mask_value)).alias('masked')) + result = rf3.agg(rf_agg_no_data_cells(rf3.tile) < rf_agg_no_data_cells(rf3.masked)) \ + .collect()[0][0] + self.assertTrue(result) + + def test_resample(self): + from pyspark.sql.functions import lit + result = self.rf.select( + rf_tile_min(rf_local_equal( + rf_resample(rf_resample(self.rf.tile, lit(2)), lit(0.5)), + self.rf.tile)) + ).collect()[0][0] + + self.assertTrue(result == 1) # short hand for all values are true + + def test_exists_for_all(self): + df = self.rf.withColumn('should_exist', rf_make_ones_tile(5, 5, 'int8')) \ + .withColumn('should_not_exist', rf_make_zeros_tile(5, 5, 'int8')) + + should_exist = df.select(rf_exists(df.should_exist).alias('se')).take(1)[0].se + self.assertTrue(should_exist) + + should_not_exist = df.select(rf_exists(df.should_not_exist).alias('se')).take(1)[0].se + self.assertTrue(not should_not_exist) + + self.assertTrue(df.select(rf_for_all(df.should_exist).alias('se')).take(1)[0].se) + self.assertTrue(not df.select(rf_for_all(df.should_not_exist).alias('se')).take(1)[0].se) From 33e228b3825f71bece354f9abcf29ead008dd080 Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Thu, 1 Aug 2019 16:04:11 -0400 Subject: [PATCH 282/380] update nodata docs to show cell type conversion behavior and aggreations Signed-off-by: Eric Culbertson --- .../src/main/python/docs/nodata-handling.pymd | 84 +++++++++++++++++-- 1 file changed, 75 insertions(+), 9 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index d9ef1feb5..ed4043de9 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -15,6 +15,9 @@ import pyrasterframes from pyrasterframes.rasterfunctions import * import pyrasterframes.rf_ipython from IPython.display import display +import pandas as pd +import numpy as np +from pyrasterframes.rf_types import Tile spark = pyrasterframes.get_spark_session() ``` @@ -132,29 +135,92 @@ masked.select(rf_no_data_cells('blue_masked'), rf_tile_sum('mask')).show(10) It's also nice to view a sample. -```python show_masked +```python sample = masked.orderBy(-rf_no_data_cells('blue_masked')).select(rf_tile('blue_masked'), rf_tile('scl')).first() display(sample[0]) ``` And the original SCL data. -```python show_scl +```python display(sample[1]) ``` -## NoData in Arithmetic Operations +## Changing a Tile's NoData Values + +One way to mask a tile is to make a new tile with a user defined NoData value. We will explore this method below. First, lets create a rasterframe from a tile with values of 0, 1, 2, and 3. + +```python create_dummy_tile +tile_size = 100 +x = np.zeros((tile_size, tile_size), dtype='int16') + +for i in range(4): + x[:, i*tile_size//4:(i+1)*tile_size//4] = i +x = Tile(x) + +rf = spark.createDataFrame(pd.DataFrame(data = + {'tile': [x]})) +x +``` + +First, we mask the value of 1 by making a new column with the user defined cell type 'uint16ud1'. Then, we mask out the value of two by making a tile with the cell type 'uint16ud2'. + +```python +def get_nodata_ct(nd_val): + return CellType('uint16').with_no_data_value(nd_val).cell_type_name + +masked_rf = rf.withColumn('tile_nd_1', + rf_convert_cell_type('tile', get_nodata_ct(1))) \ + .withColumn('tile_nd_2', + rf_convert_cell_type('tile_nd_1', get_nodata_ct(2))) \ +``` + +```python +collected = masked_rf.collect() +``` + +Let's look at the new Tiles we created. The tile named `tile_nd_1` has the 1 values masked out as expected. + +```python +display(collected[0].tile_nd_1) +``` + +And the tile named `tile_nd_2` has the values of 1 and 2 masked out. This is because we created the tile by setting a new user defined NoData value to `tile_nd_1` the values previously masked out in `tile_nd_1` stayed masked when creating `tile_nd_2`. + +```python +display(collected[0].tile_nd_2) +``` -local algebra example; same celltype what happens to nodata -Possibly use st_geomFromWkt and rf_rasterize to create something to work from +## Nodata Values in Aggregation -agg +Let's use the same tile as before to demonstrate how NoData values affect tile aggregations +```python +tile_size = 100 +x = np.eye(tile_size, dtype='int16') +for i in range(4): + x[:, i*tile_size//4:(i+1)*tile_size//4] = i +x = Tile(x) + +rf = spark.createDataFrame(pd.DataFrame(data = + {'tile': [x]})) +display(x) +``` -## Dealing with Multiple Cell Types +First we create the two new masked tile columns as before. One with only the value of 1 masked, and the other with and values of 1 and 2 masked. -Quick demo of one ND tile one raw tile +```python +def get_nodata_ct(nd_val): + return CellType('uint16').with_no_data_value(nd_val).cell_type_name -Quick demo of ND in two different cell types +masked_rf = rf.withColumn('tile_nd_1', + rf_convert_cell_type('tile', get_nodata_ct(1))) \ + .withColumn('tile_nd_2', + rf_convert_cell_type('tile_nd_1', get_nodata_ct(2))) +``` +The results of `rf_tile_sum` vary on the tiles that were masked. This is because any cells with NoData values are ignored in the aggregation. Note that `tile_nd_2` has the lowest sum, since it has the fewest amount of data cells. +```python +masked_rf.select(rf_tile_sum('tile'), rf_tile_sum('tile_nd_1'), rf_tile_sum('tile_nd_2')).show() +``` \ No newline at end of file From 84985ad0630a787f7cb8f2c627f5791c7e9b96a1 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 16:05:39 -0400 Subject: [PATCH 283/380] PR feedback. --- .../rasterframes/ReprojectGeometrySpec.scala | 28 +++---- .../geotiff/GeoTiffDataSource.scala | 82 +++++++++---------- docs/README.md | 10 +-- docs/src/main/paradox/release-notes.md | 1 + .../src/main/python/docs/concepts.md | 10 ++- .../src/main/python/docs/description.md | 13 +-- .../src/main/python/docs/getting-started.pymd | 3 +- pyrasterframes/src/main/python/docs/index.md | 2 +- .../src/main/python/docs/languages.pymd | 12 ++- .../src/main/python/docs/reference.pymd | 4 +- .../main/python/pyrasterframes/__init__.py | 11 +-- pyrasterframes/src/main/python/setup.py | 15 ++-- .../src/main/python/tests/VectorTypesTests.py | 2 +- 13 files changed, 103 insertions(+), 90 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala index 23a3ddf25..a58294287 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ReprojectGeometrySpec.scala @@ -33,7 +33,7 @@ import org.locationtech.jts.geom._ class ReprojectGeometrySpec extends TestEnvironment { // Note: Test data copied from ReprojectSpec in GeoTrellis val fact = new GeometryFactory() - val latLng: Geometry = fact.createLineString(Array( + val llLineString: Geometry = fact.createLineString(Array( new Coordinate(-111.09374999999999, 34.784483415461345), new Coordinate(-111.09374999999999, 43.29919735147067), new Coordinate(-75.322265625, 43.29919735147067), @@ -41,7 +41,7 @@ class ReprojectGeometrySpec extends TestEnvironment { new Coordinate(-111.09374999999999, 34.784483415461345) )) - val webMercator: Geometry = fact.createLineString(Array( + val wmLineString: Geometry = fact.createLineString(Array( new Coordinate(-12366899.680315234, 4134631.734001753), new Coordinate(-12366899.680315234, 5357624.186564572), new Coordinate(-8384836.254770693, 5357624.186564572), @@ -54,7 +54,7 @@ class ReprojectGeometrySpec extends TestEnvironment { it("should handle two literal CRSs") { - val df = Seq((latLng, webMercator)).toDF("ll", "wm") + val df = Seq((llLineString, wmLineString)).toDF("ll", "wm") val rp = df.select( st_reproject($"ll", LatLng, WebMercator) as "wm2", @@ -65,14 +65,14 @@ class ReprojectGeometrySpec extends TestEnvironment { val (wm2, ll2, wm3) = rp.first() - wm2 should matchGeom(webMercator, 0.00001) - ll2 should matchGeom(latLng, 0.00001) - wm3 should matchGeom(webMercator, 0.00001) + wm2 should matchGeom(wmLineString, 0.00001) + ll2 should matchGeom(llLineString, 0.00001) + wm3 should matchGeom(wmLineString, 0.00001) } it("should handle one literal crs") { implicit val enc = Encoders.tuple(jtsGeometryEncoder, jtsGeometryEncoder, crsEncoder) - val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") + val df = Seq((llLineString, wmLineString, LatLng: CRS)).toDF("ll", "wm", "llCRS") val rp = df.select( st_reproject($"ll", $"llCRS", WebMercator) as "wm2", @@ -83,9 +83,9 @@ class ReprojectGeometrySpec extends TestEnvironment { val (wm2, ll2, wm3) = rp.first() - wm2 should matchGeom(webMercator, 0.00001) - ll2 should matchGeom(latLng, 0.00001) - wm3 should matchGeom(webMercator, 0.00001) + wm2 should matchGeom(wmLineString, 0.00001) + ll2 should matchGeom(llLineString, 0.00001) + wm3 should matchGeom(wmLineString, 0.00001) } it("should accept other geometry types") { @@ -98,7 +98,7 @@ class ReprojectGeometrySpec extends TestEnvironment { it("should work in SQL") { implicit val enc = Encoders.tuple(jtsGeometryEncoder, jtsGeometryEncoder, crsEncoder) - val df = Seq((latLng, webMercator, LatLng: CRS)).toDF("ll", "wm", "llCRS") + val df = Seq((llLineString, wmLineString, LatLng: CRS)).toDF("ll", "wm", "llCRS") df.createOrReplaceTempView("geom") val rp = spark.sql( @@ -112,9 +112,9 @@ class ReprojectGeometrySpec extends TestEnvironment { val (wm2, ll2, wm3) = rp.first() - wm2 should matchGeom(webMercator, 0.00001) - ll2 should matchGeom(latLng, 0.00001) - wm3 should matchGeom(webMercator, 0.00001) + wm2 should matchGeom(wmLineString, 0.00001) + ll2 should matchGeom(llLineString, 0.00001) + wm3 should matchGeom(wmLineString, 0.00001) checkDocs("st_reproject") } diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index 749f15827..fe01d224d 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -40,12 +40,10 @@ import org.locationtech.rasterframes.model.{LazyCRS, TileDimensions} import org.locationtech.rasterframes.util._ /** - * Spark SQL data source over GeoTIFF files. - * @since 1/14/18 + * Spark SQL data source over GeoTIFF files. */ -class GeoTiffDataSource extends DataSourceRegister - with RelationProvider with CreatableRelationProvider - with DataSourceOptions with LazyLogging { +class GeoTiffDataSource + extends DataSourceRegister with RelationProvider with CreatableRelationProvider with DataSourceOptions with LazyLogging { import GeoTiffDataSource._ def shortName() = GeoTiffDataSource.SHORT_NAME @@ -56,42 +54,40 @@ class GeoTiffDataSource extends DataSourceRegister val p = parameters.path.get - if(p.getPath.contains("*")) { + if (p.getPath.contains("*")) { val bandCount = parameters.get(GeoTiffDataSource.BAND_COUNT_PARAM).map(_.toInt).getOrElse(1) GeoTiffCollectionRelation(sqlContext, p, bandCount) - } - else GeoTiffRelation(sqlContext, p) + } else GeoTiffRelation(sqlContext, p) } override def createRelation(sqlContext: SQLContext, mode: SaveMode, parameters: Map[String, String], df: DataFrame): BaseRelation = { require(parameters.path.isDefined, "Valid URI 'path' parameter required.") val path = parameters.path.get - require(path.getScheme == "file" || path.getScheme == null, - "Currently only 'file://' destinations are supported") + require(path.getScheme == "file" || path.getScheme == null, "Currently only 'file://' destinations are supported") sqlContext.withRasterFrames val tileCols = df.tileColumns require(tileCols.nonEmpty, "Could not find any tile columns.") - val raster = if(df.isAlreadyLayer) { + val raster = if (df.isAlreadyLayer) { val layer = df.certify val tlm = layer.tileLayerMetadata.merge // If no desired image size is given, write at full size. - val TileDimensions(cols, rows) = parameters.rasterDimensions + val TileDimensions(cols, rows) = parameters.rasterDimensions .getOrElse { val actualSize = tlm.layout.toRasterExtent().gridBoundsFor(tlm.extent) TileDimensions(actualSize.width, actualSize.height) } // Should we really play traffic cop here? - if(cols.toDouble * rows * 64.0 > Runtime.getRuntime.totalMemory() * 0.5) - logger.warn(s"You've asked for the construction of a very large image ($cols x $rows), destined for ${path}. Out of memory error likely.") + if (cols.toDouble * rows * 64.0 > Runtime.getRuntime.totalMemory() * 0.5) + logger.warn( + s"You've asked for the construction of a very large image ($cols x $rows), destined for ${path}. Out of memory error likely.") layer.toMultibandRaster(tileCols, cols.toInt, rows.toInt) - } - else { + } else { require(parameters.crs.nonEmpty, "A destination CRS must be provided") require(tileCols.nonEmpty, "need at least one tile column") @@ -102,10 +98,9 @@ class GeoTiffDataSource extends DataSourceRegister val (extCol, crsCol, tileCol) = { // Favor "ProjectedRaster" columns val prCols = df.projRasterColumns - if(prCols.nonEmpty) { + if (prCols.nonEmpty) { (rf_extent(prCols.head), rf_crs(prCols.head), rf_tile(prCols.head)) - } - else { + } else { // If no "ProjectedRaster" column, look for single Extent and CRS columns. val crsCols = df.crsColumns require(crsCols.size == 1, "Exactly one CRS column must be in DataFrame") @@ -117,45 +112,48 @@ class GeoTiffDataSource extends DataSourceRegister // Scan table and constuct what the TileLayerMetadata would be in the specified destination CRS. val tlm: TileLayerMetadata[SpatialKey] = df - .select(ProjectedLayerMetadataAggregate( - destCRS, extCol, crsCol, rf_cell_type(tileCol), rf_dimensions(tileCol) - )) + .select( + ProjectedLayerMetadataAggregate( + destCRS, + extCol, + crsCol, + rf_cell_type(tileCol), + rf_dimensions(tileCol) + )) .first() val c = ProjectedRasterDefinition(tlm) - val config = parameters.rasterDimensions.map { dims => - c.copy(totalCols = dims.cols, totalRows = dims.rows) - }.getOrElse(c) + val config = parameters.rasterDimensions + .map { dims => + c.copy(totalCols = dims.cols, totalRows = dims.rows) + } + .getOrElse(c) val aggs = tileCols - .map(t => TileRasterizerAggregate( - config, crsCol, extCol, rf_tile(t))("tile").as(t.columnName) - ) + .map(t => TileRasterizerAggregate(config, crsCol, extCol, rf_tile(t))("tile").as(t.columnName)) val agg = df.select(aggs: _*) val row = agg.first() - val bands = for(i <- 0 until row.size) yield row.getAs[Tile](i) + val bands = for (i <- 0 until row.size) yield row.getAs[Tile](i) ProjectedRaster(MultibandTile(bands), tlm.extent, tlm.crs) } val tags = Tags( RFBuildInfo.toMap.filter(_._1.startsWith("rf")).mapValues(_.toString), - tileCols.map(c ⇒ Map("RF_COL" -> c.columnName)).toList + tileCols.map(c => Map("RF_COL" -> c.columnName)).toList ) // We make some assumptions here.... eventually have column metadata encode this. val colorSpace = tileCols.size match { - case 3 | 4 ⇒ ColorSpace.RGB - case _ ⇒ ColorSpace.BlackIsZero + case 3 | 4 => ColorSpace.RGB + case _ => ColorSpace.BlackIsZero } - val tiffOptions = GeoTiffOptions(Tiled, - if (parameters.compress) DeflateCompression else NoCompression, colorSpace - ) + val tiffOptions = GeoTiffOptions(Tiled, if (parameters.compress) DeflateCompression else NoCompression, colorSpace) val geotiff = new MultibandGeoTiff(raster.tile, raster.extent, raster.crs, tags, tiffOptions) @@ -174,19 +172,19 @@ object GeoTiffDataSource { final val CRS_PARAM = "crs" final val BAND_COUNT_PARAM = "bandCount" - private[geotiff] - implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { + private[geotiff] implicit class ParamsDictAccessors(val parameters: Map[String, String]) extends AnyVal { def path: Option[URI] = uriParam(PATH_PARAM, parameters) def compress: Boolean = parameters.get(COMPRESS_PARAM).exists(_.toBoolean) def crs: Option[CRS] = parameters.get(CRS_PARAM).map(s => LazyCRS(s)) def rasterDimensions: Option[TileDimensions] = { numParam(IMAGE_WIDTH_PARAM, parameters) .zip(numParam(IMAGE_HEIGHT_PARAM, parameters)) - .map { case (cols, rows) => - require(cols <= Int.MaxValue && rows <= Int.MaxValue, - s"Can't construct a GeoTIFF of size $cols x $rows. (Too big!)") - TileDimensions(cols.toInt, rows.toInt) - }.headOption + .map { + case (cols, rows) => + require(cols <= Int.MaxValue && rows <= Int.MaxValue, s"Can't construct a GeoTIFF of size $cols x $rows. (Too big!)") + TileDimensions(cols.toInt, rows.toInt) + } + .headOption } } } diff --git a/docs/README.md b/docs/README.md index 7c8209b6f..d89d0ea60 100644 --- a/docs/README.md +++ b/docs/README.md @@ -67,11 +67,11 @@ To set up an environment whereby you can easily test/evaluate your code blocks d sbt:RasterFrames> pyrasterframes/doc ``` There's a command alias for this last step: `pyDocs`. -4. To evaluate a single `.pymd` file, you pass the `-f` option and the filename relative to the `python` directory: +4. To evaluate a single `.pymd` file, you pass the `-s` option and the filename relative to the `python` directory: ``` - sbt:RasterFrames> pyrasterframes/pySetup pweave -f docs/getting-started.pymd + sbt:RasterFrames> pyrasterframes/pySetup pweave -s docs/getting-started.pymd [info] Synchronizing 44 files to '/pyrasterframes/target/python' - [info] Running 'python setup.py pweave -f docs/getting-started.pymd' in '/pyrasterframes/target/python' + [info] Running 'python setup.py pweave -s docs/getting-started.pymd' in '/pyrasterframes/target/python' running pweave -------------------------------------------------- Running getting-started @@ -85,9 +85,9 @@ To set up an environment whereby you can easily test/evaluate your code blocks d 5. The _output_ Markdown files are written to `/pyrasterframes/target/python/docs`. _Note_: don't edit any files in the `pyrasterframes/target` directory... they will get overwritten each time `sbt` runs a command. 6. During content development it's sometimes helpful to see the output rendered as basic HTML. To do this, add the `-d html` option to the pweave command: ``` - sbt:RasterFrames> pyrasterframes/pySetup pweave -d html -f docs/getting-started.pymd + sbt:RasterFrames> pyrasterframes/pySetup pweave -f html -s docs/getting-started.pymd [info] Synchronizing 54 files to '/pyrasterframes/target/python' - [info] Running 'python setup.py pweave -d html -f docs/getting-started.pymd' in '/pyrasterframes/target/python' + [info] Running 'python setup.py pweave -f html -s docs/getting-started.pymd' in '/pyrasterframes/target/python' running pweave -------------------------------------------------- Running getting-started diff --git a/docs/src/main/paradox/release-notes.md b/docs/src/main/paradox/release-notes.md index b02526b9a..51a126dfc 100644 --- a/docs/src/main/paradox/release-notes.md +++ b/docs/src/main/paradox/release-notes.md @@ -4,6 +4,7 @@ ### 0.8.0 +* Super-duper new Python-centric [RasterFrames Users' Manual](https://rasterframes.io/)! * Upgraded to the following core dependencies: Spark 2.3.3, GeoTrellis 2.3.0, GeoMesa 2.2.1, JTS 1.16.0. * Build `pyrasterframes` binary distribution for pip installation. * Added support for rendering RasterFrame types in IPython/Jupyter. diff --git a/pyrasterframes/src/main/python/docs/concepts.md b/pyrasterframes/src/main/python/docs/concepts.md index 19537376a..62a40d64a 100644 --- a/pyrasterframes/src/main/python/docs/concepts.md +++ b/pyrasterframes/src/main/python/docs/concepts.md @@ -1,6 +1,6 @@ # Concepts -There are a number of EO concepts that crop up in the discussion of RasterFrames features. We'll cover these briefly in the sections below. However, here are a few links providing a more extensive introduction to working with Earth observation data. +There are a number of Earth-observation (EO) concepts that crop up in the discussion of RasterFrames features. We'll cover these briefly in the sections below. However, here are a few links providing a more extensive introduction to working with Earth observation data. * [_Fundamentals of Remote Sensing_](https://www.nrcan.gc.ca/maps-tools-and-publications/satellite-imagery-and-air-photos/tutorial-fundamentals-remote-sensing/9309) * [_Newcomers Earth Observation Guide_](https://business.esa.int/newcomers-earth-observation-guide) @@ -51,7 +51,13 @@ An extent (or bounding box) is a rectangular region specifying the geospatial co ## Tile -A tile (sometimes called a "chip") is a sub-region of a scene, usually square, usually with dimensions that are some power of 2. It is usually encoded as a two-dimensional array, or a a one-dimensional array with width/height dimensions. Tiles may be singleband or multiband (multi-channel). The tile is the primary discretization unit used in RasterFrames; the bands of a scene are separated into different columns, and the band's raster is carved up into tiles for each row. +A tile (sometimes called a "chip") is a rectangular subset of a @ref:[scene](concepts.md#scene). A tile can conceptually be though of as a two-dimensional array. + +Some EO data has many bands or channels. Tiles in this context are conceptually a three-dimensional array, with the extra dimension representing the bands. + +Tiles are often square and the dimensions are some power of two, for example 256 by 256. + +The tile is the primary discretization unit used in RasterFrames. Each band of a scene is in a separate column. The scene's overall @ref:[extent](concepts.md#extent) is carved up into smaller extents for each tile. Each row of the DataFrame contains a two-dimensional tile per band column. ## Projected Extent diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md index 64d6eba06..33aac6cdb 100644 --- a/pyrasterframes/src/main/python/docs/description.md +++ b/pyrasterframes/src/main/python/docs/description.md @@ -1,6 +1,6 @@ # Overview -RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. +RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. It provides APIs in @ref:[Python, SQL, and Scala](languages.md), and can horizontally scale from a laptop to a supercomputer, enabling _global_ analysis with satellite imagery in a wholly new, flexible and convenient way. ## Context @@ -14,8 +14,7 @@ RasterFrames®, an incubating Eclipse Foundation LocationTech project, brings to ## Benefit -By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. - +By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. Because it is built on Apache Spark, solutions prototyped on a laptop can be scaled to run on cluster and cloud compute resources in a way not easily achieved with other toolchains. ## Architecture @@ -26,17 +25,21 @@ RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO ![LocationTech Stack](static/rasterframes-locationtech-stack.png) -RasterFrames introduces a new native data type called `tile` to Spark SQL. Each `tile` cell contains a 2-D matrix of "cell" (pixel) values, along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", discretized into regular-sized chunks, but can also be quality assurance information, land classification assignments, or any other discretized geo-spatiotemporal data. It also includes support for working with vector data, such as [GeoJSON][GeoJSON]. Along with `tile` columns there is typically a `geometry` column (bounds or extent/envelope) specifying the location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when querying a catalog of imagery. +RasterFrames introduces georectified raster imagery to Spark SQL. It quantizes scenes into chunks called "tiles". Each tile contains a 2-D matrix of "cell" (pixel) values along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", but can also be quality assurance information, land classification assignments, or any other rasterized spatiotemporal data. Along with `tile` columns there is typically an `extent` specifying the geographic location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when filtering + +RasterFrames also includes support for working with vector data, such as [GeoJSON][GeoJSON]. You can use vector data to filter DataFrame rows, using geospatial predicates (e.g. contains, intersects, overlaps, etc.), to mask cells, and to be rasterzied into training data appropriate for machine learning. + ![RasterFrame Anatomy](static/rasterframe-anatomy.png) -Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of (preferably Cloud Optimized) GeoTIFFs, [GeoTrellis Layers][GTLayer], and from an experimental catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. See @ref:[Raster Data I/O](raster-io.md) for details. +Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of georectified imagery (including Cloud Optimized GeoTIFFs or [COGS][COGS]), [GeoTrellis Layers][GTLayer], and from catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. See @ref:[Raster Data I/O](raster-io.md) for details. [R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame [Pandas]:https://pandas.pydata.org/ [GeoJSON]:https://en.wikipedia.org/wiki/GeoJSON [GTLayer]:https://geotrellis.readthedocs.io/en/latest/guide/core-concepts.html#layouts-and-tile-layers [PDS]:https://registry.opendata.aws/modis/ +[COGS]:https://www.cogeo.org/ [^1]: [_Demystifying Satellite Assets for Post-Disaster Situation Awareness_](https://docs.google.com/document/d/11bIw5HcEiZy8SKli6ZFQC2chVEiiIJ-f0o6btA4LU48). World Bank via [OpenDRI.org](https://opendri.org/resource/demystifying-satellite-assets-for-post-disaster-situation-awareness/). Accessed November 28, 2018. diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index 957eba2d8..df4f97676 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -1,6 +1,6 @@ # Getting Started -There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames. Let's start with the simplest. Python 3.6 or greater is recommended. +There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames, and @ref:[several languages](languages.md) with which you can use it. Let's start with the simplest: the Python shell. Python 3.6 or greater is recommended. ## pip install pyrasterframes @@ -72,7 +72,6 @@ df = spark.read.raster('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_ Now you have the configured SparkSession with RasterFrames enabled. - ```python, echo=False spark.stop() ``` diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index 5045d3c5a..a9590a361 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -41,11 +41,11 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi * [Overview](description.md) * [Concepts](concepts.md) * [Getting Started](getting-started.md) -* [API Languages](languages.md) * [Raster Data I/O](raster-io.md) * [Vector Data](vector-data.md) * [Raster Processing](raster-processing.md) * [Numpy and Pandas](numpy-pandas.md) +* [API Languages](languages.md) * [Function Reference](reference.md) * [Release Notes](release-notes.md) @@@ diff --git a/pyrasterframes/src/main/python/docs/languages.pymd b/pyrasterframes/src/main/python/docs/languages.pymd index 3be17b9e0..dc7e93065 100644 --- a/pyrasterframes/src/main/python/docs/languages.pymd +++ b/pyrasterframes/src/main/python/docs/languages.pymd @@ -36,7 +36,11 @@ red_nir_monthly_2017 = modis \ ### Step 3: Read tiles ```python, step_3_python -red_nir_tiles_monthly_2017 = spark.read.raster(catalog=red_nir_monthly_2017, catalog_col_names=['red', 'nir']) +red_nir_tiles_monthly_2017 = spark.read.raster( + catalog=red_nir_monthly_2017, + catalog_col_names=['red', 'nir'], + tile_dimensions=(256, 256) +) ``` ### Step 4: Compute aggregates @@ -87,7 +91,11 @@ sql('DESCRIBE red_nir_monthly_2017').show() sql(""" CREATE OR REPLACE TEMPORARY VIEW red_nir_tiles_monthly_2017 USING raster -OPTIONS (catalogTable='red_nir_monthly_2017', catalogColumns='red,nir') +OPTIONS ( + catalogTable='red_nir_monthly_2017', + catalogColumns='red,nir', + tileDimensions='256,256' + ) """) ``` diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index 3859c1694..1017a2f35 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -94,10 +94,10 @@ Fetch CRS structure representing the coordinate reference system of a `Projected ### rf_mk_crs -Construct a CRS structure from one of its string representations. Three froms are supported: - Struct rf_mk_crs(String crsText) +Construct a CRS structure from one of its string representations. Three froms are supported: + * [EPSG code](https://www.epsg-registry.org/): `EPSG:` * [Proj4 string](https://proj.org/): `+proj ` * [WKT String](http://www.geoapi.org/3.0/javadoc/org/opengis/referencing/doc-files/WKT.html) with embedded EPSG code: `GEOGCS["", , , {,} {,}]` diff --git a/pyrasterframes/src/main/python/pyrasterframes/__init__.py b/pyrasterframes/src/main/python/pyrasterframes/__init__.py index c9ddea6cf..e431b4e7a 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/__init__.py +++ b/pyrasterframes/src/main/python/pyrasterframes/__init__.py @@ -182,17 +182,14 @@ def _geotiff_writer( def set_dims(parts): parts = [int(p) for p in parts] - assert(len(parts) == 2, "Expected dimensions specification to have exactly two components") - assert(all([p > 0 for p in parts]), "Expected all components in dimensions to be positive integers") + assert len(parts) == 2, "Expected dimensions specification to have exactly two components" + assert all([p > 0 for p in parts]), "Expected all components in dimensions to be positive integers" options.update({ "imageWidth": parts[0], "imageHeight": parts[1] }) - try: - parts = [int(p) for p in parts] - assert(all([p > 0 for p in parts]), 'nice message') - except ValueError: - raise + parts = [int(p) for p in parts] + assert all([p > 0 for p in parts]), 'nice message' if raster_dimensions is not None: if isinstance(raster_dimensions, (list, tuple)): diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index a8881fdfb..53b52401c 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -52,8 +52,8 @@ class PweaveDocs(distutils.cmd.Command): description = 'Pweave PyRasterFrames documentation scripts' user_options = [ # The format is (long option, short option, description). - ('files=', 'f', 'Specific files to pweave. Defaults to all in `docs` directory.'), - ('doctype=', 'd', 'Output format type. Defaults to `markdown`') + ('files=', 's', 'Specific files to pweave. Defaults to all in `docs` directory.'), + ('format=', 'f', 'Output format type. Defaults to `markdown`') ] def initialize_options(self): @@ -63,15 +63,16 @@ def initialize_options(self): lambda x: not path.basename(x)[:1] == '_', glob(path.join(here, 'docs', '*.pymd')) ) - self.doctype = 'markdown' + self.format = 'markdown' def finalize_options(self): """Post-process options.""" import re if isinstance(self.files, str): self.files = filter(lambda s: len(s) > 0, re.split(',', self.files)) - if self.doctype is "html": - self.doctype = "pandoc2html" + # `html` doesn't do quite what one expects... only replaces code blocks, leaving markdown in place + if self.format is 'html': + self.format = 'pandoc2html' def run(self): """Run pweave.""" @@ -84,7 +85,7 @@ def run(self): try: pweave.weave( file=str(file), - doctype=self.doctype + doctype=self.format ) except Exception: print(_divided('%s Failed:' % file)) @@ -95,7 +96,7 @@ def run(self): class PweaveNotebooks(PweaveDocs): def initialize_options(self): super().initialize_options() - self.doctype = 'notebook' + self.format = 'notebook' setup( diff --git a/pyrasterframes/src/main/python/tests/VectorTypesTests.py b/pyrasterframes/src/main/python/tests/VectorTypesTests.py index 5f7946e5b..ba70f7520 100644 --- a/pyrasterframes/src/main/python/tests/VectorTypesTests.py +++ b/pyrasterframes/src/main/python/tests/VectorTypesTests.py @@ -129,7 +129,7 @@ def area(g): def test_parse_crs(self): df = self.spark.createDataFrame([Row(id=1)]) - df.select(rf_mk_crs('EPSG:4326')).show() + self.assertEqual(df.select(rf_mk_crs('EPSG:4326')).count(), 1) def test_reproject(self): reprojected = self.rf.withColumn('reprojected', From c5c64eccb0ea4de3633e28c55623054f325706c6 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 16:50:38 -0400 Subject: [PATCH 284/380] =?UTF-8?q?Added=20detection=20errors=20during=20d?= =?UTF-8?q?ocumentation=20processing.=E2=80=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/PythonBuildPlugin.scala | 5 ++++- pyrasterframes/src/main/python/setup.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index e4383a7b9..36c356e55 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -93,7 +93,10 @@ object PythonBuildPlugin extends AutoPlugin { val cmd = Seq(pythonCommand.value, "setup.py") ++ args val ver = version.value s.log.info(s"Running '${cmd.mkString(" ")}' in '$wd'") - Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! + val ec = Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! + if (ec != 0) + throw new MessageOnlyException(s"'$cmd' exited with value '$ec'") + ec }, pyWhl := pyWhlImp.value, Compile / `package` := (Compile / `package`).dependsOn(Python / packageBin).value, diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 53b52401c..693785d1a 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -78,6 +78,7 @@ def run(self): """Run pweave.""" import traceback import pweave + bad_words = ["Error"] for file in self.files: name = path.splitext(path.basename(file))[0] @@ -87,6 +88,16 @@ def run(self): file=str(file), doctype=self.format ) + if self.format == 'markdown': + dest = path.splitext(file)[0] + '.md' + if not path.exists(dest): + raise FileNotFoundError("Markdown file '%s' didn't get created as expected" % dest) + with open(dest, "r") as result: + for (n, line) in enumerate(result): + for word in bad_words: + if word in line: + raise ChildProcessError("Error detected on line %s in %s:\n%s" % (n + 1, dest, line)) + except Exception: print(_divided('%s Failed:' % file)) print(traceback.format_exc()) From 031f41f7b405bdf5bac9bb38ee6cb453ee94e8f0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Thu, 1 Aug 2019 16:55:26 -0400 Subject: [PATCH 285/380] Error message tweak. --- project/PythonBuildPlugin.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project/PythonBuildPlugin.scala b/project/PythonBuildPlugin.scala index 36c356e55..545fbcb75 100644 --- a/project/PythonBuildPlugin.scala +++ b/project/PythonBuildPlugin.scala @@ -95,7 +95,7 @@ object PythonBuildPlugin extends AutoPlugin { s.log.info(s"Running '${cmd.mkString(" ")}' in '$wd'") val ec = Process(cmd, wd, "RASTERFRAMES_VERSION" -> ver).! if (ec != 0) - throw new MessageOnlyException(s"'$cmd' exited with value '$ec'") + throw new MessageOnlyException(s"'${cmd.mkString(" ")}' exited with value '$ec'") ec }, pyWhl := pyWhlImp.value, From 21c810eee0854cf2a802d36e9e282ee5df211596 Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Thu, 1 Aug 2019 17:01:50 -0400 Subject: [PATCH 286/380] update nodata docs to show interaction between two different cell types Signed-off-by: Eric Culbertson --- .../src/main/python/docs/nodata-handling.pymd | 47 ++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index ed4043de9..e5667b419 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -223,4 +223,49 @@ The results of `rf_tile_sum` vary on the tiles that were masked. This is because ```python masked_rf.select(rf_tile_sum('tile'), rf_tile_sum('tile_nd_1'), rf_tile_sum('tile_nd_2')).show() -``` \ No newline at end of file +``` + + +## Combining Tiles with Different Data Types + +RasterFrames supports having Tile columns with multiple cell types in a single RasterFrame. It is important to understand how these different cell types interact. + +Let's first create a RasterFrame that has columns of `float` and `int` cell type. + +```python +x = Tile((np.ones((100, 100))*2).astype('int16')) +y = Tile((np.ones((100, 100))*3.0).astype('int32')) +rf = spark.createDataFrame(pd.DataFrame(data = + {'x': [x], + 'y': [y]})) +rf.select(rf_cell_type('y'), rf_cell_type('x')).distinct().show() +``` + +When performing a local operation between tile columns with cell types `int` and type `float`, the resulting tile cell type will be `float`. If two tiles of different sized integer cell types are added together in the same way, the resulting cell type will be the same as the largest of the two integer cell types. + +```python +rf_added = rf.withColumn('xy_sum', rf_local_add('y', 'x')) +rf_added.select(rf_cell_type('xy_sum'), rf_cell_type('y'), rf_cell_type('x')).distinct().show() +``` + +Combining tile columns of different cell types gets a little trickier when user defined NoData cell types are involved. Let's create 3 tile columns: one without a defined NoData value, one with a NoData value of 1, and one with a NoData value of 2. + + +```python +def get_nodata_ct(nd_val): + return CellType('uint16').with_no_data_value(nd_val).cell_type_name + +x = Tile((np.ones((100, 100))*3).astype('int16')) + +rf = spark.createDataFrame(pd.DataFrame(data = + {'x': [x]})) +rf_nd = rf.withColumn('x_nd_1', rf_convert_cell_type('x', get_nodata_ct(1))) \ + .withColumn('x_nd_2', rf_convert_cell_type('x', get_nodata_ct(2))) +``` + +Let's try adding the tile column without a defined NoData value to a tile column with a defined NoData value. When there is an inconsistent NoData value in the two columns, the NoData value of the right-hand side of the sum is kept. In this case, this means the result has no defined NoData value. + +```python +rf_nd_sum = rf_nd.withColumn('x_nd_sum', rf_local_add('x_nd_1', 'x')) +rf_nd_sum.select(rf_cell_type('x_nd_sum'), rf_cell_type('x'), rf_cell_type('x_nd_1')).distinct().show() +``` From ac68fdc3f1da45e28bdd9e6b978630e0d190434a Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Thu, 1 Aug 2019 17:37:43 -0400 Subject: [PATCH 287/380] Refactor construction of LayoutDefinition in raster writing process Signed-off-by: Jason T. Brown --- .../ProjectedLayerMetadataAggregate.scala | 7 +++++-- .../geotiff/GeoTiffDataSourceSpec.scala | 17 +++++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala index 4af542d85..5156c8270 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala @@ -28,7 +28,7 @@ import org.locationtech.rasterframes.model.TileDimensions import geotrellis.proj4.{CRS, Transform} import geotrellis.raster._ import geotrellis.raster.reproject.{Reproject, ReprojectRasterExtent} -import geotrellis.spark.tiling.{FloatingLayoutScheme, LayoutLevel} +import geotrellis.spark.tiling.{FloatingLayoutScheme, LayoutDefinition, LayoutLevel} import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} import geotrellis.vector.Extent import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} @@ -76,7 +76,10 @@ class ProjectedLayerMetadataAggregate(destCRS: CRS, destDims: TileDimensions) ex override def evaluate(buffer: Row): Any = { import org.locationtech.rasterframes.encoders.CatalystSerializer._ val buf = buffer.to[BufferRecord] - val LayoutLevel(_, layout) = FloatingLayoutScheme(destDims.cols, destDims.rows).levelFor(buf.extent, buf.cellSize) + + val re = RasterExtent(buf.extent, buf.cellSize) + val layout = LayoutDefinition(re, destDims.cols, destDims.rows) + val kb = KeyBounds(layout.mapTransform(buf.extent)) TileLayerMetadata(buf.cellType, layout, buf.extent, destCRS, kb).toRow } diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 866fa4966..ad2754c76 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -101,6 +101,23 @@ class GeoTiffDataSourceSpec } } + it("should write unstructured raster") { + import spark.implicits._ + val df = spark.read.format("raster") + .option("tileDimensions", "32,32") // oddball + .load(nonCogPath.toASCIIString) // core L8-B8-Robinson-IL.tiff + + df.count() shouldBe > (0) + + val crs = df.select(rf_crs($"proj_raster")).first() + + noException shouldBe thrownBy { + df.write.geotiff.withCRS(crs).save( + Paths.get("target", "unstructured.tif").toString() + ) + } + } + it("should write GeoTIFF without layer") { import org.locationtech.rasterframes.datasource.raster._ val pr = col("proj_raster_b0") From 4a77ce8a6654b02a403f3ec8a4e559c52ce9e179 Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Fri, 2 Aug 2019 09:51:19 -0400 Subject: [PATCH 288/380] fixed code to match documentation Signed-off-by: Eric Culbertson --- pyrasterframes/src/main/python/docs/nodata-handling.pymd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index e5667b419..4505c32f2 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -233,7 +233,7 @@ RasterFrames supports having Tile columns with multiple cell types in a single R Let's first create a RasterFrame that has columns of `float` and `int` cell type. ```python -x = Tile((np.ones((100, 100))*2).astype('int16')) +x = Tile((np.ones((100, 100))*2).astype('float')) y = Tile((np.ones((100, 100))*3.0).astype('int32')) rf = spark.createDataFrame(pd.DataFrame(data = {'x': [x], From 74436315b85aaf23fcbf3e4769942f3d6324e46e Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 2 Aug 2019 11:57:13 -0400 Subject: [PATCH 289/380] Add more unit tests for round trip full res GeoTiff writing Signed-off-by: Jason T. Brown --- .../ProjectedLayerMetadataAggregate.scala | 2 +- .../geotiff/GeoTiffDataSourceSpec.scala | 89 ++++++++++++++++++- pyrasterframes/src/main/python/setup.py | 3 +- .../main/python/tests/GeoTiffWriterTests.py | 16 ++-- 4 files changed, 99 insertions(+), 11 deletions(-) diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala index 5156c8270..0f1b4727a 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/ProjectedLayerMetadataAggregate.scala @@ -28,7 +28,7 @@ import org.locationtech.rasterframes.model.TileDimensions import geotrellis.proj4.{CRS, Transform} import geotrellis.raster._ import geotrellis.raster.reproject.{Reproject, ReprojectRasterExtent} -import geotrellis.spark.tiling.{FloatingLayoutScheme, LayoutDefinition, LayoutLevel} +import geotrellis.spark.tiling.LayoutDefinition import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} import geotrellis.vector.Extent import org.apache.spark.sql.expressions.{MutableAggregationBuffer, UserDefinedAggregateFunction} diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index ad2754c76..e98d82b2a 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -23,6 +23,7 @@ package org.locationtech.rasterframes.datasource.geotiff import java.nio.file.Paths import geotrellis.proj4._ +import geotrellis.raster.io.geotiff.{MultibandGeoTiff, SinglebandGeoTiff} import org.locationtech.rasterframes._ import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.TestEnvironment @@ -107,17 +108,95 @@ class GeoTiffDataSourceSpec .option("tileDimensions", "32,32") // oddball .load(nonCogPath.toASCIIString) // core L8-B8-Robinson-IL.tiff - df.count() shouldBe > (0) + df.count() should be > 0L val crs = df.select(rf_crs($"proj_raster")).first() noException shouldBe thrownBy { - df.write.geotiff.withCRS(crs).save( - Paths.get("target", "unstructured.tif").toString() - ) + df.write.geotiff.withCRS(crs).save("datasource/target/unstructured.tif") } + + val (inCols, inRows) = { + val id = sampleGeoTiff.imageData // inshallah same as nonCogPath + (id.cols, id.rows) + } + inCols should be (774) + inRows should be (500) //from gdalinfo + + val outputTif = SinglebandGeoTiff("datasource/target/unstructured.tif") + outputTif.imageData.cols should be (inCols) + outputTif.imageData.rows should be (inRows) + + // TODO check datatype, extent. + } + + it("should round trip unstructured raster from COG"){ + val df = spark.read.format("raster") + .load(getClass.getResource("/LC08_B7_Memphis_COG.tiff").toURI.toASCIIString()) + + df.count() should be > 0L + + val crs = df.select(rf_crs(col("proj_raster"))).first() + + noException shouldBe thrownBy { + df.write.geotiff.withCRS(crs).save("datasource/target/unstructured_cog.tif") + } + + val (inCols, inRows) = { + val id = readSingleband("LC08_B7_Memphis_COG.tiff").imageData + (id.cols, id.rows) + } + inCols should be (963) + inRows should be (754) //from gdalinfo + + val outputTif = SinglebandGeoTiff("datasource/target/unstructured_cog.tif") + outputTif.imageData.cols should be (inCols) + outputTif.imageData.rows should be (inRows) + + // TODO check datatype, extent. } + /* + it("should round trip jasons favorite unstructured raster round trip okay") { + import org.locationtech.rasterframes.datasource.raster._ + import spark.implicits._ + + val jasonsRasterPath = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/17/03/2019193/" + + "MCD43A4.A2019193.h17v03.006.2019202033615_B06.TIF" + val df = spark.read.raster + .withTileDimensions(233, 133) + .from(Seq(jasonsRasterPath)) + .load() + + logger.debug("Read local file metadata") + val (inCols, inRows) = { + val in = readSingleband("MCD43A4.A2019193.h17v03.006.2019202033615_B06.TIF") + (in.cols, in.rows) + } + inCols should be (2400) // from GDAL + inRows should be (2400) // from GDAL + + val outPath = "datasources/target/rf_mcd43a4.A2019193.h17v03.tif" + + // now take actions on the read df + logger.debug("Actions on raster ref dataframe") + df.count() should be > 100L + val crs = df.select(rf_crs($"proj_raster")).first() + logger.debug("Write full res geotiff from dataframe") + df.write.geotiff.withCRS(crs).save(outPath) + + // compare written file to path + logger.debug("Inspect written geotiff metadata") + val (outCols, outRows) = { + val outputTif = SinglebandGeoTiff(outPath) + (outputTif.cols, outputTif.rows) + } + outCols should be (inCols) + outRows should be (inRows) + // todo check extent and crs just for grins. + + }*/ + it("should write GeoTIFF without layer") { import org.locationtech.rasterframes.datasource.raster._ val pr = col("proj_raster_b0") @@ -169,6 +248,8 @@ ${s(1)},${s(4)},${s(3)} .withDimensions(256, 256) .save("geotiff-overview.tif") + val outTif = MultibandGeoTiff("geotiff-overview.tif") + outTif.bandCount should be (3) } } } diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 262cc7b74..b07696fd7 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -136,7 +136,8 @@ def doctype(self): 'numpy>=1.7', 'shapely', 'pandas', - 'rasterio' + 'rasterio', + 'boto3', ], packages=[ 'pyrasterframes', diff --git a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py index 135d88a88..fe2af7eb2 100644 --- a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py +++ b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py @@ -29,7 +29,7 @@ class GeoTiffWriter(TestEnvironment): @staticmethod def _tmpfile(): - return os.path.join(tempfile.tempdir, "pyrf-test.tif") + return os.path.join(tempfile.gettempdir(), "pyrf-test.tif") def test_identity_write(self): rf = self.spark.read.geotiff(self.img_uri) @@ -44,13 +44,19 @@ def test_identity_write(self): def test_unstructured_write(self): rf = self.spark.read.raster(self.img_uri) - dest = self._tmpfile() - rf.write.geotiff(dest, crs='EPSG:32616') + dest_file = self._tmpfile() + rf.write.geotiff(dest_file, crs='EPSG:32616') - rf2 = self.spark.read.raster(dest) + rf2 = self.spark.read.raster('file://' + dest_file) self.assertEqual(rf2.count(), rf.count()) - os.remove(dest) + with rasterio.open(self.img_uri) as source: + with rasterio.open(dest_file) as dest: + self.assertEqual((dest.width, dest.height), (source.width, source.height)) + self.assertEqual(dest.bounds, source.bounds) + self.assertEqual(dest.crs, source.crs) + + os.remove(dest_file) def test_downsampled_write(self): rf = self.spark.read.raster(self.img_uri) From 02284bbe3d557a8ba64c2cfc56b8a86074fb1f34 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 2 Aug 2019 12:13:10 -0400 Subject: [PATCH 290/380] Added ability to query GDAL version from Python. --- .../rasterframes/ref/RasterSourceIT.scala | 4 ++-- .../rasterframes/ref/GDALRasterSource.scala | 20 +++++++++++++++++-- .../rasterframes/ref/RasterSource.scala | 16 +++------------ .../rasterframes/ExtensionMethodSpec.scala | 2 +- .../rasterframes/ref/RasterSourceSpec.scala | 8 ++------ .../src/main/python/pyrasterframes/utils.py | 8 +++++++- .../main/python/tests/RasterFunctionsTests.py | 9 ++++----- .../rasterframes/py/PyRFContext.scala | 3 ++- 8 files changed, 39 insertions(+), 31 deletions(-) diff --git a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala index 1123c6a08..58fae9e0f 100644 --- a/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala +++ b/core/src/it/scala/org/locationtech/rasterframes/ref/RasterSourceIT.scala @@ -63,8 +63,8 @@ class RasterSourceIT extends TestEnvironment with TestData { } } - if (RasterSource.IsGDAL.hasGDAL) { - println("GDAL version: " + GDALWarp.get_version_info("--version")) + if (GDALRasterSource.hasGDAL) { + println("GDAL version: " + GDALRasterSource.gdalVersion()) describe("GDAL support") { diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala index 52b8d0070..481155f24 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/GDALRasterSource.scala @@ -23,12 +23,14 @@ package org.locationtech.rasterframes.ref import java.net.URI +import com.azavea.gdal.GDALWarp +import com.typesafe.scalalogging.LazyLogging +import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} import geotrellis.proj4.CRS -import geotrellis.raster.{CellType, GridBounds, MultibandTile, Raster} import geotrellis.raster.io.geotiff.Tags +import geotrellis.raster.{CellType, GridBounds, MultibandTile, Raster} import geotrellis.vector.Extent import org.locationtech.rasterframes.ref.RasterSource.URIRasterSource -import geotrellis.contrib.vlm.gdal.{GDALRasterSource => VLMRasterSource} case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSource { @@ -67,3 +69,17 @@ case class GDALRasterSource(source: URI) extends RasterSource with URIRasterSour override protected def readBounds(bounds: Traversable[GridBounds], bands: Seq[Int]): Iterator[Raster[MultibandTile]] = gdal.readBounds(bounds, bands) } + +object GDALRasterSource extends LazyLogging { + def gdalVersion(): String = if (hasGDAL) GDALWarp.get_version_info("--version").trim else "not available" + + @transient + lazy val hasGDAL: Boolean = try { + val _ = new GDALWarp() + true + } catch { + case _: UnsatisfiedLinkError => + logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader for GeoTIFF format.") + false + } +} diff --git a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala index 937587c38..6aa9ba441 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/ref/RasterSource.scala @@ -23,7 +23,6 @@ package org.locationtech.rasterframes.ref import java.net.URI -import com.azavea.gdal.GDALWarp import com.github.blemale.scaffeine.Scaffeine import com.typesafe.scalalogging.LazyLogging import geotrellis.proj4.CRS @@ -120,27 +119,18 @@ object RasterSource extends LazyLogging { /** Determine if we should prefer GDAL for all types. */ private val preferGdal: Boolean = org.locationtech.rasterframes.rfConfig.getBoolean("prefer-gdal") - @transient - lazy val hasGDAL: Boolean = try { - val _ = new GDALWarp() - true - } catch { - case _: UnsatisfiedLinkError => - logger.warn("GDAL native bindings are not available. Falling back to JVM-based reader.") - false - } - val gdalOnlyExtensions = Seq(".jp2", ".mrf", ".hdf") + val gdalOnlyExtensions = Seq(".jp2", ".mrf", ".hdf", ".vrt") def gdalOnly(source: URI): Boolean = if (gdalOnlyExtensions.exists(source.getPath.toLowerCase.endsWith)) { - require(hasGDAL, s"Can only read $source if GDAL is available") + require(GDALRasterSource.hasGDAL, s"Can only read $source if GDAL is available") true } else false /** Extractor for determining if a scheme indicates GDAL preference. */ def unapply(source: URI): Boolean = - gdalOnly(source) || ((preferGdal || source.getScheme.startsWith("gdal")) && hasGDAL) + gdalOnly(source) || ((preferGdal || source.getScheme.startsWith("gdal")) && GDALRasterSource.hasGDAL) } object IsDefaultGeoTiff { diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index 4b335a241..606794bbf 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -25,7 +25,7 @@ import geotrellis.proj4.LatLng import geotrellis.raster.{ByteCellType, GridBounds, TileLayout} import geotrellis.spark.tiling.{CRSWorldExtent, LayoutDefinition} import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} -import org.apache.spark.sql.{Encoder, Encoders} +import org.apache.spark.sql.Encoders import org.locationtech.rasterframes.util.SubdivideSupport /** diff --git a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala index 1e6d76f07..d3963dedd 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ref/RasterSourceSpec.scala @@ -29,11 +29,7 @@ import org.apache.spark.sql.rf.RasterSourceUDT import org.locationtech.rasterframes.TestEnvironment import org.locationtech.rasterframes.model.TileDimensions -/** - * - * - * @since 8/22/18 - */ + class RasterSourceSpec extends TestEnvironment with TestData { def sub(e: Extent) = { val c = e.center @@ -112,7 +108,7 @@ class RasterSourceSpec extends TestEnvironment with TestData { } } - if(RasterSource.IsGDAL.hasGDAL) { + if(GDALRasterSource.hasGDAL) { describe("GDAL Rastersource") { val gdal = GDALRasterSource(cogPath) val jvm = JVMGeoTiffRasterSource(cogPath) diff --git a/pyrasterframes/src/main/python/pyrasterframes/utils.py b/pyrasterframes/src/main/python/pyrasterframes/utils.py index 5faa62a22..d18e1fb37 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/utils.py +++ b/pyrasterframes/src/main/python/pyrasterframes/utils.py @@ -22,8 +22,9 @@ from pyspark.sql import SparkSession import os import sys +from . import RFContext -__all__ = ["create_rf_spark_session", "find_pyrasterframes_jar_dir", "find_pyrasterframes_assembly"] +__all__ = ["create_rf_spark_session", "find_pyrasterframes_jar_dir", "find_pyrasterframes_assembly", "gdal_version"] def find_pyrasterframes_jar_dir(): @@ -92,3 +93,8 @@ def create_rf_spark_session(): except TypeError as te: print("Error setting up SparkSession; cannot find the pyrasterframes assembly jar\n", te) return None + + +def gdal_version(): + fcn = RFContext.active().lookup("buildInfo") + return fcn()["GDAL"] diff --git a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py index 4436c6fc1..1a0696639 100644 --- a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py +++ b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py @@ -18,13 +18,10 @@ # SPDX-License-Identifier: Apache-2.0 # -import unittest - -import numpy as np from pyrasterframes.rasterfunctions import * -from pyrasterframes.rf_types import * -from pyspark.sql import SQLContext +from pyrasterframes.utils import gdal_version from pyspark.sql.functions import * + from . import TestEnvironment @@ -36,6 +33,8 @@ def setUp(self): def test_setup(self): self.assertEqual(self.spark.sparkContext.getConf().get("spark.serializer"), "org.apache.spark.serializer.KryoSerializer") + print("GDAL version", gdal_version()) + def test_identify_columns(self): cols = self.rf.tile_columns() diff --git a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala index 34c708175..4ae5c1231 100644 --- a/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala +++ b/pyrasterframes/src/main/scala/org/locationtech/rasterframes/py/PyRFContext.scala @@ -31,7 +31,7 @@ import org.apache.spark.sql._ import org.locationtech.rasterframes import org.locationtech.rasterframes.extensions.RasterJoin import org.locationtech.rasterframes.model.LazyCRS -import org.locationtech.rasterframes.ref.{RasterRef, RasterSource} +import org.locationtech.rasterframes.ref.{GDALRasterSource, RasterRef, RasterSource} import org.locationtech.rasterframes.util.KryoSupport import org.locationtech.rasterframes.{RasterFunctions, _} import spray.json._ @@ -53,6 +53,7 @@ class PyRFContext(implicit sparkSession: SparkSession) extends RasterFunctions RFBuildInfo.toMap.foreach { case (k, v) => retval.put(k, String.valueOf(v)) } + retval.put("GDAL", GDALRasterSource.gdalVersion()) retval } From 917b0a4fc6a7fcde7a24dd2b1c373e0304f45272 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 2 Aug 2019 12:30:59 -0400 Subject: [PATCH 291/380] Improvments to GeoTiffDataSourceSpec Signed-off-by: Jason T. Brown --- .../rasterframes/ExtensionMethodSpec.scala | 2 +- .../geotiff/GeoTiffDataSourceSpec.scala | 20 +++++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala index 4b335a241..606794bbf 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/ExtensionMethodSpec.scala @@ -25,7 +25,7 @@ import geotrellis.proj4.LatLng import geotrellis.raster.{ByteCellType, GridBounds, TileLayout} import geotrellis.spark.tiling.{CRSWorldExtent, LayoutDefinition} import geotrellis.spark.{KeyBounds, SpatialKey, TileLayerMetadata} -import org.apache.spark.sql.{Encoder, Encoders} +import org.apache.spark.sql.Encoders import org.locationtech.rasterframes.util.SubdivideSupport /** diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index e98d82b2a..5e22d13e0 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -24,6 +24,7 @@ import java.nio.file.Paths import geotrellis.proj4._ import geotrellis.raster.io.geotiff.{MultibandGeoTiff, SinglebandGeoTiff} +import geotrellis.vector.Extent import org.locationtech.rasterframes._ import org.apache.spark.sql.functions._ import org.locationtech.rasterframes.TestEnvironment @@ -113,7 +114,7 @@ class GeoTiffDataSourceSpec val crs = df.select(rf_crs($"proj_raster")).first() noException shouldBe thrownBy { - df.write.geotiff.withCRS(crs).save("datasource/target/unstructured.tif") + df.write.geotiff.withCRS(crs).save("unstructured.tif") } val (inCols, inRows) = { @@ -123,7 +124,7 @@ class GeoTiffDataSourceSpec inCols should be (774) inRows should be (500) //from gdalinfo - val outputTif = SinglebandGeoTiff("datasource/target/unstructured.tif") + val outputTif = SinglebandGeoTiff("unstructured.tif") outputTif.imageData.cols should be (inCols) outputTif.imageData.rows should be (inRows) @@ -139,21 +140,24 @@ class GeoTiffDataSourceSpec val crs = df.select(rf_crs(col("proj_raster"))).first() noException shouldBe thrownBy { - df.write.geotiff.withCRS(crs).save("datasource/target/unstructured_cog.tif") + df.write.geotiff.withCRS(crs).save("target/unstructured_cog.tif") } - val (inCols, inRows) = { - val id = readSingleband("LC08_B7_Memphis_COG.tiff").imageData - (id.cols, id.rows) + val (inCols, inRows, inExtent, inCellType) = { + val tif = readSingleband("LC08_B7_Memphis_COG.tiff") + val id = tif.imageData + (id.cols, id.rows, tif.extent, tif.cellType) } inCols should be (963) inRows should be (754) //from gdalinfo + inExtent should be (Extent(752325.0, 3872685.0, 781215.0, 3895305.0)) - val outputTif = SinglebandGeoTiff("datasource/target/unstructured_cog.tif") + val outputTif = SinglebandGeoTiff("target/unstructured_cog.tif") outputTif.imageData.cols should be (inCols) outputTif.imageData.rows should be (inRows) + outputTif.extent should be (inExtent) + outputTif.cellType should be (inCellType) - // TODO check datatype, extent. } /* From 438cfa147d8ccb4a8874346da1c50b8a4e3b12ef Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Fri, 2 Aug 2019 13:12:06 -0400 Subject: [PATCH 292/380] Fixed `Add` expression to use GT behavior; created new BiasedAdd for Aggregate use. --- .../aggregates/LocalMeanAggregate.scala | 10 +-- .../expressions/localops/Add.scala | 7 +- .../expressions/localops/BiasedAdd.scala | 74 +++++++++++++++++++ pyrasterframes/src/main/python/setup.py | 3 +- 4 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 core/src/main/scala/org/locationtech/rasterframes/expressions/localops/BiasedAdd.scala diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala index e978d21f9..06741a98c 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/aggregates/LocalMeanAggregate.scala @@ -22,7 +22,7 @@ package org.locationtech.rasterframes.expressions.aggregates import org.locationtech.rasterframes.expressions.UnaryRasterAggregate -import org.locationtech.rasterframes.expressions.localops.{Add => AddTiles, Divide => DivideTiles} +import org.locationtech.rasterframes.expressions.localops.{BiasedAdd, Divide => DivideTiles} import org.locationtech.rasterframes.expressions.transformers.SetCellType import geotrellis.raster.Tile import geotrellis.raster.mapalgebra.local @@ -59,16 +59,16 @@ case class LocalMeanAggregate(child: Expression) extends UnaryRasterAggregate { override lazy val updateExpressions: Seq[Expression] = Seq( If(IsNull(count), SetCellType(Defined(child), Literal("int32")), - If(IsNull(child), count, AddTiles(count, Defined(child))) + If(IsNull(child), count, BiasedAdd(count, Defined(child))) ), If(IsNull(sum), SetCellType(child, Literal("float64")), - If(IsNull(child), sum, AddTiles(sum, child)) + If(IsNull(child), sum, BiasedAdd(sum, child)) ) ) override val mergeExpressions: Seq[Expression] = Seq( - AddTiles(count.left, count.right), - AddTiles(sum.left, sum.right) + BiasedAdd(count.left, count.right), + BiasedAdd(sum.left, sum.right) ) override lazy val evaluateExpression: Expression = DivideTiles(sum, count) } diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala index e0b6b6714..b7a3c8946 100644 --- a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/Add.scala @@ -30,7 +30,6 @@ import org.apache.spark.sql.{Column, TypedColumn} import org.locationtech.rasterframes._ import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor -import org.locationtech.rasterframes.util.DataBiasedOp.BiasedAdd @ExpressionDescription( usage = "_FUNC_(tile, rhs) - Performs cell-wise addition between two tiles or a tile and a scalar.", @@ -48,9 +47,9 @@ import org.locationtech.rasterframes.util.DataBiasedOp.BiasedAdd case class Add(left: Expression, right: Expression) extends BinaryLocalRasterOp with CodegenFallback { override val nodeName: String = "rf_local_add" - override protected def op(left: Tile, right: Tile): Tile = BiasedAdd(left, right) - override protected def op(left: Tile, right: Double): Tile = BiasedAdd(left, right) - override protected def op(left: Tile, right: Int): Tile = BiasedAdd(left, right) + override protected def op(left: Tile, right: Tile): Tile = left.localAdd(right) + override protected def op(left: Tile, right: Double): Tile = left.localAdd(right) + override protected def op(left: Tile, right: Int): Tile = left.localAdd(right) override def eval(input: InternalRow): Any = { if(input == null) null diff --git a/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/BiasedAdd.scala b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/BiasedAdd.scala new file mode 100644 index 000000000..10bd82e62 --- /dev/null +++ b/core/src/main/scala/org/locationtech/rasterframes/expressions/localops/BiasedAdd.scala @@ -0,0 +1,74 @@ +/* + * This software is licensed under the Apache 2 license, quoted below. + * + * Copyright 2019 Astraea, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not + * use this file except in compliance with the License. You may obtain a copy of + * the License at + * + * [http://www.apache.org/licenses/LICENSE-2.0] + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations under + * the License. + * + * SPDX-License-Identifier: Apache-2.0 + * + */ + +package org.locationtech.rasterframes.expressions.localops +import geotrellis.raster.Tile +import org.apache.spark.sql.catalyst.InternalRow +import org.apache.spark.sql.catalyst.expressions.codegen.CodegenFallback +import org.apache.spark.sql.catalyst.expressions.{Expression, ExpressionDescription} +import org.apache.spark.sql.functions.lit +import org.apache.spark.sql.{Column, TypedColumn} +import org.locationtech.rasterframes._ +import org.locationtech.rasterframes.expressions.BinaryLocalRasterOp +import org.locationtech.rasterframes.expressions.DynamicExtractors.tileExtractor +import org.locationtech.rasterframes.util.DataBiasedOp + +@ExpressionDescription( + usage = "_FUNC_(tile, rhs) - Performs cell-wise addition between two tiles or a tile and a scalar. " + + "Unlike a regular 'add', this considers ` + = .", + arguments = """ + Arguments: + * tile - left-hand-side tile + * rhs - a tile or scalar value to add to each cell""", + examples = """ + Examples: + > SELECT _FUNC_(tile, 1.5); + ... + > SELECT _FUNC_(tile1, tile2); + ...""" +) +case class BiasedAdd(left: Expression, right: Expression) extends BinaryLocalRasterOp + with CodegenFallback { + override val nodeName: String = "rf_local_biased_add" + override protected def op(left: Tile, right: Tile): Tile = DataBiasedOp.BiasedAdd(left, right) + override protected def op(left: Tile, right: Double): Tile = DataBiasedOp.BiasedAdd(left, right) + override protected def op(left: Tile, right: Int): Tile = DataBiasedOp.BiasedAdd(left, right) + + override def eval(input: InternalRow): Any = { + if(input == null) null + else { + val l = left.eval(input) + val r = right.eval(input) + if (l == null && r == null) null + else if (l == null) r + else if (r == null && tileExtractor.isDefinedAt(right.dataType)) l + else if (r == null) null + else nullSafeEval(l, r) + } + } +} +object BiasedAdd { + def apply(left: Column, right: Column): TypedColumn[Any, Tile] = + new Column(BiasedAdd(left.expr, right.expr)).as[Tile] + + def apply[N: Numeric](tile: Column, value: N): TypedColumn[Any, Tile] = + new Column(BiasedAdd(tile.expr, lit(value).expr)).as[Tile] +} diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index 693785d1a..b24eeb0c1 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -152,7 +152,8 @@ def initialize_options(self): 'numpy>=1.7', 'shapely', 'pandas', - 'rasterio' + 'rasterio', + 'boto3' ], packages=[ 'pyrasterframes', From 3c1b728f2fc57450cd007b9d69478ce467347a22 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Fri, 2 Aug 2019 14:51:54 -0400 Subject: [PATCH 293/380] more docs and unit tests around local algebra and nodata Signed-off-by: Jason T. Brown --- .../src/main/python/docs/reference.pymd | 4 + pyrasterframes/src/main/python/setup.py | 2 +- .../main/python/tests/GeoTiffWriterTests.py | 4 +- .../main/python/tests/PyRasterFramesTests.py | 13 ++- .../main/python/tests/RasterFunctionsTests.py | 86 ++++++++++++++----- 5 files changed, 84 insertions(+), 25 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index 1017a2f35..0b4b0fe58 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -238,6 +238,8 @@ If input `tile` had a NoData value already, the behaviour depends on if its cell [Local map algebra](https://gisgeography.com/map-algebra-global-zonal-focal-local/) raster operations are element-wise operations on a single tile (unary), between a `tile` and a scalar, between two `tile`s, or across many `tile`s. +When these operations encounter a NoData value in either operand, the cell in the resulting `tile` will have a NoData. + The binary local map algebra functions have similar variations in the Python API depending on the left hand side type: - `rf_local_op`: applies `op` to two columns; the right hand side can be a `tile` or a numeric column. @@ -536,6 +538,8 @@ Aggregates over all of the rows in DataFrame of `tile` and returns a count of ea Local statistics compute the element-wise statistics across a DataFrame or group of `tile`s, resulting in a `tile` that has the same dimension. +When these functions encounter a NoData in a cell location, it will be ignored. + ### rf_agg_local_max Tile rf_agg_local_max(Tile tile) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index b24eeb0c1..d4a1491d0 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -144,7 +144,7 @@ def initialize_options(self): 'setuptools>=0.8', 'ipython==6.2.1', "ipykernel==4.8.0", - 'Pweave==0.30.3' + 'Pweave==0.30.3', ], tests_require=[ 'pytest==3.4.2', diff --git a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py index 6c4f21b2a..59ad0d0ae 100644 --- a/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py +++ b/pyrasterframes/src/main/python/tests/GeoTiffWriterTests.py @@ -37,7 +37,7 @@ def test_identity_write(self): dest = self._tmpfile() rf.write.geotiff(dest) - rf2 = self.spark.read.geotiff(dest) + rf2 = self.spark.read.geotiff('file://' + dest) self.assertEqual(rf2.count(), rf.count()) os.remove(dest) @@ -47,7 +47,7 @@ def test_unstructured_write(self): dest = self._tmpfile() rf.write.geotiff(dest, crs='EPSG:32616') - rf2 = self.spark.read.raster(dest) + rf2 = self.spark.read.raster('file://' + dest) self.assertEqual(rf2.count(), rf.count()) os.remove(dest) diff --git a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py index b4f121ea7..af14f5ade 100644 --- a/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py +++ b/pyrasterframes/src/main/python/tests/PyRasterFramesTests.py @@ -28,7 +28,6 @@ from . import TestEnvironment - class CellTypeHandling(unittest.TestCase): def test_is_raw(self): @@ -237,11 +236,16 @@ def less_pi(t): class TileOps(TestEnvironment): def setUp(self): + from pyspark.sql import Row # convenience so we can assert around Tile() == Tile() self.t1 = Tile(np.array([[1, 2], [3, 4]]), CellType.int8().with_no_data_value(3)) self.t2 = Tile(np.array([[1, 2], [3, 4]]), CellType.int8().with_no_data_value(1)) + self.t3 = Tile(np.array([[1, 2], + [-3, 4]]), CellType.int8().with_no_data_value(3)) + + self.df = self.spark.createDataFrame([Row(t1=self.t1, t2=self.t2, t3=self.t3)]) def test_addition(self): e1 = np.ma.masked_equal(np.array([[5, 6], @@ -253,6 +257,9 @@ def test_addition(self): r2 = (self.t1 + self.t2).cells self.assertTrue(np.ma.allequal(r2, e2)) + col_result = self.df.select(rf_local_add('t1', 't3').alias('sum')).first() + self.assertEqual(col_result.sum, self.t1 + self.t3) + def test_multiplication(self): e1 = np.ma.masked_equal(np.array([[4, 8], [12, 16]]), 12) @@ -263,6 +270,9 @@ def test_multiplication(self): r2 = (self.t1 * self.t2).cells self.assertTrue(np.ma.allequal(r2, e2)) + r3 = self.df.select(rf_local_multiply('t1', 't3').alias('r3')).first().r3 + self.assertEqual(r3, self.t1 * self.t3) + def test_subtraction(self): t3 = self.t1 * 4 r1 = t3 - self.t1 @@ -541,7 +551,6 @@ def path(scene, band): self.assertTrue(df2.select('b1_path').distinct().count() == 3) - def suite(): function_tests = unittest.TestSuite() return function_tests diff --git a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py index 4436c6fc1..699307b9b 100644 --- a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py +++ b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py @@ -97,6 +97,21 @@ def test_agg_mean(self): mean = self.rf.agg(rf_agg_mean('tile')).first()['rf_agg_mean(tile)'] self.assertTrue(self.rounded_compare(mean, 10160)) + def test_agg_local_mean(self): + from pyspark.sql import Row + + # this is really testing the nodata propagation in the agg local summation + ct = CellType.int8().with_no_data_value(4) + df = self.spark.createDataFrame([ + Row(tile=Tile(np.array([[1, 2, 3, 4, 5, 6]]), ct)), + Row(tile=Tile(np.array([[1, 2, 4, 3, 5, 6]]), ct)), + ]) + + result = df.agg(rf_agg_local_mean('tile').alias('mean')).first().mean + + expected = Tile(np.array([[1.0, 2.0, 3.0, 3.0, 5.0, 6.0]]), CellType.float64()) + self.assertEqual(result, expected) + def test_aggregations(self): aggs = self.rf.agg( rf_agg_data_cells('tile'), @@ -112,28 +127,59 @@ def test_aggregations(self): self.assertEqual(row['rf_agg_stats(tile)'].data_cells, row['rf_agg_data_cells(tile)']) def test_sql(self): + self.rf.createOrReplaceTempView("rf_test_sql") - self.spark.sql("""SELECT tile, - rf_local_add(tile, 1) AS and_one, - rf_local_subtract(tile, 1) AS less_one, - rf_local_multiply(tile, 2) AS times_two, - rf_local_divide(tile, 2) AS over_two - FROM rf_test_sql""").createOrReplaceTempView('rf_test_sql_1') - - statsRow = self.spark.sql(""" - SELECT rf_tile_mean(tile) as base, - rf_tile_mean(and_one) as plus_one, - rf_tile_mean(less_one) as minus_one, - rf_tile_mean(times_two) as double, - rf_tile_mean(over_two) as half - FROM rf_test_sql_1 - """).first() - - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.plus_one - 1)) - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.minus_one + 1)) - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.double / 2)) - self.assertTrue(self.rounded_compare(statsRow.base, statsRow.half * 2)) + arith = self.spark.sql("""SELECT tile, + rf_local_add(tile, 1) AS add_one, + rf_local_subtract(tile, 1) AS less_one, + rf_local_multiply(tile, 2) AS times_two, + rf_local_divide( + rf_convert_cell_type(tile, "float32"), + 2) AS over_two + FROM rf_test_sql""") + + arith.createOrReplaceTempView('rf_test_sql_1') + arith.show(truncate=False) + stats = self.spark.sql(""" + SELECT rf_tile_mean(tile) as base, + rf_tile_mean(add_one) as plus_one, + rf_tile_mean(less_one) as minus_one, + rf_tile_mean(times_two) as double, + rf_tile_mean(over_two) as half, + rf_no_data_cells(tile) as nd + + FROM rf_test_sql_1 + ORDER BY rf_no_data_cells(tile) + """) + stats.show(truncate=False) + stats.createOrReplaceTempView('rf_test_sql_stats') + + compare = self.spark.sql(""" + SELECT + plus_one - 1.0 = base as add, + minus_one + 1.0 = base as subtract, + double / 2.0 = base as multiply, + half * 2.0 = base as divide, + nd + FROM rf_test_sql_stats + """) + + expect_row1 = compare.orderBy('nd').first() + + self.assertTrue(expect_row1.subtract) + self.assertTrue(expect_row1.multiply) + self.assertTrue(expect_row1.divide) + self.assertEqual(expect_row1.nd, 0) + self.assertTrue(expect_row1.add) + + expect_row2 = compare.orderBy('nd', ascending=False).first() + + self.assertTrue(expect_row2.subtract) + self.assertTrue(expect_row2.multiply) + self.assertTrue(expect_row2.divide) + self.assertTrue(expect_row2.nd > 0) + self.assertTrue(expect_row2.add) # <-- Would fail in a case where ND + 1 = 1 def test_explode(self): import pyspark.sql.functions as F From 695471909a60a2190f559272ecc346ba388af28f Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Fri, 2 Aug 2019 16:38:42 -0400 Subject: [PATCH 294/380] changed creation of spark dataframes. added explicit call to display Signed-off-by: Eric Culbertson --- .../src/main/python/docs/nodata-handling.pymd | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index 4505c32f2..5d801bc6d 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -158,9 +158,8 @@ for i in range(4): x[:, i*tile_size//4:(i+1)*tile_size//4] = i x = Tile(x) -rf = spark.createDataFrame(pd.DataFrame(data = - {'tile': [x]})) -x +rf = spark.createDataFrame([Row(tile=x)]) +display(x) ``` First, we mask the value of 1 by making a new column with the user defined cell type 'uint16ud1'. Then, we mask out the value of two by making a tile with the cell type 'uint16ud2'. @@ -197,13 +196,12 @@ Let's use the same tile as before to demonstrate how NoData values affect tile a ```python tile_size = 100 -x = np.eye(tile_size, dtype='int16') +x = np.zeros((tile_size, tile_size), dtype='int16') for i in range(4): x[:, i*tile_size//4:(i+1)*tile_size//4] = i x = Tile(x) -rf = spark.createDataFrame(pd.DataFrame(data = - {'tile': [x]})) +rf = spark.createDataFrame([Row(tile=x)]) display(x) ``` @@ -235,9 +233,8 @@ Let's first create a RasterFrame that has columns of `float` and `int` cell type ```python x = Tile((np.ones((100, 100))*2).astype('float')) y = Tile((np.ones((100, 100))*3.0).astype('int32')) -rf = spark.createDataFrame(pd.DataFrame(data = - {'x': [x], - 'y': [y]})) +rf = spark.createDataFrame([Row(x=x, y=y)]) + rf.select(rf_cell_type('y'), rf_cell_type('x')).distinct().show() ``` @@ -257,8 +254,8 @@ def get_nodata_ct(nd_val): x = Tile((np.ones((100, 100))*3).astype('int16')) -rf = spark.createDataFrame(pd.DataFrame(data = - {'x': [x]})) +rf = spark.createDataFrame([Row(x=x)]) + rf_nd = rf.withColumn('x_nd_1', rf_convert_cell_type('x', get_nodata_ct(1))) \ .withColumn('x_nd_2', rf_convert_cell_type('x', get_nodata_ct(2))) ``` From b342f21fd61cc7ca8362407d961ee5eca45abb29 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 5 Aug 2019 10:52:23 -0400 Subject: [PATCH 295/380] Fixed handling of literal CRSs. --- pyrasterframes/src/main/python/docs/supervised-learning.pymd | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/supervised-learning.pymd b/pyrasterframes/src/main/python/docs/supervised-learning.pymd index a13b39b7b..dc38ace05 100644 --- a/pyrasterframes/src/main/python/docs/supervised-learning.pymd +++ b/pyrasterframes/src/main/python/docs/supervised-learning.pymd @@ -5,7 +5,8 @@ In this example we will demonstrate how to fit and score a supervised learning m ```python, setup, echo=False from IPython.core.display import display from pyrasterframes.utils import create_rf_spark_session -from pyrasterframes.rasterfunctions import * +from pyrasterframes.rasterfunctions import * +from pyspark.sql.functions import lit import pandas as pd import numpy as np import matplotlib.pyplot as plt @@ -71,7 +72,7 @@ print('Found ', len(crses), 'distinct CRS.') crs = crses[0][0] label_df = spark.read.geojson(os.path.join(resource_dir_uri(), 'luray-labels.geojson')) \ - .select('id', st_reproject('geometry', 'EPSG:4326', crs).alias('geometry')) \ + .select('id', st_reproject('geometry', lit('EPSG:4326'), lit(crs)).alias('geometry')) \ .hint('broadcast') df_joined = df.join(label_df, st_intersects(st_geometry('extent'), 'geometry')) From e89c4011c86e061110d5fe02d43a4cb29e8385de Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 5 Aug 2019 10:53:23 -0400 Subject: [PATCH 296/380] Allow CellType or str in rasterfunctions Signed-off-by: Jason T. Brown --- .../src/main/python/docs/nodata-handling.pymd | 16 +++++----------- .../python/pyrasterframes/rasterfunctions.py | 13 ++++++++++--- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index 5d801bc6d..fcd16db50 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -133,16 +133,16 @@ We can verify that the number of NoData cells in the resulting `blue_masked` col masked.select(rf_no_data_cells('blue_masked'), rf_tile_sum('mask')).show(10) ``` -It's also nice to view a sample. +It's also nice to view a sample. The white regions are areas of NoData. -```python +```python, caption='Blue band masked against selected SCL values' sample = masked.orderBy(-rf_no_data_cells('blue_masked')).select(rf_tile('blue_masked'), rf_tile('scl')).first() display(sample[0]) ``` -And the original SCL data. +And the original SCL data. The bright yellow is a cloudy region in the original image. -```python +```python, caption='SCL tile for above' display(sample[1]) ``` @@ -166,7 +166,7 @@ First, we mask the value of 1 by making a new column with the user defined cell ```python def get_nodata_ct(nd_val): - return CellType('uint16').with_no_data_value(nd_val).cell_type_name + return CellType('uint16').with_no_data_value(nd_val) masked_rf = rf.withColumn('tile_nd_1', rf_convert_cell_type('tile', get_nodata_ct(1))) \ @@ -208,9 +208,6 @@ display(x) First we create the two new masked tile columns as before. One with only the value of 1 masked, and the other with and values of 1 and 2 masked. ```python -def get_nodata_ct(nd_val): - return CellType('uint16').with_no_data_value(nd_val).cell_type_name - masked_rf = rf.withColumn('tile_nd_1', rf_convert_cell_type('tile', get_nodata_ct(1))) \ .withColumn('tile_nd_2', @@ -249,9 +246,6 @@ Combining tile columns of different cell types gets a little trickier when user ```python -def get_nodata_ct(nd_val): - return CellType('uint16').with_no_data_value(nd_val).cell_type_name - x = Tile((np.ones((100, 100))*3).astype('int16')) rf = spark.createDataFrame([Row(x=x)]) diff --git a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py index e342842d9..0c9f3939a 100644 --- a/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py +++ b/pyrasterframes/src/main/python/pyrasterframes/rasterfunctions.py @@ -36,9 +36,16 @@ def _context_call(name, *args): return f(*args) -def _parse_cell_type(cell_type_str): - """ Convert the string cell type to the expected CellType object.""" - return _context_call('_parse_cell_type', cell_type_str) +def _parse_cell_type(cell_type_arg): + """ Convert the cell type representation to the expected JVM CellType object.""" + + def to_jvm(ct): + return _context_call('_parse_cell_type', ct) + + if isinstance(cell_type_arg, str): + return to_jvm(cell_type_arg) + elif isinstance(cell_type_arg, CellType): + return to_jvm(cell_type_arg.cell_type_name) def rf_cell_types(): From 3a51158527db8fc728bfc507564365f34586125a Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 5 Aug 2019 11:46:54 -0400 Subject: [PATCH 297/380] Add prospective links to getting started docs Signed-off-by: Jason T. Brown --- .../src/main/python/docs/getting-started.pymd | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index df4f97676..543ddb89c 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -1,6 +1,10 @@ # Getting Started -There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames, and @ref:[several languages](languages.md) with which you can use it. Let's start with the simplest: the Python shell. Python 3.6 or greater is recommended. +There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames, and @ref:[several languages](languages.md) with which you can use it. Let's start with the simplest: the Python shell. To get started you will need: + +1. [Python](https://www.python.org/) installed. Version 3.6 or greater is recommended. +1. `pip` or `pip3` (recommended) installed. If you are using Python 3, `pip3` may already be installed. +1. Java [JDK 8](https://openjdk.java.net/install/index.html) installed on your system and `java` on your system `PATH` or `JAVA_HOME` pointing to a Java installation. ## pip install pyrasterframes @@ -31,8 +35,7 @@ df.select(rf_local_add(df.proj_raster, lit(3))).show(5, False) This example is extended in the [getting started Jupyter notebook](https://nbviewer.jupyter.org/github/locationtech/rasterframes/blob/develop/rf-notebook/src/main/notebooks/Getting%20Started.ipynb). -To understand more about how and why RasterFrames represents Earth observation in DataFrames, read the project @ref:[description](description.md). For more hands-on examples, see the chapters about @ref:[reading](raster-io.md) and @ref:[processing](raster-processing.md) with RasterFrames. - +To understand more about how and why RasterFrames represents Earth observation in DataFrames, read about the @ref:[core concepts](concepts.md) and the project @ref:[description](description.md). For more hands-on examples, see the chapters about @ref:[reading](raster-io.md) and @ref:[processing](raster-processing.md) with RasterFrames. ## Other Options @@ -43,15 +46,27 @@ You can also use RasterFrames in the following environments: ### Jupyter Notebook -**TODO** User facing quick instructions e.g. how to pull and run docker hub hosted container + RasterFrames provides a Docker image for a Jupyter notebook server whose default kernel is already set up for running RasterFrames. To use it: + + 1. Install [docker](https://docs.docker.com/install/) + 1. Pull the image: `docker pull s22s/rasterframes-notebook` + 1. Run a container with the image, for example: + + docker run -p 8808:8888 -p 44040:4040 -v /path/to/notebooks:/home/notebooks rasterframes-notebook:latest -See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook/README.md) for instructions on running a Jupyter notebook server within a Docker container that has a fully set up environment. + 1. In a browser, open `localhost:8808` in the example above. + +See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook/README.md) for instructions on building the Docker image for this Jupyter notebook server. ### `pyspark` shell or app -To initialize RasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. +To initialize RasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. + +You can either [build](https://github.com/locationtech/rasterframes/blob/develop/README.md) the artifacts or download them: + + * Assembly JAR: https://repo1.maven.org/maven2/org/locationtech/rasterframes/pyrasterframes_2.11/${VERSION}/pyrasterframes-assembly-${VERSION}.jar + * Python zip: https://repo1.maven.org/maven2/org/locationtech/rasterframes/pyrasterframes_2.11/${VERSION}/pyrasterframes_2.11-${VERSION}-python.zip -**TODO** how to build or download those artifacts. ```bash pyspark \ From 9488923f5ec88e61c89f71786ffca712ed143b48 Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Mon, 5 Aug 2019 09:42:36 -0700 Subject: [PATCH 298/380] cleaned up need for cell type name Signed-off-by: Eric Culbertson --- pyrasterframes/src/main/python/docs/nodata-handling.pymd | 1 - 1 file changed, 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index fcd16db50..2acf32552 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -241,7 +241,6 @@ When performing a local operation between tile columns with cell types `int` and rf_added = rf.withColumn('xy_sum', rf_local_add('y', 'x')) rf_added.select(rf_cell_type('xy_sum'), rf_cell_type('y'), rf_cell_type('x')).distinct().show() ``` - Combining tile columns of different cell types gets a little trickier when user defined NoData cell types are involved. Let's create 3 tile columns: one without a defined NoData value, one with a NoData value of 1, and one with a NoData value of 2. From b4d92af08a89ca7a8c88bd2e745f7661eb8d1d69 Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Mon, 5 Aug 2019 12:52:35 -0400 Subject: [PATCH 299/380] add fiona version to required libraries Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/setup.py | 1 + 1 file changed, 1 insertion(+) diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index d4a1491d0..661a2028b 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -145,6 +145,7 @@ def initialize_options(self): 'ipython==6.2.1', "ipykernel==4.8.0", 'Pweave==0.30.3', + 'fiona==1.8.6' ], tests_require=[ 'pytest==3.4.2', From c09ee49b78daa626dacd840ec62b8d8f9e34e8fe Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Mon, 5 Aug 2019 10:03:24 -0700 Subject: [PATCH 300/380] update the examplanation of the fancy tile Signed-off-by: Eric Culbertson --- pyrasterframes/src/main/python/docs/nodata-handling.pymd | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index 2acf32552..d778c42a9 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -148,12 +148,13 @@ display(sample[1]) ## Changing a Tile's NoData Values -One way to mask a tile is to make a new tile with a user defined NoData value. We will explore this method below. First, lets create a rasterframe from a tile with values of 0, 1, 2, and 3. +One way to mask a tile is to make a new tile with a user defined NoData value. We will explore this method below. First, lets create a rasterframe from a tile with values of 0, 1, 2, and 3. We will use numpy to create a 100x100 Tile with columns of 0, 1, 2, and 3. ```python create_dummy_tile tile_size = 100 x = np.zeros((tile_size, tile_size), dtype='int16') +# setting the values of the columns for i in range(4): x[:, i*tile_size//4:(i+1)*tile_size//4] = i x = Tile(x) From 818cffbe73f8f34f50b2ddb5709f7fad0114fcf2 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 5 Aug 2019 13:57:06 -0400 Subject: [PATCH 301/380] Basic support for generating a PDF for proofreading. --- README.md | 6 +- docs/build.sbt | 81 ++++++++++++++++++ docs/src/main/latex/header.latex | 2 + docs/src/main/paradox/RasterFramePipeline.png | Bin 0 -> 30917 bytes docs/src/main/paradox/release-notes.md | 10 +-- pyrasterframes/src/main/python/docs/index.md | 4 +- .../src/main/python/docs/raster-read.pymd | 26 +++--- 7 files changed, 106 insertions(+), 23 deletions(-) create mode 100644 docs/build.sbt create mode 100644 docs/src/main/latex/header.latex create mode 100644 docs/src/main/paradox/RasterFramePipeline.png diff --git a/README.md b/README.md index fa878e5b1..77795f2b2 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ - +® [![Join the chat at https://gitter.im/s22s/raster-frames](https://badges.gitter.im/s22s/raster-frames.svg)](https://gitter.im/s22s/raster-frames?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) _RasterFrames™_ brings the power of Spark DataFrames to geospatial raster data, empowered by the map algebra and tile layer operations of [GeoTrellis](https://geotrellis.io/). - + Please see the [Getting Started](http://rasterframes.io/getting-started.html) section of the Users' Manual to start using RasterFrames. @@ -54,6 +54,6 @@ The `pyrasterframes` build instructions are located at [pyrasterframes/src/main/ ## Copyright and License -RasterFrames is released under the Apache 2.0 License, copyright Astraea, Inc. 2017-2018. +RasterFrames is released under the Apache 2.0 License, copyright Astraea, Inc. 2017-2019. diff --git a/docs/build.sbt b/docs/build.sbt new file mode 100644 index 000000000..4e9ed21d8 --- /dev/null +++ b/docs/build.sbt @@ -0,0 +1,81 @@ +// task to create documentation PDF +lazy val makePDF = taskKey[File]("Build PDF version of documentation") +lazy val pdfFileName = settingKey[String]("Name of the PDF file generated") +pdfFileName := s"${name.value}-${version.value}.pdf" + +makePDF := { + import scala.sys.process._ + + // Get the python source directory configured in the root project. + val base = (Compile / paradox / sourceDirectories).value.find(_.toString.contains("python")).head + println(base) + + // Hard coded lacking any simple way of determining order. + val files = Seq( + "index.md", + "description.md", + "concepts.md", + "getting-started.md", + "raster-io.md", + "raster-catalogs.md", + "raster-read.md", + "raster-write.md", + "vector-data.md", + "raster-processing.md", + "local-algebra.md", + "nodata-handling.md", + "aggregation.md", + "time-series.md", + "machine-learning.md", + "unsupervised-learning.md", + "supervised-learning.md", + "numpy-pandas.md", + "languages.md", + "reference.md" + ).map(base ** _).flatMap(_.get) + + val log = streams.value.log + log.info("Section ordering:") + files.foreach(f => log.info(" - " + f.getName)) + + val work = target.value / "makePDF" + work.mkdirs() + + val prepro = files.zipWithIndex.map { case (f, i) ⇒ + val dest = work / f"$i%02d.md" + // Filter cross links and add a newline + (Seq("sed", "-e", """s/@ref:\[\([^]]*\)\](.*)/_\1_/g;s/@@.*//g""", f.toString) #> dest).! + // Add newline at the end of the file so as to make pandoc happy + ("echo" #>> dest).! + ("echo \\pagebreak" #>> dest).! + dest + } + + val output = target.value / pdfFileName.value + + val header = (Compile / sourceDirectory).value / "latex" / "header.latex" + + val args = "pandoc" :: + "--from=markdown" :: + "--to=pdf" :: + "-t" :: "latex" :: + "-s" :: + "--toc" :: + "-V" :: "title:RasterFrames Users' Manual" :: + "-V" :: "author:Astraea, Inc." :: + "-V" :: "geometry:margin=0.75in" :: + "-V" :: "papersize:letter" :: + "-V" :: "links-as-notes" :: + "--include-in-header" :: header.toString :: + "-o" :: output.toString :: + prepro.map(_.toString).toList + + log.info(s"Running: ${args.mkString(" ")}") + Process(args, base).! + + log.info("Wrote: " + output) + + output +} + +//makePDF := makePDF.dependsOn(Compile / paradox).value diff --git a/docs/src/main/latex/header.latex b/docs/src/main/latex/header.latex new file mode 100644 index 000000000..a6fca2586 --- /dev/null +++ b/docs/src/main/latex/header.latex @@ -0,0 +1,2 @@ +\DeclareUnicodeCharacter{2218}{$\circ$} +\DeclareUnicodeCharacter{2714}{$\checkmark} diff --git a/docs/src/main/paradox/RasterFramePipeline.png b/docs/src/main/paradox/RasterFramePipeline.png new file mode 100644 index 0000000000000000000000000000000000000000..26900b8cfb0bef005fac34b2c43c42e6bdd13aca GIT binary patch literal 30917 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 z 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 +
                  @@ -24,7 +24,7 @@ The source code can be found on GitHub at [locationtech/rasterframes](https://gi ## Related Links -* [Gitter Channel](https://gitter.im/s22s/raster-frames)  [![Join the chat at https://gitter.im/s22s/raster-frames](https://badges.gitter.im/s22s/raster-frames.svg)](https://gitter.im/s22s/raster-frames?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) +* [Gitter Channel](https://gitter.im/s22s/raster-frames) * [Scala API Documentation](latest/api/index.html) * [GitHub Repository](https://github.com/locationtech/rasterframes) * [Astraea, Inc.](http://www.astraea.earth/), the company behind RasterFrames diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 1d3f8b252..25f6d0910 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -54,19 +54,19 @@ display(tile) RasterFrames relies on three different IO drivers, selected based on a combination of scheme, file extentions, and library availability. GDAL is used first if a compatible version of GDAL (>= 2.4) is installed. It is the only driver that can read non-GeoTIFF files. If GDAL is not available, either the _Java I/O` or _Hadoop_ driver will be selected, depending on scheme. -| Prefix | GDAL | Java I/O | Hadoop | -| ------------------- | ----------- | -------- | ------ | -| `gdal:////` | ✔︎ | -︎ | - | -| `file://` | ✔︎ | ✔︎ | - | -| `http://` | ✔︎ | ✔︎ | - | -| `https://` | ✔︎ | ✔︎ | - | -| `ftp://` | `/vsicurl/` | ✔ | - | -| `hdfs://` | `/vsihdfs/` ︎| - | ✔︎ | -| `s3://` | `/vsis3/` ︎ | ✔︎ | - | -| `s3n://` | - ︎ | - | ✔︎ | -| `s3a://` | - ︎ | - | ✔︎ | -| `wasb://` | `/vsiaz/` ︎ | - | ✔︎ | -| `wasbs://` | - ︎ | - | ✔︎ | +| Prefix | GDAL | Java I/O | Hadoop | +| ------------------- | ----------- | -------- | -------- | +| `gdal:////` | + | - | - | +| `file://` | + | + | - | +| `http://` | + | + | - | +| `https://` | + | + | - | +| `ftp://` | `/vsicurl/` | + | - | +| `hdfs://` | `/vsihdfs/` |- | + | +| `s3://` | `/vsis3/` | + | - | +| `s3n://` | - | - | + | +| `s3a://` | - | - | + | +| `wasb://` | `/vsiaz/` | - | + | +| `wasbs://` | - | - | + | Specific [GDAL Virtual File System drivers](https://gdal.org/user/virtual_file_systems.html) can be selected using the `gdal:////` syntax. For example If you have a `archive.zip` file containing a GeoTiff named `my-file-inside.tif`, you can address it with `gdal://vsizip//path/to/archive.zip/my-file-inside.tif`. See the GDAL documentation for the format of the URIs after the `gdal:/` prefix (which is stripped off before passing the rest of the path to GDAL). From f617ad5f355cf2a5e28ffd1d96538b676fbb512d Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Mon, 5 Aug 2019 14:03:28 -0400 Subject: [PATCH 302/380] fix spelling Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/description.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md index 33aac6cdb..53961166b 100644 --- a/pyrasterframes/src/main/python/docs/description.md +++ b/pyrasterframes/src/main/python/docs/description.md @@ -4,7 +4,7 @@ RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling ## Context -We have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. +We have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. Today, DataFrames are the _lingua franca_ of data science. The evolution of the tabular form has continued with Apache Spark SQL, which brings DataFrames to the big data distributed compute space. Through several novel innovations, Spark SQL enables interactive and batch-oriented cluster computing without having to be versed in the highly specialized skills typically required for high-performance computing. As suggested by the name, these DataFrames are manipulatable via standard SQL, as well as the more general-purpose programming languages Python, R, Java, and Scala. @@ -14,7 +14,7 @@ RasterFrames®, an incubating Eclipse Foundation LocationTech project, brings to ## Benefit -By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. Because it is built on Apache Spark, solutions prototyped on a laptop can be scaled to run on cluster and cloud compute resources in a way not easily achieved with other toolchains. +By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. Because it is built on Apache Spark, solutions prototyped on a laptop can be scaled to run on cluster and cloud compute resources in a way not easily achieved with other toolchains. ## Architecture @@ -27,7 +27,7 @@ RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO RasterFrames introduces georectified raster imagery to Spark SQL. It quantizes scenes into chunks called "tiles". Each tile contains a 2-D matrix of "cell" (pixel) values along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", but can also be quality assurance information, land classification assignments, or any other rasterized spatiotemporal data. Along with `tile` columns there is typically an `extent` specifying the geographic location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when filtering -RasterFrames also includes support for working with vector data, such as [GeoJSON][GeoJSON]. You can use vector data to filter DataFrame rows, using geospatial predicates (e.g. contains, intersects, overlaps, etc.), to mask cells, and to be rasterzied into training data appropriate for machine learning. +RasterFrames also includes support for working with vector data, such as [GeoJSON][GeoJSON]. You can use vector data to filter DataFrame rows, using geospatial predicates (e.g. contains, intersects, overlaps, etc.), to mask cells, and to be rasterized into training data appropriate for machine learning. ![RasterFrame Anatomy](static/rasterframe-anatomy.png) @@ -42,4 +42,4 @@ Raster data can be read from a number of sources. Through the flexible Spark SQL [COGS]:https://www.cogeo.org/ [^1]: [_Demystifying Satellite Assets for Post-Disaster Situation Awareness_](https://docs.google.com/document/d/11bIw5HcEiZy8SKli6ZFQC2chVEiiIJ-f0o6btA4LU48). -World Bank via [OpenDRI.org](https://opendri.org/resource/demystifying-satellite-assets-for-post-disaster-situation-awareness/). Accessed November 28, 2018. +World Bank via [OpenDRI.org](https://opendri.org/resource/demystifying-satellite-assets-for-post-disaster-situation-awareness/). Accessed November 28, 2018. From 39392d236617aab615420d7a7b97af975161c309 Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Mon, 5 Aug 2019 14:29:26 -0400 Subject: [PATCH 303/380] fix spelling/grammar mistakes Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/concepts.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/concepts.md b/pyrasterframes/src/main/python/docs/concepts.md index 62a40d64a..0ddfd6a30 100644 --- a/pyrasterframes/src/main/python/docs/concepts.md +++ b/pyrasterframes/src/main/python/docs/concepts.md @@ -1,6 +1,6 @@ # Concepts -There are a number of Earth-observation (EO) concepts that crop up in the discussion of RasterFrames features. We'll cover these briefly in the sections below. However, here are a few links providing a more extensive introduction to working with Earth observation data. +There are a number of Earth-observation (EO) concepts that crop up in the discussion of RasterFrames features. We'll cover these briefly in the sections below. However, here are a few links providing a more extensive introduction to working with Earth observation data. * [_Fundamentals of Remote Sensing_](https://www.nrcan.gc.ca/maps-tools-and-publications/satellite-imagery-and-air-photos/tutorial-fundamentals-remote-sensing/9309) * [_Newcomers Earth Observation Guide_](https://business.esa.int/newcomers-earth-observation-guide) @@ -8,7 +8,7 @@ There are a number of Earth-observation (EO) concepts that crop up in the discus ## Cell -A cell is a single sample from a sensor encoded as a scalar value asssociated with a specific spatiotemporal location and time. It can be thought of as an image pixel associated with a place and time. +A cell is a single sample from a sensor encoded as a scalar value associated with a specific spatiotemporal location and time. It can be thought of as an image pixel associated with a place and time. ## Cell Type @@ -35,15 +35,15 @@ See the section on [“NoData” Handling](nodata-handling.md) for additional di ## NoData -A "NoData" (or N/A) value is a specifically identified value for a cell type used to indicate the absence of data. See the section on @ref:[“NoData” Handling](nodata-handling.md) for additional discussion on NoData +A "NoData" (or N/A) value is a specifically identified value for a cell type used to indicate the absence of data. See the section on @ref:[“NoData” Handling](nodata-handling.md) for additional discussion on "NoData". ## Scene -A scene (or granule) is a discrete instance of EO data with a specific extent (region), date-time, and projection/CRS. +A scene (or granule) is a discrete instance of EO data with a specific extent (region), date-time, and projection/CRS. ## Coordinate Reference System (CRS) -A coordinate reference system (or spatial reference system) is a set of mathematical constructs used to map cells to specific locations on the Earth (or other surface). A CRS typcially accompanies any EO data so it can be precicely located. +A coordinate reference system (or spatial reference system) is a set of mathematical constructs used to map cells to specific locations on the Earth (or other surface). A CRS typically accompanies any EO data so it can be precisely located. ## Extent @@ -51,17 +51,17 @@ An extent (or bounding box) is a rectangular region specifying the geospatial co ## Tile -A tile (sometimes called a "chip") is a rectangular subset of a @ref:[scene](concepts.md#scene). A tile can conceptually be though of as a two-dimensional array. +A tile (sometimes called a "chip") is a rectangular subset of a @ref:[scene](concepts.md#scene). A tile can conceptually be thought of as a two-dimensional array. Some EO data has many bands or channels. Tiles in this context are conceptually a three-dimensional array, with the extra dimension representing the bands. -Tiles are often square and the dimensions are some power of two, for example 256 by 256. +Tiles are often square and the dimensions are some power of two, for example 256 by 256. The tile is the primary discretization unit used in RasterFrames. Each band of a scene is in a separate column. The scene's overall @ref:[extent](concepts.md#extent) is carved up into smaller extents for each tile. Each row of the DataFrame contains a two-dimensional tile per band column. ## Projected Extent -An extent paired with a CRS +An extent paired with a CRS. ## Projected Raster From aa67b16158fa7f26a42b42353889d8642815bfbb Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Mon, 5 Aug 2019 15:36:09 -0400 Subject: [PATCH 304/380] remove extra parenthesis Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/raster-io.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-io.md b/pyrasterframes/src/main/python/docs/raster-io.md index 3880d8629..b007ec291 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.md +++ b/pyrasterframes/src/main/python/docs/raster-io.md @@ -9,12 +9,12 @@ The standard mechanism by which any data is brought in and out of a Spark Datafr * @ref:[Raster Readers](raster-read.md) - `raster`: the standard reader for most raster data, including single raster files or catalogs - `geotiff`: a simplified reader for reading a single GeoTIFF file - - `geotrellis`: for reading a [GeoTrellis layer][GTLayer]) + - `geotrellis`: for reading a [GeoTrellis layer][GTLayer] * @ref:[Raster Writers](raster-write.md) - @ref:[Tile](raster-write.md#tile-samples) and @ref:[DataFrame](raster-write.md#dataframe-samples) samples - `geotiff`: beta writer to GeoTiff file - `geotrellis`: creating a [GeoTrellis layer][GTLayer] - - [`parquet`][Parquet]: general purpose writer + - [`parquet`][Parquet]: general purpose writer There is also support for @ref:[vector data](vector-data.md) for masking and data labeling. @@ -29,4 +29,4 @@ There is also support for @ref:[vector data](vector-data.md) for masking and dat [GTLayer]: https://geotrellis.readthedocs.io/en/latest/guide/tile-backends.html [Parquet]: https://spark.apache.org/docs/latest/sql-data-sources-parquet.html [MODIS]: https://docs.opendata.aws/modis-pds/readme.html -[Landsat]: https://docs.opendata.aws/landsat-pds/readme.html \ No newline at end of file +[Landsat]: https://docs.opendata.aws/landsat-pds/readme.html From 4f92e99c42dcd71766d99316ad8b7afc8ac925d0 Mon Sep 17 00:00:00 2001 From: "Simeon H.K. Fitch" Date: Mon, 5 Aug 2019 16:14:57 -0400 Subject: [PATCH 305/380] Added `rf-notebooks/includeNotebooks` settings. Partial installation of GDAL in rf-notebooks. Version is incorrect. Docs on installing and checking GDAL. --- docs/build.sbt | 4 +- .../src/main/python/docs/getting-started.pymd | 39 +++++++++++++++++-- rf-notebook/build.sbt | 11 +++++- rf-notebook/src/main/docker/Dockerfile | 20 ++++++---- 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/docs/build.sbt b/docs/build.sbt index 4e9ed21d8..8e2325fa0 100644 --- a/docs/build.sbt +++ b/docs/build.sbt @@ -1,7 +1,7 @@ // task to create documentation PDF lazy val makePDF = taskKey[File]("Build PDF version of documentation") lazy val pdfFileName = settingKey[String]("Name of the PDF file generated") -pdfFileName := s"${name.value}-${version.value}.pdf" +pdfFileName := s"RasterFrames-Users-Manual-${version.value}.pdf" makePDF := { import scala.sys.process._ @@ -78,4 +78,4 @@ makePDF := { output } -//makePDF := makePDF.dependsOn(Compile / paradox).value +makePDF := makePDF.dependsOn(Compile / paradox).value diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index df4f97676..795322bba 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -78,8 +78,41 @@ spark.stop() ## Installing GDAL -GDAL provides a wide variety of drivers to read data from many different raster formats. If GDAL is installed in the environment, RasterFrames will be able to @ref:[read](raster-read.md) those formats. If you are using the @ref:[Jupyter Notebook image](getting-started.md#jupyter-notebook), GDAL is already installed for you. Otherwise follow the instructions below. +GDAL provides a wide variety of drivers to read data from many different raster formats. If GDAL is installed in the environment, RasterFrames will be able to @ref:[read](raster-read.md) those formats. If you are using the @ref:[Jupyter Notebook image](getting-started.md#jupyter-notebook), GDAL is already installed for you. Otherwise follow the instructions below. Version 2.4.1 or greater is required. -__TODO__ Verify notebook env has GDAL? +### Installing on MacOS -__TODO__ How to install it. +Using [homebrew](https://brew.sh/): + +```bash +brew install gdal +``` + +### Installing on Linux + +Using [`apt-get`](https://wiki.debian.org/Apt): + +```bash +sudo apt-get update +sudo apt-get install gdal-bin +``` + +### Testing For GDAL + +```bash +gdalinfo --formats +``` + +To support GeoTIFF and JPEG2000 formats, you should look for the following drivers from the output above: + +* `GTiff -raster- (rw+vs): GeoTIFF` +* `JPEG2000 -raster,vector- (rwv): JPEG-2000 part 1 (ISO/IEC 15444-1), based on Jasper library` + +Do the following to see if RasterFrames was able to find GDAL: + +```python +from pyrasterframes.utils import gdal_version +print(gdal_version()) +``` + +This will print out somethin like "GDAL x.y.z, released 20yy/mm/dd". If it reports `unavailable`, then GDAL isn't installed in a place where the RasterFrames runtime was able to find it. Please [file an issue](https://github.com/locationtech/rasterframes/issues) to get help resolving it. \ No newline at end of file diff --git a/rf-notebook/build.sbt b/rf-notebook/build.sbt index 753f13cef..cac2f88ce 100644 --- a/rf-notebook/build.sbt +++ b/rf-notebook/build.sbt @@ -1,6 +1,9 @@ import scala.sys.process.Process import PythonBuildPlugin.autoImport.pyWhl +lazy val includeNotebooks = settingKey[Boolean]("Whether to build documentation into notebooks and include them") +includeNotebooks := true + Docker / packageName := "rasterframes-notebook" Docker / version := version.value @@ -20,7 +23,13 @@ Docker / mappings := Def.sequential( val dockerAssets = (dockerSrc ** "*") pair Path.relativeTo(dockerSrc) val py = (LocalProject("pyrasterframes") / pyWhl).value - val _ = (LocalProject("pyrasterframes") / pySetup).toTask(" notebooks").value + + Def.taskDyn { + val withNB = includeNotebooks.value + if (withNB) + (LocalProject("pyrasterframes") / pySetup).toTask(" notebooks") + else Def.task(0) + }.value val nbFiles = ((LocalProject("pyrasterframes") / Python / doc / target).value ** "*.ipynb").get() diff --git a/rf-notebook/src/main/docker/Dockerfile b/rf-notebook/src/main/docker/Dockerfile index 0a22c820a..3b62ac84f 100644 --- a/rf-notebook/src/main/docker/Dockerfile +++ b/rf-notebook/src/main/docker/Dockerfile @@ -14,20 +14,24 @@ EXPOSE 4040 4041 4042 4043 4044 RUN conda install --quiet --yes \ anaconda sphinx nbsphinx shapely numpy folium geopandas geojsonio +RUN apt-get update && \ + apt-get install -y gdal-bin && \ + apt autoremove && \ + apt-get clean all + # Cleanup pip residuals RUN rm -rf /home/$NB_USER/.local && \ - fix-permissions $CONDA_DIR && \ fix-permissions /home/$NB_USER -# Do these after the standard environment setup -# since these change more regularly. +# Note: The above step takes an insanely long time in the CONDA_DIR, so commenting it out until we have perm issues. +# fix-permissions $CONDA_DIR + COPY *.whl $RF_LIB_LOC RUN ls -1 $RF_LIB_LOC/*.whl | xargs pip install +COPY jupyter_notebook_config.py $HOME/.jupyter +COPY examples $HOME/examples +RUN chmod -R +w $HOME/examples RUN chown -R $NB_UID:$NB_GID $HOME -USER $NB_UID - -COPY jupyter_notebook_config.py $HOME/.jupyter - -COPY examples $HOME/examples +USER $NB_UID \ No newline at end of file From 5b6e6cc42d049f51f72ddebe507aceac27af9dde Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Mon, 5 Aug 2019 16:18:56 -0400 Subject: [PATCH 306/380] Add more unit tests around RasterSource read tiling, round trip writing with GeoTiff datasource Signed-off-by: Jason T. Brown --- .../locationtech/rasterframes/TestData.scala | 1 + .../geotiff/GeoTiffDataSource.scala | 1 + .../geotiff/GeoTiffDataSourceSpec.scala | 73 +++++++------------ .../raster/RasterSourceDataSourceSpec.scala | 37 ++++++++++ 4 files changed, 66 insertions(+), 46 deletions(-) diff --git a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala index 584a01ef6..1b6b373e9 100644 --- a/core/src/test/scala/org/locationtech/rasterframes/TestData.scala +++ b/core/src/test/scala/org/locationtech/rasterframes/TestData.scala @@ -146,6 +146,7 @@ trait TestData { lazy val localSentinel: URI = getClass.getResource("/B01.jp2").toURI lazy val cogPath: URI = getClass.getResource("/LC08_RGB_Norfolk_COG.tiff").toURI + lazy val singlebandCogPath: URI = getClass.getResource("/LC08_B7_Memphis_COG.tiff").toURI lazy val nonCogPath: URI = getClass.getResource("/L8-B8-Robinson-IL.tiff").toURI lazy val l8B1SamplePath: URI = l8SamplePath(1) diff --git a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala index fe01d224d..5ec4ffb36 100644 --- a/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala +++ b/datasource/src/main/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSource.scala @@ -121,6 +121,7 @@ class GeoTiffDataSource rf_dimensions(tileCol) )) .first() + logger.debug(s"Contructed TileLayerMetadata: ${tlm.toString}") val c = ProjectedRasterDefinition(tlm) diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala index 5e22d13e0..266fdb8d6 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/geotiff/GeoTiffDataSourceSpec.scala @@ -23,6 +23,7 @@ package org.locationtech.rasterframes.datasource.geotiff import java.nio.file.Paths import geotrellis.proj4._ +import geotrellis.raster.ProjectedRaster import geotrellis.raster.io.geotiff.{MultibandGeoTiff, SinglebandGeoTiff} import geotrellis.vector.Extent import org.locationtech.rasterframes._ @@ -43,7 +44,7 @@ class GeoTiffDataSourceSpec assert(rf.count() > 10) } - it("should lay out tiles correctly"){ + it("should lay out tiles correctly") { val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer @@ -85,6 +86,9 @@ class GeoTiffDataSourceSpec assert(result === expected) } + } + + describe("GeoTiff writing") { it("should write GeoTIFF RF to parquet") { val rf = spark.read.format("geotiff").load(cogPath.toASCIIString).asLayer @@ -132,13 +136,31 @@ class GeoTiffDataSourceSpec } it("should round trip unstructured raster from COG"){ - val df = spark.read.format("raster") - .load(getClass.getResource("/LC08_B7_Memphis_COG.tiff").toURI.toASCIIString()) + import spark.implicits._ + import org.locationtech.rasterframes.datasource.raster._ + + val df = spark.read.raster.withTileDimensions(64, 64).load(singlebandCogPath.toASCIIString) + + val resourceCols = 963 // from gdalinfo + val resourceRows = 754 + val resourceExtent = Extent(752325.0, 3872685.0, 781215.0, 3895305.0) df.count() should be > 0L val crs = df.select(rf_crs(col("proj_raster"))).first() + val totalExtentRow = df.select(rf_extent($"proj_raster").alias("ext")) + .agg( + min($"ext.xmin").alias("xmin"), + min($"ext.ymin").alias("ymin"), + max($"ext.xmax").alias("xmax"), + max($"ext.ymax").alias("ymax") + ).first() + val dfExtent = Extent(totalExtentRow.getDouble(0), totalExtentRow.getDouble(1), totalExtentRow.getDouble(2), totalExtentRow.getDouble(3)) + logger.info(s"Dataframe extent: ${dfExtent.toString()}") + + dfExtent shouldBe (resourceExtent) + noException shouldBe thrownBy { df.write.geotiff.withCRS(crs).save("target/unstructured_cog.tif") } @@ -150,57 +172,16 @@ class GeoTiffDataSourceSpec } inCols should be (963) inRows should be (754) //from gdalinfo - inExtent should be (Extent(752325.0, 3872685.0, 781215.0, 3895305.0)) + inExtent should be (resourceExtent) val outputTif = SinglebandGeoTiff("target/unstructured_cog.tif") outputTif.imageData.cols should be (inCols) outputTif.imageData.rows should be (inRows) - outputTif.extent should be (inExtent) + outputTif.extent should be (resourceExtent) outputTif.cellType should be (inCellType) } - /* - it("should round trip jasons favorite unstructured raster round trip okay") { - import org.locationtech.rasterframes.datasource.raster._ - import spark.implicits._ - - val jasonsRasterPath = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/17/03/2019193/" + - "MCD43A4.A2019193.h17v03.006.2019202033615_B06.TIF" - val df = spark.read.raster - .withTileDimensions(233, 133) - .from(Seq(jasonsRasterPath)) - .load() - - logger.debug("Read local file metadata") - val (inCols, inRows) = { - val in = readSingleband("MCD43A4.A2019193.h17v03.006.2019202033615_B06.TIF") - (in.cols, in.rows) - } - inCols should be (2400) // from GDAL - inRows should be (2400) // from GDAL - - val outPath = "datasources/target/rf_mcd43a4.A2019193.h17v03.tif" - - // now take actions on the read df - logger.debug("Actions on raster ref dataframe") - df.count() should be > 100L - val crs = df.select(rf_crs($"proj_raster")).first() - logger.debug("Write full res geotiff from dataframe") - df.write.geotiff.withCRS(crs).save(outPath) - - // compare written file to path - logger.debug("Inspect written geotiff metadata") - val (outCols, outRows) = { - val outputTif = SinglebandGeoTiff(outPath) - (outputTif.cols, outputTif.rows) - } - outCols should be (inCols) - outRows should be (inRows) - // todo check extent and crs just for grins. - - }*/ - it("should write GeoTIFF without layer") { import org.locationtech.rasterframes.datasource.raster._ val pr = col("proj_raster_b0") diff --git a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala index a8ca3bef8..5f9716116 100644 --- a/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala +++ b/datasource/src/test/scala/org/locationtech/rasterframes/datasource/raster/RasterSourceDataSourceSpec.scala @@ -245,4 +245,41 @@ class RasterSourceDataSourceSpec extends TestEnvironment with TestData { } } + + describe("RasterSource breaks up scenes into tiles") { + val modis_df = spark.read.raster + .withTileDimensions(128, 128) + .withLazyTiles(true) + .load(remoteMODIS.toASCIIString()) + + val l8_df = spark.read.raster + .withTileDimensions(32, 33) + .withLazyTiles(true) + .load(remoteL8.toASCIIString()) + + ignore("should have at most four tile dimensions reading MODIS; ignore until fix #242") { + val dims = modis_df.select(rf_dimensions($"proj_raster")).distinct().collect() + dims.length should be > (0) + dims.length should be <= (4) + } + + it("should have at most four tile dimensions reading landsat") { + val dims = l8_df.select(rf_dimensions($"proj_raster")).distinct().collect() + dims.length should be > (0) + dims.length should be <= (4) + } + + ignore("should have consistent tile resolution reading MODIS; ignore until fix #242") { + val res = modis_df.select((rf_extent($"proj_raster").getField("xmax") - rf_extent($"proj_raster").getField("xmin")) / + rf_dimensions($"proj_raster").getField("cols")).distinct().collect() + res.length should be (1) + } + + it("should have consistent tile resolution reading Landsat") { + val res = l8_df.select((rf_extent($"proj_raster").getField("xmax") - rf_extent($"proj_raster").getField("xmin")) / + rf_dimensions($"proj_raster").getField("cols")).distinct().collect() + res.length should be (1) + } + + } } From fbf5d9661089160c61888f69decf4ff27aa2e8b1 Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Mon, 5 Aug 2019 16:26:27 -0400 Subject: [PATCH 307/380] spelling mistake Signed-off-by: Courtney Whalen --- .../src/main/python/docs/raster-catalogs.pymd | 30 +++++++++---------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd index 55d5ec68f..325ca0dd8 100644 --- a/pyrasterframes/src/main/python/docs/raster-catalogs.pymd +++ b/pyrasterframes/src/main/python/docs/raster-catalogs.pymd @@ -5,7 +5,7 @@ While much interesting processing can be done on a @ref:[single raster file](ras A _Catalog_ can have one or two dimensions: * One-D: A single column containing one or many URLs across the rows. All referenced rasters represent the same content type. For example, a column of URLs to Landsat 8 NIR rasters covering Europe. Each row represents different places and times. -* Two-D: Many columns containing raster URLs. Each column references the same content type, and each row represents the same place and time. For example, red-, green-, and blue-band columns for scenes covering Europe. Each row reperesents a single spatiotemporal location (or scene) with the same dimensions, extent, [_CRS_][CRS], etc across the row. +* Two-D: Many columns containing raster URLs. Each column references the same content type, and each row represents the same place and time. For example, red-, green-, and blue-band columns for scenes covering Europe. Each row represents a single spatiotemporal location (or scene) with the same dimensions, extent, [_CRS_][CRS], etc across the row. ## Creating a Catalog @@ -13,7 +13,7 @@ This section will provide some examples of creating your own _Catalogs_, as well ```python, echo=False from IPython.display import display -from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.utils import create_rf_spark_session from pyrasterframes.rasterfunctions import * import pandas as pd spark = create_rf_spark_session() @@ -21,13 +21,13 @@ spark = create_rf_spark_session() ### One-D -A single URL is this simplest form of a catalog. +A single URL is the simplest form of a catalog. ```python from pyspark.sql import Row my_cat = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF" -# or -my_cat_df = spark.createDataFrame([Row(B01=my_cat)]) +# or +my_cat_df = spark.createDataFrame([Row(B01=my_cat)]) ``` A single column represents the same content type with different observations along the rows. In this example it is band 1 of MODIS, which is visible red. In the example the location of the images is the same (h04v09) but the dates differ. @@ -37,7 +37,7 @@ scene1_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43 scene2_B01 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018188/MCD43A4.A2018188.h04v09.006.2018198232008_B01.TIF" # As CSV string -my_cat = '\n'.join(['B01', scene1_B01, scene2_B01]) +my_cat = '\n'.join(['B01', scene1_B01, scene2_B01]) # or my_cat_df = spark.createDataFrame([Row(B01=scene1_B01), Row(B01=scene2_B01)]) my_cat_df.printSchema() @@ -58,10 +58,10 @@ scene2_B02 = "https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018188/MCD43 # As CSV string -my_cat = '\n'.join(['B01,B02', scene1_B01 + "," + scene1_B02, scene2_B01 + "," + scene2_B02]) +my_cat = '\n'.join(['B01,B02', scene1_B01 + "," + scene1_B02, scene2_B01 + "," + scene2_B02]) # or my_cat_df = spark.createDataFrame([ - Row(B01=scene1_B01, B02=scene1_B02), + Row(B01=scene1_B01, B02=scene1_B02), Row(B01=scene2_B01, B02=scene2_B02)]) my_cat_df.printSchema() ``` @@ -77,21 +77,21 @@ from pyspark.sql import functions as F spark.sparkContext.addFile("https://modis-pds.s3.amazonaws.com/MCD43A4.006/2018-07-04_scenes.txt") # The scenes list file has index URIs in the download_url column, for example: -# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/index.html +# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/index.html # Image URIs take the form: -# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF +# https://modis-pds.s3.amazonaws.com/MCD43A4.006/04/09/2018185/MCD43A4.A2018185.h04v09.006.2018194032851_B01.TIF modis_catalog = spark.read \ .format("csv") \ .option("header", "true") \ .load(SparkFiles.get("2018-07-04_scenes.txt")) \ - .withColumn('base_url', + .withColumn('base_url', F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) ) \ .withColumn('B01' , F.concat('base_url', F.lit("_B01.TIF"))) \ .withColumn('B02' , F.concat('base_url', F.lit("_B02.TIF"))) \ - .withColumn('B03' , F.concat('base_url', F.lit("_B03.TIF"))) -# ... and so on. + .withColumn('B03' , F.concat('base_url', F.lit("_B03.TIF"))) +# ... and so on. modis_catalog.printSchema() ``` @@ -160,9 +160,9 @@ root |-- B9: string (nullable = true) |-- B10: string (nullable = true) |-- B11: string (nullable = true) - |-- BQA: string (nullable = true) + |-- BQA: string (nullable = true) ``` [MODIS]: https://docs.opendata.aws/modis-pds/readme.html [Landsat]: https://docs.opendata.aws/landsat-pds/readme.html -[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system \ No newline at end of file +[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system From fbf76089f2184d6b11ac6d5ae5ecf6d84f6ed0e3 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 6 Aug 2019 11:28:36 -0400 Subject: [PATCH 308/380] Address PR comments; more details on pyspark shell v submitting apps Signed-off-by: Jason T. Brown --- .../src/main/python/docs/getting-started.pymd | 60 +++++++++++++++---- 1 file changed, 50 insertions(+), 10 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index 543ddb89c..f83dbda9a 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -3,7 +3,7 @@ There are @ref:[several ways](getting-started.md#other-options) to use RasterFrames, and @ref:[several languages](languages.md) with which you can use it. Let's start with the simplest: the Python shell. To get started you will need: 1. [Python](https://www.python.org/) installed. Version 3.6 or greater is recommended. -1. `pip` or `pip3` (recommended) installed. If you are using Python 3, `pip3` may already be installed. +1. [`pip`](https://pip.pypa.io/en/stable/installing/) installed. If you are using Python 3, `pip` may already be installed. 1. Java [JDK 8](https://openjdk.java.net/install/index.html) installed on your system and `java` on your system `PATH` or `JAVA_HOME` pointing to a Java installation. ## pip install pyrasterframes @@ -30,11 +30,12 @@ df = spark.read.raster('https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/201 # Add 3 element-wise, show some rows of the dataframe df.select(rf_local_add(df.proj_raster, lit(3))).show(5, False) - ``` This example is extended in the [getting started Jupyter notebook](https://nbviewer.jupyter.org/github/locationtech/rasterframes/blob/develop/rf-notebook/src/main/notebooks/Getting%20Started.ipynb). +## Next Steps + To understand more about how and why RasterFrames represents Earth observation in DataFrames, read about the @ref:[core concepts](concepts.md) and the project @ref:[description](description.md). For more hands-on examples, see the chapters about @ref:[reading](raster-io.md) and @ref:[processing](raster-processing.md) with RasterFrames. ## Other Options @@ -60,16 +61,23 @@ See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/ ### `pyspark` shell or app -To initialize RasterFrames in a `pyspark` shell, prepare to call pyspark with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. +You can use RasterFrames in a `pyspark` shell or when submitting a `pyspark` app via a Python script. To set up the `pyspark` environment, prepare your call with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. You can either [build](https://github.com/locationtech/rasterframes/blob/develop/README.md) the artifacts or download them: - * Assembly JAR: https://repo1.maven.org/maven2/org/locationtech/rasterframes/pyrasterframes_2.11/${VERSION}/pyrasterframes-assembly-${VERSION}.jar * Python zip: https://repo1.maven.org/maven2/org/locationtech/rasterframes/pyrasterframes_2.11/${VERSION}/pyrasterframes_2.11-${VERSION}-python.zip + * Assembly JAR: + * The assembly JAR is embedded in the wheel file publised on pypi. Download the wheel from https://pypi.org/project/pyrasterframes/#files + * The wheel file is just a [zip file with .whl extension](https://www.python.org/dev/peps/pep-0427/); you can extract the assembly JAR with a command like this: `unzip -j $PYRF_WHEEL $(zipinfo -1 $PYRF_WHEEL | grep jar)` + + +#### Shell +The `pyspark` shell command will look something like this, replacing the `--jars` argument with the assembly jar and the `--py-files` with the source zip (not the wheel). To submit a script, add a .py file as the final argument ```bash pyspark \ + --master local[*] \ --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ --conf spark.kryo.registrator=org.locationtech.rasterframes.util.RFKryoRegistrator \ --conf spark.kryoserializer.buffer.max=500m \ @@ -77,18 +85,50 @@ You can either [build](https://github.com/locationtech/rasterframes/blob/develop --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip ``` -Then in the pyspark shell, import the module and call `withRasterFrames` on the SparkSession. +Then in the `pyspark` shell, import the module and call `withRasterFrames` on the SparkSession. ```python, evaluate=False -import pyrasterframes -spark = spark.withRasterFrames() -df = spark.read.raster('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') +Welcome to + ____ __ + / __/__ ___ _____/ /__ + _\ \/ _ \/ _ `/ __/ '_/ + /__ / .__/\_,_/_/ /_/\_\ version 2.3.2 + /_/ + +Using Python version 3.7.3 (default, Mar 27 2019 15:43:19) +SparkSession available as 'spark'. +>>> import pyrasterframes +>>> spark = spark.withRasterFrames() +>>> df = spark.read.raster('https://landsat-pds.s3.amazonaws.com/c1/L8/158/072/LC08_L1TP_158072_20180515_20180604_01_T1/LC08_L1TP_158072_20180515_20180604_01_T1_B5.TIF') ``` Now you have the configured SparkSession with RasterFrames enabled. -```python, echo=False -spark.stop() +#### Submitting Apps + +Prepare the call to `spark-submit` in much the same way as using the `pyspark` shell. In the python script you submit, you will use the SparkSession builder pattern and add some RasterFrames extras to it. You have more flexibility in setting up configurations in either your script or in the `spark-submit` call. + +```python, evaluate=False +# contents of app.py + +from pyspark.sql import SparkSession +import pyrasterframes +spark = (SparkSession.builder + .appName("My RasterFrames app") + .config('spark.some_config', some_val) # app configurations + .withKryoSerialization() # sets spark.serializer and spark.kryo configs + .getOrCreate()).withRasterFrames() +df = spark.read.raster('...') +``` + +To submit, use a call like: + +```bash +$ spark-submit \ + --master spark://sparkmaster:7077 \ + --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ + --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip \ + app.py ``` ## Installing GDAL From b97582859256ca88416e39a1728d1cc9ed1a0901 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 6 Aug 2019 12:37:53 -0400 Subject: [PATCH 309/380] Update getting started page, simplify pyspark shell; update notebooks Signed-off-by: Jason T. Brown --- pyrasterframes/README.md | 8 +- .../src/main/python/docs/getting-started.pymd | 51 +- .../src/main/notebooks/Getting Started.ipynb | 134 ++- .../pretty_rendering_rf_types.tile.ipynb | 891 ++---------------- 4 files changed, 181 insertions(+), 903 deletions(-) diff --git a/pyrasterframes/README.md b/pyrasterframes/README.md index b857762f5..1961dd93b 100644 --- a/pyrasterframes/README.md +++ b/pyrasterframes/README.md @@ -153,7 +153,13 @@ sbt 'pySetup test --addopts "-k test_tile_creation"' Or to build a specific document: ```bash -sbt 'pySetup pweave -f docs/raster-io.pymd' +sbt 'pySetup pweave -s docs/raster-io.pymd' +``` + +Or to build a specific document with desired output format: + +```bash +sbt 'pySetup pweave -f notebook -s docs/numpy-pandas.pymd' ``` *Note: You may need to run `sbt pyrasterframes/package` at least once for certain `pySetup` commands to work.* diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index f83dbda9a..a67067c5e 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -59,30 +59,20 @@ You can also use RasterFrames in the following environments: See [RasterFrames Notebook README](https://github.com/locationtech/rasterframes/blob/develop/rf-notebook/README.md) for instructions on building the Docker image for this Jupyter notebook server. -### `pyspark` shell or app +### `pyspark` shell -You can use RasterFrames in a `pyspark` shell or when submitting a `pyspark` app via a Python script. To set up the `pyspark` environment, prepare your call with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. To these you will add the PyRasterFrames assembly JAR and the python source zip. +You can use RasterFrames in a `pyspark` shell. To set up the `pyspark` environment, prepare your call with the appropriate `--master` and other `--conf` arguments for your cluster manager and environment. For RasterFrames support you need to pass arguments pointing to the various Java dependencies. You will also need the Python source zip, even if you have pip installed the package. You can download the source zip here: https://repo1.maven.org/maven2/org/locationtech/rasterframes/pyrasterframes_2.11/${VERSION}/pyrasterframes_2.11-${VERSION}-python.zip. -You can either [build](https://github.com/locationtech/rasterframes/blob/develop/README.md) the artifacts or download them: - - * Python zip: https://repo1.maven.org/maven2/org/locationtech/rasterframes/pyrasterframes_2.11/${VERSION}/pyrasterframes_2.11-${VERSION}-python.zip - * Assembly JAR: - * The assembly JAR is embedded in the wheel file publised on pypi. Download the wheel from https://pypi.org/project/pyrasterframes/#files - * The wheel file is just a [zip file with .whl extension](https://www.python.org/dev/peps/pep-0427/); you can extract the assembly JAR with a command like this: `unzip -j $PYRF_WHEEL $(zipinfo -1 $PYRF_WHEEL | grep jar)` - - -#### Shell - -The `pyspark` shell command will look something like this, replacing the `--jars` argument with the assembly jar and the `--py-files` with the source zip (not the wheel). To submit a script, add a .py file as the final argument +The `pyspark` shell command will look something like this. ```bash pyspark \ --master local[*] \ - --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ + --py-files pyrasterframes_2.11-${VERSION}-python.zip \ + --packages org.locationtech.rasterframes:rasterframes_2.11:${VERSION},org.locationtech.rasterframes:pyrasterframes_2.11:${VERSION},org.locationtech.rasterframes:rasterframes-datasource_2.11:${VERSION} + --conf spark.serializer=org.apache.spark.serializer.KryoSerializer \ # these configs improve serialization performance --conf spark.kryo.registrator=org.locationtech.rasterframes.util.RFKryoRegistrator \ - --conf spark.kryoserializer.buffer.max=500m \ - --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ - --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip + --conf spark.kryoserializer.buffer.max=500m ``` Then in the `pyspark` shell, import the module and call `withRasterFrames` on the SparkSession. @@ -104,33 +94,6 @@ SparkSession available as 'spark'. Now you have the configured SparkSession with RasterFrames enabled. -#### Submitting Apps - -Prepare the call to `spark-submit` in much the same way as using the `pyspark` shell. In the python script you submit, you will use the SparkSession builder pattern and add some RasterFrames extras to it. You have more flexibility in setting up configurations in either your script or in the `spark-submit` call. - -```python, evaluate=False -# contents of app.py - -from pyspark.sql import SparkSession -import pyrasterframes -spark = (SparkSession.builder - .appName("My RasterFrames app") - .config('spark.some_config', some_val) # app configurations - .withKryoSerialization() # sets spark.serializer and spark.kryo configs - .getOrCreate()).withRasterFrames() -df = spark.read.raster('...') -``` - -To submit, use a call like: - -```bash -$ spark-submit \ - --master spark://sparkmaster:7077 \ - --jars pyrasterframes/target/scala-2.11/pyrasterframes-assembly-${VERSION}.jar \ - --py-files pyrasterframes/target/scala-2.11/pyrasterframes-python-${VERSION}.zip \ - app.py -``` - ## Installing GDAL GDAL provides a wide variety of drivers to read data from many different raster formats. If GDAL is installed in the environment, RasterFrames will be able to @ref:[read](raster-read.md) those formats. If you are using the @ref:[Jupyter Notebook image](getting-started.md#jupyter-notebook), GDAL is already installed for you. Otherwise follow the instructions below. diff --git a/rf-notebook/src/main/notebooks/Getting Started.ipynb b/rf-notebook/src/main/notebooks/Getting Started.ipynb index 33e3c6b6a..e299b4b2f 100644 --- a/rf-notebook/src/main/notebooks/Getting Started.ipynb +++ b/rf-notebook/src/main/notebooks/Getting Started.ipynb @@ -22,7 +22,7 @@ "source": [ "import pyrasterframes\n", "import pyrasterframes.rf_ipython # enables nicer visualizations of pandas DF\n", - "from pyrasterframes.rasterfunctions import (rf_local_add, rf_dimensions, rf_extent, rf_crs, \n", + "from pyrasterframes.rasterfunctions import (rf_local_add, rf_dimensions, rf_extent, rf_crs, rf_mk_crs,\n", " st_geometry, st_reproject, rf_tile)\n", "import pyspark.sql.functions as F" ] @@ -44,7 +44,7 @@ "source": [ "### Get a PySpark DataFrame from [open data](https://docs.opendata.aws/modis-pds/readme.html)\n", "\n", - "Read a single \"granule\" of MODIS surface reflectance data. " + "Read a single \"granule\" or scene of MODIS surface reflectance data. " ] }, { @@ -103,15 +103,15 @@ "name": "stdout", "output_type": "stream", "text": [ - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|rf_local_add(proj_raster, 3) |\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", - "|[[[-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [3408,3471,3110,2875,2798,2973,3255,3169,3,3217,...,3,3,3,3,3,3,3,2519,3036,3]]] |\n", - "|[[[-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [2337,2346,2581,2751,2575,2364,2223,2384,2618,2296,...,3,3,2688,2702,2967,3200,3257,3052,2914,2534]]] |\n", - "|[[[-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (257,256), [2602,2728,2784,2781,2567,2539,2254,2327,2436,2888,...,2726,2695,2788,2898,3139,3121,2939,2778,2859,2728]]]|\n", - "|[[[-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [3058,3163,3036,3228,2877,3310,2885,2932,2931,2940,...,2299,2190,2180,2441,2563,2431,2347,2414,2525,2778]]] |\n", - "|[[[-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (257,256), [3238,3355,3502,3055,3343,3334,3,3,3,3,...,2629,2841,2983,2839,3107,2762,2524,3175,3190,3181]]] |\n", - "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|rf_local_add(proj_raster, 3) |\n", + "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", + "|[[[-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [3408,3471,3110,2875,2798,2973,3255,3169,-2147483648,3217,...,-2147483648,-2147483648,-2147483648,-2147483648,-2147483648,-2147483648,-2147483648,2519,3036,-2147483648]]]|\n", + "|[[[-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [2337,2346,2581,2751,2575,2364,2223,2384,2618,2296,...,-2147483648,-2147483648,2688,2702,2967,3200,3257,3052,2914,2534]]] |\n", + "|[[[-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (257,256), [2602,2728,2784,2781,2567,2539,2254,2327,2436,2888,...,2726,2695,2788,2898,3139,3121,2939,2778,2859,2728]]] |\n", + "|[[[-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (256,256), [3058,3163,3036,3228,2877,3310,2885,2932,2931,2940,...,2299,2190,2180,2441,2563,2431,2347,2414,2525,2778]]] |\n", + "|[[[-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667], [+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ]], [int16ud32767, (257,256), [3238,3355,3502,3055,3343,3334,-2147483648,-2147483648,-2147483648,-2147483648,...,2629,2841,2983,2839,3107,2762,2524,3175,3190,3181]]] |\n", + "+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+\n", "only showing top 5 rows\n", "\n" ] @@ -157,21 +157,6 @@ "What area does the DataFrame cover?" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "coverage_area = df.groupby(df.proj_raster_path).agg(\n", - " F.first(rf_crs(df.proj_raster).crsProj4).alias('crs'),\n", - " F.min(rf_extent(df.proj_raster).xmin).alias('xmin'),\n", - " F.min(rf_extent(df.proj_raster).ymin).alias('ymin'),\n", - " F.min(rf_extent(df.proj_raster).xmax).alias('xmax'),\n", - " F.min(rf_extent(df.proj_raster).ymax).alias('ymax'),\n", - ").withColumn('footprint_4326', st_geometry(F.struct('xmin', 'ymin', 'xmax', 'ymax')))\n", - "coverage_area = cov_area()\n", - "coverage_area" - ] - }, { "cell_type": "code", "execution_count": 7, @@ -206,7 +191,10 @@ "print(crs)\n", "coverage_area = df.select(\n", " df.proj_raster_path,\n", - " st_reproject(st_geometry(rf_extent(df.proj_raster)), crs, 'EPSG:4326').alias('footprint')\n", + " st_reproject(\n", + " st_geometry(rf_extent(df.proj_raster)), \n", + " rf_mk_crs(crs), \n", + " rf_mk_crs('EPSG:4326')).alias('footprint')\n", " )\n", "coverage_area.show(10, False)" ] @@ -215,7 +203,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "So where in the world is that? We'll generate a little visualization on http://geojson.io." + "So where in the world is that? We'll generate a little visualization with Leaflet in the notebook using Folium." ] }, { @@ -224,38 +212,57 @@ "metadata": { "scrolled": true }, + "outputs": [], + "source": [ + "import geopandas\n", + "import folium" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [], + "source": [ + "gdf = geopandas.GeoDataFrame(\n", + " coverage_area.select('footprint').toPandas(), \n", + " geometry='footprint', crs={'init':'EPSG:4326'}) " + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, "outputs": [ { "data": { + "text/html": [ + "
                  " + ], "text/plain": [ - "'http://geojson.io/#data=data:application/json,%7B%22type%22%3A%20%22FeatureCollection%22%2C%20%22features%22%3A%20%5B%7B%22id%22%3A%20%220%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.85954815687087%2C%208.933333332533772%5D%2C%20%5B-71.07986282542622%2C%209.999999999104968%5D%2C%20%5B-69.99674110618135%2C%209.999999999104968%5D%2C%20%5B-69.7797836135278%2C%208.933333332533772%5D%2C%20%5B-70.85954815687087%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%221%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.77978361352781%2C%208.933333332533772%5D%2C%20%5B-69.99674110618135%2C%209.999999999104968%5D%2C%20%5B-68.91361938693649%2C%209.999999999104968%5D%2C%20%5B-68.70001907018472%2C%208.933333332533772%5D%2C%20%5B-69.77978361352781%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%222%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.70001907018474%2C%208.933333332533772%5D%2C%20%5B-68.9136193869365%2C%209.999999999104968%5D%2C%20%5B-67.8304976676916%2C%209.999999999104968%5D%2C%20%5B-67.62025452684163%2C%208.933333332533772%5D%2C%20%5B-68.70001907018474%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%223%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.62025452684165%2C%208.933333332533772%5D%2C%20%5B-67.83049766769162%2C%209.999999999104968%5D%2C%20%5B-66.74737594844675%2C%209.999999999104968%5D%2C%20%5B-66.54048998349857%2C%208.933333332533772%5D%2C%20%5B-67.62025452684165%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%224%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.54048998349859%2C%208.933333332533772%5D%2C%20%5B-66.74737594844676%2C%209.999999999104968%5D%2C%20%5B-65.66425422920187%2C%209.999999999104968%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-66.54048998349859%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%225%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-65.66425422920187%2C%209.999999999104968%5D%2C%20%5B-64.58113250995702%2C%209.999999999104968%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%226%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-64.58113250995702%2C%209.999999999104968%5D%2C%20%5B-63.498010790712144%2C%209.999999999104968%5D%2C%20%5B-63.30119635346936%2C%208.933333332533772%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%227%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.30119635346937%2C%208.933333332533772%5D%2C%20%5B-63.49801079071215%2C%209.999999999104968%5D%2C%20%5B-62.41488907146726%2C%209.999999999104968%5D%2C%20%5B-62.221431810126276%2C%208.933333332533772%5D%2C%20%5B-63.30119635346937%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%228%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.22143181012629%2C%208.933333332533772%5D%2C%20%5B-62.41488907146727%2C%209.999999999104968%5D%2C%20%5B-61.33176735222239%2C%209.999999999104968%5D%2C%20%5B-61.14166726678321%2C%208.933333332533772%5D%2C%20%5B-62.22143181012629%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%229%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.14166726678322%2C%208.933333332533772%5D%2C%20%5B-61.3317673522224%2C%209.999999999104968%5D%2C%20%5B-60.92559670750556%2C%209.999999999104968%5D%2C%20%5B-60.736755563029554%2C%208.933333332533772%5D%2C%20%5B-61.14166726678322%2C%208.933333332533772%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2210%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.66501020104033%2C%207.866666665962575%5D%2C%20%5B-70.85954815687087%2C%208.933333332533772%5D%2C%20%5B-69.7797836135278%2C%208.933333332533772%5D%2C%20%5B-69.58821004559562%2C%207.866666665962575%5D%2C%20%5B-70.66501020104033%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2211%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.58821004559563%2C%207.866666665962575%5D%2C%20%5B-69.77978361352781%2C%208.933333332533772%5D%2C%20%5B-68.70001907018472%2C%208.933333332533772%5D%2C%20%5B-68.51140989015092%2C%207.866666665962575%5D%2C%20%5B-69.58821004559563%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2212%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.51140989015093%2C%207.866666665962575%5D%2C%20%5B-68.70001907018474%2C%208.933333332533772%5D%2C%20%5B-67.62025452684163%2C%208.933333332533772%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-68.51140989015093%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2213%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-67.62025452684165%2C%208.933333332533772%5D%2C%20%5B-66.54048998349857%2C%208.933333332533772%5D%2C%20%5B-66.35780957926151%2C%207.866666665962575%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2214%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.35780957926153%2C%207.866666665962575%5D%2C%20%5B-66.54048998349859%2C%208.933333332533772%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-66.35780957926153%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2215%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-65.4607254401555%2C%208.933333332533772%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2216%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-64.38096089681244%2C%208.933333332533772%5D%2C%20%5B-63.30119635346936%2C%208.933333332533772%5D%2C%20%5B-63.12740911292742%2C%207.866666665962575%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2217%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.127409112927424%2C%207.866666665962575%5D%2C%20%5B-63.30119635346937%2C%208.933333332533772%5D%2C%20%5B-62.221431810126276%2C%208.933333332533772%5D%2C%20%5B-62.0506089574827%2C%207.866666665962575%5D%2C%20%5B-63.127409112927424%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2218%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.05060895748272%2C%207.866666665962575%5D%2C%20%5B-62.22143181012629%2C%208.933333332533772%5D%2C%20%5B-61.14166726678321%2C%208.933333332533772%5D%2C%20%5B-60.973808802038015%2C%207.866666665962575%5D%2C%20%5B-62.05060895748272%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2219%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.97380880203802%2C%207.866666665962575%5D%2C%20%5B-61.14166726678322%2C%208.933333332533772%5D%2C%20%5B-60.736755563029554%2C%208.933333332533772%5D%2C%20%5B-60.57000874374624%2C%207.866666665962575%5D%2C%20%5B-60.97380880203802%2C%207.866666665962575%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2220%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.4959028507541%2C%206.799999999391379%5D%2C%20%5B-70.66501020104033%2C%207.866666665962575%5D%2C%20%5B-69.58821004559562%2C%207.866666665962575%5D%2C%20%5B-69.42167956921853%2C%206.799999999391379%5D%2C%20%5B-70.4959028507541%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2221%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.42167956921854%2C%206.799999999391379%5D%2C%20%5B-69.58821004559563%2C%207.866666665962575%5D%2C%20%5B-68.51140989015092%2C%207.866666665962575%5D%2C%20%5B-68.34745628768296%2C%206.799999999391379%5D%2C%20%5B-69.42167956921854%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2222%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.34745628768297%2C%206.799999999391379%5D%2C%20%5B-68.51140989015093%2C%207.866666665962575%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-67.27323300614736%2C%206.799999999391379%5D%2C%20%5B-68.34745628768297%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2223%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.27323300614738%2C%206.799999999391379%5D%2C%20%5B-67.43460973470621%2C%207.866666665962575%5D%2C%20%5B-66.35780957926151%2C%207.866666665962575%5D%2C%20%5B-66.1990097246118%2C%206.799999999391379%5D%2C%20%5B-67.27323300614738%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2224%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.19900972461181%2C%206.799999999391379%5D%2C%20%5B-66.35780957926153%2C%207.866666665962575%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-65.12478644307622%2C%206.799999999391379%5D%2C%20%5B-66.19900972461181%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2225%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.12478644307622%2C%206.799999999391379%5D%2C%20%5B-65.28100942381681%2C%207.866666665962575%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-64.05056316154065%2C%206.799999999391379%5D%2C%20%5B-65.12478644307622%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2226%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.05056316154065%2C%206.799999999391379%5D%2C%20%5B-64.20420926837213%2C%207.866666665962575%5D%2C%20%5B-63.12740911292742%2C%207.866666665962575%5D%2C%20%5B-62.97633988000506%2C%206.799999999391379%5D%2C%20%5B-64.05056316154065%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2227%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.97633988000507%2C%206.799999999391379%5D%2C%20%5B-63.127409112927424%2C%207.866666665962575%5D%2C%20%5B-62.0506089574827%2C%207.866666665962575%5D%2C%20%5B-61.902116598469476%2C%206.799999999391379%5D%2C%20%5B-62.97633988000507%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2228%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.90211659846949%2C%206.799999999391379%5D%2C%20%5B-62.05060895748272%2C%207.866666665962575%5D%2C%20%5B-60.973808802038015%2C%207.866666665962575%5D%2C%20%5B-60.8278933169339%2C%206.799999999391379%5D%2C%20%5B-61.90211659846949%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2229%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.82789331693391%2C%206.799999999391379%5D%2C%20%5B-60.97380880203802%2C%207.866666665962575%5D%2C%20%5B-60.57000874374624%2C%207.866666665962575%5D%2C%20%5B-60.42505958635807%2C%206.799999999391379%5D%2C%20%5B-60.82789331693391%2C%206.799999999391379%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2230%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.3519270891162%2C%205.733333332820182%5D%2C%20%5B-70.4959028507541%2C%206.799999999391378%5D%2C%20%5B-69.42167956921853%2C%206.799999999391378%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-70.3519270891162%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2231%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-69.42167956921854%2C%206.799999999391378%5D%2C%20%5B-68.34745628768296%2C%206.799999999391378%5D%2C%20%5B-68.20786835878069%2C%205.733333332820182%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2232%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.2078683587807%2C%205.733333332820182%5D%2C%20%5B-68.34745628768297%2C%206.799999999391378%5D%2C%20%5B-67.27323300614736%2C%206.799999999391378%5D%2C%20%5B-67.13583899361292%2C%205.733333332820182%5D%2C%20%5B-68.2078683587807%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2233%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.13583899361294%2C%205.733333332820182%5D%2C%20%5B-67.27323300614738%2C%206.799999999391378%5D%2C%20%5B-66.1990097246118%2C%206.799999999391378%5D%2C%20%5B-66.06380962844516%2C%205.733333332820182%5D%2C%20%5B-67.13583899361294%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2234%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.06380962844517%2C%205.733333332820182%5D%2C%20%5B-66.19900972461181%2C%206.799999999391378%5D%2C%20%5B-65.12478644307622%2C%206.799999999391378%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-66.06380962844517%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2235%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-65.12478644307622%2C%206.799999999391378%5D%2C%20%5B-64.05056316154065%2C%206.799999999391378%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2236%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-64.05056316154065%2C%206.799999999391378%5D%2C%20%5B-62.97633988000506%2C%206.799999999391378%5D%2C%20%5B-62.847721532941875%2C%205.733333332820182%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2237%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.84772153294189%2C%205.733333332820182%5D%2C%20%5B-62.97633988000507%2C%206.799999999391378%5D%2C%20%5B-61.902116598469476%2C%206.799999999391378%5D%2C%20%5B-61.77569216777411%2C%205.733333332820182%5D%2C%20%5B-62.84772153294189%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2238%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.77569216777412%2C%205.733333332820182%5D%2C%20%5B-61.90211659846949%2C%206.799999999391378%5D%2C%20%5B-60.8278933169339%2C%206.799999999391378%5D%2C%20%5B-60.70366280260635%2C%205.733333332820182%5D%2C%20%5B-61.77569216777412%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2239%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.70366280260636%2C%205.733333332820182%5D%2C%20%5B-60.82789331693391%2C%206.799999999391378%5D%2C%20%5B-60.42505958635807%2C%206.799999999391378%5D%2C%20%5B-60.301651790668444%2C%205.733333332820182%5D%2C%20%5B-60.70366280260636%2C%205.733333332820182%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2240%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.2328296870388%2C%204.666666666248985%5D%2C%20%5B-70.3519270891162%2C%205.733333332820182%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-69.1626151394265%2C%204.666666666248985%5D%2C%20%5B-70.2328296870388%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2241%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.16261513942652%2C%204.666666666248985%5D%2C%20%5B-69.27989772394845%2C%205.733333332820182%5D%2C%20%5B-68.20786835878069%2C%205.733333332820182%5D%2C%20%5B-68.09240059181421%2C%204.666666666248985%5D%2C%20%5B-69.16261513942652%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2242%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.09240059181423%2C%204.666666666248985%5D%2C%20%5B-68.2078683587807%2C%205.733333332820182%5D%2C%20%5B-67.13583899361292%2C%205.733333332820182%5D%2C%20%5B-67.0221860442019%2C%204.666666666248985%5D%2C%20%5B-68.09240059181423%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2243%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.02218604420192%2C%204.666666666248985%5D%2C%20%5B-67.13583899361294%2C%205.733333332820182%5D%2C%20%5B-66.06380962844516%2C%205.733333332820182%5D%2C%20%5B-65.95197149658962%2C%204.666666666248985%5D%2C%20%5B-67.02218604420192%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2244%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.95197149658964%2C%204.666666666248985%5D%2C%20%5B-66.06380962844517%2C%205.733333332820182%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-64.88175694897733%2C%204.666666666248985%5D%2C%20%5B-65.95197149658964%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2245%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.88175694897733%2C%204.666666666248985%5D%2C%20%5B-64.9917802632774%2C%205.733333332820182%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-63.81154240136504%2C%204.666666666248985%5D%2C%20%5B-64.88175694897733%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2246%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.81154240136504%2C%204.666666666248985%5D%2C%20%5B-63.91975089810965%2C%205.733333332820182%5D%2C%20%5B-62.847721532941875%2C%205.733333332820182%5D%2C%20%5B-62.74132785375273%2C%204.666666666248985%5D%2C%20%5B-63.81154240136504%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2247%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.741327853752736%2C%204.666666666248985%5D%2C%20%5B-62.84772153294189%2C%205.733333332820182%5D%2C%20%5B-61.77569216777411%2C%205.733333332820182%5D%2C%20%5B-61.67111330614043%2C%204.666666666248985%5D%2C%20%5B-62.741327853752736%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2248%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.67111330614044%2C%204.666666666248985%5D%2C%20%5B-61.77569216777412%2C%205.733333332820182%5D%2C%20%5B-60.70366280260635%2C%205.733333332820182%5D%2C%20%5B-60.600898758528146%2C%204.666666666248985%5D%2C%20%5B-61.67111330614044%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2249%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.60089875852815%2C%204.666666666248985%5D%2C%20%5B-60.70366280260636%2C%205.733333332820182%5D%2C%20%5B-60.301651790668444%2C%205.733333332820182%5D%2C%20%5B-60.19956830317353%2C%204.666666666248985%5D%2C%20%5B-60.60089875852815%2C%204.666666666248985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2250%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.13840210865949%2C%203.599999999677788%5D%2C%20%5B-70.2328296870388%2C%204.666666666248986%5D%2C%20%5B-69.1626151394265%2C%204.666666666248986%5D%2C%20%5B-69.06962645747964%2C%203.599999999677788%5D%2C%20%5B-70.13840210865949%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2251%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.06962645747966%2C%203.599999999677788%5D%2C%20%5B-69.16261513942652%2C%204.666666666248986%5D%2C%20%5B-68.09240059181421%2C%204.666666666248986%5D%2C%20%5B-68.0008508062998%2C%203.599999999677788%5D%2C%20%5B-69.06962645747966%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2252%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.00085080629981%2C%203.599999999677788%5D%2C%20%5B-68.09240059181423%2C%204.666666666248986%5D%2C%20%5B-67.0221860442019%2C%204.666666666248986%5D%2C%20%5B-66.93207515511993%2C%203.599999999677788%5D%2C%20%5B-68.00085080629981%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2253%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.93207515511995%2C%203.599999999677788%5D%2C%20%5B-67.02218604420192%2C%204.666666666248986%5D%2C%20%5B-65.95197149658962%2C%204.666666666248986%5D%2C%20%5B-65.86329950394008%2C%203.599999999677788%5D%2C%20%5B-66.93207515511995%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2254%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.8632995039401%2C%203.599999999677788%5D%2C%20%5B-65.95197149658964%2C%204.666666666248986%5D%2C%20%5B-64.88175694897733%2C%204.666666666248986%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-65.8632995039401%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2255%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-64.88175694897733%2C%204.666666666248986%5D%2C%20%5B-63.81154240136504%2C%204.666666666248986%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2256%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-63.81154240136504%2C%204.666666666248986%5D%2C%20%5B-62.74132785375273%2C%204.666666666248986%5D%2C%20%5B-62.65697255040055%2C%203.599999999677788%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2257%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.65697255040057%2C%203.599999999677788%5D%2C%20%5B-62.741327853752736%2C%204.666666666248986%5D%2C%20%5B-61.67111330614043%2C%204.666666666248986%5D%2C%20%5B-61.5881968992207%2C%203.599999999677788%5D%2C%20%5B-62.65697255040057%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2258%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.58819689922071%2C%203.599999999677788%5D%2C%20%5B-61.67111330614044%2C%204.666666666248986%5D%2C%20%5B-60.600898758528146%2C%204.666666666248986%5D%2C%20%5B-60.51942124804085%2C%203.599999999677788%5D%2C%20%5B-61.58819689922071%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2259%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.519421248040864%2C%203.599999999677788%5D%2C%20%5B-60.60089875852815%2C%204.666666666248986%5D%2C%20%5B-60.19956830317353%2C%204.666666666248986%5D%2C%20%5B-60.1186303788484%2C%203.599999999677788%5D%2C%20%5B-60.519421248040864%2C%203.599999999677788%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2260%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.06847961578245%2C%202.533333333106592%5D%2C%20%5B-70.13840210865949%2C%203.599999999677788%5D%2C%20%5B-69.06962645747964%2C%203.599999999677788%5D%2C%20%5B-69.00076945020834%2C%202.533333333106592%5D%2C%20%5B-70.06847961578245%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2261%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.00076945020835%2C%202.533333333106592%5D%2C%20%5B-69.06962645747966%2C%203.599999999677788%5D%2C%20%5B-68.0008508062998%2C%203.599999999677788%5D%2C%20%5B-67.93305928463424%2C%202.533333333106592%5D%2C%20%5B-69.00076945020835%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2262%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.93305928463425%2C%202.533333333106592%5D%2C%20%5B-68.00085080629981%2C%203.599999999677788%5D%2C%20%5B-66.93207515511993%2C%203.599999999677788%5D%2C%20%5B-66.86534911906014%2C%202.533333333106592%5D%2C%20%5B-67.93305928463425%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2263%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.86534911906016%2C%202.533333333106592%5D%2C%20%5B-66.93207515511995%2C%203.599999999677788%5D%2C%20%5B-65.86329950394008%2C%203.599999999677788%5D%2C%20%5B-65.79763895348603%2C%202.533333333106592%5D%2C%20%5B-66.86534911906016%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2264%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.79763895348604%2C%202.533333333106592%5D%2C%20%5B-65.8632995039401%2C%203.599999999677788%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-65.79763895348604%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2265%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-64.79452385276025%2C%203.599999999677788%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2266%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-63.7257482015804%2C%203.599999999677788%5D%2C%20%5B-62.65697255040055%2C%203.599999999677788%5D%2C%20%5B-62.594508456763734%2C%202.533333333106592%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2267%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.59450845676375%2C%202.533333333106592%5D%2C%20%5B-62.65697255040057%2C%203.599999999677788%5D%2C%20%5B-61.5881968992207%2C%203.599999999677788%5D%2C%20%5B-61.526798291189614%2C%202.533333333106592%5D%2C%20%5B-62.59450845676375%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2268%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.52679829118963%2C%202.533333333106592%5D%2C%20%5B-61.58819689922071%2C%203.599999999677788%5D%2C%20%5B-60.51942124804085%2C%203.599999999677788%5D%2C%20%5B-60.45908812561552%2C%202.533333333106592%5D%2C%20%5B-61.52679829118963%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2269%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.45908812561554%2C%202.533333333106592%5D%2C%20%5B-60.519421248040864%2C%203.599999999677788%5D%2C%20%5B-60.1186303788484%2C%203.599999999677788%5D%2C%20%5B-60.05869681352523%2C%202.533333333106592%5D%2C%20%5B-60.45908812561554%2C%202.533333333106592%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2270%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.02294056414732%2C%201.466666666535396%5D%2C%20%5B-70.06847961578245%2C%202.533333333106592%5D%2C%20%5B-69.00076945020834%2C%202.533333333106592%5D%2C%20%5B-68.95592432697907%2C%201.466666666535396%5D%2C%20%5B-70.02294056414732%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2271%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.95592432697909%2C%201.466666666535396%5D%2C%20%5B-69.00076945020835%2C%202.533333333106592%5D%2C%20%5B-67.93305928463424%2C%202.533333333106592%5D%2C%20%5B-67.88890808981084%2C%201.466666666535396%5D%2C%20%5B-68.95592432697909%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2272%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.88890808981085%2C%201.466666666535396%5D%2C%20%5B-67.93305928463425%2C%202.533333333106592%5D%2C%20%5B-66.86534911906014%2C%202.533333333106592%5D%2C%20%5B-66.82189185264261%2C%201.466666666535396%5D%2C%20%5B-67.88890808981085%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2273%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.82189185264262%2C%201.466666666535396%5D%2C%20%5B-66.86534911906016%2C%202.533333333106592%5D%2C%20%5B-65.79763895348603%2C%202.533333333106592%5D%2C%20%5B-65.75487561547438%2C%201.466666666535396%5D%2C%20%5B-66.82189185264262%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2274%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.75487561547439%2C%201.466666666535396%5D%2C%20%5B-65.79763895348604%2C%202.533333333106592%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-64.68785937830614%2C%201.466666666535396%5D%2C%20%5B-65.75487561547439%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2275%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.68785937830614%2C%201.466666666535396%5D%2C%20%5B-64.72992878791194%2C%202.533333333106592%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-63.62084314113792%2C%201.466666666535396%5D%2C%20%5B-64.68785937830614%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2276%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.62084314113792%2C%201.466666666535396%5D%2C%20%5B-63.66221862233784%2C%202.533333333106592%5D%2C%20%5B-62.594508456763734%2C%202.533333333106592%5D%2C%20%5B-62.55382690396967%2C%201.466666666535396%5D%2C%20%5B-63.62084314113792%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2277%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.553826903969686%2C%201.466666666535396%5D%2C%20%5B-62.59450845676375%2C%202.533333333106592%5D%2C%20%5B-61.526798291189614%2C%202.533333333106592%5D%2C%20%5B-61.48681066680143%2C%201.466666666535396%5D%2C%20%5B-62.553826903969686%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2278%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.486810666801446%2C%201.466666666535396%5D%2C%20%5B-61.52679829118963%2C%202.533333333106592%5D%2C%20%5B-60.45908812561552%2C%202.533333333106592%5D%2C%20%5B-60.4197944296332%2C%201.466666666535396%5D%2C%20%5B-61.486810666801446%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2279%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.419794429633214%2C%201.466666666535396%5D%2C%20%5B-60.45908812561554%2C%202.533333333106592%5D%2C%20%5B-60.05869681352523%2C%202.533333333106592%5D%2C%20%5B-60.01966334069511%2C%201.466666666535396%5D%2C%20%5B-60.419794429633214%2C%201.466666666535396%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2280%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-70.00170588591008%2C%200.3999999999641985%5D%2C%20%5B-70.02294056414732%2C%201.4666666665353953%5D%2C%20%5B-68.95592432697907%2C%201.4666666665353953%5D%2C%20%5B-68.93501322479118%2C%200.3999999999641985%5D%2C%20%5B-70.00170588591008%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2281%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.93501322479119%2C%200.3999999999641985%5D%2C%20%5B-68.95592432697909%2C%201.4666666665353953%5D%2C%20%5B-67.88890808981084%2C%201.4666666665353953%5D%2C%20%5B-67.86832056367227%2C%200.3999999999641985%5D%2C%20%5B-68.93501322479119%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2282%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.86832056367227%2C%200.3999999999641985%5D%2C%20%5B-67.88890808981085%2C%201.4666666665353953%5D%2C%20%5B-66.82189185264261%2C%201.4666666665353953%5D%2C%20%5B-66.80162790255335%2C%200.3999999999641985%5D%2C%20%5B-67.86832056367227%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2283%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.80162790255336%2C%200.3999999999641985%5D%2C%20%5B-66.82189185264262%2C%201.4666666665353953%5D%2C%20%5B-65.75487561547438%2C%201.4666666665353953%5D%2C%20%5B-65.73493524143446%2C%200.3999999999641985%5D%2C%20%5B-66.80162790255336%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2284%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.73493524143447%2C%200.3999999999641985%5D%2C%20%5B-65.75487561547439%2C%201.4666666665353953%5D%2C%20%5B-64.68785937830614%2C%201.4666666665353953%5D%2C%20%5B-64.66824258031555%2C%200.3999999999641985%5D%2C%20%5B-65.73493524143447%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2285%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.66824258031555%2C%200.3999999999641985%5D%2C%20%5B-64.68785937830614%2C%201.4666666665353953%5D%2C%20%5B-63.62084314113792%2C%201.4666666665353953%5D%2C%20%5B-63.60154991919666%2C%200.3999999999641985%5D%2C%20%5B-64.66824258031555%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2286%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.60154991919666%2C%200.3999999999641985%5D%2C%20%5B-63.62084314113792%2C%201.4666666665353953%5D%2C%20%5B-62.55382690396967%2C%201.4666666665353953%5D%2C%20%5B-62.53485725807775%2C%200.3999999999641985%5D%2C%20%5B-63.60154991919666%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2287%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.534857258077764%2C%200.3999999999641985%5D%2C%20%5B-62.553826903969686%2C%201.4666666665353953%5D%2C%20%5B-61.48681066680143%2C%201.4666666665353953%5D%2C%20%5B-61.46816459695883%2C%200.3999999999641985%5D%2C%20%5B-62.534857258077764%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2288%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.46816459695884%2C%200.3999999999641985%5D%2C%20%5B-61.486810666801446%2C%201.4666666665353953%5D%2C%20%5B-60.4197944296332%2C%201.4666666665353953%5D%2C%20%5B-60.40147193583993%2C%200.3999999999641985%5D%2C%20%5B-61.46816459695884%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2289%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.40147193583994%2C%200.3999999999641985%5D%2C%20%5B-60.419794429633214%2C%201.4666666665353953%5D%2C%20%5B-60.01966334069511%2C%201.4666666665353953%5D%2C%20%5B-60.00146218792034%2C%200.3999999999641985%5D%2C%20%5B-60.40147193583994%2C%200.3999999999641985%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2290%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-69.99999999371678%2C%20-6.717228065038803e-16%5D%2C%20%5B-70.00170588591008%2C%200.39999999996419916%5D%2C%20%5B-68.93501322479118%2C%200.39999999996419916%5D%2C%20%5B-68.93333332714558%2C%20-6.717228065038803e-16%5D%2C%20%5B-69.99999999371678%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2291%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-68.93333332714559%2C%20-6.717228065038803e-16%5D%2C%20%5B-68.93501322479119%2C%200.39999999996419916%5D%2C%20%5B-67.86832056367227%2C%200.39999999996419916%5D%2C%20%5B-67.8666666605744%2C%20-6.717228065038803e-16%5D%2C%20%5B-68.93333332714559%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2292%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-67.8666666605744%2C%20-6.717228065038803e-16%5D%2C%20%5B-67.86832056367227%2C%200.39999999996419916%5D%2C%20%5B-66.80162790255335%2C%200.39999999996419916%5D%2C%20%5B-66.79999999400319%2C%20-6.717228065038803e-16%5D%2C%20%5B-67.8666666605744%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2293%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-66.7999999940032%2C%20-6.717228065038803e-16%5D%2C%20%5B-66.80162790255336%2C%200.39999999996419916%5D%2C%20%5B-65.73493524143446%2C%200.39999999996419916%5D%2C%20%5B-65.73333332743199%2C%20-6.717228065038803e-16%5D%2C%20%5B-66.7999999940032%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2294%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-65.733333327432%2C%20-6.717228065038803e-16%5D%2C%20%5B-65.73493524143447%2C%200.39999999996419916%5D%2C%20%5B-64.66824258031555%2C%200.39999999996419916%5D%2C%20%5B-64.6666666608608%2C%20-6.717228065038803e-16%5D%2C%20%5B-65.733333327432%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2295%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-64.6666666608608%2C%20-6.717228065038803e-16%5D%2C%20%5B-64.66824258031555%2C%200.39999999996419916%5D%2C%20%5B-63.60154991919666%2C%200.39999999996419916%5D%2C%20%5B-63.599999994289604%2C%20-6.717228065038803e-16%5D%2C%20%5B-64.6666666608608%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2296%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-63.599999994289604%2C%20-6.717228065038803e-16%5D%2C%20%5B-63.60154991919666%2C%200.39999999996419916%5D%2C%20%5B-62.53485725807775%2C%200.39999999996419916%5D%2C%20%5B-62.5333333277184%2C%20-6.717228065038803e-16%5D%2C%20%5B-63.599999994289604%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2297%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-62.53333332771842%2C%20-6.717228065038803e-16%5D%2C%20%5B-62.534857258077764%2C%200.39999999996419916%5D%2C%20%5B-61.46816459695883%2C%200.39999999996419916%5D%2C%20%5B-61.4666666611472%2C%20-6.717228065038803e-16%5D%2C%20%5B-62.53333332771842%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2298%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-61.46666666114721%2C%20-6.717228065038803e-16%5D%2C%20%5B-61.46816459695884%2C%200.39999999996419916%5D%2C%20%5B-60.40147193583993%2C%200.39999999996419916%5D%2C%20%5B-60.39999999457601%2C%20-6.717228065038803e-16%5D%2C%20%5B-61.46666666114721%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%2C%20%7B%22id%22%3A%20%2299%22%2C%20%22type%22%3A%20%22Feature%22%2C%20%22properties%22%3A%20%7B%7D%2C%20%22geometry%22%3A%20%7B%22type%22%3A%20%22Polygon%22%2C%20%22coordinates%22%3A%20%5B%5B%5B-60.39999999457602%2C%20-6.717228065038803e-16%5D%2C%20%5B-60.40147193583994%2C%200.39999999996419916%5D%2C%20%5B-60.00146218792034%2C%200.39999999996419916%5D%2C%20%5B-59.999999994611805%2C%20-6.717228065038803e-16%5D%2C%20%5B-60.39999999457602%2C%20-6.717228065038803e-16%5D%5D%5D%7D%7D%5D%7D'" + "" ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "import geopandas\n", - "import geojsonio\n", - "\n", - "geojsonio.display(\n", - " geopandas.GeoDataFrame(\n", - " coverage_area.select('footprint').toPandas(), geometry='footprint', crs='EPSG:4326').to_json()\n", - ")" + "folium.Map((5, -65), zoom_start=6) \\\n", + " .add_child(folium.GeoJson(gdf.__geo_interface__))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "Look at a sample of the data." + "Look at a sample of the data. You may find it useful to double-click the tile image column to see larger or smaller rendering of the image." ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": { "scrolled": true }, @@ -290,38 +297,32 @@ " \n", " 0\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", - " (-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667)\n", - " \n", + " (-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667)\n", + " \n", " \n", " \n", " 1\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", - " (-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667)\n", - " \n", + " (-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667)\n", + " \n", " \n", " \n", " 2\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", - " (-6953397.249648973, 756126.3533735601, -6834789.194217825, 874734.4088047068)\n", - " \n", + " (-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667)\n", + " \n", " \n", " \n", " 3\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", - " (-7783653.637667, 281694.1316489733, -7665045.582235852, 400302.18708011997)\n", - " \n", + " (-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667)\n", + " \n", " \n", " \n", " 4\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", - " (-7783653.637667, 163086.07621782675, -7665045.582235852, 281694.1316489733)\n", - " \n", - " \n", - " \n", - " 5\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/MCD43A4.A2019059.h11v08.006.2019072203257_B02.TIF\n", - " (-6834789.194217826, 163086.07621782675, -6716181.138786679, 281694.1316489733)\n", - " \n", + " (-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667)\n", + " \n", " \n", " \n", "\n", @@ -334,26 +335,23 @@ "2 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "3 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "4 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "5 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "\n", " extent \\\n", - "0 (-7427829.47137356, 993342.4642358534, -730922... \n", - "1 (-7309221.415942414, 993342.4642358534, -71906... \n", - "2 (-6953397.249648973, 756126.3533735601, -68347... \n", - "3 (-7783653.637667, 281694.1316489733, -7665045.... \n", - "4 (-7783653.637667, 163086.07621782675, -7665045... \n", - "5 (-6834789.194217826, 163086.07621782675, -6716... \n", + "0 (-7783653.637667, 993342.4642358534, -7665045.... \n", + "1 (-7665045.582235853, 993342.4642358534, -75464... \n", + "2 (-7546437.526804707, 993342.4642358534, -74278... \n", + "3 (-7427829.47137356, 993342.4642358534, -730922... \n", + "4 (-7309221.415942414, 993342.4642358534, -71906... \n", "\n", " tile \n", "0 Tile(dimensions=[256, 256], cell_type=CellType... \n", - "1 Tile(dimensions=[257, 256], cell_type=CellType... \n", - "2 Tile(dimensions=[257, 257], cell_type=CellType... \n", + "1 Tile(dimensions=[256, 256], cell_type=CellType... \n", + "2 Tile(dimensions=[257, 256], cell_type=CellType... \n", "3 Tile(dimensions=[256, 256], cell_type=CellType... \n", - "4 Tile(dimensions=[256, 256], cell_type=CellType... \n", - "5 Tile(dimensions=[256, 256], cell_type=CellType... " + "4 Tile(dimensions=[257, 256], cell_type=CellType... " ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -364,7 +362,7 @@ " df.proj_raster_path,\n", " rf_extent(df.proj_raster).alias('extent'),\n", " rf_tile(df.proj_raster).alias('tile'),\n", - ").sample(0.05).toPandas()\n", + ").limit(5).toPandas()\n", "pandas_df" ] }, diff --git a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb index d0541a821..03d645546 100644 --- a/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb +++ b/rf-notebook/src/main/notebooks/pretty_rendering_rf_types.tile.ipynb @@ -23,6 +23,8 @@ "outputs": [], "source": [ "import pyrasterframes\n", + "from pyspark.sql.functions import col\n", + "from pyrasterframes.rasterfunctions import rf_crs, rf_extent, rf_tile\n", "\n", "spark = pyrasterframes.get_spark_session()" ] @@ -43,14 +45,12 @@ "uri = 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/' \\\n", " 'MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF'\n", "\n", - "from pyspark.sql.functions import col\n", - "from pyrasterframes.rasterfunctions import rf_crs, rf_extent\n", - "# here we flatten the structure to get the tile type \n", + "# here we flatten the projected raster structure \n", "df = spark.read.raster(uri) \\\n", - " .withColumn('tile2', col('tile').tile) \\\n", - " .withColumn('crs', rf_crs(col('tile'))) \\\n", - " .withColumn('ext', rf_extent(col('tile'))) \\\n", - " .drop('tile')" + " .withColumn('tile', rf_tile('proj_raster')) \\\n", + " .withColumn('crs', rf_crs(col('proj_raster'))) \\\n", + " .withColumn('ext', rf_extent(col('proj_raster'))) \\\n", + " .drop('proj_raster')" ] }, { @@ -63,8 +63,8 @@ "output_type": "stream", "text": [ "root\n", - " |-- tile_path: string (nullable = false)\n", - " |-- tile2: tile (nullable = true)\n", + " |-- proj_raster_path: string (nullable = false)\n", + " |-- tile: tile (nullable = true)\n", " |-- crs: struct (nullable = true)\n", " | |-- crsProj4: string (nullable = false)\n", " |-- ext: struct (nullable = true)\n", @@ -97,7 +97,7 @@ "metadata": {}, "outputs": [], "source": [ - "tile = df.select(df.tile2).first().tile2" + "tile = df.select(df.tile).first()['tile']" ] }, { @@ -107,7 +107,7 @@ "outputs": [ { "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdUAAAHVCAYAAACnuWH3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4zLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvnQurowAAIABJREFUeJzsvXmwZVV5Pvystccz3qlv39tNN90CCj8QBSry8RmjbSxBwVIpo4JGQZAyGk2iIqZwagSjREUpqxIHWjSRSkQq4BARRUBR26+iKIoDyNAD9HD7jmfe03q/P9a0D7dpppsftr2eqq4+d5999l577bXWu97nnRgRERwcHBwcHByeNPhT3QAHBwcHB4c/FTih6uDg4ODgsEJwQtXBwcHBwWGF4ISqg4ODg4PDCsEJVQcHBwcHhxWCE6oODg4ODg4rBCdUHRwcHBwcVghOqDo4ODg4OKwQnFB1cHBwcHBYITih6uDg4ODgsEJwQtXBwcHBwWGF4ISqg4ODg4PDCsEJVQcHBwcHhxWCE6oODg4ODg4rBCdUHRwcHBwcVghOqDo4ODg4OKwQnFB1cHBwcHBYITih6uDg4ODgsEJwQtXBwcHBwWGF4ISqg4ODg4PDCsEJVQcHBwcHhxWCE6oODg4ODg4rBCdUHRwcHBwcVghOqDo4ODg4OKwQnFB1cHBwcHBYITih6uDg4ODgsEJwQtXBwcHBwWGF4ISqg4ODg4PDCsEJVQcHBwcHhxWCE6oODg4ODg4rBCdUHRwcHBwcVghOqDo4ODg4OKwQnFB1cHBwcHBYITih6uDg4ODgsEJwQtXBwcHBwWGF4ISqg8G5554LxhgYY3jmM59pjrdaLXzkIx/Bpk2bMD09jXq9juOPPx6XX345BoPB0DW2bdtmrvHwf//5n/+57J5EhKuvvhonn3wyarUams0mTjrpJHz9619/Qs9wyy234LzzzsMxxxyDWq2Gww47DK94xSvw85///IDPW/53zDHH7Pfa27dvx3nnnYe1a9ciiiIcdthhOPPMM4fO+fSnPz10rdnZ2cf9DLfddhsYY7jtttse9297vR42b96839+2221cdNFFOPXUUzE5OQnGGDZv3vyI18qyDFdccQWOP/54VCoVjI6O4rnPfS5+8pOfPO52HQibNm3Cpk2bzN/dbhdnnXUWjj76aDQaDdRqNRx33HG47LLL0O12h377X//1Xzj77LNx1FFHoVKpYOPGjXj961+PP/zhD0PnHWhcMsbwkpe8ZFm77rrrLrz61a/G5OQkoijCxo0b8ba3vW3onI0bNz7iNeM4NuctLCxgdHQUN9xwwwr0mMMfM/ynugEOf1yYnp7G9ddfj2q1ao7t2LEDn/70p/GGN7wB73rXu1Cv13H77bdj8+bN+N73vofvfe97YIwNXecd73gHXve61w0de/rTn77sfm9961vxpS99Ce985zvx0Y9+FHme49e//jV6vd4Tav+//uu/Ym5uDn//93+PY489Fvv27cMnP/lJnHLKKbjpppvwl3/5l0PnVyoV3HLLLcuOPRx33XUXNm3ahCOOOAKf+MQnsG7dOuzevRs33XTT0HlnnXUWTjnlFFx11VXYsmXLE3qGk046CVu3bsWxxx77uH/b6/VwySWXAMCQoAKAubk5fP7zn8ezn/1svPKVr8RVV131iNcpigJnnnkmfvSjH+Giiy7Cc5/7XHS7Xfz85z9fJthWGlmWgYjwrne9C0972tPAOccPf/hDfPjDH8Ztt92Gm2++2Zx7+eWXY3p6Gu973/twxBFHYOfOnfinf/onnHTSSfjpT3+K4447DgCwZs0abN26ddm9brjhBlx++eXLNke33norzjjjDPzFX/wFPvvZz2LVqlXYsWMHfvGLXwydd/311yNJkqFjO3bswGtf+9qha46NjeGd73wn3vOe9+D0009HGIZPup8c/khBDg4K55xzDm3YsGHZ8U6nQ51OZ9nxj3/84wSAbr/9dnPsgQceIAD08Y9//FHvd/311xMA+upXv/qk2l3G3r17lx1rt9s0NTVFL3rRi4aOn3POOVSr1R71mkIIOuGEE+iEE06gwWDwmNrxoQ99iADQvn37HlvDVwj79u0jAPShD31o2XdCCBJCPOp5RESf+tSniHNOW7du/V9srcQLXvACesELXvCo51100UUEgO677z5zbH/v+6GHHqIgCOj8889/1Gtu2rSJqtUqLS0tmWPdbpfWrFlDZ5xxhumvx4PNmzcTALr55puHju/Zs4d836drrrnmcV/T4eCBo38dHhW1Wg21Wm3Z8ZNPPhkAsHPnzid03SuvvBIbN27Ea17zmifVvjJWr1697Fi9Xsexxx77hNv5wx/+EL/85S/xD//wD4ii6Mk28VGxP/r33HPPRb1ex7333ovTTz8d9Xod69evx7vf/W6jKW3btg2Tk5MAgEsuucTQkOeeey4AmL8fC6688ko8//nPxymnnHLA8770pS+BMYZt27Y96jMQEf75n/8ZGzZsQBzHOOmkk3DjjTc+pvYAMM/m+5Zg29/7Xrt2LdatW/eo7/u+++7DD37wA7zmNa9Bs9k0x7/2ta9h9+7deM973vOY+0uDlDnjiCOOWMaKTE1N4cUvfjE++9nPPq5rOhxccELV4QlD06aaYivjYx/7GMIwRLVaxfOe9zx84xvfGPo+z3Ns3boVJ554Iq644gps2LABnucZepWIVqydS0tLuOOOO/bbzn6/j+npaXieh3Xr1uHtb3875ufnh8754Q9/CABoNBo4/fTTEccx6vU6Xvayl+H3v//9irXz0ZBlGV7+8pfjRS96Eb7+9a/jvPPOw6c+9SlcfvnlACTF+Z3vfAcAcP7552Pr1q3YunUrPvCBDzyu++zcuRPbtm3D8ccfj4svvhhTU1PwfR/HHXccvvzlLz/h9l9yySV473vfixe/+MW44YYb8Na3vhUXXHAB7r777v2eT0TI8xytVgvf+c538MlPfhJnn302Dj/88APe5/7778f27dv3+77L+OIXvwgiwpvf/Oah4/p9F0WB5z3veQjDEGNjYzj77LOxa9euA17z5ptvNrb3/QnkTZs24cc//jEWFxcPeB2HgxhPqZ7s8EeFR6J/94c777yTKpUKnXnmmUPHd+3aRRdccAFde+21dPvtt9M111xDp5xyCgGgL3zhC+a83bt3EwBqNpu0bt06+vKXv0zf//736W/+5m8IAF188cUr9lyvf/3ryfd9+tnPfjZ0/IorrqArrriCvvvd79J3v/tdet/73kfVapWOOeYYarfb5ry3vOUtpq3nn38+3XzzzfTv//7vtGHDBlq1ahXt2rVr2T2fDP176623EgC69dZbzbFzzjmHANC11147dO7pp59ORx99tPn70Wjdx3Le1q1bzfMee+yxdO2119JNN91Ef/VXf0UA6POf/7w59+qrryYA9MADDxzwGRYWFiiO42Xj5cc//jEB2C/9+x//8R8EwPx705veRFmWHfC5siyjTZs2UbPZpB07djzieXme02GHHUbHHHPMsu9OO+00AkCjo6N00UUX0S233EKf/exnaWJigo466ijqdruPeN3Xvva15HkePfjgg/v9/nvf+x4BoBtvvPGAz+Fw8MIJVQeDxypUH3jgAVq/fj094xnPoLm5uUc9P01TOvHEE2liYsIsig899JBZLB9ut3vlK19JcRwPCbYnive///0EgD7zmc88pvOvu+46AkBXXHGFOXbBBRcQADrttNOGzv3FL35BAOh973vfsuv8bwhVxhj1+/2hc//xH/+R4jg2f6+EUNWCLgxD2rZtmzkuhKCTTjqJ1q1bZ449VqH67W9/mwDQddddt+x+GzZs2K9QnZ+fp//5n/+hW265hT7ykY9Qs9mkl7/85VQUxX6fSQhBb3zjG8nzPLrhhhsO+Pzf+ta3HtH2/+IXv5gA0Fve8pah4zfccMOyzWEZc3NzFEURnXHGGY943zvvvJMA0FVXXXXA9jkcvHD0r8Pjwvbt2/HCF74Qvu/j+9//PsbHxx/1N0EQ4LWvfS3m5uZMqMPY2BgYY2g2m8vsdi996UsxGAzw29/+9km19ZJLLsFll12Gj3zkI3j729/+mH5z5plnolar4ac//ak5NjExAQA47bTThs494YQTsGbNGtxxxx1Pqp2PFdVqdShMAwCiKFoW1vRkoZ/3mGOOwYYNG8xxxhhOO+00PPjgg5iZmXlc15ybmwMgvcsfjv0dA+QY+bM/+zO88IUvxMUXX4zPf/7z+MY3vrHfcCtSNO5XvvIVfOlLX8IrXvGKA7Zny5YtCIIAb3zjG5d990jv+7TTTgNj7BHf91e+8hUkSbKMTi5Dv79+v3/A9jkcvHBC1eExY/v27di0aROICLfeeivWrVv3mH9LykbKuRxylUplvyE2+zv3ieCSSy7B5s2bsXnzZlx88cWP67dENHTvZz3rWY/53D8FHHnkkUMhVWU8/N1oIfHwsJKHx+dqQbVnz55l19zfsf1BO8bdc889y9r05je/GVdffTWuuuoq/PVf//UBrzMzM4NvfetbePnLX75fR6cDvW/gkcflli1bMDU1hZe97GWP+Fttr1+1atUB7+Fw8OJPazVw+F/Djh07sGnTJhRFgVtuuWVIg3k0ZFmGr371q1i1ahWOOuooc/xVr3oVWq3WsmQC3/72t1Gv1x/V0eSRcOmll2Lz5s14//vfjw996EOP67fXXXcder3ekPb80pe+FNVqdZmn6h133IE9e/Y8qofs/01o7+Qnown5vo9XvOIV+N3vfjfk1UtE+M53voMjjzzSCIWNGzcCAH71q18NXePhjmmnnHIK4jjGNddcM3T8Jz/5CbZv3/6Y2nXrrbcCwNAYIiJccMEFuPrqq/G5z30Ob3rTmx71Ov/2b/+GLMtw/vnn7/f7M888E4yxZe/7xhtvBBHt933/7Gc/w69+9Succ845Q97JD8f9998PAE8oBtnh4IBL/uDwqJiZmcELX/hC7N69G1u2bMHMzMwQ/bdu3Tqjtb7rXe9ClmX48z//c0xPT2Pnzp34zGc+g1/+8pe4+uqr4Xme+d2FF16Ia665Bq9+9atx6aWXYt26dbjuuuvwjW98A5/4xCeGkjCce+65+PKXv4wHHnjALOT7wyc/+Ul88IMfxEte8hKcccYZQzQuALMgbt++Ha973etw1lln4aijjgJjDD/4wQ/w6U9/Gscdd9wQhTc6OooPf/jDuPDCC3Huuefi7LPPxp49e/CBD3wAhx9++LIsO4+EzZs345JLLsGtt966LDHDSqHRaGDDhg34+te/jhe96EUYHx/HqlWrTJ/deOON6Ha7aLfbAIDf/va3uO666wAAp59+utFQL730Utx44414yUtegs2bN6PZbOKqq67CnXfeiWuvvdbc7znPeQ6OPvpoXHjhhcjzHGNjY7j++uvxox/9aKhdY2NjuPDCC3HZZZfhzW9+M1796ldj586d2Lx58zL693Of+xxuv/12nHrqqVi/fj263S5uv/12fOYzn8Fzn/vcIWr37/7u77Blyxacd955OP7444fedxRFOPHEE5f10ZYtW7B+/fpl9K7GMcccg7/927/Fv/zLv6DRaOClL30p7rnnHrz//e/HiSeeuN8QMJ3o45EEtcZPf/pTTExM4Pjjjz/geQ4HMZ4iW67DHyEeyVFJO5080r+ys8uWLVvo5JNPpvHxcfJ9n8bGxui0006jm266ab/33LFjB5111lk0NjZGYRjSs571LPriF7+47LxXvepVVKlUaGFh4YDP8IIXvOCAbdWYn5+nM888kzZu3EiVSoXCMKSnP/3pdNFFF9Hi4uJ+r/2FL3yBnvnMZ1IYhjQxMUGvf/3raefOnfs9d3+OSu9+97uJMUa/+93vDvgMj+SotL9EFfo+Zdx888104oknUhRFBIDOOecc892GDRsesW8e7mz061//ms444wxqNBoUxzGdcsop9M1vfnNZG+655x469dRT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GTjlaLSiEwAGz3CnfOYSMpakULDhflJtAlYJDMoKNjdgA9V3k8AFgo0SAMoeMqwzW2voJmS0insO1j6sn1mDc+ePsd0B/3vjmfWbrYOpO7h6UHEArr7zv/VVlyPZCiCUddlJi/634TpueuiJfy8AMKUxmfnfs98DXShhTmWDF4/uIEMK+n23xG7l7xkDTzRjvf/uLh91jOFAJgWsAeR7hiE9Zb1GKDh5I/aJgghryRoHHSwXWcdJ/L5yOUzqkGz98XbJ+Pn8FpB7BzsUQTSgw8piK4b0jiriaB9pdN1AVGpG5m4t4TQH/9I/K3QvoIapgU0CdIALmTyrHY0HpTcarPH/f89CGyB8fD/16l22C/eJ+3jLwMx9zEf//4g3b97g6dOn/9iHERERERHxf8Hr16/x5MmTf+zD+Afhkwqq1lq8e/cOs9kM7J7mZERERETEPz6cc9jtdnj8+DE4/zi7k59UUI2IiIiIiPj/iY9zKxAREREREfFPEDGoRkREREREPBBiUI2IiIiIiHggxKAaERERERHxQIhBNSIiIiIi4oEQg2pERERERMQDIQbViIiIiIiIB0IMqhEREREREQ+EGFQjIiIiIiIeCDGoRkREREREPBBiUI2IiIiIiHggxKAaERERERHxQIhBNSIiIiIi4oEQg2pERERERMQDIQbViIiIiIiIB0IMqhEREREREQ+EGFQjIiIiIiIeCDGoRkREREREPBBiUI2IiIiIiHggxKAaERERERHxQIhBNSIiIiIi4oEQg2pERERERMQDIQbViIiIiIiIB0IMqhEREREREQ+EGFQjIiIiIiIeCDGoRkREREREPBBiUI2IiIiIiHggxKAaERERERHxQIhBNSIiIiIi4oEQg2pERERERMQDIQbViIiIiIiIB0IMqhEREREREQ+EGFQjIiIiIiIeCDGoRkREREREPBBiUI2IiIiIiHggxKAaERERERHxQIhBNSIiIiIi4oEQg2pERERERMQDIQbViIiIiIiIB0IMqhEREREREQ+EGFQjIiIiIiIeCDGoRkREREREPBBiUI2IiIiIiHggxKAaERERERHxQIhBNSIiIiIi4oEQg2pERERERMQDIQbViIiIiIiIB0IMqhEREREREQ+EGFQjIiIiIiIeCH8Hya1/TH3RqosAAAAASUVORK5CYII=\n", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAdUAAAHVCAYAAACnuWH3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8QZhcZAAAgAElEQVR4nOy9ebBlVXk3/Ftrj2e8U3ff7qabbgGFF0SBinx8xlfbWIqCpVJGBY2CIGVMNIlKMIVTIxolKmpZlTiAaKKViFTAISKKgKLiV1GciAoy9ADdze07n3EPaz3fH2vah9s0g/d9FXr9qrr63DPsvfbaa6/neX7PxIiI4OHh4eHh4fF7g/+hB+Dh4eHh4fFEgReqHh4eHh4eqwQvVD08PDw8PFYJXqh6eHh4eHisErxQ9fDw8PDwWCV4oerh4eHh4bFK8ELVw8PDw8NjleCFqoeHh4eHxyrBC1UPDw8PD49VgheqHh4eHh4eqwQvVD08PDw8PFYJXqh6eHh4eHisErxQ9fDw8PDwWCV4oerh4eHh4bFK8ELVw8PDw8NjleCFqoeHh4eHxyrBC1UPDw8PD49VgheqHh4eHh4eqwQvVD08PDw8PFYJXqh6eHh4eHisErxQ9fDw8PDwWCV4oerh4eHh4bFK8ELVw8PDw8NjleCFqoeHh4eHxyrBC1UPDw8PD49VgheqHh4eHh4eqwQvVD08PDw8PFYJXqh6eHh4eHisErxQ9fDw8PDwWCV4oerh4eHh4bFK8ELVw8PDw8NjleCFqoeHh4eHxyrBC1UPDw8PD49VgheqHh4eHh4eqwQvVD08PDw8PFYJXqh6HBDnnHMOGGNgjOGpT32qfX95eRkf+MAHsG3bNqxfvx7NZhPHH388Lr30UgyHw5Fj7Nixwx7jwf/+4z/+Y8U5iQhXXnklTj75ZDQaDbTbbZx00kn46le/+piu4cYbb8S5556LY445Bo1GA4cddhhe+tKX4qc//elBr7f675hjjjngsXfu3Ilzzz0XGzduRJIkOOyww3DGGWeMfOfjH//4yLFmZ2cf9TXcfPPNYIzh5ptvftS/7ff72L59+wF/2+l0cOGFF+IFL3gB1q5dC8YYtm/f/pDHKooCl112GY4//njUajWMj4/jmc98Jn70ox896nEdDNu2bcO2bdvs371eD2eeeSaOPvpotFotNBoNHHfccXj/+9+PXq838tv//M//xFlnnYWjjjoKtVoNW7duxWte8xr87ne/G/newdYlYwwvfOELV4zr9ttvxyte8QqsXbsWSZJg69at+Ku/+quR72zduvUhj5mm6epNkscfNcI/9AA8/nixfv16XHPNNajX6/a9Xbt24eMf/zhe+9rX4m1vexuazSZuueUWbN++Hd/5znfwne98B4yxkeO85S1vwatf/eqR95785CevON+b3vQmfP7zn8db3/pWfPCDH0RZlvjVr36Ffr//mMb/L//yL5ibm8Pf/u3f4thjj8X+/fvx0Y9+FKeccgquv/56/Nmf/dnI92u1Gm688cYV7z0Yt99+O7Zt24YjjjgCH/nIR7Bp0ybs3bsX119//cj3zjzzTJxyyim4/PLLccUVVzymazjppJNw66234thjj33Uv+33+7j44osBYERQAcDc3Bw+85nP4OlPfzpe9rKX4fLLL3/I4wghcMYZZ+AHP/gBLrzwQjzzmc9Er9fDT3/60xWCbbVRFAWICG9729vwpCc9CZxzfP/738f73vc+3Hzzzbjhhhvsdy+99FKsX78e73znO3HEEUdg9+7d+Md//EecdNJJ+PGPf4zjjjsOALBhwwbceuutK8517bXX4tJLL12hHN100004/fTT8b//9//Gpz71KaxZswa7du3Cz372s5HvXXPNNciybOS9Xbt24VWvetWKY3o8gUEeHgfA2WefTVu2bFnxfrfbpW63u+L9D3/4wwSAbrnlFvvevffeSwDowx/+8MOe75prriEA9OUvf/n3GncVDzzwwIr3Op0OTU9P0/Oe97yR988++2xqNBoPe0wpJZ1wwgl0wgkn0HA4fETjeO9730sAaP/+/Y9s4KuE/fv3EwB673vfu+IzKSVJKR/2e0REH/vYx4hzTrfeeuv/wdEqPOc5z6HnPOc5D/u9Cy+8kADQ3Xffbd870P2+//77KYoiOu+88x72mNu2baN6vU5LS0v2vV6vRxs2bKDTTz/dztejwfbt2wkA3XDDDY/6tx6PT3j61+NRodFooNForHj/5JNPBgDs3r37MR33E5/4BLZu3YpXvvKVv9f4qli3bt2K95rNJo499tjHPM7vf//7+PnPf46/+7u/Q5Ikv+8QHxYHon/POeccNJtN3HXXXTjttNPQbDaxefNmvP3tb7eW0o4dO7B27VoAwMUXX2xpyHPOOQcA7N+PBJ/4xCfw7Gc/G6eccspBv/f5z38ejDHs2LHjYa+BiPBP//RP2LJlC9I0xUknnYTrrrvuEY0HgL22MHRk24Hu98aNG7Fp06aHvd933303vve97+GVr3wl2u22ff8rX/kK9u7di7//+79/xPNlQNqdccQRR6xgRTyeuPBC1WNVYGhTQ7FV8aEPfQhxHKNer+NZz3oWvva1r418XpYlbr31Vpx44om47LLLsGXLFgRBYOlVIlq1cS4tLeG222474DgHgwHWr1+PIAiwadMmvPnNb8b8/PzId77//e8DAFqtFk477TSkaYpms4kXv/jF+O1vf7tq43w4FEWBl7zkJXje856Hr371qzj33HPxsY99DJdeeikARXF+61vfAgCcd955uPXWW3Hrrbfi3e9+96M6z+7du7Fjxw4cf/zxuOiiizA9PY0wDHHcccfhC1/4wmMe/8UXX4x3vOMdeP7zn49rr70Wb3rTm3D++efjjjvuOOD3iQhlWWJ5eRnf+ta38NGPfhRnnXUWDj/88IOe55577sHOnTsPeL+r+NznPgciwhve8IaR9839FkLgWc96FuI4xsTEBM466yzs2bPnoMe84YYbrO/90Qpkj8cx/qB2sscfLR6K/j0QfvGLX1CtVqMzzjhj5P09e/bQ+eefT1dddRXdcsst9KUvfYlOOeUUAkCf/exn7ff27t1LAKjdbtOmTZvoC1/4An33u9+lv/zLvyQAdNFFF63adb3mNa+hMAzpJz/5ycj7l112GV122WX07W9/m7797W/TO9/5TqrX63TMMcdQp9Ox33vjG99ox3reeefRDTfcQP/2b/9GW7ZsoTVr1tCePXtWnPP3oX9vuukmAkA33XSTfe/ss88mAHTVVVeNfPe0006jo48+2v79cLTuI/nerbfeaq/32GOPpauuuoquv/56+vM//3MCQJ/5zGfsd6+88koCQPfee+9Br2FhYYHSNF2xXn74wx8SgAPSv//+7/9OAOy/17/+9VQUxUGvqygK2rZtG7Xbbdq1a9dDfq8sSzrssMPomGOOWfHZqaeeSgBofHycLrzwQrrxxhvpU5/6FE1NTdFRRx1FvV7vIY/7qle9ioIgoPvuu++g4/R4YsELVY8D4pEK1XvvvZc2b95MT3nKU2hubu5hv5/nOZ144ok0NTVlN8X777/f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\n", "text/plain": [ "Tile(masked_array(\n", " data=[[1225, 1244, 1247, ..., 1305, 1245, 1206],\n", @@ -164,6 +164,49 @@ "str(tile)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "And access the tile's `cells` member which is a numpy ndarray, or more specifically in this case a numpy.ma.MaskedArray." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "masked_array(\n", + " data=[[1225, 1244, 1247, ..., 1305, 1245, 1206],\n", + " [1166, 1188, 1190, ..., 1381, 1251, 1193],\n", + " [1156, 1110, 1122, ..., 1248, 1245, 1270],\n", + " ...,\n", + " [1485, 1749, 1761, ..., 1034, 996, 998],\n", + " [1780, 1777, 1663, ..., 1008, 1027, 1174],\n", + " [1728, 1647, 1562, ..., 1189, 1297, 1382]],\n", + " mask=[[False, False, False, ..., False, False, False],\n", + " [False, False, False, ..., False, False, False],\n", + " [False, False, False, ..., False, False, False],\n", + " ...,\n", + " [False, False, False, ..., False, False, False],\n", + " [False, False, False, ..., False, False, False],\n", + " [False, False, False, ..., False, False, False]],\n", + " fill_value=32767,\n", + " dtype=int16)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tile.cells" + ] + }, { "cell_type": "markdown", "metadata": {}, @@ -180,7 +223,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -204,8 +247,8 @@ " \n", " \n", " \n", - " tile_path\n", - " tile2\n", + " proj_raster_path\n", + " tile\n", " crs\n", " ext\n", " \n", @@ -214,135 +257,69 @@ " \n", " 0\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", + " \n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14455356.755667, -2342509.0947641465, 14573964.811098041, -2223901.039333)\n", " \n", " \n", " 1\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", + " \n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14573964.81109804, -2342509.0947641465, 14692572.866529081, -2223901.039333)\n", " \n", " \n", " 2\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", + " \n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14692572.86652908, -2342509.0947641465, 14811180.921960121, -2223901.039333)\n", " \n", " \n", " 3\n", " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", + " \n", " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", " (14811180.92196012, -2342509.0947641465, 14929788.977391161, -2223901.039333)\n", " \n", - " \n", - " 4\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", - " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", - " (14929788.97739116, -2342509.0947641465, 15048397.032822201, -2223901.039333)\n", - " \n", - " \n", - " 5\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", - " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", - " (15048397.0328222, -2342509.0947641465, 15167005.088253241, -2223901.039333)\n", - " \n", - " \n", - " 6\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", - " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", - " (15167005.08825324, -2342509.0947641465, 15285613.143684281, -2223901.039333)\n", - " \n", - " \n", - " 7\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", - " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", - " (15285613.14368428, -2342509.0947641465, 15404221.199115321, -2223901.039333)\n", - " \n", - " \n", - " 8\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", - " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", - " (15404221.199115321, -2342509.0947641465, 15522829.254546361, -2223901.039333)\n", - " \n", - " \n", - " 9\n", - " https://modis-pds.s3.amazonaws.com/MCD43A4.006/31/11/2017158/MCD43A4.A2017158.h31v11.006.2017171203421_B01.TIF\n", - " \n", - " (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)\n", - " (15522829.254546361, -2342509.0947641465, 15567307.275333002, -2223901.039333)\n", - " \n", " \n", "\n", "" ], "text/plain": [ - " tile_path \\\n", + " proj_raster_path \\\n", "0 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "1 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "2 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "3 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "4 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "5 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "6 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "7 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "8 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", - "9 https://modis-pds.s3.amazonaws.com/MCD43A4.006... \n", "\n", - " tile2 \\\n", + " tile \\\n", "0 Tile(dimensions=[256, 256], cell_type=CellType... \n", "1 Tile(dimensions=[257, 256], cell_type=CellType... \n", "2 Tile(dimensions=[257, 256], cell_type=CellType... \n", "3 Tile(dimensions=[257, 256], cell_type=CellType... \n", - "4 Tile(dimensions=[257, 256], cell_type=CellType... \n", - "5 Tile(dimensions=[257, 256], cell_type=CellType... \n", - "6 Tile(dimensions=[257, 256], cell_type=CellType... \n", - "7 Tile(dimensions=[257, 256], cell_type=CellType... \n", - "8 Tile(dimensions=[256, 256], cell_type=CellType... \n", - "9 Tile(dimensions=[96, 256], cell_type=CellType(... \n", "\n", " crs \\\n", "0 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", "1 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", "2 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", "3 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "4 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "5 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "6 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "7 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "8 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", - "9 (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63... \n", "\n", " ext \n", "0 (14455356.755667, -2342509.0947641465, 1457396... \n", "1 (14573964.81109804, -2342509.0947641465, 14692... \n", "2 (14692572.86652908, -2342509.0947641465, 14811... \n", - "3 (14811180.92196012, -2342509.0947641465, 14929... \n", - "4 (14929788.97739116, -2342509.0947641465, 15048... \n", - "5 (15048397.0328222, -2342509.0947641465, 151670... \n", - "6 (15167005.08825324, -2342509.0947641465, 15285... \n", - "7 (15285613.14368428, -2342509.0947641465, 15404... \n", - "8 (15404221.199115321, -2342509.0947641465, 1552... \n", - "9 (15522829.254546361, -2342509.0947641465, 1556... " + "3 (14811180.92196012, -2342509.0947641465, 14929... " ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pandas_df = df.limit(10).toPandas()\n", - "pandas_df" + "pandas_df.head(4)" ] }, { @@ -354,7 +331,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "metadata": { "scrolled": true }, @@ -362,14 +339,14 @@ { "data": { "text/plain": [ - "tile_path https://modis-pds.s3.amazonaws.com/MCD43A4.006...\n", - "tile2 Tile(dimensions=[256, 256], cell_type=CellType...\n", - "crs (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...\n", - "ext (15404221.199115321, -2342509.0947641465, 1552...\n", + "proj_raster_path https://modis-pds.s3.amazonaws.com/MCD43A4.006...\n", + "tile Tile(dimensions=[256, 256], cell_type=CellType...\n", + "crs (+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=63...\n", + "ext (15404221.199115321, -2342509.0947641465, 1552...\n", "Name: 8, dtype: object" ] }, - "execution_count": 8, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -380,7 +357,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "metadata": { "scrolled": true }, @@ -398,16 +375,16 @@ "7 Tile(dimensions=[257, 256], cell_type=CellType...\n", "8 Tile(dimensions=[256, 256], cell_type=CellType...\n", "9 Tile(dimensions=[96, 256], cell_type=CellType(...\n", - "Name: tile2, dtype: object" + "Name: tile, dtype: object" ] }, - "execution_count": 9, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "pandas_df.tile2" + "pandas_df.tile" ] }, { @@ -419,7 +396,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -564,710 +541,44 @@ " -80.943126\n", " 10490\n", " \n", - " \n", - " 10\n", - " SLC\n", - " Salt Lake City Intl\n", - " Salt Lake City\n", - " UT\n", - " USA\n", - " 40.788388\n", - " -111.977773\n", - " 9898\n", - " \n", - " \n", - " 11\n", - " TPA\n", - " Tampa International\n", - " Tampa\n", - " FL\n", - " USA\n", - " 27.975472\n", - " -82.533250\n", - " 9182\n", - " \n", - " \n", - " 12\n", - " EWR\n", - " Newark Intl\n", - " Newark\n", - " NJ\n", - " USA\n", - " 40.692497\n", - " -74.168661\n", - " 8678\n", - " \n", - " \n", - " 13\n", - " LAS\n", - " McCarran International\n", - " Las Vegas\n", - " NV\n", - " USA\n", - " 36.080361\n", - " -115.152333\n", - " 8523\n", - " \n", - " \n", - " 14\n", - " PHL\n", - " Philadelphia Intl\n", - " Philadelphia\n", - " PA\n", - " USA\n", - " 39.871953\n", - " -75.241141\n", - " 7965\n", - " \n", - " \n", - " 15\n", - " MSP\n", - " Minneapolis-St Paul Intl\n", - " Minneapolis\n", - " MN\n", - " USA\n", - " 44.880547\n", - " -93.216922\n", - " 7690\n", - " \n", - " \n", - " 16\n", - " SEA\n", - " Seattle-Tacoma Intl\n", - " Seattle\n", - " WA\n", - " USA\n", - " 47.448982\n", - " -122.309313\n", - " 7541\n", - " \n", - " \n", - " 17\n", - " LGA\n", - " LaGuardia\n", - " New York\n", - " NY\n", - " USA\n", - " 40.777243\n", - " -73.872609\n", - " 7392\n", - " \n", - " \n", - " 18\n", - " MDW\n", - " Chicago Midway\n", - " Chicago\n", - " IL\n", - " USA\n", - " 41.785983\n", - " -87.752424\n", - " 6979\n", - " \n", - " \n", - " 19\n", - " IAD\n", - " Washington Dulles International\n", - " Chantilly\n", - " VA\n", - " USA\n", - " 38.944532\n", - " -77.455810\n", - " 6779\n", - " \n", - " \n", - " 20\n", - " SAN\n", - " San Diego International-Lindbergh\n", - " San Diego\n", - " CA\n", - " USA\n", - " 32.733556\n", - " -117.189657\n", - " 6233\n", - " \n", - " \n", - " 21\n", - " STL\n", - " Lambert-St Louis International\n", - " St Louis\n", - " MO\n", - " USA\n", - " 38.747687\n", - " -90.359990\n", - " 6204\n", - " \n", - " \n", - " 22\n", - " DTW\n", - " Detroit Metropolitan-Wayne County\n", - " Detroit\n", - " MI\n", - " USA\n", - " 42.212059\n", - " -83.348836\n", - " 6044\n", - " \n", - " \n", - " 23\n", - " JFK\n", - " John F Kennedy Intl\n", - " New York\n", - " NY\n", - " USA\n", - " 40.639751\n", - " -73.778926\n", - " 5945\n", - " \n", - " \n", - " 24\n", - " MIA\n", - " Miami International\n", - " Miami\n", - " FL\n", - " USA\n", - " 25.793250\n", - " -80.290556\n", - " 5907\n", - " \n", - " \n", - " 25\n", - " BOS\n", - " Gen Edw L Logan Intl\n", - " Boston\n", - " MA\n", - " USA\n", - " 42.364348\n", - " -71.005179\n", - " 5627\n", - " \n", - " \n", - " 26\n", - " SMF\n", - " Sacramento International\n", - " Sacramento\n", - " CA\n", - " USA\n", - " 38.695422\n", - " -121.590767\n", - " 4943\n", - " \n", - " \n", - " 27\n", - " BWI\n", - " Baltimore-Washington International\n", - " Baltimore\n", - " MD\n", - " USA\n", - " 39.175402\n", - " -76.668198\n", - " 4749\n", - " \n", - " \n", - " 28\n", - " SNA\n", - " John Wayne /Orange Co\n", - " Santa Ana\n", - " CA\n", - " USA\n", - " 33.675659\n", - " -117.868223\n", - " 4616\n", - " \n", - " \n", - " 29\n", - " MSY\n", - " New Orleans International\n", - " New Orleans\n", - " LA\n", - " USA\n", - " 29.993389\n", - " -90.258028\n", - " 4432\n", - " \n", - " \n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " ...\n", - " \n", - " \n", - " 191\n", - " GTF\n", - " Great Falls Intl\n", - " Great Falls\n", - " MT\n", - " USA\n", - " 47.482002\n", - " -111.370685\n", - " 108\n", - " \n", - " \n", - " 192\n", - " MEI\n", - " Key\n", - " Meridian\n", - " MS\n", - " USA\n", - " 32.333133\n", - " -88.751206\n", - " 104\n", - " \n", - " \n", - " 193\n", - " MQT\n", - " Marquette County Airport\n", - " NaN\n", - " NaN\n", - " USA\n", - " 46.353639\n", - " -87.395361\n", - " 104\n", - " \n", - " \n", - " 194\n", - " TEX\n", - " Telluride Regional\n", - " Telluride\n", - " CO\n", - " USA\n", - " 37.953759\n", - " -107.908480\n", - " 104\n", - " \n", - " \n", - " 195\n", - " CHA\n", - " Lovell\n", - " Chattanooga\n", - " TN\n", - " USA\n", - " 35.035268\n", - " -85.203788\n", - " 104\n", - " \n", - " \n", - " 196\n", - " LWS\n", - " Lewiston-Nez Perce County\n", - " Lewiston\n", - " ID\n", - " USA\n", - " 46.374498\n", - " -117.015394\n", - " 102\n", - " \n", - " \n", - " 197\n", - " CDC\n", - " Cedar City Muni\n", - " Cedar City\n", - " UT\n", - " USA\n", - " 37.700970\n", - " -113.098575\n", - " 96\n", - " \n", - " \n", - " 198\n", - " ALB\n", - " Albany Cty\n", - " Albany\n", - " NY\n", - " USA\n", - " 42.748119\n", - " -73.802979\n", - " 93\n", - " \n", - " \n", - " 199\n", - " BTV\n", - " Burlington International\n", - " Burlington\n", - " VT\n", - " USA\n", - " 44.473004\n", - " -73.150312\n", - " 91\n", - " \n", - " \n", - " 200\n", - " FCA\n", - " Glacier Park Intl\n", - " Kalispell\n", - " MT\n", - " USA\n", - " 48.311405\n", - " -114.255069\n", - " 90\n", - " \n", - " \n", - " 201\n", - " MLB\n", - " Melbourne International\n", - " Melbourne\n", - " FL\n", - " USA\n", - " 28.102750\n", - " -80.645806\n", - " 74\n", - " \n", - " \n", - " 202\n", - " DAB\n", - " Daytona Beach International\n", - " Daytona Beach\n", - " FL\n", - " USA\n", - " 29.179917\n", - " -81.058056\n", - " 72\n", - " \n", - " \n", - " 203\n", - " ABE\n", - " Lehigh Valley International\n", - " Allentown\n", - " PA\n", - " USA\n", - " 40.652363\n", - " -75.440402\n", - " 60\n", - " \n", - " \n", - " 204\n", - " DLH\n", - " Duluth International\n", - " Duluth\n", - " MN\n", - " USA\n", - " 46.842090\n", - " -92.193649\n", - " 58\n", - " \n", - " \n", - " 205\n", - " CYS\n", - " Cheyenne\n", - " Cheyenne\n", - " WY\n", - " USA\n", - " 41.155722\n", - " -104.811838\n", - " 56\n", - " \n", - " \n", - " 206\n", - " RKS\n", - " Rock Springs-Sweetwater County\n", - " Rock Springs\n", - " WY\n", - " USA\n", - " 41.594217\n", - " -109.065193\n", - " 56\n", - " \n", - " \n", - " 207\n", - " LWB\n", - " Greenbrier Valley\n", - " Lewisburg\n", - " WV\n", - " USA\n", - " 37.858306\n", - " -80.399472\n", - " 56\n", - " \n", - " \n", - " 208\n", - " CRW\n", - " Yeager\n", - " Charleston\n", - " WV\n", - " USA\n", - " 38.373151\n", - " -81.593190\n", - " 56\n", - " \n", - " \n", - " 209\n", - " BLI\n", - " Bellingham Intl\n", - " Bellingham\n", - " WA\n", - " USA\n", - " 48.792750\n", - " -122.537528\n", - " 56\n", - " \n", - " \n", - " 210\n", - " MMH\n", - " Mammoth Yosemite\n", - " Mammoth Lakes\n", - " CA\n", - " USA\n", - " 37.624049\n", - " -118.837772\n", - " 56\n", - " \n", - " \n", - " 211\n", - " ATW\n", - " Outagamie County Regional\n", - " Appleton\n", - " WI\n", - " USA\n", - " 44.257408\n", - " -88.519476\n", - " 56\n", - " \n", - " \n", - " 212\n", - " BKG\n", - " Branson Airport\n", - " Hollister\n", - " MO\n", - " USA\n", - " 36.385913\n", - " -92.548828\n", - " 56\n", - " \n", - " \n", - " 213\n", - " PIE\n", - " St. Petersburg-Clearwater International\n", - " St. Petersburg\n", - " FL\n", - " USA\n", - " 27.910763\n", - " -82.687439\n", - " 52\n", - " \n", - " \n", - " 214\n", - " SPS\n", - " Sheppard AFB/Wichita Falls Municipal\n", - " Wichita Falls\n", - " TX\n", - " USA\n", - " 33.988796\n", - " -98.491893\n", - " 50\n", - " \n", - " \n", - " 215\n", - " FAY\n", - " Fayetteville Municipal\n", - " Fayetteville\n", - " NC\n", - " USA\n", - " 34.991472\n", - " -78.880000\n", - " 50\n", - " \n", - " \n", - " 216\n", - " EAU\n", - " Chippewa Valley Regional\n", - " Eau Claire\n", - " WI\n", - " USA\n", - " 44.865257\n", - " -91.485072\n", - " 48\n", - " \n", - " \n", - " 217\n", - " DBQ\n", - " Dubuque Municipal\n", - " Dubuque\n", - " IA\n", - " USA\n", - " 42.402959\n", - " -90.709167\n", - " 48\n", - " \n", - " \n", - " 218\n", - " RST\n", - " Rochester International\n", - " Rochester\n", - " MN\n", - " USA\n", - " 43.908826\n", - " -92.497987\n", - " 37\n", - " \n", - " \n", - " 219\n", - " UTM\n", - " Tunica Municipal Airport\n", - " Tunica\n", - " MS\n", - " USA\n", - " 34.681499\n", - " -90.348816\n", - " 32\n", - " \n", - " \n", - " 220\n", - " BIL\n", - " Billings Logan Intl\n", - " Billings\n", - " MT\n", - " USA\n", - " 45.807662\n", - " -108.542861\n", - " 23\n", - " \n", " \n", "\n", - "

                  221 rows × 8 columns

                  \n", "" ], "text/plain": [ - " iata airport city state \\\n", - "0 ORD Chicago O'Hare International Chicago IL \n", - "1 ATL William B Hartsfield-Atlanta Intl Atlanta GA \n", - "2 DFW Dallas-Fort Worth International Dallas-Fort Worth TX \n", - "3 PHX Phoenix Sky Harbor International Phoenix AZ \n", - "4 DEN Denver Intl Denver CO \n", - "5 IAH George Bush Intercontinental Houston TX \n", - "6 SFO San Francisco International San Francisco CA \n", - "7 LAX Los Angeles International Los Angeles CA \n", - "8 MCO Orlando International Orlando FL \n", - "9 CLT Charlotte/Douglas International Charlotte NC \n", - "10 SLC Salt Lake City Intl Salt Lake City UT \n", - "11 TPA Tampa International Tampa FL \n", - "12 EWR Newark Intl Newark NJ \n", - "13 LAS McCarran International Las Vegas NV \n", - "14 PHL Philadelphia Intl Philadelphia PA \n", - "15 MSP Minneapolis-St Paul Intl Minneapolis MN \n", - "16 SEA Seattle-Tacoma Intl Seattle WA \n", - "17 LGA LaGuardia New York NY \n", - "18 MDW Chicago Midway Chicago IL \n", - "19 IAD Washington Dulles International Chantilly VA \n", - "20 SAN San Diego International-Lindbergh San Diego CA \n", - "21 STL Lambert-St Louis International St Louis MO \n", - "22 DTW Detroit Metropolitan-Wayne County Detroit MI \n", - "23 JFK John F Kennedy Intl New York NY \n", - "24 MIA Miami International Miami FL \n", - "25 BOS Gen Edw L Logan Intl Boston MA \n", - "26 SMF Sacramento International Sacramento CA \n", - "27 BWI Baltimore-Washington International Baltimore MD \n", - "28 SNA John Wayne /Orange Co Santa Ana CA \n", - "29 MSY New Orleans International New Orleans LA \n", - ".. ... ... ... ... \n", - "191 GTF Great Falls Intl Great Falls MT \n", - "192 MEI Key Meridian MS \n", - "193 MQT Marquette County Airport NaN NaN \n", - "194 TEX Telluride Regional Telluride CO \n", - "195 CHA Lovell Chattanooga TN \n", - "196 LWS Lewiston-Nez Perce County Lewiston ID \n", - "197 CDC Cedar City Muni Cedar City UT \n", - "198 ALB Albany Cty Albany NY \n", - "199 BTV Burlington International Burlington VT \n", - "200 FCA Glacier Park Intl Kalispell MT \n", - "201 MLB Melbourne International Melbourne FL \n", - "202 DAB Daytona Beach International Daytona Beach FL \n", - "203 ABE Lehigh Valley International Allentown PA \n", - "204 DLH Duluth International Duluth MN \n", - "205 CYS Cheyenne Cheyenne WY \n", - "206 RKS Rock Springs-Sweetwater County Rock Springs WY \n", - "207 LWB Greenbrier Valley Lewisburg WV \n", - "208 CRW Yeager Charleston WV \n", - "209 BLI Bellingham Intl Bellingham WA \n", - "210 MMH Mammoth Yosemite Mammoth Lakes CA \n", - "211 ATW Outagamie County Regional Appleton WI \n", - "212 BKG Branson Airport Hollister MO \n", - "213 PIE St. Petersburg-Clearwater International St. Petersburg FL \n", - "214 SPS Sheppard AFB/Wichita Falls Municipal Wichita Falls TX \n", - "215 FAY Fayetteville Municipal Fayetteville NC \n", - "216 EAU Chippewa Valley Regional Eau Claire WI \n", - "217 DBQ Dubuque Municipal Dubuque IA \n", - "218 RST Rochester International Rochester MN \n", - "219 UTM Tunica Municipal Airport Tunica MS \n", - "220 BIL Billings Logan Intl Billings MT \n", - "\n", - " country lat long cnt \n", - "0 USA 41.979595 -87.904464 25129 \n", - "1 USA 33.640444 -84.426944 21925 \n", - "2 USA 32.895951 -97.037200 20662 \n", - "3 USA 33.434167 -112.008056 17290 \n", - "4 USA 39.858408 -104.667002 13781 \n", - "5 USA 29.980472 -95.339722 13223 \n", - "6 USA 37.619002 -122.374843 12016 \n", - "7 USA 33.942536 -118.408074 11797 \n", - "8 USA 28.428889 -81.316028 10536 \n", - "9 USA 35.214011 -80.943126 10490 \n", - "10 USA 40.788388 -111.977773 9898 \n", - "11 USA 27.975472 -82.533250 9182 \n", - "12 USA 40.692497 -74.168661 8678 \n", - "13 USA 36.080361 -115.152333 8523 \n", - "14 USA 39.871953 -75.241141 7965 \n", - "15 USA 44.880547 -93.216922 7690 \n", - "16 USA 47.448982 -122.309313 7541 \n", - "17 USA 40.777243 -73.872609 7392 \n", - "18 USA 41.785983 -87.752424 6979 \n", - "19 USA 38.944532 -77.455810 6779 \n", - "20 USA 32.733556 -117.189657 6233 \n", - "21 USA 38.747687 -90.359990 6204 \n", - "22 USA 42.212059 -83.348836 6044 \n", - "23 USA 40.639751 -73.778926 5945 \n", - "24 USA 25.793250 -80.290556 5907 \n", - "25 USA 42.364348 -71.005179 5627 \n", - "26 USA 38.695422 -121.590767 4943 \n", - "27 USA 39.175402 -76.668198 4749 \n", - "28 USA 33.675659 -117.868223 4616 \n", - "29 USA 29.993389 -90.258028 4432 \n", - ".. ... ... ... ... \n", - "191 USA 47.482002 -111.370685 108 \n", - "192 USA 32.333133 -88.751206 104 \n", - "193 USA 46.353639 -87.395361 104 \n", - "194 USA 37.953759 -107.908480 104 \n", - "195 USA 35.035268 -85.203788 104 \n", - "196 USA 46.374498 -117.015394 102 \n", - "197 USA 37.700970 -113.098575 96 \n", - "198 USA 42.748119 -73.802979 93 \n", - "199 USA 44.473004 -73.150312 91 \n", - "200 USA 48.311405 -114.255069 90 \n", - "201 USA 28.102750 -80.645806 74 \n", - "202 USA 29.179917 -81.058056 72 \n", - "203 USA 40.652363 -75.440402 60 \n", - "204 USA 46.842090 -92.193649 58 \n", - "205 USA 41.155722 -104.811838 56 \n", - "206 USA 41.594217 -109.065193 56 \n", - "207 USA 37.858306 -80.399472 56 \n", - "208 USA 38.373151 -81.593190 56 \n", - "209 USA 48.792750 -122.537528 56 \n", - "210 USA 37.624049 -118.837772 56 \n", - "211 USA 44.257408 -88.519476 56 \n", - "212 USA 36.385913 -92.548828 56 \n", - "213 USA 27.910763 -82.687439 52 \n", - "214 USA 33.988796 -98.491893 50 \n", - "215 USA 34.991472 -78.880000 50 \n", - "216 USA 44.865257 -91.485072 48 \n", - "217 USA 42.402959 -90.709167 48 \n", - "218 USA 43.908826 -92.497987 37 \n", - "219 USA 34.681499 -90.348816 32 \n", - "220 USA 45.807662 -108.542861 23 \n", + " iata airport city state country \\\n", + "0 ORD Chicago O'Hare International Chicago IL USA \n", + "1 ATL William B Hartsfield-Atlanta Intl Atlanta GA USA \n", + "2 DFW Dallas-Fort Worth International Dallas-Fort Worth TX USA \n", + "3 PHX Phoenix Sky Harbor International Phoenix AZ USA \n", + "4 DEN Denver Intl Denver CO USA \n", + "5 IAH George Bush Intercontinental Houston TX USA \n", + "6 SFO San Francisco International San Francisco CA USA \n", + "7 LAX Los Angeles International Los Angeles CA USA \n", + "8 MCO Orlando International Orlando FL USA \n", + "9 CLT Charlotte/Douglas International Charlotte NC USA \n", "\n", - "[221 rows x 8 columns]" + " lat long cnt \n", + "0 41.979595 -87.904464 25129 \n", + "1 33.640444 -84.426944 21925 \n", + "2 32.895951 -97.037200 20662 \n", + "3 33.434167 -112.008056 17290 \n", + "4 39.858408 -104.667002 13781 \n", + "5 29.980472 -95.339722 13223 \n", + "6 37.619002 -122.374843 12016 \n", + "7 33.942536 -118.408074 11797 \n", + "8 28.428889 -81.316028 10536 \n", + "9 35.214011 -80.943126 10490 " ] }, - "execution_count": 10, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas\n", - "pandas.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv')" + "pandas.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv').head(10)" ] }, { From f6f6c736bbbd5d31682d27b40698307d4cd8da42 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 6 Aug 2019 13:30:15 -0400 Subject: [PATCH 310/380] minor wording tweak and fix import in python unit test_agg_local_mean Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/getting-started.pymd | 2 +- pyrasterframes/src/main/python/tests/RasterFunctionsTests.py | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index 795322bba..db279133b 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -115,4 +115,4 @@ from pyrasterframes.utils import gdal_version print(gdal_version()) ``` -This will print out somethin like "GDAL x.y.z, released 20yy/mm/dd". If it reports `unavailable`, then GDAL isn't installed in a place where the RasterFrames runtime was able to find it. Please [file an issue](https://github.com/locationtech/rasterframes/issues) to get help resolving it. \ No newline at end of file +This will print out something like "GDAL x.y.z, released 20yy/mm/dd". If it reports `not available`, then GDAL isn't installed in a place where the RasterFrames runtime was able to find it. Please [file an issue](https://github.com/locationtech/rasterframes/issues) to get help resolving it. \ No newline at end of file diff --git a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py index 58da7c89c..7989b5405 100644 --- a/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py +++ b/pyrasterframes/src/main/python/tests/RasterFunctionsTests.py @@ -98,6 +98,8 @@ def test_agg_mean(self): def test_agg_local_mean(self): from pyspark.sql import Row + from pyrasterframes.rf_types import Tile + import numpy as np # this is really testing the nodata propagation in the agg local summation ct = CellType.int8().with_no_data_value(4) From 9e07cae8c644625ccb5fa200bbc3ea4dae7f1302 Mon Sep 17 00:00:00 2001 From: Eric Culbertson Date: Tue, 6 Aug 2019 11:40:53 -0700 Subject: [PATCH 311/380] Add NoData sum section. Fixed abiguity in adding tiles with different NoData Signed-off-by: Eric Culbertson --- .../src/main/python/docs/nodata-handling.pymd | 107 ++++++++++++------ 1 file changed, 72 insertions(+), 35 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index d778c42a9..02639d370 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -146,6 +146,37 @@ And the original SCL data. The bright yellow is a cloudy region in the original display(sample[1]) ``` +## NoData and Local Arithmatic + +Let's now explore how the presence of NoData affects local arithmatic operations. To demonstrate the behaviour, lets create two tiles. One tile will have values of 0 and 1, and the other will have values of just 0. + + +```python +tile_size = 100 +x = np.zeros((tile_size, tile_size), dtype='int16') +x[:,tile_size//2:] = 1 +x = Tile(x) +y = Tile(np.zeros((tile_size, tile_size), dtype='int16')) + +rf = spark.createDataFrame([Row(x=x, y=y)]) +print('x') +display(x) +print('y') +display(y) +``` + +Now, let's create a new column from `x` with the value of 1 changed to NoData. Then, we will add this new column with NoData to the `y` column. As shown below, the result of the sum also has NoData (represented in white). In general for arithmatic operations, Data + NoData = NoData. To see more information about possible operations on Tile columns, see the @ref:[local map algebra](local-algebra.md) doc. + +```python +masked_rf = rf.withColumn('x_nd', rf_mask_by_value('x', 'x', lit(1)) ) +masked_rf = masked_rf.withColumn('x_nd_y_sum', rf_local_add('x_nd', 'y')) +row = masked_rf.collect()[0] +print('x with NoData') +display(row.x_nd) +print('x with NoData and y sum') +display(row.x_nd_y_sum) +``` + ## Changing a Tile's NoData Values One way to mask a tile is to make a new tile with a user defined NoData value. We will explore this method below. First, lets create a rasterframe from a tile with values of 0, 1, 2, and 3. We will use numpy to create a 100x100 Tile with columns of 0, 1, 2, and 3. @@ -191,36 +222,6 @@ And the tile named `tile_nd_2` has the values of 1 and 2 masked out. This is bec display(collected[0].tile_nd_2) ``` -## Nodata Values in Aggregation - -Let's use the same tile as before to demonstrate how NoData values affect tile aggregations - -```python -tile_size = 100 -x = np.zeros((tile_size, tile_size), dtype='int16') -for i in range(4): - x[:, i*tile_size//4:(i+1)*tile_size//4] = i -x = Tile(x) - -rf = spark.createDataFrame([Row(tile=x)]) -display(x) -``` - -First we create the two new masked tile columns as before. One with only the value of 1 masked, and the other with and values of 1 and 2 masked. - -```python -masked_rf = rf.withColumn('tile_nd_1', - rf_convert_cell_type('tile', get_nodata_ct(1))) \ - .withColumn('tile_nd_2', - rf_convert_cell_type('tile_nd_1', get_nodata_ct(2))) -``` - -The results of `rf_tile_sum` vary on the tiles that were masked. This is because any cells with NoData values are ignored in the aggregation. Note that `tile_nd_2` has the lowest sum, since it has the fewest amount of data cells. - -```python -masked_rf.select(rf_tile_sum('tile'), rf_tile_sum('tile_nd_1'), rf_tile_sum('tile_nd_2')).show() -``` - ## Combining Tiles with Different Data Types @@ -242,21 +243,57 @@ When performing a local operation between tile columns with cell types `int` and rf_added = rf.withColumn('xy_sum', rf_local_add('y', 'x')) rf_added.select(rf_cell_type('xy_sum'), rf_cell_type('y'), rf_cell_type('x')).distinct().show() ``` -Combining tile columns of different cell types gets a little trickier when user defined NoData cell types are involved. Let's create 3 tile columns: one without a defined NoData value, one with a NoData value of 1, and one with a NoData value of 2. +Combining tile columns of different cell types gets a little trickier when user defined NoData cell types are involved. Let's create 2 tile columns: one with a NoData value of 1, and one with a NoData value of 2. ```python x = Tile((np.ones((100, 100))*3).astype('int16')) - rf = spark.createDataFrame([Row(x=x)]) rf_nd = rf.withColumn('x_nd_1', rf_convert_cell_type('x', get_nodata_ct(1))) \ .withColumn('x_nd_2', rf_convert_cell_type('x', get_nodata_ct(2))) ``` -Let's try adding the tile column without a defined NoData value to a tile column with a defined NoData value. When there is an inconsistent NoData value in the two columns, the NoData value of the right-hand side of the sum is kept. In this case, this means the result has no defined NoData value. +Let's try adding the tile columns with different NoData values. When there is an inconsistent NoData value in the two columns, the NoData value of the right-hand side of the sum is kept. In this case, this means the result has a NoData value of 1. + +```python +rf_nd_sum = rf_nd.withColumn('x_nd_sum', rf_local_add('x_nd_2', 'x_nd_1')) +rf_nd_sum.select(rf_cell_type('x_nd_sum')).distinct().show() +``` + +Reversing the order of the sum changes the NoData value of the resulting column to 2. + +```python +rf_nd_sum = rf_nd.withColumn('x_nd_sum', rf_local_add('x_nd_1', 'x_nd_2')) +rf_nd_sum.select(rf_cell_type('x_nd_sum')).distinct().show() +``` + +## Nodata Values in Aggregation + +Let's use the same tile as before to demonstrate how NoData values affect tile aggregations + +```python +tile_size = 100 +x = np.zeros((tile_size, tile_size), dtype='int16') +for i in range(4): + x[:, i*tile_size//4:(i+1)*tile_size//4] = i +x = Tile(x) + +rf = spark.createDataFrame([Row(tile=x)]) +display(x) +``` + +First we create the two new masked tile columns as before. One with only the value of 1 masked, and the other with and values of 1 and 2 masked. + +```python +masked_rf = rf.withColumn('tile_nd_1', + rf_convert_cell_type('tile', get_nodata_ct(1))) \ + .withColumn('tile_nd_2', + rf_convert_cell_type('tile_nd_1', get_nodata_ct(2))) +``` + +The results of `rf_tile_sum` vary on the tiles that were masked. This is because any cells with NoData values are ignored in the aggregation. Note that `tile_nd_2` has the lowest sum, since it has the fewest amount of data cells. ```python -rf_nd_sum = rf_nd.withColumn('x_nd_sum', rf_local_add('x_nd_1', 'x')) -rf_nd_sum.select(rf_cell_type('x_nd_sum'), rf_cell_type('x'), rf_cell_type('x_nd_1')).distinct().show() +masked_rf.select(rf_tile_sum('tile'), rf_tile_sum('tile_nd_1'), rf_tile_sum('tile_nd_2')).show() ``` From 4a14d3cfee948275a322f58b79bb4cb76d3a416a Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Tue, 6 Aug 2019 15:01:44 -0400 Subject: [PATCH 312/380] spelling/grammar mistakes Signed-off-by: Courtney Whalen --- .../src/main/python/docs/raster-read.pymd | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 1d3f8b252..8bfbb0187 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -3,12 +3,12 @@ ```python, echo=False from IPython.display import display import pandas as pd -from pyrasterframes.utils import create_rf_spark_session +from pyrasterframes.utils import create_rf_spark_session from pyrasterframes.rasterfunctions import * spark = create_rf_spark_session() ``` -RasterFrames registers a DataSource named `raster` that enables reading of GeoTIFFs (and other formats when @ref:[GDAL is installed](getting-started.md#installing-gdal)) from arbitrary URIs. In the examples that follow we'll be reading from a Sentinel 2 scene stored in an AWS S3 bucket. +RasterFrames registers a DataSource named `raster` that enables reading of GeoTIFFs (and other formats when @ref:[GDAL is installed](getting-started.md#installing-gdal)) from arbitrary URIs. In the examples that follow we'll be reading from a Sentinel-2 scene stored in an AWS S3 bucket. ## Single Raster @@ -19,15 +19,15 @@ rf = spark.read.raster('https://s22s-test-geotiffs.s3.amazonaws.com/luray_snp/B0 rf.printSchema() ``` -The file at the address above is a valid [Cloud Optimized GeoTIFF (COG)](https://www.cogeo.org/), which RasterFrames fully supports. RasterFrames will take advantage of the optimizations in the COG format to enable more efficient reading compared to vanilla GeoTIFFs. +The file at the address above is a valid [Cloud Optimized GeoTIFF (COG)](https://www.cogeo.org/), which RasterFrames fully supports. RasterFrames will take advantage of the optimizations in the COG format to enable more efficient reading compared to vanilla GeoTIFFs. -Let's unpack the `proj_raster` column and look at the contents in more detail. It contains a [_CRS_][CRS], a spatial _extent_ measured in that CRS, and a two-dimensional array of numeric values called a _tile_. +Let's unpack the `proj_raster` column and look at the contents in more detail. It contains a [_CRS_][CRS], a spatial _extent_ measured in that CRS, and a two-dimensional array of numeric values called a _tile_. ```python unpack_schema crs = rf.select(rf_crs("proj_raster").alias("value")).first() parts = rf.select( - rf_extent("proj_raster").alias("extent"), + rf_extent("proj_raster").alias("extent"), rf_tile("proj_raster").alias("tile") ) @@ -36,7 +36,7 @@ parts.show(5, False) ``` -You can also see that the single raster has been broken out into many arbitrary non-overlapping regions. Doing so takes advantage of parallel in-memory reads from the cloud hosted data source and allows Spark to work on managable amounts of data per task. +You can also see that the single raster has been broken out into many arbitrary non-overlapping regions. Doing so takes advantage of parallel in-memory reads from the cloud hosted data source and allows Spark to work on manageable amounts of data per task. ```python count_by_uri rf.groupby(rf.proj_raster_path).count().show() @@ -51,7 +51,7 @@ display(tile) ## URI Formats -RasterFrames relies on three different IO drivers, selected based on a combination of scheme, file extentions, and library availability. GDAL is used first if a compatible version of GDAL (>= 2.4) is installed. It is the only driver that can read non-GeoTIFF files. If GDAL is not available, either the _Java I/O` or _Hadoop_ driver will be selected, depending on scheme. +RasterFrames relies on three different IO drivers, selected based on a combination of scheme, file extentions, and library availability. GDAL is used first if a compatible version of GDAL (>= 2.4) is installed. It is the only driver that can read non-GeoTIFF files. If GDAL is not available, either the _Java I/O_ or _Hadoop_ driver will be selected, depending on scheme. | Prefix | GDAL | Java I/O | Hadoop | @@ -86,8 +86,8 @@ modis_catalog = spark.read \ .format("csv") \ .option("header", "true") \ .load(SparkFiles.get(cat_filename)) \ - .withColumn('base_url', - F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) + .withColumn('base_url', + F.concat(F.regexp_replace('download_url', 'index.html$', ''), 'gid',) ) \ .drop('download_url') \ .withColumn('red' , F.concat('base_url', F.lit("_B01.TIF"))) \ @@ -100,11 +100,11 @@ print("Available scenes: ", modis_catalog.count()) modis_catalog.show(5, truncate=False) ``` -MODIS data products are delivered on a regular, consistent grid, making identification of a specific area over time easy using `(h,v)` grid coordinates. +MODIS data products are delivered on a regular, consistent grid, making identification of a specific area over time easy using `(h,v)` grid coordinates. ![MODIS Grid](https://modis-land.gsfc.nasa.gov/images/MODIS_sinusoidal_grid1.gif) -For example, MODIS data right above the equator is all grid coordinates with `v07`. +For example, MODIS data right above the equator is all grid coordinates with `v07`. ```python catalog_filtering equator = modis_catalog.where(F.col('gid').like('%v07%')) @@ -115,13 +115,13 @@ Now that we have prepared our catalog, we simply pass the DataFrame or CSV strin ```python read_catalog rf = spark.read.raster( - catalog=equator, + catalog=equator, catalog_col_names=['red', 'nir'], ) rf.printSchema() ``` -Observe schema of the resulting dataframe has a projected raster struct for each column passed in `catalog_col_names`. For reference the URI is now in a column appended with `_path`. We can take a quick look at the representation of the data. We see again each row contains an arbitrary portion of the entire scene coverage. We also see that for two-D catalogs, each row contains the same spatial extent from within that coverage. +Observe that the schema of the resulting DataFrame has a projected raster struct for each column passed in `catalog_col_names`. For reference, the URI is now in a column appended with `_path`. We can take a quick look at the representation of the data. We see again each row contains an arbitrary portion of the entire scene coverage. We also see that for two-D catalogs, each row contains the same spatial extent from within that coverage. ```python cat_read_sample rf.select('gid', rf_extent('red'), rf_extent('nir'), rf_tile('red'), rf_tile('nir')).show(3, False) @@ -142,18 +142,18 @@ spark.read.raster(uri, lazy_tiles=False) \ .select('proj_raster.tile').show(1, False) ``` -In the initial examples on this page, we used `rf_tile` to explicitly request the realized tile from the lazy representation. +In the initial examples on this page, we used @ref:[`rf_tile`](reference.md#rf-tile) to explicitly request the realized tile from the lazy representation. ## Multiband Rasters A multiband raster represents a three dimensional numeric array. The first two dimensions are spatial, and the third dimension is typically designated as different bands. The bands may represent intensity of different wavelengths of light (or other electromagnetic radiation). The different bands may represent other phenomena such as measurement time, quality indications, or additional measurements. -When reading a multiband raster or a _Catalog_ describing multiband rasters, you will need to know ahead of time which bands you want to read. You will specify the bands to read, indexed from zero, passing a list of integers into the `band_indexes` parameter of the `raster` reader. +When reading a multiband raster or a _Catalog_ describing multiband rasters, you will need to know ahead of time which bands you want to read. You will specify the bands to read, indexed from zero, passing a list of integers into the `band_indexes` parameter of the `raster` reader. -For example we can read a four-band (red, green, blue, and near-infrared) image as follows. The individual rows of the resulting dataframe still represent distinct spatial extents, with a projected raster column for each band specified by `band_indexes`. +For example we can read a four-band (red, green, blue, and near-infrared) image as follows. The individual rows of the resulting DataFrame still represent distinct spatial extents, with a projected raster column for each band specified by `band_indexes`. ```python Multiband -mb = spark.read.raster('s3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620.tif', +mb = spark.read.raster('s3://s22s-test-geotiffs/naip/m_3807863_nw_17_1_20160620.tif', band_indexes=[0, 1, 2, 3], ) mb.printSchema() @@ -180,4 +180,4 @@ mb2 = spark.read.raster(catalog=spark.createDataFrame(mb_cat), mb2.printSchema() ``` -[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system \ No newline at end of file +[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system From 563e67b64117caab521be383ea05fb1ae190b413 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 26 Jun 2019 16:42:45 -0400 Subject: [PATCH 313/380] Breaking unit test in python for issue 163 tile exploder with ProjectedRaster Signed-off-by: Jason T. Brown --- .../main/python/docs/supervised-learning.pymd | 3 +- .../src/main/python/tests/ExploderTests.py | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) create mode 100644 pyrasterframes/src/main/python/tests/ExploderTests.py diff --git a/pyrasterframes/src/main/python/docs/supervised-learning.pymd b/pyrasterframes/src/main/python/docs/supervised-learning.pymd index a13b39b7b..ca6d9d53e 100644 --- a/pyrasterframes/src/main/python/docs/supervised-learning.pymd +++ b/pyrasterframes/src/main/python/docs/supervised-learning.pymd @@ -71,7 +71,8 @@ print('Found ', len(crses), 'distinct CRS.') crs = crses[0][0] label_df = spark.read.geojson(os.path.join(resource_dir_uri(), 'luray-labels.geojson')) \ - .select('id', st_reproject('geometry', 'EPSG:4326', crs).alias('geometry')) \ + .select('id', + st_reproject('geometry', rf_mk_crs('EPSG:4326'), rf_mk_crs(crs)).alias('geometry')) \ .hint('broadcast') df_joined = df.join(label_df, st_intersects(st_geometry('extent'), 'geometry')) diff --git a/pyrasterframes/src/main/python/tests/ExploderTests.py b/pyrasterframes/src/main/python/tests/ExploderTests.py new file mode 100644 index 000000000..05ff958ae --- /dev/null +++ b/pyrasterframes/src/main/python/tests/ExploderTests.py @@ -0,0 +1,59 @@ +# +# This software is licensed under the Apache 2 license, quoted below. +# +# Copyright 2019 Astraea, Inc. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may not +# use this file except in compliance with the License. You may obtain a copy of +# the License at +# +# [http://www.apache.org/licenses/LICENSE-2.0] +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations under +# the License. +# +# SPDX-License-Identifier: Apache-2.0 +# + +from . import TestEnvironment + +from pyrasterframes.rasterfunctions import * +from pyrasterframes.rf_types import * +from pyrasterframes import TileExploder + +from pyspark.ml.feature import VectorAssembler +from pyspark.ml import Pipeline +from pyspark.sql.functions import * + +import unittest + + +class ExploderTests(TestEnvironment): + + @unittest.skip("See issue https://github.com/locationtech/rasterframes/issues/163") + def test_tile_exploder_pipeline_for_prt(self): + # NB the tile is a Projected Raster Tile + df = self.spark.read.raster(self.img_uri) + t_col = 'proj_raster' + self.assertTrue(t_col in df.columns) + + assembler = VectorAssembler().setInputCols([t_col]) + pipe = Pipeline().setStages([TileExploder(), assembler]) + pipe_model = pipe.fit(df) + tranformed_df = pipe_model.transform(df) + self.assertTrue(tranformed_df.count() > df.count()) + + def test_tile_exploder_pipeline_for_tile(self): + t_col = 'tile' + df = self.spark.read.raster(self.img_uri) \ + .withColumn(t_col, rf_tile('proj_raster')) \ + .drop('proj_raster') + + assembler = VectorAssembler().setInputCols([t_col]) + pipe = Pipeline().setStages([TileExploder(), assembler]) + pipe_model = pipe.fit(df) + tranformed_df = pipe_model.transform(df) + self.assertTrue(tranformed_df.count() > df.count()) From 9362d1402f0224f2d1f524cd6b5d6271c4ba930f Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 6 Aug 2019 16:08:12 -0400 Subject: [PATCH 314/380] Update concepts page based on feedback --- .../src/main/python/docs/concepts.md | 26 +++++++++---------- .../src/main/python/docs/raster-read.pymd | 6 +++-- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/concepts.md b/pyrasterframes/src/main/python/docs/concepts.md index 0ddfd6a30..f367a1310 100644 --- a/pyrasterframes/src/main/python/docs/concepts.md +++ b/pyrasterframes/src/main/python/docs/concepts.md @@ -6,9 +6,13 @@ There are a number of Earth-observation (EO) concepts that crop up in the discus * [_Newcomers Earth Observation Guide_](https://business.esa.int/newcomers-earth-observation-guide) * [_Earth Observation Markets and Applications_](https://www.ofcom.org.uk/__data/assets/pdf_file/0021/82047/introduction_eo_for_ofcom_june_2015_no_video.pdf) +## Raster + +A raster is a regular grid of numeric values. A raster can be thought of as an image, as is the case if the values in the grid represent brightness along a greyscale. More generally a raster can measure many different phenomena or encode a variety of different discrete classifications. + ## Cell -A cell is a single sample from a sensor encoded as a scalar value associated with a specific spatiotemporal location and time. It can be thought of as an image pixel associated with a place and time. +A cell is a single row and column intersection in the raster grid. It is a single pixel in an image. A cell's value often represents one sample from a sensor encoded as a scalar value associated with a specific location and time. ## Cell Type @@ -18,7 +22,7 @@ A numeric cell value may be encoded in a number of different computer numeric fo * integral vs floating-point -The cell types most frequent in RasterFrames are as follows: +The most frequently encountered cell types in RasterFrames are below. | Name | Abbreviation | Description | Range | | --- | --- | --- | --- | @@ -31,7 +35,7 @@ The cell types most frequent in RasterFrames are as follows: | Float | `float32` | 32-bit floating-point | -3.4028235E38 to 3.4028235E38 | | Double | `float64` | 64-bit floating-point | -1.7976931348623157E308 to 1.7976931348623157E308 | -See the section on [“NoData” Handling](nodata-handling.md) for additional discussion on cell types. +See the section on [“NoData” Handling](nodata-handling.md) for additional discussion on cell types and more exhaustive coverage of available cell types. ## NoData @@ -39,19 +43,19 @@ A "NoData" (or N/A) value is a specifically identified value for a cell type use ## Scene -A scene (or granule) is a discrete instance of EO data with a specific extent (region), date-time, and projection/CRS. +A scene (or granule) is a discrete instance of EO @ref:[raster data](concepts.md#raster) with a specific extent (region), date-time, and map projection (or CRS). ## Coordinate Reference System (CRS) -A coordinate reference system (or spatial reference system) is a set of mathematical constructs used to map cells to specific locations on the Earth (or other surface). A CRS typically accompanies any EO data so it can be precisely located. +A [coordinate reference system (or spatial reference system)][CRS] is a set of mathematical constructs used to translate locations on the three-dimensional surface of the earth to the two dimensional raster grid. A CRS typically accompanies any EO data so it can be precisely located. ## Extent -An extent (or bounding box) is a rectangular region specifying the geospatial coverage of a two-dimensional array of cells in a singular CRS. +An extent (or bounding box) is a rectangular region specifying the geospatial coverage of a @ref:[raster](concepts.md#raster) or @ref:[tile](concepts.md#tile), a two-dimensional array of @ref:[cells](concepts.md#cell) within a single CRS. ## Tile -A tile (sometimes called a "chip") is a rectangular subset of a @ref:[scene](concepts.md#scene). A tile can conceptually be thought of as a two-dimensional array. +A tile (sometimes called a "chip") is a rectangular subset of a @ref:[scene](concepts.md#scene). As a scene is a raster, a tile is also a raster. A tile can conceptually be thought of as a two-dimensional array. Some EO data has many bands or channels. Tiles in this context are conceptually a three-dimensional array, with the extra dimension representing the bands. @@ -59,10 +63,4 @@ Tiles are often square and the dimensions are some power of two, for example 256 The tile is the primary discretization unit used in RasterFrames. Each band of a scene is in a separate column. The scene's overall @ref:[extent](concepts.md#extent) is carved up into smaller extents for each tile. Each row of the DataFrame contains a two-dimensional tile per band column. -## Projected Extent - -An extent paired with a CRS. - -## Projected Raster - -A tile or scene paired with a CRS and extent. +[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system \ No newline at end of file diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 8bfbb0187..9be4f906e 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -21,7 +21,7 @@ rf.printSchema() The file at the address above is a valid [Cloud Optimized GeoTIFF (COG)](https://www.cogeo.org/), which RasterFrames fully supports. RasterFrames will take advantage of the optimizations in the COG format to enable more efficient reading compared to vanilla GeoTIFFs. -Let's unpack the `proj_raster` column and look at the contents in more detail. It contains a [_CRS_][CRS], a spatial _extent_ measured in that CRS, and a two-dimensional array of numeric values called a _tile_. +Let's unpack the `proj_raster` column and look at the contents in more detail. It contains a @ref:[_CRS_][CRS], a spatial @ref:[_extent_][Extent] measured in that CRS, and a two-dimensional array of numeric values called a @ref:[_tile_][Tile]. ```python unpack_schema crs = rf.select(rf_crs("proj_raster").alias("value")).first() @@ -180,4 +180,6 @@ mb2 = spark.read.raster(catalog=spark.createDataFrame(mb_cat), mb2.printSchema() ``` -[CRS]: https://en.wikipedia.org/wiki/Spatial_reference_system +[CRS]: concepts.md#coordinate-reference-system--crs +[Extent]: concepts.md#extent +[Tile]: concpets.md#tile \ No newline at end of file From 02244bc7130603340d1e70fe33b8c60622e8e7eb Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 6 Aug 2019 17:36:19 -0400 Subject: [PATCH 315/380] description.md page feedback partial, some docs build fixes Signed-off-by: Jason T. Brown --- .../src/main/python/docs/description.md | 23 ++++----- .../src/main/python/docs/getting-started.pymd | 2 +- .../src/main/python/docs/raster-write.pymd | 2 +- .../python/docs/static/rasterframe-sample.md | 48 +++++++++++++++++++ pyrasterframes/src/main/python/setup.py | 11 +++-- 5 files changed, 68 insertions(+), 18 deletions(-) create mode 100644 pyrasterframes/src/main/python/docs/static/rasterframe-sample.md diff --git a/pyrasterframes/src/main/python/docs/description.md b/pyrasterframes/src/main/python/docs/description.md index 53961166b..7e5017821 100644 --- a/pyrasterframes/src/main/python/docs/description.md +++ b/pyrasterframes/src/main/python/docs/description.md @@ -1,38 +1,39 @@ # Overview -RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. It provides APIs in @ref:[Python, SQL, and Scala](languages.md), and can horizontally scale from a laptop to a supercomputer, enabling _global_ analysis with satellite imagery in a wholly new, flexible and convenient way. +RasterFrames® provides a DataFrame-centric view over arbitrary Earth-observation (EO) data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of [Apache Spark](https://spark.apache.org/docs/latest/) [ML](https://spark.apache.org/docs/latest/ml-guide.html) algorithms. It provides APIs in @ref:[Python, SQL, and Scala](languages.md), and can scale from a laptop to a large distributed cluster, enabling _global_ analysis with satellite imagery in a wholly new, flexible and convenient way. ## Context -We have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. +We have a millennia-long history of organizing information in tabular form. Typically, rows represent independent events or observations, and columns represent attributes and measurements from the observations. The forms have evolved, from hand-written agricultural records and transaction ledgers, to the advent of spreadsheets on the personal computer, and on to the creation of the _DataFrame_ data structure as found in [R Data Frames][R] and [Python Pandas][Pandas]. The table-oriented data structure remains a common and critical component of organizing data across industries, and is the mental model employed by many data scientists across diverse forms of modeling and analysis. -Today, DataFrames are the _lingua franca_ of data science. The evolution of the tabular form has continued with Apache Spark SQL, which brings DataFrames to the big data distributed compute space. Through several novel innovations, Spark SQL enables interactive and batch-oriented cluster computing without having to be versed in the highly specialized skills typically required for high-performance computing. As suggested by the name, these DataFrames are manipulatable via standard SQL, as well as the more general-purpose programming languages Python, R, Java, and Scala. +The evolution of the DataFrame form has continued with [Spark SQL](https://spark.apache.org/docs/latest/sql-programming-guide.html), which brings DataFrames to the big data distributed compute space. Through several novel innovations, Spark SQL enables data scientists to work with DataFrames too large for the memory of a single computer. As suggested by the name, these DataFrames are manipulatable via standard SQL, as well as the more general-purpose programming languages Python, R, Java, and Scala. -RasterFrames®, an incubating Eclipse Foundation LocationTech project, brings together Earth-observing (EO) data analysis, big data computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. According to a World Bank document on assets for post-disaster situation awareness[^1]: +RasterFrames, an incubating Eclipse Foundation LocationTech project, brings together EO data access, cloud computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. According to a World Bank document on assets for post-disaster situation awareness[^1]: > Of the 1,738 operational satellites currently orbiting the earth (as of 9/[20]17), 596 are earth observation satellites and 477 of these are non-military assets (ie available to civil society including commercial entities and governments for earth observation, according to the Union of Concerned Scientists). This number is expected to increase significantly over the next ten years. The 200 or so planned remote sensing satellites have a value of over 27 billion USD (Forecast International). This estimate does not include the burgeoning fleets of smallsats as well as micro, nano and even smaller satellites... All this enthusiasm has, not unexpectedly, led to a veritable fire-hose of remotely sensed data which is becoming difficult to navigate even for seasoned experts. ## Benefit -By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. Because it is built on Apache Spark, solutions prototyped on a laptop can be scaled to run on cluster and cloud compute resources in a way not easily achieved with other toolchains. +By using DataFrames as the core cognitive and compute data model for processing EO data, RasterFrames is able to deliver sophisticated computational and algorithmic capabilities in a tabular form that is familiar and accessible to the general computing public. Because it is built on Apache Spark, solutions prototyped on a laptop can be easily scaled to run on cluster and cloud compute resources. Apache Spark also provides integration between its DataFrame libraries and machine learning, with which RasterFrames is fully compatible. ## Architecture -RasterFrames takes the Spark SQL DataFrame and extends it to support standard EO operations. It does this with the help of several other LocationTech projects: +RasterFrames builds upon several other LocationTech projects: [GeoTrellis](https://geotrellis.io/), [GeoMesa](https://www.geomesa.org/), [JTS](https://github.com/locationtech/jts), and -[SFCurve](https://github.com/locationtech/sfcurve) (see below). +[SFCurve](https://github.com/locationtech/sfcurve). ![LocationTech Stack](static/rasterframes-locationtech-stack.png) -RasterFrames introduces georectified raster imagery to Spark SQL. It quantizes scenes into chunks called "tiles". Each tile contains a 2-D matrix of "cell" (pixel) values along with information on how to numerically interpret those cells. As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type `tile`. A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", but can also be quality assurance information, land classification assignments, or any other rasterized spatiotemporal data. Along with `tile` columns there is typically an `extent` specifying the geographic location of the data, the map projection of that geometry (`crs`), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when filtering +RasterFrames introduces georectified raster imagery to Spark SQL. It quantizes scenes into chunks called @ref:[_tiles_](concepts.md#tile). Each tile contains a 2-D matrix of @ref:[_cell_](concepts.md#tile) or pixel values along with information on how to numerically interpret those cells. -RasterFrames also includes support for working with vector data, such as [GeoJSON][GeoJSON]. You can use vector data to filter DataFrame rows, using geospatial predicates (e.g. contains, intersects, overlaps, etc.), to mask cells, and to be rasterized into training data appropriate for machine learning. +As shown in the figure below, a "RasterFrame" is a Spark DataFrame with one or more columns of type @ref:[`tile`](concepts.md#tile). A `tile` column typically represents a single frequency band of sensor data, such as "blue" or "near infrared", but can also be quality assurance information, land classification assignments, or any other raster spatial data. Along with `tile` columns there is typically an @ref:[`extent`](concepts.md#extent) specifying the geographic location of the data, the map projection of that geometry (@ref:[`crs`](concepts.md#coordinate-reference-system--crs-)), and a `timestamp` column representing the acquisition time. These columns can all be used in the `WHERE` clause when filtering. +@@include[RasterFrame Example](static/rasterframe-sample.md) -![RasterFrame Anatomy](static/rasterframe-anatomy.png) +RasterFrames also includes support for working with vector data, such as [GeoJSON][GeoJSON]. RasterFrames vector data operations let you filter with geospatial relationships like contains or intersects, mask cells, convert vectors to rasters, and more. -Raster data can be read from a number of sources. Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of georectified imagery (including Cloud Optimized GeoTIFFs or [COGS][COGS]), [GeoTrellis Layers][GTLayer], and from catalog of Landsat 8 and MODIS data sets on the [Amazon Web Services (AWS) Public Data Set (PDS)][PDS]. See @ref:[Raster Data I/O](raster-io.md) for details. +Raster data can be read from a @ref:[number of sources](raster-io.md). Through the flexible Spark SQL DataSource API, RasterFrames can be constructed from collections of imagery (including Cloud Optimized GeoTIFFs or [COGS][COGS]), [GeoTrellis Layers][GTLayer], and from catalogs of large datasets like Landsat 8 and MODIS data sets on the @ref:[AWS Public Data Set (PDS)](raster-catalogs.md#using-external-catalogs). [R]:https://www.rdocumentation.org/packages/base/versions/3.5.1/topics/data.frame [Pandas]:https://pandas.pydata.org/ diff --git a/pyrasterframes/src/main/python/docs/getting-started.pymd b/pyrasterframes/src/main/python/docs/getting-started.pymd index db279133b..812bb162b 100644 --- a/pyrasterframes/src/main/python/docs/getting-started.pymd +++ b/pyrasterframes/src/main/python/docs/getting-started.pymd @@ -110,7 +110,7 @@ To support GeoTIFF and JPEG2000 formats, you should look for the following drive Do the following to see if RasterFrames was able to find GDAL: -```python +```python, evaluate=False from pyrasterframes.utils import gdal_version print(gdal_version()) ``` diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index aa4aac7dd..139f916c2 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -77,7 +77,7 @@ rf = spark.read.raster(catalog=cat, catalog_col_names=['red', 'green', 'blue']) rf.write.geotiff(outfile, crs='EPSG:4326', raster_dimensions=(256, 256)) ``` -Wiew it with `rasterio` to check the results: +View it with `rasterio` to check the results: ```python view_geotiff import rasterio diff --git a/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md b/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md new file mode 100644 index 000000000..026537851 --- /dev/null +++ b/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md @@ -0,0 +1,48 @@ +\ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ + \ +
                  timestampcrsextenttile
                  02019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667)
                  12019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667)
                  22019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667)
                  32019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667)
                  42019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667)
                  diff --git a/pyrasterframes/src/main/python/setup.py b/pyrasterframes/src/main/python/setup.py index cc4b0ec01..f2f3ba76f 100644 --- a/pyrasterframes/src/main/python/setup.py +++ b/pyrasterframes/src/main/python/setup.py @@ -126,14 +126,14 @@ def initialize_options(self): }, install_requires=[ 'pytz', - 'shapely', + 'Shapely', 'pyspark<2.4', 'numpy>=1.7', 'pandas', ], setup_requires=[ 'pytz', - 'shapely', + 'Shapely', 'pyspark<2.4', 'numpy>=1.7', 'matplotlib<3.0.0', @@ -143,15 +143,16 @@ def initialize_options(self): 'pytest-runner', 'setuptools>=0.8', 'ipython==6.2.1', - "ipykernel==4.8.0", + 'ipykernel==4.8.0', 'Pweave==0.30.3', - 'fiona==1.8.6' + 'fiona==1.8.6', + 'rasterio', # for docs ], tests_require=[ 'pytest==3.4.2', 'pypandoc', 'numpy>=1.7', - 'shapely', + 'Shapely', 'pandas', 'rasterio', 'boto3', From 8dbeb34318dc1dc2216fe98988bc7cfa976f5275 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Tue, 6 Aug 2019 17:50:38 -0400 Subject: [PATCH 316/380] Links from raster io page to raster write page Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/raster-io.md | 8 ++++---- pyrasterframes/src/main/python/docs/raster-read.pymd | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-io.md b/pyrasterframes/src/main/python/docs/raster-io.md index b007ec291..9f6edc824 100644 --- a/pyrasterframes/src/main/python/docs/raster-io.md +++ b/pyrasterframes/src/main/python/docs/raster-io.md @@ -11,10 +11,10 @@ The standard mechanism by which any data is brought in and out of a Spark Datafr - `geotiff`: a simplified reader for reading a single GeoTIFF file - `geotrellis`: for reading a [GeoTrellis layer][GTLayer] * @ref:[Raster Writers](raster-write.md) - - @ref:[Tile](raster-write.md#tile-samples) and @ref:[DataFrame](raster-write.md#dataframe-samples) samples - - `geotiff`: beta writer to GeoTiff file - - `geotrellis`: creating a [GeoTrellis layer][GTLayer] - - [`parquet`][Parquet]: general purpose writer + - You can write @ref:[Tile](raster-write.md#tile-samples) and @ref:[DataFrame](raster-write.md#dataframe-samples) samples + - @ref:[`geotiff`](raster-write.md#geotiffs): beta writer to GeoTiff file format + - @ref:[`geotrellis`](raster-write.md#geotrellis-layers): creating a [GeoTrellis layer][GTLayer] + - @ref:[`parquet`](raster-write.md#parquet): general purpose writer for [Parquet][Parquet] There is also support for @ref:[vector data](vector-data.md) for masking and data labeling. diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index 21e7f531e..d730d98b6 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -182,4 +182,4 @@ mb2.printSchema() [CRS]: concepts.md#coordinate-reference-system--crs [Extent]: concepts.md#extent -[Tile]: concpets.md#tile \ No newline at end of file +[Tile]: concepts.md#tile \ No newline at end of file From 42354f4b526b41b0c53efaacb0b00eae1c4709d0 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 7 Aug 2019 08:54:04 -0400 Subject: [PATCH 317/380] Minor wording tweak on index page to match description edits Signed-off-by: Jason T. Brown --- pyrasterframes/src/main/python/docs/index.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/index.md b/pyrasterframes/src/main/python/docs/index.md index 790bff5ca..25d6548ea 100644 --- a/pyrasterframes/src/main/python/docs/index.md +++ b/pyrasterframes/src/main/python/docs/index.md @@ -1,8 +1,8 @@ # RasterFrames -RasterFrames® brings together Earth-observing (EO) data analysis, big data computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. +RasterFrames® brings together Earth-observation (EO) data access, cloud computing, and DataFrame-based data science. The recent explosion of EO data from public and private satellite operators presents both a huge opportunity as well as a challenge to the data analysis community. It is _Big Data_ in the truest sense, and its footprint is rapidly getting bigger. -RasterFrames provides a DataFrame-centric view over arbitrary EO data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is accessible to general analysts while handling the rapidly growing data footprint. +RasterFrames provides a DataFrame-centric view over arbitrary raster data, enabling spatiotemporal queries, map algebra raster operations, and compatibility with the ecosystem of Spark ML algorithms. By using DataFrames as the core cognitive and compute data model, it is able to deliver these features in a form that is both accessible to general analysts and scalable along with the rapidly growing data footprint. To learn more, please see the @ref:[Getting Started](getting-started.md) section of this manual. From 84c533dfb809ff5d253f5664dd859421557b81b8 Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Wed, 7 Aug 2019 09:16:40 -0400 Subject: [PATCH 318/380] wording Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/raster-read.pymd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-read.pymd b/pyrasterframes/src/main/python/docs/raster-read.pymd index d730d98b6..91350dbb8 100644 --- a/pyrasterframes/src/main/python/docs/raster-read.pymd +++ b/pyrasterframes/src/main/python/docs/raster-read.pymd @@ -146,7 +146,7 @@ In the initial examples on this page, we used @ref:[`rf_tile`](reference.md#rf-t ## Multiband Rasters -A multiband raster represents a three dimensional numeric array. The first two dimensions are spatial, and the third dimension is typically designated as different bands. The bands may represent intensity of different wavelengths of light (or other electromagnetic radiation). The different bands may represent other phenomena such as measurement time, quality indications, or additional measurements. +A multiband raster represents a three dimensional numeric array. The first two dimensions are spatial, and the third dimension is typically designated as different bands. The bands could represent intensity of different wavelengths of light (or other electromagnetic radiation), or they could represent other phenomena such as measurement time, quality indications, or additional measurements. When reading a multiband raster or a _Catalog_ describing multiband rasters, you will need to know ahead of time which bands you want to read. You will specify the bands to read, indexed from zero, passing a list of integers into the `band_indexes` parameter of the `raster` reader. @@ -182,4 +182,4 @@ mb2.printSchema() [CRS]: concepts.md#coordinate-reference-system--crs [Extent]: concepts.md#extent -[Tile]: concepts.md#tile \ No newline at end of file +[Tile]: concepts.md#tile From 0e061257eb49c5aae4a0e35c87b36210d96903cc Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Wed, 7 Aug 2019 09:21:20 -0400 Subject: [PATCH 319/380] grammar edits Signed-off-by: Courtney Whalen --- .../src/main/python/docs/raster-write.pymd | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index 139f916c2..4bda0a78e 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -1,8 +1,8 @@ # Writing Raster Data -RasterFrames is oriented toward large scale analyses of spatial data. The primary output for most use cases may be a @ref:[statistical summary](aggregation.md), a @ref:[machine learning model](machine-learning.md), or some other result that is generally much smaller than the input data set. +RasterFrames is oriented toward large scale analyses of spatial data. The primary output of these analyses could be a @ref:[statistical summary](aggregation.md), a @ref:[machine learning model](machine-learning.md), or some other result that is generally much smaller than the input data set. -However there are times in any analysis where writing a representative sample of the work in progress provides invaluable feedback on the process and results. +However, there are times in any analysis where writing a representative sample of the work in progress provides invaluable feedback on the current state of the process and results. ```python imports, echo=False import pyrasterframes @@ -13,12 +13,12 @@ spark = pyrasterframes.get_spark_session() ## Tile Samples -When collecting a _tile_ (see discussion of the RasterFrame @ref:[schema](raster-read.md#single-raster) for orientation to the concept) to the Python Spark driver, we have some convenience methods to quickly visualize the _tile_. +When collecting a _tile_ (see discussion of the RasterFrame @ref:[schema](raster-read.md#single-raster) for orientation to the concept) to the Python Spark driver, we have some convenience methods to quickly visualize the _tile_. -In an IPython or Jupyter interpreter a `Tile` object will be displayed as an image with limited metadata. +In an IPython or Jupyter interpreter, a `Tile` object will be displayed as an image with limited metadata. ```python tile_sample -def scene(band): +def scene(band): return 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/' \ 'MCD43A4.A2019059.h11v08.006.2019072203257_B{}.TIF'.format(band) raster_url = scene('02') @@ -33,7 +33,7 @@ display(tile) # IPython.display function ## DataFrame Samples -Within an IPython or Jupyter interpreter a Pandas DataFrame containing a column of _tiles_ will be rendered as the samples discussed above. Simply import the `rf_ipython` submodule to enable enhanced HTML rendering of a Pandas DataFrame. +Within an IPython or Jupyter interpreter, a Pandas DataFrame containing a column of _tiles_ will be rendered as the samples discussed above. Simply import the `rf_ipython` submodule to enable enhanced HTML rendering of a Pandas DataFrame. In the example below, notice the result is limited to a small subset. For more discussion about why this is important, see the @ref:[Pandas and NumPy discussion](numpy-pandas.md). @@ -48,7 +48,7 @@ pandas_df = spark.read.raster(raster_url, tile_dimensions=(64, 64)) \ pandas_df.dtypes ``` -Viewing the DataFrame in Jupyter looks like this. +Viewing the DataFrame in Jupyter looks like this. ```python show_pandas, evaluate=False pandas_df @@ -59,16 +59,16 @@ pandas_df ## GeoTIFFs -GeoTIFF is one of the most common file formats for spatial data, providing flexibility in data encoding, representation, and storage. RasterFrames provides a specialized Spark DataFrame writer for rendering a RasterFrame to a GeoTiff. +GeoTIFF is one of the most common file formats for spatial data, providing flexibility in data encoding, representation, and storage. RasterFrames provides a specialized Spark DataFrame writer for rendering a RasterFrame to a GeoTIFF. One downside to GeoTIFF is that it is not a big data native format. To create a GeoTIFF all the data to be encoded has to be in the memory of one compute node (in Spark parlance, this is a "collect"), limiting it's maximum size substantially compared to that of a full cluster environment. When rendering GeoTIFFs in RasterFrames, you either need to specify the dimensions of the output raster, or be aware of how big the collected data will end up being. -Fortunately, we can use the cluster computing capability to downlample the data (using nearest-neighbor) into a more manageble size. For sake of example, let's render a simple RGB overview image of our scene as a small raster, reprojecting it to latitude and longitude coordinates on the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) reference ellipsoid (aka [EPSG:4326](https://spatialreference.org/ref/epsg/4326/)): +Fortunately, we can use the cluster computing capability to downsample the data (using nearest-neighbor) into a more manageable size. For sake of example, let's render a simple RGB overview image of our scene as a small raster, reprojecting it to latitude and longitude coordinates on the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) reference ellipsoid (aka [EPSG:4326](https://spatialreference.org/ref/epsg/4326/)): ```python write_geotiff import os.path from docs import docs_dir -cat = """ +cat = """ red,green,blue {},{},{} """.format(scene('01'), scene('04'), scene('03')) @@ -83,7 +83,7 @@ View it with `rasterio` to check the results: import rasterio import numpy as np from rasterio.plot import show, show_hist - + with rasterio.open(outfile) as src: cells = np.clip(src.read(), 0, 1800).astype('float32') show(cells) @@ -100,7 +100,7 @@ with rasterio.open(outfile) as src: ## Parquet -You can write the Spark DataFrame to an [Apache Parquet][Parquet] "file". This format is designed to work across different projects in the Hadoop ecosystem. It also provides a variety of optimizations for query against data written in the format. +You can write the Spark DataFrame to an [Apache Parquet][Parquet] "file". This format is designed to work across different projects in the Hadoop ecosystem. It also provides a variety of optimizations for query against data written in the format. ```python write_parquet, evaluate=False spark_df.withColumn('exp', rf_expm1('proj_raster')) \ @@ -108,4 +108,4 @@ spark_df.withColumn('exp', rf_expm1('proj_raster')) \ ``` [GeoTrellis]: https://geotrellis.readthedocs.io/en/latest/ -[Parquet]: https://spark.apache.org/docs/latest/sql-data-sources-parquet.html \ No newline at end of file +[Parquet]: https://spark.apache.org/docs/latest/sql-data-sources-parquet.html From 59d10b8037d67657cb2f555fdd72d6c445c84da2 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 7 Aug 2019 09:25:57 -0400 Subject: [PATCH 320/380] Minor format things: dataframe sample to include and L1 header in function ref page Signed-off-by: Jason T. Brown --- .../src/main/python/docs/reference.pymd | 2 +- .../python/docs/static/rasterframe-sample.md | 88 +++++++++---------- 2 files changed, 45 insertions(+), 45 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/reference.pymd b/pyrasterframes/src/main/python/docs/reference.pymd index 0b4b0fe58..81f20cba8 100644 --- a/pyrasterframes/src/main/python/docs/reference.pymd +++ b/pyrasterframes/src/main/python/docs/reference.pymd @@ -10,7 +10,7 @@ ReturnDataType function_name(InputDataType argument1, InputDataType argument2) For the Scala documentation on these functions, see @scaladoc[`RasterFunctions`][RasterFunctions]. The full Scala API documentation can be found [here][scaladoc]. -# List of Available SQL and Python Functions +## List of Available SQL and Python Functions @@toc { depth=3 } diff --git a/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md b/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md index 026537851..c7ec4ed5d 100644 --- a/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md +++ b/pyrasterframes/src/main/python/docs/static/rasterframe-sample.md @@ -1,48 +1,48 @@ -\ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ +
                  timestampcrsextenttile
                  02019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667)
                  + + + + + + + + + + + + + + + \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ - \ + + + + + + + + + + + + + + + + + + + + \ - \ - \ - \ - \ - \ - \ + + + + + + \ - \ - \ + +
                  timestampcrsextenttile
                  02019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7783653.637667, 993342.4642358534, -7665045.582235852, 1111950.519667)
                  12019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667)
                  22019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667)
                  32019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667)
                  12019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7665045.582235853, 993342.4642358534, -7546437.526804706, 1111950.519667)
                  22019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7546437.526804707, 993342.4642358534, -7427829.471373559, 1111950.519667)
                  32019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7427829.47137356, 993342.4642358534, -7309221.415942413, 1111950.519667)
                  42019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667)
                  42019-02-28(+proj=sinu +lon_0=0.0 +x_0=0.0 +y_0=0.0 +a=6371007.181 +b=6371007.181 +units=m ,)(-7309221.415942414, 993342.4642358534, -7190613.360511266, 1111950.519667)
                  From c19a2a020eefbbfb58aed51d89eb357eab068ce8 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 7 Aug 2019 10:02:26 -0400 Subject: [PATCH 321/380] Little tweaks to wording and code style for nodata page Signed-off-by: Jason T. Brown --- .../src/main/python/docs/nodata-handling.pymd | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/nodata-handling.pymd b/pyrasterframes/src/main/python/docs/nodata-handling.pymd index 68e3102b6..6eb4151d6 100644 --- a/pyrasterframes/src/main/python/docs/nodata-handling.pymd +++ b/pyrasterframes/src/main/python/docs/nodata-handling.pymd @@ -148,7 +148,7 @@ display(sample[1]) ## NoData and Local Arithmatic -Let's now explore how the presence of NoData affects local arithmatic operations. To demonstrate the behaviour, lets create two tiles. One tile will have values of 0 and 1, and the other will have values of just 0. +Let's now explore how the presence of NoData affects @ref:[local map algebra](local-algebra.md) operations. To demonstrate the behaviour, lets create two tiles. One tile will have values of 0 and 1, and the other will have values of just 0. ```python @@ -161,11 +161,14 @@ y = Tile(np.zeros((tile_size, tile_size), dtype='int16')) rf = spark.createDataFrame([Row(x=x, y=y)]) print('x') display(x) +``` + +```python print('y') display(y) ``` -Now, let's create a new column from `x` with the value of 1 changed to NoData. Then, we will add this new column with NoData to the `y` column. As shown below, the result of the sum also has NoData (represented in white). In general for arithmatic operations, Data + NoData = NoData. To see more information about possible operations on Tile columns, see the @ref:[local map algebra](local-algebra.md) doc. +Now, let's create a new column from `x` with the value of 1 changed to NoData. Then, we will add this new column with NoData to the `y` column. As shown below, the result of the sum also has NoData (represented in white). In general for local algebra operations, Data + NoData = NoData. ```python masked_rf = rf.withColumn('x_nd', rf_mask_by_value('x', 'x', lit(1)) ) @@ -173,15 +176,19 @@ masked_rf = masked_rf.withColumn('x_nd_y_sum', rf_local_add('x_nd', 'y')) row = masked_rf.collect()[0] print('x with NoData') display(row.x_nd) -print('x with NoData and y sum') +``` + +```python +print('x with NoData plus y') display(row.x_nd_y_sum) ``` +To see more information about possible operations on Tile columns, see the @ref:[local map algebra](local-algebra.md) page and @ref:[function reference](reference.md#local-map-algebra). ## Changing a Tile's NoData Values -One way to mask a tile is to make a new tile with a user defined NoData value. We will explore this method below. First, lets create a rasterframe from a tile with values of 0, 1, 2, and 3. We will use numpy to create a 100x100 Tile with columns of 0, 1, 2, and 3. +One way to mask a tile is to make a new tile with a user defined NoData value. We will explore this method below. First, lets create a DataFrame from a tile with values of 0, 1, 2, and 3. We will use numpy to create a 100x100 Tile with vertical bands containing values 0, 1, 2, and 3. -```python create_dummy_tile +```python create_dummy_tile, caption='Dummy Tile' tile_size = 100 x = np.zeros((tile_size, tile_size), dtype='int16') @@ -225,7 +232,7 @@ display(collected[0].tile_nd_2) ## Combining Tiles with Different Data Types -RasterFrames supports having Tile columns with multiple cell types in a single RasterFrame. It is important to understand how these different cell types interact. +RasterFrames supports having Tile columns with multiple cell types in a single DataFrame. It is important to understand how these different cell types interact. Let's first create a RasterFrame that has columns of `float` and `int` cell type. @@ -234,24 +241,25 @@ x = Tile((np.ones((100, 100))*2).astype('float')) y = Tile((np.ones((100, 100))*3.0).astype('int32')) rf = spark.createDataFrame([Row(x=x, y=y)]) -rf.select(rf_cell_type('y'), rf_cell_type('x')).distinct().show() +rf.select(rf_cell_type('x'), rf_cell_type('y')).distinct().show() ``` -When performing a local operation between tile columns with cell types `int` and type `float`, the resulting tile cell type will be `float`. If two tiles of different sized integer cell types are added together in the same way, the resulting cell type will be the same as the largest of the two integer cell types. +When performing a local operation between tile columns with cell types `int` and type `float`, the resulting tile cell type will be `float`. In local algebra over two tiles of different "sized" cell types, the resulting cell type will be the largest of the two input tiles' cell types. ```python -rf_added = rf.withColumn('xy_sum', rf_local_add('y', 'x')) -rf_added.select(rf_cell_type('xy_sum'), rf_cell_type('y'), rf_cell_type('x')).distinct().show() +rf.select( + rf_cell_type('x'), + rf_cell_type('y'), + rf_cell_type(rf_local_add('x', 'y').alias('xy_sum')), + ).show(1) ``` Combining tile columns of different cell types gets a little trickier when user defined NoData cell types are involved. Let's create 2 tile columns: one with a NoData value of 1, and one with a NoData value of 2. ```python -x = Tile((np.ones((100, 100))*3).astype('int16')) -rf = spark.createDataFrame([Row(x=x)]) - -rf_nd = rf.withColumn('x_nd_1', rf_convert_cell_type('x', get_nodata_ct(1))) \ - .withColumn('x_nd_2', rf_convert_cell_type('x', get_nodata_ct(2))) +x_nd_1 = Tile((np.ones((100, 100))*3), get_nodata_ct(1)) +x_nd_2 = Tile((np.ones((100, 100))*3), get_nodata_ct(2)) +rf_nd = spark.createDataFrame([Row(x_nd_1=x_nd_1, x_nd_2=x_nd_2)]) ``` Let's try adding the tile columns with different NoData values. When there is an inconsistent NoData value in the two columns, the NoData value of the right-hand side of the sum is kept. In this case, this means the result has a NoData value of 1. @@ -268,9 +276,9 @@ rf_nd_sum = rf_nd.withColumn('x_nd_sum', rf_local_add('x_nd_1', 'x_nd_2')) rf_nd_sum.select(rf_cell_type('x_nd_sum')).distinct().show() ``` -## Nodata Values in Aggregation +## NoData Values in Aggregation -Let's use the same tile as before to demonstrate how NoData values affect tile aggregations +Let's use the same tile as before to demonstrate how NoData values affect tile aggregations. ```python tile_size = 100 From 693c0479da9594b2bac81ed527f4d3eaaaeb4fcb Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Wed, 7 Aug 2019 10:59:55 -0400 Subject: [PATCH 322/380] remove print dtypes? Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/raster-write.pymd | 1 - 1 file changed, 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index 4bda0a78e..db56a6a22 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -45,7 +45,6 @@ pandas_df = spark.read.raster(raster_url, tile_dimensions=(64, 64)) \ rf_extent('proj_raster').alias('extent'), rf_tile('proj_raster').alias('tile'), ).limit(5).toPandas() -pandas_df.dtypes ``` Viewing the DataFrame in Jupyter looks like this. From 57cde08afcf552c0ad5999b726e8ade3971a863e Mon Sep 17 00:00:00 2001 From: Courtney Whalen Date: Wed, 7 Aug 2019 11:01:33 -0400 Subject: [PATCH 323/380] add white image explanation Signed-off-by: Courtney Whalen --- pyrasterframes/src/main/python/docs/raster-write.pymd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index db56a6a22..aab0f323a 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -15,7 +15,7 @@ spark = pyrasterframes.get_spark_session() When collecting a _tile_ (see discussion of the RasterFrame @ref:[schema](raster-read.md#single-raster) for orientation to the concept) to the Python Spark driver, we have some convenience methods to quickly visualize the _tile_. -In an IPython or Jupyter interpreter, a `Tile` object will be displayed as an image with limited metadata. +In an IPython or Jupyter interpreter, a `Tile` object will be displayed as an image with limited metadata. In the example below, the displayed tile is mostly white due to cloud cover. ```python tile_sample def scene(band): From e8e250b8c663d123811cf1eaf0846467efe5204a Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 7 Aug 2019 11:20:34 -0400 Subject: [PATCH 324/380] Revert "add white image explanation" This reverts commit 57cde08afcf552c0ad5999b726e8ade3971a863e. --- pyrasterframes/src/main/python/docs/raster-write.pymd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index aab0f323a..db56a6a22 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -15,7 +15,7 @@ spark = pyrasterframes.get_spark_session() When collecting a _tile_ (see discussion of the RasterFrame @ref:[schema](raster-read.md#single-raster) for orientation to the concept) to the Python Spark driver, we have some convenience methods to quickly visualize the _tile_. -In an IPython or Jupyter interpreter, a `Tile` object will be displayed as an image with limited metadata. In the example below, the displayed tile is mostly white due to cloud cover. +In an IPython or Jupyter interpreter, a `Tile` object will be displayed as an image with limited metadata. ```python tile_sample def scene(band): From 3bbdae4097baa03a6e7a62151b21d15e9dcb4e58 Mon Sep 17 00:00:00 2001 From: "Jason T. Brown" Date: Wed, 7 Aug 2019 12:05:26 -0400 Subject: [PATCH 325/380] Write singleband for example, fix path to uri in writing Signed-off-by: Jason T. Brown --- .../src/main/python/docs/raster-write.pymd | 32 +++++++------------ .../python/docs/static/df-samples-output.md | 22 ++++++------- 2 files changed, 22 insertions(+), 32 deletions(-) diff --git a/pyrasterframes/src/main/python/docs/raster-write.pymd b/pyrasterframes/src/main/python/docs/raster-write.pymd index db56a6a22..c0613208f 100644 --- a/pyrasterframes/src/main/python/docs/raster-write.pymd +++ b/pyrasterframes/src/main/python/docs/raster-write.pymd @@ -8,6 +8,8 @@ However, there are times in any analysis where writing a representative sample o import pyrasterframes from pyrasterframes.rasterfunctions import * from IPython.display import display +import os.path + spark = pyrasterframes.get_spark_session() ``` @@ -19,10 +21,10 @@ In an IPython or Jupyter interpreter, a `Tile` object will be displayed as an im ```python tile_sample def scene(band): + b = str(band).zfill(2) # converts int 2 to '02' return 'https://modis-pds.s3.amazonaws.com/MCD43A4.006/11/08/2019059/' \ - 'MCD43A4.A2019059.h11v08.006.2019072203257_B{}.TIF'.format(band) -raster_url = scene('02') -spark_df = spark.read.raster(raster_url) + 'MCD43A4.A2019059.h11v08.006.2019072203257_B{}.TIF'.format(b) +spark_df = spark.read.raster(scene(2), tile_dimensions=(128, 128)) tile = spark_df.select(rf_tile('proj_raster').alias('tile')).first()['tile'] tile ``` @@ -40,8 +42,7 @@ In the example below, notice the result is limited to a small subset. For more d ```python to_pandas, evaluate=True import pyrasterframes.rf_ipython -pandas_df = spark.read.raster(raster_url, tile_dimensions=(64, 64)) \ - .select( +pandas_df = spark_df.select( rf_extent('proj_raster').alias('extent'), rf_tile('proj_raster').alias('tile'), ).limit(5).toPandas() @@ -55,41 +56,32 @@ pandas_df @@include[df-samples-output.md](static/df-samples-output.md) - ## GeoTIFFs GeoTIFF is one of the most common file formats for spatial data, providing flexibility in data encoding, representation, and storage. RasterFrames provides a specialized Spark DataFrame writer for rendering a RasterFrame to a GeoTIFF. One downside to GeoTIFF is that it is not a big data native format. To create a GeoTIFF all the data to be encoded has to be in the memory of one compute node (in Spark parlance, this is a "collect"), limiting it's maximum size substantially compared to that of a full cluster environment. When rendering GeoTIFFs in RasterFrames, you either need to specify the dimensions of the output raster, or be aware of how big the collected data will end up being. -Fortunately, we can use the cluster computing capability to downsample the data (using nearest-neighbor) into a more manageable size. For sake of example, let's render a simple RGB overview image of our scene as a small raster, reprojecting it to latitude and longitude coordinates on the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) reference ellipsoid (aka [EPSG:4326](https://spatialreference.org/ref/epsg/4326/)): +Fortunately, we can use the cluster computing capability to downsample the data into a more manageable size. For sake of example, let's render an overview our scene's red band as a small raster, reprojecting it to latitude and longitude coordinates on the [WGS84](https://en.wikipedia.org/wiki/World_Geodetic_System) reference ellipsoid (aka [EPSG:4326](https://spatialreference.org/ref/epsg/4326/)). ```python write_geotiff -import os.path -from docs import docs_dir -cat = """ -red,green,blue -{},{},{} -""".format(scene('01'), scene('04'), scene('03')) -outfile = os.path.join(docs_dir(), 'geotiff-overview.tif') -rf = spark.read.raster(catalog=cat, catalog_col_names=['red', 'green', 'blue']) -rf.write.geotiff(outfile, crs='EPSG:4326', raster_dimensions=(256, 256)) +outfile = os.path.join('/tmp', 'geotiff-overview.tif') +spark_df.write.geotiff('file://' + outfile, crs='EPSG:4326', raster_dimensions=(256, 256)) ``` View it with `rasterio` to check the results: ```python view_geotiff import rasterio -import numpy as np from rasterio.plot import show, show_hist with rasterio.open(outfile) as src: - cells = np.clip(src.read(), 0, 1800).astype('float32') - show(cells) - show_hist(src, bins=50, lw=0.0, stacked=False, alpha=0.3, + show(src, adjust='linear') + show_hist(src, bins=50, lw=0.0, stacked=False, alpha=0.6, histtype='stepfilled', title="Overview Histogram") ``` +If there are many tile or projected raster columns in the DataFrame, the GeoTIFF writer will write each one as a separate band in the file. Each band in the output will be tagged the input column names for reference. ## GeoTrellis Layers diff --git a/pyrasterframes/src/main/python/docs/static/df-samples-output.md b/pyrasterframes/src/main/python/docs/static/df-samples-output.md index a7f56faf2..7cbfaf1ae 100644 --- a/pyrasterframes/src/main/python/docs/static/df-samples-output.md +++ b/pyrasterframes/src/main/python/docs/static/df-samples-output.md @@ -1,5 +1,3 @@ - -
                  @@ -132,7 +134,7 @@

    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�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

    n3xB3bbwvVeep8Fbs$S;t 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%0AYY^A5 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 xr5(9+ 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 YH!$)-*vE1ZPxa@m=Q`B+MftV=1F5h4H2?qr diff --git a/deployment/docker/jupyter/samples/L8-B4-Elkton-VA.tiff b/deployment/docker/jupyter/samples/L8-B4-Elkton-VA.tiff deleted file mode 100644 index 2534d4bd00d20245a280fc36402813aa6e4aa132..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63376 zcmaI8Wpo@#urw+&Gj>&FQTNOUEi+qYMw!``nVFfH*}Gz|FNK;O222B#7_zo8WQVsXxjS) z3jKF+|Cj#-iWYquyN|E%{3Q8z+|FC6@c;MHSpVIT1VKS@aZmmn|9y@f6g%#^;eXaN zR>F0|69lCXijP|uD`=b>l=RQ%mi^=Y_c_F^QL>88on1%jYE{eYUhUg8)md^?==1-6 zwNFq8d&hE$q4Y#f)$M2%E6b{}d@L8sz}m5aA{KF~Dk{ol@}v6KPI3SBwfD_&m)p5^ zp6MV5=yxis>MYOeyn4Ke(d*@Mo}S0!WBFt8kXyRj0Jm z(mC(6X9w65_K^KxiFtgUh-btR&dc+8{3NeP-NhxAmDiy&j7!1JvgP~%+fAwD8Ol$y z#CV}-5uK%(l#S|&9Xus3!jiGy&UYt1V=OsKz!I`x7Qvd+I-ShlH#pk%(XZ9*;DmlI zqeNCJOCzZaH6y>gqPIu(l$GpLc|cawwbgn(Q0JilY1N!6sDvhqTN^()+$`6@`jm;K z{ucZB27XMYl#x_acIUb22(=K;*<+TDmu1VG8lnZ&peZz$s?iK8DC4O^d<*NRnwY*~ zG_LCxR<;Vox9#Me^tbe#^)h;& zT0aRrZ}dXV2IJ_LhBS_gDh{ll?jFv)y>*NwGxK|;??mOO*S7N7}JyecGEnAh46js5YNje@dk*ZbG)}Gp_{2LtPRV;3==F9o5UK4tzx)HODD`RSimTG zF7`Mzov}_8=b*EVxjYrO{2hD5?y^tp6}y4sA-?*S4;DEnt2oCRh)6`tS}Mis@}>B_ z(PAA{ro|#!OcLp-BDJHT^fyI{JbV$GzS_S$R>evvF-6)mfji7wlVG&y{w#PHC6P!g7~5 zDSOE?O36>G8GFEIurOYQ-Nt=>D3*tgkElT>X$rsUj1slvBd03AOw%ZumeW;AAe+f& zl2k|4Qk|9sRa-HaKjk|qnOwpgsw6Md3#?fkR)M8slI3J|*+AY`EJeKeaj&-O__~|f zW82wfZbpy$+PFpButGv8M&)N^Xd_wx??9M^n2V*Mp+A*Pv;fv!3)O{Ee1 zjEJTL^ppMVEO6#JXPq6aERThp5RboQ?-A*V@UK|>2g}Kmi#wtrO%{jv6zU<{$y>4y zzIq$)wV~)t&#`wRMT|&9>8UBrq9Syiw`Sv5FJ!3k%;Br~SL~+eY`z#yHB^{-sgjx* z-Xnj$u&!Yb!*cq*P#xY#Ohj(#B!AN*@l#YML6d2wTg;5sedTYpOPw@HRHQDXhp8R1 zA^*lY@*>!E71$+bx6{lizyjpsO{f*J(^$3N{mp0bX>7K$%DLs-b_(+nv|eoIokSH{ zgNPYS>2!P5$Zc(l$x@;(g{TfHmOGF?r@pu!zeO8Xi4lv#9F_t(K18$;XT%TDgI=n= zrn`!vhGw~KY2R4s?z8)CAKS}@xuboD@=do_WiwubpXNmn;cIwR{*ayGH|YR=`z@&` zjW~(CSD$*(-+ZmJ$ti|=`WJHfJ>-?&>?;f6@7V{$`y-rZM#cCWA zuPK%qE6=JzYQCB4EtLu7I`fa~(}%=9R#R-1jn#7AiB&;XA(onjuur@YcJOL(T$Gd( zR4zS&DqxrQwxM>OJ#K5cOWb~58Q(Qq*<0Yhp`&?iUV*pgjrl-cjz{pJqO?pd(@;uk zL4`y%-a*WumGn!bVqKi2P80UTxz3g$liWc*d51WEiL>K4zOVpKi@%wLw$nV>RX!Hg zP-hzR?R-9VPK=15*vKtOX{(rv?9zk2h|RnUR$v_}aTPw4Rb)+hEy^LDu)5sH#pa9Z ztGe1^-p4>`e^%c(@2YK%m3&V%)ofW$l~Fw+qq8m_my*WGfqo0)9S+Qp(cTjQ*B4m(|WL7s};a*A;-3iGto09Tt;^+y!{K$Jbj zet$3W%164BU2N)`s;Y}UW7@k<+{tn|6=HGtGFF|=i><6T%gfRro5y0&yqTyVZi$t` zQiRH&2B?xUM8=bO^a^*D*UOFTh4?!7&Ur;ll$X-$E+csq59Wh`IdbzuydeEXeJetm zk^mcoA!|3HzEp)qi=j?7=cLmg^}Ro$`WJhH+IN7xM$JFPZsT~yf_Xq35n-s7%aCs$ z(=qyoT8SCF4=QtKF@)ZWX(B-P#b%L;s*5YwFL`jid07-Y!9rOpUJAJ}HQ&tU;XbsX zEuxp)Z$Os)l>toue0+WRy^SwyoT;rjo600k%ixc&^jdA>7VYu{`CQniA9IA5I;PIvYfuZ*nONsZLAD1jcT-l`vJmKvo7 z%Uv{Ed=`i4qnx4F*dOMH`@kI6GqBIcqmFWR#!=LSEs#bG;YV3b7MCSrZCN8Znzo6D z;-vUUXJtU$R4>#|nNN+9Eo}qeH@BTjZUy(Fd0~_K(%N*gCoj#1A{JZms-hDjycQ~4 zdSsJ?6hqPM81F>2D4ZU%oK8O{lN-^kedP=>W|jlL>+m@^wTHJX0_flGH=v) z?dUURnA|2j)7eZES8RO~-+OL)tL5q=s#|*g*&Y%TC`J|5oz#5222~)5{;s~MSbDEI zC@WBqyh#1%rW|S-xX0Wn-bGtPlR7Bg@FmFF`fvg{~VASTlIy12{CP;+1VynChr>eM8;8~Ni6A0y7l^zv^i zPJ^f|%>$OZ!3(mbq6xL6tZJq@1tX z@qbx$V8;SL!v$DV_L{GC+uBp8$%$kIHP8$;oAfnbQ zL+XZ_-H?ij+@dVip}G{sr#g+D(a7eP&=DMv{rv^Jj-Kc1VP@zAy0G3Nx5)88eOvf@ zK3y<5P!5vURZmq~|7K|^4#fcb<)`=bnXbzebXhbL5BM?GfE7eOugH!dN8V%|SPni& z^yMX3d7v-O0xS~9@tsqIadX1fRClSL8WQTaC1o{gY06QAyrC0oW9!*M-eI#u&!up4 zR{f(|deiM0?Z?V)SFg+g+d}1}hCsU+)LeQ@gH$iniNflpOr<8M>bjL4t7Ej48_@w> zkYiM0bx95qnW%<4(KlO9l{4KwDx9tZEqy_hILIWaOmE!138Ie}fh^fj09T^lSc7`q zgYL>qa=c`!q>gXK=mokLqGW><)rV)H}=%YKNUHdGsZUOD_f zAN}N4L|x>U4v5b5tULOl9ZoXVo$YXfRVsg!yT*o_m->#%Z>qTujnL7HL`Kc06AJp}&DyM9ZowrRbLA5NQMyhW5q+Y12nw0voe2Mrkpc<kmz!NJlX;b2uA}L+4}Iwdo)#Eor-~FM(EV&h=lEVc60_x3xrXldzVc!$<1py3VEawh0$9P zUz|c8a}Wr)3N7aCogU6e=d$6^;g7L=z%PAS zEWVpJL!MOVs8h2V{E(?_v#Kb|PBiX+b;whNeV?mg2I$a$;Ws~XWbk-=6M z)g<@Qns&0ZZ;B3+ef0p_NtVI)ipyr|mRzMmaqWxsd_7#B!~X80ud5KfRAqOs`yTj` z*bS<`zD>!+5ah|;a;JQb2o96G_#ohxEYwsrFn7djtav91M_qp*PE#g5RWFw#=^V9@ zbHEt1m34tb5>Zc)0y(;wxT-R%#^$A(trF8Z#gV}p(=_aXX26K|cphLSN!8KUWT5z9 zTb}aaP9vwGGt;@_Y+#G|NWMdU(koSLeb>8STgcOTzMD>`(@S}6RvO6iGOd*nWb9&D zUOf_boz%P?-vZ8MsO*kwUr#M?_jAkIVktZLA7k?yo#zF14IS21F-slNu~ja)pSti| z;LGyJ)p{~8VW@5iMqw{0xj;UU3+bB9U zuBFs;1@Ti0RiL40Ls8@+Dpgfd@g0V(Z z_%Nq~Q`x!iZ0CD<8hK9y>7OQ*DWV_vX4q87g4unQ(TmjK-N982r3N$uoo{*dj%p*C z|8dH*`n)Z;g|n!uAHa`XM~=BeBg7W0^uLJaN9-ayi8c556Yy<6)diJYAJwB}5vncr z$XRB)TBhE}EL4s!lH5*n1G1)Sfl5+H_+(l0-7R67%6MKsyIvpBt?8MtvYXDPF7OC7 zOP`hrR6iY|5&#Qk*R#=Qy_CE4ERz)|v95WBe4bm+*2{HclTc}0)b&FA_7B#c&J&}y zT$K`e{}*iryHb*(#lQRmTjJ!>RTV>@y-*Yv>qK$2QGZiku_I224Wb-95&5YvzTR2H z5-;(tPxCaW$g^oNvUWz=AvVh1s=j<7kEna<6)HzN3ImtefmTp=S|xr90^-O@t+--$ zol0z|NG?lLesx*I=+WLeTS(>e$5zYbX!*w5tM;mryfHFGLTW?5Wd}{N5AbORI_{(c zE6|LO;H#*o>?g;_yRy9eNW(;GevMrPu77~;e=G3NVV*&sQ9*i_TCYOfj&>7Jb+F2< zf9tjADg_PU3v5mQNPkw_&}^|q>`6IHH8n~7p98&3T>E~>WV6v+_%UrXvUzI znU4PPn%l%2(`no#dbHcpY>+c#EOkZaFai~}vp%72tM9n_oHmxP88XvpAiqO=2>9g~ zft8WJWp*`C&JksKQ{ESx)@mnG&O~f~7LCLwene!Xj%tA}OMAs3u}x$Xt`k7?5fXpjnbY@?{kPL2K_pvD_b4j7f=>z(b%%l&v zcg!cUnw`_0X~P2bCWAHAMMU4qd<D znkT25VzD?#o#k=FkFQLNHC!fe!h`j5%l;viN?rIC$ zR_2UZr5ehLZmE#9fm?pZ|IQwyzf@dZS)H^`{TV{$>Kmr64cGnkYaOJeo+eAFC|lcP zP&Y(*H60ndXz)}!OZAs|OgFRDR5G*FPBl+G0CriZOWJ$BUG6vKh{V7pJy{6fgsveE ztIkW)O&U!fv4U&ZAtwj+Vr^cY`N6F}l!e{ywk9POGs&oNY8|Z;3B^aA3i*3I|B8$f zB)W+HsGr~DT6A4k=%JV*Hu7kS2Oj99&M%wGtzrc4rCcq583rTgFQS%+$gir3Ji<@# z;@BIx(Iwpw9oZwNi74f3}sP($v@Wb!qXhmfYQ&B> zlflXC=Cwou*;nR3Mi;0yE97g+$xmX0n zbzE+jhvX%d!29Oy@-q2excO}zRos$3uA^;I|6_C7on))Ksci~38Su+RumC$vsQsnW zt9%qKtJw%|gLlhUO>Y3_)yY=TKV^jas)Eol{!*vSK$G02!r#^Wv{M@#P-C_e%-sRh zrb9q!(dYqBIe$B8SQefPOm|t%DJOW|+H#}2!LE~o^+UG`xY_%(6ZQKx-vo?tn;!)Z zTPH@#L3*&tEW3)CA^|kJ>f#1pt9qyma;&(+cJU|PS$}nTobN?)crWCMc8A>6mQeizybpcmf zgM~tw+lG7Zf{U0Sv&oEL27**g`J1n2rx4{6*eZ6I8SxzaS4Mg%UV#Doh@K{Iu;Zmw zHNmzm5;x^BwbQKghWPJ#yUlF7#ZL5Xff6@GHTG54SKSf*xL#%NjZJQ|xg+gbm0XcK z)JEygTA6}&uiMZ4+tdX@D-E{dhm4TDfl}7fCv`?uP!4$7i+r2-0KTm_TL{+b37gG5 ze$p8Re050mU?y9J$ z!K?8bP!1A{_0&fuRj#a#e)NF+LQBL^zMT8`HnxosF9&2A2fcFvRhw$k5AYY=sJuKS zEBl&xp@__P^1aUE+ZpWlad0aWd?Wq!{hxeCy)kY=Z*U;FKg?TiirOz;wA;k4Q^WKo zcZ1G^&bvFEmi6Qjs)ydX7H}*B0vRHN{wz1?%{oTZfKK~PRwgFf0x3j+pDoGu07E5W z1D*cPMyDsPeJZcVFS90K`B$RyOhEqahR)K0EeTRdfqM_hiRe~0{ip6u0#4b4_kn&B zxhy#l;{o)l8NgU&6gl`j=mh_;E9wz&OI*`lr{me#6=kuJnNi2A+l{ zJ5)^Kl_)tK);DyU5XYZaGc(0DwAb}>a6pN0jD(6%1U%Mbev4J*?Sb#l$cbVQ`qrX+ z3eU>_rKNIbaGJw^T}%OLPQ=V#swzL~I!jl$p@(a|=TwK7dRL)moSG+bm1N z*LVRPA@fil+tQ5-j-x{-MzlUM`o;-!jNi}KUhm6Q1= zr?N@tMQ2))Eluzb^e9i%9Tm-Ii=HxCww3{z1bd_&9h4(dN}A1bf^HyJ(>eRlI=<+@RBw;zr_Ka73u)}m*VjxyJr~1u0sDh4^U7?n z93XqT>uEKZzF}gF-exP=D4Wh6GvCZucZn&h;>+_;vo^{nED1QCXsGxvob}FNrx3W# zxNH+U&Sye-X#`C;9QyBmwt>x%jnPSGmaEX++(WLs3H%pO`+-+0yS+^UbqsxLb+Enl zffshr5wK&~cw07w$AK0+2sp5qAYKic+GxuHi~RkAr>h(Kf*$9N(FOQqaT6+WICAg^ z-04ZYB%2G2J%uWWIpR7mDpG(kdqMAz7uLID{A2tXO>FwX8|lINquQ(Mxr=Q%`#?UD zC*&onsMbjH1e(6>J`N4D-DDb_TgA5(^aVQT9`pt5M|ZFrFC@}y?yuub^1{?ryr)U@uS#z> zf_=G)eY8^Lw@J)gRTepIfl6b`n&jXq2I|#RQ17L9$ee>E=^@I<+2B+5u+7dKXA5ek zX2YQX-FH&s^DAU~&G$i*dCwNJ?7EANR6*)DGUP)r1D)j)+CdZb)QHR>NBta3?^Mc( z2yPAb=N7#aNl>@4K?&{)9J5$-!iv9U@mWTdAaYB@7JpoSUbmFJthc&-?MbnmU*b#P zizpzg%7(b2oOtaKo{JI*m$I<^{IIye>Va<^EI$XgG%Zabdso(y-EE6NMqf>LvW|jY z0Q@PY$)!4r&2OKn;bNY;V!lBwsHqM@S9#B(_&ixgc}l_U@lAg*zf~4_RGyR(=5P5; zOYE5CGO7QZ+ur{@6OX9kU*+CWqxCxD_lE^14X7VI`M+T@aZt{IlJEr-VSI^(Zln{ArO5lK86shK_X?mc2=zlD8@H@^k z=cyB5Em;pR%`cpPow&$0zgR`Y`6ND(-(?^4Zv$QrI?#Pw=?z5vCQ6Qqu?Laf&({w~ zRnr(~)Z>8@riq-qIFBn@iI!OH6O&jG%|0FL8NTZv64t4dl-eHc>A)bye zrfSG`v&g4DYoRVd!FwboQ!hT1r4ez&TfUH4n&G|4+}LgG?$MoOS?%{t45T+-WexNK zFGU{K+=*~z@WNu2E^AVny=I?QHof=D`=&ZV%V;SI$xCv$nxo^{+HM(eSy9@xcS)%P z#&eJBjCPw>ETXLcUZ7EqhxxNbM%eyz&UZaquIzXG1$=LO$AaqxQrcl&clU_ZcA&nf z!oga7R7t?;K0;lbN&7?_9wE+<3nk=`7;947cY3fPZTUf(2tM$nXg~!h7md|#{L__T zW1S>G=h0a4ZRn4}5L0>CcjvN`l9h%&b{c&1SH0bKwiy&0M{+4ToQ5(SNHLB42o(2A zPNPYp1GJ|vVCTD2PoR`J;-xqZbUt2`r`uqB`T+;7qPalE&vbt8kV%AI{;TXS!>|T% zbt(D{oLLWyx0O%8Omu|j!_|kV0ho?Zl??oNYduVlv9rw#bkyxASnQ*HKnX`>YFU>j z0j`S6E<<%2Cnf^VK6SSQ_x0z{Wdbs+em7{I*}R?Dtt(ADuz?NL zM_bmvDL7-`jn_78Z16~5^6>ka+l9sk7Ecr2Dtl;7U+4s{ky}3aRmd+lwYSv$?rt_s zq4mt7#j=`QDJIMJe63ijM$%2EA+mB2IG&2|pW+rJmN9Z593-RZ6Zq2+f1FKV^t#b> zs71ZRT=<&&(DU1~`lzKV(T~0ax3?EZEL7HyPB6=9(z|EO19X!QpbD*#Baz*oz~f}q zADnhf^g*^<1EnAl9fixQ9T>+Na3G8pbwn%bA?p5zYs$zy)K2`SNxo0!k-lP%0^x7d zwY+5BP!$c1?y9&5{WTpr%_zOh*0Gz-VH3w@F5MQYkE@|DL`FO=Jmy>Q1pYUJsUV+zjK3~7Wd>6b=A%9E1}v4zGSNFONn<^8olimdB=Tfl^tbjg6&&o z5<>}Dr^00$FJ5r3z^;(>Axp#mj<|0x`l3PyhSaph++F^g!9ih%-J7PW4t5{<-urfE z`WbvautQ!47AwVWLRs-cWnIsjBln$h`Z$Z7$Btk(oPwx;LxH2#upRK!ECTu)&ARbB zJcPc|DT1Cy&ty?uTa1L7|I7L9SeB8`1ljxE*~} zgp4cOqFa3fKg&%q2KsPKu@LSGe_7qz2VP^$=E1R5k&O&&gMmlNXKiLGV{Rn#IN#`RvoHXp5bJ}@= zJMjdLow(qG7V%Tywkm*2{wS*PiO}+Y;h9^ww7`XW?(Lzb&e!9c=?pjY>{ zGyJK+2`8shD%^W%3qcRRsT+FL-A5D~-phONBD|A{RVMKUS2>u+c;EbO>{RM0Ua6(v z>Ys=w;u0`?3$cbqLdEE;YpTPPQY2@`@LvCQ47mTy&|8|Q)_R6NEOShlCzFfxbb_NA zvsRQ^O$Dd2mW-T1ZOwDKs&o362bh1PeVKD_$lu-pcb``+__cqx|CTL8FV!9|X`qBx z#y`MbRYk$k=CX0*O1=u(;9Sv_Uvw@ypWv!^ja6Un)P&-imOXRMIop5&?>o;?6;lBh zzH(kTh2di0?6Fe?>{Tc9JS%uvY9cc6=PVx9{Q%p|)`7RX2_Mfp@#{~Aj1F=i`kzv~ zCqFLUqEq;Zj)bTxyqGKLn@En#cox2-6e7FW0?%xe7^mL^Gk;@LmPg`~Sc$&lJf%ga z)ZUQ)ct~T}1|RdN98&47lTr z=%|;H3w3g^bg3#BsSIj0@cRNg$xcKbc@(uWw5N{+p9@S4{x{G#z`R5z%zXFSg;osS z7t+ovq~hyOMiPdGFkH z{%C)aY2@y?h~y8>4<`<51^#CgOAKD=nbQkSn{F&GyeN4@POu>N#1ftZNUT4Q`as+f zg?zpVd7vqJ^e%rm57A$~G?kS>kNPiEq)}AJuS3iGj>>|%m0f6)!v9$p4xN#d!JF&* zE6~N;sZIx+K-xfcdq>sx8hM+MOFEivZcgO)jj9?npUudPO%XZ7zd>&dQ4jFfxLiT8 z=EV4GjgR~|>kzt$BO~ zQUcu8KyX{RDpg~B9(0-xG0|P={WvSB4={;Bf~`6Vtg?>*;$^APvps*?(w;%VHS-Kdw{;3=Asn1(v)CI*U%8G#XVkL{sIe|8f*R)uIS}zRd}!}AO`6QZpqMe5y|C6Xo4?A zdGB{f-ry>MdEl;nZauG+zmuPt8}2&aPkjLFoPv7g=p%9)`1YB6A2Q}%s38$DzB&%| z1HKNdbC}A5qqsbzPRe;;Oup(KGKNNpci^rzi;+Avez@|d%Xbuv zLlu+AG=$!q#g=hv`7XGF+%#U_;A3I=0+I3+bk`6lBU0uE_fQl^Zk8X}@Qdfe zUAPbAy#YOEL3j+(v-ha4&m4{#So*(vP@0wCtwc`LzQN$Bf8r`*@%i{(G2oJBm`pec z2J94k3!QT@rYt#e7St-<#@$Sz$nStd-(lPayPD?>zJ-;s=P!Cf}PB#BgQtBd#>%C^R z>;)fg7xUH4?!S&`KVrVW0M3ZV!pYzpQ>WcP(y7Q(XPcicdSlo<|yXYf1iWJByeC6LKL*$xW8+`w30oZ#kJA|u`e5{1n7`UevGxmVooR`1~= zE2EeQ;NJg1cfXySEU(B34_bX+ldL~z4)4U%@MO|&<7o|ta!MPl#()VN0}XHk|A1o# zILmJ0JXHR{(5&|I2fQI~1Xi>6uPOpqtgm zpp%>~V3)Q!4cKyE%rRK^4(u&|sH98*J)sVp3HNVCI5T!(IwHI4hOYK?gHNcS?&WW9 zMtW;9tqsfQtKoGvC*f=FfmLk?ugnR!mN+{02Z-KWEG6(uYD9YuWDg(9!z0kiMGDJH zqmE+!2JW3&SaBD-pcraE1NPQw4&1rP`O9gJ`!K_)<~#uUPldbn0_&a#zp*;IDNdPU zW|^8NO5>^*0+o zG=E@=t!swrA^MhiA=~lsz!odvooR%>{GOkK@^cQkEe#m*;^41Fva_NcGUgh{2N%4fO1*@-^Zq9 z=vYr}%}b;+x=o@x_j~p%1F3 z6knmvnmhKa+tZup<#g-Yf+iZ8WG?&6#F$Rzf}QSm@iO^8dvV;uuIqNT`|J((hTG8l z;1+d%*&J?CFN4Ru_4YB&as?cJPH=t+ef!M@Jxh-^#^g0Cb&#sBhC<_?E3?28(cMUM z0n;h7O)E1M{+_R3144jSC#h^Y2b{!h;OXuFr&Ue(Am#(%Jg0-=x~K$}x}RzTJk(F- z)Scn;e623PDOB4wH4XGB$>6ihhph3=$-us`>1-qPzr;KzJdj(RWzG??Tc%WnpjZ4B zU7<7xZ&*5(? zg3tF6`EU7VC;~f>`Q}3bPA5z0F5(Jx1k;vUJ@@a++%i*MccU*}@Mjzs+`rs|-c$R_ zZRRcU3VHpoO0Ue{V6X#V237$H?xAI1g4WU-cnd!g<+U!}V*Dd6oP-{d?VCDyu#R3{*z@;R_D3^>i!v03ND2=9F2dd+BJ? zSO0=vb`|u=B5+5fvJY&3|1E!Y-&6m2UuR!NcadAx%k1s<5_s0_?!NLqc&WYg?rHPY z9>Dht+7jlZX>9M=?e0XcxHrzuH#NXItpevagR*-*nTm?Z45&M!xQjeqP2Zzl@}xQ; z-$6?nfq9o<$dnbp-PXtP7PBr%flaQ%MOBWEM(nrvFEeg+E;t4#AO|wn2vmwtIHJ~K zKBY2T_{+s0)Up1kXxB0KbPsiR9DD;ol$SEfhVZAv_K#KB)e@UA&?j_7L^1zP+ubg( zjlH4n0?+m8*bvhITEbD_+^4wzVE^3+g)pqz*9LE{-3wH1e{k}Y!BRvEN(*hRbm5IeKh&qpZ2|L zd>hEoDxLaD(`{;fiTXJYYd!D7PT8r_d#NXW^?x^?ny?x{5 zHP^)gXr_DdQ_tbW$0}dNmi4~vX1}6eEki%>9vbU3*gKch z4f&6XYY!+5chMuo+(>UZy1z2WeYxCh?sj*bTfkgK)Tfr0u{T=z+61lytS^P%b;qdO z;7z{rrI;vd4KA@O>yP|#-l@(ez+aRW8RiLa#bL~84sf~y+a?4aAE0*1Z{iV84ZnCi z>I%Q#cDiP2d8NFc6a&>hyM1Wx!xd4-9i|7;W%)%8^)2>qS1IKryV%|ACAQnmRA}O# zOm|xW3g2fsOivKiS7;r2usU$DkCi^u*fsK`UgxW#rejZyK+Q{o>)Xu+1C_oO&D3UD z8dzm4{|#sHHR;OPa9W&1k5Nbr=D)-&@f|$aJNTBKi_@q{UpW^OpfI{DIsR2tWCwGA zc?QviW?&BVvM5ABlogqwfZZyv1N zo9Z91HrMDrCdksj7ZnfL#gSLwgn9wg*tGj`l6qTOz=^qHjUj6 z?nrYKis%uOM%|GI)D-B#i_|M>rp12^_mIpDTSf|$97>t8_vH4AgJ z0mtm8;&9p?JZkU1Jif z0`fE}Kr9&y55X%iHPggF_%lkva}@)8^bR=nf_P6Q(HqPMV*OK1`lEx(jAJga@NTiz z83&ww4^cALIfC8!&H0BH6eZa~u|Y22$=P_!E-ghzcm#WR3p)xbMDt3RA?-=k?Ibl- zriBk7A$WoiH5ik2<7JG<0PT9Zy@bA_v}&b4>VtL-{&mn4FqLg0a~DciPs(X}xhZ^8 zy}|AiJqVuC zfQjfI_{(igT|L8o_q+anVN2ag zx*_HOmaC(57~b3o(E(0*|W+s5%o51fM8~XZr z+=1O9L|JxJ)K)jeC9#~E(=%LYHggjFK{rh27$vj@?|Tjt$(J#G{y{Y7D=Du%;#Dyd zRBHMnqcGEQ0=0a)+9Qjay=pNq&|q(h`Xb}1zoFI7z(mVlQ^jrKHMQ;S3#igs<)8=h zu>1@y=@)vF-8>p|bK}%o$-oPDMAtUg>5Ms(ACRg13GJrmeEW_Y>DGtXG;Z za5ZO9X`v4_1!p}T=<^IOr&ER23#k~|+#l@?@ciC0xHGe= zF6xa6hl8uRI1a@n3bX|nbIvO299UN2G9dU%m zL2a+c>m!rL1#|b@x#Hwwhbff%S562YPLwD9#EWo|l4CeF#_=y26ak_uiNrV11L=DF14U&Y4cz&o&c0)UVWIwO?kD z1JxGw$d<6nkTWcf6f8DYH8%Lp?@nywlWOt{m&m~jkyr8~W>ex7`EYDUuGoRt|KWu3 zrfj1#70gBv@N)Nvn|$^VYGqD%$F3lv?<1aGF$Gri1A6Tx>?Y>+`e8CA2G4HT#~;DJ zQQlWznQ>_-ok2>M1o_|O;H3cy40^iwkfb5Sw&INTr| zY^3#JN_Vrbne8f~_-=8G2Ex0aSH*FkyYGC>!h1w)cl*iTVAa;MG9pwxuzB2GIJYpLUKK8mLh?MWVK%zhmFlUwh*%hG zCYar-p5Dk)(NP&NM?x0|SMraryVNPv`)F+g_53AFTX%*ISBt5&`h}mXr(a;wZGtvR z1=sh*;(n~Kht+kEU3`dlNC$}hNwgJT@z9}X0b*=}yOINYq7*#M*PvwG0ah)8RaK}k zf{)`-`e^o!**}EsAa-xV9bHkG)0<(2n;7?k?TuQy7~ZB7dX|^i zKTM}Jn{{kCN@P~W;W-QFv~B}i7T%;6A#pR^)lz%`i?#_nu{|3CH)m#3)m?{(kAbgh z13VZ%Wed#FU8R1QtJ=T@VXbF@gM5TMvr7IY*YFrK&TzQR7r;;SL2gkqF_+Zacgf2w zS3)^(WO{wmIKFOfGyRe7iVxz6{@1r5bX4SD;mQ4Lt$`ZdN)`sgmEPorwmJdTHi1b; z9l3oO!IL*r1rr=w7q~ z%~O?2otKU9l$pa4&ziw>!b{}y5l}hCIEVfqS0P0KJsfVSgKpmd_lKYk)(L5v(+lfo zCh4E5v94p=+9$e;d?Xs}cCumgVG3ctZ;#h#+vxQ-W5$l6lkecj^bh|=h z%F5edUV+IE@{??VInE0z8x)F7x({Y3hTzE+w@vI!iL$oz)rW3aU9E*y@K(m9&X_|b zm5N%Zb?{iFLN|~J?u%-u0qaC&JUwWzsw6A$06Pm*kRN){K5%CboImPlA7q-1vWPj2 zj%$UP1m^B06_j;sJ^5#TwLH7%Ob33cgW1Hrz+bWTYxBv&l0_}de8PKeF2HZiFcW+R zlVLrKU%!$g!8g~1HvIuTQiqTdffB(@z1X4vJkur6`?=^h2vfmt%~W@;8V990C)mxl zsE~z#NXh{jWj%7arXJ-U~{a=6?l=V8XQwjgvA2as6~J6V8P%d>dw4$jXaV|NE$DuH)v1*SO>n}Z`WoY|GZo%?wnK7$wIUC>=7 zF`4aox0G+Z@zh41j+GVL_%BQ-KEbmvPC{Gk!LRXUm>xX_jWPjSz)On*yc=d1S5Rp+ z3QWc&evltfXVofn!abovRdn+yD__Eo`U~t)8C66s^0NBwy3_Ru@Mq2RetlCX^Xlm* z^0peNcbhBlKrS*h%x*l#;2(7y>)k>%QJr~QD4w_A0{9CoN;v#l2KW3u?!qqgJxkGr zRAX_WI@dHS;N}U!l(Zkd!%w^)s?JKb32Mze$*HD^<$d#2$d)XsQScVmx8*B0uz}TB07Fk8ne^qKt5eOa|Uq zfyx^J(1Qal6h=PBILshIiu z7tXrUDz{pU$mMXZhf_U%ht|vKatJ!7L#CDQm--}6m?(d5@IBAX4D$xh&q<+2VJ@zS ziKpK~#c63P>z=BTiq_>!ZL`AM=i9(Z>_G=H!kL2(^9k_C5+?#`+a6~&H1>Un_fc?e z4P*If1bk`>^gJqqXG#nLH}R1bQZ-CI^;ymjtO(BL&mFiO*yk;}n%GEwY; zCecovks+o!aLH1$9#3Z342`fcUm=vrVDs9$DlafvHg}ji#{{VZ_AQjsdS)BE*4xnO z6u=H2B;tW(YuM*0gq&_=BJ zBV5m4yqsELrj*|ZmNoN5bMbd=fLk_<~515(mk@eju5Zv9}-Q696YY0w)1ww$}?(VLKyE`0q zIEVl5}Il3U0w3kSJkFQR8`NsL?qIU__UHblo=PD_4&*anqj?$15i=#B%3&o zSeeaj#0%j}*SSMJxSHHc;$273qwY2uQMvv{v>~J43_fv^IAkeOpN2izLM?hVnE6A# zujIGmmEKfrpAe^%QqRemAY{R2I?+=*C@M2cZi02!oDOC@-+E&@oI~6bysexL^E!C# zb>pKvV#JfBt|Y&EEH_vKkzqEyq#5Qq>Kfo&)vrX(bTN!cK`Yc3?SFz^rS+^A0Z)8PJ&b#jaTQB3Dso zz*XMdqz{m~EC6$L2JvE5SW#8rcud!3QE})4O4tlLP+mJH&WU5xlYFu{JdXkRnnfZA zUw@g23w^}{?Tfw!y$IIZ5&^y?Tb&IewgsQCUA@MB`K5+y;n??=bbk0?HzY?#c579s z^Hx<|LU(o5Z&9ghWF~{R{#AC?9_z7=fv(ifWBNCE-c|5NL+OKUs-L%JIUYE@)DCsW zGAd-{nJZ8Y_NERyp^BcHK9OgzCQ8EV-$;})3JfJdiNba-BwATQls*}q-vWL(Pp#&> z9SU7a#;FUG6N*P2CdXSYs*`h#^-R*pZ?!WMsQ-?lx3axn&+6vA&%BDs)*8Axf*tLM z6q~u0Q5)(83wkAZ=2U02r-`?;d!qZgt0r;REB9fy?k?|*b7i1E;4_@M{jNRUPriSA z1H6-cABg%BhH0ErpzF3L{Hfi#%Z!on zW?o~6HQVUUB#8v@#l~7jae#SDFNsyQg1yaR?ouq0AB^?xiNuGZ^W)L?c`*GZ2h}Z@ zTRgz>jD~k~ir$=*dMb00)yTQeYRrtsLd=#3L&EDs2mMbn(qBdmbDOJ(K z^#1aVmRvL!{~EfZkgr;>@K<*?aaVKacdvA|_X^i-U(UgABpUAL zjC5V5Vl|G=!J>LzM`^6+5OlL3vC2MT@TGK8)+H*>tu_E_*{PnTdv`pxMdhm#(Rp8L zM$7dMzDiZ2{P)P|zl&`2sV9izc+a!+;$9^>uc&3yd|0B&+J8)p%POuavza0lOU<{Z z{+HfCE1@3H^ScT;CK^L!Tlzg4TDPo|@Y}!X?eLNBnNAi%=W}U&8j*QVc=gf5Khw1_ zOidc5{iNrjDHYL+<_9?dM5(X-*({*ngqyt*d$Cp-f-Md>Ic>Ct3*x7 zH2T4nd+KNQ?KtW=otYtL<1RVL+cIHcW~&YHsI|ec3K5^zheugRyM(uE3a2JmtBr4+ zu7wftx7W7m)4W~v<#fi~7t4qoA2Fk$DvZCIbm4X*O03CLz03N))?({l5g;1<%7n58 zWT>fOM|2cr=&B3VftL6{x#-G>rd;d-LcQ~u3|<8)9siQX8D^t zo-q4uv77^&y*u+XA5g(>A}sTib>H(fs7>I6XGx%uHzCj~@7zEIH`y5_@V=j{ru9|;~*;LwJQEht1JNOLV zH&I+xZ4T-*reAEwi`-Es$%aO0x)cu?we&{D2WLgM-*d)MNoE)Kv;-}sSU@~>Qf~#D zc)s}$b8)WGNBTjuA`>xOJLPcMSO01>Gb6Qo^i7;1GFgw@W4N6pw_JutJ*&I{0r*0d z_HvTneE*};U1i)eo?t}Lx>QvM*zdJ9r~k4nq~aQc5> zd1WIjeFxX|J!{$;%ia>kUIsltuik9B3r{*PdPLAuZ!%pW(yB)vSQTTF;h=hy-8#p< z528z93jGh2!OaVR0nC9zT7)j5+sOAKHMULI^B5+i48ev^Clc?8FP((e_eaNbH8J-GadCRmp3uj;)uR^yXVam`qF#G`_$dhP{46=BxRh*!L^=HkGe>- zdX37|4J2YCK;P(juM2j&k4dX;F_QRY3|LH8m~aQx`b=@iNDNaQq-Cy_iYb5@#U3gE z9kuWBj(Lab<#%SV+!TJ;?u$fkEl#Vcc2Ra?$(DeSuHo6UCt0m~a6}&{zp<~LD=XFQ zOvzY8H9EigTsf`QVY1o^nAZ|qeU(wk8t?oZ920a~kCcz~S&p~NbxLk*Gk1~wA2Gk^ zx7g#4@#vq3p2CR8#+!YdO^y4kt3@TCmD)q;#q6af$bB%rGXYu0vkG0A!Q7Sm^OZI9 z<5$%Z)Sqy@77{tQ*y9hW^j>7v3#55vtZe4dQJJ7 znPH6`X+7Uu5v~fbKBya7o6G2OSm%Ig>H9;FYYMH1_BqKt5i=O>XCj1vw zk{A4Zi(U5{EIkK1pcfS)uW-ov#OmEZTWmahC-Ge;qVv{Rl`UA-?4lZ#qSRzdmGOv` zwOQmxJHW>5X^P#6QeMG$+64ddDjF?d&h2CO-o%o=!@6AJ|0nG6SMbvQrTgU|_4pU+ zU}cUv5B+wKE&MGL;YzJFE}L)NubnNJEm}Z#^K^@WFO;DI_*lQBFTsv<<@*IV#C7=pCJ}ivW&!qch4`v@vwOz6 zra0TX8;5qzJ2~H_;FG~|d4BlHIL?W*va(1Gru>n8^#_=iNrmDzNW?$9$9vS~g30r9 zvdfRCyR`eVxTpdPyAIXTbLe?b*k!fA_Pc_yTn7)2VXd06hwGrdy=4*g5G$sMeOezd z+xM)-XS_o&-uD7~DYLqay}XXE9Z8aY#J)PoD<)IlD;?qYR3rK+%8F&6Zgf-g(-U|@ z?twk`MJ_PDI(wO3>plB>re4^vCq<9bKgb`l6nt!cD7{4(D#-^M4aYDeHNImIWU z#O1uRjo9ZGc+x~X=X`EcS%E12Ux3_gonH@Qbv+sBCgPhyS`;4SGhGae>AX6p8hEI@ z;)m7}Z2do&XqUh?D(Fn9q_<=t3~c7h(%tn<+|-|#{X9(rS%aVXi+QSfQUxVO+{nE> zsC-_lWC~X=G$ObDuYlFZJ9!TS{E_klOv~;|d5+IcO@!i5BeWb$MU2vZGjhl%G&l|f z^c{UJb=3OO2^u_{*!PJxTQ(uG>d4M*re4Nc&l6|y5V_Sd@On3r^}Nu&5RI+mGZ&(+ z_l!#PDRPokN&9;z^8Qa*3R|=jJ|a6cq||ul>M|gnsGs4Dr2yUgmq~5ii42=#+jBS~ znRoM2FKVXO<6t0Nq~e|jO!tBL%5jTGsD$<0IE;30G=#i_FFHWa%VO}M|5)p{$`P3rG&^# zO}nE0l*v&y^}m?R_@4UcUYI~L=zJK!q_gVOa$ER@1^I%r`P#X@_~Ju9_-lFV1O{72 z)E?S*p&1RR6aRx{eU0ZXPSp60zRE9Xx}RRJjPSr}z&UYPy&XQ+DftBEkVBl)(hwi| zv^sE@4#JLlNKf%&u?SYe2=;7NBKDkei)aWh;HP}!80Ee0z3A!=Ph&TqaUP$$HMsdM z^%Ius8Fk*`pp*{weikI&8XO>}=mrCNCett@L=2e8HbEyl9$^D}D!rsLM{j7PAro3| zH2~rMjo$jPU`&;m;Zx7}XzYV~mjfPOIing=<`&V<5JdM)wA?CQQX}1{Ru>1*O&5Ib zvf=``!%VF8HsvpJ)ZOGo+miHPwUUKBt=AZL=1byBBHId`ZoGSf0rj^6)J|q=`KvC_cX(; zhw>paq3TOJ<7mX*-G#9bwRTOy@Oi>-!T?~+Fm9i-bP)f7*em! zjG4Bg5`C4sI3?h%(nU!HgE^6`>VVpch;;_@s@pS@e6<`-e{+aDC2FAQW#nyH1r)ap z)uXRi`C`1U5$1SiyDdY~@5w_K>%YM5%E}>PpSlo~J{qLyD7H4-EFx3sFVy||EqA16 zp=*_MFuj;DbStEjqcn|uHvy^JF??0EBBuuQ5q+iCIs=EeA$IDiQAIq`np5#Dul1FQ za1f7*EFyy#Bg!%RWUqdh`34(^(pw?_TaH1_*>qVR^^FL9=iTot=t<+f>K?-shFZZz zeTM$scp?_V^qojubE7z=7X`DwWjr-wwff*%AL$3`ECYPjO0W(~Q^PS~n=&(vUa>V| zvT=*tEM7aQz90%1$~*pmbzX>NYAEXjN(6oneD~iBeDziGN#7rO5u*F+RQ{7|PqlVT z9LXo+L3HXu$~*@8w+7!@Tf0dmsifE>hY(%;E?0_4B0n=Y2FgW7 zO}!J-6XJ|%MkTX8J!|)jX7nhZ6l?X3U^nHpFqjEXiLTF(=N(sjf$N{85A?pgW}MN6 z=o1}Fo#{P`9I^5sNX$5S)qtOgkLp3!{c)n!^U5|*rIgxsk(`;Z?T9)%!{9zm?eP^c z@g}VTeVN7eB61{=(N|)*JMcs{W6eM7OqE9FS6y$dO-5m2wvFB!)W?UrEBQY8Kl`@^ zy>pdz_Gf0~dt)AdH9&f0SLbP8ZS%F(5A0$k8DMX?gOkzYO2nLX>4%)hgvVfJo*V&v zZ_Yf!QA}t1MNH92j#usMZUJ84Fkgk$FxlK645t4O##N%efZne>Vue-@mhcF0sc&SB zQ{+Z^D-GEg{C>Ll3S!PE*uA6JiOs%3r29qLMVG~H^<F)S4>pLk zf-{+4ZqbUWJ?PzQKy84&UF`riJ`Vf02tRs&^CS|KlXQwc*5=W-)0jR1yHE6$8YlL# zZ}62cEfQmM0z$p%S zWFDphl$3k5N!Y`!N;FaDPI?YjiGk(<&ed2=4e+)IhD(_Zs}RI&rEM^_D&Pt0qOpzT zEGmTgS%uWX?y1>9@6T$G%Ut-ERoMCd@Ti-pdE^q;cBabSW9G*f_>D)Iq&7^iMa5>1 z)5 zf{}KPd~_$M%ULBt>%&^FW0%bWky)1%N!s0|gNZADD7~mk#0v!$&RFe;oJ*(jDI)WE z%!Q3K8ZoUho_V}O=x^)7^yyOOa#2e!Y&x0IGzvdc*o<|0+;bd9jI-7T>O+fUh@+k3 zYS5REZ>~o~^(%R=^NGqHg5!1~cdjX$Qgx|I?PVx){K8r795OkRzea+(uiRL>AUp^=JWP{ZV8`!fDwTRoNl8MLoW&OrA^-H_0~oAnyX$(Z(W|2!|JWR~w2q zm``?a0Q*uBJU*kAiE7haEP6H&#^*2**4tkX&ZhQ54cZV<(>Sk2%eIehc1{?kJz5r-C9f(n>>Fw9_s~}Ci095#(lK;E>i|!1W~`pLN8fK z`4blU9?rBd=x^Llhj?42nv}vXRDnmITbqbpZDEg(SIVh1w3>phVi4cA+7oj2BCw$M zNCh+_JzThXMrt(qh`emZ>Dl#MOdl^Q8;Gk~5l-QmN6vJI>QPlza;CZ5N|eW7c)z9E zb{1PPM_jf#n<@xNr1PD%Uj9Uf6OrpAs?zaPr-zUeG*Z{{9_C}oXK|a3+-KpV<`c)4 z2T8~++LC2u$Gg9!6JjHL(!u!3ru0AgnPBuUb@%hkXRTp$H4dBA=>n}|tfPW3$MMpd zB6>>cXy_T~eJVQZ_bk&{%o>eOj>ns{LDKD!^ELX@e=^bh2^~fEnUvuXYw5dv0$chv zT^Lo7bTaIC7`ME5!nE{{>pHWM&4qLgWacjpAmNPQ*>i}mf5C=xbInWoD2|F!@+KW| zEs4=$kxVTxy8)s<=kdgn`)^T7DbLhCbZ3l{BD9>Y^GWrgr#;O@4V!) zE5sc9YF)|1a3d>B?6mSGcHjZe@d*3m_cr>-8hGzX@(+;i-E@F0 zl4*$$tFiNcYKQR_S!H=w`#_Zcnm?JNq5h5g*|k$x@HyaEAJuebJ~PVkCU{}cBJ!dB z_{UhV^c7^ub+jc&cnXhew~_;l-{ADO#lupGht+mok06?8jUBmY6mmYYEd7m0fxjz`ef|dH z>=E<%AHn$>i@iNhTy>b}AsLLH)adwPc0pq-R2V+hjy|ez%Yc>6$QneTgBO|p&3ss- zdq?~bX{hAKi?_)CByxX%y_th|T>`>;8r-m!EH5-7(v6&3beT+PpL!MD3MVIch)?+@ zGHRXGSM(vh(w;NdzYbA?ATpaRx9dJBSt%Vh#}8)vE!I_80GUn(O*y4hRxfFj^)uFZ z#~<$5bYb+B$LJRt7?jNIO{hz$dig#reB>4*~Qb#;g(!fujjLmJNos}=?1F zCKFNe2QdMhc$&6^?z7=cgK9=KI+_VO7WO1ROx9VB?C$$+(=*&#$hX(s4b8mCduFmV zKB~SXQgIH~PZFJEB1-u#ZXuHl#DTexdoI}o3sIX$u?=!7$dr-}$iFU8<8_f4%^pQG zIf_iF1y^*!4!ji0Im>aTgwM%e80?Q!;3B!%0gusan>+eIJVWkJ(em3&oO%u}yOg!7 z15VeQ+TB_0wqkeTcU0!8bBV(*$}`xW81)Rg(O)fUuI416)!lDY zlmtbe#6J2&Z_#e%aeVim@#Xcr@ICY;3#uL{X0}3iW8iLC#12oakK`_FJ2XnCZiy-|xoLA%^LMe$X!@)Kp$RMwQM*bkeIRz%rojtHlgfksA zmG0+6$!1v3_e3gHu=EzQkoFhayyLgSQ==gEsj-OPNN)nqN5V0WmkLXCB zrluF8lLkW;*oR$=q95#duZ6;i&uOi&>Ny{HR{5F* z8VCIqDCJw~&lo5lxam9UEQA+}$BSK%eXUZ?4MsksGY?&*Hw(M+6|^)HG9Qb~bMl)$ z#EN!o>EM1jBv~BqYROVWX03=47a_Nb=)OI(be(9(cM0p3yk;>vD!L%Bd*hPJ)Y_MP1K)ozt*eQ z&Hw1_{{VBMD-rh#yv9yvE_WHvT4z12EAz7apgs24W;X7Z_25Q9pL}7=l)dC{<15MJ zs?1c#CmQqhX;yXSUgp%d61VBd_$+y22Kf*hlNaqyi6loMnWFf~N@#dF(5+xNFuAcG z(}+1%gL38I^^;*c9wXI(Npa>!&TPm}EOQpky)Oh>?#2^l0uMaM8eFD*-~h-B|;fSJQ$ah=i9N$TqNC@E9_Wt0)BOZvXhASq(J*bepvJcwRYH; zZrT&`i)Wg5g}1k_VUQYpHDCsv@R#vD_Ga)+^&Ji5aGXgkdFm-V8feTpWR?w30m1 z3qRl!i1-^$=}AztiG^BU^%~Uyw>}h>uG_j`<~DB|m7Tx4JGoD|Mp~cYyd6j0Kd1p6 zqUv&#iuqaPs(JxrW;PmHN!?1kewGtH1|jogQqk69nO7^z)ZghFt*mariraDE1T082 zwk8ru$0KFBFSu_gq4^H_XL@gY+InaC zR{8?|C*JekiLiDr`C9p_cwUJ1;4a0}Ec~i7JgnsxiPK@d<>!9yCr$+sO1+h^tLH=Hd>}5L^YMOj)OlE}~_}Nt0tGz;F zResR_?7<6UNs8DfG0UeJRn2M4Z76`9Er>PWDfp+k$^KGnhv>kpN-o=1rU%E57CE$1 z>J+nw&7`DbB8$<6Uc*$5RPG|)bl#!vN_s)6<#t7{wE76y?4u@lgW5}DHNDZ#%1L&U zpj6NvFuV1zmKB`i1A053=x+`=e_Q6j=T#H1+w+iUG>A$pRmEs*%p`2eYBW9`dy>G_ zeUSHLemhjT!}QY%VlF$g1^WF^TWxl9t#HmWb36X@4|Jb)SMt{OZuAuPRP;3SX7tte zKli2f_4m%UB1J*18k(3BTg;?CG_s;Rgy-)-=X?{o{okU+8u3PTqLd+M^)T+Y#mbmS zvmTG9kq_{Ke}iNXWp-A2o}~x>_hNN^qkCi$)+8g+y+_177wqdfRy;X4OA7L_p=t$A?kh{Kv7Ksf zKRPB}$RB2U_cTvo*I;ccUhf>1_8C>giJ&#*(d`RVR146DuoR3WfiDOjDMJQAZ^;w;>fWTFwU z&0fLP+T{J^3ARRSm*iGgQP(@yclSZp4A*b&f}V`Nzuns$KI;NDcnqg9{-ez%Mm{LE zf{-sJdVVa{g1N2}eZk?gF9yv>jLf=M=8FsP-Ufmp6@}Lj4L^4|6&cl8(Hmk+R8PSY z*rjnRFS-UvtU}|?qJ?{rwryz}Cn4MWkrxtRvh7!Hj}gjW@eq#N2^fcWPfny$eY%FnG5YuSUdSz^eCipXC{&rDwxxBJ4! zS|xxW+#;Gh2%Z(hI>vx}jmOdlaW3X4-ccB*{ElW8Q(r!NGo=Gr_zLA8bqF&CMyT20 z+?gP=`M{(j4QUjh9v7m2W@bwtt(dw3F8O(xM>_`+zMU%eRGw)C_I(Qo?KpIP8qc^8 z>DiLA^?MA_VFGJw$0CVIc4SLpL=n{S>iIBJH^q}zxPwUrZC#HmS)O&EnIwHNcoP%}Cli;mDq?{F- zbWI@Je)#>mC~521xZpKJ9ypNI=T*NPQ8{ zY1`_UXcQu~d zG#(pHx1nmibw2aXarre1N&g4hkcax=QTdwr-@oaVu)H6M#?SJ(QiI2(VmBw3_xaQt zsQ_(5-x9&d7m{ZV;E^6gBH4(o3t$Vv(AB*}a3Mq)E%X6_SA``bE-x7u!R2G<-uNL6 zyJVc^J#bddc){%U|Fkq978k+L(#z)h7;~j7 zvzbr6B6IiAA=6uHgvR&h{Iw2LsH$u8#bkWzV65;eB-IZ)9>p5WV}1I<0S$3N-t;@F z0l(1UN_fgo!hzf`l3$)RegvP-m)@HdrguS*rwu&IPJOLW*|EVB<#X?9`YvK z*#dfQ`5!*vAsPNuWWJxAEtY6}5dJbd@nRSJY6Mm#6?n{R@dp*X@>JC>fI3a5%Kudf zz;ORl3(|gL)l~6^npX=q0x}0)AhW2Z*A2~Fpt7$I9RNSTwCYP;JCwwy+yu(}MeRl% zDjDxgHRr%qZ>&aPlZPOA8;k8h+%X+poeplefwfqI{1zd_NLFMFzn{!r*u$f7Niy!6 zbiKVEqga7CTx<6TB*G$@tPeGoYSpOPY@zCW$duMe>#aFf9s^VAOnfjETYZ2mv=SmOL8o#I+Se*;3K`T)BIPAo0V(S{j=4+W*b@l+<4{VilT$w^Zc3kT4?>p2lkMr&9WHQCQz)9ON(V;0@AJMcaur|0x<$XX-=z zeoWX1fktdv9&fyn_cagPCkqve+i-m&;3>K3)B7SC5kFQT)7UA#YoC;ra-ZG-6r!!T zrj2x7Df6b#(?ELHB`X_K1((W1b(~U6$qyH%BQbeT^`Izd)#TK^I-Dr5LD-&i2>QDo z-?<1IF)PWhe!_ZON2iyf)02r;`mqi(Se-dsvpOkGX^TIJ;d&cooQ2d6vIpm(=_`mY z^AVAJg=uw;s>c$&5NAYO1EUM$WV!l8?h}dD+F>;uMAzd$`W7McDD1{}BIb)?KWu|? zuq9GcjnASLg8$h?eML`o24ay6@R3T+@b(}tjZEx}OElX-sN)VnpJG+G{yuNZ(;$spHL;a`Z)|G~aXCc9H# zI79ASK=I z1?hs+?RdtH#*gyo1Z-PPYmiL(+>IAIB0Dc}N+A@u6 zk(t6OWJZYL_{%9+hegQrFgClF(hhmrXS3K016z~r$YnCuY~-))NV0*Fizp?U+XO7l zLUu`0yum)Wv#((WWPxqGSI>d(FH7B`2Pjb*B9WTZ&DQfN`=Hrn$m1uIsl*}m^Vs%` zau@nvLd@3o!10((Jx}0oYS1TsU1P>EtgsmRJKb6~VxGmIH&5uB{RUn+h^ZjJGV;_Ncmp4{lgk5&mx^e@EUOsV0u52RD(N{UC994EwsPR$M)(G-N*VL}v9pfK4+W$sg2uXf6=d zsnp;OX-Boaum`u$89trvwli=y4`FrsVR3Ka+2&I{8Uu-*g=!6z_ zL-Xn&y(mRh^U9a>=%13)Kua3azc^gGA$Cx`U4c%O(KXFxrR-wIKSE}=(cO7U1}%kA z${1uFgtf!5s48f9*VGTB7pGWb1C&<`hY`U%6@vP1mEKwW2 z=Ah~Eu)#0F0!$0{s}bGaozx-J5(|)lXT;AP;%gIqZtbz(yXep?N_24^$&>~c8G*b9 zh+r6{f2q5fIrSgYfjZDPo|+Doy>MfMwgh`Q5xssuT)&q|r2$bF|5jSt%j&MCZqrd4 zN@rI^EuYp@%gOq#!qV3v{__y)KL<89RkPJ;r*CVO8wY-8+*7H(@`-u_DVsYqG!=U@|^lz8^l1UIzG2 z)kJ{&@h3W7PQFFoM%&yRQJJh`7xBUeq(6<5iK}5b-znYIwqRiyIr+hZ#mpqGbGkwp zlZF2w)?3A7tNz+0`i0UlX`(tkn``0pOwfvIb}w$2)|>tC58e6kRJ5jvVB|OsZ&@cP zlDBP(kKJVV?)K(4J+V0v~n#Vl1b>%L=v5-HDolS!EvXG&+239q==fw-Xa)8ho-uuEso??^P}_s=S5;Ght;`pDi7D2T$&BRGlwHX8 zFZ5{<8BT6|+26!t#O74~NrIzCiUfmeZ7%rjfw zc_tRFIXu0dbb-`nK3D-`BU3-8Fk_;S{x|+1n)+uxbv_c9!A`dKePecbA9X)ko`@6+ znc4KpY9?(g_U#AjJ%V|eBh(J^liosXV9rD&-flG0v3nrLl}d!#jTunmlsN6KUf%qN zj>2c0tQ~Ep1ShR05{dpda#bSwJpn5+6z0$sI+v!gW{xIdErB(s^rjIFXRwd0~Z zx*x9ocs)HVxo}xctwiL!7;S1srXR+RUW{b!lNIGrZ;RE&Z0z71KIMD$H}>Fm?FXGM zul3s0e{YHdYDFYBh8-~+DNVpG``M9K;j5Pn5qM4=zU)11qF!73jgGwbREp~n2ZwX6rBxRhsqPEC4t67Cg;ey>4~7qQ0YiCDIR30y~_ zS?J=)r0(G=Tjq~o7MG%5&aSi`VkfNRRSqi_{HOC|bp|=#1<@9adk9{v3-_~;Y0d|q z2<9A&KeRzSQy$n*e>0EbDV&x#c}g!7^n2JlS8A$LI;U0cqStg0{%#Mag%o1`_8qu# zwT#S;%ACC%#srZwa)O9Z|KCBk8{Ha;W(Z%Z8`h~1TlrQa{lh^K0C@tk+H0KYXB9WSI5qzkDv`gl!g0=H$bsD*!j zL6lk%++r+VDx*k62LIP5_TYt@d`-8 zbsmfU?qX$ZPiyZ}8^v0W^tNHu6X_TGkBZS9r6_%u73h(5sz-=b*RwufnXCAX)q9Gy zx4FAB(X?fXLTADqVONKrf|su0Hj%iz6f)0B){z72U6=V-Yt(MMP7C-GS&>0XP-w+@ z(!0<9udl9aB3&ENoVQw)I3r+Qr&EbZ1!hfSI+#FePF?QfZoq81%*H{Y|ASgp)zY+6zS=SH$aPhV78g5+5L?dw-L*qR5tQ~8<%D!JbdrR{$g@8+~;@d zFRIIDsq8#JZWVa8)^O{WA-&g1J)?zGwUp#Rky>hG-AijF(tCB5>;N*dSyw|@M;jST;J1@__D3+Ce~`cL;%fzKWLH6N zumXKp=|<$?ocgRjXT|L5>T2|VGoS4UIz9jm>%udQCwA-$dQ}9x$ca6zNq*RotkXiX zEIAp8*HZV<_p*_BS;v)bS~u!u1NE=^5Jx3%3g5iIC3n_9Vo-9IZmu&E9jhE`9I=l4 z^b;>Lmzx8vzpVb|6r&K+tp0XxcdvIPw>Gk;O2Gyn#&q!C)sVn(TZU*;7xx+wWv38UAwOypimii^y>*9&;F$-nIyKWHb%y zU{5@oi--P$2;@B+uV2V=B6j{DuRaTVzK!2cMEdsg*)e=9&#{C5W3WbX_8#KOy{=9c3@gnn3@31!@JT{ow@=LUXv^l}^z zt`7^w=NaR96i6SUyEN;yVHmBPX|abY+-PFS%*5`XETFjmQ8fz4ope`S z)!K-)RMT3pV+ON+HWRj-wp%|at7uLwK#b}To3)u*2`1MM(JC@mdy*cj_9UXLitX;l z-^}7K;;}3CJmi^V?bFF(cc7z-cvo}K%h~wB1=yA8+?#@xIL^JD^cR0-h1c^~ES}Vs zbR4zQ&Afg`R;Vj>rZulIHc8fpS))|yRWhf4SeFw>vY zv(Z(;al=~V_=|Hs)>?P1!_1GCOx1j7?Q*nt%ycAoZ}JRv<}fCR=A3|<5|&_)dV^2C zfp=)~GvUGmTe6YpfgPxkgzODO z>S5Xwy{O(5F8WQP+Okw`@uBKZx_jGj(#1b=x2(qs55`hV;CnB$aSIx3OLGjeAA_vt zA+^rPa4NF5x#Bj0o4|b=NjZe4+{pFziHZx*;Tc#An=ur}{i8{%*adml#7}e}Ul@Yr zvHhrnxjwCM+XY}8o3L*<~ve3)>?C{daf+) zmd@9l%r%Ys_9V|Xt^=OZjxYLRbtC;yr|8}9PQJ8Q{m!f1BmT7+m5Ye4>e4|qUE4+M zaucm6g1+vhfB7$L$}p-CO|`Yyroq}W;&eCc68p^SRxojg80VPC=95tZM3HQGkoF%{ zw`MEXPE^%N-cHLBV-2?RbAFT5U>_vO> zrWt6gy$3p=s|T@3E0eApimt5S@9!Y#Rzy(!(e}#3`-74&fMdjpwcx$CR&Bq!l2`4+ zGud-ACSf!GB$Dexw_lKYT3N5A(ORg@lw0b5MibxKT%NGb{&ueFFrvNgJdUiKv!32{ z!F8Uw-^D!shz~_iR2@=eiLXa^&5%4H(VicUC$6;qo1Oyhjm|-w72L$t!`a=;YVG8t zaIfQ*W1pv|*<5B;|0O?KMno&skyOT7a$8M?n^{e+b|yl*NUnZgjVGdRLu@@L^eR=NTyo$XCUMsc9YF04|>nt`Yj@O;UtpsRlX4ry} zqBf}hb&!hgoafbsDJ!ql9QqLJfUkG%tNy>NNn*I}@s9OQa!#NRwXgFJ=Sat1=Xc-C zB84jjRqs*2AMA|q2L0n7>q#H_$=5hg%m2)q7%1#t?l|C@>?-W);OJo$u}V7od2V^G z>Kbz_Q!)YL5j%Vd^|X&lc{*9sFd-z4DGQmkNop--vR);=&OndhI532h=*kr|<*4!t zZRv-s7Aga@srp!16NGcA*vk1Yt+jGW6>{XVbXFuMKANiSV3OcN>Fo}ETc?*G|Ak1+KF4bS8oU_UPr!C3;$ddM?(Yot9Sat=gk50shU&9FZj&D! z;kN_Oft_f;QfyXu5*w)rvhRV+SE1QCn80+9GxNUl+&0^89aevyQUSkNncB@>m_--V zoy1D}z^Ha84YWd3b{Fck9S!_Be&#Xwiv(wM*K+-EE^&Ti0%-?V9p^DE1k^{W zuc;55$D(YKnzSfdp)be=N9dXV~=$rXjz*AMw@uh9Mj=++hxsk)q& zc1!D`Hd1DYRgP8G2Ih2CVSZ0R&EJX3Q*bU;06s*(b;?`JJz5- z>+n?#sv1&6eDOi;AU^3stpWosH%Yv$lJf|s@EiilagtA)f*UwSO zuSq1IS`^VTXj8O|)J%tqDOwISpAyV#j6o8mlXQ9tGP7$wHhZ%d8a*E?vI(8E=dsu} zWjZohh-7wSzsB+CMQZ#Z>RY7#nY`^d`NUA9H;Df$;U#xr^ADi?QCRs=?1u)}xD4dO zc1Oitq!~fhe~TSt_je8E`WZa?BIQ1O`2y+^Y-8|W0+6LidVz^d)q?k?=St~yc_DEKF`PuJ2R{KcIol*x7xE zAl50_VHlnz@|X!Pb3YZ%cx^phvKP63St|-oaD-Y#9R2sx=w3~sRZ|{l59ndeBtOE( zDIntL4qz%TkEg*JHz5LSfhD&)*ld|i=Cj)o^KdNgawKf?5tsAWY-DWbu`&G4o=q~3 z)%X|haSoepW3zUJxfwd%66w~*H`Ksm+8rxBdCq36YHhq|b=IOTG9E}QcAO0AE}v#8 zJ9HImyf`UxiNzEAp-#u1o>rQGHkHukD96Qqv;it=m8jrv)<=5o`Rn?s zII}v>`A_;6dDnP5`dSx$T)TD19`Cl0VZl3tzLcujw0y&SpGemwUf2uFhikp1KHAH6TloZ5J zZl(j?0vS9i&Y&DOKWY_g&Wd?G8AG$pbyYe?aWG#E5 z2YNb?`cqT#-FifX6|p2yMEbT>tjlv(CMIvl3RmKqzP#=XWd1LHcqjV&j5ufm?_o7^ z-_9p{jir3RJ~*aYOqj`~wUjG~#Tqj0q8%p}6k>Yn8Y-cCt?!-zzF+RYIfKo}bGJyk zke%)e)^0O%P+L!@f#F`IG$6SeKLZHsHgnSuKb$>(AUeG2s#wq4@?Y}D|ok{4|V zCMT|=ZK3uNL)<-I{4#uZ)Dwx9W*p4 zSFxwtj%DBXM`z=a!ceGkB_9c-br9ls8$um8{!l?A11Ozc1LMJ;`b( zGa|nzG33qtjgRPeYbu8mv`(P>`Lv1PUJI>b&IC^l*L!ypSIvSAYlXI%UMSwDhc_q| z6Y{8XNM%n%$&j3d78gI2Cp=Iz^i%kfz+=}|-)wIi&(EMGVSo9?VwqxshXiG{G71A` zfJS%ZdZLk4)Kn`_8`{KVjbHQvRb~~AgU0j+&saosbDmF=AM`uBILVZvdvLK-CapIV zW#~;7uvqF7OBT~UDY=;)7^GFeT8&amYYuG$ctTBN)&u!8Kpu8&G8Q{B2$|c6)>>qq zfaDG#b=%eq#FNZoKeWegbVE<)E1y{Fu1IhMI(h^9z8O#RjOVZ!&33;;J5B~^hCX*g zvs<#d%|SK?^Q;Sb{uF9P)t+FSO1%flyBX=*3_LsP+Rn2M)RKuQobItsJqTA`ld)!u z)lxs6R9S0*|6hy+Z7m9NT2W2?1G5y?d&+y#7yYx!wA!EY*9zHOs9fn2u96`;^VP`R zCTLX9i=Z<8+(9D(?fo%9!@?KjEfHQgxTEKRFTq#9)5gi|^1Shl>h?Gyus&!RovDQ_wJ>%7$>J2>C5Gp@gv^(Hc7pTQ$7Rg`_B+``@A$^=o zG!=|CnJB8-li-3lZSpZEle}U@Bhk1TNY(DLuZK0g#;&%b5Sw}58QmO*3?{Psck}29 z9`A?l4 zj_2d}COcQX%Pu_!s(uhpe1`vbqxG+N-qGmIO>*s{>TPA3mX{jjHN840^&EIAt(fJx zl*p^UMi;j3rY@AsSm@a8`H^>H?)G8r!(N5{3bgYs2q~W1A9N*nXXvuvr6G>6Rrx=L z`GWTb-WU3k=XTIQZ#T1?`x3ZfEq7seyfd|Pp`Js`0$upQB@G%6paRAe%)wVP>|v1AXoYma!53aWBpkP(>8;kcKBkyMA$y-h_#I z26LD5M9{}zZ>|Qp;)5II`VtfuJfg<&hO zc+Pd`z&Z6L(=E@juir4sDukNb5V_RY<8lUaTF1crf2jkRYc)z!I9oCmC$K5LZTUX9 za~Akep?P4WXRvRXe_LR9o`(g}<+`1BX1-SuRU*FUjtnXm_Sxlig*jTdU52lXzM+J58*ebo2V*$0w?zEo|GH5xDb zFOlMIQNd_$oB+$6Pfu_|&XM*b^}b><>>L+8XcefsL}@Mbg^t&bXVxaou2HT*=T;zX zd%i>r5?_FZ+Z7AjHuOZF8=~J$(f<}$m#O?;7a!S;+Y)xfK_tDNc(FUyy8^po85TPa zQ3@0B(EeWhtwJnbiLY8bS6|jK0X+J5ETYZWx(Dl{4U?tpS(a|1fz!N?HS868I^bud zT3FpK>$v*poUN$03;xqR&^~xoCv&W|oO3w)TgN=p zeW&%AvOfJh9r>E5x4=)N(aX#E$nicIdu?qL^`aE;5mK#1Y3=*BfJtyq08L(um7+cL`a?QHvR~uY#M0eJqfte7oRMK`X4Mrt0~_ zQ{NvI>dZSj_q&Kdp}2g1`dftz&7H-++8JOYaSC}&vJ@DIZpp+jJyZy z@zn35INP8O69lSqdkyC)>9HrM@R*m03hk-gHu~F{cVbT&v3p~t@eb>%+qJp+WYI{kBVT)-Xm;K8qv+3x zNtg9#(VYmb1o2q3c&$}7raK-uHu@(8zj3d2W%f(&V@|6s?P}aN!8yrwWoUW_-TlnUU^)t-lc}%TTGfbm|@r;_jeO~lM z*bP&t?l-0K))qcfIwqR*GlnrCX{v0-9PCIqbrYF!T3Uwd3z-N~!MG?p;REi{FYZD% zm+)5eu+SBlFxZAzw+@;29^}0d4PS_DnUBV9z`iWP)-LCx>{$@IMq&Hc8ek5ND`_ddsUIk6>hFveiBX)#o*Z%F(Q2zkAI|iO` zidg(8yJbErmYe;yoz=9_%!^#g`Cqe`Sklb!!I;jW=jKetipC(Lv3Y}j zwkJkC>p17#r89HtlZ;8mO+(|XoMUtuZo&Je6gyyeZWc?ijy;JRS`pzT5+xi(pWnj` z3TQjjMr3j~v;|o6Xx3vC`fYdH&gT=`obd#HT7s1Jg9@hQ#DH!{s}+9RMMjXE_~INg zUx$TmjL+P_9%w`ySuM$j7QtiIL&sZluRih|j0X3>id6;6YC%TU2!!PU>%SklZ(+BT zBTwi-e0ZLBIGNqGk)3yhUehP=mG{7KS*#1DdlC%&U&J zN_KWMw~9NPILK)_1;)!z%GKv^Z{cmQH{^Z=o!RAFvwH}%29B-|xoCH+L%4qH9?7c0V2v^#COLyB` zGZ&oQjj+tZ7Xc8q9u zwb*?sgYd95u`1n&ENy#Jk5##j)jvZtc$hO{I)Obmhw1zdi(+%8$Fl=0_Skw>Z9LLG z&wJd$DwmQIwEb#!(TH6=Q|r%p+@nB3#;WB&^(J#ZkO}W?858sG(*gB^pI#e(TdR#9 zMpa|8o=@Kn&!sF=xY}CjopoKsJbm21IInPnUeP>3uR>oUmM+%sjth=f&RedVoLh3( z4C5S{Oze;zoI+lTGY&UkBi87dVBhI_N_{#N@Jz5i4icNBmz|6hYEA8};iul<)IIbU zOps?_UzKKOH|7)DnpcK6c^E*=fjCQU<)-BM}$w_;q18dfpXr(&e%kY(e z-To7X%}@9uV?Z)az}Bh^KAS;3$Sd?i@-SA}QFaIKVcy+Ur2mkKjdesZ)k~J`qciO_ z=;syU<0!I=?#QL2?5QSA^pz8lKkFunKqJd`*EXy;%OQr1OC9 z@#^BZm~Dtr^SSq#|HOC^t2Qm#w~A6*(bnFZ5+kS;5*1q#5~C3jGsKF7h!8=DEiq#6 zP0Yl2zc=sa|H=5TXPkS^@0@$)P4fEBna3S3R{_sEo+G@@dG_|4>GE|AV%AX&r@AwP z&ZRY(NLbZ6Nv>CC@}qha;S3>{y$RXugY^MCrqc&BfWKYI0Y0v~8C}hGvWmE*Z!~M* zL*B24$qcAi6$I@MmvzHq-5JVv()Nlbmb-qIyLtp|w-LDyHVRp3?5C#Z>c^?<2$y2< zDXT$sZwkWxO8{^0;M=RhR7YR-0oS0`EpQ}_HR~Y8h{0qTmWOszpz{>?dK_!k5)|vg znN^(bEFA$#VRcs|*7As0mlvMqG}f*Sc1nKnkSn>$?lTBUS;FuAoGppRabCTq{f2+{ zHPo*va-_dr&+MX?W6m|RnDCvt;i0QdO?qc6xPOTdyp+YE)CjAF>$CM=`xbc@Fs^c2SESDruWEe9$-%(qUhc54j=}(qPHkAt$`$#Ts2PzD@V(s-N zlHY@@wi>MNNV@k;;FaD~G5Nyjv-DX;H`z;@BFKrSYf84!MfRgAd>qvN7OJ;Lt9=Vn zgsWV7XS3V@A3tYzeF97vNPW;#{Rx>+D)uuGt_wjnhJq1+NV&4S45=B5vzNzROqaDwgBh zUw~ikEckXES$W8h>Y2MA9eo7U+lBr(iC-Xv^+@OMF3!XhVDX31#q`tL<2N6Oy^}o?ERS^_KM9%&|rg?W;jo zoj<5*c&z6q^U)2@YOKK_l;<>6se&_e_U_Crn8=$iCarDGz-4Y$Pn7Z;m z^c4JIpWvKpOx<27&%gR&5LzG=YqS!+W;gK`>-{s|ugh@?fG;b_ zN?E`>@CH!$K0Qota79D3b z@*MuUz(qB8ZdU&g}w?`0BpV}C2vuE(_K)lQOURi}X2%{Z?QAnW7;NSq?yU<>7E zLckE?I$4Ls$#wgasH?B>om`6SZbW+rfocVaLPQw9=$DN|>n+uBTi9QYqmpbBbz2AY z3nBr;`~!J=NSEb0q6U)Pp54bUAZlF@J&+pbeN+Lw&~FmqFM!4yfSq=q2=z6Nf15Kr z)bhx}pj1s6hiw-FZPjd#x8ypX22FQC|48;ogP^M~=p4yseBteB(Ec}GRkIR;KpWL9 zVGF;P@f}a7SB2cT{9NgN7y%>pd&?7GW*LInR=Mm2?vH^=^aEq zE0cecXf~4Ps00s1nie1xbLfz9o>hvM?ZDXWdR}V7)eO1Q$hq=HwZmo@m20hy5()B% zzMTDa5`MT)G=E8v1JAtS4i15rYgHuE8bl|=d zmg9c-dJt$mlCy+Cg=AJP8QVtL?-#jVI^cpG-pteRA^ZA!yeL(`m;C%Z<4y*N_r_vu z&f0iF>+_DowJ0m)F?qQfG`|ivZ-mMhk(1M`{ztJJv|Gh%yOFC%-Ytxebq;hrOts-I zGDP<9_a^>7m2=sO`38CPi$rY#&1qgo%179(^{aXts>WZSBa0Z!#nY?l_r*4%A8)D0 zeFkD|q@LNE{|1tKvV;3P%N@G0|L8?bDqTcsUu0YAOQU%#1Bq@S8E*7*8tg2!`Wa8l zPd3lPoqM6gdL+CbG#`nEbf(WF4{jjYZpcAQJ$@D#YYgisYmS@6XWP-{Axav;`p zA2Rn#;?)o1c_FA;hi_j+3pBy9?oD0bB(&%kau{{AL~+n9739AN0yX5*_dxOeAjwtM zAqQVXA-bOz7pn3><)Lol=Lngn&qO2@p6OInM$-Q;mVQ=W>BaGa^d#qM1o_3;Vy~H5 z-q-7yUXy+bCFoh4qkEEjcY+QR%j71GyG-*E`3>8uVr<7Z`~Xz&Vy$Ak;s?C zUAu_&@Y5u6aHFsqL#Xg6L)~aovi;-4ZX*SMW~=fkA_7zhN0*I6x#fMH;K|fcxvtE~ElT zn~o*13*21_-yNh2W_MnF2=2b%wJ0o`qU4>75KpjDi-6Rpp(iL9Y~Smt#=IWN}ceJ+x`{n(bP?-Lg_B9wWDhv^z2<>euPhpC zJ9JwI^*@7|Y9d)xq01xaH8*hIAN#ujKP}$)IF^=c8RKr%LC3l!lGFM>Qvr$}JO6az(0gJfsOKx#);vKw8JlhCEdun|8K7kdNNjF!{Q zn_m7*hMGawv$|#~I`S3u8PmxVKZqV|s5cTS4{8c|DqWdp@K!Hvk=xFU!FAl>M=*6P zQm_{Qq?F1o?MR)tf0!;vI_QdKa=v%h3ZJsis%~$BaY9 zzi4j6wq|R?Skfz*TVjJ z1tMKWQc97lGMg(q!!_PUv)n)*D1T-IcYBEA6=FTU;|e;GVYWg}WtaI0JX8L#Xs+>0 zE+6K{t9o7@AipG@tdi@@sktCG$SLOj@^8z}vlm*vrl;AI8SN2dzhscJ?qP%=h4bZV z5H}KiAC6u2wftQ_WaZa$L^Jstd=(EakHB(Ug(u<~(ZIt-N4nP+G_t|*OK49EUHqJ0 zNCSjFG#-wZRrTob=i0gu!SO-sywx^{+uTzHv|1To39V}v&J1N&$5 zw;wujJgXlEzxTvC-v%vjYSppLm8_rTSk>8WzC*Jv07F*bb@7I_caVqY9PtIantSx& zst#o z@~yALQ;t{$YpfqO)dQ=yp*nmeaeXJb@>uXKL=LpOnfvepY=!PAXjDHr$H-s)XD{2C zYY(*cQA;(39>xpIy7W~UFBa-ia-X(YWWs5i@wf#eRTDHp<>FS3_k?)~o%QS7(Mou4 zCYDGMxs{I0N!E8(E%LAmvrj5wcp2l3zD}sVk8k=Q-77d&5*+&ncH$tOmBk7;B$jdS zms!ylP%R3MNZ|NKxw`;71sn~lD&?{w# zkI9u9V@uEcESj zsQg50i4Ua}_jeYKcm~C1a3vwE_DT@_6Z*CadiWUpKZTjst>pv#y9#wGtS~&WD`Pow z8pqzFRg~>2UUp5Qj?0J2@^x4)<%}*~3%&g90DG zp8aA5=lh%Wjo`jl!P`rS|E&|z(#=>v<#H>c&3|Bd=rTnwXMQoeTAk6sIr#zLcIv|S|KoCp4<(J56~5E!JgCT}Ap89a($t+a#BtL5%@K0(DR=!7h71X->%#RYWbHF$0u91@SElESmk zS{v4NFxQ$-T+-HHg)}Ea$K`d@>?~i1*W6b;QhE+c2fw?RUg?yTMeoIyScw68Ij=Kb ziS|{ix6|2m$XZXg+m%cUJ8j14ACaXvc(Me;^9DYgrc!ll zAF8Jr_0hG(^y|d@hU=rOozT9V`J5ts=vnCDggI?g&(UUXk)?W zYQ|k55yq8eYxBw0afuAh6~=j@(Ip3<`#!F;7+&=zXz1#E^9K1XWwHM{VM_(l8G5bU zj%=I(^HW)&EbOgX#!5TX$ftLZVS0Pdv*jy0QOp9n3(Y%Oad=K{8w<@#<|}d#JCNNl ziu=yc8bKx1&u0Z(mdH6(Z>2PjwT~%PGqoJigGk^Du}zyS+OV4Lbb+a6_z;!ePCt>K zbq`{6-(%yPgwprwOOEa+SjgFMxjQoDVUClRk;iE6_BnW}dh{ir=Op)5 zR1Dz$Rac-z&{s{goyIk71gTW*!){)mPh9h%R+upj9KeFxy-yNYe{BfA?i zOvz&{50zgby%ktt0m_`=s>*@-weSKI=UP0ePrQVs_br)ygVD=xkZjc}FcypGDCmES z)p&|sS&@C2s$=}D{RyR)!|O5Zf{qjY{9Z?7Nplt_9CU87>|DB0)dkh6nG@_Fc0mL1u1u)vQFPmR$k-bl61 zPUF3H(u}5tOT~+eQ5p6Ht~?+M>P48nRRM3)9;g_~nbn*LmAj&94_Bcf4smyLL71J; zBoS+WD(C8ty?&c@{0krWF?@!t;2=*>tR21{10>2Owp^Pt)L^BLBSk9C{2SOJ;omy^ z&L>z?%=X0yDbziKCAs%e@P@n5TsCG+vJ z`h(}A(OoO)=h>TeP?^Qui9xA3o9na!vXHqw-;GZnZH-~=6N`A74rNNWX#cKsJ$_DlrFMTd$8YJ z3K~oXL2ls%D2V^CAS?YJ@fONlN9vZa3P18{EhOPJR9Zmh{$%W^2fVw9Gfn6BDNyVR zRJ?)SEiIm-FIqwM2qF?eaQY%VEGzJA&Ec_wJ-Lc`D=%^Zbj(BHP+KAF!ggo-5q8FC zVsi7Wxm0L8FiM-=#yWcLCSYlpqQ3~_T!mS&D_CKwKbWcoyv-G=9Z5NniZ+XrGw5}9 zS$KHXDgRhc#`_SD&9InGbjRqlGXwwCMr{kb*!Ae}XYff`;YqKX(Q*)Z@onL+-C7-S z-Ux6tv{uNENWlxRrwV*l6RZ1(_7(keqN&R{sAUi-`v)6sH8h`(cDeu!RwKWvVrvbY za2GBtOa9(xQ2!Dbe3EqOKi0}tFHIP*6UxVU)1C!2#UPq9Zba{0ClyU+62 z+XmL9@&dRc5tXSJt0uN^tQD-W%FHW-zS+Y!u7WNVgs=XW{Fc~A9JD@!MG}Pfb{6zr zMuy^C)?+ohs{`0SRk1K)?dbApcDl8Jy3YsJLhR{sYOV{Dir3Id;Q}_iw`4AE z;p1jl5Q&^`Gpim5tuMmgXThrgC~^iGB*62YXwLxZBu*e%^|4>3s>*4tIP>vd;mz3q zze{MY^77d4fP@)b!AW$}H7xoTSmr8ozA$M18p=9EG*`1DRbDey#}LdX-+|C-hxwQ* z8BK46IO!lAi@@>q1p9bzF%GA3F}cE?AgS9SX{v#{S3m^1-F|ZN4LPL-B7V2d|!fn|7+;~1U%Ts zzPIIyrW2dlvm~y{w<@ADt=ACHt&3OrHzab`#ajIZQx{)+4a2+KFJS zwAMtleDMUf=C0l467#Is4F8?i{wvB7p*v&zs5g|h{ta=ri~2mg;H~J*zm6QC9x@QF zC=B&4!X-QSj*6DQ*Uv$}!`fPUbwAVVlMORn{}umJwE0>NGj>VUEm&nIhQV{2pp3$g zrPwD4$o6?Gl*|0a`s8s&Yl+7tgjHDtns4Bpy5bJjN(^$M>i@g315QVG!?Wk9jt@Yk!KVymPulLtS(kZuqRnG1s{?a;7zZe1y3y6d0)H`sEA3I$syNU98 ze(Moc6}7EGe0nPpyihUO2xZc15G#_%r&SfLs*O__Tg&0Vb5Qj?Kj~2HFeq}Ab=*#5 zA`H7dij|2*Pk$#@p>>Y)>L|Xc?9VVhxdVNuW=p@s*303)kMRFBR_+S8^bM9_cVw+B zn4VX>0rB$+mGyjs&NQXPInJhH+$GQjnc&t5(5MDdQ-oD|2!+RzkGPBM?sTXgB>nMX zt!4#U%XsFilWmOGWhL1_W2~`ceQ&3mb-eYjr8&c#eom_WlkPCXD?uB`ET2-YXy=@{ z7;7n$mHr(rjY6tb_S87xCkGlnbZv~FvuCuNNEGiEBV8|Gu9XS&4h_J;#Agby%ee=h!HmKKDh_#TLA^i^&5GrB7TKUc=oy-v-5}(J!XBR}Xu(-WhanYWAg@`6#Oo6Gx-1 z)nrxWCHtqlGuAo=Z?wQhnxG%FV_f~|8+McaShr%`~Vp&$}$egXy^tNqj{X|c!239Ytwe9W9aiX14)(PRynXZb*<{oE~%ik62 z1d)?b4v&5_(Hn{1kgLVV!0+Mc!K&!HRx+Fnn)7nJQP}pdijuq1OYbW~%n+tC|7!fM zyRaN$;i)y+Ni4N+_*VIVBD9xcEdJOU`WvAt4E^BW(M0}L&%Jfva$o+cY|KTVit0e7 zxSUq%V6A~Vd$2W%iH&%D+R7IkNmaio zPw`%;5(VW{M`nNcb_t)GgJgwZEe?eDhx3Y};}h(N1n6)PU7X7G1c1g*k@9`eJplj7 zTh^^8)C<@Ap!8IzucCA##2B;z`2|`P8Sc47e~&KAfx5TRi>JYgY^>t??3?w7H zsH(Ht*p>y@mtF?hPk=?YzUF%#HmmIbbxG6mcbVLgmc4r090G5 zt36u{1J& zn&^$OS`^kihH4L?pz;@ba~~=Lpq6OGPjmRW1|0nwS-Hb!GT|_#N3)@OJbEORS6{OJ z1&A8&#YT)K7F1e)2bSkGGQ3jkP+8EJKm;f+bv|+Q8J(_Iu`1e&K=kjd9rWt{4At9^ z+quI$D2q{NG|hSKJJ+T_e9$3LO@q~upSJ_AJiaXT2{|hhN<2pU$pY~gQA6DoV z*~GX;cf=aZTdRvlFGjX8X3OV>w>{eY0{`vQeDF87#cp{-#J?`qPbmJW#$vAilZl@O zi{u^oRQJG+Q2yTqr~C35H9sW^F7F0qm6v`#G(EwwRG$AjUbzD8RW02sI51Ac>pS87 z&tQEx&mW^XtBW(T4H)wSKF~7k{>MS%v)V5r1EkmvhJP)x`K}wBn-@v_k-zxKu)EYd#98U3vRc? zf6x+%y2wuQS8USO^sPt|nc7A%L-vp#w3>1$nHa}7gDwY(qgq?O5u^K}1IpTyjCWvy zn##0=eRzm?!W|EQPHJ*TK5Wf%#2u8cat&A&16t02r(1~)>}AG*-@g2e0^dW>0ZJ1n zTPB^Otk-~;_4sVA?FBQBi?k%h|AhZW7nhTSDvaI{9e*HdaD z0ZT{i@lW#e1nK$2`h>8)x3LF{!tL*%?Hl%kWkKvixmKo%^1p({DuNY|3dBNOSx=+v#!agLjbgSPf6eORT8J^lH5)+uN1xS#;sQWYw@6*bVJ0 z=KR(Z>$Mkp6K4t?TMD^4xaPY;?KCC>xto<_Z7~dcMa_qa)dqtyC&gUxmp((P&MNQq z@66^#9=$6Pnan3th1w8itpqYLa+RU>J{HaS6Ud@!wiNfDhj*j7-#vWlzWgZ8^4%?X_HT$pX4@ySE<5;{ z3pM_RQ+Fc&Cs?~p=+P88OQ@L@1;rsO*4tdo9IX=B21(c@nW7B4he@E>IIPqqxoiCw z)U1O}y$|N>;v6alQ38$nlK+Ys+SN`p=XjP#}vI{<~c)U zf~Yxdd*JPJR7+!DLE*dXP8NU<2fz>2DN9j(0(`s+o{i!g^WpBER9m$s3vLk9kKoKl zpm{h{yZ|mdmGNls2k`Am=&~6bV+Rs4hZR!Ypj1sjCXdx{NFi}bz9XuCn)5dzA95?) z`-JOh1ApA$PVS+F67VEEfQqxR5Y{6pEwo@!Po9IyyU>>`3eu z57&RpERGc-cUujebGY)oR{>XB*GH?ZR9&i-HzOaqdkyh2hd$^N@lP!> zF6-WAFjG5ATGIKNxd+wAbJC3>BgJSj4~-Dc=O*JfuS6z(Q{hnI@hhA@1j{sp zy%*IkVkqmVa>P{5R4q9U>5GErRZh(#F#P~>bf4q-Qz3ANocS6uoVu;c<|_~-L(FH_ z5l@cGWsv77?=91tQ;kx~HOMQv@=mYXb|2@Av)vAq74aFK(O;Uytb^8EyNuI|?$v{w z`A&*c!ByV6CaO$YO7<}s_dHOH82{6)N=8Q9{X z|H(9Xmn07hE>&H{z42=-fOmGH1$Sw__!(3*UG)J{RmXl%tuwSu=f1~-`u(8GuWq#ggk^S{y)!eBfD%j{VjH3pf*8F zvua9(SYc3jA`gFd>+@KhW?)mVTx^*Dr!LZFLOIpDGnI#`Dv3mwUBym34cFF`$GQ7t zXk8a-PlMAZ@p(U}s3xweik2y?VImqpp+PV51-j#h8H~J4f${;epMDtriRDfdo^{6K zKLDDK;HnP6%_{a8gH9O(byng5Q1O;{EG##X13Koxd-;%FG)?3%tEpEbGmSM`iJjg< zHj}^5ZF?^i-;OTL5_9EMy{y%*a>r`hs}^(Zp*#6&GeJy4OE1?KY zVD_}u+2g4S3KaeD37FuZiU$_N7TAPLt4?lQFIhQfnYZ^HbG;*pr~a%f+NhkW(jt>N z7@OdeE8JB|E^jkqPu!&wt1tV!1bGIEsxF3OppD8^{(ql@UU2pp_CZ+naM%WHmmaKf z3X~%+8hw(&xij!+r-JX#u#u0jW)0A{BU!aU9BC@w+l>yG0PTWUt$6IyCD?g>@Nr8d zW;Blo*2fR2QJL&PtcIEjGLX#dA3-v;W~ne4DKxX066!D5cw0n`tK>T1`}3Tiau zkwx`QZF{6A9u;w&Grglj;d7{dPbARGHl8}0O(L0fVOoOjQF*(!kM|Ewe@se=C za1n1bGA~0row-(3%xG$*Z&)GLU1|}#>kILZj^G?+iP&UweJR|Pij^JK+LQ0RnC{Cf z&DzX($uznOreKT#D~?ZIOR&xY}7mCM_j*HpY+AyX{Z70%~Wmy!-} z!LL*)Y+%0|#}S5Nfn64(1lii+qnY2+#~cb0sU7k`cEv-bPT$sb*ewU(^UZX2xrj&q zu~=el@Xn~{!DNm9ng_^D8Aq&R098LH!Ig9~+?-`ruufUC?BDSCc653=TdZ5mwkjzb zgN&27lATT2RG8X9}_J!VNVlCDveo1`nR(J8L(D4#f>^%1MMUNwVe5meg7>uUbV zpX9N;K|cM!)_zd?Z+P-A?pCs%s!C0D-|Y-S_rlAfs;(x1uWG_p99(`t`&Q;f4<0~+ zd59tG6WVFzsMS~ib*8eiVesf`R=fk>?S}M3@Q#|~tg?0&^E-|A{$b_jgF}6x_9D>a zSI)i$X;78Zpsmp#~7Y-OjIsD&HU<(uurTPXel zxj4gW-#~Bo(JMjq5PGa^#hTm;?YD~kvWDHkZfq8&$Hi08#r|OHbgQ3aj)Zm-$#bbg z+-|x3wNu==X`jTFsfCXq)Y?xU(EB&2#lTrCaBqElRy}iK~RljbYk_?>@3wGihKo* zt@4St^SOD@cq*%`avDZZec;76D?;@laJllXsj8V|Rv;!dLeTGnnQ>zu-!s7^@% z?5A#Mmp$v-KjSg@2>M?Kb&Cj9?Q)wv`c8emyadhnLGMWDewQeFPccG&X#~s7@M=xV zvfDFvXfQd8eas@dLy4% z%1kgdY@uxPd$SdMcYsG6^j5tNO9?+?j+ricBEbr~C*yBY_PQS&c86(Mm1LxN#l7?s zDwAOVyxj@wco2_1@Zn@+y#q+S7+lGL-U-OpGivL8#}lunm8)#cjbLy$sMQ@hi~*(R zK-CCnT^-(6vjN8;W2!q&Fsm|{6;ycwDwi(+t{BFvs)N)hzU4!fgAc3lPwr0`pWF?m zUqE;4g!<=M;bq*FJJ-1asZbSV%|)zM)S0dC!oOQYyo2g*u@Ss-Gi8LBq5B*4m_;xR zdSAqbzleV!NgHB>nH%T|{1YBAO^;zpVMFs-QY+CK&digxc7G$8&L1zuM(wH$X969a1n9JqElT4R@MStn5mSIi%}ft7S$^h< z{*S!Jp+zvd=mb`OQ+$4EzcB$h|E%p`pFjo)lD-wWj^PeQvTMke{e|jEI}AFg-Yikv z-8$&g4ayA%E0hm$54?9IS9?eEYz5EL;QG1f&nDE>{=lk^1yf?+V` z0F$lhl_Hy&i>*!O6sqw{SZP*Ue2hzomkzbRvh&&nt^dZI(>TaW` z*yu#d*k2l+^G?{NsyAN% z&+kFw`Oq|u`%rtBb;yRAE3pU7ItiK&;#ddZ)!R^WJ*ad7+<%4?$Md*`255xUQjH_` z2VKTM)ll%|cdZTx?TzKqg=-1s^$@N@O&nSQom58FeAaUcE8HGh`tcn#L4Gk(lgc}4 z&$|h_tL~xeIm>*mP({TL@qZ%Mr}F65B1t`2nbTS~eHb1NH=%r*dBi)ozXg^`mOZFO zzVa_!`>Y9aJ*a+16eFu{tmvg*H~p-$y1$;6EX6o_@Yl8PxE#-~Tt%EX`wu3|WZ6E> za=Wcj+&skmrhoO~axPx!%CeF06;sF_%Oks)H_3$AO!v|-eGz_!6!9AFRk@q7Xm~fF zdP=J7W!0;B6|zgeHlpKg(44Bz=Ok^7=q(O#kE*751GJ5S%T{8q%wmO9AH2mBvcgoI20@*GLR5@AhQ>$M9o2OFr_=|qo~^-p07i{kS<`xP@c!Z|9>MxA-TM* zYV2-uu0Z6XJIK5iI&Xw8RQ19^cALRSV-Qyzi1s+lD(vFFp-8C@SMi$t{%BT1P1J3R IexITJ59WV={r~^~ diff --git a/deployment/docker/jupyter/samples/L8-B5-Elkton-VA.tiff b/deployment/docker/jupyter/samples/L8-B5-Elkton-VA.tiff deleted file mode 100644 index 9a574fce8ad8020d253435ab8cbf871ed070d97c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63376 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 M7NGagw{ZIWAMXBp5dZ)H diff --git a/deployment/docker/jupyter/samples/L8-B6-Elkton-VA.tiff b/deployment/docker/jupyter/samples/L8-B6-Elkton-VA.tiff deleted file mode 100644 index 1a1ad3c7f578b591326cbbc8a2e3a181e13a890c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63292 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

    suT*Dxh}H2~ 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

    4=zQ*gl1BAJ=4u%wk?Ho(8KLMUAbADLp>dA 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 g8`4W<5vA9hINbsWr6q+uPx%lZXh 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 G|I>+Ve+KIo>-pqWv~%7S=)V-#-4?H}ZotnBtR@ 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%0A6SGeba@e4G;Kw5o-8g9FW{ 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μ~s&Z)vUf?lPhkWV?JpM1fA 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

  2. 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%0DIr>au}%zH z6FViCKDc}Lv92;Tc~pvemxDK@z&<{&}6Ng+nHKdXHPkRrnthZjD-3Llwy z(939xtVH1tpw{`op16>;JmLuREx)tTC$P?PDvlpEuSYeGoeQY&dXEq5yQ_`({vDY6 z(xqChMRRxWl2tK2lJ~g);GwGN=bGL2xltC@ryq{hiMH4>>DOH z!4PL|BUeuSHxkylSFZ`5uY7_oHS=*_Wr{RyGZ&oh(>IiIq;|=is~Ru{T=GwCR`6Zw zFK^M8@lu3DFIbX=ru;Uh9HDzM_Tr`Pq3!)ayy7q`4}{^ls1b+cm4B1_Dm^P9^^fI6 zb%6{}pbMN$uut!z~~N> znC3KC!~ioJrnOj2Bipra!5|t16!XeaA&K9bB`NFs)vZD5v+(Mc4f2w=lvENs^cll7 zGlm;DKPZ>BZikmXMu1Rk0@^0ssYaO7$Kmz8Xp?@s0)dEB^e|7O+Ir}&0pc5RLi!>h z->uj)X!73C>I(>wJ=o_IEy{G%)b|EmpO?rGPOj6!!6huX^GTmKrGU2+ci%|DWoip6~js? zXT7X>gWu3P`n7qTY_aLrF@}3pjY<5qQG! zWk#OB&bqgrS81e5`|co&sEk^TwaiM3zCa%6X-q3Hyn23mn?#ow(1d5r_!ij53QYt{mtYt)i;6iJKS6Xp#3EXw%rA<#`2%>x7c$yndeTTG;ZB(DlQs zW)v6NFrN)abmGRhPGZOas;V243${nt79_F6A8xX0t&qtk~VFZk+ zlev?#qtxzy?^{1iWPUX4Q29<6x#qD4xxe!6gD1cnywHQwQha(vN??O?9NU?(V(p~{ z`}WD==dDqU@IW^-+3n@o+IQFA?a4N4wDZi9!y3GQyTx z$CYU)=@0IzZxd{aWP_8;pt}8Ky>`cgkJIJ!Q1Ap_O^yeLg!>w6p9+1X#Q;7j5 z(H2t-qUbe|T}o8rAf>Yw67hWy)dX*}qTrT=@C_6(9u3veZPBc_3pzfH{v68K{7u=n z_=2Z~Qi*Y$V8c)F_F z09*b0B~%O^sL8YC&-mspasJQw6a|8*zjhSK$eKq#8{hRFSq!om>ErkLDSr`0pS?pd zBnkL`>J<&?mkXF7>ckb+ckhI2;SE2L%O`V}sb!L`N(5CZHNZ3Uzf;#wL;J6^#GdGq zW4g47HoGwEOG5C8PeSHp|*<^QuG<0640$Va@IZuxX=b-OnY!kq&OI_L{#LfwYlDftUSiLR@N`kwHf0XhqS zX~hCona_aY0sjx6VE8Yxi|D401P~k)IAIkR06vx%3Y?L-1{^-5!&t<3I*-NzQb1t= zG^Jq`AU6iD&xY1)Gwxw|>$OV9v%zx!Z4ZfX3`t-|0Dvb}8Y}>qeb9ikL~s%q?-MZZ z+G~XpP4Fr@V_f2xBBA%*fBk2lq{A@|SP5^0T{oV0snbd30pJ-*Kf(gnU)U&@G^`98 zC`r=;AU9SC0@S@G0P^dw4}n+_^22VSk^*nECin*%wmM+#KNxQiS@0+vQ?ZL420%3? zbPIK%1{9VVZ6O)~Q3>z~R=Wa(j=2EcYa|hXFa-Ud3>&+20C@wRBZ2=-_5X(*yq1@@ z10eQE`XNCh_-r5$i%Ww5niy76V0BD+<)FaX_zBQC+fbEY7uL;e3GmMbGDjrcLS|Qh zRAW_M2*|MflhSPvIKX{IQi2d(8bIcOU#HYb{thOx4!b z+d-J>j~bW`w?x`_v8POi1?H!3jLgj~&D<8+*>5=@lIbthM|^Qw+DhaK8H(^fu5`RQ z&?ynGkUh6XR(}8IeZxyb>89UhC; zaBG?FlIh8HwylQ8w>Dit`~m3ZUjf%@ zDD$(o#mghp4&0U*olpkRCENEz{=_8Gpo_!r+bRTv?K{=85aBwD;PS@T5`QtiR7}rZ zj~4U5T=8Xw_n8e&NpS<@;Z=J(UjINePu+FvUdO*QXJD`ShA=m{K%hy%Qr@JW`B)Db2^&}#k>Manoj)zy&8as+?C{^r>TzMefgd!(Yzh*sC>>=hE|b<_62-&c?gq^bvuo>Guq(M`$(as448yb6l#Gw8rkKeMe2u=< zrRZ^{(1VVI%)YISXBty1#1-43IDZy5#JN=!#YAwd)uP)Edq@{P7-d%sRGN~C-4cYj zEE5;Sq#n@Jz?C-*74D|(W?wz=e;|c0ru@6EBOW97&a<@;NUFA_FH30A7fqD9G-?t4 zO(I6_*uhTQ0X{B9{Y#=GjW^=j8xD7ynn*79}ssBj20lG#5Rnj-iJ zMJe6wPs67CgKWs!pOBsbgXDG9jftEONIJt$D7EmChTMD69+n9DcunEtBu?0Y-?SA1 zTVqdc?(}YYaJrT)(DR8&L3=2C+^e%98^;crg+vg&V<4g5(&WGHvij}|Z#XFHdVPO7 z9;96@_5?#%C}~dhInC^e6g?gYCYYkhXZ15~!lNd+WR0VFxel?jDp7*I)OIbw`%r`Mt+mh>Gr#HkU!^#426SApfBj%?_ zONxdOyS0m_&D8!~*L|k)TQiyAdCesksNb7_S$oMz{XTy4pn;tb>&j9ngL(an)3ixr zb(kKe!gTquY&wGm>$ynaIXn6uUD{3bho^s5W)+KR)@VFF;kuJZeY-oB##^A4Kdi%GVERonJDY->cfc>^rB5i^CxpLOhDFS4|N8_YUdE zKqJUnv;HvP5$d$&`y20WMweQV{7OR68T^TubUT>t?B`%bp2tEmUh$oDRTpV*E}?`Q zK7U7dhH+4%y0mL$P=nUw()ka9qyyT&=;JhcGFmyIcjx}J2A6QqmCRFG9DZf2Kk+oe z7kw}n--QdQ{T)c9LQC#iP5#4U>!VWa3TTq$>rN<`La&C@7Du0-kV=}O%s}k;sip3M z6-t>RdWRGdp3Vk`(iIEFu9hM#;Kf5{Hma7y6bx}KH;@$-x@`M6+$frz2-CtY9T92U z)k0qq)xyG8h%`CYN>Fob(T2Xkm_|)-p+UPFm-*X~I#h%0 zvaH&2lmt;HsK{xk49q%v=v&XTTH56;Ga&hUl(LH-(vRjDdt7}Lti8*bI9 z&D>f?Vra>(7vZe3{RusU_g!5?M8m=_34#MF#VG-_EbZ%}R~12$L{tHOG|*d6l!fur zl{F!{A3|!JhxZE=y^ze#?O#GzL&l|5a_AP(E@L|KH5d;XyR_Brm+)iNBsdPd`lB<_ zL9cJ`!+Y`=>i43hW_SuT$Z8_yF8%y)T*`Ibc)q=wiV}4D)pJjiS3LQQzRbBr{rF@Y zbLs{JuVAZi0ygVII;lT$_f?V9<9F)mCo_dl>}Uz6FCpqaCTobbLSvuFAf?P1P;3Zo zIP=)V9Ek&BErVB1R`XtmF*yxG{sFSN?k93~3It~p+G>u=d+`uSt45gph|xp9f4%qNd4{)y-1 zz71t2oM#70Mt+YapJ}2kP51BH8iZ(5$j{TK#20lF5UWo&5EoQU(T)vFge=?h*`v9g z2KUx!=-qW* z0q%BkAjTFeOMfIH0ozDwlz(hXSu| zyPOT!O&^dKhK0UqSgnWJ4X`L+QX7r6nLEHK0&_F(1NC665`au4Yb_k;Nk;#d4Ob#~ z>p_LBX$D%wfP_VWc?LLf!JZj~5+JUPxdiAVrod`o0D1YnabbD8H&|T1J;aTrk8Prm zSbkjs!0be)fbPS+hcL{7bUjl;jJN`#WCGf_R^o&G3d8X5G39OFV zWea+)Vk6kONgLLG3s>KPovTLf0#{UK7ZHvxcdiQjQyu{h%l1FXSg$1s@T4NR_DNVC z&%3}>0T&&W9%g^b3S7vXZy10g--I6CsD zr{!>Pq!!R7K^^;{>QA$<+~b@^TBd){s)X5e>#@|XnmL>_hU>Au#_s3*<06&ZC}gwnM3 z84aq)$i9TM)>LZ0S$e#}dkQoIB!oJa7JVPZOr|a$oPArJ{uoF*e1aHZD$lsN($yG^EAAa z5Z!q6OXn31n#hz?>l34P_vmXXwEvG{1}n!B7qP%+Af2yK&tlk^^!h%6#tI+NKbZGY z=vwV$U2hx3|Mgl~=y|tt){yTtFtO5y>l{L{%fmJD z4LV?U=fnG1v@jtrzmtv4yCYwv)%d0TiSgqQV1-I2=s9=;RQ~y^H{{7)Jh2qd>&4~- z#m0vMBDluMYyh=A0?E$ilDK8{j8uMv!=~ggoa+Ja?uWVXHp=VSkz|D zn^zMy$1t&*QX=Sd(9@+wZ^|DZxk#EmhBD#Wt`PZT`dXXJ#UF^F)2Hu~E3!qjxo|Pj z7&4TYCQDvH$j)D}qtmfV`Q$p8xyaPs6vb$Cps-qEUFx zS4xA$rozFI44zc4DUx7#Z>1&cBw>&J+(#!rRmr!5eHlm;c)>mLe48uEHDNUQyp_xP zQe8zxpo}2b{&W7fWBsIJXH-fo)*%Ve+FmaCcs-Ah>pywN+&FZXoYX*BY}18bJnN67 z(wAQFR=DQeK>Y)n6(FTsKhZ*Z7i{ma_RAhuGuzb_A{u*wYr%x4lCUT6{8LjH z6BUD4IMKBW{c;Z3T?MesX`Z=EfP6afmLFw*8^Q&;vB<|p`eHRtU$M;+(oVVG98$y*-FN*z(Yw`YqS!ci>yfYt_!m2_A|}i%8?U!g>aQ1J|*HJ+P(`Uii5RlRfG!&r#9 zy{L6sex>c+{(x5qtQJamg$%c|+fij>`x%#{(?|2eq~Nm_{~*NP@A!Mlzk4JdTINuzq zscS*z9M_L$N|(XsM#E22qllfB&kGwx$z>#Voppz3K3%oH!T%_<<@(%RgJl%)R!;oS zE~g#W&5P%z=ULTMk4Dq{>wL9~*)^Bz^2=eFhVKz0`N#WKoHkpER^y~NtoI!^rP%!O ztIS70MN_{csF;OGbUK2@UQ}P1t5EXef9F)uN`Bt?P1fW8m^$mYDE_$HFWoG=EF0uf zA`PO_-Q6IF(w)*F9a7RI-3S&Sf*@T25`uJhOH0Qce)m4l>;A(_nT=s#X3qD_Iqy$; zQXn2x=p9B1qJ;6~!e??QJ~N3;+AbGNf}5HJ?A;$3reSy|>BrYai}0E_fLw7saMo(o z`K!;M3&Eg!O-{-9D?FrRBFO@gsQfQqIL_hm0$ob_tYRI?ZlNZ45=} zd;|abOVVd0#4ziR?$@l0c+nGh*@kw&y4Zf@L-p=;iUI?3eSRk9h}nniZm5y96D{}7 zq5{64HmY?IuF!apU!_HX|A4-d&w%HxcDG;w0}Wq7j%BBarz)cRxe{pO!U+^@ZaQf^ zamNl1`=!rO#?wzmKSHf9^K^S}0M)Xi8M#DOnONzk>;IDBDRagqyWwwEXsHRuujNPj zn0T0*aPq>Z_M5o0x|0uaLtmO*DMS+au)#VzWTK1-eIRr_o;!5-KG0WVCY;nEEod7z zOKf`A-1uF3Rpm{hMpU=jIU+1|`|bBHDH!IxVq%_Txae}a819RYgg>5Oz+9vGY@P_= zj(w#4o7Q-4XzMJ3^(UvcJ>I6l7h1>US#wF8ZC?zMmkp(j=YDAx_lr1IOnzY)%=V&# z!bF{YKV0mc7?(LKHcV>LhSHq)I@=)-Y)b#!^Zo7ipq^VZJ+C`(ACD9G;aGR;Vt< zHyB51qE>luw4&cIC&Kt;e1lVZ>xNOLn9=jd;ksje@gW3{%yJ&5zZAEL&GX9)G+6X$ z_UApvRcw+V%4~Qdj!@VyZ6y2L#8&;6#h5QJLpX5GR&<3v9~3xs>W5J4E=!$BGiiJx z5uvW)dU0s}&I<$EZ4R@EnmX-P$nn;;OeW2hlEK_A$gBcv1}FR{XLObB?s8@QVfaIJyBGhm6A-B@K&1nSjJo@tB7n;PbS~im zi9ayL%kzF8X~qttnoa8gQH}&^j$!}>>prL~2Lw<6?-+b10^rE~cFFP-X@TBghUdLj z4+F&h0Wkk7{vJowoLJY#eG-3s65DJ#bMJ|J{b#1%tLeD^^f5s6&G1^M10?hR`yu@q ztAXG+KuyM%?-v#ajBgr$V5W!oeG9V18<-+?o7ht99E7@%3DER;E#(XuTA}cc0~(FU zmOk#ISb)#*u%#a;jt1}|TIB$;2hYO4hy{tELx8=}0;Ef@7ao3CA@|2(TqXxTV_xG} z{Wa7SKrz9fTL&T@udmHo9_Czx106=d$S&drve@AP^oUlOgR?$9AVd>ubzLO>@Y8Fv zjaGHQ5nltEl(&f!-Q0&!01^xcu^=vGgDB+gc&6BYNoFEFB&rA!Jcw$)|3<7DF}?+n z{nU%w@A=F%LBvcaH1g_dH}uYgHJS^oTGfAo%O+i3d=4+%lN^-1Gb*sPpM|%RWC>EV z5Z=r!qZwM~gm~IgGU{6(A0HZ!ST8c+**aih&q-?IR3DSoGWiH5_x@GgLNB;rzokKG z(}S8t+_qU23%y_hVL8D!8!`&C*K`{E8N^W1CzHm=O4;YBwj&?eWc7Y9IB(|Gi${d;nMUbD?Kgo42UUJtCgOpX?wyy}DHF3UwicB^7Z!_h}%oWRQ? zmmLpAX`fJ#ykb_7>uVg=V5H{$;|HH$r?lAk_q-8V_A8h$=cramg4&P188cEgPg+cT z`riZeF1zH&sN+^xq4y6qELH)DGcMC9Z-F-i`v%?YIpR|bRGVVR_v&OblG%UIOZHSw zkWgYSxx5*=m)XAhw85;1xwDy{ktAAFD(j>OrSYPs0aA1euH#P=I7nbVw?_T}4`{r2 zy9Zt^a>9s3--+;31*)oCY#sdLzy@pe{!cGuE(USVr%wbq1N9^8Sd=rIOOJH26=yQf9t~ zf~^d!1}c&eP-zBQF7u}n%S1*_grqmOxfVVV_piD*KLjN}7Xd?@7A_`+uT}Y)0-8HY_y}>J_!QGD6^H%!abaiPV<9szsI3BZ`V#(UbMxQS#4e)SWtQK~s24n>~+# zbE-MzM}>2;5$ub+dMDL?vOiJdRd{lPjM;(#+e&{zP|v?`48}&NUsW7c(fUh@K4vM} zhMIniLnsaYxHFuh%=S=w6-Lb`uwo1fna*L7_2De*R;#A<)lRQH_w=zO@ffbZ82%+ zP)Tn_O7t&`_o!OnO(DPV6B7BjIx~iMq%6N}gQEC!)OpCi}CLtf_KCRkCo?=*F zV^h>KY^JQfa^+8BaC!peLajLaD}T5t?;#*>Uq<4=)=h551s|#+ZyI@(o)k$!w@K^GW_@s7y(V~};`(5(Kd@%#}t&uf^hK;Z~}<-i^8n#Nlshh$pQu)zR-{;y~= zKG^3u$L*W=IVS*P+&GGPKGFI}K6)Tw&_1OODQwDqOV|2Lq1%vTlBQSKpZQ3(H~X=x z8k*4_agja?A#Gy2QT|wzO$k{udYqOCrJegsJ+CtJ0KxO>?XYpFZz$(5CzZjeIx>|L z@{)$EoVJi!FEg=eAGYGj5OID&@9NnQnv_Hjf+W)Xq$P?7e00kw*eU#TYLE=aeo0lR_FCw*Qto%Y>$>ftX2wwyiDuZNNpCPDLL%Q zEm4CSgL_P@nqZtLn3aCW*1;Zrfe0c~cA1Ej!_-2lL_Eon+i#!xP0;^*q)1{-ia50W z5dD|vh|3N741MyY?d+jCQ!5iEj-^+E4!(MFICd%6x!RgMRI{b%3G7L$OXS{*dVePM z&5t2LyyX>CtYG| zc)XVs`OUo$RSIUwfwyw16^7JNTqlRJaHK=8FKORG@K{5~q@W6AZoAwaqvdPX>cY3&Ce0a9WRsLvJE-7H&O>J2@xcZ33#Ok zncaJq$3o|GA+3GGuA3d1j6uO@GgvX(l_G3gLfc$1WzP@0GVS&{C(ipXH(e=yfq!-u zDZPS7JfL{pQM3X$!ezkF*~DR>1qhhFfHqzQ#AF-sO^DZsGz*aXjQ}#e|1U^kECKkv z_r~-+QiJp_;7uQL{x|F+?_TFN0?%s&26#5#b2!9Ilh#LJEK;YhM;(*|VVt}Lvq`d*|U%1zOP0|Q>+94Q#+bYc6gYM2InXfvzD<9Dz zv;O0y+^-21i33bqV)f~eL-Wi-0Pzn~@Bjie#xRaGx&(wekd|)d1&sNNaO*A9rQH7S zrx)Q~fafjiw)o(+6tK1c@OpsccisY$EzSUc4*{%aUU!@UUkdAQ823|N24DuzoxE)h z4lH&C2!2K45-qLjE9472?+)K=^aH<%z+(6Fu(NJ9Kts1)t&v}bn6Hpu;x6#a+!r5% zVA-ZojK@nW&aq!4N!F9kuDV z7P_}}LY(1{uMKL@38>ETptd0{(yBGUKWSB*;BTIMt+^!)zG9|GJGbB5e< zqagULjv)mk2j;e6wX&mc2NT&YpFPS~(2)!9ux<6d zd(&U9DU0la6MT?F3?YWP^IQwh+}1EOZEUt$-fl!Cem_UBERE9tryt!4FZ3Yj6qyG7qN9HN=m}7!|Jn zJ*MwN8K`jZdt#Pgb5_B@ngssXsS;xCjA_9>PH<8dobahu^~@~|9buZEx33%&309(o z(!W!6m{Oc26%^U!gpI2RyHPFI(x_pzJsJCVtR~_xBL>;aOqKhjxafz?&$a#(@ij7p zL%n0Vyl`0>?}@l3dPJ*9mYcv6?|m4A(^Ob3^eslVuGtA z8z<=Z{>ZZ!q|B|v^g_vV6Y0MiyC-z#u1H+h97jtIa-;S~s=x7+zKm8fQc?7_m*%4c zEg<3PQiD4%>o6<-i}ElP%NFx`(`hHI^>IXAp9o$7{m5BgkMBuatY)m4W*};8 zNIA^by~t)z5u^RPFKABo_+#tYcukePL;c(+4YNvUM(9p#h@gb}23J?%AV> zbK>3U1!j@Y>|F4L(Nll=f3@Y-YSnTa?il6+Iq3%yjw@66-CDJfIK`+BTd6Xo2W5(b zZeXsT*^jihETVr^7un!R%5`-IhgzC?`%(w3vP1q_q}%foW*qs(XsPdJ9u>j~YTijo z)I3hT^N9EHef;1P^6&9W*@&*06YdYiZv}BuLG>HgVt8b*mrsgHG$~kV4>NV=HRf+x zsd}`d9)q?6NqcYfQo2ul$PWDtWAG?W&BY?2P z(aI#FA)S?ZtTlCqX_~9Ut_P6QU}V-+3}3AzLgP{_Cmy%0Bwa- zC}PqHcZX=t5f`gz5~ra7(#>kB8U&Svjke22uK)DxZ96p2*4bs$?n1o9 zP0g-ZJ!cQ8eZov>%#lBppNPRVwR`BR3^k{TiKYUj!AiQREstd5W9ddDQln+;(Tcnc-XnM-lLnmL}&?t)y# zbT(j3!66iBnG5wd%+YC+K*uqPyGf$VE_b>$1RK8K-2(VE(o)PV8Z7&>q&$CRY~| zdIOw^5naYb+SjKA)YpRc}NY9Fp76VNiRwY(;ta*ibFlk!yi&dCSrmB1fi*bbW9X6o+7 z|2X!YaJ$pt0%zEMEXPpgHA#LS$Z3A!ud(h=PX3g+n5)`uV8&nf<*4A>0V%od&uc}5rodlFj9{PoiYvSWDsh)H<@x180PYUj2 zl!;DCEP|jNHPReViRxSW>gLa}!eeSQDwHcCSjw^IxjPUa&0uZ*;M^my_=q8P>CE{k zbspEQyLa=B6?Hx~Jmb`kIvr0_1~|Sj=F6yGTDA@&#>NwY+nFCYJkH1CBwM|n2K%w7}%Nn_q_iQ?rrk>w-y8PH2mT`3;lfYu|}`W z>hCGoK(b{);m(Q%SWvXi+z*lfrbz%j&|G2syKFI)gr2vAor_9ImR&I{QGfc^)hPFluMBfuwR zb_EbvaIS&cWUO9*saGew!R#uws@&V=bn zzE24$ir*QrV!X&p6yjk%XqTW*;#fDPG|s>yMlKw3{z=k%-YJXHHXau0a*+eqCvtu& zAA+*{U`cA-BI~*GhKH%Wx}Do{0yS3*LDstX)=3!E$V^I7v#B*HCtSIk#q5vcvaSM) zRG};r3OrZE8Z}f7CU9fZ(sM1nZikMnj&JRhG%lM9>s}E!(&6)1y;SslM#>IEgPkc> zmL2MV+i7POPM1J$S&R1+Oa0xe(xwH{{ZNfgB4NWhme4b_44mm>a7F3V1mN^zVID6p zV>L~TvqeR_qxVj`{3)_16~*_a@nO)*PPzs?YJQ@fuRL97=8l#?RvGRT%z*)(EE3L% z$QTISOsSg<4HaG==+Kpmpj^f=4pLZ_F54zz!C~VBRy~9((pT$v@!8ljUP9>R_eCu1o};;g6AjoaQbB&fD7uv^ot=HPel>H6U-X>E`Nu$6mptB1D`C zC4VW=7{6%!$=eEGgkgArkM}HrTDwuLeu@DwU{P&PtUoAL^J1ya&&-l zmgQGWj={f&fdVvWUcDODzDfRPj3)0HnNQw1%0DIovT1K?1so_zuI{>_=a!GgbncU_%q9R94 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�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