質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

3317閲覧

geopandasで読み込んだshpファイルの属性テーブルに新たなフィールドを追加したい。

melo_yuya

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2021/03/22 02:36

実行環境

実行環境はWindows10、Annaconda(Spyder)を使用しています。

実現したいこと

geopandasで読み込んだshpファイルの属性テーブルに新たなフィールドを追加したい。

###前提
農地データと人工衛星のマイクロ波の照射方向の関係性について研究しています。
geopandasによってshpファイル(耕区データ)を読み込み、ポリゴンを抽出しました。
そして各ポリゴンに対して軸を15度ずつ回転させていき、x軸方向とy軸方向の標準偏差を計算しています。今後実際にgeopandasで読み込んだshpファイルの属性テーブルに標準偏差が最大・最小となる角度を追加しようと考えています。そして最終的にQGISで実際にshpファイルを表示させようと考えています。

該当のソースコード

Python

1import geopandas as gpd 2import re 3import numpy as np 4import math 5from statistics import stdev 6 7#','のところで区切る 8def convert_coordinates(x): 9 s = re.sub('(^[^(]*(*)|()*)', '', x.wkt) 10 return [[float(x) for x in y.strip().split(' ')] for y in s.split(',')] 11 12#shpファイルの読み込み 13yoshi = gpd.read_file("yoshikawa_2019.shp") 14 15#座標の抽出 16yoshi_points = yoshi['geometry'] 17print(yoshi_points) 18 19for i in range(0, 57): 20 #1つのポリゴンに関する座標取得 21 coordinates = convert_coordinates(yoshi_points[i]) 22 #ポリゴンを構成する頂点の数 23 point = len(coordinates) 24 stdev_x1 = [] 25 stdev_y1 = [] 26 27 for k in range(0,12): 28 #軸の回転角度 29 a = k * 15 30 #回転行列の作成 31 rot = np.array([[math.cos(math.radians(a)),math.sin(math.radians(a))], 32 [(-1)*math.sin(math.radians(a)),math.cos(math.radians(a))]]) 33 x = [] 34 y = [] 35 36 for j in range(0,point): 37 #あるポリゴンに関しての点 38 coordinates_c = coordinates[j] 39 #z座標削除 40 coordinates_c = coordinates_c[0:2] 41 #行列演算をするためにlist型からnumpyに変換 42 c = np.array(coordinates_c) 43 44 d = np.dot(rot, c) 45 46 d_rot = d.tolist() 47 x += [d_rot[0]] 48 y += [d_rot[1]] 49 50 if j == point-1: 51 #あるポリゴンでx軸方向の標準偏差の計算 52 stdev_x1 += [stdev(x)] 53 #あるポリゴンでx軸方向の標準偏差の最大値 54 max_x1 = max(stdev_x1) 55 #あるポリゴンでx軸方向の標準偏差の最小値 56 min_x1 = min(stdev_x1) 57 #あるポリゴンでx軸方向の標準偏差の計算 58 stdev_y1 += [stdev(y)] 59 #あるポリゴンでy軸方向の標準偏差の最大値 60 max_y1 = max(stdev_y1) 61 #あるポリゴンでy軸方向の標準偏差の最小値 62 min_y1 = min(stdev_y1) 63 else: 64 pass 65 66 if k == 11: 67 #何番目の標準偏差が最大値か 68 max_order = 15*(stdev_x1.index(max_x1)) 69 print("max_x1:{}".format(max_order)) 70 #何番目の標準偏差が最小値か 71 min_order = 15*(stdev_x1.index(min_x1)) 72 print("min_x1:{}".format(min_order)) 73 #何番目の標準偏差が最大値か 74 #print("max_y1:{}".format(stdev_y1.index(max_y1))) 75 #何番目の標準偏差が最小値か 76 #print("min_y1:{}".format(stdev_y1.index(min_y1))) 77 #座標に標準偏差も追加 78 coordinates += (max_order, min_order) 79 else: 80 pass

困っていること

現在標準偏差を計算する段階まで進みました。
処理を行う際に計算を行うためにnumpy、行列として扱うためにlistを使用しています。geopandasのデータフレームではなくなっていますが、その後QGISに表示することを考えると元々のshpファイルへの属性値の追加を行いたいです。
もし分かる方がいましたら、教えていただきたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

色々やり方はあると思いますが、私が知ってる範囲では次のようなやり方が
いいのではと思っています。

python

1def mycalc(row): 2 coordinates = convert_coordinates(row['geometry']) 3 # 略 4 return (標準偏差が最大となる角度,標準偏差が最小となる角度) 5 6yoshi = gpd.read_file("yoshikawa_2019.shp") 7 8yoshi[['Angle1','Angle2']]=yoshi.apply(mycalc, axis=1,result_type='expand') 9 10yoshi.to_file('yoshikawa_2019_calc.shp') 11

to_fileのパスを読み込みと同じにすると上書きになります。

ただ、これだけだとデータの型が読み込んだ時と変わってしまうと思うので
データ型を気にする場合には注意が必要だと思います。

(追記 2021/05/24)
Geopandasの処理はpandasと似ていますので、pandasで検索すると色々な方法はわかるかと思います。

投稿2021/03/22 13:14

編集2021/03/23 20:26
xail2222

総合スコア1508

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

melo_yuya

2021/03/24 08:05

ご回答ありがとうございます。 pandasに標準偏差が最大・最小となる角度を格納し、yoshi_pointsを格納したDataFramaeに追加することで、出来ました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問