在Ruby中解析ESRI Shapefile

时间:2015-12-01 20:41:29

标签: python ruby shapefile esri

所以我目前正在尝试获取第三方提供商提供的一些地图数据。除了数据转储之外,它们没有给我们任何东西,因此没有文档或联系点可以查看它们之前使用的内容。

我有4个文件:

30083_parcel.dbf

30083_parcel.prj

30083_parcel.shp

30083_parcel.shx

现在,我已经设法从dbf prjshp文件中提取并获取工作数据。但是,我在使用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

我所得到的只是一些疯狂的角色,比如 HP。我不知道在哪里可以进一步有效地检索记录偏移和记录长度。

有什么想法吗?我想通过使用file.read(100)我会得到标题并且至少能够看到它们,但事实并非如此。在尝试访问前100个字节之后的其余部分之后,我得到了类似的随机unicode。

在某种程度上我也会接受非红宝石解决方案。

1 个答案:

答案 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,因为图片会说出千言万语:

Hex Edit view of shp and shx file

查看第96行(ASCII),左侧的高亮显示为decimal记录shp,其长度(1 = 2字节)为0x000001 ,左边是0x0002c8索引,记录1的偏移量是shx,这是0x32 2个字节对​​,因此50个字节进入文件和记录长度,再次,1000x2c8字节。

疯狂的字符是这些的0x590表示并且没有意义,这是十六进制数右边的窄列,主要是ASCII

请注意,记录信息是大端,因此文件2字节.对应于0x 00 00 27 0A的规范,FILE CODE9994)。

decimal记录本身内的值和标题中的边界框(前100个字节)是小端。

[我初次编辑时,我的小端和大端交换了]

相关问题