所以我目前正在尝试获取第三方提供商提供的一些地图数据。除了数据转储之外,它们没有给我们任何东西,因此没有文档或联系点可以查看它们之前使用的内容。
我有4个文件:
30083_parcel.dbf
30083_parcel.prj
30083_parcel.shp
30083_parcel.shx
现在,我已经设法从dbf
prj
和shp
文件中提取并获取工作数据。但是,我在使用shx
时遇到了很多麻烦。
根据Wikipedia关于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
。我不知道在哪里可以进一步有效地检索记录偏移和记录长度。
有什么想法吗?我想通过使用file.read(100)
我会得到标题并且至少能够看到它们,但事实并非如此。在尝试访问前100个字节之后的其余部分之后,我得到了类似的随机unicode。
在某种程度上我也会接受非红宝石解决方案。
答案 0 :(得分:0)
def srv_tags_update():
tags_set = []
for host,tags in ipa_hostgroups_dict.iteritems():
tags_set += tags
for host_tag in set(tags_set):
for line in fileinput.FileInput('/tmp/hosttags.mk',inplace=1):
#if 'end_tags' in line:
if """('end_tags',""" in line:
line = line.replace(""" ('end_tags',""", """('%s',
u'/%s',
[('%s', u'%s tag', [])]),
('end_tags',
""") % ( host_tag, host_tag, host_tag, host_tag )
print line.strip()
文件是几何体,是二进制格式,包含bug endian和little endian整数和浮点数。
shp
文件是可选的索引文件,因此非常简单,主要是大端。
是不是工具,库或现有程序读取了shapefile,但是shx
没有被使用?你的解决方案不是使用它,或指向另一个工具它的存在。
这是从shx
文件中读取记录的优化,因此不需要,或者可以通过解析shapefile来重新创建。
但是如果你确实需要它,那么在shp
中打开文件并将2字节大端值转换为偏移量和长度。
疯狂的角色来自于阅读它,或者将其显示为binary mode
,因为图片会说出千言万语:
查看第96行(ASCII
),左侧的高亮显示为decimal
记录shp
,其长度(1 = 2字节)为0x000001
,左边是0x0002c8
索引,记录1的偏移量是shx
,这是0x32
2个字节对,因此50
个字节进入文件和记录长度,再次,100
或0x2c8
字节。
疯狂的字符是这些的0x590
表示并且没有意义,这是十六进制数右边的窄列,主要是ASCII
的
请注意,记录信息是大端,因此文件2字节.
对应于0x 00 00 27 0A
的规范,FILE CODE
(9994
)。
decimal
记录本身内的值和标题中的边界框(前100个字节)是小端。
[我初次编辑时,我的小端和大端交换了]