主要内容

本页采用了机器翻译。点击此处可查看英文原文。

geotiffwrite

写入 GeoTIFF 文件

说明

geotiffwrite(filename,A,R) 将地理参考图像或数据网格 A(通过 R 进行空间参考)写入输出文件 filename

示例

geotiffwrite(filename,X,cmap,R) 将索引图像写入 X 及其关联的颜色图 cmap,并存储于 filenameX 通过 R 进行空间参考。

geotiffwrite(___,Name,Value) 写入图像或数据网格,并带有一个或多个 Name,Value 对参数,用于控制输出文件的各种特性。

示例

示例

全部折叠

从文件中读取一张 JPEG 图像。

basename = "boston_ovr";
imagefile = basename + ".jpg";
RGB = imread(imagefile);

从图像文件名推导世界文件名,读取世界文件,并创建一个参考对象。

worldfile = getworldfilename(imagefile);
R = worldfileread(worldfile,"geographic",size(RGB));

将图像数据和参考对象写入 GeoTIFF 文件。

filename = basename + ".tif";
geotiffwrite(filename, RGB, R)

创建地图并显示文件中的数据。

figure
usamap(RGB,R)
geoshow(filename)

Figure contains an axes object. The hidden axes object contains 7 objects of type patch, surface, line, text.

通过提取经典 TIFF 文件中的信息,将其转换为分块的 BigTIFF 文件。首先,导入一张经典的波士顿 TIFF 图像和一个地图单元参考对象。使用 geotiffinfo 从文件中获取元数据。

infilename = "boston.tif";
[A,R] = readgeoraster(infilename);
info = geotiffinfo(infilename);

指定要包含在瓦片式 BigTIFF 文件中的标签。为此,请从元数据中提取 GeoKey 目录标签。然后,创建指定瓷砖长度和宽度的标签。

geoTags = info.GeoTIFFTags.GeoKeyDirectoryTag;
tiffTags = struct(TileLength=1024,TileWidth=1024);

将数据写入新的 GeoTIFF 文件。使用 TiffType 参数将文件格式指定为 BigTIFF。通过指定 GeoKeyDirectoryTagTiffTags 参数来包含标签。

outfilename = "boston_bigtiff.tif";
geotiffwrite(outfilename,A,R,TiffType="bigtiff", ...
    GeoKeyDirectoryTag=geoTags,TiffTags=tiffTags)

通过读取文件并查询标签来验证您是否已写入 BigTIFF 文件。

biginfo = geotiffinfo(outfilename);
biginfo.GeoTIFFTags.GeoKeyDirectoryTag
ans = struct with fields:
        GTModelTypeGeoKey: 1
       GTRasterTypeGeoKey: 1
    ProjectedCSTypeGeoKey: 26986
        PCSCitationGeoKey: 'State Plane Zone 2001 NAD = 83'
    ProjLinearUnitsGeoKey: 9003

t = Tiff(outfilename);
getTag(t,"TileLength")
ans = 1024
getTag(t,"TileWidth")
ans = 1024
close(t)

从 WMS 服务器读取数据。

nasaLayers = wmsfind("nasa",SearchField="serverurl");
layerName = "bluemarbleng";
layer = refine(nasaLayers, layerName,SearchField="layername", ...
    MatchType="exact");
[A,R] = wmsread(layer(1));

将数据写入 GeoTIFF 文件。

filename = layerName + ".tif";
geotiffwrite(filename,A,R)

查看文件中的数据。

figure
worldmap world
geoshow(filename)

读取两幅相邻的正射影像。通过读取正射影像的世界文件来创建其参考对象。

X_west = imread("concord_ortho_w.tif");
X_east = imread("concord_ortho_e.tif");

R_west = worldfileread("concord_ortho_w.tfw","planar",size(X_west));
R_east = worldfileread("concord_ortho_e.tfw","planar",size(X_east));

合并正射影像。

[X,R] = mergetiles(X_west,R_west,X_east,R_east);

