Source code for snowexsql.conversions

"""
Module contains all conversions used for manipulating data. This includes:
filetypes, datatypes, etc. Many tools here will be useful for most end users
of the database.
"""
from os.path import basename, dirname, join

import geopandas as gpd
import pandas as pd
import numpy as np
import rasterio
from geoalchemy2.shape import to_shape
from rasterio import MemoryFile
from sqlalchemy.dialects import postgresql

from .data import PointData


[docs]def points_to_geopandas(results): """ Converts a successful query list into a geopandas data frame Args: results: List of PointData objects Returns: df: geopandas.GeoDataFrame instance """ # grab all the attributes of the class to assign if isinstance(results[0], PointData): data = {a: [] for a in dir(PointData) if a[0:1] != '__'} for r in results: for k in data.keys(): v = getattr(r, k) if k == 'geom': v = to_shape(v) data[k].append(v) df = gpd.GeoDataFrame(data, geometry=data['geom']) return df
[docs]def query_to_geopandas(query, engine, **kwargs): """ Convert a GeoAlchemy2 Query meant for postgis to a geopandas dataframe. Requires that a geometry column is included Args: query: GeoAlchemy2.Query Object engine: sqlalchemy engine Returns: df: geopandas.GeoDataFrame instance """ # Fill out the variables in the query sql = query.statement.compile(dialect=postgresql.dialect()) # Get dataframe from geopandas using the query and engine df = gpd.GeoDataFrame.from_postgis(sql, engine, **kwargs) return df
[docs]def query_to_pandas(query, engine, **kwargs): """ Convert a GeoAlchemy2 Query meant for postgis to a pandas dataframe. Args: query: Query Object engine: sqlalchemy engine Returns: df: pandas.DataFrame instance """ # Fill out the variables in the query sql = query.statement.compile(dialect=postgresql.dialect()) # Get dataframe from geopandas using the query and engine df = pd.read_sql(sql, engine, **kwargs) return df
[docs]def raster_to_rasterio(session, rasters): """ Retrieve the numpy array of a raster by converting to a temporary file Args: session: sqlalchemy session object raster: list of :py:class:`geoalchemy2.types.Raster` Returns: dataset: list of rasterio datasets """ datasets = [] for r in rasters: bdata = bytes(r[0]) with MemoryFile() as tmpfile: tmpfile.write(bdata) datasets.append(tmpfile.open()) return datasets