我正在进行一个利用数字地面模型(DGM)寻找水深和水深的项目。我有多个涉及感兴趣领域的tiff文件,我想将它们合并成一个tiff文件,以便进行快速处理。如何使用下面的代码或任何其他方法将它们组合起来?
我试着将瓷砖连接起来,把它们一个接一个地作为输入,然后将它们组合起来,但是它抛出GC error,可能是因为代码本身有问题。代码提供如下:
import geotrellis.proj4._
import geotrellis.raster._
import geotrellis.raster.io.geotiff._
object waterdepth {
val directories = List("data")
//constants to differentiate which bands to use
val R_BAND = 0
val G_BAND = 1
val NIR_BAND = 2
// Path to our landsat band geotiffs.
def bandPath(directory: String) = s"../biggis-landuse/radar_data/${directory}"
def main(args: Array[String]): Unit = {
directories.map(directory => generateMultibandGeoTiffFile(directory))
}
def generateMultibandGeoTiffFile(directory: String) = {
val tiffFiles = new java.io.File(bandPath(directory)).listFiles.map(_.toString)
val singleBandGeoTiffArray = tiffFiles.foldLeft(Array[SinglebandGeoTiff]())((acc, el:String) => {
acc :+ SinglebandGeoTiff(el)
})
val tileArray = ArrayMultibandTile(singleBandGeoTiffArray.map(_.tile))
println(s"Writing out $directory multispectral tif")
MultibandGeoTiff(tileArray, singleBandGeoTiffArray(0).extent, singleBandGeoTiffArray(0).crs).write(s"data/$directory.tif")它应该能够从所有单独的文件中创建一个tif文件,但是它会抛出一个内存错误。
发布于 2019-08-08 00:47:28
您所遵循的想法是正确的,可能OOM的发生是因为您正在将大量的数据加载到内存中,所以这并不令人惊讶。解决方案是为JVM分配更多的内存。但是,您可以尝试这个小的优化(这可能会起作用):
import geotrellis.proj4._
import geotrellis.raster._
import geotrellis.raster.io.geotiff._
import geotrellis.raster.io.geotiff.reader._
import java.io.File
def generateMultibandGeoTiffFile(directory: String) = {
val tiffs =
new File(bandPath(directory))
.listFiles
.map(_.toString)
// streaming = true won't force all bytes to load into memory
// only tiff metadata is fetched here
.map(GeoTiffReader.readSingleband(_, streaming = true))
val (extent, crs) = {
val tiff = tiffs.head
tiff.extent -> tiff.crs
}
// TIFF segments bytes fetch will start only during the write
MultibandGeoTiff(
MultibandTile(tiffs.map(_.tile)),
extent, crs
).write(s"data/$directory.tif")
}}
https://stackoverflow.com/questions/55513932
复制相似问题