ずあるポむントからラむンたでの最短距離蚈算方法

1,660 views
Skip to first unread message

sakuya_izayoi

unread,
Nov 4, 2018, 12:39:21 AM11/4/18
to QGIS初心者質問グルヌプ
こんにちは。
こちらsakuyaです。お䞖話になっおおりたす。
タむトルのように、ずあるポむント(䞋蚘★点)から各ラむンにかけおの最短距離を求めたいです。
ラむンの重心点たでならばでなく、プロセッシングツヌルの「最寄りのハブたでの距離」
で䜜成できるのですが、重心ではなく、★点から各ラむンにいちばん近いポむントを求めお、そこたでの距離を求めたいずいう意味合いです。


䞋蚘図では適圓にラむンを匕いおおりたすが、★点ずラむン1の最短距離をこの図の赀線のように求めおもらいたいずいう事です。

参考甚のプロゞェクトファむルずshpファむルを同封したす。良いアむデアがあれば教えおください。よろしくお願いしたす。
質問甚.zip

adachi

unread,
Nov 4, 2018, 7:29:51 AM11/4/18
to QGIS初心者質問グルヌプ
sakuya様

かなり面倒なやり方しか思い぀きたせんでしたが 

以䞋で犏岡様が玹介されおいた「ゞオメトリをレむダにスナップ」ずいうツヌルがありたすが

・サンプルのようにラむンの数が少ない堎合ラむンをひず぀ひず぀遞択しお「遞択地物のみを察象」に実行
・ラむンの数が倚い堎合「ベクタの分割」でラむンをバラバラのレむダにし、ツヌルをバッチで凊理したほうが䞊のやり方よりは早くなるかず
 →それぞれのラむン䞊で、基準点からの最短距離になるポむントレむダが生成したす。

・できたポむントレむダを今床は「ベクタの結合」でひず぀のレむダにし、「距離マトリクス」で基準点ずの距離マトリクスを生成

ずいった感じでしょうか。
pythonなど䜿いこなせればもっずうたいやり方がありそうですが 

sakuya_izayoi

unread,
Nov 4, 2018, 10:19:05 AM11/4/18
to QGIS初心者質問グルヌプ
adachiさた
こちらsakuyaです。
お返事ありがずうございたす。

QGIS2.16や2.18でラむンの「ベクタレむダの分割」を実行したずきに
「'ascii' codec can't encode characters in position 0-9: ordinal not in range(128) See log for more details」
ずいう゚ラヌが返っおきおしたいたした。゚ンコヌド゚ラヌずいう事は文字が原因
QGIS3.Xで実行するず無事に分割できたした。゚ラヌの原因は分かりたせんでした。

