Arc/Info二进制网格格式

by Frank Warmerdamwartemdam@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类型的磁贴。