正規表現を使用して属性データを簡単に編集する方法は?


30

QGISを使用する修士課程の学生向けのチュートリアルを書いています。タスクの1つでは、属性データを変更する必要があります(興味がある場合は、こちらのチュートリアルのPDFドラフトを参照してください)。

問題は、それらに属性データを編集させる方法です。私はこの質問が以前に尋ねられたことを知っており、答えは簡単でした:LibreOffice calcを使用して変更し、保存して、行の順序と列のタイトルが同じになるようにします。私は以前、このアプローチを使用して大きな効果を上げました。

残念ながら、ソリューションは機能しなくなりました。LibreOffice(5.4.2)またはOpenOffice(3.4.1)での.dbfファイルの保存は、QGISの観点からデータをスクランブルします(ランダムな整数のみが属性テーブルに表示されます)。代わりに追加の.dbtファイルを作成します。

質問に答えるには、MScクラスの生徒に来週これを行うにはどうすればいいですか?次のオプションを検討しました。

  1. 代わりにRを使用します(私にとっては素晴らしいですが、学生にとっては怖いです)
  2. ファイルを.csvとして編集してから、タイムスタンプに基づいて結合します(細かいが、過度に複雑に見えるため、2時間の実用性により多くのエラーが発生する可能性があります)
  3. 代替プログラムを使用する:GnumericとExcelを試しましたが、どちらもすぐに良い結果を生成しませんでした。

この質問に答えるために、複製可能な例を作成しました。QGISでファイル「points.shp」を開き、属性テーブルを観察して閉じます。LibreOfficeの属性テーブル「points.dbf」のセルをいくつか編集します-保存します。QGISで「points.shp」を再度開き、スクランブルされた属性テーブルを確認します。.zipフォルダー内のその他のシェープファイルは、LibreOfficeとOpenOfficeによって既に破損しており、問題がどのように見えるかを示しています。

要するに、この問題をどのように最も良く解決するのでしょうか?


2
このサイトへようこそ、これは本当によく聞かれる質問であり、うまくいけばいくつかの良い解決策が得られることを願っています。私はこれらの生徒たちには少しのpythonが問題になっていないと思います。それが私がこの問題に最初に取り組む方法だからです
...-sgrieve

13
シェープファイルの.DBF部分を直接編集するのは危険すぎるため、日常的に使用することはお勧めできません。初心者がデータを使用することは避けてください。ただし、同様の性質のより信頼性の高いソリューションを利用できます。シェープファイルで一意の識別子フィールドを維持します。編集しないでください。代わりに、同じ識別子で結合された関連テーブル(GISが読み取れる任意の形式)に属性を保持します。これで、識別子フィールドを保護している限り、形状と属性の間の接続を失うことなく、属性テーブルを自由に編集できます。
whuber

1
Pythonソリューションは、実装と理解が簡単であれば問題ありません...識別子番号を保持するのは良いオプションです-(私の質問ではオプション2)、おそらく私のデフォルトの答えです。ただし、追加のファイルを含まない単純な「クイックフィックス」を望んでいました(シェイプファイルあたり5つで十分ですIMO!)
RobinLovelace

3
シェープファイルごとに5つ、どういう意味ですか?9を試してください!:-)(どのGISが使用されているかに応じて、インデックスファイルが蓄積する可能性があります。)データのセットを維持するために複数の関連ファイルが必要になると(そしてシェープファイルには最低3つが必要になります)、それは実際には余分なトラブルではありません追加のファイルを投入します。メタデータファイルも追加してください。:-)そして、結合を設定すると、自動的に行われませんか?(ただし、タイムスタンプを結合に使用する方法はわかりません。代わりにバージョン管理システムに使用します。)
whuber

3
あなたが持っている場合は任意のデータベースにそれらを紹介する傾きを、spatiaLiteはOSMデータのためのフィールド編集とコマンドラインツールのGUIを持っています。その後、少しのSQLを使用すれば、生徒は間違いなく時代を先取りするでしょう。
Scro

回答:


18

私が見つけた最も簡単な答えは、QGIS内でそれを行うためのRyan Garnettのアドバイスに基づいています:

regexp_replaceを使用する

この機能は1年前にJürgenFischerによってフィールド計算機に追加されました(このバグレポートで説明されています)。私はしばらくの間これを行う方法を見つけようとしましたが、「qgis regex」やその他のあいまいな用語の検索に失敗しました。

この機能は、おそらく「名前」列のすべての値を標準化する必要性によって最もよく説明されます。たとえば、パターン「Tesc」を含むすべてのセルを「Tesco」に置き換え、「Tesco、Infirmary Road」(OSMのコントリビューターが頻繁に追加する)などの不要な情報を削除する必要がある場合、次の関数を使用できます。

