数千のポイントを持つポイントシェープファイルがあります。一意であると想定されるIDコードフィールドがあります。データ入力担当者は、IDを間違って入力して重複を作成します。現在、手動でフィールドをスクロールして重複を見つけています。
検索クエリビルダーを使用してこれを行う別の方法はありますか?
数千のポイントを持つポイントシェープファイルがあります。一意であると想定されるIDコードフィールドがあります。データ入力担当者は、IDを間違って入力して重複を作成します。現在、手動でフィールドをスクロールして重複を見つけています。
検索クエリビルダーを使用してこれを行う別の方法はありますか?
回答:
重複する属性を検出するための、グラフィカルで動的かつ最も重要なもう1つの簡単な方法:QGISの式ビルダーを使用します。
属性テーブルの重複を強調表示します。
次の条件で条件付き書式設定を有効にします(下の赤い矢印を参照)。
count("FieldWithDuplicates","FieldWithDuplicates") > 1
上部のすべての重複をグループ化するには、列を右クリックし、[並べ替え]を選択します。
上記の式を入力します>1
。
キャンバス上の属性が重複しているフィーチャを強調表示します。
上記の条件に設定されたフィルターで新しいシンボルまたはラベルを追加できます。
そしてもちろん、同じものに基づいてデータ派生オーバーライドを有効にすることができます。
たとえば、重複する属性を持つフィーチャのラベルを強調表示する場合は、次のオーバーライドでラベルの背景(= 1)を描画するように設定できます。
CASE WHEN
count("FieldWithDuplicates","FieldWithDuplicates") > 1
THEN 1
ELSE 0
END
次のようなものを達成するために
もちろん、どちらの状況でも、重複する属性を削除または変更すると、フォーマット/スタイルが即座に更新されます。
これは私がつまずいたばかりの良い質問です。これまでに出された答えはどれも好きではありません。連続しておらず整数ではない一意のIDを持つ有効なデータセットがあります。問題は、データセットに単一のジオメトリが含まれているが、実際にはいくつかの境界が複数のジオメトリであるということです。私の仕事は、これらの形状を識別して結合することです。
この種の作業には、DBマネージャーとSQLを使用することをお勧めします。DBマネージャーはQGISの一部になりました。データをPostGISまたはSpatiaLiteデータセットにエクスポートする必要があります。とにかく、SpatiaLiteはファイルベースのデータ形式である必要があります。
これで、count()、group by、order byを好きなように使用でき、この問題やその他の問題をかなり迅速に解決できるはずです。
ええ、同様の問題で頭を壁にぶつけました。
同じIDの機能を削除するためのスクリプトを次に示します。複数のインデックス属性を持つ最初のフィーチャを取得し、それを新しいフィーチャクラスに書き込みます。
#Definition of inputs and outputs
# Written by: Gregor Skrt
#==================================
##[Example scripts]=group
##input=vector
##unique_field=field input
##output=output vector
#Algorithm body
#==================================
from qgis.core import *
from PyQt4.QtCore import *
from processing.core.VectorWriter import VectorWriter
# "input" contains the location of the selected layer.
# We get the actual object, so we can get its bounds
layer = processing.getobject(input)
provider = layer.dataProvider()
fields = provider.fields()
writer = VectorWriter(output, None, fields, provider.geometryType(), layer.crs() )
inFeat = QgsFeature()
outFeat = QgsFeature()
inGeom = QgsGeometry()
nElement = 0
values = {}
value_field_index = layer.fieldNameIndex(unique_field)
feats = processing.getfeatures(layer)
nFeat = len(feats)
for inFeat in feats:
progress.setPercentage(int((100 * nElement)/nFeat))
nElement += 1
inGeom = inFeat.geometry()
attrs = inFeat.attributes()
value = attrs[value_field_index]
if value not in values:
#to ne vem ce bo drzalo ???
values[value]=[]
outFeat.setGeometry(inGeom)
outFeat.setAttributes(attrs)
writer.addFeature(outFeat)
del writer
また、属性による分割を使用して、各値ごとに個別のテーブルを作成することもできます。
しかし、Rayoの提案は気に入っています。統計学者が思ったほどうまくいかないことを除いて。
一意の値のカウントを提供しますが、それらの値が何であるかを助けません。
別のソフトウェアがカウントフィールドを追加し、csvまたは他のスプレッドシート形式にエクスポートできるようにする場合があります。
属性による分割レイヤーの私の提案は、ベクトル管理ツールにあります
データを任意の1つのフィールドに分割して、カウントを取得します。
ship.shipのソリューションよりも洗練されていない方法