Scala, Spark, Geotrellis Rdd CRS репроекция

Я загружаю набор точек из файла CSV в RDD:

case class yieldrow(Elevation:Double,DryYield:Double)

val points :RDD[PointFeature[yieldrow]] = lines.map { line =>
  val fields = line.split(",")
  val point = Point(fields(1).toDouble,fields(0).toDouble)
  Feature(point, yieldrow(fields(4).toDouble,fields(20)))
}

Тогда получите:

points: org.apache.spark.rdd.RDD[geotrellis.vector.PointFeature[yieldrow]] 

Теперь нужно перепроектировать из EPSG:4326 в EPSG:3270

Поэтому я создаю CRS от и до:

val crsFrom : geotrellis.proj4.CRS =  geotrellis.proj4.CRS.fromName("EPSG:4326")
val crsTo : geotrellis.proj4.CRS =  geotrellis.proj4.CRS.fromEpsgCode(32720)

Но я не могу создать преобразование, а также я не знаю:

Горячее применение преобразования к одной точке:

val pt = Point( -64.9772376007928, -33.6408083223936)

Как использовать метод FeatureGmap для преобразования CRS?

points.map(_.mapGeom(?????))
points.map(feature => feature.mapGeom(????))

Как использовать ReprojectPointFeature(pointfeature)?

В документации нет базовых примеров кода.

Любая помощь будет оценена

2 ответа

Решение

Я начну с последнего вопроса:

Действительно, чтобы выполнить репроект на PointFeature ты можешь использовать ReprojectPointFeature имплицит кейс класса. Чтобы использовать это просто убедитесь, что у вас есть import geotrellis.vector._ в reproject область вызова функции.

import geotrellis.vector._
points.map(_.reproject(crsFrom, crsTo))

Тот же импорт работает для Point тоже:

import geotrellis.vector._
pt.reproject(crsFrom, crsTo)
points.map(_.mapGeom(_.reproject(crsFrom, crsTo)))

@DaunnC Только с одним пунктом работает нормально.

val pt = Point( -64.9772376007928, -33.6408083223936)

println("reproject: "+pt.reproject(crsFrom,crsTo))

Но с RDD.map выдают ошибку:

val pointsRDD = sc.parallelize(List((-33.6408083223936, -64.9772376007928, 80.7265625, 1566.79488),
                     (-33.6408082393936, -64.9772375927928, 80.7265625, 1566.77192),
                     (-33.6408084473936, -64.9772376347928, 80.7265625, 1566.77520),
                     (-33.6408083223936, -64.9772377197928, 80.7265625, 1566.81129),
                     (-33.6408085303936, -64.9772377197928, 80.7265625, 1200.07590)))

case class yieldrow(Elevation:Double,DryYield:Double)

val ftRdd : RDD[Feature[Point,yieldrow]]= pointsRDD.map(tuple =>  Feature(Point(tuple._2,tuple._1), yieldrow(tuple._3,tuple._4)))

println(ftRdd.count)
ftRdd.take(2).foreach(println)

//Now reproject and have Error: org.apache.spark.SparkException: Task not serializable

ftRdd.map(_.mapGeom(_.reproject(crsFrom, crsTo)))
Другие вопросы по тегам