主要内容

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

geotiffwrite

写入 GeoTIFF 文件

说明

geotiffwrite(filename,A,R) 将具有地理参考的图像或数据网格 A(其栅格参考为 R)写入文件 filename

示例

geotiffwrite(filename,X,cmap,R) 将索引图像 X(使用颜色图 cmap 和栅格参考 R)写入 filename

geotiffwrite(___,Name=Value) 使用一个或多个名称-值参数指定选项。

示例

示例

全部折叠

将一张波士顿的 JPEG 图片 [1] 作为数组读入工作区。

jpgFilename = "boston_ovr.jpg";
RGB = imread(jpgFilename);

该图像由一个世界文件引用。根据图像文件的名称推导出世界文件的名称。然后,将世界文件作为栅格参考对象读入工作区。

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

将图像和参考对象写入一个 GeoTIFF 文件中。

tifFilename = "boston_ovr.tif";
geotiffwrite(tifFilename,RGB,R)

将 GeoTIFF 文件作为数组和引用对象读入工作区。将该图像显示在地图上。

[RGB2,R2] = readgeoraster(tifFilename);

figure
geoimage(RGB2,R2)
geobasemap none

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type rasterimage.

[1] The data used in this example includes material copyrighted by GeoEye, all rights reserved.

通过提取经典 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 数据库中搜索来自 EOX::Maps 的“蓝色弹珠”图层。有关 EOX::Maps 的更多信息,请参阅 EOX::Maps

layer = wmsfind("tiles.maps.eox.at",SearchFields="serverurl");
layer = refine(layer,"bluemarble",MatchType="exact");

将该图层作为数组和栅格引用对象读入工作区。

[A,R] = wmsread(layer);

将数据写入 GeoTIFF 文件。

geotiffwrite("bluemarble.tif",A,R)

将 GeoTIFF 文件作为数组和引用对象读入工作区。将该图像显示在地图上。

figure
newmap
geoimage(A,R)

使用文本框注解在地图上添加来源信息。

annotation("textbox",[0.52 0.05 0.47 0.1],EdgeColor="none", ...
    String="Blue Marble © NASA's Earth Observatory", ...
    VerticalAlignment="middle")

Figure contains an axes object with type mapaxes. The mapaxes object contains an object of type rasterimage.

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

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,该代码表示 NAD83 / 马萨诸塞州大陆投影坐标参考系 (CRS)。

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

将 GeoTIFF 文件作为数组和引用对象读入工作区。使用存储在参考对象中的投影坐标系创建一张新地图。然后,将该图像显示在地图上。

[X2,R2] = readgeoraster(tifFilename);

figure
pcrs = R2.ProjectedCRS;
newmap(pcrs)
geoimage(X2,R2)

Figure contains an axes object with type mapaxes. The mapaxes object contains an object of type rasterimage.

将波士顿的 GeoTIFF 图像 [1] 作为数组和栅格引用对象读入工作区。

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

将数据裁剪至由 xlimitsylimits 指定的 xy 边界。

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

将 GeoTIFF 图像的相关信息作为结构数组读入工作区。从结构数组中提取 GeoKey 目录标签。

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

将裁剪后的数据和 GeoKey 目录标签写入一个新的 GeoTIFF 文件中。

geotiffwrite("boston_subimage.tif",B,RB,GeoKeyDirectoryTag=key)

将新的 GeoTIFF 文件作为数组和引用对象读入工作区。使用存储在参考对象中的投影坐标系创建一张新地图。然后,将该图像显示在地图上。

[B2,RB2] = readgeoraster("boston_subimage.tif");

figure
pcrs = RB2.ProjectedCRS;
newmap(pcrs)
geoimage(B2,RB2)

Figure contains an axes object with type mapaxes. The mapaxes object contains an object of type rasterimage.

[1] The data used in this example includes material copyrighted by GeoEye, all rights reserved.

将科罗拉多州南博尔德峰周边区域的高程数据写入 GeoTIFF 文件。

