Shapefile技术规范中的“奇数”


32

我一直在编写shapefile解析库,并且在规范中遇到了一些我尚未立即理解的设计决策。我希望周围有一个老谋深算的ESRI开发人员,他可以告诉我为什么这些事情都是如此。

  1. 主记录文件(.shp)具有混合字节序。具体来说,标头的某些部分具有大尾数字节顺序,但是记录都是小尾数。我通常在比字节和位更高的级别上工作,但是到目前为止,我所读到的有关字节序的所有内容都将其标记为异常。为什么未将文件指定为统一字节序?

  2. “文件长度”字段以及其他长度和位置字段以16位字记录,而不是更标准的(从我的角度来看)8位定位。如何做出此决定?

在Stack Overflow上发布了类似的问题,但没有得到任何回应。如果这对其他人来说似乎太离题了,我可以支持关闭它。


4
GeospatialPython.com的 Joel Lawhead 致力于解决shapefile之谜已有一段时间了。
乍得·库珀

不完全相关,但整齐!我希望能弄清楚。
canisrufus 2012年

Answers:


28

shapefile的开发与ArcView的开发同时进行,后者专门设计为独立于平台。(实际上,这是它的败笔:依靠在独立于平台的GUI中开发的称为“ Neuron Data”的界面,它无法利用许多Windows功能。最终反映出所有系统中最糟糕的功能尽管shapefile规范从一开始就很奇怪,但是在此设计框架内却显得有些loop回:因为shapefile是针对许多平台设计的,所以它们的规范不应偏向任何一个平台,因此同样令人讨厌给所有劝说的程序员。

第二个问题似乎是基于一个不正确的假设。例如,“文件长度”字段出现在主标头中的字节偏移量24处,并且是一个(有符号的)四字节(32位)整数,因为它必须表示最大2 ^ 31- 1。它前面有一个四字节的“文件代码”,还有五个供以后使用的四字节字段:当您保留这样的空间时,您当然想使这些字段尽可能地大,这在当时为32位,以保持最大的灵活性。在字边界上对齐文件中的数字字段也有帮助:


2
:)正是我想要的。当我说“文件长度”字段“以16位字记录”时,我要说的是32位整数的值以16位字记录文件长度。(根据规范:“文件长度的值是文件的总长度,以16位字为单位”)。看起来它可以表示2 * 2 ^ 31-1的字节长度,看起来大约是4 GB。.shx文件中的值也是如此。看起来它应该能够支持最大2 * 2 ^ 31-1字节的文件长度。我想念什么?
canisrufus 2012年

好点-我错过了。实际上,设计可以很容易地使文件长度和偏移量(.shx文件中的指针)达到字节字,从而将.shp文件的可能大小增加到4 *(2 ^ 31-1) (约80亿字节)。我不知道他们为什么选择两个字节的字,甚至不知道为什么他们始终使用带符号的整数,而无符号的整数既更合适,又提供了两倍的存储空间。
Whuber

1
我想知道16位奇数是否与当时使用16位本机的16位计算机有关int
Mike T

@Mike总是有可能的。但是,即使是80286 PC(约1984年),本机也支持32位整数,它们使用寄存器对对它们进行算术运算。
ub

5
一位Esri同事说,他记得端序混合是故意的。类似于“由于跨平台问题,我们将使开发人员直接处理它”。但是,当然,这都是假的。
mkennedy 2012年

10

外面的人知道这些答案,甚至更多,但他们没有说话。

我一直在与未记录的sbn和sbx文件进行解码的团队发现了更多相似且同时更加奇怪的奇怪现象。

大多数shapefile结构是合乎逻辑的且非常高效,这表明ESRI开发人员会仔细考虑。就像他们有一群精明的开发人员,他们陷入了一个疯子。

正如其他帖子所建议的那样,奇怪的原因可能是我们现在对机器或语言要求不熟悉的结果。

我一直怀疑16位字是节省空间的简便方法。您会发现在处理文件时必须将16位字值保留在内存中。即使在今天,以二进制格式计算值以节省空间的策略也很普遍。但是Mike的本地int建议也有可能。

字节序翻转很奇怪。我没有看到一个很好的答案。

dbf格式是从1960年代的dbase III格式中删除的。从那时起,它已被广泛使用,并且可以以其他名称(包括foxpro和xbase)找到。

尽管shapefile格式存在缺陷,奇怪之处和局限性,但它在GIS领域及其周围仍然顽固地存在。进行其他任何替换尝试都过于简单,无法进行简单的矢量存储或过于专有。甚至ESRI都认为shapefile会成为一种玩具,它将使初学者转向ArcINFO,coverage和地理数据库。互联网可能与格式的腾飞有关。

