QGISを使用してポイントタッチラインアトリビュートをラインレイヤーに戻しますか?


12

QGIS 2.14.4-Essenを使用しています。2つのレイヤーがあります。

  • YEAR列のポイントを含むpoints.shp
  • points.shpからポイントを正確に接続する線を含むlines.shp

points.shpからlines.shpに戻るYEAR属性を取得したいと思います。各線は、各端に1つのポイントを持つ単一のセグメントです(下の図を参照)。取得したいのは、最初のポイントからYEARで、2番目のポイントからYEARで各ライン属性に戻ります。

たとえば、行1はYEAR = 2010の最初のポイントとYEAR = 2011の2番目のポイントに触れています。「2010-2011」のようなものを1行目の属性に戻したいと思います。結果は次のようになります。

id  | points
----+-----------------
1   | 2010-2011
2   | 2011-2012
3   | 2012-2016

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

QGISを使用してこれを達成する方法はありますか?

回答:


9

@radouxjuの答えは有効ですが、私はそれをもう少し詳細に説明します。

  1. ポリラインフィーチャがポイント位置の上で正確に分割されていることを確認する必要があります。
  2. を使用しJoin attribute by locationます。ターゲットレイヤーとしてポイントロケーションで分割ラインフィーチャを選択します。この場合、「exploded」と名前を付けます。
  3. 概要セクションで、「交差するフィーチャの概要を取得する」を選択します。ここでは、ツールを2回実行する代わりに、1回はMinで、もう1回はMaxで、一度実行してMinとMaxの両方を選択できます。

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

  1. outファイルには次の属性があります。

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

  1. 「年」という名前の文字列型の新しいフィールドを手順4の新しいシェープファイルに追加します。
  2. フィールド計算機を使用して、既存のフィールドを更新します。「年」を選択して、次の式を記述します。

    to_string( "MINYEAR2")+ '-' + to_string( "MAXYEAR2")

  3. 最終的な出力属性は次のようになります。

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

  1. 最終的な出力は次のようになります。

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


データをテストした後の出力は次のとおりです。

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

左側の表は、整数型の新しいフィールドを作成した後のポイントデータです。右側の表は、上記の手順2を使用して行をポイントデータに結合した後のものです。次に、手順5〜6を使用して最終データを作成しました。

更新

式to_int()を使用して、フィールドYEARを文字列から整数に変換しようとしましたが、うまくいきました。そのため、手動で行う必要はありません。ただし、フィールドタイプはである必要はありIntegerませんInteger64。フィールド長が最大9であることを確認してください。フィールド長として10を選択した場合、フィールド長はに変換されInterger64、では機能しませんInterger64。その後、ステップ2-6のプロセスを実行できます

式to_int()を使用した後の最終出力は次のとおりです。

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

上記の左側の属性テーブルでは、YEARは文字列型で、YEAR2は式to_int()を使用して変換された整数型です。手順2〜6の後、右側の属性テーブルで確認できます。MINYEAR2とMAXYEAR2を取得し、YEARフィールドですべてを連結するために再び文字列に変換しました。


どうもありがとう!それはまさに私が数回やったことです。ポリラインフィーチャは、Points2Oneプラグインを使用してポイントレイヤーからラインを作成したため、ポイントの位置の上で正確に分割されていると思います。このデータサブセットで試してください:drive.google.com/file/d/0B7ZWEFkkfYgheG92Q29sa0I3LW8/view?再度、感謝します!
ウィルトマップ

属性テーブルのフィールドYEARは文字列型です。整数型の新しいフィールドを追加し、年を手動で入力する必要があります。整数型フィールドを作成して編集を保存したら、古い文字列フィールドを削除します。次に、上記の詳細プロセスに従います。
アフマドハンブ

式to_int()を使用して、フィールドYEARを文字列から整数に変換しようとしましたが、機能しませんでした。年を手動で入力すると、期待どおりに機能しました。
アフマドハンブ

明確な説明@ahmadhanb
シコ

ありがとう@ahmadhanb!事実、上で共有したデータはサブセットです。私は数千の線と点を持っているので、手動で年を入力することは非常に多くの仕事になります!これはバグですか?
ウィルトマップ

5

結合点を線に結合すると、複数の関係があります。「場所による属性の結合」を使用すると、特定の集計方法を要求できます。あなたの場合、これを2回行います。1回は最小値で、もう1回は最大値です。その後、2つのフィールドを新しいフィールドに連結すると、必要なものが得られます。

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

フィールド電卓で:

tostring(minYEAR) + '-' + tostring(maxYEAR)

このメソッドは、各行のCOUNT2を含む名前の追加列を返します。MinおよびMaxオプションのいずれかがこれらの情報を返します。ターゲットレイヤーとしてラインレイヤーを選択し、結合レイヤーとしてポイントレイヤーを選択しました、正しいですか?
ウィルトマップ

年フィールドは数値ですか、テキストですか?
-radouxju

YEARフィールドは整数です。で新しい列を作成しようとしましたto_string("YEAR")が、結果はまったく同じです
...-wiltomap

(QGIS 2.8.3)を確認するために簡単なテストを行ったところ、うまくいきました。カウントが2の場合、各セグメントに2つのポイントがあることを意味しますが、これは正しいことです。しかし、私と一緒に、空間結合によって作成された新しい行ベクトルに属性値MINYEAR MAXYEARがあります。なぜあなたの場合はうまくいかないのか分かりません。別のファイルで試してもらえますか?
radouxju

4

トポロジーが完全であると仮定し、次の式でフィールド「WKT」を作成します

geom_to_wkt( $geometry) 

ポイントレイヤーでは、次の式を使用できます。

min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))

パイプレイヤーのフィールド計算機で、テキスト文字列を作成します。

  • attribute(feature、attribute_name)フィーチャから指定された属性の値、ここでは
    取得したポイントフィーチャの年を返します。
  • get_feature(layer、attribute、value)は、指定された属性値に一致するレイヤーの最初のフィーチャを返します。ここ
    で、ラインの開始および終了頂点の座標と同じ座標(WKT形式)のポイントを見つけることができるかどうかを確認します。
  • start_point(geometry)は、ジオメトリから最初のノードを返します。ここで、ラインの最初の頂点。
  • end_point(geometry)は、ジオメトリの最後のノードを返します。ここがラインの最後の頂点です。
  • geom_to_wkt(geometry)は、ジオメトリのWell-Known Text(WKT)表現を返します。 ここに画像の説明を入力してください

次のように更新することもできます。

CASE
WHEN attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year') = attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
THEN attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year')
ELSE min( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))||'-'|| max( attribute( get_feature('points','WKT', geom_to_wkt(start_point($geometry)  )),'year'),attribute( get_feature('points','WKT', geom_to_wkt(end_point($geometry)  )),'year'))
END

同じ年の2つのポイントが接続されている場合に1年のみを表示するため(200X-200Xではなく200Xを取得)。

この方法の主な利点は、ポイントでデータが変更された場合、1つのフィールド計算機で非常に高速に更新できることです。新しい行を作成するときのために
、このルールを自動フィールドとして追加することもできます。
乾杯、

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