将高程数据 [1] 作为矩阵和栅格参考对象读入工作区。

[Z,R] = readgeoraster("n39_w106_3arc_v2.dt1");

使用结构数组为 GeoTIFF 文件指定一个 GeoKey 目录标签。有关可指定的键的列表,请参阅 GeoTIFF 规范中的键 ID 摘要

  • 通过将 GTModelTypeGeoKey 字段指定为 2,表明该数据使用地理坐标。

  • 通过将 GTRasterTypeGeoKey 字段指定为 2,表明该数据是一组发布点样本的网格(而非单元格网格)。

  • 通过将 GeographicTypeGeoKey 字段指定为 4326,来指定数据的地理坐标参考系统 (CRS)。

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

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

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

将 GeoTIFF 文件作为矩阵和参考对象读入工作区。然后,将数据显示在地图上。应用适合高程数据的颜色图。

[Z2,R2] = readgeoraster(filename);

figure
geopcolor(Z2,R2)
demcmap(Z2)
geobasemap none

Figure contains an axes object with type geoaxes. The geoaxes object contains an object of type pseudocolorraster.

[1] 本示例中使用的高程数据来自美国地质调查局。

创建一个带有 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.tif",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.tif",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.tif",myimage,R,RPCCoefficientTag=rpcdata)

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

ginfo = geotiffinfo("myfile2.tif");
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 坐标系,除非您通过指定 GeoKeyDirectoryTagCoordRefSysCode 参量来指定其他坐标系。

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

AX 的栅格参考,指定为 GeographicCellsReferenceGeographicPostingsReferenceMapCellsReferenceMapPostingsReference 对象。

如果您正在投影坐标参考系中处理图像坐标,且 R 是一个地图栅格参考对象,请相应地指定 GeoKeyDirectoryTagCoordRefSysCode 参量。

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

索引图像,指定为一个 M 行、N 列的数值矩阵。

数据类型: uint8 | uint16

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

名称-值参数

全部折叠

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

示例: geotiffwrite(filename,A,R,CoordRefSysCode=26986) 指定了坐标的坐标参考系代码。

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

示例: geotiffwrite(filename,A,R,"CoordRefSysCode",26986) 指定了坐标的坐标参考系代码。

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

如果同时指定了 GeoKeyDirectoryTagCoordRefSysCode 参量,则 CoordRefSysCode 中的坐标系代码优先于 GeoKeyDirectoryTag 中找到的坐标系键。如果一个值指定的是地理坐标系,而另一个值指定的是投影坐标系,则该函数会报错。

如果未为此参量指定值,则默认值为 4326,表示坐标为地理坐标,且采用 WGS 84 地理坐标系。

示例: 26986

示例: "EPSG:26986"

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

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

可选的 RPC TIFF 标签的值,指定为一个 RPCCoefficientTag 对象。

输出文件中 TIFF 标签的值,以结构体形式指定。该结构的字段名称与 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 文件类型,指定为 "classictiff""bigtiff""classictiff" 选项用于创建经典 TIFF 文件。"bigtiff" 选项用于创建 BigTIFF 文件。采用 BigTIFF 格式时,文件大小可超过 4 GB。

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

提示

  • 若您在投影坐标系中处理图像坐标,且 R 是地图栅格参考对象,则需相应地设置 GeoKeyDirectoryTagCoordRefSysCode 参数。

  • 您可以通过查阅 GeoTIFF 规范来获取 CoordRefSysCodeGeoKeyDirectoryTag 参量的值。

    • 有关可为地理坐标系指定的 CoordRefSysCode 值列表,请参阅 GeoTIFF 规范中的地理坐标系类型代码

    • 有关可在投影坐标系中指定的 CoordRefSysCode 值列表,请参阅 GeoTIFF 规范中的投影坐标系类型代码

    • 有关可通过 GeoKeyDirectoryTag 参量指定的键的列表,请参阅 GeoTIFF 规范中的键 ID 摘要

版本历史记录

在 R2006a 之前推出

全部展开