我学到了很多写pyshp的知识。编写解析器是一种学习格式的绝妙方法。


嗯 好答案。我不明白使用16位字如何节省空间。就我的目的(在javascript中构建ArrayBufferViews)而言,它的全部工作是迫使我乘以2以获取正确的偏移量:我烧掉多余的循环没有任何好处。你会详细说明吗?
canisrufus 2012年

1
是的-因为他们使用带符号的整数,所以这些值的上限是32,767,因此它们可以在2字节而不是4的字节中存储更大的数字。正如我所说,分配给16位字的值是您最终持有的值使用shapefile进行读取和写入操作时的RAM。提出一种节省双打空间的方案(我在其他二进制格式中已经看到过)总是很丑陋和复杂。因此,他们只是坚持使用简单的数据大小值方案。
GeospatialPython.com 2012年

另外-我在最初感到难过的shx文件中发现了。SHX文件具有用于映射到256x256整数网格的要素的边界框。此技术在索引编制中很常见,但在这么小的网格上却不常见。他们将坐标另存为1字节字符,而不是整数。这就是为什么网格只有256x256。现在,即使是在1990年代,记忆力也非常低落!当然,还有许多其他效率,例如使用索引隐含地对零件进行分组。没错-这些技术给程序员带来了更多负担。因此,必须优先使用内存。
GeospatialPython.com 2012年

1
是的,我读了你的文章。您在那件事上做得很好;)我热切期待您的最终分析。关于16位问题,我不确定您的观点是否成立。1.在SHP和SHX文件中,没有16位字段,除非我非常误解。2.用16位值代替8位值只会使可描述的长度(2 * 2 ^ 15)加倍,这可以通过使用无符号int(2 ^ 16)来简单地实现。最终不会节省任何空间。
canisrufus 2012年

当您提到“内存使用情况”时,很难说出您的意思是RAM还是磁盘。在90年代初期,一个2 GB的驱动器和16-32 MB的RAM相当高端:节省一些文件空间(或网络带宽)仍然很重要。负责任的软件工程师可能会仔细考虑如何选择时空折衷方案,从而对未来的客户产生影响。事后看来,除非选择明显地,效率极低,否则我将给他们带来疑问的好处。
whuber

5

这是我的看法。

Shapefile格式很可能是从ARC / INFO演变而来的,其历史可以追溯到FORTRAN / PR1ME的起源。所有ARC / INFO格式都具有此100字节的标头,并且文件代码和文件长度(例如Coverage,TIN)的字节序很大。

当为ArcView 1制作Shapefile时,ESRI专注于打入Microsoft Windows市场,而Shapefile格式的其余部分则主要专注于PC的低端存储。

端端性之间的不断切换,大概是需要支持传统起源,同时预期进入该平台会带来好处。


这听起来很合理。感谢您的见识!
Whuber

这是我最喜欢的关于字节序的猜想。现在,我们所需要的只是Dangermond发布“ ESRI全部讲述,技术版”,以查看您是否正确!
canisrufus 2012年

2
如果shapefile格式是从ARC / INFO格式演变而来的,则它早于v7。1994年,当我进入ESRI时,AV2已经发布,并且正在进行ARC / INFO 7的开发工作。
mkennedy 2012年

好点,梅利塔。这个回答的症结-某些格式选择最终可能起源于Fortran-一直到原始的Arc和Info应用程序一直都是正确的。
whuber

感谢@mkennedy,我删除了对v7的引用。我仍然记得原始ARC / INFO用户手册(v3..v6时代)有标头的日子,我相信这些标头取自FORTRAN代码。
Stephen Quan

4

我一直认为,字节序分配是由两个团队组成的,一个团队在Sun Workstations上,另一个团队在PC上,直到开发过程快结束时他们才见面。

我很想知道真正发生了什么。


3
我认为ESRI的协调性要强于此。确实,如果有的话,他们的软件似乎倾向于在设计中涉及过多的委员会。
whuber

0

我认为在后面的某个地方,我听到了有关dbf / foxpro起源的一些信息。
不过,那可能只是我一个奇怪的梦。


5
此处所涉及的.shp和.shx部件是完全独立于.dbf格式而设计的,该格式已经存在了将近20年。
ub

0

您必须了解shapefile是20年前引入的,当时有无数种不一致且设计不良的文件格式,因此shapefile也不例外。我自己编写了一个shapefile解析器,不得不说,与shapefile(.SHP)本身相比,在解析DBF格式时遇到了更多的问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.