Spaces:
Running
Running
import numpy as np | |
import math | |
import shapely | |
from shapely.geometry import Polygon, LineString | |
import torch | |
from torch_geometric.utils import to_undirected, remove_self_loops | |
from torch_geometric.data import Data | |
def node_graph(apa_coor, apa_geo): | |
num_op = len(apa_coor) | |
apa_coor = apa_coor[0:-1] | |
# apa_coor.pop(num_op-1) | |
node_lst = [] | |
num_p = len(apa_coor) | |
for j in range(num_p): | |
p = apa_coor[j] | |
if j == 0: | |
sindex = -1 | |
oindex = j | |
eindex = 1 | |
elif j == (len(apa_coor)-1): | |
sindex = j-1 | |
oindex = j | |
eindex = 0 | |
else: | |
sindex = j-1 | |
oindex = j | |
eindex = j+1 | |
sp = apa_coor[sindex] | |
s = np.array(sp) | |
op = apa_coor[oindex] | |
o = np.array(op) | |
ox = op[0] | |
oy = op[1] | |
ep = apa_coor[eindex] | |
e = np.array(ep) | |
Area = apa_geo.area | |
local_polygon = Polygon((sp, op, ep)) | |
larea = (local_polygon.area) / Area | |
se = LineString((sp, ep)) | |
llength = se.length / math.sqrt(Area) | |
osv = s - o | |
oev = e - o | |
langle = angle_between(osv, oev) | |
if langle < 0: | |
langle = langle + (2*math.pi) | |
oop = (0, 0) | |
oo = np.array(oop) | |
regional_polygon = Polygon((sp, oop, ep)) | |
regional_polygon_area = regional_polygon.area | |
rarea = regional_polygon_area / Area | |
regional_polygon_perimeter = regional_polygon.length / 2 | |
rperimeter = regional_polygon_perimeter / math.sqrt(Area) | |
rradius = (regional_polygon_area / regional_polygon_perimeter) / math.sqrt(Area) | |
oosv = s - oo | |
ooev = e - oo | |
rangle = angle_between(oosv, ooev) | |
if rangle < 0: | |
rangle = rangle + (2*math.pi) | |
#ox, oy, | |
nl = [larea, llength, langle, rarea, rperimeter, rradius, rangle] | |
node_lst.append(nl) | |
ms_lst = [] | |
me_lst = [] | |
for k in range(num_p): | |
if k == (num_p - 1): | |
ms = k | |
me = 0 | |
else: | |
ms = k | |
me = k+1 | |
ms_lst.append(ms) | |
me_lst.append(me) | |
mse = [ms_lst, me_lst] | |
datasets = [] | |
for i in range(2): | |
node_f = torch.FloatTensor(node_lst) | |
x = node_f | |
edge_index = torch.tensor(mse, dtype=torch.long) | |
edge_index, _ = remove_self_loops(edge_index) | |
edge_index = to_undirected(edge_index=edge_index) | |
data = Data(x=x, edge_index=edge_index) | |
datasets.append(data) | |
return datasets | |
def angle_between(v1, v2): | |
""" Returns the angle in radians between vectors 'v1' and 'v2' | |
The sign of the angle is dependent on the order of v1 and v2 | |
so acos(norm(dot(v1, v2))) does not work and atan2 has to be used, see: | |
https://stackoverflow.com/questions/21483999/using-atan2-to-find-angle-between-two-vectors | |
""" | |
arg1 = np.cross(v1, v2) | |
arg2 = np.dot(v1, v2) | |
angle = np.arctan2(arg1, arg2) | |
return angle | |