点と曲線の最短距離を求めたい

634 views
Skip to first unread message

Y.F

unread,
Jun 29, 2020, 9:37:34 PM6/29/20
to QGIS初心者質問グループ
お世話になります.

①やりたいこと:
点と曲線間の最短距離を求めたい.
できれば,点から曲線へおろした垂線も描画したい.

②やっていること:
日本の旧市区町村の重心から,海岸線までの距離を求めたいのですが,実行方法がわかりません.
現在は,
1.次のリンク(農業集落境界データ)から旧市区町村境界のshpファイルをダウンロードし,47都道府県分をマージ
2.QGISで,ベクタ>ジオメトリツール>重心 で,旧市区町村ごとの重心を求める
3.国土数値情報海岸線データを全てダウンロードし,1つのレイヤーに結合
まで進めています.

こちらの記事を参考に,海岸線データをポイントに変換してみましたが,「ベクタ解析ツール」→「最寄りのハブまでの距離」が以下のエラーメッセージとともにエラー終了してしまいます.
-----

Traceback (most recent call last):
File "/Applications/QGIS3.10.app/Contents/MacOS/../Resources/python/plugins/processing/algs/qgis/HubDistancePoints.py", line 117, in processAlgorithm
index = QgsSpatialIndex(hub_source.getFeatures(QgsFeatureRequest().setSubsetOfAttributes([]).setDestinationCrs(point_source.sourceCrs(), context.transformContext())))
Exception: unknown

-----

このエラーメッセージの解消方法をご存知の方,もしくは他の方法をご存知の方,お知恵をお貸しいただけませんでしょうか.よろしくお願いいたします.

なお,使用しているQGISは3.10.7-A Coruña,PCはMacです.

福岡

unread,
Jun 30, 2020, 12:43:24 AM6/30/20
to QGIS初心者質問グループ
Y.F 様

こんにちは

エラーの解消方法については皆目見当がついていませんが、最短距離の線を描画して距離を求める方法について妄想してみました。
頭の中で「これならできるかも?」と思った内容ですので、参考程度にご覧ください。

1 重心のデータにIDを振る
 フィールド計算機で「$id」という関数を使って、各点にユニークな番号を振ります。後の説明のためにフィールド名を「ID」としてきます。

2 後で使うツールで、線を引く順番のフィールドを指定する必要があるので「1」という数値を設定します。
 これも重心データですがフィールド計算機を利用して、例えば「Order」というフィールド名で「1」という値を振ります。

3 ライン上に重心データをスナップします。
 プロセッシングツールの「ベクタジオメトリ - ジオメトリをスナップ」を利用して、重心ポイントを海岸線にスナップします。
 閾値は結構大きな値にする必要があると思います。
 スナップされたものは、重心データの属性テーブルを引き継いだ別レイヤになります。

4 スナップされたレイヤの「Order」の値を「2」にする。
 フィールド計算機で、既存のフィールド「Order」の値を「2」にします。

5 重心とスナップした点を1つのレイヤにまとめる。
 メニューの「ベクタ - データ管理ツール - ベクタレイヤのマージ」で1つにまとめます。

6 「ID」が同じ点の間に線を引きます。
 プロセッシングツールの「ベクタ作成 - 点をつないで線に」を使って線を引きます。
 つなぐ順序のフィールドに「Order」、グループをあらわすフィールドに「ID」を指定します。

7 距離を計算する
 6で作った線に対して、フィールド計算機の「$length」を使って距離を求めます。

Y.F

unread,
Jun 30, 2020, 9:07:58 PM6/30/20
to QGIS初心者質問グループ
福岡 さま

投稿ありがとうございます.

投稿してくださった「3 ライン上に重心データをスナップ」の処理がなかなか終わらず,ご教授いただいた方法を最後まで試せておりません.
結果がで次第,また報告させていただきます.

まずは取り急ぎ,お礼申し上げます.

Y.F

unread,
Jul 5, 2020, 10:14:20 PM7/5/20
to QGIS初心者質問グループ
福岡 さま

お世話になります.

お教えくださった方法で,以下のスクリーンショットのように,旧市町村の重心とそれに対応する海岸線上の点の間に線を引き,距離を求めることができました.

スクリーンショット 2020-07-06 10.04.40.png


1点気になるのは,スクリーンショットからも分かる通り,重心が海岸線のある1点と対応づけられていることが多いことです.
各重心に対応する海岸線の点は,それぞれ異なると思うのですが,そのような結果ではありませんでした.
これを回避する方法をご存じではありませんでしょうか.

スナップは,
許容 : 10.000000 度
動作 : 最近傍点を優先し,必要に応じて頂点を追加する
と設定し,実行いたしました.







福岡

unread,
Jul 6, 2020, 1:37:18 AM7/6/20
to QGIS初心者質問グループ
Y.F 様

こんにちは

実際にデータを触っていませんので確実ではありませんが、画像を拡大して見たところ海岸線とおぼしき所に配置された点で、線で結ばれていないものがあるように感じました。
もしそうであれば、線を引く際にペアにするための設定データが正しいか、線を引く際のグループを示すフィールドが正しく設定されているか、の2点のチェックが必要だと思います。

ざっとしたチェックとしては、
属性テーブルの「ID」というフィールドをソートして同じ番号が2個ずつ設定されているかをチェックする。
「点をつないで線に」を実行する際に「グループを示すフィールド」が正しく設定されているかチェックする。
ということになるかと思います。

なお、それとは別にちょっと気になるところがありました。
許容を「10度」としたということは、地理座標(緯度経度)をお使いなのでしょうか?
求めたいのが距離(mとかkm)だとすれば、投影座標系を使うべきだと思いますが、全国分のデータということで平面直角座標やUTMでは全テータを網羅できないという判断のようにも思えます。

全国的なスケールで距離の解析をしたことが無いので、アドバイスのある方は投稿をよろしくお願いします。
私自身はデータを分割して解析するか、精度低下を許容してWebメルカトルを使うことくらいしか、現在のところ思いついていません。
Reply all
Reply to author
Forward
0 new messages