纯python对esri shapefile格式的读/写支持

pyshp的Python项目详细描述


Pyshp

python shapefile库(pyshp)用纯python读取和写入esri shapefile。

Pyshp徽标

生成状态

内容

概述

版本更改

示例

  • 读取形状文件
    • 使用上下文管理器读取shapefile
    • 从类文件对象中读取shapefile文件rel="nofollow">从类文件对象中读取shapefile文件
    • 读取shapefile元数据
    • 读取几何图形
    • 阅读记录
    • 同时读取几何图形和记录" rel="nofollow">同时读取几何图形和记录
  • 写入形状文件
    • 使用上下文管理器编写形状文件
    • 将shapefile写入file like objects rel="nofollow">将shapefile写入file like objects
    • 设置形状类型
    • 添加记录
    • 添加几何图形
    • 几何和记录平衡

如何操作

测试

概述

python shapefile库(pyshp)为 esri shapefile格式。shapefile格式是一种流行的地理格式 由ESRI创建的信息系统矢量数据格式。了解更多信息 关于此格式,请阅读编写良好的"ESRI Shapefile Technical" 说明-1998年7月"位于http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf" rel="nofollow">http://www.esri.com/library/whitepapers/p dfs/shapefile.pdf . esri文档描述shp和shx文件格式。然而第三个 还需要名为dbf的文件格式。这种格式在网上有记录 作为"xbase文件格式描述",是一个简单的基于文件的数据库 格式创建于20世纪60年代。有关此规范的详细信息,请参见http://www.clicketyclick.dk/databases/xbase/format/index.html" rel="nofollow">http://www.clicketyclick.dk/databases/xbase/format/index.html

esri和xbase文件格式在设计和内存方面都非常简单 高效,这也是shapefile格式仍然流行的部分原因 尽管现在有许多存储和交换地理信息系统数据的方法。

pyshp与python 2.7-3.x兼容。

本文档提供了示例用于使用pyshp读写shapefile。然而 更多的例子不断地添加到博客http://geospatialpython.com中, 通过在https://gis.stackexchange.com上搜索pyshp

目前,示例中引用的示例Census BlockGroup Shapefile可在Github项目站点上找到,网址为 https://github.com/geospatialpython/pyshp。这些 示例是直截了当的,您也可以轻松地将它们与 拥有形状文件,修改最少。

重要提示:如果你是新的地理信息系统,你应该阅读地图投影。 请访问:https://github.com/geospatialpython/pyshp/wiki/map-projections" rel="nofollow">https://github.com/geospatialpython/pyshp/wiki/map projections

我真诚地希望这个图书馆能消除 读写数据,让你专注于挑战和乐趣 地理空间项目的一部分。

版本更改

2.1.0

新功能:

  • 增加了对Unicode字段名的读/写支持。
  • 改进的记录表示法
  • 在Reader、ShapeRecord、ShapeRecords和Shapes()上进一步支持GeoJSON

错误修复:

  • 修正了读取可选M值时的错误
  • python 3中的固定记录属性autocomplete
  • 杂项自述文件清理

2.0.0

pyshp的最新版本2.0引入了一些主要的新改进。 非常感谢所有贡献代码和提出问题的人,以及所有 过渡时期的耐心和理解。 一些新的更改与以前的版本不兼容。 因此,以前版本1.x的用户应注意以下更改 (注意:可能缺少某些参与者属性):

主要变化:

  • 完全支持Unicode文本,具有自定义编码和异常处理。
    • 意味着读取器返回Unicode,而写入器接受Unicode。
  • pyshp已被简化为使用reader和writer类的纯输入输出库,删除editor类。
  • 在写入文件时切换到新的流式处理方法,将内存使用率保持在最低限度:
    • 创建写入程序时指定文件路径/目标和文本编码。
    • 每次调用shape/record时,文件都会以增量方式写入。
    • 现在为每个形状类型使用专用方法添加形状。
  • 阅读shapefile现在更方便了:
    • 可以使用上下文管理器打开形状文件,并正确关闭文件。
    • shapefile可以迭代,有一个长度,并且支持geo接口。
    • 通过打印检查shapefile元数据的新方法。[@megies]
    • 更方便地访问作为属性的记录值。[@philippkraft]
    • 更方便的形状类型名称检查。[@megies]
  • 添加更多对多页3D形状的支持和文档。
  • 读卡器"elevation"和"measure"属性现在重命名为"zbox"和"mbox",以明确它们指的是最小/最大值。
  • 更好地记录以前不清楚的方面,如字段类型。

