重複を作成せずに、ExcelからQGISの属性テーブルにデータを結合しますか?


15

QGISに2つの空のフィールドを持つ属性テーブルがあります。

Example_1

QGISの空のフィールドを埋めるためにExcelデータベースをインポートしたい。ExcelファイルはQGIS属性テーブルの列と一致します。

Example_2

Excel(.CSV)をシェープファイルに適切に結合できます。ただし、このプロセスでは、必要に応じて空白のフィールドを埋める代わりに、複製が作成されました。«テーブルマネージャー»の助けを借りて状況を修正することはできますが、多くの時間が必要です。Excelデータを結合するより効率的な方法を探しています。

Example_3

重複を作成せずに、Excelファイルを属性テーブルに結合するにはどうすればよいですか?


3
このチュートリアルを
ご覧

回答:


13

私は人生を楽にするために次のことをします:

これを行う前に、シェープファイルのバックアップを作成します。

  1. シェープファイルで、レイヤープロパティ/フィールドに移動し、編集モードをオンにします。
  2. IDフィールドを除くすべてのフィールドを選択します
  3. IDフィールドを除くすべてのフィールドを削除します
  4. csvファイルをQGISのレイヤーとして追加します(メインメニュー/レイヤー/レイヤーの追加/区切りテキストレイヤーの追加)ここに画像の説明を入力してください(ジオメトリを選択しません)
  5. シェープファイルで、プロパティ/結合を選択し、ソースとターゲットの両方のIDフィールドを選択します。この質問に対する他の回答で説明したように。
  6. 変更したシェープファイルを保存します。

ここに画像の説明を入力してください

これは、私が参照している[フィールド]タブです

ここに画像の説明を入力してください

不要なフィールドを削除する前後で編集を切り替えることを忘れないでください


13

Excelファイルをシェープファイルに結合します。共通の属性でそれらを結合すると、結果は、各レコードがシェープファイルとExcelファイルの両方の属性を保持する結合レイヤーになります。

まず、Excelファイルとベクターを後でレイヤーに読み込みます。作成したいくつかのテストデータを使用しましたが、セットアップは次のようになります。 ここに画像の説明を入力してください

(レイヤーパネルで)レイヤーを右クリックし、プロパティを選択して、結合を選択します。最初に左下の緑色の+記号(下の図の大きな赤い矢印)を押すと、新しい[ベクターの追加]結合メニューが表示されます(下図のように)。ここで、結合レイヤーがExcelファイルになります(適切なExcelファイルを選択してください) &シート)結合フィールドは、シェープファイルの共通属性を保持するExcelファイル内のフィールドです。ターゲットフィールドは、シェープファイル内の一致するフィールドです。(私の場合、両方の共通フィールドはたまたまunitという名前でしたが、フィールドがシェープファイルでUNIT_と呼ばれた場合、ターゲットフィールドにUNITの代わりにそれを使用していました)
ここに画像の説明を入力してください 特定のフィールドのみを表示したい場合など、結合で混乱できる他のオプションがいくつかあります。とにかく、それらは結合されているので、戻ってシェープファイルの属性を見ると表示されます現在、以下のようなExcelファイルの対応する属性があります。

ここに画像の説明を入力してください

手順を追って説明する便利なチュートリアルを次に示します。

https://www.mapbox.com/tilemill/docs/guides/joining-data/

http://maps.cga.harvard.edu/qgis/wkshop/join_csv.php

http://qgis.spatialthoughts.com/2012/03/using-tabular-data-in-qgis.html

QGISで外部テーブルをシェープファイルの属性テーブルと結合する方法は?

http://www.digital-geography.com/qgis-tutorial-ii-how-to-join-data-with-shapefiles/#.Vs9vpmHXKUk

そして、コメントで言及されたチュートリアルArMoraer。


ちなみに、私はチュートリアルmapbox.com/tilemill/docs/guides/joining-dataを見て、とても便利でした。ただし、DBFファイルをシェープファイルに結合することはできません。私のテーブル構造の両方が完全に一致するので、私は驚きます。«参加フィールド»と«ターゲットフィールド»を誤解しているようです。詳細を追加してください。
ローランロビテーユライネス

1
@Laurent Robitaille-Lainesse投稿をステップバイステップガイドで更新しました。手順が正しいことを確認するために、テスト用のExcelファイルをポリゴンシェープファイルに結合しました。
ed.hank

ExcelファイルをQGISに正しく結合することに成功しました。«join»オプションは、属性テーブルに新しいフィールドを追加します。間違っている場合は修正してください。ただし、Excelファイルのデータを属性テーブルの空のフィールドに追加することはできません。
ローランロビテーユライネス

1
空白のフィールドがある場合、フィールド計算機を使用して、新しく結合されたフィールドからテーブル内のフィールドに値を入力します。
ed.hank

