主要内容

将图像和光栅栅格导出到GeoTIFF

下面的示例演示如何将引用到标准地理和投影坐标系统的数据写入GeoTIFF文件geotiffwrite.标记图像文件格式(TIFF)已经成为一种流行的存储光栅数据的格式。GeoTIFF规范定义了一组描述与TIFF光栅数据关联的“制图”信息的TIFF标记。使用这些标记,可以将引用地理坐标系统(纬度和经度)或(平面)投影坐标系统的坐标的地理图像或栅格网格存储在GeoTIFF文件中。

设置:定义数据文件夹和文件名实用程序功能

此示例创建几个临时GeoTIFF文件并使用变量数据目录表示它们的位置。此处使用的值由坦普迪尔命令,但您可以轻松自定义它数据目录在示例的最后删除。

datadir=fullfile(tempdir,“datadir”);如果~exist(datadir,“dir”)mkdir(datadir)结束

定义一个匿名函数作为前缀数据目录为输入文件名:

Datafile = @(filename)fullfile(datadir, filename);

示例1:编写参考地理坐标的图像

将引用WGS84地理坐标的图像写入GeoTIFF文件。原始图像(boston_ovr.jpg)以JPEG格式存储,在“世界文件”(boston_ovr.jgw)中引用图像文件外部的信息。该图像提供了马萨诸塞州波士顿及其周边地区的低分辨率“概览”。

从JPEG文件中读取图像。

: =“波士顿奥弗”;imagefile = [basename“jpg”]; A1=imread(图像文件);

从世界文件中获取引用对象。

worldfile=getworldfilename(imagefile);R1=worldfileread(worldfile,“地理”,尺寸(A1));

将图像写入GeoTIFF文件。

filename1=数据文件([basename“.tif”]); geotiffwrite(文件名1、A1、R1)

返回关于文件的信息RasterInfo对象。的值CoordinateReferenceSystem是地理坐标参考系对象。

info1=georasterinfo(filename1);info1.coordinaereferencesystem
ans=geocrs,属性:名称:“WGS 84”基准:“世界大地测量系统1984”球体:[1×1参考椭球体]本初子午线:0角度单位:“度”

重新导入新的GeoTIFF文件,并在地图轴中正确显示波士顿概览图像。

图usamap(R1.横向极限,R1.纵向极限)setm(gca,“PLabelLocation”,0.05,“PlabelRound”,-2,“PlineLocation”,0.05)地理展示(文件名1)标题(“波士顿概览”

例2:写入引用地理坐标的数据网格

加载高程光栅数据和地理单元格引用对象。将数据网格写入GeoTIFF文件。

负载topo60cZ2=topo60c;R2=topo60cR;文件名2=datafile(‘topo60c.tif’);geotiffwrite (filename2 Z2, R2)

数据网格中的值范围为-7473 ~ 5731。将网格显示为纹理映射的表面,而不是强度图像。

数字世界地图世界gridmsetm(gca,“MLabelParallel”, -90,“MLabelLocation”,90)tmap=geoshow(文件名2,“DisplayType”“纹理贴图”);demcmap (tmap.CData)标题(“高程数据网格”

示例3:更改GeoTIFF文件的数据组织

当您使用geotiffwrite或使用readgeoraster,数据网格的列从北开始,行从西开始。例如,来自topo60c.mat从南边开始,但输出数据从topo60c.tif从北开始。

R2.ColumnsStartFrom[Z3,R3]=readgeoraster(文件名2);R3.ColumnsStartFrom
ans=‘南’ans=‘北’

因此,输入数据和GeoTIFF文件中的数据被翻转。

isequal (Z2 flipud (Z3))
ans=逻辑1

如果需要再次匹配工作区中的数据,请翻转Z值并设置引用对象,使列从南部开始:

R3.ColumnsStartFrom=“南方”;Z3=flipud(Z3);等质量(Z2,Z3)
ans=逻辑1

GeoTIFF文件中的数据使用正比例值进行编码。因此,当您使用普通TIFF查看软件查看文件时,数据集的北边缘位于顶部。要使输出文件中的数据布局与输入的数据布局匹配,您可以构造TIFF对象,并使用它重置一些标记和图像数据

t=Tiff(文件名2,“r+”);pixelScale = getTag (t)“ModelPixelScaleTag”);pixelScale(2)=-pixelScale(2);setTag(t,“ModelPixelScaleTag”,pixelScale);tiepoint=getTag(t,“ModelTiepointTag”);tiepoint (5) = intrinsicToGeographic (R2, 0.5, 0.5);setTag (t)“ModelTiepointTag”, tiepoint);setTag (t)“压缩”Tiff.Compression.None)写(t, Z2);rewriteDirectory (t)关闭(t)