重要修复:

  • 更可靠/更稳健:
    • 修复了空或点类型shapefile的shapefile bbox错误。[@mcuprjak]
    • 读取和写入z和m类型的形状现在更加健壮,可以修复许多错误,并已添加到文档中。[@shinnonoir]
    • 改进了字段值类型的解析,修复了错误并使其更加灵活。
    • 修复了在编写日期字段和日期值早于1900[@megies]的shapefile时出现的错误
  • 修复一些地理界面错误,包括检查多边形方向
  • 修复了从区分大小写的文件名、单独的文件和类似文件的对象中读取的错误。[@gastoneb,@kb003308,@erickskb]
  • 强制最大字段限制。[@mwtoews]

示例

在执行任何操作之前,您必须导入库。

>>> import shapefile

下面的示例将使用从美国人口普查局创建的shapefile CA旧金山附近的块组数据集和Git中可用的数据集 pyshp github站点的存储库。

读取形状文件

要读取shapefile,请创建一个新的"reader"对象并将 现有形状文件。shapefile格式实际上是三个 文件夹。指定shapefile的基文件名或完整文件名 任何shapefile组件文件。

>>> sf = shapefile.Reader("shapefiles/blockgroups")

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")

或其他5+格式中的任何一种,它们可能是shapefile的一部分。这个 库不关心文件扩展名。

使用上下文管理器读取形状文件

"reader"类可以用作上下文管理器,以确保打开文件 读取完数据后,对象将正确关闭:

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)

从类文件对象中读取形状文件

您还可以使用关键字从任何类似python文件的对象中加载shapefile 用于指定三个文件中任何一个的参数。这个功能非常强大 允许您从URL、ZIP文件、序列化对象加载形状文件, 或者在某些情况下是一个数据库。

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)

注意在上面的例子中,shx文件从未使用过。SHX文件是 shp中可变长度记录的非常简单的固定记录索引 文件。此文件可供读取。如果有,pyshp将使用 shx文件可以更快地访问形状记录,但是如果没有 它,

读取shapefile元数据

shapefile有许多用于检查文件内容的属性。 shapefile是特定类型几何体的容器,可以使用 形状类型属性。

>>> sf.shapeType
5

形状类型由0到31之间的数字表示,这些数字由 shapefile规范,如下所示。需要注意的是,编号系统 一些尚未使用的保留号码,因此 现有的形状类型不是连续的:

  • 空=0
  • 点=1
  • 折线=3
  • 多边形=5
  • 多点=8
  • 点z=11
  • 折线Z=13
  • polygonz=15
  • 多点z=18
  • 点M=21
  • 多段线=23
  • polygomm=25
  • 多点=28
  • 多路径=31

基于此,我们可以看到我们的块组shapefile包含 多边形类型的形状。形状类型也定义为 shapefile模块,以便我们更直观地比较类型:

>>> sf.shapeType == shapefile.POLYGON
True

为了方便起见,还可以将形状类型的名称作为字符串:

>>> sf.shapeTypeName == 'POLYGON'
True

我们可以检查的其他元数据包括 形状文件覆盖的边界框区域:

>>> import shapefile
0

最后,如果您希望在不同的 格式,您可以将其全部转换为geojson字典,尽管您可能会丢失 过程中的某些信息,如Z值和M值:

>>> import shapefile
1

读取几何图形

形状文件的几何图形是由 表示物理位置的顶点和隐含弧。所有类型 shapefile只存储点。关于这些点的元数据决定了它们是如何 由软件处理。

