ラインに沿ったポリゴンの長さを計算していますか?


8

ラインに沿った/ラインに投影されたポリゴンの長さを計算する必要があります。アイデアを示す画像:

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

何千ものポリゴンをラインに「投影」して、それらが何メートルのラインに属しているかを確認します。多角形は不規則で、向きが異なり、一部はラインと交差し、一部は交差していません。

私はもう試した:

  1. ArcGIS Proのラインツール沿ってフィーチャを検索しますが、ポリゴンの重複部分のラインの長さのみを提供します(ツールの説明はESRIヘルプを参照)

  2. 「凸包」オプションを使用した最小境界ジオメトリ。ただし、ポリゴンの正反対のポイント間の距離のみを提供します。これは、ラインに平行ではありません(ツールの説明はESRIヘルプを参照)

ArcGISまたはQGISでこのためのツールがありませんか?これに対する解決策はありますか?


あなたの直線は直線ですか?
JiyuuSensei

独自の要件があるので、そのようなツールが存在しないことは不合理に思えません。トリガー関数やさまざまなジオメトリヘルパー関数を使用してこのようなツールをコーディングすることは確かに可能ですが、最初にソフトウェアプラットフォームを選択する必要があります。
ビンス

@JiyuuSenseiいいえ、実際には道路ネットワークやパイプラインネットワークのようなポリラインネットワークです。したがって、これはネットワークの最も近いラインセグメントのこの「ポリゴンの長さ」を計算するように機能するはずです。つまり、基本的には、ラインツールに沿った位置特定機能がどのように機能するかという考え方です。
Konrad Gje

回答:


7

QGISの使用:

(1)頂点抽出ツール(QGIS処理ツールボックス>ベクトルジオメトリ)を使用して、ポリゴン頂点のポイントレイヤーを作成します。

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

(2)新しく作成したVerticesレイヤーの属性テーブルを開きます。

(3)フィールド計算機を起動し、;

(3A)新しいフィールドを作成します。これをmin_polyと呼び、最小距離を格納して式を与えます。

minimum(
 line_locate_point(
  geometry:=geometry(get_feature_by_id('Lines', '1')), point:=$geometry), 
 group_by:="fid")

注:'Lines'実際のラインレイヤー名と'1'、属性テーブルにあるラインID に変更する必要があります。

(3B)別の新しいフィールドを作成します。これをmax_polyと呼び、最大距離を格納して式を与えます。

maximum(
 line_locate_point(
  geometry:=geometry(get_feature_by_id('Lines', '1')), point:=$geometry), 
 group_by:="fid")

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

以来頂点の層が保持FID、元のポリゴンのIDからフィールドを、あなたは見つけるでしょうmin_polymax_poly各ポリゴンのラインに沿った最小/最大距離です。

(上記の例では、最初のポリゴンのfid = 1が8.688から24.45で、2番目のポリゴンのfid = 2が35.062から42.496です)。


5

QGISまたはArcGISでそれを行う方法はわかりませんが、必要なものは、方向付けられた境界ボックスの幅のように感じられます。概念の証明として、投影線が水平になるようにサンプル画像を回転させました。

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

次に、画像からポリゴンをデジタル化し、それらのエンベロープを生成しました。封筒の幅はあなたの質問に答えます。

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

不足しているのは、特定の角度で境界ボックスを作成するツールです。QGISには方向付き最小バウンディングボックスツールがありますが、ユーザーは固定角度を指定できません。おそらく、この質問に対する受け入れられた回答からPostGISソリューションを採用できます。最大の幅/高さの比率で「斜めの境界ボックス」を作成しますか?


QGIS(エンベロープの幅と高さ)で方向性のある境界ボックスを取得するのは非常に簡単ですが、この方向性のある境界ボックスの2つの側面は必ずしも参照線に平行である必要があり、この条件は保証されないため、この答えは最良のアプローチです。これは、不規則なポリゴンの問題です。
xunilk

2

@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()関連するノード間の距離を計算しますか?

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


1

これを行うためのQGISでの最良のアプローチ(参照ライン上に「投影される」数千のポリゴンを考慮)は、参照ラインとX軸の間の角度で回転する境界ボックスを決定することです。この角度は、基準線に頂点抽出ツール(QGIS Processing Toolbox-> Vector geometry)を使用することで簡単に決定できます。次の画像の例から、必要な角度は、この式を使用するVerticesレイヤーの属性テーブルの値で決定されます。

90-63.91873763467915 = 26.081262365320853度。

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

Processing Toolboxの回転ツールに上記の角度を導入して実行します。

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

バウンディングボックスの属性テーブルに、参照線に投影されたポリゴンの長さが含まれる回転レイヤーが生成されます。これは、Processing Toolboxの次のツールを実行することで最終的に確認できます。

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

次の画像では、線に投影されたポリゴンの長さはフィールド幅にある値です。

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

次の画像では、考慮されたポリゴンの投影長が26.081262365320853度回転した参照線(Processing ToolboxのRotateツールで取得)がX軸に平行であるため、予想どおりになります。

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

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