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

API returns geotiff!

parent f69d9f57
No related branches found
No related tags found
No related merge requests found
import configparser import configparser
import numpy as np
import psycopg2
from psycopg2 import sql from psycopg2 import sql
cfg = configparser.ConfigParser() cfg = configparser.ConfigParser()
...@@ -11,6 +10,25 @@ param_postgres = cfg["POSTGRES"] ...@@ -11,6 +10,25 @@ param_postgres = cfg["POSTGRES"]
param_interpol = cfg["INTERPOLATION"] param_interpol = cfg["INTERPOLATION"]
def get_average_of_multiple_years(cursor, years):
avg_strings = " "
where_sql = " WHERE lat IS NOT NULL "
and_strings = ""
n = int(years[1]) - int(years[0])
for year in range(int(years[0]), int(years[1])+1):
avg_string = ' AVG ("{}") + '.format(str(year))
and_string = """ AND "{}" != 'NaN' """.format(str(year))
avg_strings += avg_string
and_strings += and_string
avg_strings = avg_strings[:-2]
query = """SELECT station_id, ROUND(({}) / {}, 1), transparent FROM stations WHERE file IS NULL GROUP BY station_id, transparent ORDER BY station_id ASC;""".format(avg_strings, n)
print(query)
cursor.execute(query)
return cursor.fetchall()
# Getting all available year columns from database # Getting all available year columns from database
def get_year_columns(cursor): def get_year_columns(cursor):
columns = [] columns = []
......
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
from GetAverageData import get_interpolation_data_for_point from GetAverageData import get_interpolation_data_for_point, get_year_columns, get_average_of_multiple_years
import SQLPandasTools as s2pTool from dataacquisition import write_raster
# import SQLPandasTools as s2pTool
cfg = configparser.ConfigParser() cfg = configparser.ConfigParser()
cfg.read('../config.ini') cfg.read('../config.ini')
...@@ -92,22 +93,38 @@ def getStandardQuery(): ...@@ -92,22 +93,38 @@ def getStandardQuery():
return query return query
@app.route('/raster', methods=['GET'])
def get_raster():
if 'years' in request.args:
years = request.args['years'].split('-')
if int(years[1]) < int(years[0]):
years = [years[1], years[0]]
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:
# all_years = get_year_columns(cursor)
average_data = get_average_of_multiple_years(cursor, years)
write_raster.write_raster(average_data)
return send_from_directory('D:/Uni/Master/01_SS2021/Automatisierte_Geodatenprozessierung/temperaturverteilung/dataacquisition/output', filename='myraster.tif', as_attachment=True)
# return 'Läuft, Brudi'
@app.route('/annualMean', methods=['GET']) @app.route('/annualMean', methods=['GET'])
@cross_origin() @cross_origin()
def annualMean(): def annualMean():
query = getStandardQuery() query = getStandardQuery()
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 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: with connection.cursor() as cursor:
cursor.execute(query) cursor.execute(query)
results = cursor.fetchall()[0][0] results = cursor.fetchall()[0][0]
return jsonify(s2pTool.determineAnnualMean(results)) return jsonify(s2pTool.determineAnnualMean(results))
return "{}" return "{}"
if __name__ == '__main__': if __name__ == '__main__':
app.run(host='127.0.0.1', port=42000) app.run(host='127.0.0.1', port=42000)
...@@ -16,16 +16,24 @@ with psycopg2.connect(database=db_name, user=user, password=pw, host=param_postg ...@@ -16,16 +16,24 @@ with psycopg2.connect(database=db_name, user=user, password=pw, host=param_postg
with connection.cursor() as cursor: with connection.cursor() as cursor:
cursor.execute('SELECT station_id, "2018" FROM stations WHERE file IS NULL ORDER BY station_id ASC;') cursor.execute('SELECT station_id, "2018" FROM stations WHERE file IS NULL ORDER BY station_id ASC;')
pixel_array = [] pixel_array = []
pixel_array_alpha = []
results = cursor.fetchall() results = cursor.fetchall()
for j in range(0, 36): for j in range(0, 36):
row_array = [] row_array = []
row_array_alpha = []
for i, station_id in enumerate(results): for i, station_id in enumerate(results):
if i % 36 == 0: if i % 36 == 0:
row_array.append(results[i + j][1]) value = results[i + j][1]
row_array.append(value)
row_array_alpha.append(value)
np_row_array = np.array(row_array)
np_row_array_alpha = np.array(row_array_alpha)
np_row_array_alpha = np.where(np_row_array_alpha < 8, 0, 255)
# print(row_array) # print(row_array)
pixel_array.append(row_array) pixel_array.append(np_row_array)
pixel_array_alpha.append(np_row_array_alpha)
np_pixel_array = np.array(pixel_array) np_pixel_array = np.array(pixel_array)
print(np_pixel_array) np_pixel_array_alpha = np.array(pixel_array_alpha)
xmin, ymin, xmax, ymax = [5.01, 47.15, 14.81, 55.33] xmin, ymin, xmax, ymax = [5.01, 47.15, 14.81, 55.33]
nrows, ncols = np.shape(np_pixel_array) nrows, ncols = np.shape(np_pixel_array)
...@@ -33,11 +41,14 @@ with psycopg2.connect(database=db_name, user=user, password=pw, host=param_postg ...@@ -33,11 +41,14 @@ with psycopg2.connect(database=db_name, user=user, password=pw, host=param_postg
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, 1, gdal.GDT_Float32) # Open the file 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
output_raster.SetGeoTransform(geotransform) output_raster.SetGeoTransform(geotransform)
srs = osr.SpatialReference() srs = osr.SpatialReference()
srs.ImportFromEPSG(4326) srs.ImportFromEPSG(4326)
output_raster.SetProjection(srs.ExportToWkt()) output_raster.SetProjection(srs.ExportToWkt())
output_raster.GetRasterBand(1).WriteArray(np_pixel_array) output_raster.GetRasterBand(1).WriteArray(np_pixel_array)
# output_raster.GetRasterBand(2).WriteArray(np_pixel_array)
# output_raster.GetRasterBand(3).WriteArray(np_pixel_array)
output_raster.GetRasterBand(4).WriteArray(np_pixel_array_alpha)
output_raster.FlushCache() output_raster.FlushCache()
\ No newline at end of file
import numpy as np
from osgeo import gdal, osr
def write_raster(data):
pixel_array = []
pixel_array_alpha = []
for j in range(0, 36):
row_array = []
row_array_alpha = []
for i, station_id in enumerate(data):
if i % 36 == 0:
value = data[i + j][1]
value = 0 if not value else value
value = 0 if str(value) == 'NaN' else value
alpha_value = data[i + j][2]
alpha_value = 0 if alpha_value else 255
# print(value)
row_array.append(value)
row_array_alpha.append(alpha_value)
np_row_array = np.array(row_array)
np_row_array_alpha = np.array(row_array_alpha)
# np_row_array_alpha = np.where(np_row_array_alpha < 8, 0, 255)
# print(row_array)
pixel_array.append(np_row_array)
pixel_array_alpha.append(np_row_array_alpha)
np_pixel_array = np.array(pixel_array)
np_pixel_array_alpha = np.array(pixel_array_alpha)
xmin, ymin, xmax, ymax = [5.01, 47.15, 14.81, 55.33]
nrows, ncols = np.shape(np_pixel_array)
xres = (xmax - xmin) / float(ncols)
yres = (ymax - ymin) / float(nrows)
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
output_raster.SetGeoTransform(geotransform)
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
output_raster.SetProjection(srs.ExportToWkt())
output_raster.GetRasterBand(1).WriteArray(np_pixel_array)
# output_raster.GetRasterBand(2).WriteArray(np_pixel_array)
# output_raster.GetRasterBand(3).WriteArray(np_pixel_array)
output_raster.GetRasterBand(4).WriteArray(np_pixel_array_alpha)
output_raster.FlushCache()
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