Source code for weatherDB.utils.geometry

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""A collection of geometry functions.

Based on `max_fun` package on https://github.com/maxschmi/max_fun
Created by Max Schmit, 2021
"""
# libraries
import numpy as np
from shapely.geometry import Point, LineString
import geopandas as gpd
import rasterio as rio

# functions
[docs] def polar_line(center_xy, radius, angle): """Create a LineString with polar coodinates. Parameters ---------- center_xy : list, array or tuple of int or floats The X and Y coordinates of the center. radius : int or float The radius of the circle. angle : int The angle of the portion of the circle in degrees. 0 means east. Returns ------- shapely.geometry.LineString LineString. """ coords = [center_xy] coords.append([ center_xy[0] + np.cos(np.deg2rad(angle)) * radius, center_xy[1] + np.sin(np.deg2rad(angle)) * radius ]) return LineString(coords)
[docs] def raster2points(raster_np, transform, crs=None): """Polygonize raster array to GeoDataFrame. Until now this only works for rasters with one band. Parameters ---------- raster_np : np.array The imported raster array. transform : rio.Affine The Affine transformation of the raster. crs : str or crs-type, optional The coordinate reference system for the raster, by default None Returns ------- geopandas.GeoDataFrame The raster Data is in the data column. """ mask = ~np.isnan(raster_np[0]) cols, rows = mask.nonzero() coords = rio.transform.xy(transform, cols, rows) geoms = [Point(xy) for xy in list(zip(*coords))] return gpd.GeoDataFrame( {"data": raster_np[0][mask]}, geometry=geoms, crs=crs)