什么';从AWS加载单波段Landsat 8光栅并将其组合成单个多波段RDD的最简单方法是什么?

什么';从AWS加载单波段Landsat 8光栅并将其组合成单个多波段RDD的最简单方法是什么?,landsat,geotrellis,Landsat,Geotrellis,我用它来加载陆地卫星8上的geotiff光栅。但是,它们是按波段存储的。我可以使用S3GeoTiff类加载各个波段,例如: val options = S3GeoTiffRDD.Options(getS3Client = () => S3Client.ANONYMOUS) val rddBlue = S3GeoTiffRDD.spatial("landsat-pds", "L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B2.

我用它来加载陆地卫星8上的geotiff光栅。但是,它们是按波段存储的。我可以使用
S3GeoTiff
类加载各个波段,例如:

val options = S3GeoTiffRDD.Options(getS3Client = () => S3Client.ANONYMOUS)

val rddBlue = S3GeoTiffRDD.spatial("landsat-pds", "L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B2.TIF", options)
val rddGreen = S3GeoTiffRDD.spatial("landsat-pds", "L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B3.TIF", options)
val rddRed = S3GeoTiffRDD.spatial("landsat-pds", "L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B4.TIF", options)
但是我该如何组合它们来生成RGB光栅呢

val rddRGB = ??? // something like combineRDDs(rddRed, rddGreen, rddBlue)

从没有
maxTileSize
选项集的单个文件的RDD中,您将得到完整图像(一个元素)的RDD。我建议你把这个设定好

有一个超负荷,让你可以。这就是我一般处理这个问题的方式

下面是一些代码,它利用了这些选项来实现您所要查找的功能:

导入GeoGrillis.graster_
导入GeoGrillis.spark_
导入GeoGrillis.spark.io.s3_
导入GeoGrillis.vector_
导入org.apache.spark.SparkContext
导入org.apache.spark.rdd_
导入java.net.URI
导入scala.math.BigDecimal.RoundingMode
隐式val sc:SparkContext=
GeoGrillis.spark.util.SparkUtils.createLocalSparkContext(“本地[*]”,“陆地卫星示例”)
试一试{
val选项=
S3GeoTiffRDD.Options(
getS3Client=()=>S3Client.ANONYMOUS,
maxTileSize=一些(512),
numPartitions=一些(100)
)
类型LandsatKey=(ProjectedExtent,URI,Int)
//对于每个RDD,我们将在密钥中包含更多信息,包括:
//-项目范围
//-URI
//-未来波段值
def uriToKey(bandinex:Int):(URI,ProjectedExtent)=>LandsatKey=
{(uri,pe)=>
(pe、uri、bandIndex)
}
//读取每个波段的源磁贴RDD。
val redSourceTiles=
S3GeoTiffRDD[项目扩展、LandsatKey、瓷砖](
“陆地卫星pds”,
“L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B2.TIF”,
乌里托基(0),
选择权
)
瓦尔·格林斯泰尔斯酒店=
S3GeoTiffRDD[项目扩展、LandsatKey、瓷砖](
“陆地卫星pds”,
“L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B3.TIF”,
乌里托克伊(1),
选择权
)
瓦尔蓝宝石=
S3GeoTiffRDD[项目扩展、LandsatKey、瓷砖](
“陆地卫星pds”,
“L8/139/045/LC81390452014295LGN00/LC81390452014295LGN00_B4.TIF”,
乌里托克伊(2),
选择权
)
//将这些元素组合在一起,重新排列元素,以便我们能够按键分组,
//按键将它们分组,然后重新排列以生成多波段瓷砖。
val sourceTiles:RDD[(ProjectedExtent,MultibandTile)]={
sc.union(红源瓷砖、绿色资源文件、蓝色资源文件)
.map{case((pe、uri、bandIndex)、tile)=>
//获取瓷砖的中心,我们将在其上连接
val(x,y)=(pe.extent.center.x,pe.extent.center.y)
//圆心坐标,以防出现任何浮点错误
瓦尔中心=
(
BigDecimal(x).setScale(5,舍入模式.HALF_UP).doubleValue(),
BigDecimal(y).设置刻度(5,舍入模式.向上半舍入).doubleValue()
)
//从路径中获取场景ID
val sceneId=uri.getPath.split('/')。reverse.drop(1)。head
val newKey=(场景ID,中间)
val newValue=(pe、带状索引、平铺)
(newKey,newValue)
}
.groupByKey()
.map{case(oldKey,groupedValues)=>
val projectedExtent=groupedValues.head.\u 1
val bands=Array.ofDim[Tile](groupedValues.size)
用于((u3;、条带索引、平铺)
rdd.mapValues{tile=>
//神奇的数字!这些数字是通过摆弄
//直到一些陆地卫星图像看起来足够好为止
//为其他项目绘制地图。
val(最小值,最大值)=(400015176)
def夹钳(z:Int)={
if(isData(z)){if(z>max){max}else if(z
谢谢!我必须将
val newKey=(uri,center)
更改为
val newKey=center
(否则它不会对tile进行分组,因为uri对于每个波段都是唯一的),但在那之后,它起了作用。但是你介意详细说明一下你使用的神奇数字吗?它们来自哪里?谢谢!@dff这些神奇数字来自另一个项目,你可以在这里找到:()。我也做了一些修复,并将此示例设置到回购中,如本文所示:谢谢你的提问!