将合并后的图像写入 GeoTIFF 文件。使用代码编号 26986,该代码表示 PCS_NAD83_马萨诸塞州投影坐标系。

coordRefSysCode = 26986;
filename = "concord_ortho.tif";
geotiffwrite(filename,X,R,CoordRefSysCode=coordRefSysCode);

在地图上显示 GeoTIFF 文件的内容。

figure
mapshow(filename)

Figure contains an axes object. The axes object contains an object of type image.

使用 readgeoraster 导入波士顿周边区域的 GeoTIFF 图像和地图单元参考对象。

[A,RA] = readgeoraster("boston.tif");

使用 mapcrop 将数据裁剪至由 xlimitsylimits 指定的边界。

xlimits = [764318 767678];
ylimits = [2951122 2954482];
[B,RB] = mapcrop(A,RA,xlimits,ylimits);

使用 geotiffinfo 获取 GeoTIFF 图像的信息。从信息中提取 GeoKey 目录标签。

info = geotiffinfo("boston.tif");
key = info.GeoTIFFTags.GeoKeyDirectoryTag;

将裁剪后的数据和 GeoKey 目录标签写入文件。通过显示裁剪后的数据,验证其是否已写入文件。

filename = "boston_subimage.tif";
geotiffwrite(filename,B,RB,GeoKeyDirectoryTag=key)
figure
mapshow(filename)

将科罗拉多州南博尔德峰周边区域的高程数据写入 GeoTIFF 文件。首先,导入高程数据和地理坐标参考对象。

[Z,R] = readgeoraster('n39_w106_3arc_v2.dt1','OutputType','double');

为 GeoTIFF 文件指定 GeoKey 目录标签信息,作为结构体。通过将 GTModelTypeGeoKey 字段设置为 2,表明数据采用地理坐标系。通过将 GTRasterTypeGeoKey 字段设置为 2,表明参考对象使用的是点阵(而非单元)。通过将 GeographicTypeGeoKey 字段设置为 4326,表明数据采用地理坐标参考系。

key.GTModelTypeGeoKey  = 2;
key.GTRasterTypeGeoKey = 2;
key.GeographicTypeGeoKey = 4326;

将数据和 GeoKey 目录标签写入文件。

filename = 'southboulder.tif';
geotiffwrite(filename,Z,R,'GeoKeyDirectoryTag',key)

通过在地图上显示数据来验证数据是否已写入文件。

usamap([39 40],[-106 -105])
g = geoshow(filename,'DisplayType','mesh');
demcmap(g.CData)

Figure contains an axes object. The hidden axes object contains 10 objects of type patch, surface, line, text.

本示例所用高程数据由美国地质调查局提供。

创建一个带有 RPC 元数据的示例 TIFF 文件。为此,请创建一个全为零的数组及其关联的参考对象。

A = zeros(180,360);
latlim = [-90 90];
lonlim = [-180 180];
RA = georefcells(latlim,lonlim,size(A));

然后,创建一个名为 RPCCoefficientTag 的元数据对象,并为其设置若干字段及其典型值。RPCCoefficientTag 对象以可读形式表示 RPC 元数据。

rpctag = map.geotiff.RPCCoefficientTag;
rpctag.LineOffset = 1;
rpctag.SampleOffset = 1;
rpctag.LineScale = 2;
rpctag.SampleScale = 2;
rpctag.GeodeticHeightScale = 500;

将图像、关联的参考对象以及 RPCCoefficientTag 对象写入文件。

geotiffwrite('myfile',A,RA,'RPCCoefficientTag',rpctag)

此示例演示了如何将 RPC 系数元数据写入 TIFF 文件。在实际工作流程中,您需要根据 TIFF 扩展规范创建 RPC 系数元数据。此示例并未展示如何创建有效 RPC 元数据的具体方法。为模拟原始 RPC 元数据,该示例创建了一个带有 RPC 元数据的样本 TIFF 文件,随后使用 imfinfo 工具以原始未处理形式从文件中读取这些 RPC 元数据。该示例随后使用 geotiffwrite 函数将原始 RPC 元数据写入文件。