验证输入数据中的引用对象和数据网格是否与输出数据文件匹配。为此,请读取Tiff图像并创建引用对象。然后比较网格。

t = Tiff (filename2);Atiff =阅读(t);close(t) Rtiff = georefcells(R2.LatitudeLimits, r2 . longitude elimits,size(Atiff));Atiff isequal (Z2) isequal (R2, Rtiff)
ans=逻辑1 ans=逻辑1

示例4:编写参照投影坐标系的图像

将Concord正射影像写入单个GeoTIFF文件。两个相邻的(从西到东)地理参考灰度(全色)正射影像覆盖美国马萨诸塞州Concord的一部分。Concord_ortho.txt文件表示数据参考马萨诸塞州大陆(NAD83)州平面投影坐标系。单位为米。这对应于GeoTIFF规范中所述的GeoTIFF代码26986http://geotiff.maptools.org/spec/geotiff6.html#6.3.3.1PCS_NAD83_Massachusetts之下。

读两张正射影像。

[X_west, R_west] = readgeoraster (“concord_ortho_w.tif”);[X_east, R_east] = readgeoraster (“concord_ortho_e.tif”);

结合图像和参考对象。

X4=[X_西X_东];R4=鲁西;R4.XWorldLimits=[R_west.XWorldLimits(1)R_east.XWorldLimits(2)];R4.光栅尺寸=尺寸(X4);

将数据写入GeoTIFF文件。使用代码26986,表示PCS_NAD83_马萨诸塞投影坐标系。

coordRefSysCode=26986;filename4=datafile(“concord_ortho.tif”);geotiffwrite(文件名4、X4、R4、,“CoordRefSysCode”,coordRefSysCode)

返回关于文件的信息RasterInfo对象。的值CoordinateReferenceSystem是投影坐标参照系对象。

info4 = georasterinfo (filename4);info4。CoordinateReferenceSystem
ans=具有属性的项目:名称:“NAD83/马萨诸塞州大陆”地理[1×1 geocrs]投影方法:“Lambert圆锥共形(2SP)”长度单位:“米”投影参数:[1×1 map.crs.ProjectionParameters]

显示合并的协和正射影像。

