Arc/Info二进制网格格式
by Frank Warmerdam (wartemdam@pobox.com)
Arc/Info二进制网格格式是Arc/Info网格产品的内部工作格式。它也可以在ArcView的空间分析组件中使用和创建。它是一种平铺(块)格式,具有运行长度压缩功能,能够保存高达4字节整数或4字节浮动数据的栅格数据。
此格式不应与作为网格交换格式的Arc/Info ASCII网格格式混淆。可以使用Arc/Info中的GRIDASCII和ascigrid命令在二进制和ASCII格式之间转换文件。此格式也不同于GRIDFLOAT命令的平面二进制栅格输出。Arc/Info二进制浮点和ASCII格式也可以从ArcView中访问。
这种格式也不应与我所知的ESRIBIL格式混淆。这实际上是创建头文件(.HDR)的标准ESRI方法,该文件描述数据布局包含栅格数据的二进制栅格文件。
版本
我还不确定网格文件的版本是如何工作的。我主要处理由ArcView 3.x生成的网格文件及其相关的gridio API。我检查过的hdr.adf文件以字符串开头 GRID1.2 因为那是值得的。当然,文件命名约定似乎遵循的是Arc/Info 7.x约定,而不是早期版本的约定。
文件集
网格覆盖实际上由许多文件组成。网格通常位于以网格命名的自己的目录中。例如,网格 nwgrd1号 住在目录里 nwgrd1号 ,并具有以下组件文件:
-rwxr--r-- 1 warmerda users 32 Jan 22 16:07 nwgrd1/dblbnd.adf
-rwxr--r-- 1 warmerda users 308 Jan 22 16:07 nwgrd1/hdr.adf
-rwxr--r-- 1 warmerda users 32 Jan 22 16:07 nwgrd1/sta.adf
-rwxr--r-- 1 warmerda users 2048 Jan 22 16:07 nwgrd1/vat.adf
-rwxr--r-- 1 warmerda users 187228 Jan 22 16:07 nwgrd1/w001001.adf
-rwxr--r-- 1 warmerda users 6132 Jan 22 16:07 nwgrd1/w001001x.adf
有时,数据集还将包含一个prj.adf文件,其中包含通常ESRI格式的投影定义。网格通常在info目录中也有关联的表。这超出了我现在讨论的范围。
文件具有以下角色:
dblbnd.adf :包含网格已利用部分的边界(LLX、LLY、URX、URY)。
hdr.adf :这是标题,包含有关数据集中平铺大小和数量的信息。它还包含各种其他信息,我还没有确定。
sta.adf :这包含栅格统计信息。特别是栅格最小、最大、平均和标准偏差。
vat.adf :这与值属性表有关。这是具有一组属性的与整数栅格值相对应的表。我认为它实际上只是一个指向信息的指针,其方式类似于向量覆盖中的pat.adf文件,但我还没有调查。
w001001.adf :这是包含实际栅格数据的文件。
w001001x.adf :这是一个索引文件,包含指向w001001.adf栅格文件中每个分幅的指针。
dblbnd.adf-Georef边界
领域:
始字节
#字节数
格式
名字
描述
0
8
双倍最大有效位
D_LLX
网格的左下X(东距)。对于非地理参考栅格,通常为-0.5。
8
8
双倍最大有效位
D_LLY
网格的左下Y(北距)。对于非地理参考栅格,通常为-0.5。
16
8
双倍最大有效位
D_URX
网格的右上角X(东距)。通常#像素-0.5,用于非地理参考栅格。
24
8
双倍最大有效位
D_URY
网格的右上角Y(北距)。通常#线-0.5,用于非地理参考栅格。
这个文件总是32字节长。边界适用于正在使用的网格部分,而不是整个网格。
w001001x.adf-瓷砖索引
这是w001x.adf文件的前320字节的二进制转储。
0: 0000270A FFFFFC14 00000000 00000000 ~~'~~~~~~~~~~~~~
16: 00000000 00000000 00000BFA 00000000 ~~~~~~~~~~~~~~~~
32: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
48: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
64: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
80: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
96: 00000000 00000032 00000202 00000235 ~~~~~~~2~~~~~~~5
112: 000001D4 0000040A 00000000 0000040B ~~~~~~~~~~~~~~~~
128: 00000000 0000040C 00000000 0000040D ~~~~~~~~~~~~~~~~
144: 00000000 0000040E 00000000 0000040F ~~~~~~~~~~~~~~~~
160: 00000000 00000410 00000202 00000613 ~~~~~~~~~~~~~~~~
176: 000001D4 000007E8 00000000 000007E9 ~~~~~~~~~~~~~~~~
192: 00000000 000007EA 00000000 000007EB ~~~~~~~~~~~~~~~~
208: 00000000 000007EC 00000000 000007ED ~~~~~~~~~~~~~~~~
224: 00000000 000007EE 00000202 000009F1 ~~~~~~~~~~~~~~~~
240: 000001D4 00000BC6 00000000 00000BC7 ~~~~~~~~~~~~~~~~
256: 00000000 00000BC8 00000000 00000BC9 ~~~~~~~~~~~~~~~~
272: 00000000 00000BCA 00000000 00000BCB ~~~~~~~~~~~~~~~~
288: 00000000 00000BCC 00000202 00000DCF ~~~~~~~~~~~~~~~~
304: 000001D4 00000FA4 00000000 00000FA5 ~~~~~~~~~~~~~~~~
领域:
始字节
#字节数
格式
描述
0
8
Magic Number (always hex 00 00 27 0A FF FF ** **, usually ending in FC 14, FB F8 or FC 08).
8
16
零填充
24
4
MSB Int32
以短格式显示的整个文件的大小(乘以2可得到以字节为单位的文件大小)。
28
72
零填充
100 + t * 8
4
MSB Int32
偏移到平铺 t 在w001001.adf中,以两字节短路测量。
104个+ t * 8
4
MSB Int32
瓷砖尺寸 t 两个字节的短路。
sta.adf-栅格统计
领域:
始字节
#字节数
格式
名字
描述
0
8
双倍最大有效位
SMin
此网格中栅格单元格的最小值。
8
8
双倍最大有效位
SMax
此网格中栅格单元格的最大值。
16
8
双倍最大有效位
SMean
此网格中栅格单元格的平均值。
24
8
双倍最大有效位
SStdDev
此网格中栅格单元格的标准偏差。
这个文件总是32字节长。
w001001.adf-栅格数据
这是w001001.adf文件的前320字节的二进制转储。
0: 0000270A FFFFFC14 00000000 00000000 ~~'~~~~~~~~~~~~~
16: 00000000 00000000 00016DAE 00000000 ~~~~~~~~~~m~~~~~
32: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
48: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
64: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
80: 00000000 00000000 00000000 00000000 ~~~~~~~~~~~~~~~~
96: 00000000 02020800 00373D42 5C5A4D31 ~~~~~~~~~7=B\ZM1
112: 200A0108 0E1D4F89 9C9A9392 8C7E6653 ~~~~~O~~~~~~~fS
128: 5151596D 83919290 868A8B87 807A7A7B QQYm~~~~~~~~~zz{
144: 7C7A766F 64481D00 0406305F 6B6C6A5B |zvodH~~~~0_klj[
160: 5D53513C 2D2D2732 24293F54 40354C55 ]SQ<--'2$)?T@5LU
176: 67686258 514E4943 5859534A 41394D70 ghbXQNICXYSJA9Mp
192: 75665659 66625A63 737A848E 9090979F ufVYfbZcsz~~~~~~
208: 9F908C8F 8F96998E 8778685B 53536274 ~~~~~~~~~xh[SSbt
224: 747B838A 8A8C8F92 8D979B94 8C8D9294 t{~~~~~~~~~~~~~~
240: 8D8D8D8D 8C8B8989 8B8E908F 8E8E9092 ~~~~~~~~~~~~~~~~
256: 90929394 989C9891 92939698 9B9B9C9C ~~~~~~~~~~~~~~~~
272: 8E8E8F8F 8E8E8F90 898E918F 8B8A8E93 ~~~~~~~~~~~~~~~~
288: 8B8D9093 94918C86 838DA1BC B7CEC9B0 ~~~~~~~~~~~~~~~~
304: D4B0BB96 A0929E99 9797999B 9D9C9C9B ~~~~~~~~~~~~~~~~
领域:
始字节
#字节数
格式
名字
描述
0
8
RMagic
Magic Number (always hex 00 00 27 0A FF FF ** **, usually ending in FC 14, FB F8 or FC 08).
8
16
零填充
24
4
MSB Int32
RFileSize
以短格式显示的整个文件的大小(乘以2可得到以字节为单位的文件大小)。
28
72
零填充
100。。。
2
国际16号
RTileSize
这个瓷砖的尺寸数据是用短裤测量的。这与索引文件中的大小匹配,但不包括磁贴大小本身。下一个平铺开始 2*n+2 此磁贴开始后的字节,其中 n 是此字段的值。
102。。。
1
字节
RTileType
指示以下数据组织的平铺类型代码(仅限整数覆盖)。
103。。。
1
字节
RMinSize
以下构成磁贴最小值的字节数(仅限整数覆盖)。
104。。。
(RMinSize字节)
MSB Int(变量大小)
RMin
此平铺的最小值像素。此数字将添加到此平铺中每个像素的像素值(仅限整数覆盖)。我必须强调,如果RMinSize小于4,这仍然是有符号的数量。例如,如果RMinSize为2,则如果byte0大于127,则值为65536-byte0*256-byte1。
104+分钟。。。
RTileSize*2-3-RMinSize
变量
RTileData
此磁贴的数据。整型覆盖率的格式根据RTileType的不同而不同。
RTileSize、RTileType、RMinSize、RMin和RTileData字段出现在文件中,用于显示每个数据分片。他们通常是一个接一个地打包,但这并不一定能保证。应使用索引文件(w001001x.adf)建立磁贴位置。请注意,索引文件中出现的大小为零的平铺将显示为该平铺的RTileSize的两个字节(零)。
栅格尺寸
网格的大小并不像人们想象的那么容易推断。adf文件包含HTilesPerRow、HTilesPerColumn、HTileXSize和HTileYSize字段,这些字段表示特定的栅格空间。然而,这似乎是创建的远远大于保存用户栅格数据所必需的。我创建了3x1个栅格,每个栅格产生256x4像素的标准8x512块。
似乎栅格的用户部分必须基于dblbnd.adf文件中的地理参考边界(假定锚定在栅格总空间的左上角)和hdr.adf中的HPixelSizeX和HPixelSizeY字段来计算。
#Pixels = (D_URX - D_LRX) / HPixelSizeX
#Lines = (D_URY - D_LRY) / HPixelSizeY
基于这个像素和线的数量,可以确定栅格左上角的部分是什么 感兴趣的 . 此区域之外的所有区域都将显示为空平铺,或填充为无数据标记。
RTileType/RTileData类型
每个磁贴包含HBlockXSize * HBlockYSize数据像素。对于浮点和未压缩整数文件,数据仅为平铺大小(以两个字节为单位),后跟像素数据(以4字节的MSB顺序为IEEE浮点字)。对于压缩整数平铺,需要解释RTileType以建立平铺组织的详细信息:
RTileType=0x00(常量块)
所有像素都取RMin的值。忽略数据。似乎有时块中有一些无意义的数据(最多4个字节)。
RTileType=0x01(原始1bit数据)
一个完整的数据像素值块跟随RMin字段,每个像素1比特。
RTileType=0x04(原始4位数据)
一个完整的数据像素值块跟随RMin字段,每个像素4位。字节的高阶四位在低阶四位之前。
RTileType=0x08(原始字节数据)
一个完整的数据像素值(每个像素一个字节)将跟随RMin字段。
RTileType=0x10(原始16位数据)
一个完整的数据像素值平铺跟随RMin字段,每个像素16位(MSB)。
RTileType=0x20(原始32位数据)
RMin字段后面是一个完整的数据像素值,每个像素32位(MSB)。
RTileType=0xCF(16位文字运行/nodata运行)
数据以一系列的运行方式组织。每次运行以一个标记开始,该标记应解释为:
Marker < 128 :标记后面跟着 标记 每像素两个MSB字节的文本数据像素。
Marker > 127 :标记表示 256-Marker 像素 没有数据 像素应该放入输出流中。此标记后面没有数据(下一个标记除外)。
RTileType=0xD7(文字运行/nodata运行)
数据以一系列的运行方式组织。每次运行以一个标记开始,该标记应解释为:
Marker < 128 :标记后面跟着 标记 每像素一个字节的文本数据像素。
Marker > 127 :标记表示 256-Marker 像素 没有数据 像素应该放入输出流中。此标记后面没有数据(下一个标记除外)。
RTileType=0xDF(RMin运行/nodata运行)
数据以一系列的运行方式组织。每次运行以一个标记开始,该标记应解释为:
Marker < 128 :标记后面跟着 标记 每像素一个字节的文本数据像素。
Marker > 127 :标记表示 256-Marker 像素 没有数据 像素应该放入输出流中。此标记后面没有数据(下一个标记除外)。
这与0xD7类似,只是数据大小是0字节而不是1,因此只有RMin值插入到输出流中。
RTileType=0xE0(运行长度编码的32位)
数据以一系列的运行方式组织。每次运行都以一个标记开始,该标记应解释为 计数 . 计数后的四个字节应解释为MSB Int32 价值 . 它们表明 计数 像素 价值 应该插入到输出流中。
RTileType=0xF0(运行长度编码16位)
数据以一系列的运行方式组织。每次运行都以一个标记开始,该标记应解释为 计数 . 计数后的两个字节应解释为MSB Int16 价值 . 它们表明 计数 像素 价值 应该插入到输出流中。
RTileType=0xFC/0xF8(运行长度编码8bit)
数据以一系列的运行方式组织。每次运行都以一个标记开始,该标记应解释为 计数 . 以下字节是 价值 . 它们表明 计数 像素 价值 应该插入到输出流中。
对0xFC和0xF8的解释相同。我相信0xFC的动态(2位)范围比0xF8(4位或8位)要小。
RTileType=0xFF(RMin CCITT RLE 1Bit)
此文件的数据流是CCITT RLE(G1传真)压缩的。格式很复杂,但源代码随示例程序(从libtiff派生)提供,用于读取它。解压缩的结果是1位数据,因此应添加RMin值。
hdr.adf-标题
这是hdr.adf文件的前308字节的二进制转储。
0: 47524944 312E3200 00000000 FFFFFFFF GRID1.2~~~~~~~~~
16: 00000001 00000000 0000164E 3F800000 ~~~~~~~~~~~N?~~~
32: 00000F00 F6180000 90060000 3603D601 ~~~~~~~~~~~~6~~~
48: 6403E301 01000000 7620F808 43012B03 d~~~~~~~v ~~C~+~
64: D6019903 E3012B03 D6019903 E301F7BF ~~~~~~+~~~~~~~~~
80: 00007406 6E1FC2A4 7A370D00 0B004200 ~~t~n~~~z7~~~~B~
96: 4E1654A4 00000000 00000000 00000000 N~T~~~~~~~~~~~~~
112: 34A5A89D FF0414A5 A70F0002 00000000 4~~~~~~~~~~~~~~~
128: 00000000 3C0B5F06 A8C05F06 08005AC0 ~~~~<~_~~~_~~~Z~
144: 0A00E101 36035AC0 72085F06 FAA42F3C ~~~~6~Z~r~_~~~/<
160: 0A001667 02000E00 A80B0200 08370200 ~~~g~~~~~~~~~7~~
176: 0CA00200 9C0B0200 04370200 36A0E436 ~~~~~~~~~7~~6~~6
192: 84000000 36A00200 5F063EA5 0883FF04 ~~~~6~~~_~>~~~~~
208: 00008400 00000010 BD810200 5F010000 ~~~~~~~~~~~~_~~~
224: 670E0000 5F01560E 4C4F0001 84008CA5 g~~~_~V~LO~~~~~~
240: 28008F01 1000E00A 6628F7BF 4076FF04 (~~~~~~~f(~~@v~~
256: 3FF00000 00000000 3FF00000 00000000 ?~~~~~~~?~~~~~~~
272: C08FFC00 00000000 C0A1BF00 00000000 ~~~~~~~~~~~~~~~~
288: 00000008 00000200 00000100 00000001 ~~~~~~~~~~~~~~~~
304: 00000004 ~~~~
领域:
始字节
#字节数
格式
名字
描述
0
8
烧焦
HMagic
幻数-始终为“GRID1.20”
8
8
各种各样的数据,我不知道目的。
16
4
MSB Int32
HCellType
1=内盖,2=浮子盖。
20
4
MSB Int32
CompFlag
0=压缩,1=未压缩
24
232
各种各样的数据,我不知道目的。
256
8
双倍最大有效位
菲克斯
地理参考坐标系中像素的宽度。通常为1.0,用于未地理参考的栅格。
264
8
双倍最大有效位
菲克塞西
地理参考坐标系中像素的高度。通常为1.0,用于未地理参考的栅格。
272
8
双倍最大有效位
XRef
dfLLX-(nBlocksPerRow) nBlockXSize大小 dfCellSizeX)/2.0版
280
8
双倍最大有效位
YRef
杜里-(3 nblocksperc列 nBlockYSize*dfCellSizeY)/2.0版本
288
4
MSB Int32
HTilesPerRow
平铺中文件的宽度(对于宽度小于2K的文件,通常为8)。
292
4
MSB Int32
HTilesPerColumn
平铺中文件的高度。注意,这可能远远超过索引文件中实际表示的平铺数。
296
4
MSB Int32
HTileXSize
以像素为单位的文件宽度。通常是256。
300
4
MSB Int32
未知,通常为1。
304
4
MSB Int32
HTileYSize
以像素为单位的平铺高度,通常为4。
确认
我想谢谢你 Geosoft Inc. 为我的研究提供部分资金。我还要感谢:
Kenneth R.McVay提供的统计文件格式。
ThinkSpace的Noureddine Farah发现了很多导致问题的数据集。
卢西亚诺·丰塞卡,研究出了0x01型RTileType 0x01。
全球地理信息学的Martin Manningham提供了额外的问题样本文件。
EDX工程公司的Harry Anderson,因为他告诉我浮点块没有RTileType。
Ian Turton提供了一个示例文件,证明需要小心使用“short”RMin值的符号。
Duncan Chaundy在PCI因为我使出浑身解数直到我最终推断出0xFF瓷砖。
GeoSoft的Stephen Cheeseman提供更多的问题文件。
Geoffrey Williams的文件演示了0x20类型的磁贴。