ポイント間を最近傍のポイント同士をラインでつなぐ方法について

84 views
Skip to first unread message

Kana Masuhashi

unread,
Nov 26, 2021, 9:16:31 AM11/26/21
to QGIS初心者質問グループ

お世話になっております、QGIS初心者のものです。

ポイントデータ間を相互の最短距離のラインで接続させるような方法あるいはプラグインはございますでしょうか。

具体的には、

添付の図のような黄色いポイントデータ(赤い六角形メッシュの重心をとったもの)に関して、白いラインで記入してあるような最短距離のラインでの接続を全ポイントについて一括で処理をしたいと考えております。

(添付画像は簡単のため1点についてのみ示したものです)

このような処理が可能な方法あるいはプラグイン等ございましたら、ご教授いただけましたら幸いでございます。

何卒よろしくお願い申し上げます。

スクリーンショット 2021-11-26 23.09.58.png

------------------------------------------------------

なお、QGIS及びOSは以下の通りです。

QGISバージョン 3.16.13-Hannover (LTR)

OSのバージョン macOS 11.6

福岡

unread,
Nov 26, 2021, 8:18:16 PM11/26/21
to QGIS初心者質問グループ
Kana Masuhashi 様

こんにちは

他にもっと良い方法がありそうな気もしますが、思いついたことを試してみました。
方法としては「ドロネー三角分割」で作ったポリゴンをラインに変換です。

1 重心に対して、メニューの「ベクタ - ジオメトリツール - ドロネー三角分割」を実行。
2 出力されたポリゴンに対して、メニューの「ベクタ - ジオメトリツール - ポリゴンを線に変換」を実行。

できあがりは、こんな感じでした。
fig.png

2021年11月26日金曜日 23:16:31 UTC+9 Kana Masuhashi:

Kana Masuhashi

unread,
Nov 27, 2021, 12:09:13 AM11/27/21
to QGIS初心者質問グループ
福岡様

お世話になっております、Masuhashiです。

方法のご提案いただきありがとうございます。
ご教授いただきました「ドロネー三角分割→ラインへの変換」にて最近傍にラインを引くことができたのですが、
この方法ですと、ラインが最小でも以下のようなまとまった単位になってしまうようです。

ポイント間に引かれたラインを最終的には別々のラインとしてcsvとして出力することを目的としています。
具体的には、ラインを作成した後に、元々あったポイントデータと空間結合をして、
「カラム1:ラインのid / カラム2:両端のノードidの小さい方 / カラム3:両端のノードidの大きい方」
というcsvで出力したいと考えております。


あと一歩でやろうとしていることができそうなのですが、ライン同士を分割して別々のラインデータとする方法はございますでしょうか。
自身で試してみましたのは、

①プロセシングツール>ベクタ解析>最寄りのハブへの距離
②プロセシングツール>ベクタ作成>点を繋いで線に
の2つですが、
①は、同じレイヤ内で各ポイントが自分自身以外の最近傍点を検索するようなものではなく不可能
②id順に単に順番に繋いでくれるだけなので本件には不適
という状況です。

1つのレイヤー内で、各ポイントが自分自身以外の最近傍点に対してラインでつながるようなものがありそうな気もするのですが、
現状私が調べた中でうまく見つけることができませんでした...。

どなたか、お助けいただけると大変助かります。
何卒よろしくお願い申し上げます。スクリーンショット 2021-11-27 13.23.59.png

2021年11月27日土曜日 10:18:16 UTC+9 福岡:

福岡

unread,
Nov 27, 2021, 12:28:27 AM11/27/21
to QGIS初心者質問グループ
Kana Masuhashi 様

こんにちは

ラインをバラバラにしたいということですね?
プロセッシングツールの「ベクタジオメトリ - 線をセグメントへ分解」で可能かと思います。

2021年11月27日土曜日 14:09:13 UTC+9 Kana Masuhashi:

Kana Masuhashi

unread,
Nov 27, 2021, 12:43:43 AM11/27/21
to QGIS初心者質問グループ
福岡様

お世話になっております、Masuhashiです。

ご教授の方法でできました。
手動でポチりポチりとポイント同士を手動で繋げていて途方に暮れているところでしたので、大変助かりました、、、!

感謝申し上げます。


2021年11月27日土曜日 14:28:27 UTC+9 福岡:

mooya

unread,
Nov 27, 2021, 10:06:29 AM11/27/21
to QGIS初心者質問グループ
Kana Masuhashi様、福岡様

 こんばんは。mooyaです。
 lineに重心のidをつけるところが、まだだと思いますのでその分を追記します。

