Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Gis SHX文件是如何工作的?_Gis_Shapefile - Fatal编程技术网

Gis SHX文件是如何工作的?

Gis SHX文件是如何工作的?,gis,shapefile,Gis,Shapefile,如果地理数据存储在ESRI形状中,则至少有三个文件:一个文件以包含矢量数据的.shp结尾,一个文件以包含属性的.dbf结尾,另一个文件以包含索引的.shx结尾 我对shx文件感兴趣。它是如何工作的?它是否包含完整的映射,如每个几何体的“第一个几何体映射到dbf中的第三行,第二个几何体映射到第一行”?或者它的工作原理不同吗?根据shx包含一个100字节的头,后面是一系列8字节的记录。每条记录在main.shp数据文件中存储记录的4字节偏移量和4字节内容长度 +-------------------

如果地理数据存储在ESRI形状中,则至少有三个文件:一个文件以包含矢量数据的.shp结尾,一个文件以包含属性的.dbf结尾,另一个文件以包含索引的.shx结尾

我对shx文件感兴趣。它是如何工作的?它是否包含完整的映射,如每个几何体的“第一个几何体映射到dbf中的第三行,第二个几何体映射到第一行”?或者它的工作原理不同吗?

根据shx包含一个100字节的头,后面是一系列8字节的记录。每条记录在main.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\u file\u length-100)/8中计算出记录的数量,并使用该索引随机或按顺序访问.shp文件中的特定形状记录。

Paul Dixon的精细回答


虽然我想知道你会怎么处理它!如果您打算编写代码来读取或写入SHP文件,我强烈建议您改用库-有一些好的免费开源软件,比如,也有一些好的商业软件。

所以dbf文件中的项目顺序与此无关,只是为了快速访问形状文件中的正确几何图形?如果你的解释是正确的,那么公式应该是(index_file_length-100)/8(这也将与我的示例数据完全匹配)。dbf记录的顺序与形状的顺序相同。我知道非常古老的帖子,但我并没有遵循您所展示的公式,规范说长度字节表示.shx中16位字的数量;因此,表示为32位short的值应该是
50+(4*nRec)
的值。如果我有10条记录,那么90条记录被存储为32位短信息。您的公式如何生成10条记录的结果?除非您的意思是说,
索引文件长度
是以字节为单位的“磁盘上”文件大小,而不是以16位字为单位测量长度的标头字节24中的文件长度指示符。