Skip to content
Snippets Groups Projects
Commit 9b34fd73 authored by Clemens Berteld's avatar Clemens Berteld
Browse files

Raster endpoint fully working now. Temp dir gets cleared on startup

parent 4e9d358f
No related branches found
No related tags found
No related merge requests found
import json
import psycopg2 import psycopg2
from flask import Flask, jsonify, request from flask import Flask, jsonify, request, send_from_directory
from flask_cors import cross_origin from flask_cors import cross_origin
from psycopg2 import sql from psycopg2 import sql
import configparser import configparser
...@@ -11,7 +12,6 @@ cfg = configparser.ConfigParser() ...@@ -11,7 +12,6 @@ cfg = configparser.ConfigParser()
cfg.read('../config.ini') cfg.read('../config.ini')
assert "POSTGRES" in cfg, "missing POSTGRES in config.ini" assert "POSTGRES" in cfg, "missing POSTGRES in config.ini"
param_postgres = cfg["POSTGRES"] param_postgres = cfg["POSTGRES"]
app = Flask(__name__) app = Flask(__name__)
app.config['ENV'] = "development" app.config['ENV'] = "development"
app.config['DEBUG'] = True app.config['DEBUG'] = True
...@@ -85,7 +85,6 @@ def index(): ...@@ -85,7 +85,6 @@ def index():
def getStandardQuery(): def getStandardQuery():
columns = sql.SQL(' * ') # columns to be queried (e.g. years) columns = sql.SQL(' * ') # columns to be queried (e.g. years)
wheres = sql.SQL('') # where filters wheres = sql.SQL('') # where filters
values = '' # Used in second parameter of cursor.execute() (Avoids SQL injection)
query = sql.SQL("SELECT array_to_json(array_agg(row_to_json(t))) from (" query = sql.SQL("SELECT array_to_json(array_agg(row_to_json(t))) from ("
"SELECT station_id, {} FROM stations " "SELECT station_id, {} FROM stations "
...@@ -106,17 +105,22 @@ def return_min_max(): ...@@ -106,17 +105,22 @@ def return_min_max():
@app.route('/raster', methods=['GET']) @app.route('/raster', methods=['GET'])
def get_raster(): def get_raster():
if 'years' in request.args: """
years = request.args['years'].split('-') Request like: http://127.0.0.1:42000/raster?years=2010-2018&ramp=[[255,255,255,1],[255,244,191,1],[255,233,128,1],[255,221,64,1],[255,210,0,1],[243,105,0,1],[230,0,0,1],[153,0,0,1],[77,0,0,1],[0,0,0,1]]
if int(years[1]) < int(years[0]): """
years = [years[1], years[0]] if 'ramp' in request.args:
with psycopg2.connect(database=param_postgres["dbName"], user=param_postgres["user"], password=param_postgres["password"], host=param_postgres["host"], port=param_postgres["port"]) as connection: ramp = json.loads(request.args['ramp'])
with connection.cursor() as cursor: print(ramp)
# all_years = get_year_columns(cursor) if 'years' in request.args:
average_data = get_average_of_multiple_years(cursor, years) years = request.args['years'].split('-')
write_raster(average_data) if int(years[1]) < int(years[0]):
# return send_from_directory('D:/Uni/Master/01_SS2021/Automatisierte_Geodatenprozessierung/temperaturverteilung/dataacquisition/output', filename='myraster.tif', as_attachment=True) years = [years[1], years[0]]
return 'Läuft, Brudi' with psycopg2.connect(database=param_postgres["dbName"], user=param_postgres["user"], password=param_postgres["password"], host=param_postgres["host"], port=param_postgres["port"]) as connection:
with connection.cursor() as cursor:
average_data = get_average_of_multiple_years(cursor, years)
path, filename = write_raster(average_data, ramp)
return send_from_directory(path, filename=filename, as_attachment=True)
# return 'Läuft, Brudi'
@app.route('/annualMean', methods=['GET']) @app.route('/annualMean', methods=['GET'])
@cross_origin() @cross_origin()
......
import configparser import configparser
import math import math
import os
from datetime import datetime
import numpy as np import numpy as np
import psycopg2 import psycopg2
...@@ -10,8 +12,17 @@ cfg.read('../config.ini') ...@@ -10,8 +12,17 @@ cfg.read('../config.ini')
assert "POSTGRES" in cfg, "missing POSTGRES in config.ini" assert "POSTGRES" in cfg, "missing POSTGRES in config.ini"
assert "INTERPOLATION" in cfg, "missing INTERPOLATION in config.ini" assert "INTERPOLATION" in cfg, "missing INTERPOLATION in config.ini"
param_postgres = cfg["POSTGRES"] param_postgres = cfg["POSTGRES"]
raster_columns = int(cfg["INTERPOLATION"]['raster_columns'])
ramp = [[255,255,255,1],[255,244,191,1],[255,233,128,1],[255,221,64,1],[255,210,0,1],[243,105,0,1],[230,0,0,1],[153,0,0,1],[77,0,0,1],[0,0,0,1]] # ramp = [[255,255,255,1],[255,244,191,1],[255,233,128,1],[255,221,64,1],[255,210,0,1],[243,105,0,1],[230,0,0,1],[153,0,0,1],[77,0,0,1],[0,0,0,1]]
def clean_temp(path):
for file in os.listdir(path):
try:
os.remove(path+file)
except:
pass
def get_class_steps(colour_ramp): def get_class_steps(colour_ramp):
...@@ -22,57 +33,48 @@ def get_class_steps(colour_ramp): ...@@ -22,57 +33,48 @@ def get_class_steps(colour_ramp):
temp_range = min_max[1] - min_max[0] temp_range = min_max[1] - min_max[0]
steps = temp_range / classes steps = temp_range / classes
min = min_max[0] min = min_max[0]
# print(min_max)
return min, steps, classes return min, steps, classes
def colour_picker(min, steps, classes, colour_ramp, value): def colour_picker(min, steps, classes, colour_ramp, value):
# print(min, steps, classes, value)
rgba = None rgba = None
for i in range(0, classes + 1): for i in range(0, classes + 1):
minor = math.floor(min + (i * steps)) minor = math.floor(min + (i * steps))
major = math.ceil(min + ((i + 1) * steps)) major = math.ceil(min + ((i + 1) * steps))
# print('k:', minor, 'wert:', value, 'g:', major)
if minor <= value <= major: if minor <= value <= major:
try: try:
rgba = colour_ramp[i] rgba = colour_ramp[i]
except IndexError: except IndexError:
rgba = colour_ramp[-1] rgba = colour_ramp[-1]
# print(i)
# print('ramp:', rgba)
if not rgba: if not rgba:
rgba = [0, 0, 0, 0] rgba = [0, 0, 0, 0]
return rgba return rgba
def write_raster(data): def write_raster(data, ramp):
min, steps, classes = get_class_steps(ramp) min, steps, classes = get_class_steps(ramp)
pixel_array_r = [] pixel_array_r = []
pixel_array_g = [] pixel_array_g = []
pixel_array_b = [] pixel_array_b = []
pixel_array_a = [] pixel_array_a = []
for j in range(0, 36): for j in range(0, raster_columns):
row_array_r = [] row_array_r = []
row_array_g = [] row_array_g = []
row_array_b = [] row_array_b = []
row_array_a = [] row_array_a = []
for i, station_id in enumerate(data): for i, station_id in enumerate(data):
if i % 36 == 0: if i % raster_columns == 0:
value = data[i + j][1] value = data[i + j][1]
value = 0 if not value else value value = 0 if not value else value
value = 0 if str(value) == 'NaN' else value value = 0 if str(value) == 'NaN' else value
if not value == 0: if not value == 0:
rgba = colour_picker(min, steps, classes, ramp, value) rgba = colour_picker(min, steps, classes, ramp, value)
# print(rgba)
r, g, b, a = rgba[0], rgba[1], rgba[2], rgba[3] r, g, b, a = rgba[0], rgba[1], rgba[2], rgba[3]
else: else:
r, g, b, a = 0, 0, 0, 0 r, g, b, a = 0, 0, 0, 0
# print('r', r, 'g', g, 'b', b, 'a', a)
transparent = data[i + j][2] transparent = data[i + j][2]
print(transparent)
a = 0 if transparent else a a = 0 if transparent else a
a = 255 if a == 1 else a a = 255 if a == 1 else a
row_array_r.append(r) row_array_r.append(r)
...@@ -103,7 +105,9 @@ def write_raster(data): ...@@ -103,7 +105,9 @@ def write_raster(data):
yres = (ymax - ymin) / float(nrows) yres = (ymax - ymin) / float(nrows)
geotransform = (xmin, xres, 0, ymax, 0, -yres) geotransform = (xmin, xres, 0, ymax, 0, -yres)
output_raster = gdal.GetDriverByName('GTiff').Create('D:/Uni/Master/01_SS2021/Automatisierte_Geodatenprozessierung/temperaturverteilung/dataacquisition/output/myraster.tif', ncols, nrows, 4, gdal.GDT_Float32) # Open the file path = os.getcwd() + '/temp/'
filename = 'raster_{}.tif'.format(datetime.now().strftime("%Y%m%d%H%M%S"))
output_raster = gdal.GetDriverByName('GTiff').Create(path+filename, ncols, nrows, 4, gdal.GDT_Float32) # Open the file
output_raster.SetGeoTransform(geotransform) output_raster.SetGeoTransform(geotransform)
srs = osr.SpatialReference() srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) srs.ImportFromEPSG(4326)
...@@ -114,5 +118,7 @@ def write_raster(data): ...@@ -114,5 +118,7 @@ def write_raster(data):
output_raster.GetRasterBand(4).WriteArray(a_band) output_raster.GetRasterBand(4).WriteArray(a_band)
output_raster.FlushCache() output_raster.FlushCache()
clean_temp(path)
return path, filename
...@@ -10,3 +10,4 @@ dbName = temperatures_berteld_morstein ...@@ -10,3 +10,4 @@ dbName = temperatures_berteld_morstein
amount_neighbours = 5 amount_neighbours = 5
; in km. 25km or 10km possible ; in km. 25km or 10km possible
matrix_density = 25 matrix_density = 25
raster_columns = 36
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment