Skip to content
Snippets Groups Projects

Draft: Develop

Open Raphael Sturgis requested to merge develop into main
Files
13
+ 64
39
import numbers
import random
from copy import copy
import pandas as pd
import numpy as np
@@ -8,7 +9,7 @@ from scipy.interpolate import interp1d
from skais.utils.geography import great_circle, position_from_distance, get_coord
from skais.ais.ais_points import AISPoints
from skais.utils.geometry import bresenham
from skais.utils.geometry import bresenham, dist_on_grid
@jit(nopython=True)
@@ -87,7 +88,7 @@ def __get_bounding_box__(bounding_box, positions, ref_index):
upper_lon = center_lon + distance_to_center
lower_lon = center_lon - distance_to_center
elif type(bounding_box) is list:
if type(bounding_box[0]) is not numbers.Number:
if not isinstance(bounding_box[0], numbers.Number):
upper_lon = bounding_box[1][0]
lower_lon = bounding_box[0][0]
upper_lat = bounding_box[1][1]
@@ -130,22 +131,9 @@ def generate_points(data, positions, height, width, node_size, lower_lat, upper_
data[x, y] = [1]
@jit(nopython=True)
def generate_links(data, positions, height, width, lower_lat, upper_lat, lower_lon, upper_lon):
lon, lat = positions[0, 0], positions[0, 1]
for longitude, latitude in positions[1:]:
x_prv, y_prev = get_coord(lat, lon, height, width, lower_lat, upper_lat, lower_lon, upper_lon)
x_nxt, y_nxt = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon,
upper_lon)
lon, lat = longitude, latitude
for x, y in bresenham(x_prv, y_prev, x_nxt, y_nxt):
data[x, y] = [1]
@jit(nopython=True)
def generate_points_with_features(data, positions, features_vectors, bounds, node_size, height, width,
lower_lat, upper_lat, lower_lon, upper_lon, link):
lower_lat, upper_lat, lower_lon, upper_lon):
for pos, f in zip(positions, features_vectors):
latitude = pos[1]
longitude = pos[0]
@@ -162,21 +150,52 @@ def generate_points_with_features(data, positions, features_vectors, bounds, nod
for y in range(y_lower_bound, y_upper_bound + 1):
for i, v in enumerate(value):
data[x, y, i] = v
if link:
lon, lat = positions[0, 0], positions[0, 1]
value = __get_image_value__(features_vectors[0], bounds)
for pos, f in zip(positions[1:], features_vectors[1:]):
latitude = pos[1]
longitude = pos[0]
x_prv, y_prev = get_coord(lat, lon, height, width, lower_lat, upper_lat, lower_lon, upper_lon)
x_nxt, y_nxt = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon,
upper_lon)
lon, lat = longitude, latitude
for x, y in bresenham(x_prv, y_prev, x_nxt, y_nxt):
for i, v in enumerate(value):
data[x, y, i] = v
value = __get_image_value__(f, bounds)
@jit(nopython=True)
def generate_links(data, positions, height, width, lower_lat, upper_lat, lower_lon, upper_lon, values,
link_type=None):
lon, lat = positions[0, 0], positions[0, 1]
current_value = values[0]
for pos, nxt_value in zip(positions[1:], values[1:]):
latitude = pos[1]
longitude = pos[0]
x_prv, y_prev = get_coord(lat, lon, height, width, lower_lat, upper_lat, lower_lon, upper_lon)
x_nxt, y_nxt = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon,
upper_lon)
lon, lat = longitude, latitude
dist = dist_on_grid(x_prv, y_prev, x_nxt, y_nxt)
for x, y in bresenham(x_prv, y_prev, x_nxt, y_nxt):
dist_prev = dist_on_grid(x_prv, y_prev, x, y)
dist_next = dist_on_grid(x, y, x_nxt, y_nxt)
pixel_color = current_value * (1 - dist_prev / dist) + nxt_value * (1 - dist_next / dist)
for i in range(len(pixel_color)):
if nxt_value[i] == current_value[i]:
data[x, y, i] = current_value[i]
elif link_type == 'interpolate':
data[x, y, i] = pixel_color[i]
elif link_type == 'previous':
data[x, y, i] = current_value[i]
elif link_type == 'next':
data[x, y, i] = nxt_value[i]
elif link_type == 'solid':
data[x, y, i] = 1
current_value = nxt_value
@jit(nopython=True)
def generate_values(features_vectors, bounds):
result = np.zeros(features_vectors.shape)
for i in range(len(features_vectors)):
features = features_vectors[i]
value = __get_image_value__(features, bounds)
for j in range(len(value)):
v = value[j]
result[i, j] = v
return result
class AISTrajectory(AISPoints):
@@ -345,7 +364,7 @@ class AISTrajectory(AISPoints):
result.append((row['ts_sec'], current_label))
return result
def generate_array_from_positions(self, height=256, width=256, link=True, bounding_box='fit', ref_index=-1,
def generate_array_from_positions(self, height=256, width=256, link=None, bounding_box='fit', ref_index=-1,
features=None, node_size=0):
positions = self.df[['longitude', 'latitude']].to_numpy()
@@ -358,11 +377,11 @@ class AISTrajectory(AISPoints):
elif type(features) is list:
features_vectors = self.df[features].to_numpy()
for c in features_vectors.T:
bounds.append((0, max(c)))
bounds.append([0, max(c)])
elif type(features) is str:
features_vectors = self.df[[features]].to_numpy()
for c in features_vectors.T:
bounds.append((0, max(c)))
bounds.append([0, max(c)])
elif type(features) is dict:
bounds = list(features.values())
features_vectors = self.df[features.keys()].to_numpy()
@@ -371,18 +390,24 @@ class AISTrajectory(AISPoints):
if features_vectors is not None:
nb_channels = len(features_vectors.T)
bounds = np.array(bounds)
else:
nb_channels = 1
data = np.zeros((height, width, nb_channels), dtype=np.float)
data = np.zeros((height, width, nb_channels), dtype=float)
if features_vectors is None:
generate_points(data, positions, height, width, node_size, lower_lat, upper_lat, lower_lon, upper_lon)
if link:
generate_links(data, positions, height, width, lower_lat, upper_lat, lower_lon, upper_lon)
if link is not None:
generate_links(data, positions, height, width, lower_lat, upper_lat, lower_lon, upper_lon,
np.ones((len(positions), 1)), link)
else:
generate_points_with_features(data, positions, features_vectors, bounds, node_size, height, width,
lower_lat, upper_lat, lower_lon, upper_lon, link)
generate_points_with_features(data, positions, features_vectors, np.array(bounds), node_size, height, width,
lower_lat, upper_lat, lower_lon, upper_lon)
if link is not None:
generate_links(data, positions, height, width, lower_lat, upper_lat, lower_lon, upper_lon,
generate_values(features_vectors, bounds), link)
return data
Loading