Skip to content
Snippets Groups Projects
write_raster.py 4.27 KiB
Newer Older
Clemens Berteld's avatar
Clemens Berteld committed
import configparser
import math

Clemens Berteld's avatar
Clemens Berteld committed
import numpy as np
Clemens Berteld's avatar
Clemens Berteld committed
import psycopg2
Clemens Berteld's avatar
Clemens Berteld committed
from osgeo import gdal, osr
Clemens Berteld's avatar
Clemens Berteld committed
from GetAverageData import get_min_max
cfg = configparser.ConfigParser()
cfg.read('../config.ini')
assert "POSTGRES" in cfg, "missing POSTGRES in config.ini"
assert "INTERPOLATION" in cfg, "missing INTERPOLATION in config.ini"
param_postgres = cfg["POSTGRES"]

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 get_class_steps(colour_ramp):
    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:
            min_max = get_min_max(cursor)
            classes = len(colour_ramp)
            temp_range = min_max[1] - min_max[0]
            steps = temp_range / classes
            min = min_max[0]
            # print(min_max)
            return min, steps, classes


def colour_picker(min, steps, classes, colour_ramp, value):
    # print(min, steps, classes, value)
    rgba = None
    for i in range(0, classes + 1):

        minor = math.floor(min + (i * steps))
        major = math.ceil(min + ((i + 1) * steps))
        # print('k:', minor, 'wert:', value, 'g:', major)
        if minor <= value <= major:

            try:
                rgba = colour_ramp[i]
            except IndexError:
                rgba = colour_ramp[-1]
            # print(i)
    # print('ramp:', rgba)
    if not rgba:
        rgba = [0, 0, 0, 0]
    return rgba
Clemens Berteld's avatar
Clemens Berteld committed


def write_raster(data):
Clemens Berteld's avatar
Clemens Berteld committed
    min, steps, classes = get_class_steps(ramp)

    pixel_array_r = []
    pixel_array_g = []
    pixel_array_b = []
    pixel_array_a = []
Clemens Berteld's avatar
Clemens Berteld committed
    for j in range(0, 36):
Clemens Berteld's avatar
Clemens Berteld committed
        row_array_r = []
        row_array_g = []
        row_array_b = []
        row_array_a = []
Clemens Berteld's avatar
Clemens Berteld committed
        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
Clemens Berteld's avatar
Clemens Berteld committed
                if not value == 0:
                    rgba = colour_picker(min, steps, classes, ramp, value)
                    # print(rgba)
                    r, g, b, a = rgba[0], rgba[1], rgba[2], rgba[3]
                else:
                    r, g, b, a = 0, 0, 0, 0
                # print('r', r, 'g', g, 'b', b, 'a', a)
                transparent = data[i + j][2]
                print(transparent)
                a = 0 if transparent else a
                a = 255 if a == 1 else a
                row_array_r.append(r)
                row_array_g.append(g)
                row_array_b.append(b)
                row_array_a.append(a)
                np_row_array_r = np.array(row_array_r)
                np_row_array_g = np.array(row_array_g)
                np_row_array_b = np.array(row_array_b)
                np_row_array_a = np.array(row_array_a)
        pixel_array_r.append(np_row_array_r)
        pixel_array_g.append(np_row_array_g)
        pixel_array_b.append(np_row_array_b)
        pixel_array_a.append(np_row_array_a)
    np_pixel_array_r = np.array(pixel_array_r)
    np_pixel_array_g = np.array(pixel_array_g)
    np_pixel_array_b = np.array(pixel_array_b)
    np_pixel_array_a = np.array(pixel_array_a)

    r_band = np_pixel_array_r
    g_band = np_pixel_array_g
    b_band = np_pixel_array_b
    a_band = np_pixel_array_a
Clemens Berteld's avatar
Clemens Berteld committed

    xmin, ymin, xmax, ymax = [5.01, 47.15, 14.81, 55.33]
Clemens Berteld's avatar
Clemens Berteld committed
    nrows, ncols = np.shape(r_band)
Clemens Berteld's avatar
Clemens Berteld committed
    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())
Clemens Berteld's avatar
Clemens Berteld committed
    output_raster.GetRasterBand(1).WriteArray(r_band)
    output_raster.GetRasterBand(2).WriteArray(g_band)
    output_raster.GetRasterBand(3).WriteArray(b_band)
    output_raster.GetRasterBand(4).WriteArray(a_band)
Clemens Berteld's avatar
Clemens Berteld committed

    output_raster.FlushCache()