regexp_replace( "name"、 'Tesc。*'、 'Tesco')

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

これは以前に使用したgrepとは少し異なるため、Pythonの正規表現機能だと思います。

これがどのように機能するかについて、より多くのドキュメント(QGIS Webサイトの詳細は数語に制限されている)が必要だと思うので、今後の参照用に以下のページをブックマークしました。

このソリューションにはいくつかの利点があります。

  1. シンプル:追加のプログラムやアドオンは不要
  2. (Pythonic?)関数(テキストを表す "'"が興味深い。警告: "またはシンボルが失敗しない)およびコマンドライン関数を使用して、学生に正規表現の力を紹介します。

私自身の質問に答えてくださったことをおologiesび申し上げます。また、私を光に導いてくれた他の人たちに感謝します!この質問のスレッドが、同様の問題に直面している他の人たちに教育的に役立つことを願っています。


3
心配しないでください、あなた自身の質問に答えることは問題ではありません。
暗闇

あなたがあなたを助ける何かを見つけてくれてうれしいです。共有していただきありがとうございます、私はこれを使用することを知っています。
ライアンガーネット

1
私はQGIS 開発者
wildintellect

9

これは大学院生にとって学習目標かもしれないので、愚かな答えかもしれませんが、フィールド計算機を使用してQGISの属性を編集していない理由はありますか?QGISの以前のバージョン(1.7より前)では、QGIS内で属性を直接編集することはできませんでした。したがって、OpenOfficeなどで.DBFファイルを編集する必要があります。

1.7および1.8では、条件式を実行する機能を使用して、フィールド計算機で属性データを直接編集できます。また、利用可能なPython属性プラグインもあり、属性編集の追加オプションを提供できます。これは解決策かもしれませんし、あなたのチュートリアルのオプションかもしれません。

以前の修士課程の学生で、現在は大学の従業員である私は、この問題、QGISの外部でそれを実行するための以前の要件を理解し、QGIS内ですべての属性編集を実行できることを評価します。ご希望の場合は、これについてさらにサポートさせていただきます。


1
こんにちはライアン、はい、それは理想的なソリューションになります。属性テーブル内のテキストを検索および置換し、乱雑なOSM名を標準化することができるため、.dbfファイルを直接編集しようとしています。QGIS内で編集したいです。Python Attributeプラグインを試してください-アイデアの解決策かもしれません。私は正規表現の検索/置換機能を探しているという事実を質問でより明確にすべきでした。
RobinLovelace

@ user1694378でも質問を明確にすることができます。
暗闇

私にそれをするように勧めてくれてありがとう。
-RobinLovelace

3

LibreOfficeのベースを使用して、dbfファイルを変更できます

  1. Open Base(メインメニューを取得)
  2. [既存のデータベースに接続]を選択し、タイプ[dBASE]を選択します。
  3. dbfファイルがあるフォルダーを選択します。
  4. 必要に応じて最終オプションを選択し、「完了」します。
  5. データベース接続ファイルに任意の名前を付けて(例: "MyxBasefiles.odb)、どこかに保存します。以降、このファイルをクリックしてデータベースファイルにアクセスします。
  6. 左側のパネルで[テーブル]を選択すると、データファイル(「テーブル」と呼ばれる)があります。それらと混乱。

これで、編集を開始できます。うまくいけば、あなたの目的にはこれで十分でしょう。

Windowsのみですが、DBF Explorerを試すこともできます。ただし、検索と置換があります。

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


1
こんにちはRK迅速な回答をありがとう:.dbfファイルを編集するための信頼できる安全な方法のようです。あなたの言ったことを試したところ、うまくいったと言ってうれしいです。
-RobinLovelace

知っておくといい。素敵なレッスンがあります。:)
RK

しかし... ...私はあなたの言ったことを試しただけで、個々の細胞に効果があると言ってうれしいです。残念ながら、この特定のアプリケーションの100%ソリューションではありません。OOBaseには、[バグ](lists.freedesktop.org/archives/libreoffice-bugs/2010が原因で、チュートリアルに必要な検索置換機能がないようです。 -12月/…)。ただし、個々のセルで確実に機能しました:テスト済み。ですから、検索置換機能を見逃していない限り、これはセルごとの編集のための90%のソリューションです。たとえば、すべての「Tesc。*」エントリを「Tesco」に置き換える方法はありますか?
-RobinLovelace

OO Baseバグのより良いリンク:bugs.freedesktop.org/show_bug.cgi
id=

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