diff --git a/server/data_processing/area_processing.py b/server/data_processing/area_processing.py index 30a5679476b1b154da7a0613727fb2ca8aaa0b5b..eed3dfc93d711846541fb92e116cdce0b8778082 100644 --- a/server/data_processing/area_processing.py +++ b/server/data_processing/area_processing.py @@ -1,8 +1,63 @@ +import math +from itertools import groupby from math import pi, cos EARTH = 6378.137 # Radius of the earth in kilometer METER = (1 / ((2 * pi / 360) * EARTH)) / 1000 # 1 meter in degree + +# check if lidar points is within range of the area selected +def inArea(position, areaRange): + y, x, _ = position # position to be checked + if (abs(areaRange[0][0]) > x > abs(areaRange[1][0])) and (abs(areaRange[0][1]) > abs(y) > abs(areaRange[1][1])): + return True + else: + return False + +# find distance between two points +def distance(point1, point2): + y1, x1 = point1 + y2, x2 = point2 + return math.sqrt(abs(y2 - y1)**2 + abs(x2 - x1)**2) + +# find the closest point in json list +def closest_points(point, list, coords_taken): + closest_point_found = None + closest_dist = float('inf') + for current_point in list: + dist = distance(point, current_point['properties']['sub_div_center'][0]) + if dist < closest_dist and current_point not in coords_taken: + closest_dist = dist + closest_point_found = current_point + return closest_point_found + +# Calculation of height in an area from las files +def find_height(points): + print(points, " 5 ") + height_differences = [] # final container for height data + + # sort the points + sorted_coords = sorted(points, key=lambda coord: (coord[0], coord[1])) + + # group the sorted points that has the same xy- coordinates together + groupCoords = [list(group) for key, group in groupby(sorted_coords, key=lambda coord: (coord[0], coord[1]))] + + # loop through the groups to find the difference in height + for group in groupCoords: + if len(group) < 2 or group[0] == group[1]: + continue # jump over iteration if there is only one coordinate or lidar registered the same point twice + + # find max and min height + min_height = min(coords[2] for coords in group) + max_height = max(coords[2] for coords in group) + + # difference between them + difference = max_height - min_height + height_differences.append(difference) + + # list of thickness in an area + return height_differences + def calculate_corners(lat, lng, area_offset): """Calculate corners of polygon based on a center coordinate diff --git a/server/data_processing/process_lidar_data.py b/server/data_processing/process_lidar_data.py index 3cbba72579733978ea97bc2255a30ace465d5288..ad4f1041b2c1f4a790c39c4a11eb12aa188853f5 100644 --- a/server/data_processing/process_lidar_data.py +++ b/server/data_processing/process_lidar_data.py @@ -3,11 +3,10 @@ import laspy import json import math import utm # src: https://github.com/Turbo87/utm -from itertools import groupby -from server.data_processing.area_processing import calculate_corners, define_gridareas +from server.data_processing.area_processing import (calculate_corners, define_gridareas, inArea, + find_height, closest_points) - -# hard coded files for test data +# hard coded files for test datas lazData_path = ["server/example_lidar_data/ot_N_000005_1.laz", "server/example_lidar_data/ot_N_000033_1.laz"] # Info about data @@ -30,58 +29,6 @@ def about_laz_file(): return [las.header.version, las.header.point_count, las.header.scale, las.header.offset] -# check if lidar points is within range of the area selected -def inArea(position, areaRange): - y, x, _ = position # position to be checked - if (abs(areaRange[0][0]) > x > abs(areaRange[1][0])) and (abs(areaRange[0][1]) > abs(y) > abs(areaRange[1][1])): - return True - else: - return False - -# find distance between two points -def distance(point1, point2): - y1, x1 = point1 - y2, x2 = point2 - return math.sqrt(abs(y2 - y1)**2 + abs(x2 - x1)**2) - -# find the closest point in json list -def closest_points(point, list, coords_taken): - closest_point_found = None - closest_dist = float('inf') - for current_point in list: - dist = distance(point, current_point['properties']['sub_div_center'][0]) - if dist < closest_dist and current_point not in coords_taken: - closest_dist = dist - closest_point_found = current_point - return closest_point_found - -# Calculation of height in an area from las files -def find_height(points): - print(points, " 5 ") - height_differences = [] # final container for height data - - # sort the points - sorted_coords = sorted(points, key=lambda coord: (coord[0], coord[1])) - - # group the sorted points that has the same xy- coordinates together - groupCoords = [list(group) for key, group in groupby(sorted_coords, key=lambda coord: (coord[0], coord[1]))] - - # loop through the groups to find the difference in height - for group in groupCoords: - if len(group) < 2 or group[0] == group[1]: - continue # jump over iteration if there is only one coordinate or lidar registered the same point twice - - # find max and min height - min_height = min(coords[2] for coords in group) - max_height = max(coords[2] for coords in group) - - # difference between them - difference = max_height - min_height - height_differences.append(difference) - - # list of thickness in an area - return height_differences - # find the height of an area based on the coordinates of it's center # and it's affiliations (subId and groupId) (soon to be implemented def calculate_area_data(center, body_of_water):