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