[OSGeoJapan-discuss] 【Qgis:教えてください】ライン群を同じノード数(たとえば1-10番目)で揃えたい

shimada yasu yas.shimada35 @ gmail.com
2023年 2月 5日 (日) 18:16:28 PST


みなさま

週末に試行錯誤しました

結局、Qgisでは(素人なので)難しく、Rで頑張りました

●イメージを添付します
●Rnoスクリプト(抜粋)は以下のとおりです

library(foreign)
library(dplyr)
library(circular)
library(sf)
library(psych)

# **** ラインシェープ(shp)の読み込み
shp <- st_read("C:/hoge.shp")

# データフレーム変換
shp_df <- as.data.frame(st_coordinates(shp))

# 点と線のデータフレームとする
point_ID <- as.data.frame(st_cast(shp, "POINT"))
line_df <- as.data.frame(shp)

#点のxyフレームに、IDを付ける
shp_df <- cbind(shp_df, point_ID)

#出力例
#           X       Y L1  ID species                 geometry
#400   511138.9 4287588  1 399  マガン POINT (511138.9 4287588)
#400.1 511172.9 4287602  1 399  マガン POINT (511172.9 4287602)
#400.2 511198.8 4287620  1 399  マガン POINT (511198.8 4287620)
#400.3 511222.1 4287636  1 399  マガン POINT (511222.1 4287636)
#400.4 511246.7 4287653  1 399  マガン POINT (511246.7 4287653)
#400.5 511289.2 4287700  1 399  マガン POINT (511289.2 4287700)

となるので、dplyrで距離や角度を計算していって、最後の最後に

# *** ノード数が_N_以上のもので、1:Nを計算し、平均とSDを得る ***
re <- shp_df %>% group_by (ID) %>% summarise( num=n()) %>%
left_join(df, by="ID") %>% filter ( num >= 10 )  %>% group_by(ID) %>%
summarise(speed = mean(distance[1:4]), sd_speed = sd(distance[1:4]),
ave_accel = mean(accel[1:4]), sd_accel = sd(accel[1:4]), cir_mean =
mean(rad_angle[1:4]), cir_sd = sd(rad_angle[1:4]), num=n())

とやってやると

# A tibble: 6 × 11
#    ID speed sd_speed ave_accel sd_accel cir_mean cir_sd   num ratio
length ave_first_last
#  <int> <dbl>    <dbl>     <dbl>    <dbl>    <dbl>  <dbl> <int> <dbl>
 <dbl>          <dbl>
#1   399  35.3     9.89   -0.548     14.9     0.947 0.280     21 0.949
  861.           817.
#2   400  60.5    52.5     0.439     83.5     0.672 0.208     22 0.977
 1233.          1205.
#3   402  45.7    13.3     0.943     19.5     1.37  0.0967    19 0.996
 1121.          1116.
#4   404  33.2     3.82    1.28       6.08    0.791 0.156     12 0.985
  465.           458.
#5   405  36.6    10.9     0.839     16.6     0.372 0.205     25 0.983
 1013.           996.
#6   406  47.9    16.9    -0.0209    25.6     0.685 0.133     16 0.992
  850.           843.

という結果が得られたので、たぶん上手くいったかなと・・・

ありがとうございました

しまだ

