Python 在Ruby中解析ESRI形状文件
因此,我目前正在尝试获取一些由第三方提供商提供的地图数据。除了数据转储,他们什么也没给我们,所以没有文档或联系点来查看他们之前使用的内容 我有4个文件:Python 在Ruby中解析ESRI形状文件,python,ruby,shapefile,esri,Python,Ruby,Shapefile,Esri,因此,我目前正在尝试获取一些由第三方提供商提供的地图数据。除了数据转储,他们什么也没给我们,所以没有文档或联系点来查看他们之前使用的内容 我有4个文件: 30083_包裹.dbf 30083_包裹.prj 30083\u地块上海医药 30083\u包裹.shx 现在,我已经设法从dbfprj和shp文件中提取并获取了工作数据,而没有涉及不必要的细节。但是,我在使用shx时遇到了很多麻烦 根据维基百科关于SHX文件规范的条目: The index contains the same 100-byt
30083_包裹.dbf
30083_包裹.prj
30083\u地块上海医药
30083\u包裹.shx
现在,我已经设法从dbf
prj
和shp
文件中提取并获取了工作数据,而没有涉及不必要的细节。但是,我在使用shx时遇到了很多麻烦
根据维基百科关于SHX文件规范的条目:
The index contains the same 100-byte header as the .shp file, followed by any number of 8-byte fixed-length records which consist of the following two fields:
Bytes Type Endianness Usage
0–3 int32 big Record offset (in 16-bit words)
4–7 int32 big Record length (in 16-bit words)
因此,我尝试了以下几点:
File.open('test.txt') do|file|
until file.eof?
buffer = file.read(100)
# Do something with buffer
puts buffer
end
end
我得到的只是一些疯狂的角色,比如
H
,�代码>,和P
。我不知道该去哪里进一步获取有用的记录偏移量和记录长度
有什么想法吗?我认为通过使用文件.read(100)
可以得到标题,至少可以看到它们,但事实并非如此。在尝试访问前100个字节之后的其余部分后,我得到了类似的随机unicode
我也会对非ruby解决方案持开放态度。shp
文件是几何体,采用二进制格式,包括bug-endian和little-endian整数和浮点
shx
文件是可选的索引文件,因此非常简单,主要是big-endian
是因为shapefile已被工具、库或现有程序读取,但没有使用shx
?你的解决办法是不要使用它,或者用另一种工具来证明它的存在
它是从shp
文件中读取记录的优化,因此不需要它,也可以通过解析shapefile重新创建它
但是如果您确实需要它,那么在二进制模式下打开文件
,并将2字节的big-endian值转换为偏移量和长度
疯狂的字符来自于阅读它,或者将它显示为ASCII
,就像一张图片告诉千言万语:
看第96行(decimal
),左边蓝色突出显示的是shp
记录0x000001
,它的长度(1=2字节)是0x0002c8
,左边是shx
索引,记录1的偏移量是0x32
,即50
2字节对,因此,将100
字节放入文件中,并再次记录0x2c8
或0x590
字节的长度
疯狂字符是这些字符的ASCII
表示,没有意义,这是十六进制数字右侧的窄列,主要是
注意:记录信息是大端的,因此文件2字节0x 00 27 0A
对应于规范文件代码
,该规范以9994
(decimal
)给出
shp
中的值会记录它们自己,标题中的边界框(前100个字节)是小尾端
[在我最初将我的little endian和big endian交换时编辑]关于资源的一些想法:,一篇关于的博客文章,以及