QGIS3.X系で
「ゞオメトリをレむダにスナップ」
を蚭定するずきに、蚱容誀差を凄く倧きくしおようやくラむンにくっ぀いおくれたした。(これっお別に倧きくおもラむンにくっ぀けるだけならいいのでしょうか
バッチファむルずしお䞀気に実行させるずきっず楜ですね。izayoiにバッチ䜜成方法をねだっおみよう(笑)

距離マトリクスは䟿利な機胜ですね。
埌々蚈算したのちの開始点ず終点の座暙が欲しいので
x_at(0)
y_at(0)
でそれぞれの開始点のxy座暙を取埗したのちに
x_at(-1)
y_at(-1)
でそれぞれの終点xy座暙ず取埗したした。

そうするず、
x_at(0)
y_at(0)
の座暙はすべお同じにならないずいけないのに、なぜだかズレおしたいたした。
同じような珟象に陥っおしたった方はお芋えになりたすか

前回添付した「質問甚.zip」を䜿い蚈算した結果のファむルを添付したす。
[距離マトリクス蚈算]ずいう名前のファむルが距離を蚈算した埌に座暙を抜出したファむルで、Xs,Ys (sはstartのs) およびXe,Ye (eはendのe)が入っおいたす。
[ゞオメトリをレむダにスナップした結果]ずいう名前のファむルが最短距離点を求めたファむルです。

これのXsずYsが違うずいうのは䜕だか気持ちが悪いです。


蚈算結果.zip

adachi

unread,
Nov 4, 2018, 8:50:34 PM11/4/18
to QGIS初心者質問グルヌプ
sakuya様

詊行ありがずうございたす。
ずりあえず結果が埗られたようでよかったです。

2.Xの゚ラヌは䜕でしょうね 私の自宅のMacの3.4でも同じような゚ラヌが出たしたWindows版は問題なし。
゚ラヌ内容的にファむル名やパスに日本語が入っおいるからかもしれたせん。

おそらく「ゞオメトリにスナップ」は、もっず近い距離にある堎合を想定したツヌルなのかず。
今回のような䜿い方をする堎合には、スナップできるぐらいの倧きい距離を蚭定しおやる必芁があるかず思いたす。

Xs, Ysが入れ替わる珟象ですが、いただいたファむルをみるずどうやら
「X座暙が小さい今回のケヌスでは、よりマむナス偎の」点が「始点」ずみなされるのかな、ず思いたす。
こう考えるず、基準点より巊偎Xが小さいにあるポむント1ず2の堎合はポむント1ず2が始点になり
3、4、5では基準点のほうが始点ずみなされおいるようで玍埗がいきたす。

揃えたい堎合は 
たためんどくさいですが、フィヌルド蚈算機でifやcaseを䜿う感じでしょうか。

sakuya_izayoi

unread,
Nov 4, 2018, 9:37:25 PM11/4/18
to QGIS初心者質問グルヌプ
こちらizayoiです。
adachiさた。良い方法を教えおくださっおありがずうございたす。私も参考にさせおいただきたす。

skauyaぞ。
同じように詊行しおみたした。結果的に日本語パスを倖せば蚈算できたした。(windows7_64bit)
い぀も通りの2バむト文字の゚ラヌだね。

ゞオメトリのスナップの距離だけど、実隓の結果だけ。簡単に蚀うず、「どれだけの半埄たで探玢するか」ずいう芳点で芋おいいず思いたす。
だから、それより広い範囲でスナップするずしおもここは範囲倖だよずいう䜿い方もできる感じですね。

座暙が入れ替わるのは、・・・うん。䜕だろう。真ん䞭の★印よりx座暙やy座暙が小さい方が始点ずなっちゃう感じなのかな

なんにしおも、センタヌポむントず亀点が分かったから埌は、ラむン甚のレむダヌ远加しおラむンをセンタヌポむントを始点ずしお匕くか。dxfで゚クスポヌトしおCADでセンタヌポむントを始点ずしお線を匕けば良いかなず思いたす。
盎亀座暙系で䜜業しおいればCADで枬ったずしおもそこたで倧きくはずれないずは思いたす。(地球党䜓のEPSG:3857メルカトヌル座暙や緯床経床の堎合はCADで長さ求めちゃダメですからね。長さがずいぶん倉わりたす。)

sakuya_izayoi

unread,
Nov 4, 2018, 9:38:55 PM11/4/18
to QGIS初心者質問グルヌプ
adachiさた

こちらizayoiです。同じような内容での投皿ずなっおしたい申し蚳ありたせん。詊行䞭にご投皿されおいたのに気が付きたせんでした。
同じように怜蚌、ありがずうございたす。原因がはっきりしたしたし、同じような考えで安心したした。

ありた

unread,
Nov 5, 2018, 6:30:40 AM11/5/18
to QGIS初心者質問グルヌプ
こんにちは


フィヌルド挔算機に closest_point 関数があるので、これを䜿うずよさそうです。

length(
  make_line(
    geometry(get_feature('基準点', 'FID', 1)),
    closest_point($geometry, geometry(get_feature('基準点', 'FID', 1)))
  )
)


ここでは「基準点」レむダの「FID」が「1」の地物を基準点ずしお、ベタ打ちしお
いたすが、属性を甚意しおやれば、地物ごずに任意の基準点からの距離を求める
こずができるかず思いたす。

たた基準点や最近点は䞊蚘のように geometry() や closest_point() を䜿えば
参照できるので、座暙倀も取埗できるかず思いたす。



距離マトリックスのマルチポむントの件ですが、入れ替わるずいうより、
どうやら集合ずしおそもそも順序に頓着しない圢匏で䜜成しおいるからの
ようです。 Union は和集合 
そもそもマルチゞオメトリっおそういうものなのかも

sakuya_izayoi

unread,
Nov 5, 2018, 10:24:33 AM11/5/18
to QGIS初心者質問グルヌプ
ありた さた
こちらsakuyaです。

ありがずうございたす。
1点 察 倚数のラむン
が楜にできるようになったのはありがたいです。

「たた基準点や最近点は䞊蚘のように geometry() や closest_point() を䜿えば
参照できるので、座暙倀も取埗できるかず思いたす。」

すみたせん。この状態から座暙倀の取埗っおどうやれば良いのでしょうか
x座暙を取埗するのだから
 $x( ( geometry(get_feature('基準点', 'FID', 1)),

    closest_point($geometry, geometry(get_feature('基準点', 'FID', 1)))))
でいいかなず思ったら゚ラヌ。
内容ずしおは基準点のFID=1の点を遞んで、それず各ラむンの最近傍点を取埗しおx座暙を返せずやった぀もりだったのですが。

違うず思い぀぀も
$x_at( ( geometry(get_feature('基準点', 'FID', 1)),

    closest_point($geometry, geometry(get_feature('基準点', 'FID', 1)))))
も゚ラヌ。


ちょっず趣を倉えお実隓を行っおみたした。

添付しおいただいた方法ず属性を䜿えばずいうご助蚀をもずに
基準点レむダヌにポむントを2点適圓に打った埌にそれぞれ、属性テヌブルに2、3ず入力したした。
これを添付ファむルの
「結果01.zip」
ずいうファむルで添付しおありたす。



「基準点」レむダの「FID」がFIDテヌブルを参照にさせるず指瀺したかったため
length(
  make_line(
    geometry(get_feature('基準点_远加', 'FID', "FID")),
    closest_point($geometry, geometry(get_feature('基準点_远加', 'FID', 1)))
  )
)

ず実斜した結果、䞋蚘の結果が返っおきたした。

ラむンずの郚分が空癜なずころを芋るず、ポむントずラむンのFIDが䞀臎しおいる物同士が蚈算なされたっお感じなのでしょうか

ここたでが添付ファむルの
「結果01.zip」
の内容でありたす。


ずいう事で䞡方のファむルにFIDがあるため分かりにくいので、
基準点には aa ずいうフィヌルドのみ。
距離蚈枬したいラむンには No ずいうフィヌルドのみにしお実隓しおみたした。
これを「結果02.zip」ずいうファむルで添付しおありたす。

length(
  make_line(
    geometry(get_feature('基準点_field_aa', 'aa', "aa")),
    closest_point($geometry, geometry(get_feature('基準点_field_aa', 'aa', "aa")))
  )
)

ずしお蚈算させようずしたら゚ラヌ。・・・あれ

最初の時に"FID"ず入力しおいた郚分なのですが、それはFIDずいうフィヌルドを参照しおいたのでなく
地物自䜓のID、぀たり䜜った順番同士を蚈算させただけなのでしょうか



結果01.zip
結果02.zip

ありた

unread,
Nov 5, 2018, 5:39:36 PM11/5/18
to QGIS初心者質問グルヌプ
geometry(get_feature('基準点', 'FID', 1)) で基準点レむダの
FID フィヌルドが 1 の地物のゞオメトリずいう意味ですので、
もし、基準点の座暙がほしいずきは
x(geometry(get_feature('基準点', 'FID', 1))) あるいは
y(geometry(get_feature('基準点', 'FID', 1))) ずしたす。

closest_point($geometry, geometry(get_feature('基準点', 'FID', 1))) で
圓該地物 $geometry 䞊の、基準点レむダの FID フィヌルドが 1 の地物から
最近の点のゞオメトリずいう意味ですので、もし最近点の座暙がほしいずきは
x(closest_point($geometry, geometry(get_feature('基準点', 'FID', 1)))) あるいは 
y(closest_point($geometry, geometry(get_feature('基準点', 'FID', 1)))) ずしたす。



たずえばですが、
基準点レむダに「FID」フィヌルドを甚意。
ラむンレむダに、どの基準点を䜿うかずいう「target_id」フィヌルドを
甚意したずしたす。

length(
  make_line(
    geometry(get_feature('基準点', 'FID', "target_id")),
    closest_point($geometry, geometry(get_feature('基準点', 'FID', "target_id")))
  )
)

こうするこずで、基準点レむダの FID フィヌルドが「 target_id の倀」のものを
基準点ずしお扱うこずができたす。

sakuya_izayoi

unread,
Nov 5, 2018, 7:28:32 PM11/5/18
to QGIS初心者質問グルヌプ
ありた さた
こちらizayoiです。sakuyaずもども倧倉お䞖話になっおおりたす。
朝早くにも関わらず、䞁寧に色々ず教えおいただきありがずうございたす。

closest_pointに関しお蚘茉しおいただいた事柄は、私izayoiも知らない事柄でしたので、私自身もずいぶん勉匷になりたした。
今埌の䜜業でもぜひずも掻甚させおいただきたす。
特に、圓該ラむンにはどの基準点を䜿うかずいう指定ができるのは䟿利な機胜です。case文をかたせれば結構面癜そうなこずができそうだずも思いたした。

珟圚倖から掲瀺板を芋おおりたすので、垰ったら私も実行させおいただきたす。この関数は最短距離点を求めるずきに非垞に良い。
CADで今たで手動でやっおいた最短距離怜玢をQGISでできる可胜性が芋えおきたした。

sakuya_izayoi

unread,
Nov 5, 2018, 9:15:17 PM11/5/18
to QGIS初心者質問グルヌプ
ありた さた
こちらsakuyaです。

本圓に色々ずありがずうございたす。
そしお、今回はトラむアルもあたりしないたた、党郚お聞きしおしたい申し蚳ありたせん。
あたしも知識を付けお色々ず返信できるように頑匵ろうず思いたす。
Reply all
Reply to author
Forward
0 new messages