All Downloads are FREE. Search and download functionalities are using the official Maven repository.

geotrellis.spark.io.json.KeyFormats.scala Maven / Gradle / Ivy

Go to download

GeoTrellis is an open source geographic data processing engine for high performance applications.

The newest version!
package geotrellis.spark.io.json

import geotrellis.spark._

import spray.json._
import spray.json.DefaultJsonProtocol._

object KeyFormats extends KeyFormats

trait KeyFormats {
  implicit object SpatialKeyFormat extends RootJsonFormat[SpatialKey] {
    def write(key: SpatialKey) =
      JsObject(
        "col" -> JsNumber(key.col),
        "row" -> JsNumber(key.row)
      )

    def read(value: JsValue): SpatialKey =
      value.asJsObject.getFields("col", "row") match {
        case Seq(JsNumber(col), JsNumber(row)) =>
          SpatialKey(col.toInt, row.toInt)
        case _ =>
          throw new DeserializationException("SpatialKey expected")
      }
  }

  implicit object SpaceTimeKeyFormat extends RootJsonFormat[SpaceTimeKey] {
    def write(key: SpaceTimeKey) =
      JsObject(
        "col" -> JsNumber(key.col),
        "row" -> JsNumber(key.row),
        "instant" -> JsNumber(key.instant)
      )

    def read(value: JsValue): SpaceTimeKey =
      value.asJsObject.getFields("col", "row", "instant") match {
        case Seq(JsNumber(col), JsNumber(row), JsNumber(time)) =>
          SpaceTimeKey(col.toInt, row.toInt, time.toLong)
        case _ =>
          throw new DeserializationException("SpatialKey expected")
      }
  }


  implicit object TemporalKeyFormat extends RootJsonFormat[TemporalKey] {
    def write(key: TemporalKey) =
      JsObject(
        "instant" -> JsNumber(key.instant)
      )

    def read(value: JsValue): TemporalKey =
      value.asJsObject.getFields("instant") match {
        case Seq(JsNumber(time)) =>
          TemporalKey(time.toLong)
        case _ =>
          throw new DeserializationException("TemporalKey expected")
      }
  }

  implicit def keyBoundsFormat[K: JsonFormat]: RootJsonFormat[KeyBounds[K]] =
    new RootJsonFormat[KeyBounds[K]] {
      def write(keyBounds: KeyBounds[K]) =
        JsObject(
          "minKey" -> keyBounds.minKey.toJson,
          "maxKey" -> keyBounds.maxKey.toJson
        )

      def read(value: JsValue): KeyBounds[K] =
        value.asJsObject.getFields("minKey", "maxKey") match {
          case Seq(minKey, maxKey) =>
            KeyBounds(minKey.convertTo[K], maxKey.convertTo[K])
          case _ =>
            throw new DeserializationException("${classOf[KeyBounds[K]] expected")
        }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy