diff --git a/server/main.py b/server/main.py index 846143eea398bb521be833e62899746a588c7bbb..c1410f9df109656dea95bec9c96cc5cda673a595 100644 --- a/server/main.py +++ b/server/main.py @@ -1,14 +1,15 @@ +import ssl +import json +import sqlite3 from flask import Flask +from urllib.parse import urlparse, parse_qs from http.server import HTTPServer, BaseHTTPRequestHandler from consts import SSL_CERT_PATH, SSL_KEY_PATH, HOST, PORT -from map_handler.get_measurements import get_all_markers + from map_handler.add_lake import cut_map -from map_handler.process_lake import fetch_divided_map +from map_handler.get_measurements import get_all_markers from map_handler.input_new_data import input_new_Lidar_data -from urllib.parse import urlparse, parse_qs -import ssl -import json -import sqlite3 +from map_handler.process_lake import get_divided_map, get_ids_and_centers app = Flask(__name__) terminate_server = 0 @@ -60,9 +61,11 @@ class IceHTTP(BaseHTTPRequestHandler): elif self.path.startswith('/get_relation'): parsed_path = urlparse(self.path) query_params = parse_qs(parsed_path.query) - fetch_divided_map(self, 'Mjosa') # NB temp hardcoded value + get_divided_map(self, 'Mjosa') # NB temp hardcoded value elif self.path == '/divide_new_relation': cut_map(self, 'Mjosa') + elif self.path == '/test': + get_ids_and_centers('server/map_handler/lake_relations/mjosa_div.json') def do_POST(self): if self.path == '/new_lidar_data': diff --git a/server/map_handler/__pycache__/add_lake.cpython-311.pyc b/server/map_handler/__pycache__/add_lake.cpython-311.pyc index 9273e1d98fac5a18558f571c266cc29040000aa5..6f2d57a52f8c159e10e5f2ba1f0bd62a7ec6c0f0 100644 Binary files a/server/map_handler/__pycache__/add_lake.cpython-311.pyc and b/server/map_handler/__pycache__/add_lake.cpython-311.pyc differ diff --git a/server/map_handler/__pycache__/get_measurements.cpython-311.pyc b/server/map_handler/__pycache__/get_measurements.cpython-311.pyc index a4fe25102572eb8dc40b8e672a1229eb71507cf5..3c546c803103ceed9c919b9c8ddcce41627366ab 100644 Binary files a/server/map_handler/__pycache__/get_measurements.cpython-311.pyc and b/server/map_handler/__pycache__/get_measurements.cpython-311.pyc differ diff --git a/server/map_handler/__pycache__/process_lake.cpython-311.pyc b/server/map_handler/__pycache__/process_lake.cpython-311.pyc index 8789c1778de26f2fba48817f2cc609251a53097c..c3ce2485ffb747f63820d5518630ccdbbaac4910 100644 Binary files a/server/map_handler/__pycache__/process_lake.cpython-311.pyc and b/server/map_handler/__pycache__/process_lake.cpython-311.pyc differ diff --git a/server/map_handler/add_lake.py b/server/map_handler/add_lake.py index f8eced82bca76a39eb04e1a06503671b633131ff..19a190fc19d8f9639c89f642e861a9dbc983ecd9 100644 --- a/server/map_handler/add_lake.py +++ b/server/map_handler/add_lake.py @@ -8,7 +8,7 @@ import os # Read a json file with relation data and send to response object def cut_map(self, body_of_water: str): # NB: implement body_of_water # Read relation from GeoJson file and extract all polygons - geo_data = gpd.read_file("server/lake_relations/mjosa.geojson") + geo_data = gpd.read_file("server/map_handler/lake_relations/mjosa.geojson") polygon_data = geo_data[geo_data['geometry'].geom_type == 'Polygon'] polygons = [Polygon(polygon.exterior) for polygon in polygon_data['geometry']] @@ -17,6 +17,10 @@ def cut_map(self, body_of_water: str): # NB: implement body_of_water divided_map = [] + # List of all subdivisions with their center coordinates + # Expected format: [(sub_div_id, [x,y]), (sub_div_id, [x,y]), ...] + sub_div_center_list = [] + for polygon in polygons: cell_width = 0.04 cell_height = 0.02 # NB could be calculated based on cell_width and distance from equator @@ -65,6 +69,8 @@ def cut_map(self, body_of_water: str): # NB: implement body_of_water rounded_coordinates.append(rounded_coords) rounded_tile = Polygon(rounded_coordinates) + sub_div_center_list.append((sub_div_id, center[0], center[1])) + tile_feature = { 'type': 'Feature', 'properties': { @@ -82,7 +88,13 @@ def cut_map(self, body_of_water: str): # NB: implement body_of_water 'tile_count': sub_div_id, # Add the last subdivision ID as number of tiles } - #write_json_to_file("server/lake_relations", "mjosa", feature_collection) + # NB currently hardcoded file path + # Create the txt file specified by the path + with open("server/map_handler/lake_relations/mjosa_centers.txt", 'w') as file: + # Iterate over the list and write each element to the file + for sub_div_id, x, y in sub_div_center_list: + file.write(f"{sub_div_id}, {x}, {y}\n") # Write each list entry on a new line + self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() diff --git a/server/map_handler/get_measurements.py b/server/map_handler/get_measurements.py index 9441ec58fc7a67700e6f1fe4b1b3c12505f8fdf9..a066d30752e32a39c442bb713bb9832a520290eb 100644 --- a/server/map_handler/get_measurements.py +++ b/server/map_handler/get_measurements.py @@ -1,7 +1,6 @@ import json from datetime import datetime import random -from random import randint # get_markers requests all marker data or valid markers, converts the data to json, and writes @@ -26,7 +25,7 @@ def get_all_markers(self, cursor, waterBodyName): rows = cursor.fetchall() - # Container for all fetched measurement objects + # List of all fetched measurement objects measurement_data = {} ''' @@ -37,25 +36,28 @@ def get_all_markers(self, cursor, waterBodyName): # Iterate over all fetched rows for row in rows: measurement_id = row[0] + sub_div_id = row[8] + center_lat = row[12] + center_lng = row[13] ''' curr_stat = [] # Find matching ice stat for stat in data['stats'] - if ice_stats.sub_div_id == row[8] + if ice_stats.sub_div_id == sub_div_id curr_stat = stat break ''' # Create subdivision new object sub_division = { - 'SubdivID': row[8], + 'SubdivID': sub_div_id, 'GroupID': row[9], 'MinThickness': row[10], 'AvgThickness': row[11], - 'CenLatitude': row[12], - 'CenLongitude': row[13], + 'CenLatitude': center_lat, + 'CenLongitude': center_lng, 'Accuracy': row[14], 'Color': calculateColor(row[11]), # NB color calculated based on average thickness, should be minimum 'IceStats': () # NB temp empty, add ice stats later @@ -151,7 +153,7 @@ def get_all_markers(self, cursor, waterBodyName): self.wfile.write(marker_data.encode('utf-8')) -def calculateColor(thickness: float): # NB not final colors nor ranges +def calculateColor(thickness: float): # NB neither final colors nor ranges if 0 < thickness <= 4: return 0xFFff0000 # Red elif 4 < thickness <= 6: diff --git a/server/map_handler/lake_relations/mjosa_centers.txt b/server/map_handler/lake_relations/mjosa_centers.txt new file mode 100644 index 0000000000000000000000000000000000000000..493c50dd3908577da4ba164a6dbf3a15a2aae571 --- /dev/null +++ b/server/map_handler/lake_relations/mjosa_centers.txt @@ -0,0 +1,308 @@ +0, 0.0345, 0.02 +1, 0.0277, 0.02 +2, 0.0371, 0.02 +3, 0.0284, 0.0171 +4, 0.0293, 0.02 +5, 0.0022, 0.0014 +6, 0.04, 0.0186 +7, 0.04, 0.02 +8, 0.0134, 0.006 +9, 0.04, 0.02 +10, 0.0008, 0.0007 +11, 0.0361, 0.0073 +12, 0.04, 0.0173 +13, 0.0388, 0.0122 +14, 0.04, 0.0198 +15, 0.034, 0.0182 +16, 0.04, 0.02 +17, 0.0029, 0.0029 +18, 0.0003, 0.0007 +19, 0.0364, 0.02 +20, 0.0215, 0.0059 +21, 0.0222, 0.02 +22, 0.008, 0.02 +23, 0.006, 0.0047 +24, 0.04, 0.02 +25, 0.04, 0.02 +26, 0.0256, 0.02 +27, 0.0152, 0.0113 +28, 0.0072, 0.0049 +29, 0.0318, 0.02 +30, 0.0334, 0.02 +31, 0.0255, 0.02 +32, 0.0154, 0.02 +33, 0.0121, 0.02 +34, 0.0018, 0.0009 +35, 0.0033, 0.0015 +36, 0.04, 0.02 +37, 0.04, 0.02 +38, 0.0336, 0.02 +39, 0.0136, 0.0063 +40, 0.0, 0.0001 +41, 0.0002, 0.0004 +42, 0.0022, 0.0023 +43, 0.025, 0.02 +44, 0.0359, 0.02 +45, 0.0308, 0.02 +46, 0.0169, 0.007 +47, 0.0, 0.0 +48, 0.0001, 0.0 +49, 0.0018, 0.0007 +50, 0.04, 0.0084 +51, 0.04, 0.02 +52, 0.04, 0.0124 +53, 0.04, 0.0168 +54, 0.04, 0.02 +55, 0.0062, 0.0018 +56, 0.04, 0.02 +57, 0.04, 0.0144 +58, 0.0363, 0.02 +59, 0.0086, 0.0024 +60, 0.04, 0.02 +61, 0.04, 0.02 +62, 0.04, 0.0126 +63, 0.04, 0.0163 +64, 0.0052, 0.006 +65, 0.037, 0.0141 +66, 0.0148, 0.0077 +67, 0.04, 0.02 +68, 0.04, 0.02 +69, 0.04, 0.02 +70, 0.04, 0.0091 +71, 0.04, 0.02 +72, 0.0011, 0.0036 +73, 0.0354, 0.02 +74, 0.0152, 0.0065 +75, 0.0184, 0.0065 +76, 0.0346, 0.0169 +77, 0.0044, 0.0015 +78, 0.0235, 0.0074 +79, 0.0006, 0.0001 +80, 0.04, 0.02 +81, 0.04, 0.02 +82, 0.04, 0.02 +83, 0.04, 0.02 +84, 0.04, 0.02 +85, 0.04, 0.02 +86, 0.0213, 0.0174 +87, 0.0328, 0.02 +88, 0.0258, 0.02 +89, 0.0217, 0.02 +90, 0.0189, 0.0035 +91, 0.04, 0.0089 +92, 0.04, 0.02 +93, 0.04, 0.02 +94, 0.04, 0.02 +95, 0.04, 0.02 +96, 0.04, 0.02 +97, 0.04, 0.02 +98, 0.04, 0.02 +99, 0.0368, 0.02 +100, 0.0169, 0.0095 +101, 0.0025, 0.0006 +102, 0.04, 0.0174 +103, 0.04, 0.02 +104, 0.04, 0.02 +105, 0.04, 0.02 +106, 0.04, 0.02 +107, 0.04, 0.02 +108, 0.04, 0.02 +109, 0.04, 0.02 +110, 0.0017, 0.0002 +111, 0.0002, 0.0 +112, 0.04, 0.02 +113, 0.04, 0.02 +114, 0.04, 0.02 +115, 0.0387, 0.02 +116, 0.0344, 0.02 +117, 0.0156, 0.02 +118, 0.0163, 0.02 +119, 0.04, 0.02 +120, 0.0057, 0.0043 +121, 0.0023, 0.0017 +122, 0.0341, 0.0142 +123, 0.0005, 0.0001 +124, 0.0074, 0.006 +125, 0.0001, 0.0003 +126, 0.0002, 0.0001 +127, 0.04, 0.02 +128, 0.04, 0.02 +129, 0.0362, 0.02 +130, 0.0063, 0.0155 +131, 0.0337, 0.0087 +132, 0.0002, 0.0001 +133, 0.0048, 0.0052 +134, 0.0013, 0.0006 +135, 0.0342, 0.02 +136, 0.0002, 0.0002 +137, 0.0018, 0.0006 +138, 0.0175, 0.0114 +139, 0.04, 0.02 +140, 0.04, 0.02 +141, 0.0148, 0.02 +142, 0.0027, 0.0126 +143, 0.0302, 0.0191 +144, 0.0289, 0.02 +145, 0.0023, 0.0004 +146, 0.0206, 0.0173 +147, 0.0027, 0.0006 +148, 0.0171, 0.0156 +149, 0.0026, 0.0027 +150, 0.0041, 0.0132 +151, 0.002, 0.0053 +152, 0.0018, 0.0029 +153, 0.04, 0.02 +154, 0.04, 0.02 +155, 0.04, 0.02 +156, 0.04, 0.02 +157, 0.04, 0.02 +158, 0.0006, 0.0005 +159, 0.04, 0.02 +160, 0.04, 0.02 +161, 0.0105, 0.0092 +162, 0.0381, 0.02 +163, 0.0339, 0.0188 +164, 0.0355, 0.02 +165, 0.0, 0.0 +166, 0.001, 0.0002 +167, 0.0022, 0.001 +168, 0.0075, 0.02 +169, 0.0087, 0.02 +170, 0.011, 0.02 +171, 0.0107, 0.02 +172, 0.0078, 0.02 +173, 0.0117, 0.02 +174, 0.0119, 0.02 +175, 0.0188, 0.02 +176, 0.0361, 0.02 +177, 0.04, 0.0169 +178, 0.0165, 0.02 +179, 0.0014, 0.0003 +180, 0.0026, 0.0027 +181, 0.0186, 0.0144 +182, 0.0204, 0.0139 +183, 0.0035, 0.0029 +184, 0.0011, 0.0007 +185, 0.0036, 0.0018 +186, 0.0029, 0.0014 +187, 0.003, 0.0011 +188, 0.0005, 0.0001 +189, 0.0018, 0.0005 +190, 0.0004, 0.0004 +191, 0.0027, 0.0016 +192, 0.0005, 0.0004 +193, 0.0003, 0.0003 +194, 0.0009, 0.0006 +195, 0.0004, 0.0006 +196, 0.0024, 0.0014 +197, 0.0012, 0.0009 +198, 0.0003, 0.0001 +199, 0.0002, 0.0001 +200, 0.0003, 0.0003 +201, 0.0004, 0.0004 +202, 0.0002, 0.0002 +203, 0.0002, 0.0003 +204, 0.0009, 0.0003 +205, 0.0011, 0.0006 +206, 0.0012, 0.0004 +207, 0.0003, 0.0003 +208, 0.0001, 0.0001 +209, 0.0001, 0.0001 +210, 0.0013, 0.0006 +211, 0.0013, 0.0005 +212, 0.0002, 0.0001 +213, 0.001, 0.0002 +214, 0.0002, 0.0001 +215, 0.0001, 0.0 +216, 0.0001, 0.0 +217, 0.0, 0.0 +218, 0.0001, 0.0 +219, 0.0, 0.0 +220, 0.0001, 0.0001 +221, 0.0001, 0.0001 +222, 0.0001, 0.0 +223, 0.0, 0.0 +224, 0.0001, 0.0001 +225, 0.0001, 0.0 +226, 0.0007, 0.0002 +227, 0.0001, 0.0001 +228, 0.0007, 0.0009 +229, 0.0002, 0.0001 +230, 0.0, 0.0 +231, 0.0, 0.0 +232, 0.0002, 0.0 +233, 0.0, 0.0 +234, 0.0001, 0.0 +235, 0.0, 0.0 +236, 0.0, 0.0 +237, 0.0, 0.0 +238, 0.0, 0.0 +239, 0.0001, 0.0001 +240, 0.0, 0.0 +241, 0.0, 0.0 +242, 0.0, 0.0 +243, 0.0, 0.0 +244, 0.0, 0.0 +245, 0.0, 0.0 +246, 0.0, 0.0 +247, 0.0, 0.0 +248, 0.0, 0.0 +249, 0.0, 0.0 +250, 0.0002, 0.0001 +251, 0.0001, 0.0 +252, 0.0, 0.0 +253, 0.0, 0.0 +254, 0.0, 0.0 +255, 0.0001, 0.0 +256, 0.0, 0.0 +257, 0.0, 0.0 +258, 0.0, 0.0 +259, 0.0, 0.0 +260, 0.0, 0.0 +261, 0.0001, 0.0001 +262, 0.0, 0.0 +263, 0.0001, 0.0001 +264, 0.0, 0.0 +265, 0.0, 0.0 +266, 0.0001, 0.0 +267, 0.0001, 0.0 +268, 0.0001, 0.0 +269, 0.0, 0.0 +270, 0.0, 0.0 +271, 0.0, 0.0 +272, 0.0, 0.0 +273, 0.0, 0.0 +274, 0.0, 0.0 +275, 0.0, 0.0 +276, 0.0, 0.0 +277, 0.0, 0.0 +278, 0.0, 0.0 +279, 0.0, 0.0 +280, 0.0, 0.0 +281, 0.0, 0.0 +282, 0.0, 0.0 +283, 0.0, 0.0 +284, 0.0002, 0.0 +285, 0.0001, 0.0001 +286, 0.0001, 0.0 +287, 0.0001, 0.0 +288, 0.0009, 0.0002 +289, 0.0015, 0.0002 +290, 0.0013, 0.0007 +291, 0.0011, 0.0005 +292, 0.0009, 0.0004 +293, 0.0002, 0.0002 +294, 0.0003, 0.0002 +295, 0.0001, 0.0001 +296, 0.0002, 0.0001 +297, 0.0003, 0.0001 +298, 0.0009, 0.0002 +299, 0.0007, 0.0004 +300, 0.0001, 0.0001 +301, 0.0003, 0.0005 +302, 0.0004, 0.0003 +303, 0.001, 0.0001 +304, 0.0005, 0.0001 +305, 0.0004, 0.0001 +306, 0.0001, 0.0 +307, 0.0004, 0.0002 diff --git a/server/map_handler/process_lake.py b/server/map_handler/process_lake.py index a11aa4838d88e86eee1dbb15d3acbb04c455eca7..904310a84fdf88e63b0f5f5b43ee47a6e2c4ef93 100644 --- a/server/map_handler/process_lake.py +++ b/server/map_handler/process_lake.py @@ -1,8 +1,8 @@ -import geopandas as gpd +import json -# Writes contents of a map_handler json file to the response -def fetch_divided_map(self, file_name): +# Writes contents of a lake json file to the response +def get_divided_map(self, file_name): self.send_response(200) self.send_header("Content-type", "application/json") self.end_headers() @@ -15,20 +15,16 @@ def fetch_divided_map(self, file_name): self.wfile.write(data.encode('utf-8')) -# Returns a list of [(sub_div_id, sub_div_center)] -def get_ids_and_centers(file_name): # NB buggy - # Expected format: [(id, [x,y]), (id, [x,y])] - geo_data = gpd.read_file("server/map_handler/lake_relations/" + file_name + "_div.json") - subdivisions = [] - for index, row in geo_data.iterrows(): - sub_div_id = row['sub_div_id'] - sub_div_center = row['sub_div_center'] +# Returns a list of all sub_division ids and their center coordinates for a given lake +def get_ids_and_centers(file_path): # NB buggy + # Expected format: [(sub_div_id, [x,y]), (sub_div_id, [x,y]), ...] + return_list = [] - print("sub_div_id: ", sub_div_id) + f = open(file_path) + data = json.load(f) - subdivision = { - 'sub_div_id': sub_div_id, - 'sub_div_center': sub_div_center - } - subdivisions.append(subdivision) - return subdivisions + for measurement in data['measurement']: + for sub_div in measurement['Subdivisions']: + return_list.append((sub_div['SubdivID'], (sub_div['CenLatitude'], sub_div['CenLongitude']))) + + return return_list