1.分解するところまでは同じです。
2.プロセッシング「重複ジオメトリを削除」
 ラインが2本重なっていますので1本に
3.「フィールド計算機」で「line_id」追加、整数型、式:「$id」
4.プロセッシング「属性の空間結合」 重心からidを空間結合
5.png
5.プロセッシング「自動インクリメント属性の追加」グループ化のための属性:line_id,centidでソート
6.png
6.プロセッシング「属性でレイヤ分割」
 ユニークID属性:order、出力フォルダは任意
7.出力されたファイルをレイヤとして追加
8.プロセッシング「属性テーブルで結合」
 order0(重心idの小さい方のline)にorder1(重心idの大きい方のline)の重心idを属性結合
8.png
9.最終的な出力
9.png

なかなかややこしい(^^;;もっと簡単な方法があればいいんですが。

2021年11月27日土曜日 14:43:43 UTC+9 Kana Masuhashi:

adachi

unread,
Nov 27, 2021, 8:00:17 PM11/27/21
to QGIS初心者質問グループ
解決していそうなところ、1点気になりましたのでコメントまで...

得たい結果がつまるところ「六角形の重心同士を結んだラインが欲しい」ということであればすでに福岡さまmooyaさまが提示された手法で良いかと思いますが
厳密に「最短距離を示すラインが欲しい」ということであれば、上記で得られたラインがすべて本当に厳密な意味での最短距離かどうか、という疑問は認識しておくべきかと思います。

個人的に思うところ、そのような状況になるのは「地球を完全球体と見做している場合」や「xyのみの二次元の地図上で扱っている場合(例えば紙の上で描くような場合)」のように限られたケースだけで
実物の地球を相手にすると歪みが出るので、最初の画像で示された白い線が全て同等の「最短距離」になるということは稀かと思います(そもそもの六角形メッシュがどのように作られているか、にもよるかと思いますが)。

すでに承知の上での質問でしたら、蛇足的コメントですみません。



2021年11月28日日曜日 0:06:29 UTC+9 mooya:

Kana Masuhashi

unread,
Nov 29, 2021, 5:56:59 AM11/29/21
to QGIS初心者質問グループ

皆様,大変丁寧なアドバイスをいただきまして大変感謝申し上げます.


mooya様

idをつける部分に関しまして,模索する中で自身でもmooya様にご教授いただきました方法の4までにはに辿り着きまして,
ジオメトリの空間関係を「交差する」にして行っておりました.
line_idをソートによって付与するなどがGIS内で可能ということで,後から連番で適当につけようかな...と思っていましたので助かりました.
どうもありがとうございました.

自身で方法を探す中では,
1. ベクター>ジオメトリツール>ドロネー三角分割
2. 出力されたポリゴンを,
 ベクター>ジオメトリツール>ポリゴンを線に変換
3. (このままだとセグメント化出来ていないので)プロセシングツール>ベクタジオメトリ>線をセグメントに分割
(ここまでは共通)
4. リンクが二重になっているため, プロセシングツール>ベクタ一般>重複ジオメトリ削除 でリンクをユニークにする
5. 両端のポイント(元の六角形メッシュのセントロイド)に対して空間結合してリンクのノードとの接続関係を属性テーブルに付与する
 5-1.プロセシング>ツールボックス>ベクタ一般>空間結合(集計付き)
 5-2.入力レイヤー=ラインデータ,結合するレイヤー:ポイント とする
 5-3.交差するにチェック
 5-4.集計関数は,最大値と最小値の2つにチェック
とすることで,セントロイド(ポイントデータ)との接続関係をラインの属性テーブルに追加しつつ,ユニークなラインデータを得られるようです.

上記は,ラインデータが,元のポイントデータとの接続関係を保ったものとしてcsvなどに出力したい場合(ネットワークデータを作成したい場合など)に役立つと思われます^^



adachi様
こちらの指摘も,大変ありがとうございます.
こちら,六角形メッシュを作成する際に,平面直角座標系にしてから作成しておりますので,歪みの面では大丈夫かな,と思って進めております.
重要な指摘ですので,どうもありがとうございます.


ご返答が遅くなりまして大変失礼いたしました.
皆様の丁寧にご返答で,大変助かっております.
ありがとうございました.

Masuhashi









2021年11月28日日曜日 10:00:17 UTC+9 adachi:
Reply all
Reply to author
Forward
0 new messages