From f7720b7806d7e0abb41c052a9da0218bf342b980 Mon Sep 17 00:00:00 2001 From: Hoa Ben The Nguyen <hbnguye@stud.ntnu.no> Date: Thu, 29 Feb 2024 15:35:23 +0100 Subject: [PATCH] change: working function for adding lidar data, but slow --- .../process_lidar_data.cpython-39.pyc | Bin 2792 -> 2853 bytes server/data_processing/process_lidar_data.py | 8 +- server/main.py | 11 ++- .../__pycache__/get_markers.cpython-39.pyc | Bin 2796 -> 2059 bytes .../__pycache__/input_new_data.cpython-39.pyc | Bin 1591 -> 1759 bytes server/map/get_markers.py | 92 ++++++++---------- server/map/input_new_data.py | 26 +++-- server/sql_db/icedb | Bin 45056 -> 45056 bytes server/sql_db/schema.sql | 3 - 9 files changed, 68 insertions(+), 72 deletions(-) diff --git a/server/data_processing/__pycache__/process_lidar_data.cpython-39.pyc b/server/data_processing/__pycache__/process_lidar_data.cpython-39.pyc index 4b9c5e0857452a784de0ace8ed0f1d69d5075580..ed6b00f7f03e667fd4b21e59cb7f512854ed06c6 100644 GIT binary patch delta 332 zcmaDMx>SrWk(ZZ?0SLBEd625ky^-${d;K;bw}v5wQIa8rNrWMVSpvjk0rFUZJT`HL zG$yDly9Bxl7N7`RRXS5ALkYtI#u6rwSqm9!8KFF&SwJ3B33CZc4PzE75VHX>doy!0 zBT#IzK8KP!M+#>PM-6i`Q!`^Na|tJq#aPQy!xGG($>mqX2y|e&MPc}n0J(h!GS^=* zU?^e*30>IqG3ovzLB~w5?d}XOQ-DH~C$fr8Uc#X!6~&QQl$uzTpO;$11{5#i1`z^4 z!e{aW4sAxR$vm9qJjy`6ChIL0kkZM)oW_i*liN9Er9^<j3|w-IYX4bS_!#+^beLF} V#F#jkiu5P%;=IkMKY1Eg5C9T<Oc?+G delta 242 zcmZ1~_Ck~|k(ZZ?0SHuX-c60;+Q@f_-KYo1?O;e@lw?R@5&^N8fh-mghBT&5h7yJa zj3rDUxrL0ij8Go)WG4=LJJuAo7LFR`W~OGwTIL#-1)L>ZKpx{lMn;AjmS6@=cE2J< zpvmbLh2cj6<n|pXVg>P%xk_#x=n!(8Jdss&@?8!!v0E&OMX8BJY(U8(ZV({=B)lif za%wYjPxj<A7mx=DDgy~k)*@9PHMxh=m{Dc&0Zv&lkWvON31&V<J|-O|7A7$uU8Fbp NJLhdiy~&rkf&g*(HI4uP diff --git a/server/data_processing/process_lidar_data.py b/server/data_processing/process_lidar_data.py index 4db12e3d..55d31e2a 100644 --- a/server/data_processing/process_lidar_data.py +++ b/server/data_processing/process_lidar_data.py @@ -62,7 +62,8 @@ def height_in_area(area): # ] # NB: is only for the test data should be removed after - area = (area[0] * ((-3671212/60.815356) - (-3200175/60.774878)), area[1] * ((7898422/10.672022) - (4699978/10.768867))) + areazone = [(((area[0]) * ((-3671212/60.815356) - (-3200175/60.774878))) - 3200175, (area[1] * ((7898422/10.768867) - (4699978/10.672022))) + 4699978), + (((area[0] - 100) * ((-3671212/60.815356) - (-3200175/60.774878))) - 3200175, ((area[1] - 1) * ((7898422/10.768867) - (4699978/10.672022))) + 4699978)] # Refactor data format iceOver = laspy.read(lazData_path[0]) @@ -72,7 +73,8 @@ def height_in_area(area): area_heights = [] - ice_points = list(filter(lambda position: inArea(position, area), ice_points)) - area_heights.append(find_height(ice_points)) + ice_points = list(filter(lambda position: inArea(position, areazone), ice_points)) + + area_heights = find_height(ice_points) return area_heights diff --git a/server/main.py b/server/main.py index 7e79ca5e..222352aa 100644 --- a/server/main.py +++ b/server/main.py @@ -29,7 +29,7 @@ class IceHTTP(BaseHTTPRequestHandler): def do_GET(self): # Root path - if self.path == '/': # NB: temporary root path behavior + if self.path == '/': # NB: temporary root path behavior self.send_response(200) self.send_header("Content-type", "text/plain") self.end_headers() @@ -37,17 +37,18 @@ class IceHTTP(BaseHTTPRequestHandler): self.wfile.write(b"Root path hit!") elif self.path == '/update_map': # NB: should be POST? - get_all_markers(self, self.cursor, False) # Get all markers - + get_all_markers(self, self.cursor, False, 'Mjosa') # Get all markers + # NB: temporary hardcoded waterBodyName elif self.path == '/get_valid_markers': # NB: should be POST? - get_all_markers(self, self.cursor, True) # Get only valid markers + get_all_markers(self, self.cursor, True, 'Mjosa') # Get only valid markers + # NB: temporary hardcoded waterBodyName def do_POST(self): if self.path == '/get_weather_data': get_weather(self) elif self.path == '/new_lidar_data': - input_new_Lidar_data(self,self.cursor, 1, 'Mjøsa') # hardcoded body of water must change later + input_new_Lidar_data(self,self.cursor, 1, 'Mjosa') # hardcoded body of water must change later # Terminate server on key press q def on_key_press(server, event, cursor, conn): diff --git a/server/map/__pycache__/get_markers.cpython-39.pyc b/server/map/__pycache__/get_markers.cpython-39.pyc index 9e45cfc2c9ce435036ce31556ab2be3352754967..cc7f240b40c18edd6be1771b577755de32cccab0 100644 GIT binary patch delta 1130 zcmZWn&2QX96n`@w+vBh8Hc3e~RA5yt+la7gB@hyXiqMTpr6z|K5p^Y0IT>ql+IY#> zyC~6^J(L@&RAdS95v1KefCJpQ!j&WH32}?mYo+#3#2fF1Mq(`g-p9Q6=Dpv{<1=5? zYf%umfa~Y=zv5qluWL7kOq<hHL#el~;-7s<03MQqx*!EpRL&_T=-Yrg8G&MBLI5=~ zhQdssu$0+`PrfZ|WecML1xLvmfM`}|RcKepD|9M!hYb+kp<OtND{BDq8|5fVVTkY> zFd*``7uJX>M<2V_!dP1bRe@TCry7tO=&Lv2J`tx64drx+m^oxRdj&Ic)JEnQcMCVi zW--dROS8xM&{FQikpJYin7xk&h`GWOX9_=^5ib>9&UYN;in^G8Kns5p(iH}|`;hE! z5GVoy2j?(vK?Og+kMv~rCfo*r5nlwUJCT>*5-1pX%B$FekuMr=h{Z8QDq$3iLCc-m z=#=tDb@B3;=r94dVCn2ebdBQOlvn8c#4U+2TRt%7X;`UztF;mB#><s)S+s8Tx7x`d z$&y}ry}cZY)-~Dde>PFqlQh}w?|$@YvVAv=vut@%;vLai9mF!~#wT_}>uQ|lvAhxG zN!}N+E;aS^((cq%9qM8F_I6)J+xu?$)O@{cTJM%mtkv=-%k@sQQ~qJRd13RzwVP|< zr04Lxu(`g|%c7<mPS?R(;p#@a{GMGNN_>HEWNEN9a1D+I{YZ~I4L-t>-QjqONCwy2 z9eX-$$H!U!o2KKh4!SQa59c@@tK)0qc%lwJp5)Oh{-kKdWOju7!%@|dp*2?iX`d&o zd~UxsuiH6TT$8dV!z2y&`mx+k(r$T^pPM=RfA@F%cTy`OXLhj@d>$dgAN0h&zQT@^ z?cKXmrI)$W3jD0UbqB|)Iw*g2&XZ>Ow<Cs{lI&vyAdIjYBb>UF8_eK@GmD(~o>?BJ zbuwpCVo~jPpEHv^^?jc%5RTavWpoB3YN#(7F7XLB<Puh1GUNgZIjccCWb+taov0Vl Ue#BRHd!m0YzM`4QG)LV07l&gMNdN!< literal 2796 zcmeGeO>Y}TbY^#Uy|&kBnih&nfmKhnNZhCbiI!54#;yoT9Vu}MU0kfq&Lr8y-gRf! zX=AOqv`3J7CrHkbzrdLT;wOyY#L0IgP$dv=c4NnFC<x9SYu~*0=6%hZnfL4z3ONMh z%b$K`S5G7KizFt83dD!-h35fKL~#q*h+(Q6V5(B`nAi%%YpA3RVI9><SZI4r%cHJT z9E}1X(#;}#;ddCJC%AVjR`}T%55VLh#>melxFT`D@FD7}9_o`=t)P29_O)1}Y7zBy zm`M=<)DoyCFq1$df!QLWxdXkQ0hxTlF@aM!Q2Iu!$7B!j@8e8NV$h^hMYM<c;FuaH zaVCktIO3g3Bz`}pK*Ep`_sd{Sqtl6p(+Qj@qDTeanId|G>DdD{&TQe>*uwOc15H}E z4q6e3$v`^<iGDWHV-+OTUF8W5F9MYvQT&}KLtlLae(1S=j=t8<`!lrI&qc;gHqKIw zp8rbe=hu;couDZ91n)n_sBdD_y9j!($L81Q8)Z^^9o>b)>ziMgelDHo(L9RLARp(F z{i1<MFVHs*705ms6b_M`ccuoX;{0HmzIm9O5k+v&Z`GWE0>^1RH`c1l)y2BiF5hNO z*yXIv{Aj5%3yd}9hXGIVy4Pk$0(91*<z*-GqAq0#9{5`+al-hKFIrx5Sv}}TX~1p< zQ53W#vFNniZp(=nt#5nouFt|yvKL&p%N=)r)(VfJsPA{cR|qSSx5s8*<j5^A2Ha;! z&?Edf)G=oqu(eUHIc;{r+^yA>+tx%vto8|!rCP1JYJI%2RI}1VS)sL3n@F4W!8rP* z%0H=BoXD|gsyyLysR9=0v&VA6%yRWsJq;q=xaI!69rs`COzh@nK=)TR*WpmOwUJs& z2+5bpf~a1Qwe^pxt5wLr<YlpLSe1o(wYhfZ=B3)o`lZsWwN$HDS3g-;w%&!MyQTM^ z*_89?%S)PE;pLZ?^tnm}7iawB{@*3#(8ADAcDNytK$Ae1AR~bRpri|9R53($d<eFl zRxmp|u3z?<zo}lfF{)idQ<{_=w50GXOk8$SLF8)}ne?@WL%8f{m_#K-hEk-Y+Qz8# z+PM^y<<HjB;#bn_!ZT&UHYXpPt*0tny5>^=dUFfD#W)YR70ANM8MPj4do5<&?=rsc z`CC@B%`6ImZ8#zGeua2?%4he6KgejX&^@0*Q|Mj(PiC%JJ##VeBhZ|SApG96)9JK4 z7aB+4U)~7=zo&Jh&AInVr$vT6WNtTNwz0_~ciU;Tgbvcor-Ez*K}(R97e+#de<)oR z3bn<2p>??DM}kO8LZjVwCluN0Lzi`=15pS;yUAJD3H*?Wd_rzBhcYhmaw)|_p*`4y zRKUc&hzXtfZa`V7AV|nsn?i?tK@;TioCM*)gV3ICA2-UTOqx)EZ%<9KJ!<FWQZv}t zVQyp>+~iFkk%GuIJ1e7WN_Td??eJa3Q*)Soi}>5%@M&%FTH{X0c-YtuoaU9riq9$> z`d?#hS56xNr;QE|wys>ApFc)GVUO`f+vzm6Skz2Shvm+`I3;Pw?uaMvfA~27go#41 zY3A~VLR14AM91UbQ#}v(pSo@+(|AUm#%GCwbw#e{{vaB`<TtZmDi^SU3Gj(B19DS< spI39(#D>b}z(Yyp7hvM&B#?|`ixXfLc*3~e4rsT<Zpb$g%B&mYFW9X7mjD0& diff --git a/server/map/__pycache__/input_new_data.cpython-39.pyc b/server/map/__pycache__/input_new_data.cpython-39.pyc index 02a1dd5649b14c230e1c373aece6024d454c0a50..673649fd0412e6fd0fa2c004c01e4a38123e7fda 100644 GIT binary patch delta 778 zcmY*VO;6N77@l`JZKvHW;6dcWXcH3>lz7mDgC9Y3iIN}^SOO9~H0_iv?6%Mj8rP{D zHqny_X6|P9;$P4|pg+MwJ?Oz-;K7q5P8R}Unm+UPd7k&_JM+2v(;4s_$3|-XkiXa$ z^TR-A-%(!=)SKM^gxY@ubWs2TbLiq8+R_3XXzxL&JtRF0NWd1!N#8}dE=UJLIO0{G z-h<N7HF_x5g`R#FdJR2)lN-W#MshQ!xs}`86sDjd?m%AQbYE0D5a4Z+zU5X~1BxlP z0;8<BT{4`OIF9ma|F@<f!V)&G@M_5`y&|f8H2X+P3>1d69BjAV&$G%rHN4Xu=pmJC z1$N1-T|x0Jg81M8yqW@(JAm4*5-Y;#9G%wb4#{=6Osb3R1Nj;zWEUnbOu1`~q{(Jq zu+-aR^+x1x$1Ka_H*oi-W+rdj?(s_1rJ_kFDy_&*lZ^RE9JI3&xpb{A)n@B+?qlX< zdns$Nn4ghX=IU<iRGY84ciovYj<rW~%cuRLDnOa$SKP(bg@w~e+MncKxQFL!avI;H z50{^;F1h!g%C6>)oust~7ZbO^qRj?(!(=ZG<TdTL)ixCyc-)hN<Pw~d*U9jDVWw=S z>G^EKYI+$@lb2CYXi>}y8Zz!Tyk;}i)X@vA$>KuaNlQt~_F9D=HWN?Pttc*RbsaJD zd6dK(hM%-rk$gu!!ib#EckfKAb_5t3+VCMU3~Uhkj~KR2F#!tI{$pbbLttoE52@m9 aT*X6R<8(}Z)o0I-ss422ER4!=<Klmc2E`@- delta 689 zcmZWm&ubGw6rLZulg(x~RH#8vaV|mvB2^Ir)*m6sArNy(p%|1Bb|>vhcGga2O%1d5 z5b-X15IiL(Z(hCnH+U)w;>D8(@ei=zY}$(A8|HiSzW3hu9?Vzwqf;Kbt_`$(Kl;L6 zkvHY}p`)XwzLO&jvv&$EfDaXtaDkRU;SpXU2o!vZ6JwP_OPI$CV+j&dnc}rFTi{7I zA&NXUl0sr7#l)7TDky7&<}fKqqDpfp3pri{iL+9{%1}jROKY6d%E`-pV`SyS_Un3F zabYh31hV9tb3Jey@VWt{^WrlEi3`Du>I_lt{A9V}!p*C<!6V@7{7aYHCw>ELXr>Qp zh2HGBoqoU<(jU-Gf5EG19nrPg9h;uo@HPY>{fQo=H}S2@(>*2_eaMEBSg??B*=f<c z^geC$TC|#Sd}XIb|FoV-ocd0WR{QO4ySYVMo&Hv*ryor%!9+LWyMc^-cI}K9%0LF1 z_)ja{#Ft8ct(U&X-wp@XB=&YZ#{Aj22B%DjNYKdhVj-AcD`y3Ez`R%wLi#T=5=)Oq z(?M}OoJbK(13$AyOnQ66@mS!z0#D*F!(+xX90okIy@+$>$spnb;zeN?$jp2u0xq*+ z`@myq)qD%r(@*C9^{Q?M5Fvt{V}lT67c68z3p)C&L4qsC#I%uv%Fsrll7^&lqoO;+ a`oC~qhnck*Mt(eI_w)yV3DL09LB9duPptL; diff --git a/server/map/get_markers.py b/server/map/get_markers.py index e1e82312..48ce0673 100644 --- a/server/map/get_markers.py +++ b/server/map/get_markers.py @@ -1,86 +1,73 @@ import json + # get_markers requests all marker data or valid markers, converts the data to json, and writes # the data to the response object -def get_all_markers(self, cursor, valid: bool): +def get_all_markers(self, cursor, valid: bool, waterBodyName): try: - # NB: interval temporarily hard coded to 5 days - if valid: - cursor.execute(''' - SELECT m.MeasurementID, m.SensorID, m.TimeMeasured, d.Latitude, d.Longitude, - d.IceTop, d.IceBottom, d.CalculatedThickness, d.Accuracy, s.SensorType, s.Active, - c.CornerID, c.CornerLatitude, c.CornerLongitude, b.Name - FROM Measurement m - INNER JOIN Sensor s ON m.SensorID = s.SensorID - INNER JOIN Data d ON m.MeasurementID = d.MeasurementID - LEFT JOIN Corner c ON m.MeasurementID = c.MeasurementID - INNER JOIN BodyOfWater b ON m.WaterBodyName = b.Name - WHERE m.TimeMeasured > DATE_SUB(NOW(), INTERVAL 5 DAY); - ''') - else: - cursor.execute(''' - SELECT m.MeasurementID, m.SensorID, m.TimeMeasured, d.Latitude, d.Longitude, - d.IceTop, d.IceBottom, d.CalculatedThickness, d.Accuracy, s.SensorType, s.Active, - c.CornerID, c.CornerLatitude, c.CornerLongitude, b.Name - FROM Measurement m - INNER JOIN Sensor s ON m.SensorID = s.SensorID - INNER JOIN Data d ON m.MeasurementID = d.MeasurementID - LEFT JOIN Corner c ON m.MeasurementID = c.MeasurementID - INNER JOIN BodyOfWater b ON m.WaterBodyName = b.Name - ''') + sql_query = ''' + SELECT m.MeasurementID, m.SensorID, m.TimeMeasured, + s.SensorType, s.Active, + b.Name, + d.SubDivisionID, d.GroupID, d.MinimumThickness, + d.AverageThickness, d.CenterLatitude, d.CenterLongitude, + d.Accuracy + FROM Measurement m + INNER JOIN Sensor s ON m.SensorID = s.SensorID + INNER JOIN BodyOfWater b ON m.WaterBodyName = b.Name + LEFT JOIN SubDivision d ON m.MeasurementID = d.MeasurementID + WHERE b.Name = 'Mjosa' + ''' + + if valid: # Append time restriction to WHERE statement, NB temporarily hardcoded to 5 days + sql_query += ' AND m.TimeMeasured > DATE_SUB(NOW(), INTERVAL 5 DAY)' + + cursor.execute(sql_query) rows = cursor.fetchall() + # Container for all fetched measurement objects measurement_data = {} - # Iterate over the fetched rows + # Iterate over all fetched rows for row in rows: measurement_id = row[0] - # Create a data object for current row - data_object = { - 'Latitude': row[3], - 'Longitude': row[4], - 'IceTop': row[5], - 'IceBottom': row[6], - 'CalculatedThickness': row[7], - 'Accuracy': row[8] - } - - # Create a corner object for current row - corner_object = { - 'Latitude': row[12], - 'Longitude': row[13] + # Create subdivision new object + sub_division = { + 'SubdivID': row[6], + 'GroupID': row[7], + 'MinThickness': row[8], + 'AvgThickness': row[9], + 'CenLatitude': row[10], + 'CenLongitude': row[11], + 'Accuracy': row[12] } # Check if measurement ID already exists in measurement_data if measurement_id in measurement_data: # Check if the data object already exists in the list - if data_object not in measurement_data[measurement_id]['Data']: - measurement_data[measurement_id]['Data'].append(data_object) + if sub_division not in measurement_data[measurement_id]['Subdivisions']: + measurement_data[measurement_id]['Subdivisions'].append(sub_division) - # Check if the corner object already exists in the list - if corner_object not in measurement_data[measurement_id]['Corners']: - measurement_data[measurement_id]['Corners'].append(corner_object) else: # Create a new entry for measurement_id if it does not already exist in the list measurement_data[measurement_id] = { 'MeasurementID': measurement_id, 'TimeMeasured': row[2], - 'Sensor': { + 'Sensor': { # Each measurement only has one related sensor 'SensorID': row[1], - 'SensorType': row[9], - 'Active': bool(row[10]) + 'SensorType': row[3], + 'Active': bool(row[4]) }, - 'Data': [data_object], - 'Corners': [corner_object] + 'Subdivisions': [sub_division], # Array of sub_division objects } # Convert dictionary values to list of measurements data = list(measurement_data.values()) if len(rows) == 0 or len(data) == 0: # Return 500 and empty list if no data is found - print(f"An error occurred while querying the database") + print(f"Error in querying database") resp_code = 500 marker_data = '[]' else: @@ -89,7 +76,7 @@ def get_all_markers(self, cursor, valid: bool): marker_data = json.dumps(data, indent=4) except Exception as e: - print(f"An error occurred while querying the database: {e}") + print(f"Error in querying database: {e}") resp_code = 500 marker_data = '[]' @@ -100,4 +87,3 @@ def get_all_markers(self, cursor, valid: bool): # Write marker data to response object self.wfile.write(marker_data.encode('utf-8')) - diff --git a/server/map/input_new_data.py b/server/map/input_new_data.py index 87276f92..ae0965bb 100644 --- a/server/map/input_new_data.py +++ b/server/map/input_new_data.py @@ -6,19 +6,23 @@ def input_new_Lidar_data(self, cursor, sensorId, bodyOfWater): try: cursor.execute(''' - INSERT INTO Measurement( SensorID, TimeMeasured, WaterBodyName) VALUES - (?,?,?); - ''',( sensorId, datetime.utcnow(), bodyOfWater)) + INSERT INTO Measurement( SensorID, TimeMeasured, WaterBodyName, WholeAverageThickness) VALUES + (?,?,?,?); + ''', ( sensorId, datetime.utcnow().replace(microsecond=0), bodyOfWater,0)) # auto generate new measurement id measurement_id = cursor.lastrowid cursor.execute(''' - SELECT CenterLatitude, CenterLongitude, SubDivision, GroupID + UPDATE Measurement + SET measurementID = ? + WHERE MeasurementID IS NULL; + ''', (int(measurement_id),)) + + cursor.execute(''' + SELECT CenterLatitude, CenterLongitude, SubDivisionID, GroupID FROM SubDivision - where MeasurementID = ? AND (CenterLatitude, CenterLongitude) - IN (SELECT DISTINCT CenterLongitude, CenterLatitiude - FROM SubDivision); + GROUP BY CenterLatitude, CenterLongitude ''') position_data = cursor.fetchall() @@ -26,11 +30,17 @@ def input_new_Lidar_data(self, cursor, sensorId, bodyOfWater): for row in position_data: latitude, longitude, subID, groupID = row heights = height_in_area((latitude,longitude)) + if(len(heights) > 0): + print(heights) + else: + print("No height found") average = sum(heights)/len(heights) cursor.execute(''' INSERT INTO SubDivision(MeasurementID, SubDivisionID, GroupID, MinimumThickness, AverageThickness, CenterLatitude, CenterLongitude, Accuracy) VALUES (?,?,?,?,?,?,?,?); - ''',(measurement_id, subID, groupID, min(heights), average, latitude, longitude, 1)) + ''',(measurement_id, subID, groupID, float(min(heights)), float(average), float(latitude), float(longitude), float(1))) + else: + print('No data') cursor.connection.commit() diff --git a/server/sql_db/icedb b/server/sql_db/icedb index b19e3e7766c83a08ad8f1b6aa7c08743c90ab02d..a251f525001ab9e2def149b700f1a747503b7a04 100644 GIT binary patch delta 940 zcmZuvL1+^}6y3?rX0vI!U!^okV-mH|UK+Ez-NbAyZ1ErpO~8YomzWq3>cOgaQ^6jp zsFiqV5v)Z$1Qc6(X{`qjJ@jCp#zQMTv``e=qC^lqSkOPai6+tgFgyGIoA=+o`GaeY z!8ON78}Z-s9TWUqIMp_leUxmakRh-H&*27S<fTfCPVd}tUCwPuy<V3ZQM)=LYNr|x zDiK488HyH;M^!zl_Vr)7n&voe{y#7c^UoyB>#94i7+tEN$Eyc#F@RX#KvN8@!kpu{ zeui+?Bh;7?`9pDn0fYvCZs>ZoM+b@vP$ywHT8ry4)VQH47A}2=w-6#<MJQTO$&aNj zqCcA)Y{Pdb!zPp}QAU5}pv~`c;cxC1MO=3|ow#}gLEs6YG+$1(_&m)k928*;vJeG_ z{7xR12jr9TL78h_VGPZ=10IPGNfJd-q7F0o>J2_cGjV>&-81mS4Bbwyc4yDFHzA1F zAl_m6N6%~wJsdR?nZDB3!nPTje2nnR``r>U*(ftux;cON{fwDNZw>ipPMM)Ao$_hA zr(OEX#QL>n#}}W@eK8X$)@QF78u@UpcQ`gZaP2<vd7!|-PxuC(;Ulc#j4Z+e%t8UC z;5DirhJZ*>7j<~-H{ax>L?YB}e^M#GaQ7(sw@ly%a;(ELOje?Z=kGvwk7d3aedFva zXLfd2NoJ|v+A&*Oteqh7USjRg-}Ui*$UVWq2E0X86JXdO|3dCha_(jICjXsV*6=|? zSu->(tY~@^Yq{E5Wn`JM3$^)(VNEL2nXJ!S^Ld2Hjx`k6Tnd;EVBX7Xq_$icN1C5~ Gar`&crQSpU delta 148 zcmZp8z|`=7X@WE(&qNt#Rvreuv{xHb7Wi{9^S3bYU*})T-?CXypp1WVOMJs(76$<l z4!!~g{<Hiu`BV7K_?h@F^Udcg0IG=K+gwmLg;9iq{{#d7Z~ia*Z~33`-v=6Sf&T<h wdISID6a6+oLmxBne+SAv28vzfpZs{fB2a861OH3@i~Ku*VypQl?_BQ=0OE8q*Z=?k diff --git a/server/sql_db/schema.sql b/server/sql_db/schema.sql index 14138216..3c151858 100644 --- a/server/sql_db/schema.sql +++ b/server/sql_db/schema.sql @@ -61,6 +61,3 @@ INSERT INTO SubDivision (MeasurementID, SubDivisionID, GroupID, MinimumThickness (2, 2, 2, 3.5, 5.0, 60.749, 10.783, 1.4), (3, 1, 1, 4.1, 5.7, 60.768, 10.845, 1.3), (3, 2, 2, 3.5, 5.0, 60.749, 10.783, 1.4); - - - -- GitLab