R:使用包 "rgdal" 和 "raster" 裁剪 GeoTiff 栅格
R: Crop GeoTiff Raster using packages "rgdal" and "raster"
我想使用提到的两个包 "rgdal" 和 "raster" 裁剪 GeoTiff 栅格文件。一切正常,除了生成的输出 tif 的质量非常差并且是灰度而不是彩色。原始数据为瑞士联邦地形局的高质量栅格地图,示例文件可下载here.
这是我的代码:
## install.packages("rgdal")
## install.packages("raster")
library("rgdal")
library("raster")
tobecroped <- raster("C:/files/krel_1129_2012_254dpi_LZW.tif")
ex <- raster(xmn=648000, xmx=649000, ymn=224000, ymx=225000)
projection(ex) <- proj4string(tobecroped)
output <- "c:/files/output.tif"
crop(x = tobecroped, y = ex, filename = output)
为了重现此示例,请下载 the sample data 并将其解压缩到文件夹 "c:/files/"。奇怪的是,使用示例数据裁剪后的图像质量还可以,但仍然是灰度。
我尝试使用选项 "datatype"、"format",但没有得到任何结果。有人可以指出解决方案吗?我应该在输入数据中提供更多信息吗?
编辑:
Josh 的示例在示例数据 2 上表现出色。不幸的是,我拥有的数据似乎更旧并且有些不同。如果您阅读以下 GDALinfo,您能告诉我我选择什么选项吗:
# packages same as above
OldInFile = "C:/files/krel1111.tif"
dataType(raster(OldInFile)
[1] "INT1U"
GDALinfo(OldInFile)
rows 4800
columns 7000
bands 1
lower left origin.x 672500
lower left origin.y 230000
res.x 2.5
res.y 2.5
ysign -1
oblique.x 0
oblique.y 0
driver GTiff
projection +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333+k_0=1 +x_0=600000+y_0=200000 +ellps=bessel +units=m+no_defs
file C:/files/krel1111.tif
apparent band summary:
GDType hasNoDataValue NoDataValue blockSize1 blockSize2
1 Byte FALSE 0 1 7000
apparent band statistics:
Bmin Bmax Bmean Bsd
1 0 255 NA NA
Metadata:
AREA_OR_POINT=Area
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_XRESOLUTION=254
TIFFTAG_YRESOLUTION=254
Warning message:
statistics not supported by this driver
编辑 (2015-03-10):
如果只是想裁剪现有 GeoTIFF 的子集并将裁剪部分保存到新的 *.tif
文件,使用 gdalUtils::gdal_translate()
可能是最直接的解决方案:
library(raster) # For extent(), xmin(), ymax(), et al.
library(gdalUtils) # For gdal_translate()
inFile <- "C:/files/krel_1129_2012_254dpi_LZW.tif"
outFile <- "subset.tif"
ex <- extent(c(686040.1, 689715.9, 238156.3, 241774.2))
gdal_translate(inFile, outFile,
projwin=c(xmin(ex), ymax(ex), xmax(ex), ymin(ex)))
看来您需要更改两个细节。
首先,您正在阅读的 *.tif
文件包含三个波段,因此应使用 stack()
阅读。 (在它上面使用 raster()
只会读取单个波段(默认情况下是第一个波段),产生单色或 'greyscale' 输出。
其次 (for reasons mentioned here) writeRaster()
默认情况下将值写为实数(Float64
在我的机器上)。要明确告诉它你想使用字节,请给它参数 datatype='INT1U'
.
library("rgdal")
library("raster")
inFile <- "C:/files/krel_1129_2012_254dpi_LZW.tif"
outFile <- "out.tif"
## Have a look at the format of your input file to:
## (1) Learn that it contains three bands (so should be read in as a RasterStack)
## (2) Contains values written as Bytes (so you should write output with datatype='INT1U')
GDALinfo(inFile)
## Read in as three separate layers (red, green, blue)
s <- stack(inFile)
## Crop the RasterStack to the desired extent
ex <- raster(xmn=648000, xmx=649000, ymn=224000, ymx=225000)
projection(ex) <- proj4string(s)
s2 <- crop(s, ex)
## Write it out as a GTiff, using Bytes
writeRaster(s2, outFile, format="GTiff", datatype='INT1U', overwrite=TRUE)
所有这些都输出以下 tiff 文件:
我想使用提到的两个包 "rgdal" 和 "raster" 裁剪 GeoTiff 栅格文件。一切正常,除了生成的输出 tif 的质量非常差并且是灰度而不是彩色。原始数据为瑞士联邦地形局的高质量栅格地图,示例文件可下载here.
这是我的代码:
## install.packages("rgdal")
## install.packages("raster")
library("rgdal")
library("raster")
tobecroped <- raster("C:/files/krel_1129_2012_254dpi_LZW.tif")
ex <- raster(xmn=648000, xmx=649000, ymn=224000, ymx=225000)
projection(ex) <- proj4string(tobecroped)
output <- "c:/files/output.tif"
crop(x = tobecroped, y = ex, filename = output)
为了重现此示例,请下载 the sample data 并将其解压缩到文件夹 "c:/files/"。奇怪的是,使用示例数据裁剪后的图像质量还可以,但仍然是灰度。
我尝试使用选项 "datatype"、"format",但没有得到任何结果。有人可以指出解决方案吗?我应该在输入数据中提供更多信息吗?
编辑: Josh 的示例在示例数据 2 上表现出色。不幸的是,我拥有的数据似乎更旧并且有些不同。如果您阅读以下 GDALinfo,您能告诉我我选择什么选项吗:
# packages same as above
OldInFile = "C:/files/krel1111.tif"
dataType(raster(OldInFile)
[1] "INT1U"
GDALinfo(OldInFile)
rows 4800
columns 7000
bands 1
lower left origin.x 672500
lower left origin.y 230000
res.x 2.5
res.y 2.5
ysign -1
oblique.x 0
oblique.y 0
driver GTiff
projection +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333+k_0=1 +x_0=600000+y_0=200000 +ellps=bessel +units=m+no_defs
file C:/files/krel1111.tif
apparent band summary:
GDType hasNoDataValue NoDataValue blockSize1 blockSize2
1 Byte FALSE 0 1 7000
apparent band statistics:
Bmin Bmax Bmean Bsd
1 0 255 NA NA
Metadata:
AREA_OR_POINT=Area
TIFFTAG_RESOLUTIONUNIT=2 (pixels/inch)
TIFFTAG_XRESOLUTION=254
TIFFTAG_YRESOLUTION=254
Warning message:
statistics not supported by this driver
编辑 (2015-03-10):
如果只是想裁剪现有 GeoTIFF 的子集并将裁剪部分保存到新的 *.tif
文件,使用 gdalUtils::gdal_translate()
可能是最直接的解决方案:
library(raster) # For extent(), xmin(), ymax(), et al.
library(gdalUtils) # For gdal_translate()
inFile <- "C:/files/krel_1129_2012_254dpi_LZW.tif"
outFile <- "subset.tif"
ex <- extent(c(686040.1, 689715.9, 238156.3, 241774.2))
gdal_translate(inFile, outFile,
projwin=c(xmin(ex), ymax(ex), xmax(ex), ymin(ex)))
看来您需要更改两个细节。
首先,您正在阅读的 *.tif
文件包含三个波段,因此应使用 stack()
阅读。 (在它上面使用 raster()
只会读取单个波段(默认情况下是第一个波段),产生单色或 'greyscale' 输出。
其次 (for reasons mentioned here) writeRaster()
默认情况下将值写为实数(Float64
在我的机器上)。要明确告诉它你想使用字节,请给它参数 datatype='INT1U'
.
library("rgdal")
library("raster")
inFile <- "C:/files/krel_1129_2012_254dpi_LZW.tif"
outFile <- "out.tif"
## Have a look at the format of your input file to:
## (1) Learn that it contains three bands (so should be read in as a RasterStack)
## (2) Contains values written as Bytes (so you should write output with datatype='INT1U')
GDALinfo(inFile)
## Read in as three separate layers (red, green, blue)
s <- stack(inFile)
## Crop the RasterStack to the desired extent
ex <- raster(xmn=648000, xmx=649000, ymn=224000, ymx=225000)
projection(ex) <- proj4string(s)
s2 <- crop(s, ex)
## Write it out as a GTiff, using Bytes
writeRaster(s2, outFile, format="GTiff", datatype='INT1U', overwrite=TRUE)
所有这些都输出以下 tiff 文件: