Python 如何解析.shp文件?

Python 如何解析.shp文件?,python,parsing,arcgis,shapefile,Python,Parsing,Arcgis,Shapefile,我对从ESRI.shp文件中收集信息感兴趣。 特别是多段线要素类的.shp文件 当我打开要素类的.dbf时,我得到了我所期望的:一个可以在excel中打开并包含要素类表格信息的表格 然而,当我试图在任何程序(excel、textpad等)中打开.shp文件时,我得到的只是一堆乱七八糟和不寻常的ASCII字符 我想使用Python(2.x)来解释这个文件并从中获取信息(在本例中是多段线的顶点) 我不想使用任何模块或非内置工具,因为我真正感兴趣的是这个过程将如何工作,我不想要任何依赖性 感谢您在正确

我对从ESRI
.shp
文件中收集信息感兴趣。 特别是多段线要素类的
.shp
文件

当我打开要素类的
.dbf
时,我得到了我所期望的:一个可以在excel中打开并包含要素类表格信息的表格

然而,当我试图在任何程序(excel、textpad等)中打开
.shp
文件时,我得到的只是一堆乱七八糟和不寻常的ASCII字符

我想使用Python(2.x)来解释这个文件并从中获取信息(在本例中是多段线的顶点)

我不想使用任何模块或非内置工具,因为我真正感兴趣的是这个过程将如何工作,我不想要任何依赖性


感谢您在正确方向上提供的任何提示或要点

可能不太可能,但您应该检查ctypes,并可能使用程序附带的.dll文件(如果它甚至存在lol)来读取该类型的文件。根据我的经验,当你开始四处挖掘时,事情会变得很奇怪。dll可能不太可能,但你应该检查ctypes,也许可以使用程序附带的.dll文件(如果它甚至存在lol)来读取该类型的文件。根据我的经验,当你开始四处挖掘时,事情会变得很奇怪。DLL你的问题基本上是“我有一个文件,其中的数据以任意二进制格式存储。我如何使用python读取这样的文件?”


答案是,包含文件格式的描述。根据技术规范编写一个剖析器。

基本上,你的问题是“我有一个以任意二进制格式存储的满是数据的文件。如何使用python读取这样的文件?”


答案是,包含文件格式的描述。根据技术规范编写一个解析器。

如果您不想费尽心机编写解析器,那么您应该看看纯Python形状文件库。我已经用了几个月了,发现它很容易使用


如果你在网上搜索,还有一个python绑定到shapelib。但是我发现纯Python解决方案更容易破解。

如果你不想费尽心思编写解析器,你应该看看,一个纯Python形状文件库。我已经用了几个月了,发现它很容易使用


如果你在网上搜索,还有一个python绑定到shapelib。但是我发现纯Python解决方案更容易破解。

我想你可能是对的。几天前我把那篇论文打印出来了,我正在试图破译它。哦,为了额外的乐趣,这种格式在不同的部分显式地使用了大端和小端字节排序。它看起来相当简单。。。从包含幻数、边界框信息和形状类型(每个文件一种形状类型)的100字节头开始,然后是记录。每个记录都有一个8字节的头,指定记录编号和记录大小(用2字节的字),哦,我明白了,每个记录都是一个复杂数据结构的序列化。文件的其余部分解释了数据结构以及它们是如何被pickle的。因此,对于每种类型的形状,您都需要一个单独的unpickle函数……以字节形式存储的数据没有空格、语法或任何东西,对吗?如果它说一个头是100个字节,这意味着800个1或0,那么这个头就结束了,不多不少?如果我理解正确的话,我应该能够解析给定数量的字节,得到我想要的字节。是的,字面上是100个字节。另一方面,每个形状记录的大小是可变的,因此,如果您试图获取第三个形状,则必须查找文件头,从第一个记录头提取大小以查找第二个,从第二个头提取大小以查找第三个。(不要忘记将大小乘以2以获得记录的字节数,也不要忘记大小不包括记录头(8字节),别忘了,你需要大/小尾端到主机的顺序转换函数来读取标题和记录中的数字……我想你可能是对的。我几天前打印了那篇论文,并试图对其进行解密。哦,为了额外的乐趣,这种格式显式地使用了大尾端和小尾端字节顺序,如果不同的扇区ns。这似乎相当简单……从一个100字节的头开始,它包含一个幻数、边界框信息和形状类型(每个文件一种形状),然后是记录。每个记录都有一个8字节的头,指定记录编号和记录大小(以2字节的字表示),噢,每个记录都是一个复杂数据结构的序列化,我明白了。文件的其余部分解释了数据结构以及它们是如何被pickle的。因此,对于每种类型的形状,您都需要一个单独的unpickle函数……以字节形式存储的数据没有空格、语法或任何正确的东西?如果它说头是100字节,那就是字面上的意思800个1或0,然后那个头就结束了,不多不少?所以如果我理解正确的话,我应该能够解析给定数量的字节,得到我想要的字节。是的,字面上是100个字节。另一方面,每个形状记录的大小是可变的,所以如果你试图得到第三个形状,你必须寻找past文件头,从第一个记录头提取大小以查找第二个,从第二个记录头提取大小以查找第三个。(不要忘记将大小乘以2以获得记录的字节数,并且不要忘记大小不包括记录头(8字节),别忘了,你需要大/小的顺序转换函数来读取标题和记录中的数字……我想我能给出的最好提示是解决一个更有趣的问题