创建原始 RPC 系数元数据

要模拟原始 RPC 元数据,请创建一个简单的测试文件,并在文件中写入一些 RPC 元数据。对于此测试文件,请创建一个玩具图像及其关联的参考对象。

myimage = zeros(180,360);
latlim = [-90 90];
lonlim = [-180 180];
R = georefcells(latlim,lonlim,size(myimage));

创建一个 RPCCoefficientTag 元数据对象并设置其中部分字段。该工具箱使用 RPCCoefficientTag 对象以人类可读的形式表示 RPC 元数据。

rpctag = map.geotiff.RPCCoefficientTag;
rpctag.LineOffset = 1;
rpctag.SampleOffset = 1;
rpctag.LineScale = 2;
rpctag.SampleScale = 2;
rpctag.GeodeticHeightScale = 500;

将图像、关联的参考对象以及 RPCCoefficientTag 对象写入文件。

geotiffwrite('myfile',myimage,R,'RPCCoefficientTag',rpctag)

读取原始 RPC 系数元数据

使用 imfinfo 函数从测试文件中读取 RPC 系数元数据。当遇到不熟悉的元数据时,imfinfo 会将数据未经处理地返回至 UnknownTags 字段。请注意,UnknownTags 字段包含一个由 92 个双精度数组组成的数组。这是原始的 RPC 系数元数据,以未经处理的形式从文件中读取。

