GeoTrellis / Scala: найдите недостающие неявные доказательства для анализа Json - PullRequest
0 голосов
/ 17 сентября 2018

Какой импорт необходим, чтобы найти неявные доказательства для компиляции вызова GeoJson.parse из GeoTrellis?

geotrellis.vector.io.json.Geometry использует spray.json для анализа и должен иметь возможность находить экземпляр JsonReader или JsonFormats, настроенный на классы WithCrs и Geometry.

Доказательством являетсяопределены в FeatureFormats;но как может использовать приведенный ниже фрагмент кода?

Следующее не разрешает доказательства:

  1. Импорт всего в пакете geotrellis.vector.io.json.*
  2. Импорт Implicits специальноimport geotrellis.vector.io.json.Implicits
  3. Импортировать форматы объектов напрямую import geotrellis.vector.io.json.FeatureFormats
  4. Обеспечить правильный импорт, особенно отсутствие импорта com.vividsolutions.jts.Geometry, который бы маскировал целевой объект

Вотрассматриваемый код

import geotrellis.vector.Geometry
import geotrellis.proj4.CRS
import geotrellis.vector.io.json.*
import geotrellis.vector.io.json.{GeoJson, WithCrs}
import org.json4s.{DefaultFormats, Formats}
import scala.util.{Failure, Success, Try}
val exampleQueryJson =
  """
|{
|   "type": "Polygon",
|   "crs": {
|       "type": "name",
|       "properties": {
|           "name": "EPSG:4326"
|       }
|   },
|   "coordinates": [
|       [
|           [....]
|       ]
|   ]
|}
  """.stripMargin

class GeometryReader extends FeatureFormats {
  implicit val jsonFormats: Formats = DefaultFormats
}

object GeometryReader {

  def parseGeometry(request: String): Geometry = {

    GeoJson.parse[Geometry](request)
  }
}

val g = GeometryReader.parseGeometry(exampleQueryJson)

Ошибка компиляции показывает невозможность найти правильное доказательство с учетом того, что в данный момент доступно

[error] /path/redacted/GeometryReader.scala:19: Cannot find JsonReader or JsonFormat type class for geotrellis.vector.io.json.WithCrs[geotrellis.vector.Geometry]
[error]       val geometryWithCrs: WithCrs[Geometry] = GeoJson.parse[WithCrs[Geometry]](request)
[error]                                                                                ^
[error] /path/redacted/GeometryReader.scala:25: Cannot find JsonReader or JsonFormat type class for geotrellis.vector.Geometry
[error]       Try(GeoJson.parse[Geometry](request)) match {
[error]                                  ^
[error] two errors found
[error] (compile:compileIncremental) Compilation failed

1 Ответ

0 голосов
/ 18 сентября 2018

Краткий ответ: Добавить

import geotrellis.vector.io._

Создатели этой библиотеки использовали объекты пакета для публикации этих последствий.Объект пакета (исходный код ниже) расширяет g.io.json.Implicits, и это приводит их в область действия.

https://github.com/locationtech/geotrellis/blob/master/vector/src/main/scala/geotrellis/vector/io/package.scala

Подробнее об объектах пакета:

https://www.scala -lang.org / доку / файлы / packageobjects / packageobjects.html

...