使用 python 从 shapefile 中删除记录
Remove a record from shapefile with python
我有一个 ESRI shapefile .shp
(包含所有相关文件,如 .shx
、.dbf
等等),我想编辑它 - 我需要删除第一条记录和保存文件。
为此,我安装了 pyshp
并尝试解析和编辑 shapefile。这是我试过的:
import shapefile
e = shapefile.Editor('location/of/my/shp')
e.shapes()
# example output
>>> [<shapefile._Shape instance at 0x7fc5e18d93f8>,
<shapefile._Shape instance at 0x7fc5e18d9440>,
<shapefile._Shape instance at 0x7fc5e18d9488>,
<shapefile._Shape instance at 0x7fc5e18d94d0>,
<shapefile._Shape instance at 0x7fc5e18d9518>]
从这里我想删除第一个条目<shapefile._Shape instance at 0x7fc5e18d93f8>
然后保存文件:
e.delete(0) # I tried e.delete(shape=0) too
e.save()
然而,该记录在新保存的文件中仍然可用。
不幸的是 documentation 没有深入讨论这些事情。
我怎样才能实现我的目标?如何在保存文件前检查是否删除成功?
完全按照您描述的步骤进行操作对我来说似乎很有效。我首先打开一个 shapefile:
>>> e = shapefile.Editor('example')
该文件具有三种形状:
>>> e.shapes()
[<shapefile._Shape instance at 0x7f6cb5f67dd0>, <shapefile._Shape instance at 0x7f6cb5f67f38>, <shapefile._Shape instance at 0x7f6cb5f6e050>]
我删除第一个形状并保存文件:
>>> e.delete(0)
>>> e.save('example')
现在我重新打开文件:
>>> e = shapefile.Editor('example')
而且我可以看到它现在只有两种形状:
>>> e.shapes()
[<shapefile._Shape instance at 0x7f6cb5f6e518>, <shapefile._Shape instance at 0x7f6cb5f6e560>]
我不熟悉 pyshp
,但这可以使用 ogr
轻松解决,它允许使用矢量数据并成为 gdal
库的一部分。
from osgeo import ogr
fn = r"file.shp" # The path of your shapefile
ds = ogr.Open(fn, True) # True allows to edit the shapefile
lyr = ds.GetLayer()
print("Features before: {}".format(lyr.GetFeatureCount()))
lyr.DeleteFeature(0) # Deletes the first feature in the Layer
# Repack and recompute extent
# This is not mandatory but it organizes the FID's (so they start at 0 again and not 1)
# and recalculates the spatial extent.
ds.ExecuteSQL('REPACK ' + lyr.GetName())
ds.ExecuteSQL('RECOMPUTE EXTENT ON ' + lyr.GetName())
print("Features after: {}".format(lyr.GetFeatureCount()))
del ds
我有一个 ESRI shapefile .shp
(包含所有相关文件,如 .shx
、.dbf
等等),我想编辑它 - 我需要删除第一条记录和保存文件。
为此,我安装了 pyshp
并尝试解析和编辑 shapefile。这是我试过的:
import shapefile
e = shapefile.Editor('location/of/my/shp')
e.shapes()
# example output
>>> [<shapefile._Shape instance at 0x7fc5e18d93f8>,
<shapefile._Shape instance at 0x7fc5e18d9440>,
<shapefile._Shape instance at 0x7fc5e18d9488>,
<shapefile._Shape instance at 0x7fc5e18d94d0>,
<shapefile._Shape instance at 0x7fc5e18d9518>]
从这里我想删除第一个条目<shapefile._Shape instance at 0x7fc5e18d93f8>
然后保存文件:
e.delete(0) # I tried e.delete(shape=0) too
e.save()
然而,该记录在新保存的文件中仍然可用。
不幸的是 documentation 没有深入讨论这些事情。
我怎样才能实现我的目标?如何在保存文件前检查是否删除成功?
完全按照您描述的步骤进行操作对我来说似乎很有效。我首先打开一个 shapefile:
>>> e = shapefile.Editor('example')
该文件具有三种形状:
>>> e.shapes()
[<shapefile._Shape instance at 0x7f6cb5f67dd0>, <shapefile._Shape instance at 0x7f6cb5f67f38>, <shapefile._Shape instance at 0x7f6cb5f6e050>]
我删除第一个形状并保存文件:
>>> e.delete(0)
>>> e.save('example')
现在我重新打开文件:
>>> e = shapefile.Editor('example')
而且我可以看到它现在只有两种形状:
>>> e.shapes()
[<shapefile._Shape instance at 0x7f6cb5f6e518>, <shapefile._Shape instance at 0x7f6cb5f6e560>]
我不熟悉 pyshp
,但这可以使用 ogr
轻松解决,它允许使用矢量数据并成为 gdal
库的一部分。
from osgeo import ogr
fn = r"file.shp" # The path of your shapefile
ds = ogr.Open(fn, True) # True allows to edit the shapefile
lyr = ds.GetLayer()
print("Features before: {}".format(lyr.GetFeatureCount()))
lyr.DeleteFeature(0) # Deletes the first feature in the Layer
# Repack and recompute extent
# This is not mandatory but it organizes the FID's (so they start at 0 again and not 1)
# and recalculates the spatial extent.
ds.ExecuteSQL('REPACK ' + lyr.GetName())
ds.ExecuteSQL('RECOMPUTE EXTENT ON ' + lyr.GetName())
print("Features after: {}".format(lyr.GetFeatureCount()))
del ds