Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.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
Python 在Ruby中解析ESRI形状文件_Python_Ruby_Shapefile_Esri - Fatal编程技术网

Python 在Ruby中解析ESRI形状文件

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

因此,我目前正在尝试获取一些由第三方提供商提供的地图数据。除了数据转储,他们什么也没给我们,所以没有文档或联系点来查看他们之前使用的内容

我有4个文件:

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交换时编辑]

关于资源的一些想法:,一篇关于的博客文章,以及