【发布时间】:2009-01-27 10:13:01
【问题描述】:
如果您将地理数据存储在 ESRI 形状中,则至少有三个文件:一个以 .shp 结尾包含矢量数据,一个以 .dbf 结尾包含属性,一个以 .shx 结尾包含索引。
我对 shx 文件感兴趣。它是如何工作的?它是否包含完整的映射,例如每个几何的“第一个几何映射到 dbf 中的第三行,第二个几何映射到第一行”?还是工作方式不同?
【问题讨论】:
如果您将地理数据存储在 ESRI 形状中,则至少有三个文件:一个以 .shp 结尾包含矢量数据,一个以 .dbf 结尾包含属性,一个以 .shx 结尾包含索引。
我对 shx 文件感兴趣。它是如何工作的?它是否包含完整的映射,例如每个几何的“第一个几何映射到 dbf 中的第三行,第二个几何映射到第一行”?还是工作方式不同?
【问题讨论】:
根据spec,shx 包含一个 100 字节的标头,后跟一个 8 字节的记录序列。每条记录在主 .shp 数据文件中存储一个记录的 4 字节偏移量和 4 字节内容长度。
+-----------------------------------------------+
| header (100 bytes) |
+-----------------+------------------+----------+
| offset(4 bytes) | length (4 bytes) |
+-----------------+------------------+
| offset(4 bytes) | length (4 bytes) |
+-----------------+------------------+
| offset(4 bytes) | length (4 bytes) |
+-----------------+------------------+
| offset(4 bytes) | length (4 bytes) |
+-----------------+------------------+
| .... |
+-----------------+------------------+
请注意,偏移量是用 16 位字指定的,因此第一条记录的偏移量是 50(因为 .shp 标头是 100 字节或 50 字长)。内容长度也以 16 位字指定。
因此,您可以从(index_file_length-100)/8 中找出记录的数量,并使用该索引随机或按顺序访问.shp 文件中的特定形状记录。
【讨论】:
50+(4*nRec) 的任何值。如果我有 10 条记录,则将 90 条存储为 32 位短。您的公式将如何产生 10 条记录的结果?
index_file_length 是“磁盘上”文件大小(以字节为单位),而不是标头的字节 24 中保存的文件长度指示器,它以 16 位字为单位测量长度。
Paul Dixon 给出了很好的回答。
虽然我想知道你打算用它做什么!如果您要编写代码来读取或写入 SHP 文件,我强烈建议您改用库 - 有一些很好的免费开源库,例如 GDAL,还有一些很好的商业库。
【讨论】: