QGISプロジェクトで動的なレイヤー名を持つことは可能ですか?


9

現在の日付を使用するPostGIS SQLクエリに基づく、レイヤーのあるQGISプロジェクトがあります。データベース内のデータが変更されるため、これらのクエリは毎日異なるデータを返します。

レイヤーツリーパネルでレイヤーの名前を動的に変更して、現在の日付を表すことはできますか?(つまりTraffic on 24.01.2015、毎日変更されるのようなレイヤー名)。キャプションのデータは、レイヤー内のフィーチャの属性から取得する必要がありますtraffic_date。フィールドの値はすべて同じです。


データベーステーブル「トラフィック」または現在の日付から正確に何を抽出しますか?
ヘルマン・カリージョ

現在の日付のデータを1つのレイヤーに抽出し、予測データを他のレイヤーに抽出しています。つまり、「24.01.2015」は実際にはデータベースから取得されるフィールド値です。プロジェクト内のレイヤー名が日付に応じて自動的に変更される必要があります。
mofoyoda 2015年

プロジェクトが読み込まれるたびに名前を変更してもよろしいですか?
Nathan W

回答:


13

正解であれば、答えは「はい」です。QGISは動的レイヤー名をサポートしています。

プロジェクトを開くたびに実行されるPythonマクロを作成する必要があります。これはワークフローです:

  1. 次のPythonコードに移動しQGIS->Project->Project Propertiesて置き換えopenProject()ます。

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )

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

    注1:シェープファイルでテストしたので、日付を取得するフィールドは、シェープファイルtraffic_daはフィールド名でこれ以上の文字をサポートしていないためです。レイヤーで機能するようにコードで調整します。

    注2:プロジェクトの構成によっては、必要なレイヤーのみに作用する検証コードを追加する必要があります。たとえば、ラスターレイヤーでコードを実行すると、間違いなくエラーが表示されます。これに関してサポートが必要な場合は、新しい質問を開いてください。私がお手伝いします。

  2. 次のようにして、プロジェクトでマクロを必ず有効にしてください。 Settings->Options->General->Enable macros: Always

  3. レイヤーをプロジェクトにロードします。

  4. プロジェクトを保存します。

この時点からプロジェクトを開くたびに、レイヤー名は動的になり、日付はtraffic_date各レイヤーの属性テーブルのフィールドから取得されます。

初めてプロジェクトを開いた後、これは私のレイヤー名が動的に生成された方法です:

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

これはあなたが始めるのに役立つと思います。明らかでない問題に直面した場合は教えてください。


回答を送信する1秒前に投稿したコメントを読んで、それを理解しました。レイヤーの特定の配置に合うようにコードでいくつかの調整を行う必要がありますが、@ mofoyodaがそれらを処理できることを願っています。
ヘルマン・カリージョ

1
ええ、それは良い最初の一歩です。on正規表現の使用を節約するために、インデックスを見つけてそこから最後まで取り除くこともできます。
Nathan W

1
@gcarrillo激しい!でも素晴らしい!
DPSSpatial 2015年

1
@gcarrilloとてもかっこいい、ありがとう!まだ特定のレイヤーだけに適用する方法を理解しようとしているので、私はそれが作れることを願っています。素晴らしい答えをありがとう!
mofoyoda 2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.