通过调用shapefile()可以获得shapefile的几何图形列表 方法:

>>> import shapefile
2

shapes方法返回描述 每个形状记录。

>>> import shapefile
3

要通过调用单个形状的索引来读取该形状,请使用shape()方法。指数 是从0开始的形状计数。所以要看第八张唱片D使用它 索引为7。

>>> import shapefile
4

每个形状记录(点除外)包含以下属性。记录 形状类型点没有边界框"bbox"。

>>> import shapefile
5
  • shapeType:一个整数,表示由 形状文件规范。

    >>> import shapefile
    
    6
  • shapeType:由shapeType定义的形状类型的字符串表示形式。只读。

    >>> import shapefile
    
    7
  • bbox:如果形状类型包含多个点,则此元组将描述 左下(X,Y)坐标和右上角坐标创建 围绕各点填写方框。如果shapeType是 空(shapeType==0),则引发attributeRor。

    >>> import shapefile
    
    8
  • 零件:零件只是将点集合分组成形状。如果形状 记录包含多个部分此属性包含第一个 每个部分的点。如果只有一个部分,则包含0的列表是 返回。

    >>> import shapefile
    
    9
  • points:points属性包含包含 (x,y)形状中每个点的坐标。

    >>> sf = shapefile.Reader("shapefiles/blockgroups")
    
    0

然而,在大多数情况下,如果您需要做的不仅仅是类型或边界检查,您可能需要 要将几何图形转换为更可读的geojson格式, 为您分组直线和多边形的位置:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
1

shapes()方法的结果同样支持转换为geojson:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
2

读取记录

shapefile中的记录包含 几何图形集合。记录存储在dbf文件中。两者之间的联系 几何和属性是所有地理信息系统的基础。 这个关键的链接是由形状和相应记录的顺序暗示的 在SHP几何文件和DBF属性文件中。

一旦您读取shapefile,就可以使用shapefile的字段名。 可以将shapefile的"fields"属性称为python列表。各 字段是包含以下信息的python列表:

  • 字段名:描述此列索引处数据的名称。
  • 字段类型:此列索引处的数据类型。类型可以是:
    • "C":字符,文本。
    • "n":带或不带小数的数字。
    • "F":浮点数(与"N"相同)。
    • "L":逻辑,用于布尔真/假值。
    • "D":日期。
    • "M":备忘录,在地理信息系统中没有意义,而是Xbase规范的一部分。
  • 字段长度:在此列索引中找到的数据的长度。老年地理信息系统 对于"字符",软件可能会将此长度截断为8或11个字符 字段.
  • 小数长度:"数字"字段中的小数位数。

要查看上面(sf)reader对象的字段,请调用"fields" 属性:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
3

您可以通过调用records()方法获得shapefile的记录列表:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
4

要读取单个记录,请使用记录的索引调用record()方法:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
5

每个记录都是一个类似于列表的记录对象,其中包含与中的每个字段对应的值。 字段列表。记录的值可以通过位置索引或切片来访问。 例如,在块组shapefile中,第2和第3个字段是块组id 旧金山街区1990人口统计:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
6

为了更简单地访问,记录的字段也可以通过字段的名称访问, 作为键或属性名。块组shapefile的块组id(bkg_key) 也可以检索为:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
7

通过将记录值转换为字段值字典,可以轻松地将其与其他程序集成:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
8

如果以后需要检查原始记录的索引位置 shapefile,您可以通过"oid"属性来执行此操作:

>>> sf = shapefile.Reader("shapefiles/blockgroups")
9

同时读取几何图形和记录

你可能想要检查记录的几何图形和属性的步骤 同时。shapeRecords()和shapeRecords()方法让您只需 那.

调用shapeRecords()方法将返回 所有形状作为ShapeRecord对象的列表。每个shapeRecord实例都有一个 "shape"和"record"属性。shape属性是一个shape对象 在第一节"阅读几何"中讨论过。记录属性是 列出包含字段值的类对象,如"读取记录"部分所示。

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
0

