実行環境
実行環境は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ファイルへの属性値の追加を行いたいです。
もし分かる方がいましたら、教えていただきたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/24 08:05