2023年2月4日(土) 9:01 shimada yasu <yas.shimada35 @ gmail.com>:
>
> 大変失礼しました
>
> メーリングリストでの添付は原則、御法度で、NGだと思ってました
>
> このあと試行錯誤しますので、具体的なイメージは、その結果をお知らせするときにお伝えします
>
> 今後はご指摘された点も踏まえ、分かりやすい説明を心がけたいと思います
>
> 引き続きよろしくお願いいたします
>
> しまだ
>
> 2023年2月4日(土) 8:54 <y-iwasa @ limecon.co.jp>:
>>
>> 多分大御所の嘉山さんがご回答されているので解決しているかと思いますが別の観点でアドバイスを。
>>
>>
>>
>> できれば補足資料があった方がいいかと。
>>
>>
>>
>> 多分メール文面だけだとイメージしずらいような...
>>
>>
>>
>> 手書きメモもしくはパワポ等で簡単な絵を添付してもらえるとある意味回答する方も考えやすいかと。
>>
>> まあここら辺は質疑応答時のあるあるかもしれませんが質問者側は作業状況をわかっているので
>>
>> ピンポイント的な質問になってしまいますが、質問される側だと背景等がわからないためアドバイスが難しいような。
>>
>>
>>
>> 素朴な疑問としてノードが10以上あるラインの場合、1~10のノードのみ利用となると残りのノードは必要ないと読み取れてしまいます。
>>
>> となると例えば20個のノードで構成しているラインのうち半分は使わないとなるとそのようなことが何に使えるのかなと疑問をもってしまいます。
>>
>> 土木系なのでラインデータでもノード数は結構あるかと思われるので。
>>
>>
>>
>> 例えばノードは10個以内にして2つのラインに分割ということだとわかるのですが...
>>
>> QGISのプロセッシングツールでできるか見てみましたが線の分割などは分割単位は長さならばできるようですが
>>
>> ノードの数で10単位に分割というのはできないみたいですね。多分プログラム的にはできるような気がしますがそのようなニーズが少ないかないという感じでしょうか?
>>
>>
>>
>> となると嘉山さん案のフィールド計算機で線作成になるかもしれません。
>>
>>
>>
>> もしくはノード数が多いというのは長い線(ライン)と考えてもいいのならまずは線の分割で各線の長さを短くするというのでもいいように思います。
>>
>>
>>
>> いわさ@愛媛
>>
>>
>>
>> From: OSGeoJapan-discuss <osgeojapan-discuss-bounces @ lists.osgeo.org> On Behalf Of shimada yasu
>> Sent: Friday, February 3, 2023 11:11 PM
>> To: Yoichi Kayama <yoichi.kayama @ gmail.com>
>> Cc: osgeojapan-discuss <osgeojapan-discuss @ lists.osgeo.org>
>> Subject: Re: [OSGeoJapan-discuss] 【Qgis:教えてください】ライン群を同じノード数(たとえば1-10番目)で揃えたい
>>
>>
>>
>> ありがとうございます
>>
>>
>>
>> はい、そのイメージです
>>
>>
>>
>> そうか、ノードを10個、ポイントとして出力できれば、ポイントからラインへ、で変換できるかも
>>
>>
>>
>> ありがとうございました 試行錯誤してみます
>>
>>
>>
>> しまだ
>>
>>
>>
>> 2023年2月3日(金) 22:22 Yoichi Kayama <yoichi.kayama @ gmail.com>:
>>
>> ノードというのはライン地物の中にある線分群の結節点(ライン内の連続点)のことでしょうか?
>>
>> そういう前提だと各ラインの頂点の数を最初に求めて、その数にしたがって分類する感じでしょうか。
>>
>>
>>
>> フィールド計算機で num(points( geometry )   という関数を使うとジオメトリ内のポイント数を取得
>>
>> できるみたいですので、結果を属性フィールドに格納します。
>>
>>
>>
>> ポイントの数が10以上のものだけを条件検索して別のレイヤに保存します。
>>
>>
>>
>> 作成されたレイヤのジオメトリを先頭10個のポイントにしたレイヤをフィールド計算機でつくれるかもしれません
>>
>>
>>
>> 関数 make_line( )  でラインを作成できる
>>
>> 関数 point_n で既存のラインから1個づつポイントを取得できるみたいなのでmake_line  の引数に point_n で取得
>>
>> した値を10個いれる
>>
>>
>>
>>
>>
>> みたいな感じでいかがでしょうか?
>>
>>
>>
>> あとは pythonでやるという手もありますが。
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>>
>> 2023年2月3日(金) 16:24 shimada yasu <yas.shimada35 @ gmail.com>:
>>
>> どなたかご存じでしたらご教示ください
>>
>> ライン群で統計処理をしています
>>
>> 現時点では、ライン群の長さ(というかノード数が)バラバラなのですが、
>> ノード数を統一して、統計処理をしたいのです
>>
>> たとえば「ノード数を10のライン群に揃え直す」としたとき
>>
>> (1)ノード数が10未満のライン--->無視
>> (2)ノード数が10以上のライン--->1番目から10番目のノードだけを抽出
>> (3)(2)で抽出したライン群を、別のラインオブジェクトとする
>>
>> このようなことは可能でしょうか・・・?
>>
>> --
>> 島田泰夫/一般財団法人日本気象協会/環境・エネルギー事業部/環境アセスメント事業課/〒170-6055豊島区東池袋3-1-1サンシャイン60-55F
>> /TEL:03-5958-8160 FAX:03-5958-8157 /shimada @ jwa.or.jp
>> /携帯:080-8018-1567
>> _______________________________________________
>> OSGeoJapan-discuss mailing list
>> OSGeoJapan-discuss @ lists.osgeo.org
>> https://lists.osgeo.org/mailman/listinfo/osgeojapan-discuss



-- 
島田泰夫/一般財団法人日本気象協会/環境・エネルギー事業部/環境アセスメント事業課/〒170-6055豊島区東池袋3-1-1サンシャイン60-55F
/TEL:03-5958-8160 FAX:03-5958-8157 /shimada @ jwa.or.jp
/携帯:080-8018-1567
-------------- next part --------------
$B%F%-%9%H7A<00J30$NE:IU%U%!%$%k$rJ]4I$7$^$7$?(B...
$B%U%!%$%kL>(B: comp_node_cluster.png
$B7?(B:         image/png
$B%5%$%:(B:     62659 $B%P%$%H(B
$B @ bL@(B:       $BL5$7(B
URL:        <http://lists.osgeo.org/pipermail/osgeojapan-discuss/attachments/20230206/244ec2ef/attachment-0001.png>


OSGeoJapan-discuss メーリングリストの案内