让我们阅读blockgroup键和第四个blockgroup的填充:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
1

shapeRecords()方法的结果是一个类似列表的对象,可以很容易地转换 通过GeoJSON接口发送到GeoJSON:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
2

方法的作用是:读取指定索引处的单个形状/记录对。 要从块组shapefile中获取第四个形状记录,请使用第三个索引:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
3

每个单独的形状记录还支持将其转换为geojson的geojson接口:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
4

块组密钥和填充计数:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
5

写入形状文件

pyshp在编写shapefile时尽量灵活 保持一定程度的自动验证以确保 意外写入无效文件。

pyshp只能写入一个组件文件,如shp或dbf文件 不写其他的。所以除了是一个完整的形状文件 库,它也可以用作基本dbf(xbase)库。dbf文件是 常用的数据库格式,通常用作独立的简单数据库 格式。即使是shp文件偶尔也可以作为独立格式使用。一些 基于web的gis系统使用用户上传的shp文件来指定 兴趣。许多精密农业化学田间喷雾机也使用小型水力机械 格式化为喷雾器系统的控制文件(通常与 自定义数据库文件格式)。

要创建shapefile,首先要启动一个新的writer实例,并将其传递给 要保存到的文件路径和名称:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
6

读取或写入形状文件时,文件扩展名是可选的。如果您指定 不管怎样,小矮人都不理他们。保存文件时,可以指定基 用于所有三种文件类型的文件名。或者可以指定 一种或多种文件类型:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
7

在这种情况下,任何未分配的文件类型都不会 保存并仅保存具有文件名的文件类型。

使用上下文管理器编写形状文件

"writer"类会自动关闭打开的文件,并在垃圾回收后写入最终的头文件。 在崩溃的情况下,为了使代码更可读,仍然建议 您可以通过调用"close()"方法手动执行此操作:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
8

或者,也可以使用"writer"类作为上下文管理器,以确保打开文件 一旦您退出WITH子句,对象将正确关闭并写入最终的头:

>>> sf = shapefile.Reader("shapefiles/blockgroups.shp")
9

将形状文件写入类似文件的对象

正如您可以从python类文件对象中读取shapefile一样,您还可以 写信给他们:

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
0

设置形状类型

形状类型定义形状文件中包含的几何图形类型。所有的 形状必须与形状类型设置匹配。

有三种方法可以设置形状类型:

  • 创建类实例时设置。
  • 通过为现有类实例赋值来设置它。
  • 通过保存形状文件,将其自动设置为第一个非空形状的类型。

在创建writer时手动设置writer对象的形状类型:

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
1

或者您可以在创建写入程序后设置:

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
2

添加记录

在添加记录之前,必须首先创建定义 值将进入每个属性。

有几种不同的字段类型,都是f支持将无值存储为空。

文本字段是使用"c"类型创建的,第三个"size"参数可以自定义为预期的 节省空间的文本值长度:

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
3

日期字段是使用"d"类型创建的,可以使用 日期对象、列表或yyyymmdd格式的字符串。 字段长度或小数对此类型没有影响:

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
4

数值字段是使用'n'类型(或'f'类型,完全相同)创建的。 默认情况下,第四个十进制参数设置为零,实质上创建了一个整数字段。 要存储浮动,必须将decimal参数设置为所选的精度。 要存储非常大的数字,必须将字段长度大小增加到总位数 (包括逗号和减号)。

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
5

最后,我们可以通过将类型设置为"l"来创建布尔字段。 此字段可以采用true或false值,或1(true)或0(false)。 没有一个被解释为丢失。

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
6

您还可以使用关键字参数添加属性,其中关键字是字段名。

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
7

添加几何图形

几何图形是使用几种方便的方法之一添加的。使用"null"方法 对于空形状,"点"用于点形状,"多点"用于多点形状,"线"用于线, "多边形"。

添加空形状

shapefile可能包含一些几何图形不可用的记录,并且可以使用"null"方法进行设置。 由于空形状类型(形状类型0)没有几何图形,因此调用"空"方法时不带任何参数。

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
8

