Outline_Embedding / utils /node_features.py
LuyangZ's picture
Upload 30 files
01df1d6 verified
raw
history blame contribute delete
No virus
3.07 kB
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