info = imfinfo('myfile.tif');
info.UnknownTags
ans = struct with fields:
        ID: 50844
    Offset: 10680
     Value: [-1 -1 1 1 0 0 0 2 2 1 1 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

将原始 RPC 元数据写入文件

将原始 RPC 元数据写入文件。首先,从信息结构中提取 RPC 系数元数据。

value = info.UnknownTags.Value;

然后,构造一个 RPCCoefficientTag 对象,并将原始 RPC 元数据(92 个双精度浮点数的数组)作为参数传递。

rpcdata = map.geotiff.RPCCoefficientTag(value) 
rpcdata = 
  RPCCoefficientTag with properties:

                BiasErrorInMeters: -1
              RandomErrorInMeters: -1
                       LineOffset: 1
                     SampleOffset: 1
           GeodeticLatitudeOffset: 0
          GeodeticLongitudeOffset: 0
             GeodeticHeightOffset: 0
                        LineScale: 2
                      SampleScale: 2
            GeodeticLatitudeScale: 1
           GeodeticLongitudeScale: 1
              GeodeticHeightScale: 500
        LineNumeratorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
      LineDenominatorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
      SampleNumeratorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    SampleDenominatorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

RPCCoefficientTag 对象传递给 geotiffwrite 函数,并将 RPC 元数据写入文件。

geotiffwrite('myfile2',myimage,R,'RPCCoefficientTag',rpcdata)

为验证数据是否已写入文件,请使用 geotiffinfo 从 TIFF 文件中读取 RPC 元数据。将返回的 RPC 元数据与写入测试文件的元数据进行比较。

ginfo = geotiffinfo('myfile2');
ginfo.GeoTIFFTags.RPCCoefficientTag
ans = 
  RPCCoefficientTag with properties:

                BiasErrorInMeters: -1
              RandomErrorInMeters: -1
                       LineOffset: 1
                     SampleOffset: 1
           GeodeticLatitudeOffset: 0
          GeodeticLongitudeOffset: 0
             GeodeticHeightOffset: 0
                        LineScale: 2
                      SampleScale: 2
            GeodeticLatitudeScale: 1
           GeodeticLongitudeScale: 1
              GeodeticHeightScale: 500
        LineNumeratorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
      LineDenominatorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
      SampleNumeratorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
    SampleDenominatorCoefficients: [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]

输入参数

全部折叠

输出文件的名称和位置,指定为字符串标量或字符向量。如果您的 filename 包含扩展名,则必须为 '.tif''.TIF'。若输入文件 A 的大小至少为 160×160,则输出文件为分块的 GeoTIFF 文件。否则,geotiffwrite 将输出文件按每条带一行进行组织。

数据类型: char | string

地理参考图像或数据网格,指定为以下之一:

  • 一个由 M×N 组成的数字矩阵,表示灰度图像或数据网格

  • 一个由 M×N×P 组成的数组,表示彩色图像、多光谱图像、高光谱图像或数据网格。

A 的坐标为地理坐标,且采用 'WGS 84' 坐标系,除非您指定 'GeoKeyDirectoryTag''CoordRefSysCode' 并标明使用其他坐标系。

数据类型: double | single | uint8 | uint16 | uint32 | int8 | int16 | int32 | logical

空间参考信息,指定为类型为 GeographicCellsReferenceGeographicPostingsReference 的地理栅格参考对象,或类型为 MapCellsReferenceMapPostingsReference 的地图栅格参考对象。

若您在投影坐标系中处理图像坐标,且 R 是地图栅格参考对象,则应相应地指定 'GeoKeyDirectoryTag''CoordRefSysCode'

geotiffwrite 函数不使用地理栅格参考对象的 GeographicCRS 属性或地图栅格参考对象的 ProjectedCRS 属性所包含的信息。

索引图像数据,指定为一个 M×N 数值矩阵。

数据类型: uint8 | uint16

与索引图像 X 关联的颜色映射,指定为 c×3 数值矩阵。颜色映射中包含 c 种颜色,每种颜色由红、绿、蓝三原色像素值表示。

名称-值参数

全部折叠

将可选参量对组指定为 Name1=Value1,...,NameN=ValueN,其中 Name 是参量名称,Value 是对应的值。名称-值参量必须出现在其他参量之后,但对各个参量对组的顺序没有要求。

如果使用的是 R2021a 之前的版本,请使用逗号分隔每个名称和值,并用引号将 Name 引起来。

示例: 'CoordRefSysCode',26986

数据坐标的坐标参考系代码,指定为逗号分隔对组,其中包含 'CoordRefSysCode' 和一个正整数、字符串标量或字符向量。您可以使用地理坐标系或投影坐标系来指定坐标。若使用字符串标量或字符向量指定坐标系,请包含前缀 'EPSG:'。要查找代码编号,请参阅 EPSG 注册表或 GeoTIFF 规范中的提示部分。

若同时指定 GeoKeyDirectoryTagCoordRefSysCode,则 CoordRefSysCode 中的坐标系代码优先于 GeoKeyDirectoryTag 中找到的坐标系键。如果一个值指定地理坐标系,而另一个值指定投影坐标系,则会出现错误。

若未为该参数指定值,则默认值为 4326,表示坐标为地理坐标且采用 'WGS 84' 地理坐标系。

示例: 26986

示例: 'EPSG:26986'

GeoKey 目录标签,指定为逗号分隔对组,其中包含 'GeoKeyDirectoryTag' 和一个结构体,该结构体用于指定 GeoTIFF 坐标参考系及元数据。该结构包含与 GeoTIFF 规范中 GeoKey 名称相匹配的字段名称。字段名称不区分大小写。该结构可从 GeoTIFF 信息结构中获取,该结构由 geotiffinfo 返回,位于字段 GeoTIFFTags.GeoKeyDirectoryTag 中。

若指定了 GTRasterTypeGeoKey 字段,geotiffwrite 将忽略该字段。此 GeoKey 的值源自 R。若将 GeoKeyDirectoryTag 的某些字段设置为不一致的配置,系统将显示错误提示。例如,如果 R 是地理栅格参考对象,而您指定了 ProjectedCSTypeGeoKey 字段或将 GTModelTypeGeoKey 字段设置为 1(投影坐标系),则会收到错误提示。同样地,如果 R 是地图栅格参考对象,而您未指定 ProjectedCSTypeGeoKey 字段或 CoordRefSysCode 字段,或者 GTModelTypeGeoKey 字段设置为 2(地理坐标系),则会收到错误消息。

可选的 RPC TIFF 标签值,指定为逗号分隔对组,其中包含 'RPCCoefficientTag' 和一个 RPCCoefficientTag 对象。

输出文件中 TIFF 标签的值,指定为逗号分隔对组,其中包含 'TiffTags' 和一个结构体。该结构的字段名称与 Tiff 类支持的 TIFF 标签名称相匹配。字段名称不区分大小写。

您无法通过结构输入设置大多数 TIFF 标签。

TiffTags 异常

BitsPerSampleSubFileTypeGeoAsciiParamsTag
SampleFormatSubIFDGeoDoubleParamsTag
SamplesPerPixelTileByteCountsGeoKeyDirectoryTag
StripByteCountsTileOffsetsModelPixelScaleTag
StripOffsetsImageLengthModelTiepointTag
ColorMapImageWidthModelTransformationTag

该函数设置了若干 TIFF 标签。下表列出了与 TIFF 标签对应的字段名称、由该函数设置的对应字段值、其允许值(若与 TIFF 类不同)及其数据类型。

自动 TIFF 标签

字段名称描述
Compression

图像压缩类型。默认值为 'PackBits'。其他允许的值为 'LZW''Deflate''none'

数字值、Tiff.Compression.LZWTiff.Compression.PackBitsTiff.Compression.DeflateTiff.Compression.None 也可使用。

PhotometricInterpretation

光度解释类型。字段名称可缩写为 Photometric。该值根据输入图像特征,采用以下算法进行设置:若 A 等于 [M-by-N-by-3] 且属于类型 uint8uint16,则其值为 'RGB'。对于所有其他大小和数据类型,其值为 'MinIsBlack'。若提供 XCMAP 语法,则值为 'Palette'。如果该值设置为 'RGB'A 不是 [M-by-N-by-3],则会触发错误。允许值为 'MinIsBlack''RGB''Palette''Separated'。数字值 Tiff.Photometric.MinIsBlackTiff.Photometric.RGBTiff.Photometric.PaletteTiff.Photometric.Separated 也可使用。

Software

该文件的软件制造商。该值被设置为值 'MATLAB, Mapping Toolbox, The MathWorks, Inc.'。要删除该值,请将标签设置为空字符串或字符向量 ('')。

RowsPerStrip

一个标量正整数值,用于指定输出文件中每条带所需的行数。若 A 的大小小于 [160-by-160],则 geotiffwriteRowsPerStrip 设为 1。若指定 RowsPerStripTileWidth,无论是否包含 TileLengthgeotiffwrite 都会报错。

TileWidth

一个标量正整数值和 16 的倍数,用于指定瓦片的宽度。当 A 的大小大于 [160-by-160] 时,则设置 TileWidth。如果如此,该值将导致最多生成 [10-by-10] 个瓷砖。若同时指定 RowsPerStripTileWidth,则会触发 geotiffwrite 的错误。

TileLength

一个标量正整数值和 16 的倍数,用于指定瓦片的长度。当 A 的大小大于 [160-by-160] 时,则设置 TileLength。如果如此,该值将导致最多生成 [10-by-10] 个瓷砖。若同时指定 RowsPerStripTileLength,则会触发 geotiffwrite 的错误。

TIFF 文件类型,指定为由 'TiffType''classictiff''bigtiff' 组成的逗号分隔对。'classictiff' 值将创建经典 TIFF 文件。'bigtiff' 值用于创建 BigTIFF 文件。采用 BigTIFF 格式时,文件大小可超过 4 GB。

虽然使用 'bigtiff' 格式可创建大于 4 GB 的文件,但要写入的数据必须能容纳在内存中。

提示

版本历史记录

在 R2006a 之前推出

全部展开