-
-
Save wnina/727734af3324d00767c6520d3edccb95 to your computer and use it in GitHub Desktop.
| package tutorial | |
| import geotrellis.raster._ | |
| import geotrellis.raster.io.geotiff._ | |
| import geotrellis.raster.render._ | |
| import geotrellis.raster.resample._ | |
| import geotrellis.spark._ | |
| import geotrellis.spark.io._ | |
| import geotrellis.spark.io.file._ | |
| import geotrellis.spark.io.avro.codecs._ | |
| import geotrellis.vector._ | |
| import akka.actor._ | |
| import akka.io.IO | |
| import spray.can.Http | |
| import spray.routing.{HttpService, RequestContext} | |
| import spray.routing.directives.CachingDirectives | |
| import spray.http.MediaTypes | |
| import scala.concurrent._ | |
| import com.typesafe.config.ConfigFactory | |
| // more | |
| import geotrellis.spark.io.hadoop._ | |
| import org.apache.hadoop.fs.Path | |
| import org.apache.hadoop.conf.Configuration | |
| import org.apache.spark._ | |
| import geotrellis.spark.util.SparkUtils | |
| object ServeNDVI { | |
| //val catalogPath = new java.io.File("data/catalog").getAbsolutePath | |
| val inputPath = "hdfs://master:9000/datalandsat" | |
| val rootPath = new Path(inputPath) | |
| val hadoopConfiguration = new Configuration | |
| val conf = new SparkConf() | |
| .setMaster("spark://master:7077") | |
| .setAppName("Spark Tunki - Serve") | |
| implicit val sc = new SparkContext(conf) | |
| val hadoopAttributeStore = new HadoopAttributeStore(rootPath, hadoopConfiguration) | |
| // Create a reader that will read in the indexed tiles we produced in IngestImage. | |
| val hadoopValueReader = HadoopValueReader(hadoopAttributeStore) | |
| //val fileValueReader = FileValueReader(catalogPath) | |
| def reader(layerId: LayerId) = hadoopValueReader.reader[SpatialKey, MultibandTile](layerId) | |
| def main(args: Array[String]): Unit = { | |
| implicit val system = akka.actor.ActorSystem("tutorial-system") | |
| println(">>>>>> inside main, begin") | |
| // create and start our service actor | |
| val service = | |
| system.actorOf(Props(classOf[NDVIServiceActor]), "tutorial") | |
| // start a new HTTP server on port 8080 with our service actor as the handler | |
| IO(Http) ! Http.Bind(service, "localhost", 8082) | |
| println(">>>>>> inside main, end") | |
| } | |
| } | |
| class NDVIServiceActor extends Actor with HttpService { | |
| import scala.concurrent.ExecutionContext.Implicits.global | |
| def actorRefFactory = context | |
| def receive = runRoute(root) | |
| val colorMap = | |
| ColorMap.fromStringDouble(ConfigFactory.load().getString("tutorial.colormap")).get | |
| def root = | |
| pathPrefix(IntNumber / IntNumber / IntNumber) { (zoom, x, y) => | |
| respondWithMediaType(MediaTypes.`image/png`) { | |
| complete { | |
| println(">>>>>> inside complete") | |
| future { | |
| // Read in the tile at the given z/x/y coordinates. | |
| val tileOpt: Option[MultibandTile] = | |
| try { | |
| println(">>>> zoom: " + zoom + "x: "+ x + "y: "+ y) | |
| Some(ServeNDVI.reader(LayerId("nlcd-tms",zoom)).read(x, y)) | |
| } catch { | |
| case _: TileNotFoundError => | |
| None | |
| } | |
| tileOpt.map { tile => | |
| // Compute the NDVI | |
| val ndvi = | |
| tile.convert(DoubleConstantNoDataCellType).combineDouble(0, 1) { (r, ir) => | |
| if(isData(r) && isData(ir)) { | |
| (ir - r) / (ir + r) | |
| } else { | |
| Double.NaN | |
| } | |
| } | |
| // Render as a PNG | |
| ndvi.renderPng(colorMap).bytes | |
| } | |
| } | |
| } | |
| } | |
| } | |
| } |
The output of json metadata (nlcd-tms___0___metadata.json and nlcd-tms___15___metadata.json) and when i ingested are:
[{"name":"nlcd-tms","zoom":0},{"header":{"format":"hdfs","keyClass":"geotrellis.spark.SpatialKey","valueClass":"geotrellis.raster.MultibandTile","path":"hdfs://master:9000/datalandsat/nlcd-tms/0"},"metadata":{"extent":{"xmin":-7931295.914632329,"ymin":-1812178.4956779396,"xmax":-7904412.241232644,"ymax":-1785130.8165442757},"layoutDefinition":{"extent":{"xmin":-20037508.342789244,"ymin":-20037508.342789244,"xmax":20037508.342789244,"ymax":20037508.342789244},"tileLayout":{"layoutCols":1,"layoutRows":1,"tileCols":256,"tileRows":256}},"bounds":{"minKey":{"col":0,"row":0},"maxKey":{"col":0,"row":0}},"cellType":"int32","crs":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs "},"keyIndex":{"type":"zorder","properties":{"keyBounds":{"minKey":{"col":0,"row":0},"maxKey":{"col":0,"row":0}}}},"schema":{"type":"record","name":"KeyValueRecord","namespace":"geotrellis.spark.io","fields":[{"name":"pairs","type":{"type":"array","items":{"type":"record","name":"Tuple2","namespace":"scala","fields":[{"name":"_1","type":{"type":"record","name":"SpatialKey","namespace":"geotrellis.spark","fields":[{"name":"col","type":"int"},{"name":"row","type":"int"}]}},{"name":"_2","type":{"type":"record","name":"ArrayMultibandTile","namespace":"geotrellis.raster","fields":[{"name":"bands","type":{"type":"array","items":[{"type":"record","name":"ByteArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":"bytes"},{"name":"noDataValue","type":["int","null"],"default":-128}]},{"type":"record","name":"FloatArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"float"}},{"name":"noDataValue","type":["boolean","float"],"default":true}]},{"type":"record","name":"DoubleArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"double"}},{"name":"noDataValue","type":["boolean","double"],"default":true}]},{"type":"record","name":"ShortArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"int"}},{"name":"noDataValue","type":["int","null"],"default":-32768}]},{"type":"record","name":"IntArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"int"}},{"name":"noDataValue","type":["int","null"],"default":-2147483648}]},{"type":"record","name":"BitArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":"bytes"}]},{"type":"record","name":"UByteArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":"bytes"},{"name":"noDataValue","type":["int","null"],"default":0}]},{"type":"record","name":"UShortArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"int"}},{"name":"noDataValue","type":["int","null"],"default":0}]}]}}]}}]}}}]}}]
[{"name":"nlcd-tms","zoom":15},{"header":{"format":"hdfs","keyClass":"geotrellis.spark.SpatialKey","valueClass":"geotrellis.raster.MultibandTile","path":"hdfs://master:9000/datalandsat/nlcd-tms/15"},"metadata":{"extent":{"xmin":-7931295.914632329,"ymin":-1812178.4956779396,"xmax":-7904412.241232644,"ymax":-1785130.8165442757},"layoutDefinition":{"extent":{"xmin":-20037508.342789244,"ymin":-20037508.342789244,"xmax":20037508.342789244,"ymax":20037508.342789244},"tileLayout":{"layoutCols":32768,"layoutRows":32768,"tileCols":256,"tileRows":256}},"bounds":{"minKey":{"col":9898,"row":17843},"maxKey":{"col":9920,"row":17865}},"cellType":"int32","crs":"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs "},"keyIndex":{"type":"zorder","properties":{"keyBounds":{"minKey":{"col":9898,"row":17843},"maxKey":{"col":9920,"row":17865}}}},"schema":{"type":"record","name":"KeyValueRecord","namespace":"geotrellis.spark.io","fields":[{"name":"pairs","type":{"type":"array","items":{"type":"record","name":"Tuple2","namespace":"scala","fields":[{"name":"_1","type":{"type":"record","name":"SpatialKey","namespace":"geotrellis.spark","fields":[{"name":"col","type":"int"},{"name":"row","type":"int"}]}},{"name":"_2","type":{"type":"record","name":"ArrayMultibandTile","namespace":"geotrellis.raster","fields":[{"name":"bands","type":{"type":"array","items":[{"type":"record","name":"ByteArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":"bytes"},{"name":"noDataValue","type":["int","null"],"default":-128}]},{"type":"record","name":"FloatArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"float"}},{"name":"noDataValue","type":["boolean","float"],"default":true}]},{"type":"record","name":"DoubleArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"double"}},{"name":"noDataValue","type":["boolean","double"],"default":true}]},{"type":"record","name":"ShortArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"int"}},{"name":"noDataValue","type":["int","null"],"default":-32768}]},{"type":"record","name":"IntArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"int"}},{"name":"noDataValue","type":["int","null"],"default":-2147483648}]},{"type":"record","name":"BitArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":"bytes"}]},{"type":"record","name":"UByteArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":"bytes"},{"name":"noDataValue","type":["int","null"],"default":0}]},{"type":"record","name":"UShortArrayTile","fields":[{"name":"cols","type":"int"},{"name":"rows","type":"int"},{"name":"cells","type":{"type":"array","items":"int"}},{"name":"noDataValue","type":["int","null"],"default":0}]}]}}]}}]}}}]}}]
The error is: