有没有一种快速的方法来清除图层中的所有属性,但将多边形保留在原处?


9

我在QGIS 2.6中有一个Shapefile图层,其中包含多个多边形,每个多边形的数据都超过100个字段。我需要创建一个具有所有相同多边形的新图层,但它们的所有数据字段都为空白(根据字段类型设置为0,Null或空)。有没有比一次在每个多边形的每个字段上按Delete更快的方法,所以我必须这样做1000次以上。


1
编辑问题以包括GIS软件版本和数据格式(例如shapefile,FGDB,PostGIS等)
Vince

Answers:


3

您不能只将数据复制并粘贴到没有属性(除OID和Geometry之外)的X层(图层/ shapefile /要素类/其他)中,然后复制并粘贴现在的“空”几何体进入您的原始图层?


6

您可以在Python控制台中输入以下代码,以清除加载到QGIS中的shapefile的所有属性NULL。从图层面板(目录)中选择图层,然后运行代码:

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()   
for field in layer.dataProvider().attributeIndexes():   
    for feature in layer.getFeatures(): 
        layer.changeAttributeValue(feature.id(), field, NULL)    

layer.commitChanges()        

这已在QGIS 2.8.2上进行了测试。


更新

为了响应@Vince的评论,可以将以下代码直接复制/粘贴到Python控制台中,并将根据字段的类型(即,0对于整数字段;NULL对于字符串字段;以及1900-01-01for 的时期)更改属性的值。一个日期字段):

layer = qgis.utils.iface.activeLayer()     
layer.startEditing()  
for field in layer.pendingFields():
        if field.typeName() == 'Integer':
                name_int = field.name()
                for feature in layer.getFeatures():
                        feature[name_int] = '0'
                        layer.updateFeature(feature)
        if field.typeName() == 'String':
                name_str = field.name()
                for feature in layer.getFeatures():
                        feature[name_str] = NULL
                        layer.updateFeature(feature)
        if field.typeName() == 'Date':
                name_dat = field.name()
                for feature in layer.getFeatures():
                        feature[name_dat] = '1900-01-01'
                        layer.updateFeature(feature)
layer.commitChanges()

1
您可以调整逻辑以将零分配给数字,将空格/ NULL分配给字符串,将纪元分配给日期吗?
文斯2015年

@Vince-谢谢哥们,我当然可以尝试,因为我在这件事上不是专家:)
Joseph

@Vince-再次感谢您提及该调整,我碰巧了解了有关python =的更多信息)
Joseph

1
当我想到1970年1月1日或1900年而不是2000年的时代时,我想我的年龄就显示了。)
文斯(Vince

3

您可以简单地将其另存为新文件,然后在“另存为...”对话框中的“跳过属性创建”框中打勾。它完全按照它说的去做。

将有一个名为FID的数字计数器列,显然Shapefile格式需要至少一个属性?如果可以的话,请使用更好的东西,spaceiteite或geopackage。


+1,您说对了,因为必须至少有一个属性。但这是一个非常简单的好方法,因为您可以运行字段计算器并将FID的所有值替换为NULL
2015年

1
QGIS的行为似乎很奇怪。FID列是可编辑的,不是几何图形和属性之间的实际映射。如果删除该列,则会得到一个不可编辑的名为“功能ID”的名称。那应该是第一个结果。QGIS 2.10。稍后我将提交一个错误。
bugmenot123

2

使用openoffice或其他工具打开.dbf文件,然后删除数据。
您可以使用python遍历文件并删除所有文件(头文件 除外),请参见dbf python模块。


1
在dBase文件组件上使用shapefile忽略工具可能会导致shapefile损坏。如果目的是填充空格和零,则“删除”数据可能只会生成一个dBase文件,其记录少于.shp / .shx。
文斯

确实,但是我们只是删除数据,没有任何风险。
julsbreakdown

不,任务是维护多边形并清除相应的属性,所以风险是非常高的。任何未警告潜在腐败的答案都不会足够严重地承担风险。
文斯

我认识到这是一种困难的方法,即不是常规方法,但是它可以工作。显然,欢迎保留原始数据的备份。
Leehan,2015年

在这种特殊情况下,风险不是很大,因为所有字段中的所有属性都已初始化。因此,如果dbf文件中的记录顺序发生了变化,则不会造成任何混乱,因为所有记录在属性中都具有相同的数据。用户仍必须注意.dbf中的功能数量与.shp中的功能数量相同。但是,正如@Vince所写,应警告用户a)更改行的顺序b).dbf中的行数通常会导致shapefile损坏且无法使用。
user30184

2

QGIS可以打开没有.dbf的形状文件。

因此,您只需删除.dbf组件并在.shp中加载,即可导入几何图形。


这是一个很好的提示,尽管我个人不希望自己不要删除任何关联的文件:)
Joseph

1
是的,重命名可能是一个更安全的选择。
HeikkiVesanto

2

也许您可以使用Excel编辑* .dbf文件。

然后,您删除除geom以外的所有字段。

最后保存并退出。

在执行此操作之前,对* .shp进行存档将很有用。


含义似乎是保持架构完整,因此仅属性值应设置为某些默认值。而且,您无法使用Excel保存为dbf格式。
user30184

2
shapefile的dBase组件中不存在geometry字段。
文斯

在用excel编辑dbf时没有wkt字段。
Leehan

FID字段将.dbf中的行链接到存储在.shp中的几何。确实,.dbf与几何无关。en.wikipedia.org/wiki/Shapefile
mr.adam

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.