Python无法读取shapefile


11

我正在尝试使用Jupyter笔记本打开shapefile,但是无法打开它。shapefile与工作簿位于同一文件夹中,即使使用完整路径,Python也无法识别它。

import shapefile as shp
import matplotlib.pyplot as plt

sf = shp.Reader(r'C:\Users\Public\Documents\1-11-99n.shp')

ShapefileException: Unable to open C:\Users\Public\Documents\1-11-99n.dbf or C:\Users\Public\Documents\1-11-99n.shp.

用fiona和geopandas打开它也不起作用。

import fiona
shape = fiona.open("1-11-99n.shp")

import geopandas as gp
shp = gp.GeoDataFrame.from_file('1-11-99n.shp')
print (shp)

都以

CPLE_OpenFailedError: b'Unable to open 1-11-99n.shx or 1-11-99n.SHX.Try --config SHAPE_RESTORE_SHX true to restore or create it'

我知道这可能是一个小问题,但是我不熟悉使用shapefile和空间Python库,因此我真的不知道如何解决此问题。


将负号替换为下划线,然后重试。.shapefile名称应包含字母,数字和下划线。以字母开头的名称也是一个好主意。如果问题仍然存在,则shapefile可能已损坏或缺少.SHX。 )?
Michael Stimson

您的shapefile可能已损坏。我将一个任意shapefile保存为1-11-99n.shp,无论您的形状,fiona还是geopandas迷你脚本都没有问题。
xunilk

3
是的,问题是我没有包含我需要的其他shx,dbf等文件。我以前从未使用过shp文件,所以我不知道它是否需要文件的补充。文件名工作正常,无需更改。谢谢!
伦纳德·肖

1
@LeonardShaw请考虑为您的问题提供答案,以便我们认为此问题已解决。
亚伦

重申一下,在文件名中带有前导数字或连字符违反了shapefile规范。最佳做法是避免命名,这会导致某些shapefile阅读器实现失败。
文斯

Answers:


20

有一个陷阱供首次使用shapefile的用户使用。没有附带文件:.dbf,.shx,.prj等,实际的shapefile(.shp)就没有用。

shapefile技术规范中对此进行了概述,但是它有点高级,有关Esri的文章可能更适合快速解释。

将属于shapefile的所有文件视为一个单元是至关重要的。如果在任何阶段都编辑了shapefile,即使只是属性发生了变化,FID(功能标识符)也会发生变化,这意味着.DBF文件中的顺序也会发生变化。覆盖现有的.DBF文件,形状将指向错误的行。始终将所有文件一起复制

通过电子邮件,Dropbox,Google云端硬盘等发送shapefile时,我很方便地将所有文件压缩到一个存档中,以便在解压缩所有相关文件时将它们一起显示。


1
更准确地说:.shp,.dbf和.shx是绝对最小值(根据标准)。QGIS / OGR将允许您打开缺少.dbf的文件,但是您将无法删除或编辑这些功能。但是,您可以使用ogr2​​ogr创建缺少的dbf文件(属性表为空)
LuWi

2
@LuWi甚至可以重建.SHX文件,它是空间索引,有一些工具和选项可以从现有形状重建空间索引。相关文件的精确数量各不相同,但始终最好将所有内容放在一起。
Michael Stimson's

0

如果唯一的项目是.shp文件,而无需其他部分,则可以考虑使用此解决方案,从OpenJump打开并保存。/gis//a/306228 根据您的目的,您可能仍然需要一个.proj文件,但也许可以摆脱从另一个项目复制并重命名以匹配shapefile的“标准”文件,如果使用相同的投影。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.