添加点形状

使用"点"方法添加点形状。点由x和 y值。

>>> sf = shapefile.Reader("shapefiles/blockgroups.dbf")
9

添加多点形状

如果点数据允许每个要素有多个点,请改用"多点"。 它们被指定为XY点坐标列表。

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
0

添加线条形状

对于线条形状文件,每个形状都作为一个或多个线性特征的列表给出。 每个线性特征必须至少有两个点。

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
1

添加多边形

与linestring类似,多边形形状由多个多边形组成,必须作为多边形列表给出。 主要区别在于多边形必须至少有4个点,最后一个点必须与第一个点相同。 如果忘记在末尾重复第一个点也可以;pyshp会自动检查并关闭多边形 如果你没有。

需要注意的是,对于多边形形状文件,必须按顺时针方向排列多边形坐标。 如果任何多边形有孔,则孔多边形坐标必须按逆时针方向排列。 多边形的方向决定shapefile阅读器如何区分多边形轮廓和孔。

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
2

从现有形状对象添加

最后,可以通过将现有的"shape"对象传递给"shape"方法来添加几何体。 您还可以向它传递任何geojson字典或与geo-interface兼容的对象。 这对于从一个文件复制到另一个文件特别有用:

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
3

几何和记录平衡

因为每个形状都必须有相应的记录,所以 记录数等于要创建有效形状文件的形状数。你 必须注意以相同的顺序添加记录和形状,以便 数据与几何数据对齐。例如:

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
4

为了帮助防止意外错位,PYSHP具有"自动平衡"功能 确保在添加形状或记录时 方程式排成一行。这样,如果忘记更新条目 shapefile仍然有效,大多数shapefile都会正确处理它 软件。自动平衡未打开默认情况下。激活它设置 属性autobalance为1或true:

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
5

您还可以随时手动调用balance()方法 以确保对方是最新的。使用平衡时 在几何体一侧或记录上创建空形状 在属性端创建每个字段的值为"null"。 这使您可以灵活地构建shapefile。 您可以创建所有形状,然后创建所有记录,反之亦然。

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
6

如果不使用autobalance()或balance()方法而忘记手动 平衡形状文件将被视为损坏的几何体和属性 大多数shapefile软件。

如何

三维和其他几何类型

大多数形状文件存储传统的二维点、线或多边形。但是shapefile格式也可以 存储各种其他类型的几何图形,包括复杂的三维曲面和对象。

具有测量值(m)的形状文件

测量的形状类型是在每个顶点包含测量值的形状,例如 通过GPS设备进行速度测量。具有测量值(m)的形状添加以下内容 方法:"pointm"、"multipointm"、"linem"和"polygomm"。m值是通过添加 每个xy坐标的第三个m值。缺少或未观察到的m值用none值指定, 或者省略第三个m坐标。

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
7

可通过多种方式检查包含m值的形状文件:

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
8

具有高程(z)值的形状文件

高程形状类型是包含每个顶点高程值的形状,例如来自GPS设备的高程。 具有高程(Z)值的形状将使用以下方法添加:"PointZ"、"MultiPointZ"、"LineZ"和"PolygonZ"。 通过向每个XY坐标添加第三个Z值来指定Z值。z值不支持丢失数据的概念, 但如果省略第三个z坐标,则默认为0。请注意,Z型形状还支持添加的测量(M)值 作为第四个m坐标。这也是可选的。

>>> with shapefile.Reader("shapefiles/blockgroups.shp") as shp:
...     print(shp)
shapefile Reader
    663 shapes (type 'POLYGON')
    663 records (44 fields)
9

要检查Z型形状文件,可以执行以下操作:

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
0

三维多通道形状文件

