diff --git a/skais/ais/ais_trajectory.py b/skais/ais/ais_trajectory.py index 9c8cc4292985e6e51f29a62ad3a426acc46efd29..336f6da6d695870ec2f2af9dddd203042fde6d1c 100644 --- a/skais/ais/ais_trajectory.py +++ b/skais/ais/ais_trajectory.py @@ -60,14 +60,16 @@ def apply_time_sequence(dat, time, func): return result +@jit(nopython=True) def __get_image_value__(features, bounds): - if len(bounds) < 1: - return [1] - value = [] + value = np.zeros((len(features))) + i = 0 for f, b in zip(features, bounds): - value.append(1 - (b[1] - f - b[0]) / (b[1] - b[0])) + value[i] = (1 - (b[1] - f - b[0]) / (b[1] - b[0])) + i = i + 1 return value + def __get_bounding_box__(bounding_box, positions, ref_index): if bounding_box == 'fit': lower_lon, upper_lon = (min(positions[:, 0]), max(positions[:, 0])) @@ -110,6 +112,73 @@ def __get_bounding_box__(bounding_box, positions, ref_index): return lower_lon, upper_lon, lower_lat, upper_lat + +@jit(nopython=True) +def generate_points(data, positions, height, width, node_size, lower_lat, upper_lat, lower_lon, upper_lon): + for longitude, latitude in positions: + x_coord, y_coord = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon, + upper_lon) + + x_lower_bound = max(0, x_coord - node_size) + x_upper_bound = min(height - 1, x_coord + node_size) + + y_lower_bound = max(0, y_coord - node_size) + y_upper_bound = min(width - 1, y_coord + node_size) + + for x in range(x_lower_bound, x_upper_bound + 1): + for y in range(y_lower_bound, y_upper_bound + 1): + 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): + for pos, f in zip(positions, features_vectors): + latitude = pos[1] + longitude = pos[0] + x_coord, y_coord = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon, + upper_lon) + value = __get_image_value__(f, bounds) + x_lower_bound = max(0, x_coord - node_size) + x_upper_bound = min(height - 1, x_coord + node_size) + + y_lower_bound = max(0, y_coord - node_size) + y_upper_bound = min(width - 1, y_coord + node_size) + + for x in range(x_lower_bound, x_upper_bound + 1): + 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) + + class AISTrajectory(AISPoints): def __init__(self, df, mmsi=0, interpolation_time=None): df = df.drop_duplicates(subset=['ts_sec']) @@ -276,8 +345,6 @@ 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, features=None, node_size=0): @@ -310,59 +377,12 @@ class AISTrajectory(AISPoints): if features_vectors is None: - for longitude, latitude in positions: - x_coord, y_coord = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon, - upper_lon) - - x_lower_bound = max(0, x_coord - node_size) - x_upper_bound = min(height - 1, x_coord + node_size) + generate_points(data, positions, height, width, node_size, lower_lat, upper_lat, lower_lon, upper_lon) - y_lower_bound = max(0, y_coord - node_size) - y_upper_bound = min(width - 1, y_coord + node_size) - - for x in range(x_lower_bound, x_upper_bound + 1): - for y in range(y_lower_bound, y_upper_bound + 1): - data[x, y] = [1] if link: - 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] + generate_links(data, positions, height, width, lower_lat, upper_lat, lower_lon, upper_lon) + else: - for pos, f in zip(positions, features_vectors): - latitude = pos[1] - longitude = pos[0] - x_coord, y_coord = get_coord(latitude, longitude, height, width, lower_lat, upper_lat, lower_lon, - upper_lon) - value = __get_image_value__(f, bounds) - x_lower_bound = max(0, x_coord - node_size) - x_upper_bound = min(height - 1, x_coord + node_size) - - y_lower_bound = max(0, y_coord - node_size) - y_upper_bound = min(width - 1, y_coord + node_size) - - for x in range(x_lower_bound, x_upper_bound + 1): - 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) + generate_points_with_features(data, positions, features_vectors, bounds, node_size, height, width, + lower_lat, upper_lat, lower_lon, upper_lon, link) return data diff --git a/skais/utils/geography.py b/skais/utils/geography.py index de21a9aed417ba8e959aa0bb5a5780f9b879634f..ae539e1ddac0640c78c1e2b266601db67c2dd251 100644 --- a/skais/utils/geography.py +++ b/skais/utils/geography.py @@ -23,6 +23,7 @@ def great_circle(lat1, lat2, long1, long2): return d +@jit(nopython=True) def get_coord(lat, lon, height, width, min_lat, max_lat, min_lon, max_lon): x_coord = max(min(height - int(height * (lat - min_lat) / (max_lat - min_lat)) - 1, height - 1), 0) y_coord = max(min(int((width - 1) * (lon - min_lon) / (max_lon - min_lon)), width - 1), 0)