diff --git a/server/data_processing/process_lidar_data.py b/server/data_processing/process_lidar_data.py index 83633ae16f88601ef72f3386d73e5d8c9a213bdf..542991a8ab1f44872c0fa85008b17fbadae5c7bd 100644 --- a/server/data_processing/process_lidar_data.py +++ b/server/data_processing/process_lidar_data.py @@ -1,5 +1,6 @@ import json import math +import os import laspy import numpy as np @@ -7,12 +8,10 @@ import numpy as np from server.data_processing.area_processing import calculate_corners, define_gridareas, inArea, find_height, \ closest_points, position_relative_to_pointcloud, define_grid_lidardata -# 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 -def about_laz_file(): - with laspy.open(lazData_path[0]) as fh: +def about_laz_file(path): + with laspy.open(path) as fh: # Print metadata properties print("File Version:", fh.header.version) print("Point Count:", fh.header.point_count) @@ -30,9 +29,22 @@ def about_laz_file(): return [las.header.version, las.header.point_count, las.header.scale, las.header.offset] +def find_folder_files(direcory): + files = [] + for root, _, fileNames in os.walk(direcory): + for fileName in fileNames: + files.append(os.path.join(root, fileName)) + return files + +print(find_folder_files()) + # 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): + # test dataset + laz_root_path = "server\\lidar_data\\" + body_of_water + laz_data_paths = find_folder_files(laz_root_path) + # container for all the heights in area area_heights = [] @@ -67,8 +79,8 @@ def calculate_area_data(center, body_of_water): map_data = list(filter(lambda point_position: inArea((point_position['properties']['sub_div_center'][0], point_position['properties']['sub_div_center'][1], 0.0), map_zones), map_data)) # Refactor lidar data to a readable format - iceOver = laspy.read(lazData_path[0]) - iceUnder = laspy.read(lazData_path[1]) + iceOver = laspy.read(laz_data_paths[0]) + iceUnder = laspy.read(laz_data_paths[1]) # add two files together temporary test data(soon to be removed) ice_points = list(zip(iceOver.X,iceOver.Y,iceOver.Z)) + list(zip(iceUnder.X,iceUnder.Y,iceUnder.Z)) diff --git a/server/example_lidar_data/ot_N_000005_1.laz "b/server/lidar_data/mj\303\270sa/ot_N_000005_1.laz" similarity index 100% rename from server/example_lidar_data/ot_N_000005_1.laz rename to "server/lidar_data/mj\303\270sa/ot_N_000005_1.laz" diff --git a/server/example_lidar_data/ot_N_000033_1.laz "b/server/lidar_data/mj\303\270sa/ot_N_000033_1.laz" similarity index 100% rename from server/example_lidar_data/ot_N_000033_1.laz rename to "server/lidar_data/mj\303\270sa/ot_N_000033_1.laz" diff --git a/server/main.py b/server/main.py index 662aef6517ed83ed2862bfff0f99fa9f471c3816..933d9b2493e3a1cc4b33f81fd00993cacf14f831 100644 --- a/server/main.py +++ b/server/main.py @@ -119,8 +119,17 @@ class IceHTTP(BaseHTTPRequestHandler): def do_POST(self): if self.path == '/new_lidar_data': - input_new_Lidar_data(self, self.cursor, 1, 'mj\u00f8sa') # hardcoded body of water must change later + parsed_path = urlparse(self.path) + query_params = parse_qs(parsed_path.query) + lake_name_param = query_params.get('lake', [''])[0] + lake_name = unquote(lake_name_param) # Decode url param + if lake_name_param: + input_new_Lidar_data(self, self.cursor, 1, lake_name) # hardcoded body of water must change later + else: + self.send_response(400) + self.send_header('Content-type', 'application/json') + self.end_headers() # Start a server on port 8443 using self defined HTTP class if __name__ == "__main__": diff --git a/server/map_handler/input_new_data.py b/server/map_handler/input_new_data.py index ca38882cc3bc318c5135d0eb9c4a770af6666d3b..139b798edb90eda4769c62a8d0688b56e43123b3 100644 --- a/server/map_handler/input_new_data.py +++ b/server/map_handler/input_new_data.py @@ -5,6 +5,14 @@ from server.data_processing.process_lidar_data import calculate_area_data, about # input_new_Lidar_data send new data gathered from the lidar and send it to the database (from the drone, most likely) def input_new_Lidar_data(self, cursor, sensorId, bodyOfWater): + """ + + :param self: + :param cursor: + :param sensorId: + :param bodyOfWater: + :return: + """ try: print("name=",bodyOfWater) # hard coded coordinates @@ -12,15 +20,18 @@ def input_new_Lidar_data(self, cursor, sensorId, bodyOfWater): longitude = 10.723823 # data about the file read from - about_laz = about_laz_file() - scale_factor = max(about_laz[2]) + # about_laz = about_laz_file() cannot do this if data is changed + # scale_factor = max(about_laz[2]) + scale_factor = max([0.01]) + + time_now = datetime.now().utcnow().replace(microsecond=0) # create a new measurement with the time the data is sent, sensor type, where # and an estimate of average thickness of ice on water body cursor.execute(''' INSERT INTO Measurement(MeasurementID, SensorID, TimeMeasured, WaterBodyName, CenterLat, CenterLon) VALUES (?,?,?,?,?,?); - ''', (1, sensorId, datetime.utcnow().replace(microsecond=0), bodyOfWater, latitude, longitude)) + ''', (1, sensorId, time_now, bodyOfWater, latitude, longitude)) # auto generate new measurement id measurement_id = cursor.lastrowid @@ -29,6 +40,19 @@ def input_new_Lidar_data(self, cursor, sensorId, bodyOfWater): areas_data = calculate_area_data((latitude, longitude), bodyOfWater) lidar_json_data = [] + subdiv_json_data = [] + + measurement_data = { + 'measurement_id': measurement_id, + 'TimeMeasured': time_now, + 'CenterLat': latitude, + 'CenterLon': longitude, + 'Sensor': { + 'SensorId': 2, + 'SensorType': "LiDar", + "Active": True, + } + } if(areas_data): # store lidar data in jason formate @@ -55,23 +79,25 @@ def input_new_Lidar_data(self, cursor, sensorId, bodyOfWater): sub_center = (map_lat, map_lng) # set up json formate lidar_read = { - 'MeasurementId': str(measurement_id), - 'SubId': str(subId), - 'SubCenter': str(sub_center), - 'Heights': str(heights) + 'SubdivId': subId, + 'MinThickness': minimum_thickness, + 'AvgThickness': average, + 'CenLatitude': sub_center[0], + 'CenLongitude': sub_center[1], + 'Accuracy': scale_factor, } - lidar_json_data.append(lidar_read) - - # input the newly generated measurement_id and whole average thickness - cursor.execute(''' - UPDATE Measurement - SET measurementID = ? - WHERE MeasurementID IS NULL; - ''', (int(measurement_id),)) + subdiv_json_data.append(lidar_read) else: print('No data found, line 79') + measurement_json_data = { + 'Measurement': measurement_data, + 'Subdivisions': subdiv_json_data, + } + + lidar_json_data.append(measurement_json_data) + # send the changes to the database cursor.connection.commit()