多匹配形状对于存储复合三维对象非常有用。 多段形状表示由一个或多个曲面零件组成的三维对象。 "parts"中的每个曲面都由xyzm值列表定义(z和m值可选),其对应类型为 在"parttypes"参数中给出。零件类型决定如何解释坐标序列,可以是 下列模常数中的一个:三角条、三角扇、外环、内环、第一环或环。 例如,可以使用三角形条来表示建筑物的墙,并使用三角形扇来表示 屋顶:

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
1

有关各种多路径部件类型的介绍以及如何创建三维多路径对象的示例,请参见 ESRI白皮书

使用大型形状文件

尽管pyshp是一个轻量级库,但它的设计目的是能够读写 任何大小的形状文件,允许您与数十万甚至数百万人一起工作 记录和复杂的几何结构。

当第一次创建reader类时,库只读取头信息 只留下其余的文件内容。一旦调用records()和shapes() 但是,它将尝试一次将整个文件读入内存。 对于非常大的文件,这可能会导致内存错误。所以在处理大文件时 建议使用itershapes()、iterrecords()或itershaperecords() 方法代替。它们一次遍历一个文件内容,使您能够循环 通过他们的呼啸声e将内存使用量保持在最低。

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
2

shapefile writer类使用类似的流方法来保存内存 最少使用。图书馆立即在幕后处理这件事 将每个几何图形写入磁盘,并在它们 使用shape()或record()添加。一旦写入程序关闭、退出或垃圾 收集后,计算最终头信息并将其写入 文件。

这意味着只要您能够在没有 要将所有内容加载到内存中,例如大型csv表或大型shapefile,可以 处理和写入任意数量的项,甚至将许多不同的源文件合并为一个 大型形状文件。如果您需要编辑或撤消任何一篇文章,您必须阅读 一次一条记录,重新输入文件,进行更改,然后将其写回。

Unicode和Shapefile编码

pyshp完全支持unicode和shapefile编码,因此您可以一直期待 在具有文本字段的shapefile中使用unicode字符串。 大多数shapefile是用utf-8编码(pyshp的默认编码)编写的,因此在大多数情况下 必须指定编码。用于读取任何其他编码(如拉丁语-1)中的shapefile,只需 创建Reader类时提供编码选项。

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
3

加载shapefile后,可以选择使用其他更支持的编码保存它,例如 作为UTF-8。如果新编码支持您试图写入的字符,则将其读回 应该提供与开始时相同的Unicode字符串。

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
4

如果提供了错误的编码并且字符串无法解码,pyshp将在默认情况下引发 例外。但是,如果在极少数情况下,您无法找到正确的编码并希望忽略 或者替换编码错误,您可以指定解码方法要使用的"编码错误"。这个 适用于阅读和写作。

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
5

测试

测试框架是doctest,位于readme.md文件中。 在与readme.md和shapefile.py相同的文件夹中,从命令行运行

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
6

Linux/Mac和类似的平台需要运行$dos2unix readme.md 在readme.md中更正行结尾。

贡献者

>>> myshp = open("shapefiles/blockgroups.shp", "rb")
>>> mydbf = open("shapefiles/blockgroups.dbf", "rb")
>>> r = shapefile.Reader(shp=myshp, dbf=mydbf)
7

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Selenium WebDriver无法通过@FindBy注释找到元素   java累积输出,就像使用名称一样   java是否可以使用ProGuard收缩rt.jar?   Java for loops减慢游戏速度   安卓通过Java线程或NDK pthreads加载JNI库?   java Box2D/LibGDX ContactListener混淆   java无法执行二进制文件可执行Jar文件   java如何使用$wind在mongodb中添加列表值   数据库java。sql。SQLException:[Microsoft][ODBC Microsoft Access驱动程序]参数太少。预期11   在JAVA中对两个非常大的CSV文件进行性能比较和查询   java如何从希伯来日历中的总天数差异计算月份   JavaOpenCSV从文件中读取奇怪的文本   sql Java JFrame将不显示   Java Spring下拉列表填充   java JOptionPane无法显示所有内容   用户键入时,将java打印到控制台   从Java程序的主方法中抛出异常有什么意义?   如何修复Java的这段代码,以针对大型数组和大量旋转旋转旋转数组?