图mapshow (filename4)标题(“联合正色摄影”)包含(“大陆国航飞机东行,米”) ylabel (“大陆国航飞机北上,米”

示例5:从GeoTIFF文件中写入裁剪后的图像

将一个GeoTIFF文件的子集写入一个新的GeoTIFF文件。

从中读取RGB图像和参考信息波士顿.tifGeoTIFF文件。

(A5, R5) = readgeoraster (“boston.tif”);

作物图像。

xlimits=[764318 767677];ylimits=[2951122 2954482];[A5crop,R5crop]=mapcrop(A5,R5,xlimits,ylimits);

将裁剪后的图像写入GeoTIFF文件。使用原始GeoTIFF文件中的GeoKeyDirectoryTag。

info5=geotiffinfo(“boston.tif”);filename5 =丢失(“boston_subimage.tif”);geotiffwrite(文件名5、A5crop、R5crop、,...“GeoKeyDirectoryTag”info5.GeoTIFFTags.GeoKeyDirectoryTag)

显示包含裁剪图像的GeoTIFF文件。

图mapshow (filename5)标题('芬威公园-裁剪图像从GeoTIFF文件')包含(“大陆国航飞机东行,测量尺”) ylabel ('大陆国机北行,测量英尺'

例6:将海拔数据写入GeoTIFF文件

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

elevFilename=‘n39_w106_3arc_v2.dt1’

从文件中读取DEM。绘制数据使用地理展览,数据必须是具有类型的仅有一个的双重的。使用“OutputType”名称-值对。

[Z6,R6]=readgeoraster(elevFilename,“OutputType”“双”);

创建一个结构来保存GeoKeyDirectoryTag信息。

key=struct(...“GTModelTypeGeoKey”[],...“GTRasterTypeGeoKey”[],...“地理类型地理键”[]);

属性指示数据在地理坐标系统中GTModelTypeGeoKey字段2。属性指示引用对象使用贴子(而不是单元格)GTRasterTypeGeoKey字段2。属性指示数据被引用到地理坐标参考系统地理类型地理键在4326年。

关键。GTModelTypeGeoKey = 2;关键。GTRasterTypeGeoKey = 2;关键。GeographicTypeGeoKey = 4326;

将高程数据写入GeoTIFF文件。

filename6 =丢失(“southboulder.tif”); geotiffwrite(文件名6、Z6、R6、,“GeoKeyDirectoryTag”键),

通过显示数据来验证数据已经写入到文件中。首先,输入代表科罗拉多州边界的病媒数据成形头.然后,显示边界和GeoTIFF文件。

S = shaperead (“usastatelo”“UseGeoCoords”符合事实的“选择器”...{@(名称)(strcmp(名字,{“科罗拉多”})),“名字”});如图所示“科罗拉多”持有geoshow(年代,“FaceColor”“没有”) g = geoshow(filename6,“DisplayType”“网”);demcmap (g.ZData)标题(“南Boulder Peak Elevation”

例7:将非图像数据写入TIFF文件

如果您正在处理的数据网格是类double,其值范围超出浮点强度图像所要求的限制(0 <= data <= 1),并且如果您使用imwrite,则您的数据将被截断为间隔[0,1],缩放并转换为uint8。显然,原始数据中的部分甚至所有信息都可能丢失。若要避免这些问题,并保留数据网格的数值类和范围,请使用geotiffwrite写入数据。

创建示例Z数据。

n = 512;Z7 =山峰(n);

创建引用对象以将行和列引用到X和Y。

R7=maprasterref(“光栅大小”(n (n),“ColumnsStartFrom”“北方”); R7.XWorldLimits=R7.xInTrinsic Limits;R7.YWorldLimits=R7.yInTrinsic Limits;

创建用于保存GeoKeyDirectoryTag信息的结构。将模型类型设置为1,表示投影坐标系(PCS)。

关键。GTModelTypeGeoKey = 1;

设置栅格类型为1,表示PixelIsArea(单元格)。

key.GTRasterTypeGeoKey=1;

使用值32767指示用户定义的投影坐标系统。

key.ProjectedCSTypeGeoKey=32767;

将数据写入GeoTIFF文件geotiffwrite。为了进行比较,请使用编写第二个文件imwrite

filename\u geotiff=数据文件(“zdata_geotiff.tif”);filename_tiff=数据文件(“zdata_tiff.tif”);R7 geotiffwrite (filename_geotiff Z7,“GeoKeyDirectoryTag”键)imwrite (Z7 filename_tiff);

当您读取文件使用imread数据值和类类型被保留。您可以看到TIFF文件中的数据值未被保留。

geoZ = imread (filename_geotiff);tiffZ = imread (filename_tiff);流('Class type of Z: %s\n',类别(Z7))fprintf(' GeoTIFF文件中的类类型数据:%s\n',类别(geoZ))fprintf('TIFF文件中数据的类别类型:%s\n',类别(tiffZ))fprintf(' GeoTIFF文件中的数据是否等于Z: %d\n',等质量(geoZ,Z7))fprintf(' TIFF文件中的数据是否等于Z: %d\n'isequal (tiffZ Z7))
Z的类类型:GeoTIFF文件中的双类数据类型:TIFF文件中的双类数据类型:uint8 GeoTIFF文件中的数据是否等于Z:1 TIFF文件中的数据是否等于Z:0

您可以使用查看数据网格地图秀

图mapshow (filename_geotiff,“DisplayType”“纹理贴图”)头衔(“山峰-存储在GeoTIFF文件”

示例8:在保留元信息的同时修改现有文件

您可能希望修改现有文件,但保留TIFF标记中的大部分(如果不是全部)元信息。这个例子转换的RGB图像从波士顿.tif文件写入索引图像,并将新数据写入索引GeoTIFF文件。TIFF元信息(BitDepth、BitsPerSample和PhotometricInterpretation标记的值除外)将保留。

从屏幕上读取图像波士顿.tifGeoTIFF文件。

(A8, R8) = readgeoraster (“boston.tif”);

利用MATLAB函数,rgb2ind,将RGB图像转换为索引图像X使用最小方差量化。

[出数,提出]= rgb2ind (A8, 65536);

通过以下方式获取TIFF标签信息imfinfo

info8=imfinfo(“boston.tif”);

创建TIFF标记结构,以从信息结构

标签=结构(...“压缩”, info8。压缩,...“RowsPerStrip”, info8。RowsPerStrip,...“X分辨率”, info8。XResolution,...“YResolution”,info8.YResolution,...“ImageDescription”, info8。ImageDescription,...“DateTime”, info8。DateTime,...“版权”, info8。版权,...“定位”,info8.定位);

PlanarConfiguration和ResolutionUnit标记的值必须是数值而不是字符串值,如imfinfo.您可以使用Tiff类中的常量属性来设置这些标记。例如,以下是PlanarConfiguration常量属性的可能值:

Tiff.平面配置
ans = struct with fields: Chunky: 1 Separate: 2

的字符串值信息结构以获得所需的值。

标签。PlanarConfiguration =...Tiff.PlanarConfiguration。(info8.PlanarConfiguration);

以相同的方式设置ResolutionUnit值。

标签。ResolutionUnit = Tiff.ResolutionUnit。(info8.ResolutionUnit);

中没有设置“软件”标签波士顿.tif但是,,geotiffwrite将设置软件默认情况下标记。若要保留信息,请将该值设置为空字符串,以防止将标记写入文件。

标签。软件=''

从中复制GeoTIFF信息波士顿.tif

geoinfo = geotiffinfo (“boston.tif”); key=geoinfo.geotiffttags.GeoKeyDirectoryTag;

写入GeoTIFF文件。

filename8=数据文件(“boston_indexed.tif”);R8 geotiffwrite (filename8出数,提出,“GeoKeyDirectoryTag”的关键,“TiffTags”,标签)

查看索引图像。

图mapshow (filename8)标题('Boston - Indexed Image')包含(“大陆国航飞机东行,测量尺”) ylabel ('大陆国机北行,测量英尺'

通过打印一个值表,比较结构中应该相等的信息。

info_rgb = imfinfo (“boston.tif”);info_indexed = imfinfo (filename8);tagname =字段名(标签);tagname (strcmpi (“软件”,标记名))=[];名称=[{“高度”“宽度”}, tagname];间隔= 2;fieldnameLength = max(cellfun(@length, names)) + spacing;formatSpec = ['%-'int2str (fieldnameLength)“年代”];fprintf([formatSpec formatSpec formatSpec' \ n '],...的字段名“RGB信息”“索引信息”)fprintf([formatSpec formatSpec formatSpec' \ n '],...'---------''---------------''-------------------'k = 1:length(names) fprintf([formatSpec formatSpec formatSpec . k]' \ n '],...名称{k},...num2str(info_rgb.(名称{k})),...num2str(信息索引(名称{k})))结束
Fieldname RGB Information Indexed Information --------- --------------- ------------------- Height 2881 2881 Width 4481 4481 Compression Uncompressed Uncompressed RowsPerStrip 256 256 XResolution 300 300 YResolution 300 300 ImageDescription "GeoEye" "GeoEye" DateTime 2007:02:23 21:46:13 2007:02:23 21:46:13 Copyright "(c) GeoEye" "(c) GeoEye"方向1平面配置Chunky Chunky分辨率单位英寸英寸

由于已通过打印值表将RGB图像转换为索引图像,因此请比较应不同的信息。

姓名={“文件大小”“颜色类型”“比特深度”...“BitsPerSample”“光度测量解释”};fieldnameLength=max(cellfun(@length,names))+间距;formatSpec=['%-'int2str (fieldnameLength)“年代”];格式规格2=“%-17s”;流([' \ n 'formatSpec formatSpec2 formatSpec2' \ n '],...的字段名“RGB信息”“索引信息”) fprintf([formatSpec formatSpec2 formatSpec2 . txt]' \ n '],...'---------''---------------''-------------------'k=1:长度(名称)fprintf([formatSpec formatSpec2 formatSpec2' \ n '],...名称{k},...num2str(info_rgb.(名称{k})),...num2str(信息索引(名称{k})))结束
Fieldname RGB Information Indexed Information --------- --------------- ------------------- FileSize 38729900 27925078 ColorType truecolor Indexed BitDepth 24 16 BitsPerSample 8 8 8 16 PhotometricInterpretation RGB RGB Palette

清理:删除数据文件夹

删除临时文件夹和数据文件。

删除目录(datadir“年代”

数据集信息

的文件波士顿.tifboston_ovr.jpg包括GeoEye版权所有的材料,保留所有权利。GeoEye于2013年1月29日并入DigitalGlobe公司。有关数据集的更多信息,请使用命令键入boston.txt键入boston_ovr.txt

的文件concord_orthow_w.tifconcord_ortho_e.tif是由马萨诸塞州联邦地理信息局(MassGIS)、技术和安全服务执行办公室的正射影片获得的。有关数据集的更多信息,请使用该命令类型concord_ortho.txt。有关MassGIS提供的数据的更新链接,请参阅https://www.mass.gov/info-details/massgis-data-layers

DTED文件n39_w106_3arc_v2.dt1由美国地质调查局提供。

另请参阅

|||