如何从 R 中的 geoTIFF 获取像素值?
How to get values for a pixel from a geoTIFF in R?
我正在尝试从 R 中的 geoTIFF 文件中获取 RGB 分量。图像上的颜色对应于不同的土地分类类型,我对 RGB 分量中的每种分类类型都有一个图例。
我正在使用栅格库。到目前为止我的代码是
library(raster)
my.map = raster("mygeoTIFFfile.tif")
文件读入后的信息如下:
> my.map[[1]]
class : RasterLayer
dimensions : 55800, 129600, 7231680000 (nrow, ncol, ncell)
resolution : 0.002777778, 0.002777778 (x, y)
extent : -180.0014, 179.9986, -64.99861, 90.00139 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : filepah/filename.tif
names : filename.tif
values : 11, 230 (min, max)
我正在处理的特定 geoTIFF 文件可以在这里找到:
http://due.esrin.esa.int/page_globcover.php
(只需点击 "Globcover2009_V2.3_Global_.zip")
有人可以帮我从这个文件的单个像素位置获取值吗?
rasterToPoints()
function 会将您的栅格数据转换为包含每个点的 x
、y
和 value
的矩阵。这将非常大,但如果您想对数据进行广泛分析,这可能就是您要找的东西。
library(raster)
map <- raster("GLOBCOVER_L4_200901_200912_V2.3.tif")
data <- rasterToPoints(map, progress="text")
head(data)
另一种选择是使用 extract()
function to return a single point by passing a SpatialPoints
object 和 latitude/longitude。如果您只需要几个单独的数据点,这比将整个数据加载到矩阵中要快得多。
library(raster)
map <- raster("GLOBCOVER_L4_200901_200912_V2.3.tif")
extract(map, SpatialPoints(cbind(-123.3680884, 48.4252848)))
看来你问错问题了
要获取单个像素(网格单元)的值,您可以使用索引。例如,对于单元格编号 10,000 和 10,001,您可以执行 r[10000:10001]
。
您可以通过 values(r)
获取所有值。但是对于像这样的非常大的光栅,这将失败(除非你有 lots 的 RAM)。
但是,您需要回答的问题似乎是如何通过匹配整数单元格值与 RGB 颜色来制作地图。
让我们设置一个示例栅格
library(raster)
r <- raster(nrow=4, ncol=4)
values(r) <- rep(c(11, 14, 20, 30), each=4)
以及一些匹配的 RGB 值
legend <- read.csv(text="Value,Label,Red,Green,Blue
11,Post-flooding or irrigated croplands (or aquatic),170,240,240
14,Rainfed croplands,255,255,100
20,Mosaic cropland (50-70%) / vegetation (grassland/shrubland/forest) (20-50%),220,240,100
30,Mosaic vegetation (grassland/shrubland/forest) (50-70%) / cropland (20-50%) ,205,205,102")
计算颜色代码
legend$col <- rgb(legend$Red, legend$Green, legend$Blue, maxColorValue=255)
设置一个"color table"
# start with white for all values (1 to 255)
ct <- rep(rgb(1,1,1), 255)
# fill in where necessary
ct[legend$Value+1] <- legend$col
colortable(r) <- ct
情节
plot(r)
你也可以试试:
tb <- legend[, c('Value', 'Label')]
colnames(tb)[1] = "ID"
tb$Label <- substr(tb$Label, 1,10)
levels(r) <- tb
library(rasterVis)
levelplot(r, col.regions=legend$col, at=0:length(legend$col))
我正在尝试从 R 中的 geoTIFF 文件中获取 RGB 分量。图像上的颜色对应于不同的土地分类类型,我对 RGB 分量中的每种分类类型都有一个图例。
我正在使用栅格库。到目前为止我的代码是
library(raster)
my.map = raster("mygeoTIFFfile.tif")
文件读入后的信息如下:
> my.map[[1]]
class : RasterLayer
dimensions : 55800, 129600, 7231680000 (nrow, ncol, ncell)
resolution : 0.002777778, 0.002777778 (x, y)
extent : -180.0014, 179.9986, -64.99861, 90.00139 (xmin, xmax, ymin, ymax)
coord. ref. : +proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0
data source : filepah/filename.tif
names : filename.tif
values : 11, 230 (min, max)
我正在处理的特定 geoTIFF 文件可以在这里找到:
http://due.esrin.esa.int/page_globcover.php
(只需点击 "Globcover2009_V2.3_Global_.zip")
有人可以帮我从这个文件的单个像素位置获取值吗?
rasterToPoints()
function 会将您的栅格数据转换为包含每个点的 x
、y
和 value
的矩阵。这将非常大,但如果您想对数据进行广泛分析,这可能就是您要找的东西。
library(raster)
map <- raster("GLOBCOVER_L4_200901_200912_V2.3.tif")
data <- rasterToPoints(map, progress="text")
head(data)
另一种选择是使用 extract()
function to return a single point by passing a SpatialPoints
object 和 latitude/longitude。如果您只需要几个单独的数据点,这比将整个数据加载到矩阵中要快得多。
library(raster)
map <- raster("GLOBCOVER_L4_200901_200912_V2.3.tif")
extract(map, SpatialPoints(cbind(-123.3680884, 48.4252848)))
看来你问错问题了
要获取单个像素(网格单元)的值,您可以使用索引。例如,对于单元格编号 10,000 和 10,001,您可以执行 r[10000:10001]
。
您可以通过 values(r)
获取所有值。但是对于像这样的非常大的光栅,这将失败(除非你有 lots 的 RAM)。
但是,您需要回答的问题似乎是如何通过匹配整数单元格值与 RGB 颜色来制作地图。
让我们设置一个示例栅格
library(raster)
r <- raster(nrow=4, ncol=4)
values(r) <- rep(c(11, 14, 20, 30), each=4)
以及一些匹配的 RGB 值
legend <- read.csv(text="Value,Label,Red,Green,Blue
11,Post-flooding or irrigated croplands (or aquatic),170,240,240
14,Rainfed croplands,255,255,100
20,Mosaic cropland (50-70%) / vegetation (grassland/shrubland/forest) (20-50%),220,240,100
30,Mosaic vegetation (grassland/shrubland/forest) (50-70%) / cropland (20-50%) ,205,205,102")
计算颜色代码
legend$col <- rgb(legend$Red, legend$Green, legend$Blue, maxColorValue=255)
设置一个"color table"
# start with white for all values (1 to 255)
ct <- rep(rgb(1,1,1), 255)
# fill in where necessary
ct[legend$Value+1] <- legend$col
colortable(r) <- ct
情节
plot(r)
你也可以试试:
tb <- legend[, c('Value', 'Label')]
colnames(tb)[1] = "ID"
tb$Label <- substr(tb$Label, 1,10)
levels(r) <- tb
library(rasterVis)
levelplot(r, col.regions=legend$col, at=0:length(legend$col))