@kazuhitoの回答に基づいて、QGIS Field Calculatorに単一のハックな式をまとめました。これは、同じステップを1つのステップで実行する必要があります。
ただし、これは大規模なデータセットでは非常にリソースを消費することになると想像できます。この問題はPythonの実装に最も適していると思います。これは明らかに、フィールド計算よりもはるかに優れた参照と反復を処理します。
array_last(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
- array_first(array_sort(array_foreach(
generate_series(1,num_points($geometry)-1),
line_locate_point(aggregate('lines','collect',$geometry),
point_n($geometry,@element))),1))
これは最初にgenerate_series()
、を使用してノード番号の「配列」を作成し、各ポリゴンのノード数として最大値を指定しnum_points($geometry)
ます。これは、マイナス1で、繰り返される最初/最後のノードをスキップします。
次に、この配列の値を関数に渡し、を使用して別の配列を生成できarray_foreach()
ます。ここでは、ポリゴンノード番号(として表されます@element
)をに渡しpoint_n()
ます。これにより、そのノードの実際のジオメトリが返されます。次に、にフィードしline_locate_point()
て、指定されたラインに沿った長さを決定します(以下の重要な注意を参照)。
結果の配列は昇順で並べ替えられarray_sort()
ます。これを使用してarray_last()
、およびを使用して、線に沿った「左端」および「右端」の距離を取得できますarray_first()
。2つを減算すると、結果はラインに沿ったポリゴンの「長さ」になります。
ポリゴンのラベルとして表示される上記の式の例については、以下を参照してください(さらに、上記の式から「左端」と「右端」のライン距離が分割されています)。比較のために、抽出された頂点と関連するライン距離の値も含めました。緑の頂点は、線に沿った「左端」と「右端」の頂点です。線の角度により、緑色の点がその真下の点よりも実際に線に沿っている左上のポリゴンに注意してください...
重要な注意:
ここでは、ラインレイヤージオメトリをを使用して参照していaggregate()
ます。必要に応じてレイヤー名('lines'
)を変更する必要があります。複数の行がある場合は、フィルターを追加して、比較する行を指定する必要があります(例:)aggregate('lines','collect',$geometry,"name"='TrainLine1')
。これを最も近い行で自動的に機能させるには、Field CalcよりもSQLまたはPythonをお勧めします。
また、この例では、線がよじれている場合も含め、線に沿ったポリゴンの「長さ」を計算します。直線距離が必要な場合... distance()
関連するノード間の距離を計算しますか?