10

別のメソッドを追加するだけで、プロジェクトマクロを設定して、ロード時に次のことができます。

  1. シェープファイルをcsvに自動的に結合します
  2. IP1IP2フィールドを更新します
  3. 結合されたフィールドを削除して、シェープファイルのフィールドのみを残します(つまり、重複しない)

最初に、まだプロジェクトを作成していない場合は作成してから、ツールバーに移動します。

プロジェクト>プロジェクトのプロパティ...>マクロ

次に、def openProject():関数で次のコードを使用して、レイヤーの名前と結合するフィールドを入力します。シェイプファイルとcsvファイルにそれぞれ「例」と「スプレッドシート」を使用して、フィールドを指定しましたID

from PyQt4.QtCore import *
import qgis
from qgis.core import QgsMapLayerRegistry, QgsVectorJoinInfo

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your shapefile name
    if layer.name() == "Example":
        qgis.utils.iface.setActiveLayer(layer)
        shp = qgis.utils.iface.activeLayer()

for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Change to your csv name
    if layer.name() == "spreadsheet":
        qgis.utils.iface.setActiveLayer(layer)
        csv = qgis.utils.iface.activeLayer()

# Set up join parameters
shpField='ID'
csvField='ID'
joinObject = QgsVectorJoinInfo()
joinObject.joinLayerId = csv.id()
joinObject.joinFieldName = csvField
joinObject.targetFieldName = shpField
shp.addJoin(joinObject)

# Define fields to update and joined fields to copy values from
ip1 = shp.fieldNameIndex('IP1') 
ip1_join = shp.fieldNameIndex('spreadsheet_IP1')
ip2 = shp.fieldNameIndex('IP2') 
ip2_join = shp.fieldNameIndex('spreadsheet_IP2')

shp.startEditing()
for feat in shp.getFeatures():
    shp.changeAttributeValue(feat.id(), ip1, feat.attributes()[ip1_join])
    shp.changeAttributeValue(feat.id(), ip2, feat.attributes()[ip2_join])
shp.commitChanges()

# Remove join 
shp.removeJoin(csv.id())

プロジェクトマクロ

レイヤーが結合されていないことを確認し、プロジェクト保存して、ツールバーに移動してマクロ有効にします

設定>一般>マクロを有効にする


これで、プロジェクトを閉じてcsvファイルを編集すると、次回プロジェクトをロードするときに、フィールドが自動的に更新されます。

CSVファイルの編集

結果


7

私の提案は、オープンソースのLibreOffice / Open Officeを使用してExcelファイルを編集し、.dbfファイルを作成することです。テストブックを用意しました。 テストブック-リンク

  1. Libre Office / Open Officeでファイルを開きます。
  2. Excelファイルから「Excel」シートデータに貼り付けます。
  3. .dbfファイルから「DBF」シートデータに貼り付けます(ID、X、Yのみを貼り付けます)(IP1、IP2の値は自動的に追加されます)。
  4. name.dbfファイルとして保存します(名前はシェイプファイル名と同じです)。

QGISで重複のない結果テーブル: ここに画像の説明を入力してください


5

そもそも空のフィールドがあるのはなぜですか?空のフィールドなしで開始し、結合で生成された2つの列のみを使用できますか?これが最も簡単なアプローチだと思います。それか、ArcGISの「ロード」ツールに似たツールを見つけてください。

https://desktop.arcgis.com/en/arcmap/latest/extensions/production-mapping/loading-data-into-a-geodatabase.htm

ジオデータベースを使用していない場合、これを強くお勧めします。


ジオデータベースを使用していません。実際、私はそれに慣れていません。
ローランロビテーユライネス

1
@ LaurentRobitaille-Lainesse新しいファイルジオデータベースを作成してから、その中に新しいフィーチャクラスを作成し、これを使用してデータを格納することを強くお勧めします。また、ジオデータベースとフィーチャクラス、およびそれらを使用する理由、それらがシェープファイルを超えて提供するものに関するいくつかの簡単な調査を行うこともお勧めします。
ステラ

4

.shpファイルは.DBF(データベースファイル)の属性によってサポートされているため、重複することなく直接参加する方法があるかどうかはわかりません。このDBFには、整数、実数、文字列などの列タイプの宣言があり、その長さと精度の詳細が含まれています。CSVファイルには、型が宣言されていない通常の列のみがあります。ファイルの大きさがわかりません。私にとっては、重複したフィールドを保持し、一般式でフィールド計算機を使用します

元のField_x =重複したField_x

次に、重複したフィールドをすべて削除します(QGISまたはデータベースプログラムを使用)


3

これを修正する最も簡単な方法は、結合前にQGISテーブル内の問題の2つの列を削除することだと思います。次に、シェープファイルを結合するときに、必要な2つの列は重複せず、元の列名を保持します。

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