レイヤーからすべての属性をクリアし、ポリゴンはそのままにしておく簡単な方法はありますか?


9

QGIS 2.6に複数のポリゴンを持つShapefileレイヤーがあり、それぞれに100を超えるフィールドのデータがあります。すべて同じポリゴンを使用して、すべてのデータフィールドを空白(フィールドタイプに応じて0、Nullまたは空に設定)で新しいレイヤーを作成する必要があります。これを行うには、各ポリゴンの各フィールドで1つずつ削除を押すよりも速い方法がありますか?この方法では、これを1000回以上行う必要があります。


1
質問を編集して、GISソフトウェアのバージョンとデータ形式(シェープファイル、FGDB、PostGISなど)を含めてください
Vince

回答:


3

データをレイヤーX(レイヤー/シェープファイル/フィーチャクラス/その他)にコピーアンドペーストして(OIDとジオメトリ以外に)属性を持たないようにして、現在の「空の」ジオメトリをコピーアンドペーストすることはできませんあなたの元のレイヤーに?


6

Pythonコンソールに次のコードを入力して、QGISにロードされたシェープファイルのすべての属性をクリアできます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、日付にエポックを割り当てることができますか?
ビンス

@Vince-バディのおかげで、私はこの問題の専門家ではないので、確かに試すことができます:)
ジョセフ

@Vince-微調整について言及していただき、ありがとうございます。たまたまpythonについて詳しく知りました=)
ジョセフ

1
1970年1月1日または2000年ではなく1900年の時代を考えると、私の年齢がわかると思います;)
Vince

3

それを新しいファイルとして保存し、[名前を付けて保存]ダイアログの[属性の作成をスキップ]チェックボックスをオンにするだけです。それはまさにそれが言うことをします。

FIDという名前の数値カウンター列が1つありますが、Shapefile形式には少なくとも1つの属性が必要ですか?可能であれば、より良いもの、spatialiteまたはgeopackageを使用してください。


+1、少なくとも1つの属性が必要であるため、あなたは正しいです。しかし、フィールド計算機を実行してFIDのすべての値をに置き換えることができるので、これは非常に素晴らしくシンプルな方法ですNULL
ジョセフ

1
QGISの動作は奇妙に見えます。列FIDは編集可能であり、ジオメトリと属性の間の実際のマッピングではありません。列を削除すると、編集できない「機能ID」という名前が付けられます。それはすでに最初の結果になるはずです。QGIS 2.10。後でバグを報告します。
bugmenot123 2015

2

openofficeなどで.dbfファイルを開き、データを削除します。
Pythonを使用してファイルをループし、ヘッダー以外のすべてを削除できます 。dbfpythonモジュールを参照してください。


1
dBaseファイルコンポーネントでシェープファイルを無視するツールを使用すると、シェープファイルが破損する可能性があります。目的が空白とゼロを埋めることである場合、データを「削除」すると、.shp / .shxよりも少ないレコードのdBaseファイルのみが生成される可能性があります。
ビンス

確かに、私たちは単にデータを削除しているだけで、リスクはありません。
julsbreakdown 2015

いいえ、タスクはポリゴンを保持し、対応する属性をクリアすることなので、リスクは非常に高くなります。潜在的な腐敗を警告しない回答は、リスクを十分に真剣に受け止めていません。
ビンス

私はそれが難しい方法、つまり通常の方法ではないことを認識していますが、それは機能します。もちろん、元のデータのバックアップを保持することは歓迎されます。
Leehan、2015

この特殊なケースでは、すべてのフィールドのすべての属性が初期化されるため、リスクはそれほど大きくありません。したがって、dbfファイルでレコードの順序が変更されても、すべてのレコードの属性に同じデータが含まれているため、混乱することはありません。ユーザーは、.dbfの機能の数が.shpの機能の数と同じになるように注意する必要があります。ただし、@ Vinceが書いたように、ユーザーは、a)行の順序を変更するb).dbfの行数を変更すると、通常、破損していて使用できないシェープファイルになることに注意する必要があります。
user30184

2

QGISは、.dbfなしでシェイプファイルを開くことができます。

したがって、.dbfコンポーネントを削除して.shpにロードするだけで、ジオメトリのみが読み込まれます。


私は個人的に関連するファイルを削除しないことを個人的に控えていますが、それは良いヒントです:)
ジョセフ

1
はい、名前を変更する方が安全なオプションかもしれません。
HeikkiVesanto 2015

2

おそらく、Excelで* .dbfファイルを編集できます。

次に、geom以外のすべてのフィールドを削除します。

最後に保存して終了します。

これを行う前に* .shpのアーカイブを保持しておくと便利です。


意味はスキーマをそのまま維持することであると思われるため、属性の値のみをデフォルト値に設定する必要があります。また、Excelでdbf形式で保存することはできません。
user30184

2
形状フィールドは、シェープファイルのdBaseコンポーネントには存在しません。
ビンス

Excelでdbfを編集するとき、右にはwktフィールドがありません。
Leehan、2015

FIDフィールドは、.dbfの行を.shpに保存されているジオメトリにリンクします。実際、.dbfはジオメトリとは何の関係もありません。en.wikipedia.org/wiki/Shapefile
mr.adam

1

QGIS 2.8.xでは、特定のフィールドまたはすべてのフィールドを取り除くこともできます。属性テーブルを開き、編集モードを切り替え、「列を削除」ボタンをクリックし、不要な属性をすべて選択して「OK」をクリックします。編集を保存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.