From 90151dd61b6d30148ba2d2cd60a20bf568c3411e Mon Sep 17 00:00:00 2001 From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com> Date: Thu, 25 Feb 2021 08:33:52 +0700 Subject: [PATCH 1/8] remove doc from master repo --- docs/index.html | 2013 --------------------------------- docs/index.js | 359 ------ docs/interpolate/index.html | 601 ---------- docs/raster.html | 2076 ----------------------------------- 4 files changed, 5049 deletions(-) delete mode 100644 docs/index.html delete mode 100644 docs/index.js delete mode 100644 docs/interpolate/index.html delete mode 100644 docs/raster.html diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 039a607..0000000 --- a/docs/index.html +++ /dev/null @@ -1,2013 +0,0 @@ - - - - - - -geosardine API documentation - - - - - - - - - - - -
-
-
-

Package geosardine

-
-
-

Spatial operations extend fiona and rasterio. -Collection of spatial operation which i occasionally use written in python: -- Interpolation with IDW (Inverse Distance Weighting) Shepard -- Drape vector to raster -- Spatial join between two vector -- Raster wrapper, for better experience. ie: math operation between two raster, resize and resample

-
- -Expand source code -Browse git - -
"""
-Spatial operations extend fiona and rasterio.
-Collection of spatial operation which i occasionally use written in python:
- - Interpolation with IDW (Inverse Distance Weighting) Shepard
- - Drape vector to raster
- - Spatial join between two vector
- - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample
-"""
-from . import interpolate
-from ._geosardine import (
-    drape2raster,
-    drape_geojson,
-    drape_shapely,
-    rowcol2xy,
-    spatial_join,
-    xy2rowcol,
-)
-from ._utility import harvesine_distance, vincenty_distance
-from .raster import Raster
-
-__all__ = [
-    "rowcol2xy",
-    "xy2rowcol",
-    "drape2raster",
-    "spatial_join",
-    "drape_shapely",
-    "drape_geojson",
-    "interpolate",
-    "harvesine_distance",
-    "vincenty_distance",
-    "Raster",
-]
-
-__version__ = "0.10.0"
-__author__ = "Sahit Tuntas Sadono"
-
-
-
-

Sub-modules

-
-
geosardine.interpolate
-
-
-
-
geosardine.raster
-
-
-
-
-
-
-
-
-

Functions

-
-
-def drape2raster(xy: List[float], dsm_array: numpy.ndarray, affine: affine.Affine, interpolate: bool = False, no_data: Union[float, int] = -32767) ‑> Tuple[float, float, float] -
-
-

Find Z of 2D coordinate -Parameters

-
-
-
xy : tuple, list, numpy array
-
2D coordinate x,y
-
dsm_array : numpy array
-
height array
-
affine : Affine
-
affine parameter from rasterio.transform -or create it with affine.Affine https://pypi.org/project/affine/
-
interpolate : bool, default True
-
choose to interpolate or not -* if True, value will be interpolated from -nearest value -* if False, value will be obtained from exact row and column
-
no_data : float, int, default -32767
-
value for pixel with no data
-
-

Returns

-
-
tuple
-
3D coordinate
-
-
- -Expand source code -Browse git - -
def drape2raster(
-    xy: List[float],
-    dsm_array: np.ndarray,
-    affine: Affine,
-    interpolate: bool = False,
-    no_data: Union[float, int] = -32767,
-) -> Tuple[float, float, float]:
-    """
-    Find Z of 2D coordinate
-    Parameters
-    ----------
-    xy : tuple, list, numpy array
-        2D coordinate x,y
-    dsm_array : numpy array
-        height array
-    affine : Affine
-        affine parameter from rasterio.transform
-        or create it with affine.Affine https://pypi.org/project/affine/
-    interpolate : bool, default True
-        choose to interpolate or not
-        * if True, value will be interpolated from  nearest value
-        * if False, value will be obtained from exact row and column
-    no_data : float, int, default -32767
-        value for pixel with no data
-
-    Returns
-    -------
-    tuple
-        3D coordinate
-
-    """
-    x, y = xy
-    row, col = xy2rowcol(xy, affine, interpolate)
-    if interpolate:
-        draped_z = _d2r_interpolate((row, col), dsm_array, no_data)
-    else:
-        try:
-            draped_z = dsm_array[row, col]
-        except IndexError:
-            warnings.warn(f"Point is out of bound, returning no data: {no_data}")
-            draped_z = no_data
-    return x, y, draped_z
-
-
-
-def drape_geojson(features: Union[Iterable[Dict], fiona.collection.Collection], raster: rasterio.io.DatasetReader, interpolate: bool = False) ‑> Generator[Dict, NoneType, NoneType] -
-
-

Drape with geojson as input, fiona uses geojson as interface. -Parameters

-
-
-
features : Iterable[Dict], fiona.Collection
-
vector as geojson
-
raster : rasterio.io.DatasetReader
-
rasterio reader of raster file
-
interpolate : bool, default True
-
choose to interpolate or not -* if True, value will be interpolated from -nearest value -* if False, value will be obtained from exact row and column
-
-

Yields

-
-
dict
-
geojson
-
-
- -Expand source code -Browse git - -
def drape_geojson(
-    features: Union[Iterable[Dict], fiona.Collection],
-    raster: rasterio.io.DatasetReader,
-    interpolate: bool = False,
-) -> Generator[Dict, None, None]:
-    """
-    Drape with geojson as input, fiona uses geojson as interface.
-    Parameters
-    ----------
-    features : Iterable[Dict], fiona.Collection
-        vector as geojson
-    raster : rasterio.io.DatasetReader
-        rasterio reader of raster file
-    interpolate : bool, default True
-        choose to interpolate or not
-        * if True, value will be interpolated from  nearest value
-        * if False, value will be obtained from exact row and column
-
-    Yields
-    -------
-    dict
-        geojson
-
-    """
-    """
-    Drape with geojson as input, fiona uses geojson as interface.
-    :param features: geojson
-    :param raster: rasterio dataset reader
-    :param interpolate:
-    :return:
-    """
-    dsm_array = raster.read(1)
-    affine = raster.transform
-    no_data = raster.nodatavals
-    for i, feature in enumerate(features):
-        draped_feature = feature.copy()
-        geometry: Dict = feature["geometry"]
-        geom_type: str = geometry["type"]
-
-        draped_coordinates: Union[List[List[float]], List[List[List[float]]]] = []
-        if geom_type == "Polygon":
-            draped_coordinates = [
-                list(drape_coordinates(ring, dsm_array, affine, interpolate, no_data))
-                for ring in geometry
-            ]
-
-        elif geom_type == "LineString":
-            draped_coordinates = list(
-                drape_coordinates(geometry, dsm_array, affine, interpolate, no_data)
-            )
-        else:
-            raise ValueError("Unsupported geometry type")
-
-        draped_feature["geometry"]["coordinates"] = draped_coordinates
-        yield draped_feature
-
-
-
-def drape_shapely(geometry: Union[shapely.geometry.polygon.Polygon, shapely.geometry.linestring.LineString], raster: rasterio.io.DatasetReader, interpolate: bool = False) ‑> Union[shapely.geometry.polygon.Polygon, shapely.geometry.linestring.LineString] -
-
-

Drape with shapely geometry as input -Parameters

-
-
-
geometry : shapely polygon, shapely linestring
-
vector data as shapely object, currently only support polygon or linestring
-
raster : rasterio.io.DatasetReader
-
rasterio reader of raster file
-
interpolate : bool, default True
-
choose to interpolate or not -* if True, value will be interpolated from -nearest value -* if False, value will be obtained from exact row and column
-
-

Returns

-
-
shapely.Polygon or shapely.LineString
-
 
-
-
- -Expand source code -Browse git - -
def drape_shapely(
-    geometry: Union[Polygon, LineString],
-    raster: rasterio.io.DatasetReader,
-    interpolate: bool = False,
-) -> Union[Polygon, LineString]:
-    """
-    Drape with shapely geometry as input
-    Parameters
-    ----------
-    geometry : shapely polygon, shapely linestring
-        vector data as shapely object, currently only support polygon or linestring
-    raster : rasterio.io.DatasetReader
-        rasterio reader of raster file
-    interpolate : bool, default True
-        choose to interpolate or not
-        * if True, value will be interpolated from  nearest value
-        * if False, value will be obtained from exact row and column
-
-    Returns
-    -------
-    shapely.Polygon or shapely.LineString
-
-    """
-
-    dsm_array = raster.read(1)
-    affine = raster.transform
-    no_data = raster.nodatavals
-    if geometry.type == "Polygon":
-        draped_exterior = list(
-            drape_coordinates(
-                geometry.exterior.coords, dsm_array, affine, interpolate, no_data
-            )
-        )
-        draped_interiors = [
-            list(
-                drape_coordinates(
-                    interior.coords, dsm_array, affine, interpolate, no_data
-                )
-            )
-            for interior in geometry.interiors
-        ]
-
-        return Polygon(draped_exterior, draped_interiors)
-    elif geometry.type == "LineString":
-        return LineString(
-            list(
-                drape_coordinates(
-                    geometry.coords, dsm_array, affine, interpolate, no_data
-                )
-            )
-        )
-    else:
-        raise ValueError("Unsupported geometry type")
-
-
-
-def harvesine_distance(long_lat1: Union[numpy.ndarray, Tuple[float, float], List[float]], long_lat2: Union[numpy.ndarray, Tuple[float, float], List[float]]) ‑> Union[float, NoneType] -
-
-

Calculate distance in ellipsoid by harvesine method -faster, less accurate

-

Parameters

-
-
long_lat1 : tuple, list, numpy array
-
first point coordinate in longitude, latitude
-
long_lat2 : tuple, list, numpy array
-
second point coordinate in longitude, latitude
-
-

Returns

-
-
float
-
distance
-
-

Notes

-

https://rafatieppo.github.io/post/2018_07_27_idw2pyr/

-
- -Expand source code -Browse git - -
@singledispatch
-def harvesine_distance(
-    long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
-    long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
-) -> Optional[float]:
-    """
-    Calculate distance in ellipsoid by harvesine method
-    faster, less accurate
-
-    Parameters
-    ----------
-    long_lat1 : tuple, list, numpy array
-        first point coordinate in longitude, latitude
-    long_lat2 : tuple, list, numpy array
-        second point coordinate in longitude, latitude
-
-    Returns
-    -------
-    float
-        distance
-
-    Notes
-    -------
-    https://rafatieppo.github.io/post/2018_07_27_idw2pyr/
-    """
-
-    print("only accept numpy array, list and tuple")
-    return None
-
-
-
-def rowcol2xy(row_col: Union[Tuple[int, int], List[int]], affine: affine.Affine) ‑> Tuple[float, float] -
-
-

Convert image coordinate to geographic coordinate -Parameters

-
-
-
row_col : tuple, list
-
image coordinate in row, column
-
affine : Affine
-
affine parameter from rasterio.transform -or create it with affine.Affine https://pypi.org/project/affine/
-
-

Returns

-
-
tuple
-
2d geographic or projected coordinate
-
-
- -Expand source code -Browse git - -
def rowcol2xy(
-    row_col: Union[Tuple[int, int], List[int]], affine: Affine
-) -> Tuple[float, float]:
-    """
-    Convert image coordinate to geographic coordinate
-    Parameters
-    ----------
-    row_col : tuple, list
-        image coordinate in row, column
-    affine : Affine
-        affine parameter from rasterio.transform
-        or create it with affine.Affine https://pypi.org/project/affine/
-
-    Returns
-    -------
-    tuple
-        2d geographic or projected coordinate
-
-    """
-    row, col = row_col
-    return affine * (col, row)
-
-
-
-def spatial_join(target: fiona.collection.Collection, join: fiona.collection.Collection) ‑> Tuple[List[Dict], Dict] -
-
-

Join attribute from 2 vector by location. -Parameters

-
-
-
target : fiona.Collection
-
vector target which you want to be joined
-
join : fiona.Collection
-
vector which data wont to be obtained
-
-

Returns

-
-
dict
-
geojson
-
-
- -Expand source code -Browse git - -
def spatial_join(
-    target: fiona.Collection, join: fiona.Collection
-) -> Tuple[List[Dict], Dict]:
-    """
-    Join attribute from 2 vector by location.
-    Parameters
-    ----------
-    target : fiona.Collection
-        vector target which you want to be joined
-    join : fiona.Collection
-        vector which data wont to be obtained
-
-    Returns
-    -------
-    dict
-        geojson
-
-    """
-    try:
-        joined_schema_prop = OrderedDict(
-            **target.schema["properties"], **join.schema["properties"]
-        )
-    except TypeError:
-        raise TypeError("There are column with same name. Please change it first.")
-
-    joined_schema = target.schema.copy()
-    joined_schema["properties"] = joined_schema_prop
-
-    joined_features = []
-    join_polygon: List[Polygon] = [shape(feature["geometry"]) for feature in join]
-
-    for feature in target:
-        target_polygon = shape(feature["geom"])
-
-        overlap_areas = (
-            target_polygon.intersection(polygon).area for polygon in join_polygon
-        )
-        overlap_ratios = [
-            overlap_area / target_polygon for overlap_area in overlap_areas
-        ]
-
-        max_ratio_index = overlap_ratios.index(max(overlap_ratios))
-
-        joined_prop = OrderedDict(
-            **feature["properties"], **join[max_ratio_index]["properties"]
-        )
-
-        feature["properties"] = joined_prop
-        joined_features.append(feature)
-
-    return joined_features, joined_schema
-
-
-
-def vincenty_distance(long_lat1: Union[numpy.ndarray, Tuple[float, float], List[float]], long_lat2: Union[numpy.ndarray, Tuple[float, float], List[float]]) ‑> Union[float, NoneType] -
-
-

Calculate distance in ellipsoid by vincenty method -slower, more accurate

-

Parameters

-
-
long_lat1 : tuple, list
-
first point coordinate in longitude, latitude
-
long_lat2 : tuple, list
-
second point coordinate in longitude, latitude
-
-

Returns

-
-
distance
-
 
-
-

Notes

-

https://www.johndcook.com/blog/2018/11/24/spheroid-distance/

-
- -Expand source code -Browse git - -
@singledispatch
-def vincenty_distance(
-    long_lat1: Union[np.ndarray, Tuple[float, float], List[float]],
-    long_lat2: Union[np.ndarray, Tuple[float, float], List[float]],
-) -> Optional[float]:
-    """
-    Calculate distance in ellipsoid by vincenty method
-    slower, more accurate
-
-    Parameters
-    ----------
-    long_lat1 : tuple, list
-        first point coordinate in longitude, latitude
-    long_lat2 : tuple, list
-        second point coordinate in longitude, latitude
-
-    Returns
-    -------
-    distance
-
-    Notes
-    -------
-    https://www.johndcook.com/blog/2018/11/24/spheroid-distance/
-    """
-
-    print("only accept numpy array, list and tuple")
-    return None
-
-
-
-def xy2rowcol(xy: Union[Tuple[float, float], List[float]], affine: affine.Affine, interpolate: bool = False, round_function: Callable = builtins.int) ‑> Union[Tuple[int, int], Tuple[float, float]] -
-
-

Convert geographic coordinate to image coordinate -Parameters

-
-
-
xy : tuple, list
-
2d geographic or projected coordinate
-
affine : Affine
-
affine parameter from rasterio.transform -or create it with affine.Affine https://pypi.org/project/affine/
-
interpolate : bool, default True
-
choose to interpolate or not -* if True, value will be interpolated from -nearest value -* if False, value will be obtained from exact row and column
-
-

Returns

-
-
tuple
-
row, column
-
-
- -Expand source code -Browse git - -
def xy2rowcol(
-    xy: Union[Tuple[float, float], List[float]],
-    affine: Affine,
-    interpolate: bool = False,
-    round_function: Callable = int,
-) -> Union[Tuple[int, int], Tuple[float, float]]:
-    """
-    Convert geographic coordinate to image coordinate
-    Parameters
-    ----------
-    xy : tuple, list
-        2d geographic or projected coordinate
-    affine : Affine
-        affine parameter from rasterio.transform
-        or create it with affine.Affine https://pypi.org/project/affine/
-    interpolate : bool, default True
-        choose to interpolate or not
-        * if True, value will be interpolated from  nearest value
-        * if False, value will be obtained from exact row and column
-
-    Returns
-    -------
-    tuple
-        row, column
-
-    """
-    col, row = ~affine * xy
-    if not interpolate:
-        col, row = round_function(col), round_function(row)
-    return row, col
-
-
-
-
-
-

Classes

-
-
-class Raster -(array: numpy.ndarray, resolution: Union[NoneType, Tuple[float, float], List[float], Tuple[float, ...], float] = None, x_min: Union[float, NoneType] = None, y_max: Union[float, NoneType] = None, x_max: Union[float, NoneType] = None, y_min: Union[float, NoneType] = None, epsg: int = 4326, no_data: Union[float, int] = -32767.0, transform: Union[affine.Affine, NoneType] = None) -
-
-

Construct Raster from numpy array with spatial information. -Support calculation between different raster

-

Parameters

-
-
array : numpy array
-
array of raster
-
resolution : tuple, list, default None
-
spatial resolution
-
x_min : float, defaults to None
-
left boundary of x-axis coordinate
-
y_max : float, defaults to None
-
upper boundary of y-axis coordinate
-
x_max : float, defaults to None
-
right boundary of x-axis coordinate
-
y_min : float, defaults to None
-
bottom boundary of y-axis coordinate
-
epsg : int, defaults to 4326
-
EPSG code of reference system
-
no_data : int or float, default None
-
no data value
-
-

Examples

-
>>> from geosardine import Raster
->>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
->>> print(raster)
-[[[1. 1.]
-  [1. 1.]
-  [1. 1.]]
- [[1. 1.]
-  [1. 1.]
-  [1. 1.]]
- [[1. 1.]
-  [1. 1.]
-  [1. 1.]]]
-Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
->>> resampled = raster.resample((0.2,0.2))
->>> print(resampled.shape, resampled.resolution)
-(6, 6, 2) (0.2, 0.2)
-Raster can be resized
->>> resized = raster.resize(height=16, width=16)
->>> print(resized.shape, resized.resolution)
-(16, 16, 2) (0.07500000000000018, 0.07500000000000001)
-
-
- -Expand source code -Browse git - -
class Raster(np.ndarray):
-    """
-    Construct Raster from numpy array with spatial information.
-    Support calculation between different raster
-
-    Parameters
-    ----------
-    array : numpy array
-        array of raster
-    resolution : tuple, list, default None
-        spatial resolution
-    x_min : float, defaults to None
-        left boundary of x-axis coordinate
-    y_max : float, defaults to None
-        upper boundary of y-axis coordinate
-    x_max : float, defaults to None
-        right boundary of x-axis coordinate
-    y_min : float, defaults to None
-        bottom boundary of y-axis coordinate
-    epsg : int, defaults to 4326
-        EPSG code of reference system
-    no_data : int or float, default None
-        no data value
-
-    Examples
-    --------
-    >>> from geosardine import Raster
-    >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
-    >>> print(raster)
-    [[[1. 1.]
-      [1. 1.]
-      [1. 1.]]
-     [[1. 1.]
-      [1. 1.]
-      [1. 1.]]
-     [[1. 1.]
-      [1. 1.]
-      [1. 1.]]]
-    Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
-    >>> resampled = raster.resample((0.2,0.2))
-    >>> print(resampled.shape, resampled.resolution)
-    (6, 6, 2) (0.2, 0.2)
-    Raster can be resized
-    >>> resized = raster.resize(height=16, width=16)
-    >>> print(resized.shape, resized.resolution)
-    (16, 16, 2) (0.07500000000000018, 0.07500000000000001)
-    """
-
-    __cv2_resize_method = {
-        "nearest": cv2.INTER_NEAREST,
-        "bicubic": cv2.INTER_CUBIC,
-        "bilinear": cv2.INTER_LINEAR,
-        "area": cv2.INTER_AREA,
-        "lanczos": cv2.INTER_LANCZOS4,
-    }
-
-    def __init__(
-        self,
-        array: np.ndarray,
-        resolution: Union[
-            None, Tuple[float, float], List[float], Tuple[float, ...], float
-        ] = None,
-        x_min: Optional[float] = None,
-        y_max: Optional[float] = None,
-        x_max: Optional[float] = None,
-        y_min: Optional[float] = None,
-        epsg: int = 4326,
-        no_data: Union[float, int] = -32767.0,
-        transform: Optional[Affine] = None,
-    ):
-        if transform is None:
-            if resolution is None and x_min is None and y_min is None:
-                raise ValueError(
-                    "Please define resolution and at least x minimum and y minimum"
-                )
-
-            if resolution is not None and x_min is None and y_max is None:
-                raise ValueError("Please define x_min and y_max")
-
-            if isinstance(resolution, float):
-                self.resolution: Tuple[float, float] = (
-                    resolution,
-                    resolution,
-                )
-            elif isinstance(resolution, Iterable):
-                self.resolution = (resolution[0], resolution[1])
-
-            if (
-                resolution is None
-                and x_min is not None
-                and y_min is not None
-                and x_max is not None
-                and y_max is not None
-            ):
-                self.resolution = (
-                    (x_max - x_min) / array.shape[1],
-                    (y_max - y_min) / array.shape[0],
-                )
-
-            self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale(
-                self.resolution[0], -self.resolution[1]
-            )
-        elif isinstance(transform, Affine):
-            self.transform = transform
-        else:
-            raise ValueError(
-                "Please define affine parameter or resolution and xmin ymax"
-            )
-
-        self.epsg = epsg
-
-        self.crs = CRS.from_epsg(epsg)
-        self.no_data = no_data
-        self.__check_validity()
-
-    def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster":
-        return array.view(cls)
-
-    def __getitem__(self, key: Union[int, Tuple[Any, ...], slice]) -> np.ndarray:
-        return self.array.__getitem__(key)
-
-    @classmethod
-    def from_binary(
-        cls,
-        binary_file: str,
-        shape: Tuple[int, ...],
-        resolution: Union[Tuple[float, float], List[float], float],
-        x_min: float,
-        y_max: float,
-        epsg: int = 4326,
-        no_data: Union[float, int] = -32767.0,
-        dtype: np.dtype = np.float32,
-        *args,
-        **kwargs,
-    ) -> "Raster":
-        _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
-            shape
-        )
-        return cls(_bin_array, resolution, x_min, y_max, epsg=epsg, no_data=no_data)
-
-    @classmethod
-    def from_rasterfile(cls, raster_file: str) -> "Raster":
-        with rasterio.open(raster_file) as file:
-            _raster = reshape_as_image(file.read())
-        return cls(_raster, transform=file.transform, epsg=file.crs.to_epsg())
-
-    @property
-    def array(self) -> np.ndarray:
-        """the numpy array of raster"""
-        return self.__array__()
-
-    @property
-    def __transform(self) -> Tuple[float, ...]:
-        return tuple(self.transform)
-
-    @property
-    def x_min(self) -> float:
-        """minimum x-axis coordinate"""
-        return self.__transform[2]
-
-    @property
-    def y_max(self) -> float:
-        """maximum y-axis coordinate"""
-        return self.__transform[5]
-
-    @property
-    def x_max(self) -> float:
-        """maximum x-axis coordinate"""
-        return self.__transform[2] + (self.resolution[0] * self.cols)
-
-    @property
-    def y_min(self) -> float:
-        """minimum y-axis coordinate"""
-        return self.__transform[5] - (self.resolution[1] * self.rows)
-
-    @property
-    def upper(self) -> float:
-        """upper y-axis coordinate"""
-        return self.y_max
-
-    @property
-    def left(self) -> float:
-        """left x-axis coordinate"""
-        return self.x_min
-
-    @property
-    def right(self) -> float:
-        """right x-axis coordinate"""
-        return self.x_max
-
-    @property
-    def bottom(self) -> float:
-        """bottom y-axis coordinate"""
-        return self.y_min
-
-    @property
-    def rows(self) -> int:
-        """number of row, height"""
-        return int(self.array.shape[0])
-
-    @property
-    def cols(self) -> int:
-        """number of column, width"""
-        return int(self.array.shape[1])
-
-    @property
-    def layers(self) -> int:
-        """number of layer / channel"""
-        _layers: int = 1
-        if len(self.array.shape) > 2:
-            _layers = self.array.shape[2]
-        return _layers
-
-    @property
-    def x_extent(self) -> float:
-        """width of raster in the map unit (degree decimal or meters)"""
-        return self.x_max - self.x_min
-
-    @property
-    def y_extent(self) -> float:
-        """height of raster in the map unit (degree decimal or meters)"""
-        return self.y_max - self.y_min
-
-    @property
-    def is_projected(self) -> bool:
-        """check crs is projected or not"""
-        return self.crs.is_projected
-
-    @property
-    def is_geographic(self) -> bool:
-        """check crs is geographic or not"""
-        return self.crs.is_geographic
-
-    def __check_validity(self) -> None:
-        if self.x_extent < 0 and self.y_extent < 0:
-            raise ValueError(
-                "x min should be less than x max and y min should be less than y max"
-            )
-        elif self.x_extent < 0 and self.y_extent > 0:
-            raise ValueError("x min should be less than x max")
-        elif self.x_extent > 0 and self.y_extent < 0:
-            raise ValueError("y min should be less than y max")
-
-    def xy_value(self, x: float, y: float) -> Union[float, int, np.ndarray]:
-        """Obtain pixel value by geodetic or projected coordinate
-
-        Parameters
-        ----------
-        x : float
-            x-axis coordinate
-        y : float
-            y-axis coordinate
-
-        Returns
-        -------
-        Union[float, int, np.ndarray]
-            pixel value
-        """
-        try:
-            row, col = self.xy2rowcol(x, y)
-            if row < 0 or col < 0:
-                raise IndexError
-            return self.array[row, col]
-        except IndexError:
-            raise IndexError(
-                f"""
-                {x},{y} is out of bound. 
-                x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
-                """
-            )
-
-    def rowcol2xy(self, row: int, col: int) -> Tuple[float, float]:
-        """Convert image coordinate (row, col) to real world coordinate
-
-        Parameters
-        ----------
-        row : int
-        col : int
-
-        Returns
-        -------
-        Tuple[float, float]
-            X,Y coordinate in real world
-        """
-        return rowcol2xy((row, col), self.transform)
-
-    def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
-        """Convert real world coordinate to image coordinate (row, col)
-
-        Parameters
-        ----------
-        x : float
-        y : float
-
-        Returns
-        -------
-        Tuple[int, int]
-            row, column
-        """
-        _row, _col = xy2rowcol((x, y), self.transform)
-        return int(_row), int(_col)
-
-    def __raster_calc_by_pixel__(
-        self,
-        raster: "Raster",
-        operator: Callable[[Any, Any], Any],
-    ) -> np.ndarray:
-        _raster = np.zeros(self.array.shape, dtype=self.array.dtype)
-        for row in range(self.rows):
-            for col in range(self.cols):
-                try:
-                    pixel_source = self.array[row, col]
-                    pixel_target = raster.xy_value(*self.rowcol2xy(row, col))
-                    if pixel_source != self.no_data and pixel_target != raster.no_data:
-                        _raster[row, col] = operator(
-                            pixel_source,
-                            pixel_target,
-                        )
-                    else:
-                        _raster[row, col] = self.no_data
-                except IndexError:
-                    _raster[row, col] = self.no_data
-        return _raster
-
-    def __raster_calculation__(
-        self,
-        raster: Union[int, float, "Raster", np.ndarray],
-        operator: Callable[[Any, Any], Any],
-    ) -> "Raster":
-        if not isinstance(raster, (int, float, Raster, np.ndarray)):
-            raise ValueError(f"{type(raster)} unsupported data format")
-
-        if isinstance(raster, Raster):
-            if (
-                raster.epsg == self.epsg
-                and raster.resolution == self.resolution
-                and raster.x_min == self.x_min
-                and raster.y_min == self.y_min
-                and raster.shape == self.shape
-            ):
-                _raster = operator(self.array, raster.array)
-            else:
-                # _raster = self.__raster_calc_by_pixel__(raster, operator)
-                _raster = __nb_raster_calc(
-                    self,
-                    raster,
-                    operator.__name__,
-                )
-        elif isinstance(raster, np.ndarray):
-            _raster = operator(self.array, raster)
-        else:
-            _raster = operator(self.array, raster)
-
-        return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg)
-
-    def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, sub)
-
-    def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, add)
-
-    def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, mul)
-
-    def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, truediv)
-
-    def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, floordiv)
-
-    def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, pow)
-
-    def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, iadd)
-
-    def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, itruediv)
-
-    def __ifloordiv__(
-        self, raster: Union[int, float, "Raster", np.ndarray]
-    ) -> "Raster":
-        return self.__raster_calculation__(raster, ifloordiv)
-
-    def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, imul)
-
-    def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, isub)
-
-    def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, ipow)
-
-    def __iter__(self) -> Generator[Any, None, None]:
-        _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers)
-        if self.layers == 1:
-            _iter_shape = self.rows * self.cols
-        _iter = self.array.reshape(_iter_shape)
-        for i in range(10):
-            yield _iter[i]
-
-    def save(self, file_name: str) -> None:
-        """Save raster as geotiff
-
-        Parameters
-        ----------
-        file_name : str
-            output filename
-        """
-        save_raster(
-            file_name, self.array, self.crs, affine=self.transform, nodata=self.no_data
-        )
-
-    def resize(
-        self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
-    ) -> "Raster":
-        """Resize raster into defined height and width
-
-        Parameters
-        -------
-        height: int
-            height defined
-        width: int
-            width defined
-        method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-            resampling method for opencv  <br/>
-            * if nearest, a nearest-neighbor interpolation  <br/>
-            * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-            * if bilinear, a bilinear interpolation  <br/>
-            * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-            * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-        backend: str opencv or python, default opencv
-            resampling backend  <br/>
-            * if opencv, image will be resampled using opencv  <br/>
-            * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-        Returns
-        -------
-        Raster
-            Resized
-        """
-        if backend == "opencv":
-            return self.__cv_resize(height, width, method)
-        elif backend == "python":
-            return self.__py_resize(height, width)
-        else:
-            raise ValueError("Please choose between python or opencv for backend")
-
-    def resample(
-        self,
-        resolution: Union[Tuple[float, float], List[float], float],
-        method: str = "bilinear",
-        backend: str = "opencv",
-    ) -> "Raster":
-        """Resample image into defined resolution
-
-        Parameters
-        -------
-        resolution: tuple, list, float
-            spatial resolution target
-        method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-            resampling method for opencv  <br/>
-            * if nearest, a nearest-neighbor interpolation  <br/>
-            * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-            * if bilinear, a bilinear interpolation  <br/>
-            * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-            * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-        backend: str opencv or python, default opencv
-            resampling backend  <br/>
-            * if opencv, image will be resampled using opencv  <br/>
-            * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-        if backend == "opencv":
-            return self.__cv_resample(resolution, method)
-        elif backend == "python":
-            return self.__py_resample(resolution)
-        else:
-            raise ValueError("Please choose between python or opencv for backend")
-
-    def __cv_resize(self, height: int, width: int, method: str) -> "Raster":
-        resized_y_resolution = self.y_extent / height
-        resized_x_resolution = self.x_extent / width
-        resized = cv2.resize(
-            self.array, (width, height), interpolation=self.__cv2_resize_method[method]
-        )
-        return Raster(
-            resized,
-            (resized_x_resolution, resized_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-    def __cv_resample(
-        self, resolution: Union[Tuple[float, float], List[float], float], method: str
-    ) -> "Raster":
-        if isinstance(resolution, (float, int)):
-            resampled_x_resolution = float(resolution)
-            resampled_y_resolution = float(resolution)
-        else:
-            resampled_x_resolution = resolution[0]
-            resampled_y_resolution = resolution[1]
-
-        resampled_rows = round(self.y_extent / resampled_y_resolution)
-        resampled_cols = round(self.x_extent / resampled_x_resolution)
-
-        resampled = self.__cv_resize(resampled_rows, resampled_cols, method)
-        return resampled
-
-    def __py_resample(
-        self, resolution: Union[Tuple[float, float], List[float], float]
-    ) -> "Raster":
-        """
-        Resample raster using nearest neighbor
-        Parameters
-        -------
-        resolution: tuple, list
-            spatial resolution target
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-
-        if isinstance(resolution, (float, int)):
-            resampled_x_resolution = float(resolution)
-            resampled_y_resolution = float(resolution)
-        else:
-            resampled_x_resolution = resolution[0]
-            resampled_y_resolution = resolution[1]
-
-        resampled_rows = round(self.y_extent / resampled_y_resolution)
-        resampled_cols = round(self.x_extent / resampled_x_resolution)
-
-        resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers)
-        if self.layers == 1:
-            resampled_shape = (resampled_rows, resampled_cols)
-
-        resampled_array = np.zeros(
-            resampled_rows * resampled_cols * self.layers, dtype=self.dtype
-        ).reshape(resampled_shape)
-
-        resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
-            resampled_x_resolution, -resampled_y_resolution
-        )
-
-        for row in range(resampled_rows):
-            for col in range(resampled_cols):
-                x, y = rowcol2xy((row, col), resampled_affine)
-                resampled_array[row, col] = self.xy_value(
-                    x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2)
-                )
-
-        return Raster(
-            resampled_array,
-            (resampled_x_resolution, resampled_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-    def __py_resize(self, height: int, width: int) -> "Raster":
-        """
-        Resize raster using nearest neighbor
-        Parameters
-        -------
-        height: int
-            raster height
-        width: int
-            raster width
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-        resized_y_resolution = self.y_extent / height
-        resized_x_resolution = self.x_extent / width
-
-        resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
-            resized_x_resolution, -resized_y_resolution
-        )
-
-        resized_shape: Tuple[int, ...] = (height, width, self.layers)
-        if self.layers == 1:
-            resized_shape = (height, width)
-
-        resized_array = np.zeros(
-            height * width * self.layers, dtype=self.dtype
-        ).reshape(resized_shape)
-
-        for row in range(height):
-            for col in range(width):
-                x, y = rowcol2xy((row, col), resized_affine)
-                resized_array[row, col] = self.xy_value(
-                    x + (resized_x_resolution / 2), y + (resized_y_resolution / 2)
-                )
-
-        return Raster(
-            resized_array,
-            (resized_x_resolution, resized_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-

Ancestors

-
    -
  • numpy.ndarray
  • -
-

Static methods

-
-
-def from_binary(binary_file: str, shape: Tuple[int, ...], resolution: Union[Tuple[float, float], List[float], float], x_min: float, y_max: float, epsg: int = 4326, no_data: Union[float, int] = -32767.0, dtype: numpy.dtype = numpy.float32, *args, **kwargs) ‑> Raster -
-
-
-
- -Expand source code -Browse git - -
@classmethod
-def from_binary(
-    cls,
-    binary_file: str,
-    shape: Tuple[int, ...],
-    resolution: Union[Tuple[float, float], List[float], float],
-    x_min: float,
-    y_max: float,
-    epsg: int = 4326,
-    no_data: Union[float, int] = -32767.0,
-    dtype: np.dtype = np.float32,
-    *args,
-    **kwargs,
-) -> "Raster":
-    _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
-        shape
-    )
-    return cls(_bin_array, resolution, x_min, y_max, epsg=epsg, no_data=no_data)
-
-
-
-def from_rasterfile(raster_file: str) ‑> Raster -
-
-
-
- -Expand source code -Browse git - -
@classmethod
-def from_rasterfile(cls, raster_file: str) -> "Raster":
-    with rasterio.open(raster_file) as file:
-        _raster = reshape_as_image(file.read())
-    return cls(_raster, transform=file.transform, epsg=file.crs.to_epsg())
-
-
-
-

Instance variables

-
-
var array : numpy.ndarray
-
-

the numpy array of raster

-
- -Expand source code -Browse git - -
@property
-def array(self) -> np.ndarray:
-    """the numpy array of raster"""
-    return self.__array__()
-
-
-
var bottom : float
-
-

bottom y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def bottom(self) -> float:
-    """bottom y-axis coordinate"""
-    return self.y_min
-
-
-
var cols : int
-
-

number of column, width

-
- -Expand source code -Browse git - -
@property
-def cols(self) -> int:
-    """number of column, width"""
-    return int(self.array.shape[1])
-
-
-
var is_geographic : bool
-
-

check crs is geographic or not

-
- -Expand source code -Browse git - -
@property
-def is_geographic(self) -> bool:
-    """check crs is geographic or not"""
-    return self.crs.is_geographic
-
-
-
var is_projected : bool
-
-

check crs is projected or not

-
- -Expand source code -Browse git - -
@property
-def is_projected(self) -> bool:
-    """check crs is projected or not"""
-    return self.crs.is_projected
-
-
-
var layers : int
-
-

number of layer / channel

-
- -Expand source code -Browse git - -
@property
-def layers(self) -> int:
-    """number of layer / channel"""
-    _layers: int = 1
-    if len(self.array.shape) > 2:
-        _layers = self.array.shape[2]
-    return _layers
-
-
-
var left : float
-
-

left x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def left(self) -> float:
-    """left x-axis coordinate"""
-    return self.x_min
-
-
-
var right : float
-
-

right x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def right(self) -> float:
-    """right x-axis coordinate"""
-    return self.x_max
-
-
-
var rows : int
-
-

number of row, height

-
- -Expand source code -Browse git - -
@property
-def rows(self) -> int:
-    """number of row, height"""
-    return int(self.array.shape[0])
-
-
-
var upper : float
-
-

upper y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def upper(self) -> float:
-    """upper y-axis coordinate"""
-    return self.y_max
-
-
-
var x_extent : float
-
-

width of raster in the map unit (degree decimal or meters)

-
- -Expand source code -Browse git - -
@property
-def x_extent(self) -> float:
-    """width of raster in the map unit (degree decimal or meters)"""
-    return self.x_max - self.x_min
-
-
-
var x_max : float
-
-

maximum x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def x_max(self) -> float:
-    """maximum x-axis coordinate"""
-    return self.__transform[2] + (self.resolution[0] * self.cols)
-
-
-
var x_min : float
-
-

minimum x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def x_min(self) -> float:
-    """minimum x-axis coordinate"""
-    return self.__transform[2]
-
-
-
var y_extent : float
-
-

height of raster in the map unit (degree decimal or meters)

-
- -Expand source code -Browse git - -
@property
-def y_extent(self) -> float:
-    """height of raster in the map unit (degree decimal or meters)"""
-    return self.y_max - self.y_min
-
-
-
var y_max : float
-
-

maximum y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def y_max(self) -> float:
-    """maximum y-axis coordinate"""
-    return self.__transform[5]
-
-
-
var y_min : float
-
-

minimum y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def y_min(self) -> float:
-    """minimum y-axis coordinate"""
-    return self.__transform[5] - (self.resolution[1] * self.rows)
-
-
-
-

Methods

-
-
-def resample(self, resolution: Union[Tuple[float, float], List[float], float], method: str = 'bilinear', backend: str = 'opencv') ‑> Raster -
-
-

Resample image into defined resolution

-

Parameters

-
-
resolution : tuple, list, float
-
spatial resolution target
-
method : str nearest or bicubic or bilinear or area or lanczos, default bilinear
-
resampling method for opencv -
-* if nearest, a nearest-neighbor interpolation -
-* if bicubic, a bicubic interpolation over 4×4 pixel neighborhood -
-* if bilinear, a bilinear interpolation -
-* if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. -
-* if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-
backend : str opencv or python, default opencv
-
resampling backend -
-* if opencv, image will be resampled using opencv -
-* if python, image will be resampled using pure python. slower and nearest neighbor only
-
-

Returns

-
-
Raster
-
Resampled
-
-
- -Expand source code -Browse git - -
def resample(
-    self,
-    resolution: Union[Tuple[float, float], List[float], float],
-    method: str = "bilinear",
-    backend: str = "opencv",
-) -> "Raster":
-    """Resample image into defined resolution
-
-    Parameters
-    -------
-    resolution: tuple, list, float
-        spatial resolution target
-    method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-        resampling method for opencv  <br/>
-        * if nearest, a nearest-neighbor interpolation  <br/>
-        * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-        * if bilinear, a bilinear interpolation  <br/>
-        * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-        * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-    backend: str opencv or python, default opencv
-        resampling backend  <br/>
-        * if opencv, image will be resampled using opencv  <br/>
-        * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-    Returns
-    -------
-    Raster
-        Resampled
-    """
-    if backend == "opencv":
-        return self.__cv_resample(resolution, method)
-    elif backend == "python":
-        return self.__py_resample(resolution)
-    else:
-        raise ValueError("Please choose between python or opencv for backend")
-
-
-
-def resize(self, height: int, width: int, method: str = 'bilinear', backend: str = 'opencv') ‑> Raster -
-
-

Resize raster into defined height and width

-

Parameters

-
-
height : int
-
height defined
-
width : int
-
width defined
-
method : str nearest or bicubic or bilinear or area or lanczos, default bilinear
-
resampling method for opencv -
-* if nearest, a nearest-neighbor interpolation -
-* if bicubic, a bicubic interpolation over 4×4 pixel neighborhood -
-* if bilinear, a bilinear interpolation -
-* if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. -
-* if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-
backend : str opencv or python, default opencv
-
resampling backend -
-* if opencv, image will be resampled using opencv -
-* if python, image will be resampled using pure python. slower and nearest neighbor only
-
-

Returns

-
-
Raster
-
Resized
-
-
- -Expand source code -Browse git - -
def resize(
-    self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
-) -> "Raster":
-    """Resize raster into defined height and width
-
-    Parameters
-    -------
-    height: int
-        height defined
-    width: int
-        width defined
-    method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-        resampling method for opencv  <br/>
-        * if nearest, a nearest-neighbor interpolation  <br/>
-        * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-        * if bilinear, a bilinear interpolation  <br/>
-        * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-        * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-    backend: str opencv or python, default opencv
-        resampling backend  <br/>
-        * if opencv, image will be resampled using opencv  <br/>
-        * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-    Returns
-    -------
-    Raster
-        Resized
-    """
-    if backend == "opencv":
-        return self.__cv_resize(height, width, method)
-    elif backend == "python":
-        return self.__py_resize(height, width)
-    else:
-        raise ValueError("Please choose between python or opencv for backend")
-
-
-
-def rowcol2xy(self, row: int, col: int) ‑> Tuple[float, float] -
-
-

Convert image coordinate (row, col) to real world coordinate

-

Parameters

-
-
row : int
-
 
-
col : int
-
 
-
-

Returns

-
-
Tuple[float, float]
-
X,Y coordinate in real world
-
-
- -Expand source code -Browse git - -
def rowcol2xy(self, row: int, col: int) -> Tuple[float, float]:
-    """Convert image coordinate (row, col) to real world coordinate
-
-    Parameters
-    ----------
-    row : int
-    col : int
-
-    Returns
-    -------
-    Tuple[float, float]
-        X,Y coordinate in real world
-    """
-    return rowcol2xy((row, col), self.transform)
-
-
-
-def save(self, file_name: str) ‑> NoneType -
-
-

Save raster as geotiff

-

Parameters

-
-
file_name : str
-
output filename
-
-
- -Expand source code -Browse git - -
def save(self, file_name: str) -> None:
-    """Save raster as geotiff
-
-    Parameters
-    ----------
-    file_name : str
-        output filename
-    """
-    save_raster(
-        file_name, self.array, self.crs, affine=self.transform, nodata=self.no_data
-    )
-
-
-
-def xy2rowcol(self, x: float, y: float) ‑> Tuple[int, int] -
-
-

Convert real world coordinate to image coordinate (row, col)

-

Parameters

-
-
x : float
-
 
-
y : float
-
 
-
-

Returns

-
-
Tuple[int, int]
-
row, column
-
-
- -Expand source code -Browse git - -
def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
-    """Convert real world coordinate to image coordinate (row, col)
-
-    Parameters
-    ----------
-    x : float
-    y : float
-
-    Returns
-    -------
-    Tuple[int, int]
-        row, column
-    """
-    _row, _col = xy2rowcol((x, y), self.transform)
-    return int(_row), int(_col)
-
-
-
-def xy_value(self, x: float, y: float) ‑> Union[float, int, numpy.ndarray] -
-
-

Obtain pixel value by geodetic or projected coordinate

-

Parameters

-
-
x : float
-
x-axis coordinate
-
y : float
-
y-axis coordinate
-
-

Returns

-
-
Union[float, int, np.ndarray]
-
pixel value
-
-
- -Expand source code -Browse git - -
def xy_value(self, x: float, y: float) -> Union[float, int, np.ndarray]:
-    """Obtain pixel value by geodetic or projected coordinate
-
-    Parameters
-    ----------
-    x : float
-        x-axis coordinate
-    y : float
-        y-axis coordinate
-
-    Returns
-    -------
-    Union[float, int, np.ndarray]
-        pixel value
-    """
-    try:
-        row, col = self.xy2rowcol(x, y)
-        if row < 0 or col < 0:
-            raise IndexError
-        return self.array[row, col]
-    except IndexError:
-        raise IndexError(
-            f"""
-            {x},{y} is out of bound. 
-            x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
-            """
-        )
-
-
-
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/docs/index.js b/docs/index.js deleted file mode 100644 index 05b2966..0000000 --- a/docs/index.js +++ /dev/null @@ -1,359 +0,0 @@ -URLS=[ -"index.html", -"interpolate/index.html", -"raster.html" -]; -INDEX=[ -{ -"ref":"geosardine", -"url":0, -"doc":"Spatial operations extend fiona and rasterio. Collection of spatial operation which i occasionally use written in python: - Interpolation with IDW (Inverse Distance Weighting) Shepard - Drape vector to raster - Spatial join between two vector - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample" -}, -{ -"ref":"geosardine.rowcol2xy", -"url":0, -"doc":"Convert image coordinate to geographic coordinate Parameters row_col : tuple, list image coordinate in row, column affine : Affine affine parameter from rasterio.transform or create it with affine.Affine https: pypi.org/project/affine/ Returns - tuple 2d geographic or projected coordinate", -"func":1 -}, -{ -"ref":"geosardine.xy2rowcol", -"url":0, -"doc":"Convert geographic coordinate to image coordinate Parameters xy : tuple, list 2d geographic or projected coordinate affine : Affine affine parameter from rasterio.transform or create it with affine.Affine https: pypi.org/project/affine/ interpolate : bool, default True choose to interpolate or not if True, value will be interpolated from nearest value if False, value will be obtained from exact row and column Returns - tuple row, column", -"func":1 -}, -{ -"ref":"geosardine.drape2raster", -"url":0, -"doc":"Find Z of 2D coordinate Parameters xy : tuple, list, numpy array 2D coordinate x,y dsm_array : numpy array height array affine : Affine affine parameter from rasterio.transform or create it with affine.Affine https: pypi.org/project/affine/ interpolate : bool, default True choose to interpolate or not if True, value will be interpolated from nearest value if False, value will be obtained from exact row and column no_data : float, int, default -32767 value for pixel with no data Returns - tuple 3D coordinate", -"func":1 -}, -{ -"ref":"geosardine.spatial_join", -"url":0, -"doc":"Join attribute from 2 vector by location. Parameters target : fiona.Collection vector target which you want to be joined join : fiona.Collection vector which data wont to be obtained Returns - dict geojson", -"func":1 -}, -{ -"ref":"geosardine.drape_shapely", -"url":0, -"doc":"Drape with shapely geometry as input Parameters geometry : shapely polygon, shapely linestring vector data as shapely object, currently only support polygon or linestring raster : rasterio.io.DatasetReader rasterio reader of raster file interpolate : bool, default True choose to interpolate or not if True, value will be interpolated from nearest value if False, value will be obtained from exact row and column Returns - shapely.Polygon or shapely.LineString", -"func":1 -}, -{ -"ref":"geosardine.drape_geojson", -"url":0, -"doc":"Drape with geojson as input, fiona uses geojson as interface. Parameters features : Iterable[Dict], fiona.Collection vector as geojson raster : rasterio.io.DatasetReader rasterio reader of raster file interpolate : bool, default True choose to interpolate or not if True, value will be interpolated from nearest value if False, value will be obtained from exact row and column Yields - dict geojson", -"func":1 -}, -{ -"ref":"geosardine.harvesine_distance", -"url":0, -"doc":"Calculate distance in ellipsoid by harvesine method faster, less accurate Parameters long_lat1 : tuple, list, numpy array first point coordinate in longitude, latitude long_lat2 : tuple, list, numpy array second point coordinate in longitude, latitude Returns - float distance Notes - https: rafatieppo.github.io/post/2018_07_27_idw2pyr/", -"func":1 -}, -{ -"ref":"geosardine.vincenty_distance", -"url":0, -"doc":"Calculate distance in ellipsoid by vincenty method slower, more accurate Parameters long_lat1 : tuple, list first point coordinate in longitude, latitude long_lat2 : tuple, list second point coordinate in longitude, latitude Returns - distance Notes - https: www.johndcook.com/blog/2018/11/24/spheroid-distance/", -"func":1 -}, -{ -"ref":"geosardine.Raster", -"url":0, -"doc":"Construct Raster from numpy array with spatial information. Support calculation between different raster Parameters array : numpy array array of raster resolution : tuple, list, default None spatial resolution x_min : float, defaults to None left boundary of x-axis coordinate y_max : float, defaults to None upper boundary of y-axis coordinate x_max : float, defaults to None right boundary of x-axis coordinate y_min : float, defaults to None bottom boundary of y-axis coordinate epsg : int, defaults to 4326 EPSG code of reference system no_data : int or float, default None no data value Examples >>> from geosardine import Raster >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7) >>> print(raster) [1. 1.] [1. 1.] [1. 1. 1. 1.] [1. 1.] [1. 1. 1. 1.] [1. 1.] [1. 1. ] Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution >>> resampled = raster.resample 0.2,0.2 >>> print(resampled.shape, resampled.resolution) (6, 6, 2) (0.2, 0.2) Raster can be resized >>> resized = raster.resize(height=16, width=16) >>> print(resized.shape, resized.resolution) (16, 16, 2) (0.07500000000000018, 0.07500000000000001)" -}, -{ -"ref":"geosardine.Raster.from_binary", -"url":0, -"doc":"", -"func":1 -}, -{ -"ref":"geosardine.Raster.from_rasterfile", -"url":0, -"doc":"", -"func":1 -}, -{ -"ref":"geosardine.Raster.array", -"url":0, -"doc":"the numpy array of raster" -}, -{ -"ref":"geosardine.Raster.x_min", -"url":0, -"doc":"minimum x-axis coordinate" -}, -{ -"ref":"geosardine.Raster.y_max", -"url":0, -"doc":"maximum y-axis coordinate" -}, -{ -"ref":"geosardine.Raster.x_max", -"url":0, -"doc":"maximum x-axis coordinate" -}, -{ -"ref":"geosardine.Raster.y_min", -"url":0, -"doc":"minimum y-axis coordinate" -}, -{ -"ref":"geosardine.Raster.upper", -"url":0, -"doc":"upper y-axis coordinate" -}, -{ -"ref":"geosardine.Raster.left", -"url":0, -"doc":"left x-axis coordinate" -}, -{ -"ref":"geosardine.Raster.right", -"url":0, -"doc":"right x-axis coordinate" -}, -{ -"ref":"geosardine.Raster.bottom", -"url":0, -"doc":"bottom y-axis coordinate" -}, -{ -"ref":"geosardine.Raster.rows", -"url":0, -"doc":"number of row, height" -}, -{ -"ref":"geosardine.Raster.cols", -"url":0, -"doc":"number of column, width" -}, -{ -"ref":"geosardine.Raster.layers", -"url":0, -"doc":"number of layer / channel" -}, -{ -"ref":"geosardine.Raster.x_extent", -"url":0, -"doc":"width of raster in the map unit (degree decimal or meters)" -}, -{ -"ref":"geosardine.Raster.y_extent", -"url":0, -"doc":"height of raster in the map unit (degree decimal or meters)" -}, -{ -"ref":"geosardine.Raster.is_projected", -"url":0, -"doc":"check crs is projected or not" -}, -{ -"ref":"geosardine.Raster.is_geographic", -"url":0, -"doc":"check crs is geographic or not" -}, -{ -"ref":"geosardine.Raster.xy_value", -"url":0, -"doc":"Obtain pixel value by geodetic or projected coordinate Parameters x : float x-axis coordinate y : float y-axis coordinate Returns - Union[float, int, np.ndarray] pixel value", -"func":1 -}, -{ -"ref":"geosardine.Raster.rowcol2xy", -"url":0, -"doc":"Convert image coordinate (row, col) to real world coordinate Parameters row : int col : int Returns - Tuple[float, float] X,Y coordinate in real world", -"func":1 -}, -{ -"ref":"geosardine.Raster.xy2rowcol", -"url":0, -"doc":"Convert real world coordinate to image coordinate (row, col) Parameters x : float y : float Returns - Tuple[int, int] row, column", -"func":1 -}, -{ -"ref":"geosardine.Raster.save", -"url":0, -"doc":"Save raster as geotiff Parameters file_name : str output filename", -"func":1 -}, -{ -"ref":"geosardine.Raster.resize", -"url":0, -"doc":"Resize raster into defined height and width Parameters - height: int height defined width: int width defined method: str nearest or bicubic or bilinear or area or lanczos, default bilinear resampling method for opencv if nearest, a nearest-neighbor interpolation if bicubic, a bicubic interpolation over 4\u00d74 pixel neighborhood if bilinear, a bilinear interpolation if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire\u2019-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. if lanczos, a Lanczos interpolation over 8\u00d78 pixel neighborhood backend: str opencv or python, default opencv resampling backend if opencv, image will be resampled using opencv if python, image will be resampled using pure python. slower and nearest neighbor only Returns - Raster Resized", -"func":1 -}, -{ -"ref":"geosardine.Raster.resample", -"url":0, -"doc":"Resample image into defined resolution Parameters - resolution: tuple, list, float spatial resolution target method: str nearest or bicubic or bilinear or area or lanczos, default bilinear resampling method for opencv if nearest, a nearest-neighbor interpolation if bicubic, a bicubic interpolation over 4\u00d74 pixel neighborhood if bilinear, a bilinear interpolation if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire\u2019-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. if lanczos, a Lanczos interpolation over 8\u00d78 pixel neighborhood backend: str opencv or python, default opencv resampling backend if opencv, image will be resampled using opencv if python, image will be resampled using pure python. slower and nearest neighbor only Returns - Raster Resampled", -"func":1 -}, -{ -"ref":"geosardine.interpolate", -"url":1, -"doc":"" -}, -{ -"ref":"geosardine.interpolate.idw", -"url":1, -"doc":"create interpolated raster from point by using Inverse Distance Weighting (Shepard) Parameters points : numpy array, str list of points coordinate as numpy array or address of vector file i.e shapefile or geojson if numpy array, then value input needed if str, then value is not needed instead will be created from file value : numpy array list of points value as numpy array, not needed if vector file used as input spatial_res : tuple or list of float spatial resolution in x and y axis column_name : str, default None column name needed to obtain value from attribute data of vector file If str, value will be read from respective column name If None, first column will be used as value epsg : int, default 4326 EPSG code of reference system If 4326, WGS 1984 geographic system If int, epsg will be parsed longlat_distance: str harvesine or vincenty, default harvesine method used to calculate distance in spherical / ellipsoidal If harvesine, calculation will be faster but less accurate If vincenty, calculation will be slower but more accurate extent: tuple of float, default None how wide the raster will be If None, extent will be calculated from points input If tuple of float, user input of extent will be used power: float, default 2 how smooth the interpolation will be distance_limit: float, default 0 maximum distance to be interpolated, can't be negative Returns - InterpolationResult Examples >>> xy = np.array( 106.8358, -6.585 ], . [106.6039, -6.7226], . [106.7589, -6.4053], . [106.9674, -6.7092], . [106.7956, -6.5988] . ]) >>> values = np.array([132., 127., 37., 90., 182.]) >>> idw(xy, values, spatial_res=(0.01,0.01), epsg=4326) >>> print(interpolated.array) 88.63769859 86.24219616 83.60463194 . 101.98185127 103.37001289 104.54621272] [ 90.12053232 87.79279317 85.22030848 . 103.77118852 105.01425289 106.05302554] [ 91.82987695 89.60855271 87.14722258 . 105.70090081 106.76928067 107.64635337] . [127.21214817 127.33208302 127.53878268 . 97.80436475 94.96247196 93.12113458] [127.11315081 127.18465002 127.33444124 . 95.86455668 93.19212577 91.51135399] [127.0435062 127.0827023 127.19214624 . 94.80175756 92.30685734 90.75707134 ", -"func":1 -}, -{ -"ref":"geosardine.interpolate.idw_single", -"url":1, -"doc":"Parameters point : list list of single point to be interpolated known_coordinates : numpy array list of points coordinate as numpy array known_value: numpy array list of points value as numpy array, not needed if vector file used as input epsg : int, default 4326 EPSG code of reference system If 4326, WGS 1984 geographic system If int, epsg will be parsed longlat_distance: str harvesine or vincenty, default harvesine method used to calculate distance in spherical / ellipsoidal If harvesine, calculation will be faster but less accurate If vincenty, calculation will be slower but more accurate power: float, default 2 how smooth the interpolation will be distance_limit: float, default 0 maximum distance to be interpolated, can't be negative Returns - float interpolated value Examples >>> from geosardine.interpolate import idw_single >>> result = idw_single( . [860209, 9295740], . np.array( 767984, 9261620], [838926, 9234594 ), . np.array( 101.1, 102.2 ), . epsg=32748, . distance_limit=0 . ) >>> print(result) 101.86735169471324", -"func":1 -}, -{ -"ref":"geosardine.interpolate.InterpolationResult", -"url":1, -"doc":"Class to interpolation result Attributes array : numpy array array of interpolated value. coordinates : numpy array coordinate array of interpolated value each pixel / grid is x and y or longitude and latitude crs : rasterio.crs.CRS crs of interpolated value extent : tuple extent of interpolated x min, y min, x max, y max source : pathlib.Path, default None source file location if None, there is no source file if str, location of point file Constructs interpolation result Parameters array : numpy array array of interpolated value coordinates : numpy array coordinate array of interpolated value each pixel / grid is x and y or longitude and latitude crs : rasterio.crs.CRS crs of interpolated value extent : tuple, default None extent of interpolated x min, y min, x max, y max if None, extent will be calculated from coordinate if tuple, extent will be same as input source : str, pathlib.Path, default None source file location if None, there is no source file if str or pathlib.Path , location of point file" -}, -{ -"ref":"geosardine.interpolate.InterpolationResult.save", -"url":1, -"doc":"save interpolated array as geotif Parameters location : str, pathlib.Path, default None output location if None, tiff will be saved in the same directory and same name as source will only work if source is not None if str or pathlib.Path, tiff will be saved in there ", -"func":1 -}, -{ -"ref":"geosardine.raster", -"url":2, -"doc":"" -}, -{ -"ref":"geosardine.raster.Raster", -"url":2, -"doc":"Construct Raster from numpy array with spatial information. Support calculation between different raster Parameters array : numpy array array of raster resolution : tuple, list, default None spatial resolution x_min : float, defaults to None left boundary of x-axis coordinate y_max : float, defaults to None upper boundary of y-axis coordinate x_max : float, defaults to None right boundary of x-axis coordinate y_min : float, defaults to None bottom boundary of y-axis coordinate epsg : int, defaults to 4326 EPSG code of reference system no_data : int or float, default None no data value Examples >>> from geosardine import Raster >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7) >>> print(raster) [1. 1.] [1. 1.] [1. 1. 1. 1.] [1. 1.] [1. 1. 1. 1.] [1. 1.] [1. 1. ] Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution >>> resampled = raster.resample 0.2,0.2 >>> print(resampled.shape, resampled.resolution) (6, 6, 2) (0.2, 0.2) Raster can be resized >>> resized = raster.resize(height=16, width=16) >>> print(resized.shape, resized.resolution) (16, 16, 2) (0.07500000000000018, 0.07500000000000001)" -}, -{ -"ref":"geosardine.raster.Raster.from_binary", -"url":2, -"doc":"", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.from_rasterfile", -"url":2, -"doc":"", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.array", -"url":2, -"doc":"the numpy array of raster" -}, -{ -"ref":"geosardine.raster.Raster.x_min", -"url":2, -"doc":"minimum x-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.y_max", -"url":2, -"doc":"maximum y-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.x_max", -"url":2, -"doc":"maximum x-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.y_min", -"url":2, -"doc":"minimum y-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.upper", -"url":2, -"doc":"upper y-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.left", -"url":2, -"doc":"left x-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.right", -"url":2, -"doc":"right x-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.bottom", -"url":2, -"doc":"bottom y-axis coordinate" -}, -{ -"ref":"geosardine.raster.Raster.rows", -"url":2, -"doc":"number of row, height" -}, -{ -"ref":"geosardine.raster.Raster.cols", -"url":2, -"doc":"number of column, width" -}, -{ -"ref":"geosardine.raster.Raster.layers", -"url":2, -"doc":"number of layer / channel" -}, -{ -"ref":"geosardine.raster.Raster.x_extent", -"url":2, -"doc":"width of raster in the map unit (degree decimal or meters)" -}, -{ -"ref":"geosardine.raster.Raster.y_extent", -"url":2, -"doc":"height of raster in the map unit (degree decimal or meters)" -}, -{ -"ref":"geosardine.raster.Raster.is_projected", -"url":2, -"doc":"check crs is projected or not" -}, -{ -"ref":"geosardine.raster.Raster.is_geographic", -"url":2, -"doc":"check crs is geographic or not" -}, -{ -"ref":"geosardine.raster.Raster.xy_value", -"url":2, -"doc":"Obtain pixel value by geodetic or projected coordinate Parameters x : float x-axis coordinate y : float y-axis coordinate Returns - Union[float, int, np.ndarray] pixel value", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.rowcol2xy", -"url":2, -"doc":"Convert image coordinate (row, col) to real world coordinate Parameters row : int col : int Returns - Tuple[float, float] X,Y coordinate in real world", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.xy2rowcol", -"url":2, -"doc":"Convert real world coordinate to image coordinate (row, col) Parameters x : float y : float Returns - Tuple[int, int] row, column", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.save", -"url":2, -"doc":"Save raster as geotiff Parameters file_name : str output filename", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.resize", -"url":2, -"doc":"Resize raster into defined height and width Parameters - height: int height defined width: int width defined method: str nearest or bicubic or bilinear or area or lanczos, default bilinear resampling method for opencv if nearest, a nearest-neighbor interpolation if bicubic, a bicubic interpolation over 4\u00d74 pixel neighborhood if bilinear, a bilinear interpolation if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire\u2019-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. if lanczos, a Lanczos interpolation over 8\u00d78 pixel neighborhood backend: str opencv or python, default opencv resampling backend if opencv, image will be resampled using opencv if python, image will be resampled using pure python. slower and nearest neighbor only Returns - Raster Resized", -"func":1 -}, -{ -"ref":"geosardine.raster.Raster.resample", -"url":2, -"doc":"Resample image into defined resolution Parameters - resolution: tuple, list, float spatial resolution target method: str nearest or bicubic or bilinear or area or lanczos, default bilinear resampling method for opencv if nearest, a nearest-neighbor interpolation if bicubic, a bicubic interpolation over 4\u00d74 pixel neighborhood if bilinear, a bilinear interpolation if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire\u2019-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. if lanczos, a Lanczos interpolation over 8\u00d78 pixel neighborhood backend: str opencv or python, default opencv resampling backend if opencv, image will be resampled using opencv if python, image will be resampled using pure python. slower and nearest neighbor only Returns - Raster Resampled", -"func":1 -} -] \ No newline at end of file diff --git a/docs/interpolate/index.html b/docs/interpolate/index.html deleted file mode 100644 index 9711699..0000000 --- a/docs/interpolate/index.html +++ /dev/null @@ -1,601 +0,0 @@ - - - - - - -geosardine.interpolate API documentation - - - - - - - - - - - -
-
-
-

Module geosardine.interpolate

-
-
-
- -Expand source code -Browse git - -
from ._utility import InterpolationResult
-from .idw import idw, idw_single
-
-__all__ = ["idw", "idw_single", "InterpolationResult"]
-
-
-
-
-
-
-
-

Functions

-
-
-def idw(points: Union[str, numpy.ndarray], value: numpy.ndarray, spatial_res: Tuple[float, float], epsg: int = 4326, column_name: Union[str, NoneType] = None, longlat_distance: str = 'harvesine', extent: Union[Tuple[float, float, float, float], NoneType] = None, power: Union[float, int] = 2, distance_limit: float = 0.0) ‑> Union[geosardine.interpolate._utility.InterpolationResult, NoneType] -
-
-

create interpolated raster from point by using Inverse Distance Weighting (Shepard)

-

Parameters

-
-
points : numpy array, str
-
list of points coordinate as numpy array or address of vector file -
-i.e shapefile or geojson -
-* if numpy array, then value input needed -
-* if str, then value is not needed instead will be created from file
-
value : numpy array
-
list of points value as numpy array, not needed if vector file used as input
-
spatial_res : tuple or list of float
-
spatial resolution in x and y axis
-
column_name : str, default None
-
column name needed to obtain value from attribute data of vector file -
-* If str, value will be read from respective column name -
-* If None, first column will be used as value
-
epsg : int, default 4326
-
EPSG code of reference system -
-* If 4326, WGS 1984 geographic system -
-* If int, epsg will be parsed
-
longlat_distance : str harvesine or vincenty, default harvesine
-
method used to calculate distance in spherical / ellipsoidal -
-* If harvesine, calculation will be faster but less accurate -
-* If vincenty, calculation will be slower but more accurate
-
extent : tuple of float, default None
-
how wide the raster will be -
-* If None, extent will be calculated from points input -
-* If tuple of float, user input of extent will be used
-
power : float, default 2
-
how smooth the interpolation will be
-
distance_limit : float, default 0
-
maximum distance to be interpolated, can't be negative
-
-

Returns

-
-
InterpolationResult
-
 
-
-

Examples

-
>>> xy = np.array([[106.8358,  -6.585 ],
-...     [106.6039,  -6.7226],
-...     [106.7589,  -6.4053],
-...     [106.9674,  -6.7092],
-...     [106.7956,  -6.5988]
-... ])
-
-
>>> values = np.array([132., 127.,  37.,  90., 182.])
-
-
>>> idw(xy, values, spatial_res=(0.01,0.01), epsg=4326)
-
-
>>> print(interpolated.array)
-[[ 88.63769859  86.24219616  83.60463194 ... 101.98185127 103.37001289 104.54621272]
- [ 90.12053232  87.79279317  85.22030848 ... 103.77118852 105.01425289 106.05302554]
- [ 91.82987695  89.60855271  87.14722258 ... 105.70090081 106.76928067 107.64635337]
- ...
- [127.21214817 127.33208302 127.53878268 ...  97.80436475  94.96247196 93.12113458]
- [127.11315081 127.18465002 127.33444124 ...  95.86455668  93.19212577 91.51135399]
- [127.0435062  127.0827023  127.19214624 ...  94.80175756  92.30685734 90.75707134]]
-
-
- -Expand source code -Browse git - -
@singledispatch
-def idw(
-    points: Union[str, np.ndarray],
-    value: np.ndarray,
-    spatial_res: Tuple[float, float],
-    epsg: int = 4326,
-    column_name: Optional[str] = None,
-    longlat_distance: str = "harvesine",
-    extent: Optional[Tuple[float, float, float, float]] = None,
-    power: Union[float, int] = 2,
-    distance_limit: float = 0.0,
-) -> Optional[InterpolationResult]:
-    """
-    create interpolated raster from point by using Inverse Distance Weighting (Shepard)
-
-    Parameters
-    ----------
-    points : numpy array, str
-        list of points coordinate as numpy array or address of vector file  <br/>
-        i.e shapefile or geojson  <br/>
-        * if numpy array, then value input needed  <br/>
-        * if str, then value is not needed instead will be created from file
-    value : numpy array
-        list of points value as numpy array, not needed if vector file used as input
-    spatial_res : tuple or list of float
-        spatial resolution in x and y axis
-    column_name : str, default None
-        column name needed to obtain value from attribute data of vector file  <br/>
-        * If str, value will be read from respective column name  <br/>
-        * If None, first column will be used as value
-    epsg : int, default 4326
-        EPSG code of reference system  <br/>
-        * If 4326, WGS 1984 geographic system  <br/>
-        * If int, epsg will be parsed
-    longlat_distance: str harvesine or vincenty, default harvesine
-        method used to calculate distance in spherical / ellipsoidal  <br/>
-        * If harvesine, calculation will be faster but less accurate  <br/>
-        * If vincenty, calculation will be slower but more accurate
-    extent: tuple of float, default None
-        how wide the raster will be  <br/>
-        * If None, extent will be calculated from points input  <br/>
-        * If tuple of float, user input of extent will be used
-    power: float, default 2
-        how smooth the interpolation will be
-    distance_limit: float, default 0
-        maximum distance to be interpolated, can't be negative
-
-    Returns
-    -------
-    InterpolationResult
-
-    Examples
-    --------
-
-    >>> xy = np.array([[106.8358,  -6.585 ],
-    ...     [106.6039,  -6.7226],
-    ...     [106.7589,  -6.4053],
-    ...     [106.9674,  -6.7092],
-    ...     [106.7956,  -6.5988]
-    ... ])
-
-    >>> values = np.array([132., 127.,  37.,  90., 182.])
-
-    >>> idw(xy, values, spatial_res=(0.01,0.01), epsg=4326)
-
-    >>> print(interpolated.array)
-    [[ 88.63769859  86.24219616  83.60463194 ... 101.98185127 103.37001289 104.54621272]
-     [ 90.12053232  87.79279317  85.22030848 ... 103.77118852 105.01425289 106.05302554]
-     [ 91.82987695  89.60855271  87.14722258 ... 105.70090081 106.76928067 107.64635337]
-     ...
-     [127.21214817 127.33208302 127.53878268 ...  97.80436475  94.96247196 93.12113458]
-     [127.11315081 127.18465002 127.33444124 ...  95.86455668  93.19212577 91.51135399]
-     [127.0435062  127.0827023  127.19214624 ...  94.80175756  92.30685734 90.75707134]]
-    """
-    print("only support numpy array or vector file such as shapefile and geojson")
-    return None
-
-
-
-def idw_single(point: List[float], known_coordinates: numpy.ndarray, known_value: numpy.ndarray, epsg: int = 4326, longlat_distance: str = 'harvesine', power: Union[float, int] = 2, distance_limit: float = 0.0) ‑> float -
-
-

Parameters

-
-
point : list
-
list of single point to be interpolated
-
known_coordinates : numpy array
-
list of points coordinate as numpy array
-
known_value : numpy array
-
list of points value as numpy array, not needed if vector file used as input
-
epsg : int, default 4326
-
EPSG code of reference system -
-* If 4326, WGS 1984 geographic system -
-* If int, epsg will be parsed
-
longlat_distance : str harvesine or vincenty, default harvesine
-
method used to calculate distance in spherical / ellipsoidal -
-* If harvesine, calculation will be faster but less accurate -
-* If vincenty, calculation will be slower but more accurate
-
power : float, default 2
-
how smooth the interpolation will be
-
distance_limit : float, default 0
-
maximum distance to be interpolated, can't be negative
-
-

Returns

-
-
float
-
interpolated value
-
-

Examples

-
>>> from geosardine.interpolate import idw_single
-
-
>>> result = idw_single(
-...     [860209, 9295740],
-...     np.array([[767984, 9261620], [838926, 9234594]]),
-...     np.array([[101.1, 102.2]]),
-...     epsg=32748,
-...     distance_limit=0
-... )
-
-
>>> print(result)
-101.86735169471324
-
-
- -Expand source code -Browse git - -
def idw_single(
-    point: List[float],
-    known_coordinates: np.ndarray,
-    known_value: np.ndarray,
-    epsg: int = 4326,
-    longlat_distance: str = "harvesine",
-    power: Union[float, int] = 2,
-    distance_limit: float = 0.0,
-) -> float:
-    """
-
-    Parameters
-    ----------
-    point : list
-        list of single point to be interpolated
-    known_coordinates : numpy array
-        list of points coordinate as numpy array
-    known_value: numpy array
-        list of points value as numpy array, not needed if vector file used as input
-    epsg : int, default 4326
-        EPSG code of reference system  <br/>
-        * If 4326, WGS 1984 geographic system  <br/>
-        * If int, epsg will be parsed
-    longlat_distance: str harvesine or vincenty, default harvesine
-        method used to calculate distance in spherical / ellipsoidal  <br/>
-        * If harvesine, calculation will be faster but less accurate  <br/>
-        * If vincenty, calculation will be slower but more accurate
-    power: float, default 2
-        how smooth the interpolation will be
-    distance_limit: float, default 0
-        maximum distance to be interpolated, can't be negative
-
-    Returns
-    -------
-    float
-        interpolated value
-
-    Examples
-    --------
-    >>> from geosardine.interpolate import idw_single
-
-    >>> result = idw_single(
-    ...     [860209, 9295740],
-    ...     np.array([[767984, 9261620], [838926, 9234594]]),
-    ...     np.array([[101.1, 102.2]]),
-    ...     epsg=32748,
-    ...     distance_limit=0
-    ... )
-
-    >>> print(result)
-    101.86735169471324
-
-    """
-    if len(point) > 2:
-        raise ValueError("only for single point, input can't be more than 2 items")
-    crs = CRS.from_epsg(epsg)
-    distance_calculation = longlat_distance
-    if crs.is_projected:
-        distance_calculation = "projected"
-
-    interpolated = _idw(
-        known_coordinates,
-        known_value,
-        np.array([point]),
-        calc_distance[distance_calculation],
-        power,
-        distance_limit,
-    )
-    return interpolated[0]
-
-
-
-
-
-

Classes

-
-
-class InterpolationResult -(array: numpy.ndarray, coordinates: numpy.ndarray, crs: rasterio.crs.CRS, extent: Union[Tuple[float, float, float, float], NoneType] = None, source: Union[str, pathlib.Path, NoneType] = None) -
-
-

Class to interpolation result

-

Attributes

-
-
array : numpy array
-
array of interpolated value.
-
coordinates : numpy array
-
coordinate array of interpolated value -
-each pixel / grid is x and y or longitude and latitude -
-
crs : rasterio.crs.CRS
-
crs of interpolated value
-
extent : tuple
-
extent of interpolated -
-x min, y min, x max, y max
-
source : pathlib.Path, default None
-
source file location -
-* if None, there is no source file -
-* if str, location of point file
-
-

Constructs interpolation result -Parameters

-
-
-
array : numpy array
-
array of interpolated value
-
coordinates : numpy array
-
coordinate array of interpolated value
-each pixel / grid is x and y or longitude and latitude
-
crs : rasterio.crs.CRS
-
crs of interpolated value
-
extent : tuple, default None
-
extent of interpolated
-x min, y min, x max, y max
-* if None, extent will be calculated from coordinate
-* if tuple, extent will be same as input
-
source : str, pathlib.Path, default None
-
source file location
-* if None, there is no source file
-* if str or pathlib.Path, location of point file
-
-
- -Expand source code -Browse git - -
class InterpolationResult:
-    """
-    Class to interpolation result
-
-    Attributes
-    ----------
-    array : numpy array
-        array of interpolated value.
-    coordinates : numpy array
-        coordinate array of interpolated value  <br/>
-        each pixel / grid is x and y or longitude and latitude  <br/>
-    crs : `rasterio.crs.CRS`
-        crs of interpolated value
-    extent : tuple
-        extent of interpolated  <br/>
-        x min, y min, x max, y max
-    source : pathlib.Path, default None
-        source file location  <br/>
-        * if None, there is no source file  <br/>
-        * if str, location of point file
-    """
-
-    def __init__(
-        self,
-        array: np.ndarray,
-        coordinates: np.ndarray,
-        crs: CRS,
-        extent: Optional[Tuple[float, float, float, float]] = None,
-        source: Optional[Union[str, Path]] = None,
-    ):
-        """
-        Constructs interpolation result
-        Parameters
-        ----------
-        array : numpy array
-            array of interpolated value
-        coordinates : numpy array
-            coordinate array of interpolated value <br/>
-            each pixel / grid is x and y or longitude and latitude
-        crs : `rasterio.crs.CRS`
-            crs of interpolated value
-        extent : tuple, default None
-            extent of interpolated <br/>
-            x min, y min, x max, y max <br/>
-            * if None, extent will be calculated from coordinate <br/>
-            * if tuple, extent will be same as input
-        source : str, pathlib.Path, default None
-            source file location <br/>
-            * if None, there is no source file <br/>
-            * if str or `pathlib.Path`, location of point file
-        """
-        self.array = array
-        self.crs = crs
-        self.extent = extent
-        self.source = source
-        self.output: Optional[Path] = None
-        self.affine: Affine = calc_affine(coordinates)
-        if extent is None:
-            self.extent = calc_extent(coordinates)
-        del coordinates
-
-        if type(source) == str:
-            self.source = Path(source)
-
-    def save(self, location: Optional[Union[str, Path]] = None) -> None:
-        """
-        save interpolated array as geotif
-        Parameters
-        ----------
-        location : str, pathlib.Path, default None
-            output location  <br/>
-            * if None, tiff will be saved in the same directory and same name as source
-                will only work if source is not None  <br/>
-            * if str or pathlib.Path, tiff will be saved in there  <br/>
-
-        """
-        if self.source is None and location is None:
-            raise ValueError("Please provide output location")
-
-        self.output = location
-        if self.source is not None and location is None:
-            self.output = self.source.parent / f"{self.source.stem}.tif"
-            print(f"OUTPUT is not specified, will be saved as {self.output}")
-
-        save_raster(self.output, self.array, affine=self.affine, crs=self.crs)
-
-

Methods

-
-
-def save(self, location: Union[str, pathlib.Path, NoneType] = None) ‑> NoneType -
-
-

save interpolated array as geotif -Parameters

-
-
-
location : str, pathlib.Path, default None
-
output location -
-* if None, tiff will be saved in the same directory and same name as source -will only work if source is not None -
-* if str or pathlib.Path, tiff will be saved in there -
-
-
- -Expand source code -Browse git - -
def save(self, location: Optional[Union[str, Path]] = None) -> None:
-    """
-    save interpolated array as geotif
-    Parameters
-    ----------
-    location : str, pathlib.Path, default None
-        output location  <br/>
-        * if None, tiff will be saved in the same directory and same name as source
-            will only work if source is not None  <br/>
-        * if str or pathlib.Path, tiff will be saved in there  <br/>
-
-    """
-    if self.source is None and location is None:
-        raise ValueError("Please provide output location")
-
-    self.output = location
-    if self.source is not None and location is None:
-        self.output = self.source.parent / f"{self.source.stem}.tif"
-        print(f"OUTPUT is not specified, will be saved as {self.output}")
-
-    save_raster(self.output, self.array, affine=self.affine, crs=self.crs)
-
-
-
-
-
-
-
- -
- - - \ No newline at end of file diff --git a/docs/raster.html b/docs/raster.html deleted file mode 100644 index 2f9584e..0000000 --- a/docs/raster.html +++ /dev/null @@ -1,2076 +0,0 @@ - - - - - - -geosardine.raster API documentation - - - - - - - - - - - -
-
-
-

Module geosardine.raster

-
-
-
- -Expand source code -Browse git - -
from operator import (
-    add,
-    floordiv,
-    iadd,
-    ifloordiv,
-    imul,
-    ipow,
-    isub,
-    itruediv,
-    mul,
-    pow,
-    sub,
-    truediv,
-)
-from typing import Any, Callable, Generator, Iterable, List, Optional, Tuple, Union
-
-import cv2
-import numpy as np
-import rasterio
-from affine import Affine
-from rasterio.crs import CRS
-from rasterio.plot import reshape_as_image
-
-from geosardine._geosardine import rowcol2xy, xy2rowcol
-from geosardine._raster_numba import __nb_raster_calc__, __nb_raster_ops
-from geosardine._utility import save_raster
-
-
-def __nb_raster_calc(
-    raster_a: "Raster", raster_b: "Raster", operator: str
-) -> np.ndarray:
-    """Wrapper for Raster calculation per pixel using numba jit.
-
-    Parameters
-    ----------
-    raster_a : Raster
-        first raster
-    raster_b : Raster
-        second raster
-    operator : str
-        operator name
-
-    Returns
-    -------
-    np.ndarray
-        calculated raster
-    """
-    return __nb_raster_calc__(
-        raster_a.array,
-        raster_b.array,
-        raster_a.transform,
-        ~raster_b.transform,
-        raster_a.no_data,
-        raster_b.no_data,
-        __nb_raster_ops[operator],
-    )
-
-
-class Raster(np.ndarray):
-    """
-    Construct Raster from numpy array with spatial information.
-    Support calculation between different raster
-
-    Parameters
-    ----------
-    array : numpy array
-        array of raster
-    resolution : tuple, list, default None
-        spatial resolution
-    x_min : float, defaults to None
-        left boundary of x-axis coordinate
-    y_max : float, defaults to None
-        upper boundary of y-axis coordinate
-    x_max : float, defaults to None
-        right boundary of x-axis coordinate
-    y_min : float, defaults to None
-        bottom boundary of y-axis coordinate
-    epsg : int, defaults to 4326
-        EPSG code of reference system
-    no_data : int or float, default None
-        no data value
-
-    Examples
-    --------
-    >>> from geosardine import Raster
-    >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
-    >>> print(raster)
-    [[[1. 1.]
-      [1. 1.]
-      [1. 1.]]
-     [[1. 1.]
-      [1. 1.]
-      [1. 1.]]
-     [[1. 1.]
-      [1. 1.]
-      [1. 1.]]]
-    Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
-    >>> resampled = raster.resample((0.2,0.2))
-    >>> print(resampled.shape, resampled.resolution)
-    (6, 6, 2) (0.2, 0.2)
-    Raster can be resized
-    >>> resized = raster.resize(height=16, width=16)
-    >>> print(resized.shape, resized.resolution)
-    (16, 16, 2) (0.07500000000000018, 0.07500000000000001)
-    """
-
-    __cv2_resize_method = {
-        "nearest": cv2.INTER_NEAREST,
-        "bicubic": cv2.INTER_CUBIC,
-        "bilinear": cv2.INTER_LINEAR,
-        "area": cv2.INTER_AREA,
-        "lanczos": cv2.INTER_LANCZOS4,
-    }
-
-    def __init__(
-        self,
-        array: np.ndarray,
-        resolution: Union[
-            None, Tuple[float, float], List[float], Tuple[float, ...], float
-        ] = None,
-        x_min: Optional[float] = None,
-        y_max: Optional[float] = None,
-        x_max: Optional[float] = None,
-        y_min: Optional[float] = None,
-        epsg: int = 4326,
-        no_data: Union[float, int] = -32767.0,
-        transform: Optional[Affine] = None,
-    ):
-        if transform is None:
-            if resolution is None and x_min is None and y_min is None:
-                raise ValueError(
-                    "Please define resolution and at least x minimum and y minimum"
-                )
-
-            if resolution is not None and x_min is None and y_max is None:
-                raise ValueError("Please define x_min and y_max")
-
-            if isinstance(resolution, float):
-                self.resolution: Tuple[float, float] = (
-                    resolution,
-                    resolution,
-                )
-            elif isinstance(resolution, Iterable):
-                self.resolution = (resolution[0], resolution[1])
-
-            if (
-                resolution is None
-                and x_min is not None
-                and y_min is not None
-                and x_max is not None
-                and y_max is not None
-            ):
-                self.resolution = (
-                    (x_max - x_min) / array.shape[1],
-                    (y_max - y_min) / array.shape[0],
-                )
-
-            self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale(
-                self.resolution[0], -self.resolution[1]
-            )
-        elif isinstance(transform, Affine):
-            self.transform = transform
-        else:
-            raise ValueError(
-                "Please define affine parameter or resolution and xmin ymax"
-            )
-
-        self.epsg = epsg
-
-        self.crs = CRS.from_epsg(epsg)
-        self.no_data = no_data
-        self.__check_validity()
-
-    def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster":
-        return array.view(cls)
-
-    def __getitem__(self, key: Union[int, Tuple[Any, ...], slice]) -> np.ndarray:
-        return self.array.__getitem__(key)
-
-    @classmethod
-    def from_binary(
-        cls,
-        binary_file: str,
-        shape: Tuple[int, ...],
-        resolution: Union[Tuple[float, float], List[float], float],
-        x_min: float,
-        y_max: float,
-        epsg: int = 4326,
-        no_data: Union[float, int] = -32767.0,
-        dtype: np.dtype = np.float32,
-        *args,
-        **kwargs,
-    ) -> "Raster":
-        _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
-            shape
-        )
-        return cls(_bin_array, resolution, x_min, y_max, epsg=epsg, no_data=no_data)
-
-    @classmethod
-    def from_rasterfile(cls, raster_file: str) -> "Raster":
-        with rasterio.open(raster_file) as file:
-            _raster = reshape_as_image(file.read())
-        return cls(_raster, transform=file.transform, epsg=file.crs.to_epsg())
-
-    @property
-    def array(self) -> np.ndarray:
-        """the numpy array of raster"""
-        return self.__array__()
-
-    @property
-    def __transform(self) -> Tuple[float, ...]:
-        return tuple(self.transform)
-
-    @property
-    def x_min(self) -> float:
-        """minimum x-axis coordinate"""
-        return self.__transform[2]
-
-    @property
-    def y_max(self) -> float:
-        """maximum y-axis coordinate"""
-        return self.__transform[5]
-
-    @property
-    def x_max(self) -> float:
-        """maximum x-axis coordinate"""
-        return self.__transform[2] + (self.resolution[0] * self.cols)
-
-    @property
-    def y_min(self) -> float:
-        """minimum y-axis coordinate"""
-        return self.__transform[5] - (self.resolution[1] * self.rows)
-
-    @property
-    def upper(self) -> float:
-        """upper y-axis coordinate"""
-        return self.y_max
-
-    @property
-    def left(self) -> float:
-        """left x-axis coordinate"""
-        return self.x_min
-
-    @property
-    def right(self) -> float:
-        """right x-axis coordinate"""
-        return self.x_max
-
-    @property
-    def bottom(self) -> float:
-        """bottom y-axis coordinate"""
-        return self.y_min
-
-    @property
-    def rows(self) -> int:
-        """number of row, height"""
-        return int(self.array.shape[0])
-
-    @property
-    def cols(self) -> int:
-        """number of column, width"""
-        return int(self.array.shape[1])
-
-    @property
-    def layers(self) -> int:
-        """number of layer / channel"""
-        _layers: int = 1
-        if len(self.array.shape) > 2:
-            _layers = self.array.shape[2]
-        return _layers
-
-    @property
-    def x_extent(self) -> float:
-        """width of raster in the map unit (degree decimal or meters)"""
-        return self.x_max - self.x_min
-
-    @property
-    def y_extent(self) -> float:
-        """height of raster in the map unit (degree decimal or meters)"""
-        return self.y_max - self.y_min
-
-    @property
-    def is_projected(self) -> bool:
-        """check crs is projected or not"""
-        return self.crs.is_projected
-
-    @property
-    def is_geographic(self) -> bool:
-        """check crs is geographic or not"""
-        return self.crs.is_geographic
-
-    def __check_validity(self) -> None:
-        if self.x_extent < 0 and self.y_extent < 0:
-            raise ValueError(
-                "x min should be less than x max and y min should be less than y max"
-            )
-        elif self.x_extent < 0 and self.y_extent > 0:
-            raise ValueError("x min should be less than x max")
-        elif self.x_extent > 0 and self.y_extent < 0:
-            raise ValueError("y min should be less than y max")
-
-    def xy_value(self, x: float, y: float) -> Union[float, int, np.ndarray]:
-        """Obtain pixel value by geodetic or projected coordinate
-
-        Parameters
-        ----------
-        x : float
-            x-axis coordinate
-        y : float
-            y-axis coordinate
-
-        Returns
-        -------
-        Union[float, int, np.ndarray]
-            pixel value
-        """
-        try:
-            row, col = self.xy2rowcol(x, y)
-            if row < 0 or col < 0:
-                raise IndexError
-            return self.array[row, col]
-        except IndexError:
-            raise IndexError(
-                f"""
-                {x},{y} is out of bound. 
-                x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
-                """
-            )
-
-    def rowcol2xy(self, row: int, col: int) -> Tuple[float, float]:
-        """Convert image coordinate (row, col) to real world coordinate
-
-        Parameters
-        ----------
-        row : int
-        col : int
-
-        Returns
-        -------
-        Tuple[float, float]
-            X,Y coordinate in real world
-        """
-        return rowcol2xy((row, col), self.transform)
-
-    def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
-        """Convert real world coordinate to image coordinate (row, col)
-
-        Parameters
-        ----------
-        x : float
-        y : float
-
-        Returns
-        -------
-        Tuple[int, int]
-            row, column
-        """
-        _row, _col = xy2rowcol((x, y), self.transform)
-        return int(_row), int(_col)
-
-    def __raster_calc_by_pixel__(
-        self,
-        raster: "Raster",
-        operator: Callable[[Any, Any], Any],
-    ) -> np.ndarray:
-        _raster = np.zeros(self.array.shape, dtype=self.array.dtype)
-        for row in range(self.rows):
-            for col in range(self.cols):
-                try:
-                    pixel_source = self.array[row, col]
-                    pixel_target = raster.xy_value(*self.rowcol2xy(row, col))
-                    if pixel_source != self.no_data and pixel_target != raster.no_data:
-                        _raster[row, col] = operator(
-                            pixel_source,
-                            pixel_target,
-                        )
-                    else:
-                        _raster[row, col] = self.no_data
-                except IndexError:
-                    _raster[row, col] = self.no_data
-        return _raster
-
-    def __raster_calculation__(
-        self,
-        raster: Union[int, float, "Raster", np.ndarray],
-        operator: Callable[[Any, Any], Any],
-    ) -> "Raster":
-        if not isinstance(raster, (int, float, Raster, np.ndarray)):
-            raise ValueError(f"{type(raster)} unsupported data format")
-
-        if isinstance(raster, Raster):
-            if (
-                raster.epsg == self.epsg
-                and raster.resolution == self.resolution
-                and raster.x_min == self.x_min
-                and raster.y_min == self.y_min
-                and raster.shape == self.shape
-            ):
-                _raster = operator(self.array, raster.array)
-            else:
-                # _raster = self.__raster_calc_by_pixel__(raster, operator)
-                _raster = __nb_raster_calc(
-                    self,
-                    raster,
-                    operator.__name__,
-                )
-        elif isinstance(raster, np.ndarray):
-            _raster = operator(self.array, raster)
-        else:
-            _raster = operator(self.array, raster)
-
-        return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg)
-
-    def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, sub)
-
-    def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, add)
-
-    def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, mul)
-
-    def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, truediv)
-
-    def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, floordiv)
-
-    def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, pow)
-
-    def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, iadd)
-
-    def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, itruediv)
-
-    def __ifloordiv__(
-        self, raster: Union[int, float, "Raster", np.ndarray]
-    ) -> "Raster":
-        return self.__raster_calculation__(raster, ifloordiv)
-
-    def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, imul)
-
-    def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, isub)
-
-    def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, ipow)
-
-    def __iter__(self) -> Generator[Any, None, None]:
-        _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers)
-        if self.layers == 1:
-            _iter_shape = self.rows * self.cols
-        _iter = self.array.reshape(_iter_shape)
-        for i in range(10):
-            yield _iter[i]
-
-    def save(self, file_name: str) -> None:
-        """Save raster as geotiff
-
-        Parameters
-        ----------
-        file_name : str
-            output filename
-        """
-        save_raster(
-            file_name, self.array, self.crs, affine=self.transform, nodata=self.no_data
-        )
-
-    def resize(
-        self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
-    ) -> "Raster":
-        """Resize raster into defined height and width
-
-        Parameters
-        -------
-        height: int
-            height defined
-        width: int
-            width defined
-        method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-            resampling method for opencv  <br/>
-            * if nearest, a nearest-neighbor interpolation  <br/>
-            * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-            * if bilinear, a bilinear interpolation  <br/>
-            * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-            * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-        backend: str opencv or python, default opencv
-            resampling backend  <br/>
-            * if opencv, image will be resampled using opencv  <br/>
-            * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-        Returns
-        -------
-        Raster
-            Resized
-        """
-        if backend == "opencv":
-            return self.__cv_resize(height, width, method)
-        elif backend == "python":
-            return self.__py_resize(height, width)
-        else:
-            raise ValueError("Please choose between python or opencv for backend")
-
-    def resample(
-        self,
-        resolution: Union[Tuple[float, float], List[float], float],
-        method: str = "bilinear",
-        backend: str = "opencv",
-    ) -> "Raster":
-        """Resample image into defined resolution
-
-        Parameters
-        -------
-        resolution: tuple, list, float
-            spatial resolution target
-        method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-            resampling method for opencv  <br/>
-            * if nearest, a nearest-neighbor interpolation  <br/>
-            * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-            * if bilinear, a bilinear interpolation  <br/>
-            * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-            * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-        backend: str opencv or python, default opencv
-            resampling backend  <br/>
-            * if opencv, image will be resampled using opencv  <br/>
-            * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-        if backend == "opencv":
-            return self.__cv_resample(resolution, method)
-        elif backend == "python":
-            return self.__py_resample(resolution)
-        else:
-            raise ValueError("Please choose between python or opencv for backend")
-
-    def __cv_resize(self, height: int, width: int, method: str) -> "Raster":
-        resized_y_resolution = self.y_extent / height
-        resized_x_resolution = self.x_extent / width
-        resized = cv2.resize(
-            self.array, (width, height), interpolation=self.__cv2_resize_method[method]
-        )
-        return Raster(
-            resized,
-            (resized_x_resolution, resized_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-    def __cv_resample(
-        self, resolution: Union[Tuple[float, float], List[float], float], method: str
-    ) -> "Raster":
-        if isinstance(resolution, (float, int)):
-            resampled_x_resolution = float(resolution)
-            resampled_y_resolution = float(resolution)
-        else:
-            resampled_x_resolution = resolution[0]
-            resampled_y_resolution = resolution[1]
-
-        resampled_rows = round(self.y_extent / resampled_y_resolution)
-        resampled_cols = round(self.x_extent / resampled_x_resolution)
-
-        resampled = self.__cv_resize(resampled_rows, resampled_cols, method)
-        return resampled
-
-    def __py_resample(
-        self, resolution: Union[Tuple[float, float], List[float], float]
-    ) -> "Raster":
-        """
-        Resample raster using nearest neighbor
-        Parameters
-        -------
-        resolution: tuple, list
-            spatial resolution target
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-
-        if isinstance(resolution, (float, int)):
-            resampled_x_resolution = float(resolution)
-            resampled_y_resolution = float(resolution)
-        else:
-            resampled_x_resolution = resolution[0]
-            resampled_y_resolution = resolution[1]
-
-        resampled_rows = round(self.y_extent / resampled_y_resolution)
-        resampled_cols = round(self.x_extent / resampled_x_resolution)
-
-        resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers)
-        if self.layers == 1:
-            resampled_shape = (resampled_rows, resampled_cols)
-
-        resampled_array = np.zeros(
-            resampled_rows * resampled_cols * self.layers, dtype=self.dtype
-        ).reshape(resampled_shape)
-
-        resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
-            resampled_x_resolution, -resampled_y_resolution
-        )
-
-        for row in range(resampled_rows):
-            for col in range(resampled_cols):
-                x, y = rowcol2xy((row, col), resampled_affine)
-                resampled_array[row, col] = self.xy_value(
-                    x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2)
-                )
-
-        return Raster(
-            resampled_array,
-            (resampled_x_resolution, resampled_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-    def __py_resize(self, height: int, width: int) -> "Raster":
-        """
-        Resize raster using nearest neighbor
-        Parameters
-        -------
-        height: int
-            raster height
-        width: int
-            raster width
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-        resized_y_resolution = self.y_extent / height
-        resized_x_resolution = self.x_extent / width
-
-        resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
-            resized_x_resolution, -resized_y_resolution
-        )
-
-        resized_shape: Tuple[int, ...] = (height, width, self.layers)
-        if self.layers == 1:
-            resized_shape = (height, width)
-
-        resized_array = np.zeros(
-            height * width * self.layers, dtype=self.dtype
-        ).reshape(resized_shape)
-
-        for row in range(height):
-            for col in range(width):
-                x, y = rowcol2xy((row, col), resized_affine)
-                resized_array[row, col] = self.xy_value(
-                    x + (resized_x_resolution / 2), y + (resized_y_resolution / 2)
-                )
-
-        return Raster(
-            resized_array,
-            (resized_x_resolution, resized_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-
-
-
-
-
-
-
-
-

Classes

-
-
-class Raster -(array: numpy.ndarray, resolution: Union[NoneType, Tuple[float, float], List[float], Tuple[float, ...], float] = None, x_min: Union[float, NoneType] = None, y_max: Union[float, NoneType] = None, x_max: Union[float, NoneType] = None, y_min: Union[float, NoneType] = None, epsg: int = 4326, no_data: Union[float, int] = -32767.0, transform: Union[affine.Affine, NoneType] = None) -
-
-

Construct Raster from numpy array with spatial information. -Support calculation between different raster

-

Parameters

-
-
array : numpy array
-
array of raster
-
resolution : tuple, list, default None
-
spatial resolution
-
x_min : float, defaults to None
-
left boundary of x-axis coordinate
-
y_max : float, defaults to None
-
upper boundary of y-axis coordinate
-
x_max : float, defaults to None
-
right boundary of x-axis coordinate
-
y_min : float, defaults to None
-
bottom boundary of y-axis coordinate
-
epsg : int, defaults to 4326
-
EPSG code of reference system
-
no_data : int or float, default None
-
no data value
-
-

Examples

-
>>> from geosardine import Raster
->>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
->>> print(raster)
-[[[1. 1.]
-  [1. 1.]
-  [1. 1.]]
- [[1. 1.]
-  [1. 1.]
-  [1. 1.]]
- [[1. 1.]
-  [1. 1.]
-  [1. 1.]]]
-Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
->>> resampled = raster.resample((0.2,0.2))
->>> print(resampled.shape, resampled.resolution)
-(6, 6, 2) (0.2, 0.2)
-Raster can be resized
->>> resized = raster.resize(height=16, width=16)
->>> print(resized.shape, resized.resolution)
-(16, 16, 2) (0.07500000000000018, 0.07500000000000001)
-
-
- -Expand source code -Browse git - -
class Raster(np.ndarray):
-    """
-    Construct Raster from numpy array with spatial information.
-    Support calculation between different raster
-
-    Parameters
-    ----------
-    array : numpy array
-        array of raster
-    resolution : tuple, list, default None
-        spatial resolution
-    x_min : float, defaults to None
-        left boundary of x-axis coordinate
-    y_max : float, defaults to None
-        upper boundary of y-axis coordinate
-    x_max : float, defaults to None
-        right boundary of x-axis coordinate
-    y_min : float, defaults to None
-        bottom boundary of y-axis coordinate
-    epsg : int, defaults to 4326
-        EPSG code of reference system
-    no_data : int or float, default None
-        no data value
-
-    Examples
-    --------
-    >>> from geosardine import Raster
-    >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7)
-    >>> print(raster)
-    [[[1. 1.]
-      [1. 1.]
-      [1. 1.]]
-     [[1. 1.]
-      [1. 1.]
-      [1. 1.]]
-     [[1. 1.]
-      [1. 1.]
-      [1. 1.]]]
-    Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution
-    >>> resampled = raster.resample((0.2,0.2))
-    >>> print(resampled.shape, resampled.resolution)
-    (6, 6, 2) (0.2, 0.2)
-    Raster can be resized
-    >>> resized = raster.resize(height=16, width=16)
-    >>> print(resized.shape, resized.resolution)
-    (16, 16, 2) (0.07500000000000018, 0.07500000000000001)
-    """
-
-    __cv2_resize_method = {
-        "nearest": cv2.INTER_NEAREST,
-        "bicubic": cv2.INTER_CUBIC,
-        "bilinear": cv2.INTER_LINEAR,
-        "area": cv2.INTER_AREA,
-        "lanczos": cv2.INTER_LANCZOS4,
-    }
-
-    def __init__(
-        self,
-        array: np.ndarray,
-        resolution: Union[
-            None, Tuple[float, float], List[float], Tuple[float, ...], float
-        ] = None,
-        x_min: Optional[float] = None,
-        y_max: Optional[float] = None,
-        x_max: Optional[float] = None,
-        y_min: Optional[float] = None,
-        epsg: int = 4326,
-        no_data: Union[float, int] = -32767.0,
-        transform: Optional[Affine] = None,
-    ):
-        if transform is None:
-            if resolution is None and x_min is None and y_min is None:
-                raise ValueError(
-                    "Please define resolution and at least x minimum and y minimum"
-                )
-
-            if resolution is not None and x_min is None and y_max is None:
-                raise ValueError("Please define x_min and y_max")
-
-            if isinstance(resolution, float):
-                self.resolution: Tuple[float, float] = (
-                    resolution,
-                    resolution,
-                )
-            elif isinstance(resolution, Iterable):
-                self.resolution = (resolution[0], resolution[1])
-
-            if (
-                resolution is None
-                and x_min is not None
-                and y_min is not None
-                and x_max is not None
-                and y_max is not None
-            ):
-                self.resolution = (
-                    (x_max - x_min) / array.shape[1],
-                    (y_max - y_min) / array.shape[0],
-                )
-
-            self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale(
-                self.resolution[0], -self.resolution[1]
-            )
-        elif isinstance(transform, Affine):
-            self.transform = transform
-        else:
-            raise ValueError(
-                "Please define affine parameter or resolution and xmin ymax"
-            )
-
-        self.epsg = epsg
-
-        self.crs = CRS.from_epsg(epsg)
-        self.no_data = no_data
-        self.__check_validity()
-
-    def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster":
-        return array.view(cls)
-
-    def __getitem__(self, key: Union[int, Tuple[Any, ...], slice]) -> np.ndarray:
-        return self.array.__getitem__(key)
-
-    @classmethod
-    def from_binary(
-        cls,
-        binary_file: str,
-        shape: Tuple[int, ...],
-        resolution: Union[Tuple[float, float], List[float], float],
-        x_min: float,
-        y_max: float,
-        epsg: int = 4326,
-        no_data: Union[float, int] = -32767.0,
-        dtype: np.dtype = np.float32,
-        *args,
-        **kwargs,
-    ) -> "Raster":
-        _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
-            shape
-        )
-        return cls(_bin_array, resolution, x_min, y_max, epsg=epsg, no_data=no_data)
-
-    @classmethod
-    def from_rasterfile(cls, raster_file: str) -> "Raster":
-        with rasterio.open(raster_file) as file:
-            _raster = reshape_as_image(file.read())
-        return cls(_raster, transform=file.transform, epsg=file.crs.to_epsg())
-
-    @property
-    def array(self) -> np.ndarray:
-        """the numpy array of raster"""
-        return self.__array__()
-
-    @property
-    def __transform(self) -> Tuple[float, ...]:
-        return tuple(self.transform)
-
-    @property
-    def x_min(self) -> float:
-        """minimum x-axis coordinate"""
-        return self.__transform[2]
-
-    @property
-    def y_max(self) -> float:
-        """maximum y-axis coordinate"""
-        return self.__transform[5]
-
-    @property
-    def x_max(self) -> float:
-        """maximum x-axis coordinate"""
-        return self.__transform[2] + (self.resolution[0] * self.cols)
-
-    @property
-    def y_min(self) -> float:
-        """minimum y-axis coordinate"""
-        return self.__transform[5] - (self.resolution[1] * self.rows)
-
-    @property
-    def upper(self) -> float:
-        """upper y-axis coordinate"""
-        return self.y_max
-
-    @property
-    def left(self) -> float:
-        """left x-axis coordinate"""
-        return self.x_min
-
-    @property
-    def right(self) -> float:
-        """right x-axis coordinate"""
-        return self.x_max
-
-    @property
-    def bottom(self) -> float:
-        """bottom y-axis coordinate"""
-        return self.y_min
-
-    @property
-    def rows(self) -> int:
-        """number of row, height"""
-        return int(self.array.shape[0])
-
-    @property
-    def cols(self) -> int:
-        """number of column, width"""
-        return int(self.array.shape[1])
-
-    @property
-    def layers(self) -> int:
-        """number of layer / channel"""
-        _layers: int = 1
-        if len(self.array.shape) > 2:
-            _layers = self.array.shape[2]
-        return _layers
-
-    @property
-    def x_extent(self) -> float:
-        """width of raster in the map unit (degree decimal or meters)"""
-        return self.x_max - self.x_min
-
-    @property
-    def y_extent(self) -> float:
-        """height of raster in the map unit (degree decimal or meters)"""
-        return self.y_max - self.y_min
-
-    @property
-    def is_projected(self) -> bool:
-        """check crs is projected or not"""
-        return self.crs.is_projected
-
-    @property
-    def is_geographic(self) -> bool:
-        """check crs is geographic or not"""
-        return self.crs.is_geographic
-
-    def __check_validity(self) -> None:
-        if self.x_extent < 0 and self.y_extent < 0:
-            raise ValueError(
-                "x min should be less than x max and y min should be less than y max"
-            )
-        elif self.x_extent < 0 and self.y_extent > 0:
-            raise ValueError("x min should be less than x max")
-        elif self.x_extent > 0 and self.y_extent < 0:
-            raise ValueError("y min should be less than y max")
-
-    def xy_value(self, x: float, y: float) -> Union[float, int, np.ndarray]:
-        """Obtain pixel value by geodetic or projected coordinate
-
-        Parameters
-        ----------
-        x : float
-            x-axis coordinate
-        y : float
-            y-axis coordinate
-
-        Returns
-        -------
-        Union[float, int, np.ndarray]
-            pixel value
-        """
-        try:
-            row, col = self.xy2rowcol(x, y)
-            if row < 0 or col < 0:
-                raise IndexError
-            return self.array[row, col]
-        except IndexError:
-            raise IndexError(
-                f"""
-                {x},{y} is out of bound. 
-                x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
-                """
-            )
-
-    def rowcol2xy(self, row: int, col: int) -> Tuple[float, float]:
-        """Convert image coordinate (row, col) to real world coordinate
-
-        Parameters
-        ----------
-        row : int
-        col : int
-
-        Returns
-        -------
-        Tuple[float, float]
-            X,Y coordinate in real world
-        """
-        return rowcol2xy((row, col), self.transform)
-
-    def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
-        """Convert real world coordinate to image coordinate (row, col)
-
-        Parameters
-        ----------
-        x : float
-        y : float
-
-        Returns
-        -------
-        Tuple[int, int]
-            row, column
-        """
-        _row, _col = xy2rowcol((x, y), self.transform)
-        return int(_row), int(_col)
-
-    def __raster_calc_by_pixel__(
-        self,
-        raster: "Raster",
-        operator: Callable[[Any, Any], Any],
-    ) -> np.ndarray:
-        _raster = np.zeros(self.array.shape, dtype=self.array.dtype)
-        for row in range(self.rows):
-            for col in range(self.cols):
-                try:
-                    pixel_source = self.array[row, col]
-                    pixel_target = raster.xy_value(*self.rowcol2xy(row, col))
-                    if pixel_source != self.no_data and pixel_target != raster.no_data:
-                        _raster[row, col] = operator(
-                            pixel_source,
-                            pixel_target,
-                        )
-                    else:
-                        _raster[row, col] = self.no_data
-                except IndexError:
-                    _raster[row, col] = self.no_data
-        return _raster
-
-    def __raster_calculation__(
-        self,
-        raster: Union[int, float, "Raster", np.ndarray],
-        operator: Callable[[Any, Any], Any],
-    ) -> "Raster":
-        if not isinstance(raster, (int, float, Raster, np.ndarray)):
-            raise ValueError(f"{type(raster)} unsupported data format")
-
-        if isinstance(raster, Raster):
-            if (
-                raster.epsg == self.epsg
-                and raster.resolution == self.resolution
-                and raster.x_min == self.x_min
-                and raster.y_min == self.y_min
-                and raster.shape == self.shape
-            ):
-                _raster = operator(self.array, raster.array)
-            else:
-                # _raster = self.__raster_calc_by_pixel__(raster, operator)
-                _raster = __nb_raster_calc(
-                    self,
-                    raster,
-                    operator.__name__,
-                )
-        elif isinstance(raster, np.ndarray):
-            _raster = operator(self.array, raster)
-        else:
-            _raster = operator(self.array, raster)
-
-        return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg)
-
-    def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, sub)
-
-    def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, add)
-
-    def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, mul)
-
-    def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, truediv)
-
-    def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, floordiv)
-
-    def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, pow)
-
-    def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, iadd)
-
-    def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, itruediv)
-
-    def __ifloordiv__(
-        self, raster: Union[int, float, "Raster", np.ndarray]
-    ) -> "Raster":
-        return self.__raster_calculation__(raster, ifloordiv)
-
-    def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, imul)
-
-    def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, isub)
-
-    def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster":
-        return self.__raster_calculation__(raster, ipow)
-
-    def __iter__(self) -> Generator[Any, None, None]:
-        _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers)
-        if self.layers == 1:
-            _iter_shape = self.rows * self.cols
-        _iter = self.array.reshape(_iter_shape)
-        for i in range(10):
-            yield _iter[i]
-
-    def save(self, file_name: str) -> None:
-        """Save raster as geotiff
-
-        Parameters
-        ----------
-        file_name : str
-            output filename
-        """
-        save_raster(
-            file_name, self.array, self.crs, affine=self.transform, nodata=self.no_data
-        )
-
-    def resize(
-        self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
-    ) -> "Raster":
-        """Resize raster into defined height and width
-
-        Parameters
-        -------
-        height: int
-            height defined
-        width: int
-            width defined
-        method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-            resampling method for opencv  <br/>
-            * if nearest, a nearest-neighbor interpolation  <br/>
-            * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-            * if bilinear, a bilinear interpolation  <br/>
-            * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-            * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-        backend: str opencv or python, default opencv
-            resampling backend  <br/>
-            * if opencv, image will be resampled using opencv  <br/>
-            * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-        Returns
-        -------
-        Raster
-            Resized
-        """
-        if backend == "opencv":
-            return self.__cv_resize(height, width, method)
-        elif backend == "python":
-            return self.__py_resize(height, width)
-        else:
-            raise ValueError("Please choose between python or opencv for backend")
-
-    def resample(
-        self,
-        resolution: Union[Tuple[float, float], List[float], float],
-        method: str = "bilinear",
-        backend: str = "opencv",
-    ) -> "Raster":
-        """Resample image into defined resolution
-
-        Parameters
-        -------
-        resolution: tuple, list, float
-            spatial resolution target
-        method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-            resampling method for opencv  <br/>
-            * if nearest, a nearest-neighbor interpolation  <br/>
-            * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-            * if bilinear, a bilinear interpolation  <br/>
-            * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-            * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-        backend: str opencv or python, default opencv
-            resampling backend  <br/>
-            * if opencv, image will be resampled using opencv  <br/>
-            * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-        if backend == "opencv":
-            return self.__cv_resample(resolution, method)
-        elif backend == "python":
-            return self.__py_resample(resolution)
-        else:
-            raise ValueError("Please choose between python or opencv for backend")
-
-    def __cv_resize(self, height: int, width: int, method: str) -> "Raster":
-        resized_y_resolution = self.y_extent / height
-        resized_x_resolution = self.x_extent / width
-        resized = cv2.resize(
-            self.array, (width, height), interpolation=self.__cv2_resize_method[method]
-        )
-        return Raster(
-            resized,
-            (resized_x_resolution, resized_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-    def __cv_resample(
-        self, resolution: Union[Tuple[float, float], List[float], float], method: str
-    ) -> "Raster":
-        if isinstance(resolution, (float, int)):
-            resampled_x_resolution = float(resolution)
-            resampled_y_resolution = float(resolution)
-        else:
-            resampled_x_resolution = resolution[0]
-            resampled_y_resolution = resolution[1]
-
-        resampled_rows = round(self.y_extent / resampled_y_resolution)
-        resampled_cols = round(self.x_extent / resampled_x_resolution)
-
-        resampled = self.__cv_resize(resampled_rows, resampled_cols, method)
-        return resampled
-
-    def __py_resample(
-        self, resolution: Union[Tuple[float, float], List[float], float]
-    ) -> "Raster":
-        """
-        Resample raster using nearest neighbor
-        Parameters
-        -------
-        resolution: tuple, list
-            spatial resolution target
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-
-        if isinstance(resolution, (float, int)):
-            resampled_x_resolution = float(resolution)
-            resampled_y_resolution = float(resolution)
-        else:
-            resampled_x_resolution = resolution[0]
-            resampled_y_resolution = resolution[1]
-
-        resampled_rows = round(self.y_extent / resampled_y_resolution)
-        resampled_cols = round(self.x_extent / resampled_x_resolution)
-
-        resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers)
-        if self.layers == 1:
-            resampled_shape = (resampled_rows, resampled_cols)
-
-        resampled_array = np.zeros(
-            resampled_rows * resampled_cols * self.layers, dtype=self.dtype
-        ).reshape(resampled_shape)
-
-        resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
-            resampled_x_resolution, -resampled_y_resolution
-        )
-
-        for row in range(resampled_rows):
-            for col in range(resampled_cols):
-                x, y = rowcol2xy((row, col), resampled_affine)
-                resampled_array[row, col] = self.xy_value(
-                    x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2)
-                )
-
-        return Raster(
-            resampled_array,
-            (resampled_x_resolution, resampled_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-    def __py_resize(self, height: int, width: int) -> "Raster":
-        """
-        Resize raster using nearest neighbor
-        Parameters
-        -------
-        height: int
-            raster height
-        width: int
-            raster width
-
-        Returns
-        -------
-        Raster
-            Resampled
-        """
-        resized_y_resolution = self.y_extent / height
-        resized_x_resolution = self.x_extent / width
-
-        resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale(
-            resized_x_resolution, -resized_y_resolution
-        )
-
-        resized_shape: Tuple[int, ...] = (height, width, self.layers)
-        if self.layers == 1:
-            resized_shape = (height, width)
-
-        resized_array = np.zeros(
-            height * width * self.layers, dtype=self.dtype
-        ).reshape(resized_shape)
-
-        for row in range(height):
-            for col in range(width):
-                x, y = rowcol2xy((row, col), resized_affine)
-                resized_array[row, col] = self.xy_value(
-                    x + (resized_x_resolution / 2), y + (resized_y_resolution / 2)
-                )
-
-        return Raster(
-            resized_array,
-            (resized_x_resolution, resized_y_resolution),
-            self.x_min,
-            self.y_max,
-            epsg=self.epsg,
-        )
-
-

Ancestors

-
    -
  • numpy.ndarray
  • -
-

Static methods

-
-
-def from_binary(binary_file: str, shape: Tuple[int, ...], resolution: Union[Tuple[float, float], List[float], float], x_min: float, y_max: float, epsg: int = 4326, no_data: Union[float, int] = -32767.0, dtype: numpy.dtype = numpy.float32, *args, **kwargs) ‑> Raster -
-
-
-
- -Expand source code -Browse git - -
@classmethod
-def from_binary(
-    cls,
-    binary_file: str,
-    shape: Tuple[int, ...],
-    resolution: Union[Tuple[float, float], List[float], float],
-    x_min: float,
-    y_max: float,
-    epsg: int = 4326,
-    no_data: Union[float, int] = -32767.0,
-    dtype: np.dtype = np.float32,
-    *args,
-    **kwargs,
-) -> "Raster":
-    _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape(
-        shape
-    )
-    return cls(_bin_array, resolution, x_min, y_max, epsg=epsg, no_data=no_data)
-
-
-
-def from_rasterfile(raster_file: str) ‑> Raster -
-
-
-
- -Expand source code -Browse git - -
@classmethod
-def from_rasterfile(cls, raster_file: str) -> "Raster":
-    with rasterio.open(raster_file) as file:
-        _raster = reshape_as_image(file.read())
-    return cls(_raster, transform=file.transform, epsg=file.crs.to_epsg())
-
-
-
-

Instance variables

-
-
var array : numpy.ndarray
-
-

the numpy array of raster

-
- -Expand source code -Browse git - -
@property
-def array(self) -> np.ndarray:
-    """the numpy array of raster"""
-    return self.__array__()
-
-
-
var bottom : float
-
-

bottom y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def bottom(self) -> float:
-    """bottom y-axis coordinate"""
-    return self.y_min
-
-
-
var cols : int
-
-

number of column, width

-
- -Expand source code -Browse git - -
@property
-def cols(self) -> int:
-    """number of column, width"""
-    return int(self.array.shape[1])
-
-
-
var is_geographic : bool
-
-

check crs is geographic or not

-
- -Expand source code -Browse git - -
@property
-def is_geographic(self) -> bool:
-    """check crs is geographic or not"""
-    return self.crs.is_geographic
-
-
-
var is_projected : bool
-
-

check crs is projected or not

-
- -Expand source code -Browse git - -
@property
-def is_projected(self) -> bool:
-    """check crs is projected or not"""
-    return self.crs.is_projected
-
-
-
var layers : int
-
-

number of layer / channel

-
- -Expand source code -Browse git - -
@property
-def layers(self) -> int:
-    """number of layer / channel"""
-    _layers: int = 1
-    if len(self.array.shape) > 2:
-        _layers = self.array.shape[2]
-    return _layers
-
-
-
var left : float
-
-

left x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def left(self) -> float:
-    """left x-axis coordinate"""
-    return self.x_min
-
-
-
var right : float
-
-

right x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def right(self) -> float:
-    """right x-axis coordinate"""
-    return self.x_max
-
-
-
var rows : int
-
-

number of row, height

-
- -Expand source code -Browse git - -
@property
-def rows(self) -> int:
-    """number of row, height"""
-    return int(self.array.shape[0])
-
-
-
var upper : float
-
-

upper y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def upper(self) -> float:
-    """upper y-axis coordinate"""
-    return self.y_max
-
-
-
var x_extent : float
-
-

width of raster in the map unit (degree decimal or meters)

-
- -Expand source code -Browse git - -
@property
-def x_extent(self) -> float:
-    """width of raster in the map unit (degree decimal or meters)"""
-    return self.x_max - self.x_min
-
-
-
var x_max : float
-
-

maximum x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def x_max(self) -> float:
-    """maximum x-axis coordinate"""
-    return self.__transform[2] + (self.resolution[0] * self.cols)
-
-
-
var x_min : float
-
-

minimum x-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def x_min(self) -> float:
-    """minimum x-axis coordinate"""
-    return self.__transform[2]
-
-
-
var y_extent : float
-
-

height of raster in the map unit (degree decimal or meters)

-
- -Expand source code -Browse git - -
@property
-def y_extent(self) -> float:
-    """height of raster in the map unit (degree decimal or meters)"""
-    return self.y_max - self.y_min
-
-
-
var y_max : float
-
-

maximum y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def y_max(self) -> float:
-    """maximum y-axis coordinate"""
-    return self.__transform[5]
-
-
-
var y_min : float
-
-

minimum y-axis coordinate

-
- -Expand source code -Browse git - -
@property
-def y_min(self) -> float:
-    """minimum y-axis coordinate"""
-    return self.__transform[5] - (self.resolution[1] * self.rows)
-
-
-
-

Methods

-
-
-def resample(self, resolution: Union[Tuple[float, float], List[float], float], method: str = 'bilinear', backend: str = 'opencv') ‑> Raster -
-
-

Resample image into defined resolution

-

Parameters

-
-
resolution : tuple, list, float
-
spatial resolution target
-
method : str nearest or bicubic or bilinear or area or lanczos, default bilinear
-
resampling method for opencv -
-* if nearest, a nearest-neighbor interpolation -
-* if bicubic, a bicubic interpolation over 4×4 pixel neighborhood -
-* if bilinear, a bilinear interpolation -
-* if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. -
-* if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-
backend : str opencv or python, default opencv
-
resampling backend -
-* if opencv, image will be resampled using opencv -
-* if python, image will be resampled using pure python. slower and nearest neighbor only
-
-

Returns

-
-
Raster
-
Resampled
-
-
- -Expand source code -Browse git - -
def resample(
-    self,
-    resolution: Union[Tuple[float, float], List[float], float],
-    method: str = "bilinear",
-    backend: str = "opencv",
-) -> "Raster":
-    """Resample image into defined resolution
-
-    Parameters
-    -------
-    resolution: tuple, list, float
-        spatial resolution target
-    method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-        resampling method for opencv  <br/>
-        * if nearest, a nearest-neighbor interpolation  <br/>
-        * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-        * if bilinear, a bilinear interpolation  <br/>
-        * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-        * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-    backend: str opencv or python, default opencv
-        resampling backend  <br/>
-        * if opencv, image will be resampled using opencv  <br/>
-        * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-    Returns
-    -------
-    Raster
-        Resampled
-    """
-    if backend == "opencv":
-        return self.__cv_resample(resolution, method)
-    elif backend == "python":
-        return self.__py_resample(resolution)
-    else:
-        raise ValueError("Please choose between python or opencv for backend")
-
-
-
-def resize(self, height: int, width: int, method: str = 'bilinear', backend: str = 'opencv') ‑> Raster -
-
-

Resize raster into defined height and width

-

Parameters

-
-
height : int
-
height defined
-
width : int
-
width defined
-
method : str nearest or bicubic or bilinear or area or lanczos, default bilinear
-
resampling method for opencv -
-* if nearest, a nearest-neighbor interpolation -
-* if bicubic, a bicubic interpolation over 4×4 pixel neighborhood -
-* if bilinear, a bilinear interpolation -
-* if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method. -
-* if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-
backend : str opencv or python, default opencv
-
resampling backend -
-* if opencv, image will be resampled using opencv -
-* if python, image will be resampled using pure python. slower and nearest neighbor only
-
-

Returns

-
-
Raster
-
Resized
-
-
- -Expand source code -Browse git - -
def resize(
-    self, height: int, width: int, method: str = "bilinear", backend: str = "opencv"
-) -> "Raster":
-    """Resize raster into defined height and width
-
-    Parameters
-    -------
-    height: int
-        height defined
-    width: int
-        width defined
-    method: str nearest or bicubic or bilinear or area or lanczos, default bilinear
-        resampling method for opencv  <br/>
-        * if nearest, a nearest-neighbor interpolation  <br/>
-        * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood  <br/>
-        * if bilinear, a bilinear interpolation  <br/>
-        * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.  <br/>
-        * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood
-    backend: str opencv or python, default opencv
-        resampling backend  <br/>
-        * if opencv, image will be resampled using opencv  <br/>
-        * if python, image will be resampled using pure python. slower and nearest neighbor only
-
-
-    Returns
-    -------
-    Raster
-        Resized
-    """
-    if backend == "opencv":
-        return self.__cv_resize(height, width, method)
-    elif backend == "python":
-        return self.__py_resize(height, width)
-    else:
-        raise ValueError("Please choose between python or opencv for backend")
-
-
-
-def rowcol2xy(self, row: int, col: int) ‑> Tuple[float, float] -
-
-

Convert image coordinate (row, col) to real world coordinate

-

Parameters

-
-
row : int
-
 
-
col : int
-
 
-
-

Returns

-
-
Tuple[float, float]
-
X,Y coordinate in real world
-
-
- -Expand source code -Browse git - -
def rowcol2xy(self, row: int, col: int) -> Tuple[float, float]:
-    """Convert image coordinate (row, col) to real world coordinate
-
-    Parameters
-    ----------
-    row : int
-    col : int
-
-    Returns
-    -------
-    Tuple[float, float]
-        X,Y coordinate in real world
-    """
-    return rowcol2xy((row, col), self.transform)
-
-
-
-def save(self, file_name: str) ‑> NoneType -
-
-

Save raster as geotiff

-

Parameters

-
-
file_name : str
-
output filename
-
-
- -Expand source code -Browse git - -
def save(self, file_name: str) -> None:
-    """Save raster as geotiff
-
-    Parameters
-    ----------
-    file_name : str
-        output filename
-    """
-    save_raster(
-        file_name, self.array, self.crs, affine=self.transform, nodata=self.no_data
-    )
-
-
-
-def xy2rowcol(self, x: float, y: float) ‑> Tuple[int, int] -
-
-

Convert real world coordinate to image coordinate (row, col)

-

Parameters

-
-
x : float
-
 
-
y : float
-
 
-
-

Returns

-
-
Tuple[int, int]
-
row, column
-
-
- -Expand source code -Browse git - -
def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]:
-    """Convert real world coordinate to image coordinate (row, col)
-
-    Parameters
-    ----------
-    x : float
-    y : float
-
-    Returns
-    -------
-    Tuple[int, int]
-        row, column
-    """
-    _row, _col = xy2rowcol((x, y), self.transform)
-    return int(_row), int(_col)
-
-
-
-def xy_value(self, x: float, y: float) ‑> Union[float, int, numpy.ndarray] -
-
-

Obtain pixel value by geodetic or projected coordinate

-

Parameters

-
-
x : float
-
x-axis coordinate
-
y : float
-
y-axis coordinate
-
-

Returns

-
-
Union[float, int, np.ndarray]
-
pixel value
-
-
- -Expand source code -Browse git - -
def xy_value(self, x: float, y: float) -> Union[float, int, np.ndarray]:
-    """Obtain pixel value by geodetic or projected coordinate
-
-    Parameters
-    ----------
-    x : float
-        x-axis coordinate
-    y : float
-        y-axis coordinate
-
-    Returns
-    -------
-    Union[float, int, np.ndarray]
-        pixel value
-    """
-    try:
-        row, col = self.xy2rowcol(x, y)
-        if row < 0 or col < 0:
-            raise IndexError
-        return self.array[row, col]
-    except IndexError:
-        raise IndexError(
-            f"""
-            {x},{y} is out of bound. 
-            x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max}
-            """
-        )
-
-
-
-
-
-
-
- -
- - - \ No newline at end of file From 0200ca706996b8103f3e89ba4745547be153ecde Mon Sep 17 00:00:00 2001 From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com> Date: Fri, 19 Mar 2021 14:59:17 +0700 Subject: [PATCH 2/8] add polygonize --- .vscode/settings.json | 2 +- CHANGELOG.md | 14 ++ conda.recipe/meta.yaml | 4 +- environment.yml | 3 +- geosardine/_raster_numba.py | 14 +- geosardine/_utility.py | 2 +- geosardine/raster.py | 67 +++++- poetry.lock | 456 +++++++++++++++++++----------------- pyproject.toml | 10 +- tes.tif | Bin 0 -> 9273 bytes 10 files changed, 342 insertions(+), 230 deletions(-) create mode 100644 tes.tif diff --git a/.vscode/settings.json b/.vscode/settings.json index 6199ce4..460264d 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,7 +2,7 @@ "cSpell.ignoreWords": [ "ndarray" ], - "python.pythonPath": ".venv/bin/python", + "python.pythonPath": ".venv\\Scripts\\python.exe", "python.formatting.provider": "black", "python.linting.pylintEnabled": false, "python.linting.mypyEnabled": true, diff --git a/CHANGELOG.md b/CHANGELOG.md index 05e21ed..cdcbe76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.11.0-aplha1] - 2021-03-19 + +### Added +- Added polygonize in raster + +### Fixed +- Fixed unused argument (offset) in Raster.xy2rowcol +### Changed +- moved pip to development dependency +- simplified numba xy2rowcol without creating new variable +- updated environment.yml + +### Removed +- removed unused module in utility ## [0.11.0-alpha0] - 2021-02-24 diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 0774c70..0dd6640 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,5 +1,5 @@ {% set name = "geosardine" %} -{% set version = "0.10.2" %} +{% set version = "0.11.0a1" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz - sha256: 50d5051b292ba3468c1f862b35177cfc78ecc34d621bd323f3c5dfb02adaa2dc + sha256: af785d73b36b1b0f70080970f19d7e6027365b39ea05d19c01c084da255264ce build: noarch: python diff --git a/environment.yml b/environment.yml index 029390a..9cbc892 100644 --- a/environment.yml +++ b/environment.yml @@ -6,10 +6,9 @@ dependencies: - python=3 - numpy>=1.18 - gdal>=3.0.4 - - rasterio>=1.1.4 + - rasterio>=1.1.2 - fiona>=1.8.13 - affine>=2.3.0 - shapely>=1.6.4 - tqdm>=4.48.2 - - nptyping>=1.3.0 - numba>=0.51.2 \ No newline at end of file diff --git a/geosardine/_raster_numba.py b/geosardine/_raster_numba.py index 00b3d10..8bdab18 100644 --- a/geosardine/_raster_numba.py +++ b/geosardine/_raster_numba.py @@ -23,9 +23,17 @@ def __nb_xy2rowcol( row, column """ - x, y = xy - a, b, c, d, e, f, _, _, _ = inverse_transform - return x * d + y * e + f, x * a + y * b + c + # x, y = xy + # a, b, c, d, e, f, _, _, _ = inverse_transform + # return x * d + y * e + f, x * a + y * b + c + return ( + xy[0] * inverse_transform[3] + + xy[1] * inverse_transform[4] + + inverse_transform[5], + xy[0] * inverse_transform[0] + + xy[1] * inverse_transform[1] + + inverse_transform[2], + ) @nb.njit("UniTuple(f8,2)(UniTuple(f8,2),UniTuple(f8,9), unicode_type)") diff --git a/geosardine/_utility.py b/geosardine/_utility.py index aa76bd5..377ee5b 100644 --- a/geosardine/_utility.py +++ b/geosardine/_utility.py @@ -1,7 +1,7 @@ import math from functools import singledispatch from pathlib import Path -from typing import Any, List, Optional, Tuple, Union +from typing import List, Optional, Tuple, Union import numba import numpy as np diff --git a/geosardine/raster.py b/geosardine/raster.py index 139c9c8..9253a15 100644 --- a/geosardine/raster.py +++ b/geosardine/raster.py @@ -1,3 +1,4 @@ +import itertools import warnings from operator import ( add, @@ -13,20 +14,79 @@ sub, truediv, ) -from typing import Any, Callable, Generator, Iterable, List, Optional, Tuple, Union +from typing import ( + Any, + Callable, + Dict, + Generator, + Iterable, + List, + Optional, + Tuple, + Union, +) import cv2 import numpy as np import rasterio from affine import Affine +from rasterio import features from rasterio.crs import CRS from rasterio.plot import reshape_as_image +from shapely.geometry import mapping, shape +from shapely.ops import unary_union from geosardine._geosardine import rowcol2xy, xy2rowcol from geosardine._raster_numba import __nb_raster_calc__, nb_raster_ops from geosardine._utility import save_raster +def polygonize( + array: np.ndarray, + transform: Affine, + mask: Optional[np.ndarray] = None, + groupby_func: Optional[Callable] = None, +) -> List[Dict[str, Any]]: + """Polygonize raster + + Parameters + ---------- + array : np.ndarray + raster as numpy array + transform : Affine + affine trasformation parameter + mask : Optional[np.ndarray], optional + filter used pixel area, by default None + groupby_func : Optional[Callable], optional + dissolve by function, by default None + + Returns + ------- + List[Dict[str, Any]] + vector as geojson + """ + feats: Generator[Dict[str, Any], None, None] = ( + {"properties": {"raster_val": value}, "geometry": shape} + for shape, value in features.shapes(array, mask=mask, transform=transform) + ) + if groupby_func is not None: + union_features: List[Dict[str, Any]] = [] + for _, group in itertools.groupby( + feats, key=lambda x: x["properties"]["raster_val"] + ): + properties, geom = zip( + *[ + (feature["properties"], shape(feature["geometry"])) + for feature in group + ] + ) + union_features.append( + {"geometry": mapping(unary_union(geom)), "properties": properties[0]} + ) + return union_features + return list(feats) + + class Raster(np.ndarray): """ Construct Raster from numpy array with spatial information. @@ -432,7 +492,7 @@ def xy_value( pixel value """ try: - row, col = self.xy2rowcol(x, y, offset=offset) + row, col = self.xy2rowcol(x, y) if row < 0 or col < 0: raise IndexError return self.array[row, col] @@ -475,7 +535,7 @@ def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]: Tuple[int, int] row, column """ - _row, _col = xy2rowcol((x, y), self.transform, offset=offset) + _row, _col = xy2rowcol((x, y), self.transform) return int(_row), int(_col) def __raster_calc_by_pixel__( @@ -766,6 +826,7 @@ def __py_resample( Raster Resampled """ + warnings.warn("this function will be removed in v1.0", DeprecationWarning) if isinstance(resolution, (float, int)): resampled_x_resolution = float(resolution) diff --git a/poetry.lock b/poetry.lock index 6bb3211..f7ab116 100644 --- a/poetry.lock +++ b/poetry.lock @@ -61,14 +61,6 @@ typing-extensions = ">=3.7.4" colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] -[[package]] -name = "certifi" -version = "2020.12.5" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - [[package]] name = "click" version = "7.1.2" @@ -115,7 +107,7 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] name = "coverage" -version = "5.3" +version = "5.5" description = "Code coverage measurement for Python" category = "dev" optional = false @@ -125,8 +117,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" toml = ["toml"] [[package]] -name = "fiona" -version = "1.8.18" +name = "Fiona" +version = "1.8.13" description = "Fiona reads and writes spatial data files" category = "main" optional = false @@ -134,33 +126,38 @@ python-versions = "*" [package.dependencies] attrs = ">=17" -certifi = "*" -click = ">=4.0,<8" +click = ">=4.0" click-plugins = ">=1.0" cligj = ">=0.5" +gdal = ">=3.0.2,<3.1.0" munch = "*" six = ">=1.7" [package.extras] -all = ["pytest (>=3)", "boto3 (>=1.2.4)", "pytest-cov", "shapely", "mock"] +all = ["pytest-cov", "pytest (>=3)", "shapely", "boto3 (>=1.2.4)", "mock"] calc = ["shapely"] s3 = ["boto3 (>=1.2.4)"] test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"] +[package.source] +type = "file" +url = "../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" + [[package]] -name = "gdal" -version = "3.1.3" +name = "GDAL" +version = "3.0.4" description = "GDAL: Geospatial Data Abstraction Library" category = "main" optional = false python-versions = "*" -[package.extras] -numpy = ["numpy (>1.0.0)"] +[package.source] +type = "file" +url = "../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" [[package]] name = "importlib-metadata" -version = "3.3.0" +version = "3.7.3" description = "Read metadata from Python packages" category = "dev" optional = false @@ -171,12 +168,12 @@ typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "isort" -version = "5.6.4" +version = "5.7.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -197,7 +194,7 @@ python-versions = ">=3.6" [[package]] name = "mako" -version = "1.1.3" +version = "1.1.4" description = "A super-fast templating language that borrows the best ideas from the existing templating languages." category = "dev" optional = false @@ -212,7 +209,7 @@ lingua = ["lingua"] [[package]] name = "markdown" -version = "3.3.3" +version = "3.3.4" description = "Python implementation of Markdown." category = "dev" optional = false @@ -234,7 +231,7 @@ python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" [[package]] name = "more-itertools" -version = "8.6.0" +version = "8.7.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false @@ -301,7 +298,7 @@ python-versions = ">=3.6" [[package]] name = "opencv-python" -version = "4.4.0.46" +version = "4.5.1.48" description = "Wrapper package for OpenCV python bindings." category = "main" optional = false @@ -312,7 +309,7 @@ numpy = ">=1.17.3" [[package]] name = "packaging" -version = "20.8" +version = "20.9" description = "Core utilities for Python packages" category = "dev" optional = false @@ -396,14 +393,14 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-cov" -version = "2.10.1" +version = "2.11.1" description = "Pytest plugin for measuring coverage." category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] -coverage = ">=4.4" +coverage = ">=5.2.1" pytest = ">=4.6" [package.extras] @@ -411,7 +408,7 @@ testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", [[package]] name = "rasterio" -version = "1.1.8" +version = "1.1.2" description = "Fast and direct raster I/O for use with Numpy and SciPy" category = "main" optional = false @@ -420,23 +417,28 @@ python-versions = "*" [package.dependencies] affine = "*" attrs = "*" -click = ">=4.0,<8" +click = ">=4.0" click-plugins = "*" cligj = ">=0.5" +gdal = ">=3.0.1,<3.1.0" numpy = "*" snuggs = ">=1.4.1" [package.extras] -all = ["boto3 (>=1.2.4)", "sphinx", "pytest-cov (>=2.2.0)", "ghp-import", "packaging", "numpydoc", "ipython (>=2.0)", "sphinx-rtd-theme", "hypothesis", "matplotlib", "pytest (>=2.8.2)", "futures", "mock"] +all = ["hypothesis", "sphinx", "numpydoc", "packaging", "ghp-import", "sphinx-rtd-theme", "ipython (>=2.0)", "pytest (>=2.8.2)", "matplotlib", "pytest-cov (>=2.2.0)", "boto3 (>=1.2.4)"] docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"] ipython = ["ipython (>=2.0)"] plot = ["matplotlib"] s3 = ["boto3 (>=1.2.4)"] -test = ["pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "boto3 (>=1.2.4)", "packaging", "hypothesis", "futures", "mock"] +test = ["pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "boto3 (>=1.2.4)", "packaging", "hypothesis"] + +[package.source] +type = "file" +url = "../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" [[package]] name = "regex" -version = "2020.11.13" +version = "2021.3.17" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -488,18 +490,20 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tqdm" -version = "4.54.1" +version = "4.59.0" description = "Fast, Extensible Progress Meter" category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown", "wheel"] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +telegram = ["requests"] [[package]] name = "typed-ast" -version = "1.4.1" +version = "1.4.2" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -523,20 +527,20 @@ python-versions = "*" [[package]] name = "zipp" -version = "3.4.0" +version = "3.4.1" description = "Backport of pathlib-compatible object wrapper for zip files" category = "dev" optional = false python-versions = ">=3.6" [package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "0b69c9869aeb93a1fb48dffa965df56543863658a3f7f57753bdf82b6297b0a3" +content-hash = "e26134d6f5e75d077a2a7cd28eaa028e31c6171ae54a47b97db0244aae5627b7" [metadata.files] affine = [ @@ -558,10 +562,6 @@ attrs = [ black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] -certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, -] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, @@ -579,64 +579,72 @@ colorama = [ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] coverage = [ - {file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"}, - {file = "coverage-5.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4"}, - {file = "coverage-5.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9"}, - {file = "coverage-5.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729"}, - {file = "coverage-5.3-cp27-cp27m-win32.whl", hash = "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d"}, - {file = "coverage-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418"}, - {file = "coverage-5.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9"}, - {file = "coverage-5.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5"}, - {file = "coverage-5.3-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822"}, - {file = "coverage-5.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097"}, - {file = "coverage-5.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9"}, - {file = "coverage-5.3-cp35-cp35m-win32.whl", hash = "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636"}, - {file = "coverage-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f"}, - {file = "coverage-5.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237"}, - {file = "coverage-5.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54"}, - {file = "coverage-5.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7"}, - {file = "coverage-5.3-cp36-cp36m-win32.whl", hash = "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a"}, - {file = "coverage-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d"}, - {file = "coverage-5.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8"}, - {file = "coverage-5.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f"}, - {file = "coverage-5.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c"}, - {file = "coverage-5.3-cp37-cp37m-win32.whl", hash = "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751"}, - {file = "coverage-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709"}, - {file = "coverage-5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516"}, - {file = "coverage-5.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f"}, - {file = "coverage-5.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259"}, - {file = "coverage-5.3-cp38-cp38-win32.whl", hash = "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82"}, - {file = "coverage-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221"}, - {file = "coverage-5.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978"}, - {file = "coverage-5.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21"}, - {file = "coverage-5.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24"}, - {file = "coverage-5.3-cp39-cp39-win32.whl", hash = "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7"}, - {file = "coverage-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7"}, - {file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"}, -] -fiona = [ - {file = "Fiona-1.8.18-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:c64cc0bab040c3a2aec12edd2e1407e3b52609117d9a9a471e3d25172abb1e5e"}, - {file = "Fiona-1.8.18-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:8891d25bcb795eec2294390b56426fded566bcc8ed3730dac7e7a61cde71f1b5"}, - {file = "Fiona-1.8.18-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9fdaaebd5b1b2dd59a0bce9f8ca3e3fba3ef86346be603985590773e4822a543"}, - {file = "Fiona-1.8.18-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8a818fa6cd1ae7ef3b3061ca8f52b694557d2fcf303d7c5431dd961ea09a5ccf"}, - {file = "Fiona-1.8.18-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e34612996121a66559fac9013fd30d8200ed17df54c71edf63461a8b6f519cf5"}, - {file = "Fiona-1.8.18-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0ec331f9cf43bb3399d41a04f8b7ee5ebddea93de3e780fba98f3bf75b39eb3"}, - {file = "Fiona-1.8.18-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:67df21101e185bbb611846138a3094ee3196b746aa336be3db3a64d7971b8fed"}, - {file = "Fiona-1.8.18-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b5a77bcd113dfa2424ff97190b3dc907640777615490e55777e8042a5b84ed78"}, - {file = "Fiona-1.8.18-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a3de7c1da06bc036dcd8954fa30e089587af335d4e549539169b1de9fe8badba"}, - {file = "Fiona-1.8.18-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:1c26f38bfbcd51e710c361f26db605ccf2b5f2a7967e0f4a88683cac3845c947"}, - {file = "Fiona-1.8.18.tar.gz", hash = "sha256:b732ece0ff8886a29c439723a3e1fc382718804bb057519d537a81308854967a"}, -] -gdal = [ - {file = "GDAL-3.1.3.tar.gz", hash = "sha256:a82a13fb4a43c2c8e3a3afe8ec61772452d663820926f2bffb5de868278f94e2"}, + {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, + {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, + {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, + {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, + {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, + {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, + {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, + {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, + {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, + {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, + {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, + {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, + {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, + {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, + {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, + {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, + {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, + {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, + {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, + {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, + {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, + {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, + {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, + {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, +] +Fiona = [ + {file = "Fiona-1.8.13-cp38-cp38-win_amd64.whl", hash = "sha256:d306e7016ee2f8e5fbfbf0b089f83507fd05e006a1385f10aeb9a0e83496ab65"}, +] +GDAL = [ + {file = "GDAL-3.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:9b729d26347b0d0fb51e54e1768c93cde58598f41a3e5684df9ac192c5a47df7"}, ] importlib-metadata = [ - {file = "importlib_metadata-3.3.0-py3-none-any.whl", hash = "sha256:bf792d480abbd5eda85794e4afb09dd538393f7d6e6ffef6e9f03d2014cf9450"}, - {file = "importlib_metadata-3.3.0.tar.gz", hash = "sha256:5c5a2720817414a6c41f0a49993908068243ae02c1635a228126519b509c8aed"}, + {file = "importlib_metadata-3.7.3-py3-none-any.whl", hash = "sha256:b74159469b464a99cb8cc3e21973e4d96e05d3024d337313fedb618a6e86e6f4"}, + {file = "importlib_metadata-3.7.3.tar.gz", hash = "sha256:742add720a20d0467df2f444ae41704000f50e1234f46174b51f9c6031a1bd71"}, ] isort = [ - {file = "isort-5.6.4-py3-none-any.whl", hash = "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7"}, - {file = "isort-5.6.4.tar.gz", hash = "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58"}, + {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, + {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, ] llvmlite = [ {file = "llvmlite-0.35.0rc3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b3b8b059f0449907c0376c7cecf6e0b4bdacc13797ab9f3cc64bb602e31c0a8"}, @@ -656,12 +664,12 @@ llvmlite = [ {file = "llvmlite-0.35.0rc3-cp38-cp38-win_amd64.whl", hash = "sha256:c7c070bf9e194d3d731bdd7b75c28e39efcdac5ea888efc092922afdec33e938"}, ] mako = [ - {file = "Mako-1.1.3-py2.py3-none-any.whl", hash = "sha256:93729a258e4ff0747c876bd9e20df1b9758028946e976324ccd2d68245c7b6a9"}, - {file = "Mako-1.1.3.tar.gz", hash = "sha256:8195c8c1400ceb53496064314c6736719c6f25e7479cd24c77be3d9361cddc27"}, + {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"}, + {file = "Mako-1.1.4.tar.gz", hash = "sha256:17831f0b7087c313c0ffae2bcbbd3c1d5ba9eeac9c38f2eb7b50e8c99fe9d5ab"}, ] markdown = [ - {file = "Markdown-3.3.3-py3-none-any.whl", hash = "sha256:c109c15b7dc20a9ac454c9e6025927d44460b85bd039da028d85e2b6d0bcc328"}, - {file = "Markdown-3.3.3.tar.gz", hash = "sha256:5d9f2b5ca24bc4c7a390d22323ca4bad200368612b5aaa7796babf971d2b2f18"}, + {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, + {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -682,25 +690,44 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, + {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] more-itertools = [ - {file = "more-itertools-8.6.0.tar.gz", hash = "sha256:b3a9005928e5bed54076e6e549c792b306fddfe72b2d1d22dd63d42d5d3899cf"}, - {file = "more_itertools-8.6.0-py3-none-any.whl", hash = "sha256:8e1a2a43b2f2727425f2b5839587ae37093f19153dc26c0927d1048ff6557330"}, + {file = "more-itertools-8.7.0.tar.gz", hash = "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713"}, + {file = "more_itertools-8.7.0-py3-none-any.whl", hash = "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced"}, ] munch = [ {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, @@ -781,31 +808,35 @@ numpy = [ {file = "numpy-1.19.3.zip", hash = "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72"}, ] opencv-python = [ - {file = "opencv-python-4.4.0.46.tar.gz", hash = "sha256:d80db278a07f51811dbf0f9c31ff7cd5b2501822fb7a7587e71f9ff27d5c04bd"}, - {file = "opencv_python-4.4.0.46-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:14df77490c8aedceae74e660564d48c04761658aecc93895ac5e974006a89606"}, - {file = "opencv_python-4.4.0.46-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6b6d23de6d5ddc55e865ac8532bf8062b26ba70305fa1c87c671717027dcd370"}, - {file = "opencv_python-4.4.0.46-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:6b1d85cbb64ce20ac5f79ad8e3e76a3dbff53d258c65f2fc0b9411321147a0be"}, - {file = "opencv_python-4.4.0.46-cp36-cp36m-win32.whl", hash = "sha256:4af0053c6a70f127a52c26b112341826d3dbfce6955beb9044d3eabd7e14d1cd"}, - {file = "opencv_python-4.4.0.46-cp36-cp36m-win_amd64.whl", hash = "sha256:135e05b69ab9665cbe2589f56e60895219bc2443a632bdc4bde72fb95eda1582"}, - {file = "opencv_python-4.4.0.46-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:51baebb0f8f3cae4cccd30daf018a5bb75cb759d5658aea29100d34cd5cac106"}, - {file = "opencv_python-4.4.0.46-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:9659e80059c9f39728c7dcc22032dff0d1d467f07b6cd8e036613393e4b7c71a"}, - {file = "opencv_python-4.4.0.46-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:f69a56e958ecb549ba84e0497a438080932b4d52ded441cec04d80afde71dc0a"}, - {file = "opencv_python-4.4.0.46-cp37-cp37m-win32.whl", hash = "sha256:68a9ec7e32f82cab267b6f757d9862a9a930371062739f9d00472e7c850c5854"}, - {file = "opencv_python-4.4.0.46-cp37-cp37m-win_amd64.whl", hash = "sha256:17581c68400f828700e5c6b3b082f50c781bf74cb9a7b972a04f05d26c8e894a"}, - {file = "opencv_python-4.4.0.46-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:db874c65654465ef71d6e8618bed8c725722bc90624132b9512bf061abb4eec0"}, - {file = "opencv_python-4.4.0.46-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:8aeda9b2c37bf91fa88d67f09b85f2250661eec43d72184ec544783de204e96a"}, - {file = "opencv_python-4.4.0.46-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:8a8ebd7ceebc0be9c14ca3e25a1c4ae086016b469848258e998247f2fc855314"}, - {file = "opencv_python-4.4.0.46-cp38-cp38-win32.whl", hash = "sha256:e4c072cf4260063ebadc70e34d622fa1127a88e364475ed757709e249ebe990f"}, - {file = "opencv_python-4.4.0.46-cp38-cp38-win_amd64.whl", hash = "sha256:6022609b67f9c0f14e6807e782660d1d1be94d4f0c7bc1794d7d8f600014acb2"}, - {file = "opencv_python-4.4.0.46-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:117dbb2fd184de28d831f14c1da17864efcee7bb7895e43adf40f5e1da9137fb"}, - {file = "opencv_python-4.4.0.46-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c1382209a771ca8a25fe89d4a2377875538c6ed3cf8745280e65636cbd0988f2"}, - {file = "opencv_python-4.4.0.46-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:744e9ae2fb4c8574e6d4a762146b4d0984bdec60b98480fc54a363c03a07a1ac"}, - {file = "opencv_python-4.4.0.46-cp39-cp39-win32.whl", hash = "sha256:7fe81d08df4eb5dc4c6aa5f09888b6fd390fce5fa7d5624a98cac890b9aa6181"}, - {file = "opencv_python-4.4.0.46-cp39-cp39-win_amd64.whl", hash = "sha256:0548981fe189e0d57b9cc65066b66fd70d4bc84ea906f349a63d9098e1b911c6"}, + {file = "opencv-python-4.5.1.48.tar.gz", hash = "sha256:78a6db8467639383caedf1d111da3510a4ee1a0aacf2117821cae2ee8f92ce37"}, + {file = "opencv_python-4.5.1.48-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:bcb27773cfd5340b2b599b303d9f5499838ef4780c20c038f6030175408c64df"}, + {file = "opencv_python-4.5.1.48-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9646875c501788b1b098f282d777b667d6da69801739504f1b2fd1268970d1da"}, + {file = "opencv_python-4.5.1.48-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:ebe83901971a6755512424c4fe9f63341cca501b7c497bf608dd38ee31ba3f4c"}, + {file = "opencv_python-4.5.1.48-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:d8aefcb30b71064dbbaa2b0ace161a36464c29375a83998fbda39a1d1740f942"}, + {file = "opencv_python-4.5.1.48-cp36-cp36m-win32.whl", hash = "sha256:32dee1c9fd3e31e28edef7b56f868e2b40e280b7062304f9fb8a14dbc51547d5"}, + {file = "opencv_python-4.5.1.48-cp36-cp36m-win_amd64.whl", hash = "sha256:9c77d508e6822f1f40c727d21b822d017622d8305dce7eccf0ab06caac16d5c6"}, + {file = "opencv_python-4.5.1.48-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:4982fa8ccc38310a2bd93e06334ba090b12b6aff2f6fcb8ff9613e3c9bc48f48"}, + {file = "opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c0503bfaa2b7b743d6ff5d81f1dd8428dbf4c33e7e4f836456d11be20c2e7721"}, + {file = "opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:e27d062fa1098d90f48b6c047351c89816492a08906a021c973ce510b04a7b9d"}, + {file = "opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:6d8434a45e8f75c4da5fd0068ce001f4f8e35771cc851d746d4721eeaf517e25"}, + {file = "opencv_python-4.5.1.48-cp37-cp37m-win32.whl", hash = "sha256:e2c17714da59d9d516ceef0450766ff9557ee232d62f702665af905193557582"}, + {file = "opencv_python-4.5.1.48-cp37-cp37m-win_amd64.whl", hash = "sha256:efac9893d9e21cfb599828801c755ecde8f1e657f05ec6f002efe19422456d5a"}, + {file = "opencv_python-4.5.1.48-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:e77d0feaff37326f62b127098264e2a7099deb476e38432b1083ce11cdedf560"}, + {file = "opencv_python-4.5.1.48-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ffc75c614b8dc3d8102f3ba15dafd6ec0400c7ffa71a91953d41511964ee50e0"}, + {file = "opencv_python-4.5.1.48-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c1159d91f29a85c3333edef6ca420284566d9bcdae46dda2fe7282515b48c8b6"}, + {file = "opencv_python-4.5.1.48-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:d16144c435b816c5536d5ff012c1a2b7e93155017db7103942ff7efb98c4df1f"}, + {file = "opencv_python-4.5.1.48-cp38-cp38-win32.whl", hash = "sha256:b2b9ac86aec5f2dd531545cebdea1a1ef4f81ef1fb1760d78b4725f9575504f9"}, + {file = "opencv_python-4.5.1.48-cp38-cp38-win_amd64.whl", hash = "sha256:30edebc81b260bcfeb760b3600c367c5261dfb2fe41e5d1408d5357d0867b40d"}, + {file = "opencv_python-4.5.1.48-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:e38fbd7b2db03204ec09930609b7313d6b6d2b271c8fe2c0aa271fa69b726a1b"}, + {file = "opencv_python-4.5.1.48-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:fc1472b825d26c8a4f1cfb172a90c3cc47733e4af7522276c1c2efe8f6006a8b"}, + {file = "opencv_python-4.5.1.48-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c4ea4f8b217f3e8be6247fc0787fb81797d85202c722523f41070124a7a621c7"}, + {file = "opencv_python-4.5.1.48-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:a1dfa0486db367594510c0c799ec7481247dc86e651b69008806d875ab731471"}, + {file = "opencv_python-4.5.1.48-cp39-cp39-win32.whl", hash = "sha256:5172cb37dfd8a0b4945b071a493eb36e5f17675a160637fa380f9c1d9d80535c"}, + {file = "opencv_python-4.5.1.48-cp39-cp39-win_amd64.whl", hash = "sha256:c8cc1f5ff3c352ebe756119014c4e4ec7ae5ac536d1f66b0316667ced37637c8"}, ] packaging = [ - {file = "packaging-20.8-py2.py3-none-any.whl", hash = "sha256:24e0da08660a87484d1602c30bb4902d74816b6985b93de36926f5bc95741858"}, - {file = "packaging-20.8.tar.gz", hash = "sha256:78598185a7008a470d64526a8059de9aaa449238f280fc9eb6b13ba6c4109093"}, + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, ] pathspec = [ {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, @@ -831,74 +862,57 @@ pytest = [ {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, ] pytest-cov = [ - {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, - {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, + {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, + {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, ] rasterio = [ - {file = "rasterio-1.1.8-1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a65b61ca8fbb8aeeac30b35878e65651882cbca589ca63223ddd5f7e86d9cd11"}, - {file = "rasterio-1.1.8-1-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:b048fc6d633555ec32ce4d16323cbf4f5621c297e711fde146b574f80e78d537"}, - {file = "rasterio-1.1.8-1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8b308caf105d74f317530264d8cb575573612e4c98ebfbd855418335377a2a82"}, - {file = "rasterio-1.1.8-1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:41faa63ed5a2beb2682ed477b5ff317e453a1ada9712101f57b83e2b87a7b8bc"}, - {file = "rasterio-1.1.8-1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:053a5a425c54eda26a4a2b7e9344ff6ec258694bc887a158f7886381961a6194"}, - {file = "rasterio-1.1.8-1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a55be995cb15b1df474c8ae611ae268aef444d31e6b5ff91b770dc89a0cfa199"}, - {file = "rasterio-1.1.8-1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4968ff5dd0cb966d71ee26ee31681a1ef73dcaf145d8579029425174142615c2"}, - {file = "rasterio-1.1.8-1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b4fae8bed8926cc42d6a042e4ee8990265ea0019940e6b5985a622c9135f9c16"}, - {file = "rasterio-1.1.8-1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5a2bed3f6db60bfc9035ef6d644c57f2af0ae415ef9a97bbe93bc18e04f1c594"}, - {file = "rasterio-1.1.8-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:adcfdf9cb8ad70e3afd1d04abc4f15ff543a30e6064bc44326c44b2d8675afc0"}, - {file = "rasterio-1.1.8-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:c90b5f39fc47bcca0523332757ff0cbf61e33d97b019f59420aa89df8c15bb65"}, - {file = "rasterio-1.1.8-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:e1f55a6f7d72a12ca5f45d9d5cf82113819235abd48a8d1289aa17e9e487c399"}, - {file = "rasterio-1.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:39e7a0215c0fa45743298a0bfae86299cd4d5c94073dcfcc9907810f0ce275ea"}, - {file = "rasterio-1.1.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:9525cff3affa2d7c4f6c0f73968d3b303590a5bf8471fc378724fbc2fd14801a"}, - {file = "rasterio-1.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:63fdae613b9c3af32ef703d394a083907745d1de447f5ec9473c9416406830a9"}, - {file = "rasterio-1.1.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:00caea6d96f00af8d7ecb4ba8a7ebf49c5c6cebe32e25481b891565fc2946393"}, - {file = "rasterio-1.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e09286c8e49c60022ac734d6a664ec0dc77a2f193a289ea45437a58c19514264"}, - {file = "rasterio-1.1.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5de33fe2047a3c45d8bb048690ca16140648b76805c849f25ce6894aacaf93dd"}, - {file = "rasterio-1.1.8.tar.gz", hash = "sha256:f7cac7e2ecf65b4b1eb78c994c63bd429b67dc679b0bc0ecfe487d3d5bf88fd5"}, + {file = "rasterio-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:3f6a171eb4e87f57c5507eb8139f6099fdccee07befcf5785d02a0c99ecb0cdb"}, ] regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, + {file = "regex-2021.3.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd"}, + {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e"}, + {file = "regex-2021.3.17-cp36-cp36m-win32.whl", hash = "sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3"}, + {file = "regex-2021.3.17-cp36-cp36m-win_amd64.whl", hash = "sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5"}, + {file = "regex-2021.3.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce"}, + {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643"}, + {file = "regex-2021.3.17-cp37-cp37m-win32.whl", hash = "sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be"}, + {file = "regex-2021.3.17-cp37-cp37m-win_amd64.whl", hash = "sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb"}, + {file = "regex-2021.3.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c"}, + {file = "regex-2021.3.17-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d"}, + {file = "regex-2021.3.17-cp38-cp38-win32.whl", hash = "sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf"}, + {file = "regex-2021.3.17-cp38-cp38-win_amd64.whl", hash = "sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa"}, + {file = "regex-2021.3.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106"}, + {file = "regex-2021.3.17-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7"}, + {file = "regex-2021.3.17-cp39-cp39-win32.whl", hash = "sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd"}, + {file = "regex-2021.3.17-cp39-cp39-win_amd64.whl", hash = "sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38"}, + {file = "regex-2021.3.17.tar.gz", hash = "sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68"}, ] shapely = [ + {file = "Shapely-1.7.1-1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46da0ea527da9cf9503e66c18bab6981c5556859e518fe71578b47126e54ca93"}, {file = "Shapely-1.7.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4c10f317e379cc404f8fc510cd9982d5d3e7ba13a9cfd39aa251d894c6366798"}, {file = "Shapely-1.7.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:17df66e87d0fe0193910aeaa938c99f0b04f67b430edb8adae01e7be557b141b"}, {file = "Shapely-1.7.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:da38ed3d65b8091447dc3717e5218cc336d20303b77b0634b261bc5c1aa2bae8"}, @@ -916,6 +930,9 @@ shapely = [ {file = "Shapely-1.7.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:90a3e2ae0d6d7d50ff2370ba168fbd416a53e7d8448410758c5d6a5920646c1d"}, {file = "Shapely-1.7.1-cp38-cp38-win32.whl", hash = "sha256:a3774516c8a83abfd1ddffb8b6ec1b0935d7fe6ea0ff5c31a18bfdae567b4eba"}, {file = "Shapely-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:6593026cd3f5daaea12bcc51ae5c979318070fefee210e7990cb8ac2364e79a1"}, + {file = "Shapely-1.7.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b40cc7bb089ae4aa9ddba1db900b4cd1bce3925d2a4b5837b639e49de054784f"}, + {file = "Shapely-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2df5260d0f2983309776cb41bfa85c464ec07018d88c0ecfca23d40bfadae2f1"}, + {file = "Shapely-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5c3a50d823c192f32615a2a6920e8c046b09e07a58eba220407335a9cd2e8ea"}, {file = "Shapely-1.7.1.tar.gz", hash = "sha256:1641724c1055459a7e2b8bbe47ba25bdc89554582e62aec23cb3f3ca25f9b129"}, ] six = [ @@ -931,31 +948,40 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.54.1-py2.py3-none-any.whl", hash = "sha256:d4f413aecb61c9779888c64ddf0c62910ad56dcbe857d8922bb505d4dbff0df1"}, - {file = "tqdm-4.54.1.tar.gz", hash = "sha256:38b658a3e4ecf9b4f6f8ff75ca16221ae3378b2e175d846b6b33ea3a20852cf5"}, + {file = "tqdm-4.59.0-py2.py3-none-any.whl", hash = "sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7"}, + {file = "tqdm-4.59.0.tar.gz", hash = "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33"}, ] typed-ast = [ - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, - {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, - {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, - {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, - {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, - {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, - {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, - {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, - {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, - {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, - {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, - {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, - {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, - {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, - {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, + {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, + {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, + {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, + {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, + {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, + {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, + {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, + {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, + {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, + {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, + {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, + {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, + {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, + {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, + {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, + {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, + {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, ] typing-extensions = [ {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, @@ -967,6 +993,6 @@ wcwidth = [ {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] zipp = [ - {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, - {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, + {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, + {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, ] diff --git a/pyproject.toml b/pyproject.toml index 3e4a4e0..f2c965a 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "geosardine" -version = "0.11.0-alpha0" +version = "0.11.0-alpha1" license = "BSD-3-Clause" description = "Spatial operations extend fiona and rasterio" authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"] @@ -10,6 +10,7 @@ readme = "README.md" include = ["CHANGELOG.md"] classifiers = [ "Development Status :: 5 - Production/Stable", + "Programming Language :: Python :: 3", "Intended Audience :: Science/Research", "Topic :: Scientific/Engineering :: GIS", "License :: OSI Approved :: BSD License", @@ -24,13 +25,16 @@ shapely = ">=1.6.4,<2.0.0" tqdm = "^4.48.2" numba = "^0.51.2" click = "^7.1.2" -pip = ">=20.0.0" -gdal = ">=3.0.4,<3.1.4" +gdal = "^3.0.4" fiona = "^1.8.13" rasterio = "^1.1.2" opencv-python = "^4.4.0" [tool.poetry.dev-dependencies] +gdal = { path = "../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" } +fiona = { path = "../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" } +rasterio = { path = "../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" } +pip = ">=20.0.0" pytest = "^5.2" black = "^20.8b1" isort = "^5.5.3" diff --git a/tes.tif b/tes.tif new file mode 100644 index 0000000000000000000000000000000000000000..3f321872fb531206dd4118dd5d1dee64d4c75e22 GIT binary patch literal 9273 zcmZ{}c|29^_dZT2qLft1kVG`2B8e`uWS-7^&fe!BDWNFRKr~46ppc<7m_nqC6{SQe z4fGgGsE{b4(f59y-}{fxKfnEYZENj)ZhP;0?X|A!TK8VJZlRd8n3&j9F)?uoF>&H) zkzM?Mz8dkz{m%#SCI09CJ8t~{@u!MQij5=Zn#ex=|D2!kKVO-gpGo|G$E=zYDxva! z#<=~@mmt4Qj*=7m*LIM7U$mUqcw&E&J@=r5m^!fw$&K?4%Kdj8KjPmwIPSlv-%0$) z%j3i*kTLs+|L+z)4|Ihw+@c;XV^0~^!zrQx7&ARum{dW`pFFNE7 zlK=YS#K@HYzjGvf;$q!X#HDW>{P+Ij|2sZ5PewZL;J^PP`=1pPJLDf6r+RrS$Piq0 zXPPl=+|*aC*d?}PxxS%+p;&d|=Gd~$p7=QTx4Edv15<`_ubUcqK-jfPyZ)d%vWjfP zm8#sZqx6Wf!GJ5ym&k^VO1nbkg_W|uybCOPy_fT)oH5zztZG$@1NN6jh$p11$3~xZ zrAxfm!9;7f?RP61%o9Doo<>`tUQX-jk7f%jxAs3ex7i$uw5^y}ggK_q(v}ytn}dBy zXWqr%7T9e*@@3W|D}3BYuB>8_6-Az#%ab}2w|em z=1u6aUrgLxk-B7~KMM*jE%CKaSva~T{-O08HWYuVkMxMxDAStLB6#eH!r$+&GmJf< zXf%0>U$O^E5>=DG54hvcab|qAo;$1u!VXpn+z^&KiBIix#iMaXxz3R;aJW)o_$|a4 z*Y;Rm`+Ca}HCkZ}ul()tSn`WQkcJ)V*AJeV(QktZjJq2WzFMK!Wv{k9!xDu>(ees5 z77&b2dY<>e9K9GuIe3jL|-Qj1w)K6E=6X$1siO3)IgsP6r z$jE&L1~x`LUme86RE@lutr9HoT3)F}?`6TW-nbVZSny-d-Syst4e!cnf*A+c7>m#h z{awL^!LY91q2&xHho~wkWqab7d!4<~3{QL?%DUGQ;DJJmZ!c#QxnoNS_h8g#H>lkY zp5QC*hOOyksY_K|5q!2kvUR2lI+keg&Br;zBKQ$&N~Hs$$IK1xhpk8C4da?I%XOf_ z``s^C+hAtBz53*IE9}lPUG06&5=j&_`Gtuk*wOaO{uElGUQGYqn1nU7+q-H~rrN@6 ztVe1=z8wU2U;1R`I6!~HgcGYbIODe2(y+;cE=axk+c!w$hA$U4eK>#99qxnt+^}{J zeC#pUw(Pwp4qsE*IaYQt2H)csIsuDak;7fB^JKhp8d#}!bZLL4HwT% zY`mCv<><6qY^;8gGi}W`Ha1jNntjvcAom7iv1=v+V*R%!7A#_*pS^agQ;H{s8V}^e zNOcn6;Yf=*{FEZMp} z;F1&GZ1Rns72<$u*3LtLto3+3??_I6&^j1r>u<36Xahsf#8vBitzp8p#@s8`h{&HH ze4}fF;cVCR>nCk7Cv5uCu^c5{3nfoAv#|4* z*&j1UHf(Y#UUy`%QJg$$tZ;-4|KlI`$FJZ(LM;2HhBpUK4V%-2u^iL{?YzTU%!JPq z`Mc+e7&sVnQOjW!1B#JPq{e4@V(Y+G?F5p)ezDfMU3?F`a$oAUJk=fVj9*Y6pSdC7 z>OG^{epe*A&)K$O%mroH&Alt7T%f+YYi6RfGjd;E(NtULh~3Fnx{V?B;B@a-(^6TF z`jLkNY3uCZHTlPP^Z9nTG&`*OWsM!oA6i-OTxE~6XFi{6-5t>xTH>&GhclkZAKKT} z?Sio3t!1O%Yxt(HQT4Sr_`q!Rl-8dX) zvWDQ;v~>>~&v>A2gS^#)Hg_zm5$*4v?T$HZ?^oomCwM zOuRqZ+M+j)3GXiXE!Ei!*!)b~yq(nLNTE^8JW`iypT_KYKY{Sbrj@5Z`FNmKNozFg zjyq;NAMlr&=8nZq`fiDSZg|}JF5+XIEAni=&AV*x3ZC)#%8IWpIARf@zo^~?u1c?S zWrkgF_3*^N3NMnEp*6+2s&2SnnWUUC#T`et7VWQJ-~kohBL4^%PtZNb1j4NhIH#pA z__~V;#p3LvpEj_dw(Ww|G+j2bE=Ic~y=G%5Fu+NhL-J#{;&8zO4wm|S-eo+4i(p3b z^Gj}AxIDF7L`85Br4S`LoWezw$_d?!0xlRKKW}&4;bMt={>&Nox$q8lPrXyY#g(j+ z%f@xE@b#gpM!`82l69^%AGBscI4#>`LO&Ca$B7>pcZ`VyfqmGf`Aif$PK!E!n*rWK zvzS@t3=FN54hnnZ2}j%M7d`Ae(S5sDW=EX|G$vZ@u4j4Rw#En@IOLAdNqLdS)7>%C zCgekAq&t`%y*G7Y-SJ$o^wpN9?$~?I!Mx4R14BzB_166Lz<^bEf=TvCKg{=3Ek)$(R zylhu<_kF{KeD&*Xh0;9uBrogl)8Qd?z{GaK8Xj8RKBt|t_ya#!e5H&Y(i z@9aM`=<{GC!Bsmuj|Z_J^^ck1Y^a~PCzS{`{5Y)LonmbKW_^7dT*iXZs=u4}Z)4%3 zj9+{Bd=~EOZb_Tdz{Irkjw-vOnAl+a%4MrA6IEAlR2Q`~K<^sAaOeyJ*Txh+SbH$A zMLxbsU7LX!zGq$K6c}iVj@4>VB{%}dX)9eAkf6MGm*+BI8ZdR_qahQ9Zt?T4b}*r~ zbuVHGuC#09nH(cLRARA)E?mq(`inDbZ#Q!gU(Ot^3gY6_oD~-}`nVX1@nr7GN-Y2ejE$z(5EGr16fF| zWVbnbuwZrbX&A$nh3!Uqdv`jrutbfW9=n+Z^BYl5Dz36{eZuTtdgzaj-%^<9eYDsSjtVw){>miVy9$zcGjh&Ca_rM?MfMXSwW@B_Fr; zR!cS?;zRT1oq&6{_-OLlH`%{~T`SW3k`(c`S7&+!qS@S|*Y2p^xy_SI`Sk?Y*kyIwS(k4u4)FB*UIuzi;7zVH_$-=>I~re<+4 zl$5ik;3x-;^B3e_F_95x-aXg~OBEGok@X=;^eN#~mA0tUysJ(Lqh_scgxf(8j zZ=8vCX{i7=!3SmkMwz{9MzMAAHnS9G!col8=hZk1pRm%tsPObwime zA9;FV^V5|1STSUy-AC|U%r2u$V=))8qtl<&s}kJzkL?|q%7yj%uG~f$E}~ERe;pjp z#oE))w#v$KksDvNQeTM+p9L=#7wB@)oanW0%#+N!Fy8j^Q7+gk@@rl-aM5nRJaftl z9zM4FT@zj5!I)Qg%c>`gW~Lt%QyyNhP~D0oWf^HMic zxH__Vf{Z(bA3lNK@~{C@64!GBX0B@r1TYs+)5>nDyM;sg;Z+l%)b$@v_l z#hN|iV#61!x?69#n8vXDQud1rkB95ZV>Eb}RVwjG$lyV3-oy2~NjsjJM<=Hib$>r|zaK3e`~Y=o_M7ArS0c zyNrgwAhsLZL}G&+=L859U;_`T}!h_s_2R#$h*V=)akla!UxvNRly&G1bB zMB&KUZD$`;Q|K{&*K+I{1$T?Ez@cage{#%f`4k0}N|APv5rsa+dT6 zVBCdXK|aaX=Q6E(Svmp?2G$n7Y2ag-%Gc%qQrB`f{!Tb&#e+e}L-huGGQZVpFC1qQ z+&8S~TIgeV?XmH!@yy~=||Pw$A%YaX7PSU+-(8omTRl=7m&DoR6fYrOW{&)K1;rt!uO|&58DiB^ktTnZ$D0B zG%!_PqKQWGjpM;=c_AhS8fE$F2$6K$pi)9Zh#M{+BspU={LfhY-CRS%)$iA8_6Zs$ z3&bC;;m}C`eB6e!l!l|;gtIp%&`5i9$=LTjg(VZ4PU+tv@mcP2P83HWX5Oh+$2XDq zq^kBUFr{#4STbmIGKHHH9u7>pBfyoW;2l+b0h(?teqSptfYfrOmIvv4bn=!gK`9Sg zrbT%jt>r;yK-@f#@I&>@*7P%fc@Um)*K5$^qad9T@ z!WR400&I@)DiJ>?fS^=Ab+ZJ8GY3q+lv+`UEqVNY`e_OUQoa&9dnr_vzvUP>(wJ|$ z=jiTY^8QC-OE)YOqH@muH&ZSMaXZNAN8khz{4+~6&k9Aj6Y(WSEmef)-I1Bsb42(N zuXq08E)nKsr&}DB5+Tsj)8ep~5RY$mo|deq;j-}CD`60gmM06d&Y01dl;ETsyMRV( zeRLw(ONv1Y=LU9cSJmPAw54I__HQD9M{<%bg!|wM6*zg&r|a5ur?V?H|cWURXI+ zt1C-+VRUfxch6og>`9q4Kg-4o>qUZ&+h;`xh3oZeF+!;36px)up^;IbF}q94~ONi!e zwxy6!bkovTnnJPO>9M6J1eo}Z`)o)-0PRf?V)riavE}&qBjaE3VYVQ-=J608JJwpS z`Kv^HOa+0|$ z-cqnXVWl&;ibmvvjwhZ;G}cdyc=S_Fh{Dd;WqAjLFetpb_#bHzHZD4HFZYB9x8pwQ zSk3kVksQBFQ@oJf&3H0H(HmAJ1&VL^-dL1}8*8k*(JLiy<>BQ8=Oe3U_uU}%xT~{h zp$U!qH%9I`-6MGCW4`c99R=4<{I1~d6k2t+%-tzRLtSa?nYauM->WHm_V-hmcCt!* zw1V*El(tj*4pH!3zhrBrHNo`|)ybd4DCqJWHD-qhur$K)QcE8ncKx$s_xKZ?ka3CS zq9j1r0a(m179e=Q{Ah%?00xQ^eX8OG*v>53yQ)b5jpsiGuPKuJRQ{2cZ%IKvY`AXA z9tw1`^tI|r3cG)-o9d%LLsu=J^r=6M)J?(GzhBXaa~Ruu&PIp}**OcV9tbfg5pX+h zJ*ltCH5vPwL@;W|Wt9YYAwMP|Xrr_@et6jxW+!{&s?(og!5kkf-Z-bjY`qWW7}q`c z7V3>n`bNIH)J52vyZ@7g6pfKH#biB{Lfgavy&1WL*RDq{D(<83JTJ|IoZ=J$(I}*GSAm$=Q0*TfX)z!q+{89 zlpB`&1`~YFys=nDi|ChoVN+hXZxi6ULqNNJvHIKoQ8pcr}|8S)3aB%?0idbI;*DZ$V)#V z?1S&`*Z(Ml%j{dN`~VR=Xu&cOZ#4cfxK|M1 zgI801{*K-C!M#aSyv>z;ppzeiXD>u}d?{>q?@<~nkInqH;U$Hp&y7p>v=e;k_wQUq z^2crRl=%--X_T(+X&z9dp^+YX?))GHpB!lktzrrnqMXg5f=FFt4V|LZDWrtgF(Tsx z_rdV%X$ppLM8^^f#jsTfUOI8;$I-3=zRH%vvm-#Oc#M$4!$@c;R$jOzIp> zZ)|_u^X__~H>3vl9$Kd7gEji~7mo0KFw@aY;mSjAG-XViYC4bLmuTjjNFO1NeSLX- z<3Sp)jH8Vl*AqV7=_T1}PNN;Z6<K>gnBsz88r7Yz@ zf~(ZH~l~LiQYeQ>49N5AN5DqcuLpvpddV=nz5P(zQL}fz6%2E@Y0cf zRwlryI{}qaodQgj3lp3qdDJ|>HSr_*XL_x3Ubhp42R+qJD~S$z?{%(HSVUn?N@T&r z-y~ix3vIY|G}Pq14mqUJSXHU{%yPUCy$rD}{H;PLZlAi-rCW$y^0%%(p+ty!vi1A3 zb`fk2m{-LS+)m#z6sOnb1(|2E!7Yy7h^TexZ@u7+u8uTjQIa>ly$otiRq{sb&yeqO zGG2)1cDj_l6T*Gl+DRXjgqR-4G}O(fp&S~Y#M?!qN8(}a2WJ|O*guw*kT``5zlfIq zheGa!7#uV*xKNP9c2i9yc>$35DA2O^?S2ZtDl7RoIg_ zMYkHa^KMa?KjJ+8>IkX7d2y*q7KEn|7`Hq z3*{@5z2kRy;p5pa`lVGOsK&DG_K1nFK!ZU)4{4&8Ok1p#cr*0FS8#`vCNBWt8NV$g=PXsvfPH*#{PCokVc03vrJqWNCV2T5KH-H;aSEEPfS#L>##Bu~y*=Qc)~ zd13D8_f$iM7aBY#D&98n!u~nqOY-{(?ps+^xCIj(@ydwS{3L`?#h1!=8-#Gn_ir-% zMWeCz*wTZ^G=^(b<_ucXcs9656h)p-)_D27-BA>t3d`n3k@sJ?wS4w9(w_|Fz8(2N z`fmTc&=V8&c=*IMYPd_*G3^?5?$$oRLH4T`*5^mrFx$9GvF5P=lXhG;dDAL@ZE8)(x=DxdTy+J<`w7wgDJ>JuxTcJ!5+&HY0V@RRyqQ^FIE`=BKe~5X< zP?)Xtc}LA%(x?CYb7-CAXn2GWPLq-JjGCUH{@Sa$0#Iqp8_K7-U>nX&Sp zc7o?yLdQuxvZG-7_8&2BFyRZG&s=}PADhBbA{E{ey?cJ7xOWbXptu!~%~W&MT`0IBu6?e3``i`s1Iw<4IoK*E?G< zh45v%hryrI<0%A}ZrRCJAv`f_G_;xMvd1Mg7RLn?5;o=J>l`I|imBOniRiawe^%b! z_ltsm{GM$UgqQESZHS${gVaO6oVvnIq6f`xcmHhpIjEktWq#*a`FAp-Sxyq+&31TA&YeD6bo)9csh zfLyyHz2-%zN3!acfLp2h>#xQNvRPknRGCa}V33^pw-VrP@SD@5mY zX9JnvxBl0+M`;{Vt=X4H>ZfP9Qo+b9A)e#vBZV14jIkqw7D@ysQR`J2cJ(Utv>OMh5X3cPu#am82dU0mWVS^V7ws9U&z4sH_-|K zk_YW)uPDDeY3FMM=(|O4MlB>~Stuens-f`p-3PIEBgKXOzViDXj7RsZ5hT zY*pJKri>mRY6;^uH^`Ci1GfrHjT<@GbTFrAYcd<2qiXV}$@jkA88R^+{Fzv%?WdBO W$bfFu1J2e7 Date: Tue, 11 May 2021 12:43:13 +0700 Subject: [PATCH 3/8] add clip2bbox --- conda.recipe/meta.yaml | 4 ++-- geosardine/raster.py | 40 ++++++++++++++++++++++++++++++++++++++++ pyproject.toml | 2 +- 3 files changed, 43 insertions(+), 3 deletions(-) diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 0dd6640..b65449e 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,5 +1,5 @@ {% set name = "geosardine" %} -{% set version = "0.11.0a1" %} +{% set version = "0.12.0a0" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz - sha256: af785d73b36b1b0f70080970f19d7e6027365b39ea05d19c01c084da255264ce + sha256: ddac3c95763b878c5454f2717b800b62c2f7bae3a4a372cbba00404e6c7c0fcc build: noarch: python diff --git a/geosardine/raster.py b/geosardine/raster.py index 9253a15..7bdbce1 100644 --- a/geosardine/raster.py +++ b/geosardine/raster.py @@ -912,6 +912,46 @@ def __py_resize(self, height: int, width: int) -> "Raster": epsg=self.epsg, ) + def clip2bbox( + self, x_min: float, y_min: float, x_max: float, y_max: float + ) -> "Raster": + """Clipping into bounding boxes + + Returns + ------- + Raster + Clipped raster + """ + if x_min < self.x_min: + raise ValueError( + f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} + but input is {x_min},{y_min},{x_max},{y_max}""" + ) + + if y_min < self.y_min: + raise ValueError( + f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} + but input is {x_min},{y_min},{x_max},{y_max}""" + ) + + if x_max > self.x_max: + raise ValueError( + f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} + but input is {x_min},{y_min},{x_max},{y_max}""" + ) + + if y_max > self.y_max: + raise ValueError( + f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} + but input is {x_min},{y_min},{x_max},{y_max}""" + ) + + row_min, col_min = self.xy2rowcol(x_min, y_max) + row_max, col_max = self.xy2rowcol(x_max, y_min) + + clipped = self.array[row_min:row_max, col_min:col_max] + return Raster(clipped, self.resolution, x_min, y_max) + def split2tiles( self, tile_size: Union[int, Tuple[int, int], List[int]] ) -> Generator[Tuple[int, int, "Raster"], None, None]: diff --git a/pyproject.toml b/pyproject.toml index f2c965a..a7be353 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "geosardine" -version = "0.11.0-alpha1" +version = "0.12.0-alpha" license = "BSD-3-Clause" description = "Spatial operations extend fiona and rasterio" authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"] From fcd586c2bd1fca283f8061279f046ba4c3f12798 Mon Sep 17 00:00:00 2001 From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com> Date: Fri, 18 Jun 2021 11:14:24 +0700 Subject: [PATCH 4/8] Support any epsg distance (#19) * add support for another epssg add support for another epssg in geographic distance calculation * Update CHANGELOG.md * remove local dev dependency --- CHANGELOG.md | 14 +- README.md | 5 + geosardine/_utility.py | 221 ++++++++++--- geosardine/interpolate/idw.py | 22 +- poetry.lock | 468 +++++++++++++-------------- pyproject.toml | 8 +- tes.tif | Bin 9273 -> 0 bytes tests/idw/test_idw_file_8327.geojson | 12 + tests/test_geosardine_interpolate.py | 15 +- 9 files changed, 467 insertions(+), 298 deletions(-) delete mode 100644 tes.tif create mode 100644 tests/idw/test_idw_file_8327.geojson diff --git a/CHANGELOG.md b/CHANGELOG.md index cdcbe76..1097f9e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.13.0] - 2021-06-18 + +### Changed +- support any epsg code for calculating distance by using each datum semi major and semi minor axes + +## [0.12.0-aplha] - 2021-05-19 + +### Added +- clip2bbox + ## [0.11.0-aplha1] - 2021-03-19 ### Added @@ -161,7 +171,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support multiple layer in raster calculation -[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.11.0-alpha0...HEAD +[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.0...HEAD +[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0 +[0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0 [0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0 [0.10.2]: https://github.com/sahitono/geosardine/compare/v0.9.5...v0.10.2 [0.9.5]: https://github.com/sahitono/geosardine/compare/v0.9.4...v0.9.5 diff --git a/README.md b/README.md index 5622bec..1607ab5 100644 --- a/README.md +++ b/README.md @@ -130,6 +130,11 @@ raster_3 = raster - 2 raster_3 = raster * 2 raster_3 = raster / 2 +### plot it using raster.array +import matplotlib.pyplot as plt +plt.imshow(raster_3) +plt.show() + ``` diff --git a/geosardine/_utility.py b/geosardine/_utility.py index 377ee5b..66638b7 100644 --- a/geosardine/_utility.py +++ b/geosardine/_utility.py @@ -7,6 +7,7 @@ import numpy as np import rasterio from affine import Affine +from osgeo import osr from rasterio.crs import CRS @@ -20,6 +21,18 @@ def calc_affine(coordinate_array: np.ndarray) -> Affine: return affine +def get_ellipsoid_par(epsg: int) -> Tuple[float, float, float]: + crs = CRS.from_epsg(epsg) + semi_major = float( + osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 1) + ) + inverse_flattening = float( + osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 2) + ) + semi_minor: float = (1 - (1 / inverse_flattening)) * semi_major + return semi_major, semi_minor, inverse_flattening + + def save_raster( file_name: Union[str, Path], value_array: np.ndarray, @@ -83,10 +96,52 @@ def save_raster( print(f"{file_name} saved") -@singledispatch def harvesine_distance( long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + epsg: int = 4326, +) -> Optional[float]: + + """Calculate distance in ellipsoid by harvesine method + faster, less accurate + + Parameters + ---------- + long_lat1 : tuple, list + first point coordinate in longitude, latitude + long_lat2 : tuple, list + second point coordinate in longitude, latitude + epsg : int, optional + epsg code of the spatial reference system, by default 4326 + + Returns + ------- + Optional[float] + distance, if None then input is not np.ndarray, tuple or list + + Notes + ------- + https://rafatieppo.github.io/post/2018_07_27_idw2pyr/ + """ + + semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) + + return _harvesine_distance_dispatch( + long_lat1, + long_lat2, + semi_major=semi_major, + semi_minor=semi_minor, + i_flattening=i_flattening, + ) + + +@singledispatch +def _harvesine_distance_dispatch( + long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], + long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + semi_major: float, + semi_minor: float, + i_flattening: float, ) -> Optional[float]: """ Calculate distance in ellipsoid by harvesine method @@ -98,11 +153,17 @@ def harvesine_distance( first point coordinate in longitude, latitude long_lat2 : tuple, list, numpy array second point coordinate in longitude, latitude + semi_major : float + ellipsoid's semi major axes + semi_minor : float + ellipsoid's semi minor axes + i_flattening : float + ellipsoid's inverse flattening Returns ------- - float - distance + Optional[float] + distance, if None then input is not np.ndarray, tuple or list Notes ------- @@ -113,19 +174,18 @@ def harvesine_distance( return None -@harvesine_distance.register(np.ndarray) +@_harvesine_distance_dispatch.register(np.ndarray) @numba.njit() -def _harvesine_distance(long_lat1: np.ndarray, long_lat2: np.ndarray) -> float: - radians = math.pi / 180 - long1, lat1 = long_lat1 - long2, lat2 = long_lat2 - - long1 *= radians - long2 *= radians - lat1 *= radians - lat2 *= radians +def _harvesine_distance( + long_lat1: np.ndarray, + long_lat2: np.ndarray, + semi_major: float = 6378137.0, + semi_minor: float = 6356752.314245179, + i_flattening=298.257223563, +) -> float: + long1, lat1 = np.radians(long_lat1) + long2, lat2 = np.radians(long_lat2) - earth_radius_equator = 6378137.0 # earth average radius at equador (km) long_diff = long2 - long1 lat_diff = lat2 - lat1 a = ( @@ -133,26 +193,89 @@ def _harvesine_distance(long_lat1: np.ndarray, long_lat2: np.ndarray) -> float: + math.cos(lat1) * math.cos(lat2) * math.sin(long_diff / 2) ** 2 ) c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) - distance = earth_radius_equator * c - return np.abs(distance) + return np.abs(semi_major * c) -@harvesine_distance.register(list) -def __harvesine_distance(long_lat1: List[float], long_lat2: List[float]): - return _harvesine_distance(np.array(long_lat1), np.array(long_lat2)) +@_harvesine_distance_dispatch.register(list) +def __harvesine_distance( + long_lat1: List[float], + long_lat2: List[float], + semi_major: float, + semi_minor: float, + i_flattening: float, +): + return _harvesine_distance( + np.array(long_lat1), + np.array(long_lat2), + semi_major, + semi_minor, + i_flattening, + ) -@harvesine_distance.register(tuple) +@_harvesine_distance_dispatch.register(tuple) def __harvesine_distance( - long_lat1: Tuple[float, float], long_lat2: Tuple[float, float] + long_lat1: Tuple[float, float], + long_lat2: Tuple[float, float], + semi_major: float, + semi_minor: float, + i_flattening: float, ): - return _harvesine_distance(np.array(long_lat1), np.array(long_lat2)) + return _harvesine_distance( + np.array(long_lat1), + np.array(long_lat2), + semi_major, + semi_minor, + i_flattening, + ) -@singledispatch def vincenty_distance( long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + epsg: int = 4326, +) -> float: + """Calculate distance in ellipsoid by vincenty method + slower, more accurate + + Parameters + ---------- + long_lat1 : tuple, list + first point coordinate in longitude, latitude + long_lat2 : tuple, list + second point coordinate in longitude, latitude + epsg : int, optional + epsg code of the spatial reference system, by default 4326 + + Returns + ------- + float + distance + + Notes + ------- + https://www.johndcook.com/blog/2018/11/24/spheroid-distance/ + """ + + semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) + + return _vincenty_distance_dispatch( + long_lat1, + long_lat2, + semi_major=semi_major, + semi_minor=semi_minor, + i_flattening=i_flattening, + ) + + +@singledispatch +def _vincenty_distance_dispatch( + long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], + long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + epsg: int, + semi_major: float, + semi_minor: float, + i_flattening: float, ) -> Optional[float]: """ Calculate distance in ellipsoid by vincenty method @@ -164,6 +287,12 @@ def vincenty_distance( first point coordinate in longitude, latitude long_lat2 : tuple, list second point coordinate in longitude, latitude + semi_major : float + ellipsoid's semi major axes + semi_minor : float + ellipsoid's semi minor axes + i_flattening : float + ellipsoid's inverse flattening Returns ------- @@ -178,23 +307,22 @@ def vincenty_distance( return None -@vincenty_distance.register(np.ndarray) +@_vincenty_distance_dispatch.register(np.ndarray) @numba.njit() -def _vincenty_distance(long_lat1: np.ndarray, long_lat2: np.ndarray) -> float: +def _vincenty_distance( + long_lat1: np.ndarray, + long_lat2: np.ndarray, + semi_major: float = 6378137.0, + semi_minor: float = 6356752.314245179, + i_flattening=298.257223563, +) -> float: # WGS 1984 - earth_radius_equator = 6378137.0 # equatorial radius in meters - flattening = 1 / 298.257223563 - earth_radius_poles = (1 - flattening) * earth_radius_equator + flattening = 1 / i_flattening tolerance = 1e-11 # to stop iteration radians = math.pi / 180 - long1, lat1 = long_lat1 - long2, lat2 = long_lat2 - - long1 *= radians - long2 *= radians - lat1 *= radians - lat2 *= radians + long1, lat1 = np.radians(long_lat1) + long2, lat2 = np.radians(long_lat2) distance = 0.0 @@ -237,10 +365,7 @@ def _vincenty_distance(long_lat1: np.ndarray, long_lat2: np.ndarray) -> float: else: lambda_old = lambda_new - u2 = cos_sq_alpha * ( - (earth_radius_equator ** 2 - earth_radius_poles ** 2) - / earth_radius_poles ** 2 - ) + u2 = cos_sq_alpha * ((semi_major ** 2 - semi_minor ** 2) / semi_minor ** 2) A = 1 + (u2 / 16384) * (4096 + u2 * (-768 + u2 * (320 - 175 * u2))) B = (u2 / 1024) * (256 + u2 * (-128 + u2 * (74 - 47 * u2))) t = cos_2sigma_m + 0.25 * B * (cos_sigma * (-1 + 2 * cos_2sigma_m ** 2)) @@ -251,19 +376,23 @@ def _vincenty_distance(long_lat1: np.ndarray, long_lat2: np.ndarray) -> float: * (-3 + 4 * cos_2sigma_m ** 2) ) delta_sigma = B * sin_sigma * t - distance = earth_radius_poles * A * (sigma - delta_sigma) + distance = semi_minor * A * (sigma - delta_sigma) return np.abs(distance) -@vincenty_distance.register(list) -def __vincenty_distance(long_lat1: List[float], long_lat2: List[float]): - return _vincenty_distance(np.array(long_lat1), np.array(long_lat2)) +@_vincenty_distance_dispatch.register(list) +def __vincenty_distance( + long_lat1: List[float], long_lat2: List[float], *args, **kwargs +): + return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs) -@vincenty_distance.register(tuple) -def __vincenty_distance(long_lat1: Tuple[float, float], long_lat2: Tuple[float, float]): - return _vincenty_distance(np.array(long_lat1), np.array(long_lat2)) +@_vincenty_distance_dispatch.register(tuple) +def __vincenty_distance( + long_lat1: Tuple[float, float], long_lat2: Tuple[float, float], *args, **kwargs +): + return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs) @numba.njit() diff --git a/geosardine/interpolate/idw.py b/geosardine/interpolate/idw.py index dae28a3..f43d4cf 100644 --- a/geosardine/interpolate/idw.py +++ b/geosardine/interpolate/idw.py @@ -9,7 +9,7 @@ import numpy as np from rasterio.crs import CRS -from .._utility import calc_affine, calc_distance, calc_extent +from .._utility import calc_affine, calc_distance, calc_extent, get_ellipsoid_par from ..raster import Raster from ._utility import InterpolationResult @@ -22,6 +22,9 @@ def _idw( distance_function: Callable, power: Union[float, int] = 2, distance_limit: float = 0.0, + semi_major: float = 6378137.0, + semi_minor: float = 6356752.314245179, + i_flattening=298.257223563, ) -> np.ndarray: interpolated = np.zeros(unknown_coordinates.shape[0]) for i in numba.prange(interpolated.shape[0]): @@ -140,6 +143,7 @@ def _idw_array( raise ValueError(f"y_min {y_min} must be smaller than x_max {y_max}") crs = CRS.from_epsg(epsg) + semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) distance_calculation = longlat_distance if crs.is_projected: @@ -167,20 +171,15 @@ def _idw_array( distance_function=calc_distance[distance_calculation], power=power, distance_limit=distance_limit, + semi_major=semi_major, + semi_minor=semi_minor, + i_flattening=i_flattening, ).reshape(rows, columns) return Raster( interpolated_value, transform=calc_affine(interpolated_coordinate), epsg=epsg ) - # return InterpolationResult( - # interpolated_value, - # interpolated_coordinate, - # crs, - # (x_min, y_min, x_max, y_max), - # source=source, - # ) - def idw_single( point: List[float], @@ -238,6 +237,8 @@ def idw_single( if len(point) > 2: raise ValueError("only for single point, input can't be more than 2 items") crs = CRS.from_epsg(epsg) + semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) + distance_calculation = longlat_distance if crs.is_projected: distance_calculation = "projected" @@ -249,6 +250,9 @@ def idw_single( calc_distance[distance_calculation], power, distance_limit, + semi_major=semi_major, + semi_minor=semi_minor, + i_flattening=i_flattening, ) return interpolated[0] diff --git a/poetry.lock b/poetry.lock index f7ab116..2f0fb6c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -27,17 +27,17 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] name = "attrs" -version = "20.3.0" +version = "21.2.0" description = "Classes Without Boilerplate" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] [[package]] name = "black" @@ -61,6 +61,14 @@ typing-extensions = ">=3.7.4" colorama = ["colorama (>=0.4.3)"] d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +[[package]] +name = "certifi" +version = "2021.5.30" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + [[package]] name = "click" version = "7.1.2" @@ -85,14 +93,14 @@ dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"] [[package]] name = "cligj" -version = "0.7.1" +version = "0.7.2" description = "Click params for commmand line interfaces to GeoJSON" category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" [package.dependencies] -click = ">=4.0,<8" +click = ">=4.0" [package.extras] test = ["pytest-cov"] @@ -117,8 +125,8 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" toml = ["toml"] [[package]] -name = "Fiona" -version = "1.8.13" +name = "fiona" +version = "1.8.20" description = "Fiona reads and writes spatial data files" category = "main" optional = false @@ -126,38 +134,33 @@ python-versions = "*" [package.dependencies] attrs = ">=17" +certifi = "*" click = ">=4.0" click-plugins = ">=1.0" cligj = ">=0.5" -gdal = ">=3.0.2,<3.1.0" munch = "*" six = ">=1.7" [package.extras] -all = ["pytest-cov", "pytest (>=3)", "shapely", "boto3 (>=1.2.4)", "mock"] +all = ["pytest (>=3)", "boto3 (>=1.2.4)", "pytest-cov", "shapely", "mock"] calc = ["shapely"] s3 = ["boto3 (>=1.2.4)"] test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"] -[package.source] -type = "file" -url = "../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" - [[package]] -name = "GDAL" -version = "3.0.4" +name = "gdal" +version = "3.3.0" description = "GDAL: Geospatial Data Abstraction Library" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6.0" -[package.source] -type = "file" -url = "../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" +[package.extras] +numpy = ["numpy (>1.0.0)"] [[package]] name = "importlib-metadata" -version = "3.7.3" +version = "4.5.0" description = "Read metadata from Python packages" category = "dev" optional = false @@ -169,11 +172,11 @@ zipp = ">=0.5" [package.extras] docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] name = "isort" -version = "5.7.0" +version = "5.8.0" description = "A Python utility / library to sort Python imports." category = "dev" optional = false @@ -186,7 +189,7 @@ colors = ["colorama (>=0.4.3,<0.5.0)"] [[package]] name = "llvmlite" -version = "0.35.0rc3" +version = "0.34.0" description = "lightweight wrapper around basic LLVM functionality" category = "main" optional = false @@ -223,15 +226,15 @@ testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "1.1.1" +version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." category = "dev" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.6" [[package]] name = "more-itertools" -version = "8.7.0" +version = "8.8.0" description = "More routines for operating on iterables, beyond itertools" category = "dev" optional = false @@ -298,14 +301,14 @@ python-versions = ">=3.6" [[package]] name = "opencv-python" -version = "4.5.1.48" +version = "4.5.2.54" description = "Wrapper package for OpenCV python bindings." category = "main" optional = false python-versions = ">=3.6" [package.dependencies] -numpy = ">=1.17.3" +numpy = ">=1.13.3" [[package]] name = "packaging" @@ -393,7 +396,7 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm [[package]] name = "pytest-cov" -version = "2.11.1" +version = "2.12.1" description = "Pytest plugin for measuring coverage." category = "dev" optional = false @@ -402,43 +405,40 @@ python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] coverage = ">=5.2.1" pytest = ">=4.6" +toml = "*" [package.extras] -testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] [[package]] name = "rasterio" -version = "1.1.2" +version = "1.2.4" description = "Fast and direct raster I/O for use with Numpy and SciPy" category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" [package.dependencies] affine = "*" attrs = "*" +certifi = "*" click = ">=4.0" click-plugins = "*" cligj = ">=0.5" -gdal = ">=3.0.1,<3.1.0" numpy = "*" snuggs = ">=1.4.1" [package.extras] -all = ["hypothesis", "sphinx", "numpydoc", "packaging", "ghp-import", "sphinx-rtd-theme", "ipython (>=2.0)", "pytest (>=2.8.2)", "matplotlib", "pytest-cov (>=2.2.0)", "boto3 (>=1.2.4)"] +all = ["sphinx-rtd-theme", "boto3 (>=1.2.4)", "matplotlib", "pytest (>=2.8.2)", "numpydoc", "ghp-import", "ipython (>=2.0)", "hypothesis", "packaging", "sphinx", "pytest-cov (>=2.2.0)", "shapely"] docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"] ipython = ["ipython (>=2.0)"] plot = ["matplotlib"] s3 = ["boto3 (>=1.2.4)"] -test = ["pytest (>=2.8.2)", "pytest-cov (>=2.2.0)", "boto3 (>=1.2.4)", "packaging", "hypothesis"] - -[package.source] -type = "file" -url = "../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" +test = ["boto3 (>=1.2.4)", "hypothesis", "packaging", "pytest-cov (>=2.2.0)", "pytest (>=2.8.2)", "shapely"] [[package]] name = "regex" -version = "2021.3.17" +version = "2021.4.4" description = "Alternative regular expression module, to replace re." category = "dev" optional = false @@ -459,7 +459,7 @@ vectorized = ["numpy"] [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" category = "main" optional = false @@ -490,7 +490,7 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] name = "tqdm" -version = "4.59.0" +version = "4.61.1" description = "Fast, Extensible Progress Meter" category = "main" optional = false @@ -503,7 +503,7 @@ telegram = ["requests"] [[package]] name = "typed-ast" -version = "1.4.2" +version = "1.4.3" description = "a fork of Python 2 and 3 ast modules with type comment support" category = "dev" optional = false @@ -511,7 +511,7 @@ python-versions = "*" [[package]] name = "typing-extensions" -version = "3.7.4.3" +version = "3.10.0.0" description = "Backported and Experimental Type Hints for Python 3.5+" category = "dev" optional = false @@ -540,7 +540,7 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" python-versions = "^3.7" -content-hash = "e26134d6f5e75d077a2a7cd28eaa028e31c6171ae54a47b97db0244aae5627b7" +content-hash = "922a3f4c627233d1b4b78b5bc21e1e9598e22c8202444f035fb849912f63dfa6" [metadata.files] affine = [ @@ -556,12 +556,16 @@ atomicwrites = [ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ] attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, ] black = [ {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, ] +certifi = [ + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, +] click = [ {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, @@ -571,8 +575,8 @@ click-plugins = [ {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, ] cligj = [ - {file = "cligj-0.7.1-py3-none-any.whl", hash = "sha256:07171c1e287f45511f97df4ea071abc5d19924153413d5683a8e4866369bc676"}, - {file = "cligj-0.7.1.tar.gz", hash = "sha256:b2f1f7247d59a5387bd3013a08b9ed6829e96fafa4a6e6292341efdb46fe6220"}, + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, ] colorama = [ {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, @@ -632,36 +636,45 @@ coverage = [ {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, ] -Fiona = [ - {file = "Fiona-1.8.13-cp38-cp38-win_amd64.whl", hash = "sha256:d306e7016ee2f8e5fbfbf0b089f83507fd05e006a1385f10aeb9a0e83496ab65"}, +fiona = [ + {file = "Fiona-1.8.20-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:02880556540e36ad6aac97687799d9b3093c354787a47bc0e73026c7fc15f1b3"}, + {file = "Fiona-1.8.20-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3f668c471fa2f8c9c0a9ca83639cb2c8dcc93edc3d93d43dba2f9e8da38ad53e"}, + {file = "Fiona-1.8.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:54f81039e913d0f88728ef23edf5a69038dec94dea54f4c799f972ba8e2a7d40"}, + {file = "Fiona-1.8.20-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:328340a448bed5c43d119f61f760368a04d13a302c59d2fccb051a3ff021f4b8"}, + {file = "Fiona-1.8.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03f910380dbe684730b59b817aa030e6e9a3ee79211b66c6db2d1c8fe6ea12de"}, + {file = "Fiona-1.8.20-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bef100ebd82afb9a4d67096216e82611b82ca9341330e4805832d7ff8c9bc1f7"}, + {file = "Fiona-1.8.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5e1cef608c6de9039eaa65b395024096e3189ab0559a5a328c68c4690c3302ce"}, + {file = "Fiona-1.8.20-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e72e4a5b84ec410be531d4fe4c1a5c87c6c0e92d01116c145c0f1b33f81c8080"}, + {file = "Fiona-1.8.20.tar.gz", hash = "sha256:a70502d2857b82f749c09cb0dea3726787747933a2a1599b5ab787d74e3c143b"}, ] -GDAL = [ - {file = "GDAL-3.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:9b729d26347b0d0fb51e54e1768c93cde58598f41a3e5684df9ac192c5a47df7"}, +gdal = [ + {file = "GDAL-3.3.0.tar.gz", hash = "sha256:ed314a0b3f8b3729a9f6d8ca23f21473c2ff4a946d1a2969e0a1937bf0f4e700"}, ] importlib-metadata = [ - {file = "importlib_metadata-3.7.3-py3-none-any.whl", hash = "sha256:b74159469b464a99cb8cc3e21973e4d96e05d3024d337313fedb618a6e86e6f4"}, - {file = "importlib_metadata-3.7.3.tar.gz", hash = "sha256:742add720a20d0467df2f444ae41704000f50e1234f46174b51f9c6031a1bd71"}, + {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, + {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, ] isort = [ - {file = "isort-5.7.0-py3-none-any.whl", hash = "sha256:fff4f0c04e1825522ce6949973e83110a6e907750cd92d128b0d14aaaadbffdc"}, - {file = "isort-5.7.0.tar.gz", hash = "sha256:c729845434366216d320e936b8ad6f9d681aab72dc7cbc2d51bedc3582f3ad1e"}, + {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, + {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, ] llvmlite = [ - {file = "llvmlite-0.35.0rc3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b3b8b059f0449907c0376c7cecf6e0b4bdacc13797ab9f3cc64bb602e31c0a8"}, - {file = "llvmlite-0.35.0rc3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:2d61fe18cf7b27f06e7663bd94d330d909e12a7595f220c7bff0f43ea271460c"}, - {file = "llvmlite-0.35.0rc3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ecd9ba96592fb5f3a9b1645cc7c73b8a1f2e74573f2afe1af15f8d13556e6a4b"}, - {file = "llvmlite-0.35.0rc3-cp36-cp36m-win32.whl", hash = "sha256:d80e892bf1278f6bc92e892e92f4b9170e02a1dfd9bbd618e23e76c47a1be3f7"}, - {file = "llvmlite-0.35.0rc3-cp36-cp36m-win_amd64.whl", hash = "sha256:ea727570ce8ca621959df9fb39bb8cff103d9817bd5c9ed5980607fa3b67d0c4"}, - {file = "llvmlite-0.35.0rc3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ef23850e8720b52f3d5d5dd86566a9351f1d81d0c06cdb92f21c364aab53f4a8"}, - {file = "llvmlite-0.35.0rc3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b1faf7c3ca9d3a5c95cc47682a3efab1a9f64e2862a5570d922e6ec216e21c74"}, - {file = "llvmlite-0.35.0rc3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6d27b8c12c03dacd84e04db6c4bcf848d4aa7cbba51ee0625e46f7ced89ac603"}, - {file = "llvmlite-0.35.0rc3-cp37-cp37m-win32.whl", hash = "sha256:c8748823e3901833c8aaec89a46d38e302a43a2ffa944c2edcbd60ef7bf521ee"}, - {file = "llvmlite-0.35.0rc3-cp37-cp37m-win_amd64.whl", hash = "sha256:4cae79abf76b9ed801a0a27863c94c844712605868ff6802a2f402051ddf15c4"}, - {file = "llvmlite-0.35.0rc3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:77a645b4ea84267fd497e45db531237dea097e2a0c3f0fa8ce66fbe6cd022924"}, - {file = "llvmlite-0.35.0rc3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:fd0d534ded3a757611a2334bc9b1f5d2415bb34fc177793805ed4eac91cce0a5"}, - {file = "llvmlite-0.35.0rc3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b3ac274cb3bd3caecf8fdfd15c99f293b187a8ea8be2c7706fb6a32d9fa4e284"}, - {file = "llvmlite-0.35.0rc3-cp38-cp38-win32.whl", hash = "sha256:ee4cb5fe63b547cdfd77184e1d8d3992ede14ede47c178434b60851603c05896"}, - {file = "llvmlite-0.35.0rc3-cp38-cp38-win_amd64.whl", hash = "sha256:c7c070bf9e194d3d731bdd7b75c28e39efcdac5ea888efc092922afdec33e938"}, + {file = "llvmlite-0.34.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:11342e5ac320c953590bdd9d0dec8c52f4b5252c4c6335ba25f1e7b9f91f9325"}, + {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5bdf0ce430adfaf938ced5844d12f80616eb8321b5b9edfc45ef84ada5c5242c"}, + {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e08d9d2dc5a31636bfc6b516d2d7daba95632afa3419eb8730dc76a7951e9558"}, + {file = "llvmlite-0.34.0-cp36-cp36m-win32.whl", hash = "sha256:9ff1dcdad03be0cf953aca5fc8cffdca25ccee2ec9e8ec7e95571722cdc02d55"}, + {file = "llvmlite-0.34.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5acdc3c3c7ea0ef7a1a6b442272e05d695bc8492e5b07666135ed1cfbf4ab9d2"}, + {file = "llvmlite-0.34.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb96989bc57a1ccb131e7a0e061d07b68139b6f81a98912345d53d9239e231e1"}, + {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6d3f81992f52a94077e7b9b16497029daf5b5eebb2cce56f3c8345bbc9c6308e"}, + {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d841248d1c630426c93e3eb3f8c45bca0dab77c09faeb7553b1a500220e362ce"}, + {file = "llvmlite-0.34.0-cp37-cp37m-win32.whl", hash = "sha256:408b15ffec30696406e821c89da010f1bb1eb0aa572be4561c98eb2536d610ab"}, + {file = "llvmlite-0.34.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5d1f370bf150db7239204f09cf6a0603292ea28bac984e69b167e16fe160d803"}, + {file = "llvmlite-0.34.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132322bc084abf336c80dd106f9357978c8c085911fb656898d3be0d9ff057ea"}, + {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:8f344102745fceba6eb5bf03c228bb290e9bc79157e9506a4a72878d636f9b3c"}, + {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:05253f3f44fab0148276335b2c1b2c4a78143dfa78e6bafd7f937d6248f297cc"}, + {file = "llvmlite-0.34.0-cp38-cp38-win32.whl", hash = "sha256:28264f9e2b3df4135cbcfca5a91c5b0b31dd3fc02fa623b4bb13327f0cd4fc80"}, + {file = "llvmlite-0.34.0-cp38-cp38-win_amd64.whl", hash = "sha256:964f8f7a2184963cb3617d057c2382575953e488b7bb061b632ee014cfef110a"}, + {file = "llvmlite-0.34.0.tar.gz", hash = "sha256:f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63"}, ] mako = [ {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"}, @@ -672,62 +685,44 @@ markdown = [ {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, ] markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, ] more-itertools = [ - {file = "more-itertools-8.7.0.tar.gz", hash = "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713"}, - {file = "more_itertools-8.7.0-py3-none-any.whl", hash = "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced"}, + {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, + {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, ] munch = [ {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, @@ -808,31 +803,26 @@ numpy = [ {file = "numpy-1.19.3.zip", hash = "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72"}, ] opencv-python = [ - {file = "opencv-python-4.5.1.48.tar.gz", hash = "sha256:78a6db8467639383caedf1d111da3510a4ee1a0aacf2117821cae2ee8f92ce37"}, - {file = "opencv_python-4.5.1.48-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:bcb27773cfd5340b2b599b303d9f5499838ef4780c20c038f6030175408c64df"}, - {file = "opencv_python-4.5.1.48-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9646875c501788b1b098f282d777b667d6da69801739504f1b2fd1268970d1da"}, - {file = "opencv_python-4.5.1.48-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:ebe83901971a6755512424c4fe9f63341cca501b7c497bf608dd38ee31ba3f4c"}, - {file = "opencv_python-4.5.1.48-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:d8aefcb30b71064dbbaa2b0ace161a36464c29375a83998fbda39a1d1740f942"}, - {file = "opencv_python-4.5.1.48-cp36-cp36m-win32.whl", hash = "sha256:32dee1c9fd3e31e28edef7b56f868e2b40e280b7062304f9fb8a14dbc51547d5"}, - {file = "opencv_python-4.5.1.48-cp36-cp36m-win_amd64.whl", hash = "sha256:9c77d508e6822f1f40c727d21b822d017622d8305dce7eccf0ab06caac16d5c6"}, - {file = "opencv_python-4.5.1.48-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:4982fa8ccc38310a2bd93e06334ba090b12b6aff2f6fcb8ff9613e3c9bc48f48"}, - {file = "opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:c0503bfaa2b7b743d6ff5d81f1dd8428dbf4c33e7e4f836456d11be20c2e7721"}, - {file = "opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:e27d062fa1098d90f48b6c047351c89816492a08906a021c973ce510b04a7b9d"}, - {file = "opencv_python-4.5.1.48-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:6d8434a45e8f75c4da5fd0068ce001f4f8e35771cc851d746d4721eeaf517e25"}, - {file = "opencv_python-4.5.1.48-cp37-cp37m-win32.whl", hash = "sha256:e2c17714da59d9d516ceef0450766ff9557ee232d62f702665af905193557582"}, - {file = "opencv_python-4.5.1.48-cp37-cp37m-win_amd64.whl", hash = "sha256:efac9893d9e21cfb599828801c755ecde8f1e657f05ec6f002efe19422456d5a"}, - {file = "opencv_python-4.5.1.48-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:e77d0feaff37326f62b127098264e2a7099deb476e38432b1083ce11cdedf560"}, - {file = "opencv_python-4.5.1.48-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ffc75c614b8dc3d8102f3ba15dafd6ec0400c7ffa71a91953d41511964ee50e0"}, - {file = "opencv_python-4.5.1.48-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c1159d91f29a85c3333edef6ca420284566d9bcdae46dda2fe7282515b48c8b6"}, - {file = "opencv_python-4.5.1.48-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:d16144c435b816c5536d5ff012c1a2b7e93155017db7103942ff7efb98c4df1f"}, - {file = "opencv_python-4.5.1.48-cp38-cp38-win32.whl", hash = "sha256:b2b9ac86aec5f2dd531545cebdea1a1ef4f81ef1fb1760d78b4725f9575504f9"}, - {file = "opencv_python-4.5.1.48-cp38-cp38-win_amd64.whl", hash = "sha256:30edebc81b260bcfeb760b3600c367c5261dfb2fe41e5d1408d5357d0867b40d"}, - {file = "opencv_python-4.5.1.48-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:e38fbd7b2db03204ec09930609b7313d6b6d2b271c8fe2c0aa271fa69b726a1b"}, - {file = "opencv_python-4.5.1.48-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:fc1472b825d26c8a4f1cfb172a90c3cc47733e4af7522276c1c2efe8f6006a8b"}, - {file = "opencv_python-4.5.1.48-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c4ea4f8b217f3e8be6247fc0787fb81797d85202c722523f41070124a7a621c7"}, - {file = "opencv_python-4.5.1.48-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:a1dfa0486db367594510c0c799ec7481247dc86e651b69008806d875ab731471"}, - {file = "opencv_python-4.5.1.48-cp39-cp39-win32.whl", hash = "sha256:5172cb37dfd8a0b4945b071a493eb36e5f17675a160637fa380f9c1d9d80535c"}, - {file = "opencv_python-4.5.1.48-cp39-cp39-win_amd64.whl", hash = "sha256:c8cc1f5ff3c352ebe756119014c4e4ec7ae5ac536d1f66b0316667ced37637c8"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9680ab256ab31bdafd74f6cf55eb570e5629b5604d50fd69dd1bd2a8124f0611"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ef3102b70aa59ab3fed69df30465c1b7587d681e963dfff5146de233c75df7ba"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-win32.whl", hash = "sha256:89a2b45429bf945988a17b0404431d9d8fdc9e04fb2450b56fa01f6f9477101d"}, + {file = "opencv_python-4.5.2.54-cp36-cp36m-win_amd64.whl", hash = "sha256:08327a38564786bf73e387736f080e8ad4c110b394ca4af2ecec8277b305bf44"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:6b2573c6367ec0052b37e375d18638a885dd7a10a5ef8dd726b391969c227f23"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b724a96eeb88842bd2371b1ffe2da73b6295063ba5c029aa34139d25b8315a3f"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4b8814d3f0cf01e8b8624125f7dcfb095893abcc04083cb4968fa1629bc81161"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-win32.whl", hash = "sha256:d9004e2cc90bb2862cdc1d062fac5163d3def55b200081d4520d3e90b4c7197b"}, + {file = "opencv_python-4.5.2.54-cp37-cp37m-win_amd64.whl", hash = "sha256:2436b71346d1eed423577fac8cd3aa9c0832ea97452444dc7f856b2f09600dba"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0118a086fad8d77acdf46ac68df49d4167fbb85420f8bcf2615d7b74fc03aae0"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b3bef3f2a2ab3c201784d12ec6b5c9e61c920c15b6854d8d2f62fd019e3df846"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6e2070e35f2aaca3d1259093c786d4e373004b36d89a94e81943247c6ed3d4e1"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-win32.whl", hash = "sha256:f12f39c1e5001e1c00df5873e3eee6f0232b7723a60b7ef438b1e23f1341df0e"}, + {file = "opencv_python-4.5.2.54-cp38-cp38-win_amd64.whl", hash = "sha256:10325c3fd571e33a11eb5f0e5d265d73baef22dbb34c977f28df7e22de47b0bc"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:050227e5728ea8316ec114aca8f43d56253cbb1c50983e3b136a988254a83118"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c446555cbbc4f5e809f9c15ac1b6200024032d9859f5ac5a2ca7669d09e4c91c"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8cf81f53ac5ad900ca443a8252c4e0bc1256f1c2cb2d8459df2ba1ac014dfa36"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-win32.whl", hash = "sha256:a8020cc6145c6934192189058743a55189750df6dff894396edb8b35a380cc48"}, + {file = "opencv_python-4.5.2.54-cp39-cp39-win_amd64.whl", hash = "sha256:0a3aef70b7c53bbd22ade86a4318b8a2ad98d3c3ed3d0c315f18bf1a2d868709"}, ] packaging = [ {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, @@ -862,54 +852,62 @@ pytest = [ {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, ] pytest-cov = [ - {file = "pytest-cov-2.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, - {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, + {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, + {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, ] rasterio = [ - {file = "rasterio-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:3f6a171eb4e87f57c5507eb8139f6099fdccee07befcf5785d02a0c99ecb0cdb"}, + {file = "rasterio-1.2.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd590eb130d96b7823de3a1e1e359d2a83b67a9bb538880a84c123c0d4a827d9"}, + {file = "rasterio-1.2.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6b7bcc859b8447827f415d6f719f099843658a738b46531c909c9a188828f52f"}, + {file = "rasterio-1.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d219d484a567ff045a97281d900db0e1eae80c9d59f1aa8b0092f7c304590d57"}, + {file = "rasterio-1.2.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d9e28dc1b32b39be9cf1c9c571524ef544543672cc2d08ff9e43285021f5465a"}, + {file = "rasterio-1.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:89500e607ab3cffcc247ff40a5cc48cbe8c437a0b0bfaa7e36db7a1f6abc7203"}, + {file = "rasterio-1.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cd2029f497383d837d4a6fb73d6646f8d15b8a8d62c8f912aa23fc552e436306"}, + {file = "rasterio-1.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ad993c11b34affaeb8d3c5966f8ba76b77641359fd98ce7522fd5cab1a1553"}, + {file = "rasterio-1.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b9c3aaa20bf9bc01eae453a1504c0f741ab71da0959a72636f4c9d1ff7735519"}, + {file = "rasterio-1.2.4.tar.gz", hash = "sha256:31248c5ddc8f138f73b166dd93384aa72d11abd0dc27dca90a190276c7976aa3"}, ] regex = [ - {file = "regex-2021.3.17-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b97ec5d299c10d96617cc851b2e0f81ba5d9d6248413cd374ef7f3a8871ee4a6"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:cb4ee827857a5ad9b8ae34d3c8cc51151cb4a3fe082c12ec20ec73e63cc7c6f0"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:633497504e2a485a70a3268d4fc403fe3063a50a50eed1039083e9471ad0101c"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:a59a2ee329b3de764b21495d78c92ab00b4ea79acef0f7ae8c1067f773570afa"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:f85d6f41e34f6a2d1607e312820971872944f1661a73d33e1e82d35ea3305e14"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:4651f839dbde0816798e698626af6a2469eee6d9964824bb5386091255a1694f"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:39c44532d0e4f1639a89e52355b949573e1e2c5116106a395642cbbae0ff9bcd"}, - {file = "regex-2021.3.17-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:3d9a7e215e02bd7646a91fb8bcba30bc55fd42a719d6b35cf80e5bae31d9134e"}, - {file = "regex-2021.3.17-cp36-cp36m-win32.whl", hash = "sha256:159fac1a4731409c830d32913f13f68346d6b8e39650ed5d704a9ce2f9ef9cb3"}, - {file = "regex-2021.3.17-cp36-cp36m-win_amd64.whl", hash = "sha256:13f50969028e81765ed2a1c5fcfdc246c245cf8d47986d5172e82ab1a0c42ee5"}, - {file = "regex-2021.3.17-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b9d8d286c53fe0cbc6d20bf3d583cabcd1499d89034524e3b94c93a5ab85ca90"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:201e2619a77b21a7780580ab7b5ce43835e242d3e20fef50f66a8df0542e437f"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d47d359545b0ccad29d572ecd52c9da945de7cd6cf9c0cfcb0269f76d3555689"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:ea2f41445852c660ba7c3ebf7d70b3779b20d9ca8ba54485a17740db49f46932"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:486a5f8e11e1f5bbfcad87f7c7745eb14796642323e7e1829a331f87a713daaa"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:18e25e0afe1cf0f62781a150c1454b2113785401ba285c745acf10c8ca8917df"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:a2ee026f4156789df8644d23ef423e6194fad0bc53575534101bb1de5d67e8ce"}, - {file = "regex-2021.3.17-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4c0788010a93ace8a174d73e7c6c9d3e6e3b7ad99a453c8ee8c975ddd9965643"}, - {file = "regex-2021.3.17-cp37-cp37m-win32.whl", hash = "sha256:575a832e09d237ae5fedb825a7a5bc6a116090dd57d6417d4f3b75121c73e3be"}, - {file = "regex-2021.3.17-cp37-cp37m-win_amd64.whl", hash = "sha256:8e65e3e4c6feadf6770e2ad89ad3deb524bcb03d8dc679f381d0568c024e0deb"}, - {file = "regex-2021.3.17-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a0df9a0ad2aad49ea3c7f65edd2ffb3d5c59589b85992a6006354f6fb109bb18"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b98bc9db003f1079caf07b610377ed1ac2e2c11acc2bea4892e28cc5b509d8d5"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:808404898e9a765e4058bf3d7607d0629000e0a14a6782ccbb089296b76fa8fe"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:5770a51180d85ea468234bc7987f5597803a4c3d7463e7323322fe4a1b181578"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:976a54d44fd043d958a69b18705a910a8376196c6b6ee5f2596ffc11bff4420d"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:63f3ca8451e5ff7133ffbec9eda641aeab2001be1a01878990f6c87e3c44b9d5"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bcd945175c29a672f13fce13a11893556cd440e37c1b643d6eeab1988c8b209c"}, - {file = "regex-2021.3.17-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:3d9356add82cff75413bec360c1eca3e58db4a9f5dafa1f19650958a81e3249d"}, - {file = "regex-2021.3.17-cp38-cp38-win32.whl", hash = "sha256:f5d0c921c99297354cecc5a416ee4280bd3f20fd81b9fb671ca6be71499c3fdf"}, - {file = "regex-2021.3.17-cp38-cp38-win_amd64.whl", hash = "sha256:14de88eda0976020528efc92d0a1f8830e2fb0de2ae6005a6fc4e062553031fa"}, - {file = "regex-2021.3.17-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4c2e364491406b7888c2ad4428245fc56c327e34a5dfe58fd40df272b3c3dab3"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8bd4f91f3fb1c9b1380d6894bd5b4a519409135bec14c0c80151e58394a4e88a"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:882f53afe31ef0425b405a3f601c0009b44206ea7f55ee1c606aad3cc213a52c"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:07ef35301b4484bce843831e7039a84e19d8d33b3f8b2f9aab86c376813d0139"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:360a01b5fa2ad35b3113ae0c07fb544ad180603fa3b1f074f52d98c1096fa15e"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:709f65bb2fa9825f09892617d01246002097f8f9b6dde8d1bb4083cf554701ba"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:c66221e947d7207457f8b6f42b12f613b09efa9669f65a587a2a71f6a0e4d106"}, - {file = "regex-2021.3.17-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:c782da0e45aff131f0bed6e66fbcfa589ff2862fc719b83a88640daa01a5aff7"}, - {file = "regex-2021.3.17-cp39-cp39-win32.whl", hash = "sha256:dc9963aacb7da5177e40874585d7407c0f93fb9d7518ec58b86e562f633f36cd"}, - {file = "regex-2021.3.17-cp39-cp39-win_amd64.whl", hash = "sha256:a0d04128e005142260de3733591ddf476e4902c0c23c1af237d9acf3c96e1b38"}, - {file = "regex-2021.3.17.tar.gz", hash = "sha256:4b8a1fb724904139149a43e172850f35aa6ea97fb0545244dc0b805e0154ed68"}, + {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, + {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, + {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, + {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, + {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, + {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, + {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, + {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, + {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, + {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, + {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, + {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, + {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, ] shapely = [ {file = "Shapely-1.7.1-1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46da0ea527da9cf9503e66c18bab6981c5556859e518fe71578b47126e54ca93"}, @@ -936,8 +934,8 @@ shapely = [ {file = "Shapely-1.7.1.tar.gz", hash = "sha256:1641724c1055459a7e2b8bbe47ba25bdc89554582e62aec23cb3f3ca25f9b129"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] snuggs = [ {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"}, @@ -948,45 +946,45 @@ toml = [ {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] tqdm = [ - {file = "tqdm-4.59.0-py2.py3-none-any.whl", hash = "sha256:9fdf349068d047d4cfbe24862c425883af1db29bcddf4b0eeb2524f6fbdb23c7"}, - {file = "tqdm-4.59.0.tar.gz", hash = "sha256:d666ae29164da3e517fcf125e41d4fe96e5bb375cd87ff9763f6b38b5592fe33"}, + {file = "tqdm-4.61.1-py2.py3-none-any.whl", hash = "sha256:aa0c29f03f298951ac6318f7c8ce584e48fa22ec26396e6411e43d038243bdb2"}, + {file = "tqdm-4.61.1.tar.gz", hash = "sha256:24be966933e942be5f074c29755a95b315c69a91f839a29139bf26ffffe2d3fd"}, ] typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, ] typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, + {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, + {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, + {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, diff --git a/pyproject.toml b/pyproject.toml index a7be353..df913d8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "geosardine" -version = "0.12.0-alpha" +version = "0.13.0" license = "BSD-3-Clause" description = "Spatial operations extend fiona and rasterio" authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"] @@ -31,9 +31,9 @@ rasterio = "^1.1.2" opencv-python = "^4.4.0" [tool.poetry.dev-dependencies] -gdal = { path = "../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" } -fiona = { path = "../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" } -rasterio = { path = "../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" } +# gdal = { path="../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" } +# fiona = { path="../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" } +# rasterio = { path="../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" } pip = ">=20.0.0" pytest = "^5.2" black = "^20.8b1" diff --git a/tes.tif b/tes.tif deleted file mode 100644 index 3f321872fb531206dd4118dd5d1dee64d4c75e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9273 zcmZ{}c|29^_dZT2qLft1kVG`2B8e`uWS-7^&fe!BDWNFRKr~46ppc<7m_nqC6{SQe z4fGgGsE{b4(f59y-}{fxKfnEYZENj)ZhP;0?X|A!TK8VJZlRd8n3&j9F)?uoF>&H) zkzM?Mz8dkz{m%#SCI09CJ8t~{@u!MQij5=Zn#ex=|D2!kKVO-gpGo|G$E=zYDxva! z#<=~@mmt4Qj*=7m*LIM7U$mUqcw&E&J@=r5m^!fw$&K?4%Kdj8KjPmwIPSlv-%0$) z%j3i*kTLs+|L+z)4|Ihw+@c;XV^0~^!zrQx7&ARum{dW`pFFNE7 zlK=YS#K@HYzjGvf;$q!X#HDW>{P+Ij|2sZ5PewZL;J^PP`=1pPJLDf6r+RrS$Piq0 zXPPl=+|*aC*d?}PxxS%+p;&d|=Gd~$p7=QTx4Edv15<`_ubUcqK-jfPyZ)d%vWjfP zm8#sZqx6Wf!GJ5ym&k^VO1nbkg_W|uybCOPy_fT)oH5zztZG$@1NN6jh$p11$3~xZ zrAxfm!9;7f?RP61%o9Doo<>`tUQX-jk7f%jxAs3ex7i$uw5^y}ggK_q(v}ytn}dBy zXWqr%7T9e*@@3W|D}3BYuB>8_6-Az#%ab}2w|em z=1u6aUrgLxk-B7~KMM*jE%CKaSva~T{-O08HWYuVkMxMxDAStLB6#eH!r$+&GmJf< zXf%0>U$O^E5>=DG54hvcab|qAo;$1u!VXpn+z^&KiBIix#iMaXxz3R;aJW)o_$|a4 z*Y;Rm`+Ca}HCkZ}ul()tSn`WQkcJ)V*AJeV(QktZjJq2WzFMK!Wv{k9!xDu>(ees5 z77&b2dY<>e9K9GuIe3jL|-Qj1w)K6E=6X$1siO3)IgsP6r z$jE&L1~x`LUme86RE@lutr9HoT3)F}?`6TW-nbVZSny-d-Syst4e!cnf*A+c7>m#h z{awL^!LY91q2&xHho~wkWqab7d!4<~3{QL?%DUGQ;DJJmZ!c#QxnoNS_h8g#H>lkY zp5QC*hOOyksY_K|5q!2kvUR2lI+keg&Br;zBKQ$&N~Hs$$IK1xhpk8C4da?I%XOf_ z``s^C+hAtBz53*IE9}lPUG06&5=j&_`Gtuk*wOaO{uElGUQGYqn1nU7+q-H~rrN@6 ztVe1=z8wU2U;1R`I6!~HgcGYbIODe2(y+;cE=axk+c!w$hA$U4eK>#99qxnt+^}{J zeC#pUw(Pwp4qsE*IaYQt2H)csIsuDak;7fB^JKhp8d#}!bZLL4HwT% zY`mCv<><6qY^;8gGi}W`Ha1jNntjvcAom7iv1=v+V*R%!7A#_*pS^agQ;H{s8V}^e zNOcn6;Yf=*{FEZMp} z;F1&GZ1Rns72<$u*3LtLto3+3??_I6&^j1r>u<36Xahsf#8vBitzp8p#@s8`h{&HH ze4}fF;cVCR>nCk7Cv5uCu^c5{3nfoAv#|4* z*&j1UHf(Y#UUy`%QJg$$tZ;-4|KlI`$FJZ(LM;2HhBpUK4V%-2u^iL{?YzTU%!JPq z`Mc+e7&sVnQOjW!1B#JPq{e4@V(Y+G?F5p)ezDfMU3?F`a$oAUJk=fVj9*Y6pSdC7 z>OG^{epe*A&)K$O%mroH&Alt7T%f+YYi6RfGjd;E(NtULh~3Fnx{V?B;B@a-(^6TF z`jLkNY3uCZHTlPP^Z9nTG&`*OWsM!oA6i-OTxE~6XFi{6-5t>xTH>&GhclkZAKKT} z?Sio3t!1O%Yxt(HQT4Sr_`q!Rl-8dX) zvWDQ;v~>>~&v>A2gS^#)Hg_zm5$*4v?T$HZ?^oomCwM zOuRqZ+M+j)3GXiXE!Ei!*!)b~yq(nLNTE^8JW`iypT_KYKY{Sbrj@5Z`FNmKNozFg zjyq;NAMlr&=8nZq`fiDSZg|}JF5+XIEAni=&AV*x3ZC)#%8IWpIARf@zo^~?u1c?S zWrkgF_3*^N3NMnEp*6+2s&2SnnWUUC#T`et7VWQJ-~kohBL4^%PtZNb1j4NhIH#pA z__~V;#p3LvpEj_dw(Ww|G+j2bE=Ic~y=G%5Fu+NhL-J#{;&8zO4wm|S-eo+4i(p3b z^Gj}AxIDF7L`85Br4S`LoWezw$_d?!0xlRKKW}&4;bMt={>&Nox$q8lPrXyY#g(j+ z%f@xE@b#gpM!`82l69^%AGBscI4#>`LO&Ca$B7>pcZ`VyfqmGf`Aif$PK!E!n*rWK zvzS@t3=FN54hnnZ2}j%M7d`Ae(S5sDW=EX|G$vZ@u4j4Rw#En@IOLAdNqLdS)7>%C zCgekAq&t`%y*G7Y-SJ$o^wpN9?$~?I!Mx4R14BzB_166Lz<^bEf=TvCKg{=3Ek)$(R zylhu<_kF{KeD&*Xh0;9uBrogl)8Qd?z{GaK8Xj8RKBt|t_ya#!e5H&Y(i z@9aM`=<{GC!Bsmuj|Z_J^^ck1Y^a~PCzS{`{5Y)LonmbKW_^7dT*iXZs=u4}Z)4%3 zj9+{Bd=~EOZb_Tdz{Irkjw-vOnAl+a%4MrA6IEAlR2Q`~K<^sAaOeyJ*Txh+SbH$A zMLxbsU7LX!zGq$K6c}iVj@4>VB{%}dX)9eAkf6MGm*+BI8ZdR_qahQ9Zt?T4b}*r~ zbuVHGuC#09nH(cLRARA)E?mq(`inDbZ#Q!gU(Ot^3gY6_oD~-}`nVX1@nr7GN-Y2ejE$z(5EGr16fF| zWVbnbuwZrbX&A$nh3!Uqdv`jrutbfW9=n+Z^BYl5Dz36{eZuTtdgzaj-%^<9eYDsSjtVw){>miVy9$zcGjh&Ca_rM?MfMXSwW@B_Fr; zR!cS?;zRT1oq&6{_-OLlH`%{~T`SW3k`(c`S7&+!qS@S|*Y2p^xy_SI`Sk?Y*kyIwS(k4u4)FB*UIuzi;7zVH_$-=>I~re<+4 zl$5ik;3x-;^B3e_F_95x-aXg~OBEGok@X=;^eN#~mA0tUysJ(Lqh_scgxf(8j zZ=8vCX{i7=!3SmkMwz{9MzMAAHnS9G!col8=hZk1pRm%tsPObwime zA9;FV^V5|1STSUy-AC|U%r2u$V=))8qtl<&s}kJzkL?|q%7yj%uG~f$E}~ERe;pjp z#oE))w#v$KksDvNQeTM+p9L=#7wB@)oanW0%#+N!Fy8j^Q7+gk@@rl-aM5nRJaftl z9zM4FT@zj5!I)Qg%c>`gW~Lt%QyyNhP~D0oWf^HMic zxH__Vf{Z(bA3lNK@~{C@64!GBX0B@r1TYs+)5>nDyM;sg;Z+l%)b$@v_l z#hN|iV#61!x?69#n8vXDQud1rkB95ZV>Eb}RVwjG$lyV3-oy2~NjsjJM<=Hib$>r|zaK3e`~Y=o_M7ArS0c zyNrgwAhsLZL}G&+=L859U;_`T}!h_s_2R#$h*V=)akla!UxvNRly&G1bB zMB&KUZD$`;Q|K{&*K+I{1$T?Ez@cage{#%f`4k0}N|APv5rsa+dT6 zVBCdXK|aaX=Q6E(Svmp?2G$n7Y2ag-%Gc%qQrB`f{!Tb&#e+e}L-huGGQZVpFC1qQ z+&8S~TIgeV?XmH!@yy~=||Pw$A%YaX7PSU+-(8omTRl=7m&DoR6fYrOW{&)K1;rt!uO|&58DiB^ktTnZ$D0B zG%!_PqKQWGjpM;=c_AhS8fE$F2$6K$pi)9Zh#M{+BspU={LfhY-CRS%)$iA8_6Zs$ z3&bC;;m}C`eB6e!l!l|;gtIp%&`5i9$=LTjg(VZ4PU+tv@mcP2P83HWX5Oh+$2XDq zq^kBUFr{#4STbmIGKHHH9u7>pBfyoW;2l+b0h(?teqSptfYfrOmIvv4bn=!gK`9Sg zrbT%jt>r;yK-@f#@I&>@*7P%fc@Um)*K5$^qad9T@ z!WR400&I@)DiJ>?fS^=Ab+ZJ8GY3q+lv+`UEqVNY`e_OUQoa&9dnr_vzvUP>(wJ|$ z=jiTY^8QC-OE)YOqH@muH&ZSMaXZNAN8khz{4+~6&k9Aj6Y(WSEmef)-I1Bsb42(N zuXq08E)nKsr&}DB5+Tsj)8ep~5RY$mo|deq;j-}CD`60gmM06d&Y01dl;ETsyMRV( zeRLw(ONv1Y=LU9cSJmPAw54I__HQD9M{<%bg!|wM6*zg&r|a5ur?V?H|cWURXI+ zt1C-+VRUfxch6og>`9q4Kg-4o>qUZ&+h;`xh3oZeF+!;36px)up^;IbF}q94~ONi!e zwxy6!bkovTnnJPO>9M6J1eo}Z`)o)-0PRf?V)riavE}&qBjaE3VYVQ-=J608JJwpS z`Kv^HOa+0|$ z-cqnXVWl&;ibmvvjwhZ;G}cdyc=S_Fh{Dd;WqAjLFetpb_#bHzHZD4HFZYB9x8pwQ zSk3kVksQBFQ@oJf&3H0H(HmAJ1&VL^-dL1}8*8k*(JLiy<>BQ8=Oe3U_uU}%xT~{h zp$U!qH%9I`-6MGCW4`c99R=4<{I1~d6k2t+%-tzRLtSa?nYauM->WHm_V-hmcCt!* zw1V*El(tj*4pH!3zhrBrHNo`|)ybd4DCqJWHD-qhur$K)QcE8ncKx$s_xKZ?ka3CS zq9j1r0a(m179e=Q{Ah%?00xQ^eX8OG*v>53yQ)b5jpsiGuPKuJRQ{2cZ%IKvY`AXA z9tw1`^tI|r3cG)-o9d%LLsu=J^r=6M)J?(GzhBXaa~Ruu&PIp}**OcV9tbfg5pX+h zJ*ltCH5vPwL@;W|Wt9YYAwMP|Xrr_@et6jxW+!{&s?(og!5kkf-Z-bjY`qWW7}q`c z7V3>n`bNIH)J52vyZ@7g6pfKH#biB{Lfgavy&1WL*RDq{D(<83JTJ|IoZ=J$(I}*GSAm$=Q0*TfX)z!q+{89 zlpB`&1`~YFys=nDi|ChoVN+hXZxi6ULqNNJvHIKoQ8pcr}|8S)3aB%?0idbI;*DZ$V)#V z?1S&`*Z(Ml%j{dN`~VR=Xu&cOZ#4cfxK|M1 zgI801{*K-C!M#aSyv>z;ppzeiXD>u}d?{>q?@<~nkInqH;U$Hp&y7p>v=e;k_wQUq z^2crRl=%--X_T(+X&z9dp^+YX?))GHpB!lktzrrnqMXg5f=FFt4V|LZDWrtgF(Tsx z_rdV%X$ppLM8^^f#jsTfUOI8;$I-3=zRH%vvm-#Oc#M$4!$@c;R$jOzIp> zZ)|_u^X__~H>3vl9$Kd7gEji~7mo0KFw@aY;mSjAG-XViYC4bLmuTjjNFO1NeSLX- z<3Sp)jH8Vl*AqV7=_T1}PNN;Z6<K>gnBsz88r7Yz@ zf~(ZH~l~LiQYeQ>49N5AN5DqcuLpvpddV=nz5P(zQL}fz6%2E@Y0cf zRwlryI{}qaodQgj3lp3qdDJ|>HSr_*XL_x3Ubhp42R+qJD~S$z?{%(HSVUn?N@T&r z-y~ix3vIY|G}Pq14mqUJSXHU{%yPUCy$rD}{H;PLZlAi-rCW$y^0%%(p+ty!vi1A3 zb`fk2m{-LS+)m#z6sOnb1(|2E!7Yy7h^TexZ@u7+u8uTjQIa>ly$otiRq{sb&yeqO zGG2)1cDj_l6T*Gl+DRXjgqR-4G}O(fp&S~Y#M?!qN8(}a2WJ|O*guw*kT``5zlfIq zheGa!7#uV*xKNP9c2i9yc>$35DA2O^?S2ZtDl7RoIg_ zMYkHa^KMa?KjJ+8>IkX7d2y*q7KEn|7`Hq z3*{@5z2kRy;p5pa`lVGOsK&DG_K1nFK!ZU)4{4&8Ok1p#cr*0FS8#`vCNBWt8NV$g=PXsvfPH*#{PCokVc03vrJqWNCV2T5KH-H;aSEEPfS#L>##Bu~y*=Qc)~ zd13D8_f$iM7aBY#D&98n!u~nqOY-{(?ps+^xCIj(@ydwS{3L`?#h1!=8-#Gn_ir-% zMWeCz*wTZ^G=^(b<_ucXcs9656h)p-)_D27-BA>t3d`n3k@sJ?wS4w9(w_|Fz8(2N z`fmTc&=V8&c=*IMYPd_*G3^?5?$$oRLH4T`*5^mrFx$9GvF5P=lXhG;dDAL@ZE8)(x=DxdTy+J<`w7wgDJ>JuxTcJ!5+&HY0V@RRyqQ^FIE`=BKe~5X< zP?)Xtc}LA%(x?CYb7-CAXn2GWPLq-JjGCUH{@Sa$0#Iqp8_K7-U>nX&Sp zc7o?yLdQuxvZG-7_8&2BFyRZG&s=}PADhBbA{E{ey?cJ7xOWbXptu!~%~W&MT`0IBu6?e3``i`s1Iw<4IoK*E?G< zh45v%hryrI<0%A}ZrRCJAv`f_G_;xMvd1Mg7RLn?5;o=J>l`I|imBOniRiawe^%b! z_ltsm{GM$UgqQESZHS${gVaO6oVvnIq6f`xcmHhpIjEktWq#*a`FAp-Sxyq+&31TA&YeD6bo)9csh zfLyyHz2-%zN3!acfLp2h>#xQNvRPknRGCa}V33^pw-VrP@SD@5mY zX9JnvxBl0+M`;{Vt=X4H>ZfP9Qo+b9A)e#vBZV14jIkqw7D@ysQR`J2cJ(Utv>OMh5X3cPu#am82dU0mWVS^V7ws9U&z4sH_-|K zk_YW)uPDDeY3FMM=(|O4MlB>~Stuens-f`p-3PIEBgKXOzViDXj7RsZ5hT zY*pJKri>mRY6;^uH^`Ci1GfrHjT<@GbTFrAYcd<2qiXV}$@jkA88R^+{Fzv%?WdBO W$bfFu1J2e7 Date: Fri, 18 Jun 2021 11:16:01 +0700 Subject: [PATCH 5/8] Support any epsg distance repair pyproject.toml (#20) * add support for another epssg add support for another epssg in geographic distance calculation * Update CHANGELOG.md * remove local dev dependency From f4f8a087305aa0be192e7b2ca27081f469344c22 Mon Sep 17 00:00:00 2001 From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com> Date: Fri, 18 Jun 2021 15:55:43 +0700 Subject: [PATCH 6/8] Update meta.yaml --- conda.recipe/meta.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index b65449e..96c4fab 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,5 +1,5 @@ {% set name = "geosardine" %} -{% set version = "0.12.0a0" %} +{% set version = "0.13.0" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz - sha256: ddac3c95763b878c5454f2717b800b62c2f7bae3a4a372cbba00404e6c7c0fcc + sha256: d43b553a733293ffbc561e6acda33a637209ec45470e237b80b393b4b5043687 build: noarch: python From 10bb24e55314c78d57e5731741bbc68cb3bfa60a Mon Sep 17 00:00:00 2001 From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com> Date: Thu, 24 Jun 2021 16:13:53 +0700 Subject: [PATCH 7/8] update dependency to support latest gdal --- CHANGELOG.md | 8 +- conda.recipe/meta.yaml | 12 +-- poetry.lock | 217 ++++++++++++++++++++++++----------------- pyproject.toml | 26 ++--- 4 files changed, 154 insertions(+), 109 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1097f9e..56203fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.13.1] - 2021-06-23 + +### Changed +- update dependency to latest + ## [0.13.0] - 2021-06-18 ### Changed @@ -171,7 +176,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Support multiple layer in raster calculation -[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.0...HEAD +[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.1...HEAD +[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.13.0...v0.13.1 [0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0 [0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0 [0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0 diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 96c4fab..46b27e4 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,5 +1,5 @@ {% set name = "geosardine" %} -{% set version = "0.13.0" %} +{% set version = "0.13.1" %} package: name: {{ name|lower }} @@ -7,7 +7,7 @@ package: source: url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz - sha256: d43b553a733293ffbc561e6acda33a637209ec45470e237b80b393b4b5043687 + sha256: a3737c9dad7d52b41f6cebb18d6c085c5a0ad14a9dc2c23f977c42be305db1b5 build: noarch: python @@ -18,7 +18,7 @@ build: requirements: host: - - python >=3.6,<4.0 + - python >=3.6,<3.10 - pip - pytest-runner # - poetry @@ -27,10 +27,10 @@ requirements: - affine >=2.3.0,<3.0.0 - click >=7.1.2,<8.0.0 - fiona >=1.8.13,<2.0.0 - - gdal >=3.0.4,<3.1.4 - - numba >=0.51.2,<0.52.0 + - gdal >=3.0.4 + - numba >=0.51.2 - numpy >=1.18,<2.0 - - python >=3.6,<4.0 + - python >=3.6,<3.10 - rasterio >=1.1.4,<2.0.0 - shapely >=1.6.4,<2.0.0 - tqdm diff --git a/poetry.lock b/poetry.lock index 2f0fb6c..c214859 100644 --- a/poetry.lock +++ b/poetry.lock @@ -176,24 +176,25 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytes [[package]] name = "isort" -version = "5.8.0" +version = "5.9.1" description = "A Python utility / library to sort Python imports." category = "dev" optional = false -python-versions = ">=3.6,<4.0" +python-versions = ">=3.6.1,<4.0" [package.extras] pipfile_deprecated_finder = ["pipreqs", "requirementslib"] requirements_deprecated_finder = ["pipreqs", "pip-api"] colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] [[package]] name = "llvmlite" -version = "0.34.0" +version = "0.36.0" description = "lightweight wrapper around basic LLVM functionality" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6,<3.10" [[package]] name = "mako" @@ -281,23 +282,23 @@ python-versions = "*" [[package]] name = "numba" -version = "0.51.2" +version = "0.53.1" description = "compiling Python code using LLVM" category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.6,<3.10" [package.dependencies] -llvmlite = ">=0.34.0.dev0,<0.35" +llvmlite = ">=0.36.0rc1,<0.37" numpy = ">=1.15" [[package]] name = "numpy" -version = "1.19.3" +version = "1.21.0" description = "NumPy is the fundamental package for array computing with Python." category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" [[package]] name = "opencv-python" @@ -371,6 +372,17 @@ category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +[[package]] +name = "pyproj" +version = "3.1.0" +description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +certifi = "*" + [[package]] name = "pytest" version = "5.4.3" @@ -412,7 +424,7 @@ testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtuale [[package]] name = "rasterio" -version = "1.2.4" +version = "1.2.6" description = "Fast and direct raster I/O for use with Numpy and SciPy" category = "main" optional = false @@ -429,7 +441,7 @@ numpy = "*" snuggs = ">=1.4.1" [package.extras] -all = ["sphinx-rtd-theme", "boto3 (>=1.2.4)", "matplotlib", "pytest (>=2.8.2)", "numpydoc", "ghp-import", "ipython (>=2.0)", "hypothesis", "packaging", "sphinx", "pytest-cov (>=2.2.0)", "shapely"] +all = ["boto3 (>=1.2.4)", "pytest-cov (>=2.2.0)", "hypothesis", "shapely", "numpydoc", "ghp-import", "pytest (>=2.8.2)", "matplotlib", "packaging", "ipython (>=2.0)", "sphinx-rtd-theme", "sphinx"] docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"] ipython = ["ipython (>=2.0)"] plot = ["matplotlib"] @@ -539,8 +551,8 @@ testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pyt [metadata] lock-version = "1.1" -python-versions = "^3.7" -content-hash = "922a3f4c627233d1b4b78b5bc21e1e9598e22c8202444f035fb849912f63dfa6" +python-versions = ">=3.7,<3.10" +content-hash = "785517b4c8485cd29bc100fc84d28a56262e1e0821866146f074b54ef1034811" [metadata.files] affine = [ @@ -655,26 +667,31 @@ importlib-metadata = [ {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, ] isort = [ - {file = "isort-5.8.0-py3-none-any.whl", hash = "sha256:2bb1680aad211e3c9944dbce1d4ba09a989f04e238296c87fe2139faa26d655d"}, - {file = "isort-5.8.0.tar.gz", hash = "sha256:0a943902919f65c5684ac4e0154b1ad4fac6dcaa5d9f3426b732f1c8b5419be6"}, + {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, + {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, ] llvmlite = [ - {file = "llvmlite-0.34.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:11342e5ac320c953590bdd9d0dec8c52f4b5252c4c6335ba25f1e7b9f91f9325"}, - {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5bdf0ce430adfaf938ced5844d12f80616eb8321b5b9edfc45ef84ada5c5242c"}, - {file = "llvmlite-0.34.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e08d9d2dc5a31636bfc6b516d2d7daba95632afa3419eb8730dc76a7951e9558"}, - {file = "llvmlite-0.34.0-cp36-cp36m-win32.whl", hash = "sha256:9ff1dcdad03be0cf953aca5fc8cffdca25ccee2ec9e8ec7e95571722cdc02d55"}, - {file = "llvmlite-0.34.0-cp36-cp36m-win_amd64.whl", hash = "sha256:5acdc3c3c7ea0ef7a1a6b442272e05d695bc8492e5b07666135ed1cfbf4ab9d2"}, - {file = "llvmlite-0.34.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bb96989bc57a1ccb131e7a0e061d07b68139b6f81a98912345d53d9239e231e1"}, - {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6d3f81992f52a94077e7b9b16497029daf5b5eebb2cce56f3c8345bbc9c6308e"}, - {file = "llvmlite-0.34.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:d841248d1c630426c93e3eb3f8c45bca0dab77c09faeb7553b1a500220e362ce"}, - {file = "llvmlite-0.34.0-cp37-cp37m-win32.whl", hash = "sha256:408b15ffec30696406e821c89da010f1bb1eb0aa572be4561c98eb2536d610ab"}, - {file = "llvmlite-0.34.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5d1f370bf150db7239204f09cf6a0603292ea28bac984e69b167e16fe160d803"}, - {file = "llvmlite-0.34.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:132322bc084abf336c80dd106f9357978c8c085911fb656898d3be0d9ff057ea"}, - {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:8f344102745fceba6eb5bf03c228bb290e9bc79157e9506a4a72878d636f9b3c"}, - {file = "llvmlite-0.34.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:05253f3f44fab0148276335b2c1b2c4a78143dfa78e6bafd7f937d6248f297cc"}, - {file = "llvmlite-0.34.0-cp38-cp38-win32.whl", hash = "sha256:28264f9e2b3df4135cbcfca5a91c5b0b31dd3fc02fa623b4bb13327f0cd4fc80"}, - {file = "llvmlite-0.34.0-cp38-cp38-win_amd64.whl", hash = "sha256:964f8f7a2184963cb3617d057c2382575953e488b7bb061b632ee014cfef110a"}, - {file = "llvmlite-0.34.0.tar.gz", hash = "sha256:f03ee0d19bca8f2fe922bb424a909d05c28411983b0c2bc58b020032a0d11f63"}, + {file = "llvmlite-0.36.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc0f9b9644b4ab0e4a5edb17f1531d791630c88858220d3cc688d6edf10da100"}, + {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f7918dbac02b1ebbfd7302ad8e8307d7877ab57d782d5f04b70ff9696b53c21b"}, + {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7768658646c418b9b3beccb7044277a608bc8c62b82a85e73c7e5c065e4157c2"}, + {file = "llvmlite-0.36.0-cp36-cp36m-win32.whl", hash = "sha256:05f807209a360d39526d98141b6f281b9c7c771c77a4d1fc22002440642c8de2"}, + {file = "llvmlite-0.36.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d1fdd63c371626c25ad834e1c6297eb76cf2f093a40dbb401a87b6476ab4e34e"}, + {file = "llvmlite-0.36.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c4e7066447305d5095d0b0a9cae7b835d2f0fde143456b3124110eab0856426"}, + {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9dad7e4bb042492914292aea3f4172eca84db731f9478250240955aedba95e08"}, + {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1ce5bc0a638d874a08d4222be0a7e48e5df305d094c2ff8dec525ef32b581551"}, + {file = "llvmlite-0.36.0-cp37-cp37m-win32.whl", hash = "sha256:dbedff0f6d417b374253a6bab39aa4b5364f1caab30c06ba8726904776fcf1cb"}, + {file = "llvmlite-0.36.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b17fc4b0dd17bd29d7297d054e2915fad535889907c3f65232ee21f483447c5"}, + {file = "llvmlite-0.36.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3a77e46e6053e2a86e607e87b97651dda81e619febb914824a927bff4e88737"}, + {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:048a7c117641c9be87b90005684e64a6f33ea0897ebab1df8a01214a10d6e79a"}, + {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7db4b0eef93125af1c4092c64a3c73c7dc904101117ef53f8d78a1a499b8d5f4"}, + {file = "llvmlite-0.36.0-cp38-cp38-win32.whl", hash = "sha256:50b1828bde514b31431b2bba1aa20b387f5625b81ad6e12fede430a04645e47a"}, + {file = "llvmlite-0.36.0-cp38-cp38-win_amd64.whl", hash = "sha256:f608bae781b2d343e15e080c546468c5a6f35f57f0446923ea198dd21f23757e"}, + {file = "llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a"}, + {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1"}, + {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1"}, + {file = "llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a"}, + {file = "llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c"}, + {file = "llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9"}, ] mako = [ {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"}, @@ -749,58 +766,57 @@ mypy-extensions = [ {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] numba = [ - {file = "numba-0.51.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:af798310eeb318c56cdb83254abbe9a938cc0182d08671d7f9f032dc817e064d"}, - {file = "numba-0.51.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:93e18350f2094e7432321c1275730a3143b94af012fb609cc180fa376c44867f"}, - {file = "numba-0.51.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9e2bb1f129bfadd757ad7a9c18ab79c3ab25ce6d6a68e58565d6c52ad07b3566"}, - {file = "numba-0.51.2-cp36-cp36m-win32.whl", hash = "sha256:31cdf6b6d1301d5fb6c4fcb8b4c711ba5c9f60ba2fca008b550da9b56185367c"}, - {file = "numba-0.51.2-cp36-cp36m-win_amd64.whl", hash = "sha256:df6edca13c04a31fdb5addf5205199478a7da372712829157ef491e8a6e7031f"}, - {file = "numba-0.51.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:a628122dacfcba9a3ea68a9e95578c6b6391016e34962c46550ea8e189e0412e"}, - {file = "numba-0.51.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:106736d5a8dab6bebce989d4ab1b3f169c264582598f172e6e5b736210d2e834"}, - {file = "numba-0.51.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:a12f16fdb4ca5edc94e2ef412e4e768c29217ef9b6fdfc237d064ebe30acfe14"}, - {file = "numba-0.51.2-cp37-cp37m-win32.whl", hash = "sha256:025b033fd31c44bba17802293c81270084b5454b5b055b8c10c394385c232f00"}, - {file = "numba-0.51.2-cp37-cp37m-win_amd64.whl", hash = "sha256:081788f584fa500339e9b74bf02e3c5029d408c114e555ada19cae0b92721416"}, - {file = "numba-0.51.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:5416b584183fd599afda11b947b64f89450fcf26a9c15b408167f412b98a3a94"}, - {file = "numba-0.51.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:05da65dca2ac28a192c9d8f20e9e477eb1237205cfc4d131c414f5f8092c6639"}, - {file = "numba-0.51.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:aee435e3b7e465dd49971f8ea76aa414532a87736916cb399534e017334d1138"}, - {file = "numba-0.51.2-cp38-cp38-win32.whl", hash = "sha256:bbbe2432433b11d3fadab0226a84c1a81918cb905ba1aeb022249e8d2ba8856c"}, - {file = "numba-0.51.2-cp38-cp38-win_amd64.whl", hash = "sha256:259e7c15b24feec4a99fb41eb8c47b5ad49b544d1a5ad40ad0252ef531ba06fd"}, - {file = "numba-0.51.2.tar.gz", hash = "sha256:16bd59572114adbf5f600ea383880d7b2071ae45477e84a24994e089ea390768"}, + {file = "numba-0.53.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b23de6b6837c132087d06b8b92d343edb54b885873b824a037967fbd5272ebb7"}, + {file = "numba-0.53.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6545b9e9b0c112b81de7f88a3c787469a357eeff8211e90b8f45ee243d521cc2"}, + {file = "numba-0.53.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:8fa5c963a43855050a868106a87cd614f3c3f459951c8fc468aec263ef80d063"}, + {file = "numba-0.53.1-cp36-cp36m-win32.whl", hash = "sha256:aaa6ebf56afb0b6752607b9f3bf39e99b0efe3c1fa6849698373925ee6838fd7"}, + {file = "numba-0.53.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08b3df38aab769df79ed948d70f0a54a3cdda49d58af65369235c204ec5d0f3"}, + {file = "numba-0.53.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:bf5c463b62d013e3f709cc8277adf2f4f4d8cc6757293e29c6db121b77e6b760"}, + {file = "numba-0.53.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:74df02e73155f669e60dcff07c4eef4a03dbf5b388594db74142ab40914fe4f5"}, + {file = "numba-0.53.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5165709bf62f28667e10b9afe6df0ce1037722adab92d620f59cb8bbb8104641"}, + {file = "numba-0.53.1-cp37-cp37m-win32.whl", hash = "sha256:2e96958ed2ca7e6d967b2ce29c8da0ca47117e1de28e7c30b2c8c57386506fa5"}, + {file = "numba-0.53.1-cp37-cp37m-win_amd64.whl", hash = "sha256:276f9d1674fe08d95872d81b97267c6b39dd830f05eb992608cbede50fcf48a9"}, + {file = "numba-0.53.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c4c8d102512ae472af52c76ad9522da718c392cb59f4cd6785d711fa5051a2a"}, + {file = "numba-0.53.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:691adbeac17dbdf6ed7c759e9e33a522351f07d2065fe926b264b6b2c15fd89b"}, + {file = "numba-0.53.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:94aab3e0e9e8754116325ce026e1b29ae72443c706a3104cf7f3368dc3012912"}, + {file = "numba-0.53.1-cp38-cp38-win32.whl", hash = "sha256:aabeec89bb3e3162136eea492cea7ee8882ddcda2201f05caecdece192c40896"}, + {file = "numba-0.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:1895ebd256819ff22256cd6fe24aa8f7470b18acc73e7917e8e93c9ac7f565dc"}, + {file = "numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c"}, + {file = "numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f"}, + {file = "numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744"}, + {file = "numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221"}, + {file = "numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69"}, + {file = "numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0"}, ] numpy = [ - {file = "numpy-1.19.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:942d2cdcb362739908c26ce8dd88db6e139d3fa829dd7452dd9ff02cba6b58b2"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:efd656893171bbf1331beca4ec9f2e74358fc732a2084f664fd149cc4b3441d2"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:1a307bdd3dd444b1d0daa356b5f4c7de2e24d63bdc33ea13ff718b8ec4c6a268"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9d08d84bb4128abb9fbd9f073e5c69f70e5dab991a9c42e5b4081ea5b01b5db0"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7197ee0a25629ed782c7bd01871ee40702ffeef35bc48004bc2fdcc71e29ba9d"}, - {file = "numpy-1.19.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8edc4d687a74d0a5f8b9b26532e860f4f85f56c400b3a98899fc44acb5e27add"}, - {file = "numpy-1.19.3-cp36-cp36m-win32.whl", hash = "sha256:522053b731e11329dd52d258ddf7de5288cae7418b55e4b7d32f0b7e31787e9d"}, - {file = "numpy-1.19.3-cp36-cp36m-win_amd64.whl", hash = "sha256:eefc13863bf01583a85e8c1121a901cc7cb8f059b960c4eba30901e2e6aba95f"}, - {file = "numpy-1.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6ff88bcf1872b79002569c63fe26cd2cda614e573c553c4d5b814fb5eb3d2822"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e080087148fd70469aade2abfeadee194357defd759f9b59b349c6192aba994c"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:50f68ebc439821b826823a8da6caa79cd080dee2a6d5ab9f1163465a060495ed"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:b9074d062d30c2779d8af587924f178a539edde5285d961d2dfbecbac9c4c931"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:463792a249a81b9eb2b63676347f996d3f0082c2666fd0604f4180d2e5445996"}, - {file = "numpy-1.19.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ea6171d2d8d648dee717457d0f75db49ad8c2f13100680e284d7becf3dc311a6"}, - {file = "numpy-1.19.3-cp37-cp37m-win32.whl", hash = "sha256:0ee77786eebbfa37f2141fd106b549d37c89207a0d01d8852fde1c82e9bfc0e7"}, - {file = "numpy-1.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:271139653e8b7a046d11a78c0d33bafbddd5c443a5b9119618d0652a4eb3a09f"}, - {file = "numpy-1.19.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e983cbabe10a8989333684c98fdc5dd2f28b236216981e0c26ed359aaa676772"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:d78294f1c20f366cde8a75167f822538a7252b6e8b9d6dbfb3bdab34e7c1929e"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:199bebc296bd8a5fc31c16f256ac873dd4d5b4928dfd50e6c4995570fc71a8f3"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:dffed17848e8b968d8d3692604e61881aa6ef1f8074c99e81647ac84f6038535"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5ea4401ada0d3988c263df85feb33818dc995abc85b8125f6ccb762009e7bc68"}, - {file = "numpy-1.19.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:604d2e5a31482a3ad2c88206efd43d6fcf666ada1f3188fd779b4917e49b7a98"}, - {file = "numpy-1.19.3-cp38-cp38-win32.whl", hash = "sha256:a2daea1cba83210c620e359de2861316f49cc7aea8e9a6979d6cb2ddab6dda8c"}, - {file = "numpy-1.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:dfdc8b53aa9838b9d44ed785431ca47aa3efaa51d0d5dd9c412ab5247151a7c4"}, - {file = "numpy-1.19.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9f7f56b5e85b08774939622b7d45a5d00ff511466522c44fc0756ac7692c00f2"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:8802d23e4895e0c65e418abe67cdf518aa5cbb976d97f42fd591f921d6dffad0"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c4aa79993f5d856765819a3651117520e41ac3f89c3fc1cb6dee11aa562df6da"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:51e8d2ae7c7e985c7bebf218e56f72fa93c900ad0c8a7d9fbbbf362f45710f69"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:50d3513469acf5b2c0406e822d3f314d7ac5788c2b438c24e5dd54d5a81ef522"}, - {file = "numpy-1.19.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:741d95eb2b505bb7a99fbf4be05fa69f466e240c2b4f2d3ddead4f1b5f82a5a5"}, - {file = "numpy-1.19.3-cp39-cp39-win32.whl", hash = "sha256:1ea7e859f16e72ab81ef20aae69216cfea870676347510da9244805ff9670170"}, - {file = "numpy-1.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:83af653bb92d1e248ccf5fdb05ccc934c14b936bcfe9b917dc180d3f00250ac6"}, - {file = "numpy-1.19.3-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9a0669787ba8c9d3bb5de5d9429208882fb47764aa79123af25c5edc4f5966b9"}, - {file = "numpy-1.19.3.zip", hash = "sha256:35bf5316af8dc7c7db1ad45bec603e5fb28671beb98ebd1d65e8059efcfd3b72"}, + {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"}, + {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"}, + {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"}, + {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"}, + {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"}, + {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"}, + {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"}, + {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"}, + {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"}, + {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"}, + {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"}, + {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"}, + {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"}, + {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"}, + {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"}, + {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"}, + {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"}, + {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"}, + {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"}, + {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"}, + {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"}, + {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"}, + {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"}, + {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"}, + {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"}, + {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"}, + {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"}, + {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"}, ] opencv-python = [ {file = "opencv_python-4.5.2.54-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6"}, @@ -847,6 +863,27 @@ pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] +pyproj = [ + {file = "pyproj-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8eda240225971b5cd0bac2d399ed6222068f0598ee92d5f6e847bd2019d2c8b0"}, + {file = "pyproj-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ae237492767e0225f99b53a0fd7110fde2b7e7cabc105bbc243c151a7497de88"}, + {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b635e7e21fea5af74e90fc9e54d1a4c27078efdce6f214101c98dd93afae599a"}, + {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa87df0982aa0f4477478899d9c930cc0f97cd6d8a4ce84c43ac88ccf86d1da7"}, + {file = "pyproj-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:10dad599b9f7ce2194996dc25f1000e0aa15754ecef9db46b624713959c67957"}, + {file = "pyproj-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a162ed199cd2ec392cffe20b2fa3381b68e7a166d55f3f060eceb8d517e4f46d"}, + {file = "pyproj-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e88ebc4e08e661e9011b5c1ebfb32f0d311963a9824a6effb4168c7e07918b1"}, + {file = "pyproj-3.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:da88abc5e2f6a8fb07533855a57ca2a31845f58901a87f821b68b0db6b023978"}, + {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:911d773da9fa4d4f3f7580173858c391e3ee0b61acaf0be303baab323d2eae78"}, + {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f8a8d982bde211e65dc2de1f8f36cf162f9cc7fcd8a7625046ea265284e5e65"}, + {file = "pyproj-3.1.0-cp38-cp38-win32.whl", hash = "sha256:c4193e1069d165476b2d0f7d882b7712b3eab6e2e6fe2a0a78ef40de825a1f28"}, + {file = "pyproj-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b6c74bbec679199746a3e02c0e0fad093c3652df96dd63e086a2fbf2afe9dc0e"}, + {file = "pyproj-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04c185102e659439c5bd428ac5473d36ef795fca8e225bbbe78e20643d804ec0"}, + {file = "pyproj-3.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ebbba7707fe83a01e54bce8e3e7342feb0b3e0d74ff8c28df12f8bc59b76827c"}, + {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cc464a1c51baad28ffb7a233116e8d4ce4c560b32039fa986d0f992ac3c431f"}, + {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f3ad09cf3352bf5664794042b28d98781362ec8d9774ad73f28a1a0101a27f1"}, + {file = "pyproj-3.1.0-cp39-cp39-win32.whl", hash = "sha256:ae5534fa7a3b74f20534694d297fce6f7483890ff6ca404394ecf372f3c589d4"}, + {file = "pyproj-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:808f5992320e9631b2e45444028a65cd6ba3ee40229292934178ef07020a5ffd"}, + {file = "pyproj-3.1.0.tar.gz", hash = "sha256:67b94f4e694ae33fc90dfb7da0e6b5ed5f671dd0acc2f6cf46e9c39d56e16e1a"}, +] pytest = [ {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, @@ -856,15 +893,15 @@ pytest-cov = [ {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, ] rasterio = [ - {file = "rasterio-1.2.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dd590eb130d96b7823de3a1e1e359d2a83b67a9bb538880a84c123c0d4a827d9"}, - {file = "rasterio-1.2.4-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6b7bcc859b8447827f415d6f719f099843658a738b46531c909c9a188828f52f"}, - {file = "rasterio-1.2.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d219d484a567ff045a97281d900db0e1eae80c9d59f1aa8b0092f7c304590d57"}, - {file = "rasterio-1.2.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d9e28dc1b32b39be9cf1c9c571524ef544543672cc2d08ff9e43285021f5465a"}, - {file = "rasterio-1.2.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:89500e607ab3cffcc247ff40a5cc48cbe8c437a0b0bfaa7e36db7a1f6abc7203"}, - {file = "rasterio-1.2.4-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cd2029f497383d837d4a6fb73d6646f8d15b8a8d62c8f912aa23fc552e436306"}, - {file = "rasterio-1.2.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c3ad993c11b34affaeb8d3c5966f8ba76b77641359fd98ce7522fd5cab1a1553"}, - {file = "rasterio-1.2.4-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b9c3aaa20bf9bc01eae453a1504c0f741ab71da0959a72636f4c9d1ff7735519"}, - {file = "rasterio-1.2.4.tar.gz", hash = "sha256:31248c5ddc8f138f73b166dd93384aa72d11abd0dc27dca90a190276c7976aa3"}, + {file = "rasterio-1.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fda220ca942ff7446458a1d532121a2a0bebffdcbe064e4719dcca348a2ed541"}, + {file = "rasterio-1.2.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2134587770d258ed97f40e4f910b7250bd3d39cdba76f9dd1617ca73cd481ff5"}, + {file = "rasterio-1.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6154622ec5210f5768db6544502b89487cfac10b0be9a321af33cd64e8cbe0fa"}, + {file = "rasterio-1.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bd06ed04197eb79b96240dc90354fe15e0fe9b531312830045c849e4db57a42f"}, + {file = "rasterio-1.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:87129e50e835e2696c17d19c5e7f5d566d09f8895d9e405e2c7d78adc63ae626"}, + {file = "rasterio-1.2.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da2ed05c025bbdc1df8bdd9d1237e96ca3030eadabdb67722674620e9732a54a"}, + {file = "rasterio-1.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294479e9d7caf64c95a90b2ed2ec13df6eba35f035f0c536a388e0160e9abf03"}, + {file = "rasterio-1.2.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f55aa86bac58672ca47627a1dfecd56d35581beb49feae1f22818f97ff79abf8"}, + {file = "rasterio-1.2.6.tar.gz", hash = "sha256:24975b97fe2fc3fd282d59640baab19de431448e1b23be6b85b68fecc1362f88"}, ] regex = [ {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, diff --git a/pyproject.toml b/pyproject.toml index df913d8..b61ced3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "geosardine" -version = "0.13.0" +version = "0.13.1" license = "BSD-3-Clause" description = "Spatial operations extend fiona and rasterio" authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"] @@ -18,22 +18,24 @@ classifiers = [ ] [tool.poetry.dependencies] -python = "^3.7" -numpy = ">=1.18,<1.19.4" +python = ">=3.7,<3.10" +numpy = ">=1.18" affine = "^2.3.0" shapely = ">=1.6.4,<2.0.0" -tqdm = "^4.48.2" -numba = "^0.51.2" +tqdm = ">=4.48.2,<5.0.0" +numba = ">=0.51.2" click = "^7.1.2" -gdal = "^3.0.4" -fiona = "^1.8.13" -rasterio = "^1.1.2" -opencv-python = "^4.4.0" +gdal = ">=3.0.4" +fiona = ">=1.8.13" +rasterio = ">=1.1.2" +opencv-python = ">=4.4.0,<=5.0.0" +pyproj = ">=2.6.1" +# pyproj = { path="../../../.pypkg/pyproj-3.1.0-cp38-cp38-win_amd64.whl" } [tool.poetry.dev-dependencies] -# gdal = { path="../../../.pypkg/GDAL-3.0.4-cp38-cp38-win_amd64.whl" } -# fiona = { path="../../../.pypkg/Fiona-1.8.13-cp38-cp38-win_amd64.whl" } -# rasterio = { path="../../../.pypkg/rasterio-1.1.2-cp38-cp38-win_amd64.whl" } +# gdal = { path="../../../.pypkg/GDAL-3.3.0-cp38-cp38-win_amd64.whl" } +# fiona = { path="../../../.pypkg/Fiona-1.8.20-cp38-cp38-win_amd64.whl" } +# rasterio = { path="../../../.pypkg/rasterio-1.2.6-cp38-cp38-win_amd64.whl" } pip = ">=20.0.0" pytest = "^5.2" black = "^20.8b1" From 143f84f9cf72b5904b6f402abc3553cef5bfddae Mon Sep 17 00:00:00 2001 From: Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com> Date: Sun, 20 Feb 2022 21:22:12 +0700 Subject: [PATCH 8/8] update crlf --- CHANGELOG.md | 380 ++--- README.md | 324 ++-- conda.recipe/meta.yaml | 118 +- geosardine/__init__.py | 70 +- geosardine/_utility.py | 832 +++++----- geosardine/raster.py | 2018 ++++++++++++------------ poetry.lock | 2116 +++++++++++++------------- pyproject.toml | 112 +- tests/idw/test_idw_file_8327.geojson | 24 +- tests/test_geosardine_interpolate.py | 104 +- tests/test_geosardine_raster.py | 90 +- 11 files changed, 3119 insertions(+), 3069 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 56203fb..1e2b976 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,190 +1,190 @@ -# Changelog -All notable changes to this project will be documented in this file. - -The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), -and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). - -## [Unreleased] - -## [0.13.1] - 2021-06-23 - -### Changed -- update dependency to latest - -## [0.13.0] - 2021-06-18 - -### Changed -- support any epsg code for calculating distance by using each datum semi major and semi minor axes - -## [0.12.0-aplha] - 2021-05-19 - -### Added -- clip2bbox - -## [0.11.0-aplha1] - 2021-03-19 - -### Added -- Added polygonize in raster - -### Fixed -- Fixed unused argument (offset) in Raster.xy2rowcol -### Changed -- moved pip to development dependency -- simplified numba xy2rowcol without creating new variable -- updated environment.yml - -### Removed -- removed unused module in utility - -## [0.11.0-alpha0] - 2021-02-24 - -### Fixed -- fixed xy2rowcol -- fixed coordinate for idw to reduce it by half of resolution to represent upper left pixel - -### Added -- indexing return raster with respective coordinate -- split into tiled -- interpolation return Raster instead InterpolationResult - -### Deprecated -- py_resample will be removed in the future - - - -## [0.10.3] - 2021-01-29 -### Added -- Added offset in xy2rowcol -- add ipython in dev dependency - - -## [0.10.2] - 2020-12-18 - -### Fixed - -- Flipped xy2rowcol numba -- fixed no data in Raster.from_rasterfile -- define resolution, when input is affine in Raster -- raster calculator error, caused by numba typing -- fixed algorithm with offset for raster calculator - -### Added - -- save with lzw compression -## [0.10.0] - 2020-12-17 - -### Added - -- Raster calculation using numba -- add floordiv -- parse raster from binary file -- add shape ordering in reading raster from binary file -- parse raster from raster file -- doc script for linux -- add pdoc3 in dev dependency -- add changelog.md in pyproject - -### Changed - -- Use numba to raster calculation -- upper changed to top - - -### Fixed - -- Restrict numpy version below 1.19.4, caused error in windows - -## [0.9.5] - 2020-12-13 - -### Fixed - -- Flipped cv resize input -- Return numpy array when slicing - -## [0.9.4] - 2020-12-11 - -### Added - -- add no data when saving raster -- documentation for Raster attributes -- add missing return type in save_raster - -### Changed - -- py resample, resize and opencv resample, resize turn into private method. To prevent confusion, less abstraction. - -### Removed - -- remove import numba in raster.py - -## [0.9.3] - 2020-12-10 - -### Added - -- upper, left, right, bottom boundary - -### Changed - -- minimum argument needed is x_min, y_max, resolution or transform -- simpler conditional statement in raster init -- x_min, x_max, y_max,y_min is computed properties - -### Fixed - -- save raster return exact layer not +1 layer -- return no data if pixel out of bound for raster calculation -- raise error when using xy_value and the row col index is negative - -## [0.9.2] - 2020-12-09 -### Added -- Add numpy.ndarray type in raster calculation -- Raster.xy_value documentation -- Add pytest to check affine parameter - -### Changed -- Show error if xy_value result is out of bound -- Change y_min into y_max in raster calculation, resize and resample - -### Fixed -- Fix y_min attribute in raster calculation, resize and resample - -## [0.9.1] - 2020-12-09 -### Changed -- Change y_min into y_max in creating Affine - -## [0.9.0] - 2020-12-08 -### Added -- resize and resample using opencv for faster performance -- check validity, y_min should be less than y_max and x_min should be less than x_max -- add no data value -- return no data if any pixel is no data (raster calculation) - -### Changed -- Use x_min and y_max as minimum input argument to fit upper left extent -- Refactor raster calculation per pixel to reduce cognitive complexity -- Check array shape as a tuple - -### Fixed -- Remove pip check because different opencv name in pypi and anaconda - -### Removed -- Remove shape check per element - -## [0.8.0] - 2020-12-05 -### Added -- Raster wrapper -- Support multiple layer in raster calculation - - -[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.1...HEAD -[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.13.0...v0.13.1 -[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0 -[0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0 -[0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0 -[0.10.2]: https://github.com/sahitono/geosardine/compare/v0.9.5...v0.10.2 -[0.9.5]: https://github.com/sahitono/geosardine/compare/v0.9.4...v0.9.5 -[0.9.4]: https://github.com/sahitono/geosardine/compare/v0.9.3...v0.9.4 -[0.9.3]: https://github.com/sahitono/geosardine/compare/v0.9.2...v0.9.3 -[0.9.2]: https://github.com/sahitono/geosardine/compare/v0.9.0...v0.9.2 -[0.9.0]: https://github.com/sahitono/geosardine/compare/v0.8.0...v0.9.0 -[0.8.0]: https://github.com/sahitono/geosardine/releases/tag/v0.8.0 +# Changelog +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.13.1] - 2021-06-23 + +### Changed +- update dependency to latest + +## [0.13.0] - 2021-06-18 + +### Changed +- support any epsg code for calculating distance by using each datum semi major and semi minor axes + +## [0.12.0-aplha] - 2021-05-19 + +### Added +- clip2bbox + +## [0.11.0-aplha1] - 2021-03-19 + +### Added +- Added polygonize in raster + +### Fixed +- Fixed unused argument (offset) in Raster.xy2rowcol +### Changed +- moved pip to development dependency +- simplified numba xy2rowcol without creating new variable +- updated environment.yml + +### Removed +- removed unused module in utility + +## [0.11.0-alpha0] - 2021-02-24 + +### Fixed +- fixed xy2rowcol +- fixed coordinate for idw to reduce it by half of resolution to represent upper left pixel + +### Added +- indexing return raster with respective coordinate +- split into tiled +- interpolation return Raster instead InterpolationResult + +### Deprecated +- py_resample will be removed in the future + + + +## [0.10.3] - 2021-01-29 +### Added +- Added offset in xy2rowcol +- add ipython in dev dependency + + +## [0.10.2] - 2020-12-18 + +### Fixed + +- Flipped xy2rowcol numba +- fixed no data in Raster.from_rasterfile +- define resolution, when input is affine in Raster +- raster calculator error, caused by numba typing +- fixed algorithm with offset for raster calculator + +### Added + +- save with lzw compression +## [0.10.0] - 2020-12-17 + +### Added + +- Raster calculation using numba +- add floordiv +- parse raster from binary file +- add shape ordering in reading raster from binary file +- parse raster from raster file +- doc script for linux +- add pdoc3 in dev dependency +- add changelog.md in pyproject + +### Changed + +- Use numba to raster calculation +- upper changed to top + + +### Fixed + +- Restrict numpy version below 1.19.4, caused error in windows + +## [0.9.5] - 2020-12-13 + +### Fixed + +- Flipped cv resize input +- Return numpy array when slicing + +## [0.9.4] - 2020-12-11 + +### Added + +- add no data when saving raster +- documentation for Raster attributes +- add missing return type in save_raster + +### Changed + +- py resample, resize and opencv resample, resize turn into private method. To prevent confusion, less abstraction. + +### Removed + +- remove import numba in raster.py + +## [0.9.3] - 2020-12-10 + +### Added + +- upper, left, right, bottom boundary + +### Changed + +- minimum argument needed is x_min, y_max, resolution or transform +- simpler conditional statement in raster init +- x_min, x_max, y_max,y_min is computed properties + +### Fixed + +- save raster return exact layer not +1 layer +- return no data if pixel out of bound for raster calculation +- raise error when using xy_value and the row col index is negative + +## [0.9.2] - 2020-12-09 +### Added +- Add numpy.ndarray type in raster calculation +- Raster.xy_value documentation +- Add pytest to check affine parameter + +### Changed +- Show error if xy_value result is out of bound +- Change y_min into y_max in raster calculation, resize and resample + +### Fixed +- Fix y_min attribute in raster calculation, resize and resample + +## [0.9.1] - 2020-12-09 +### Changed +- Change y_min into y_max in creating Affine + +## [0.9.0] - 2020-12-08 +### Added +- resize and resample using opencv for faster performance +- check validity, y_min should be less than y_max and x_min should be less than x_max +- add no data value +- return no data if any pixel is no data (raster calculation) + +### Changed +- Use x_min and y_max as minimum input argument to fit upper left extent +- Refactor raster calculation per pixel to reduce cognitive complexity +- Check array shape as a tuple + +### Fixed +- Remove pip check because different opencv name in pypi and anaconda + +### Removed +- Remove shape check per element + +## [0.8.0] - 2020-12-05 +### Added +- Raster wrapper +- Support multiple layer in raster calculation + + +[Unreleased]: https://github.com/olivierlacan/keep-a-changelog/compare/v0.13.1...HEAD +[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.13.0...v0.13.1 +[0.13.0]: https://github.com/sahitono/geosardine/compare/v0.12.0-alpha0...v0.13.0 +[0.12.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.11.0-alpha0...v0.12.0-alpha0 +[0.11.0-alpha0]: https://github.com/sahitono/geosardine/compare/v0.10.2...v0.11.0-alpha0 +[0.10.2]: https://github.com/sahitono/geosardine/compare/v0.9.5...v0.10.2 +[0.9.5]: https://github.com/sahitono/geosardine/compare/v0.9.4...v0.9.5 +[0.9.4]: https://github.com/sahitono/geosardine/compare/v0.9.3...v0.9.4 +[0.9.3]: https://github.com/sahitono/geosardine/compare/v0.9.2...v0.9.3 +[0.9.2]: https://github.com/sahitono/geosardine/compare/v0.9.0...v0.9.2 +[0.9.0]: https://github.com/sahitono/geosardine/compare/v0.8.0...v0.9.0 +[0.8.0]: https://github.com/sahitono/geosardine/releases/tag/v0.8.0 diff --git a/README.md b/README.md index 1607ab5..b44bd68 100644 --- a/README.md +++ b/README.md @@ -1,162 +1,162 @@ -# Geo-Sardine :fish: -![python package](https://github.com/sahitono/geosardine/workflows/python%20package/badge.svg) -[![codecov](https://codecov.io/gh/sahitono/geosardine/branch/master/graph/badge.svg)](https://codecov.io/gh/sahitono/geosardine) -[![Maintainability](https://api.codeclimate.com/v1/badges/e7ec3c08fe42ef4b5e19/maintainability)](https://codeclimate.com/github/sahitono/geosardine/maintainability) - -![PyPI - Python Version](https://img.shields.io/pypi/pyversions/geosardine) -![PyPI](https://img.shields.io/pypi/v/geosardine) -![Conda](https://img.shields.io/conda/v/sahitono/geosardine) - -Spatial operations extend fiona and rasterio. -Collection of spatial operation which i occasionally use written in python: - - Interpolation with IDW (Inverse Distance Weighting) Shepard - - Drape vector to raster - - Spatial join between two vector - - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample - -:blue_book: documentation: https://sahitono.github.io/geosardine -## Setup -install with pip -```pip install geosardine``` - -or anaconda -```conda install -c sahitono geosardine``` - -## How to use it - -#### Drape and spatial join -```python -import geosardine as dine -import rasterio -import fiona - -with rasterio.open("/home/user/data.tif") as raster, fiona.open("/home/user/data.shp") as vector: - draped = dine.drape_geojson(vector, raster) - joined = dine.spatial_join(vector, raster) -``` -#### IDW Interpolation -```python -import numpy as np -import geosardine as dine -xy = np.array([ - [106.8358, -6.585 ], - [106.6039, -6.7226], - [106.7589, -6.4053], - [106.9674, -6.7092], - [106.7956, -6.5988] -]) -values = np.array([132., 127., 37., 90., 182.]) - -""" -if epsg not provided, it will assume that coordinate is in wgs84 geographic -Find your epsg here https://epsg.io/ -""" -interpolated = dine.interpolate.idw(xy, values, spatial_res=(0.01,0.01), epsg=4326) - -# Save interpolation result to tiff -interpolated.save('idw.tif') - -# shapefile or geojson can be used too -interp_file = dine.interpolate.idw("points.shp", spatial_res=(0.01,0.01), column_name="value") -interp_file.save("idw.tif") - -# The result array can be accessed like this -print(interpolated.array) -""" -[[ 88.63769859 86.24219616 83.60463194 ... 101.98185127 103.37001289 - 104.54621272] - [ 90.12053232 87.79279317 85.22030848 ... 103.77118852 105.01425289 - 106.05302554] - [ 91.82987695 89.60855271 87.14722258 ... 105.70090081 106.76928067 - 107.64635337] - ... - [127.21214817 127.33208302 127.53878268 ... 97.80436475 94.96247196 - 93.12113458] - [127.11315081 127.18465002 127.33444124 ... 95.86455668 93.19212577 - 91.51135399] - [127.0435062 127.0827023 127.19214624 ... 94.80175756 92.30685734 - 90.75707134]] -""" - - -``` - - -## Raster Wrapper -Geosardine include wrapper for raster data. The benefit are: -1. math operation (addition, subtraction, division, multiplication) between rasters of different size, resolution and reference system. - The data type result is equal to the first raster data type - - for example: - ``` - raster1 = float32 and raster2 = int32 - raster3 = raster1 - raster2 - raster3 will be float32 - ``` - - -2. resample with opencv -3. resize with opencv -4. split into tiled - - -```python -from geosardine import Raster - - -""" -minimum parameter needed to create raster are -1. 2D numpy array, example: np.ones(18, dtype=np.float32).reshape(3, 3, 2) -2. spatial resolution, example: 0.4 or ( 0.4, 0.4) -3. left coordinate / x minimum -4. bottom coordinate / y minimum -""" -raster1 = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7) - -## resample -resampled = raster.resample((0.2,0.2)) -## resize -resized = raster.resize(height=16, width=16) - -## math operation between raster -raster_2 = raster + resampled -raster_2 = raster - resampled -raster_2 = raster * resampled -raster_2 = raster / resampled - -## math operation raster to number -raster_3 = raster + 2 -raster_3 = raster - 2 -raster_3 = raster * 2 -raster_3 = raster / 2 - -### plot it using raster.array -import matplotlib.pyplot as plt -plt.imshow(raster_3) -plt.show() - -``` - - - -## Geosardine CLI -You can use it through terminal or command prompt by calling **dine** - -``` -$ dine --help -Usage: dine [OPTIONS] COMMAND [ARGS]... - - GeoSardine CLI - -Options: - --help Show this message and exit. - -Commands: - drape Drape vector to raster to obtain height value - info Get supported format - join-spatial Join attribute by location - idw Create raster with Inverse Distance Weighting interpolation -``` - -### License -[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) +# Geo-Sardine :fish: +![python package](https://github.com/sahitono/geosardine/workflows/python%20package/badge.svg) +[![codecov](https://codecov.io/gh/sahitono/geosardine/branch/master/graph/badge.svg)](https://codecov.io/gh/sahitono/geosardine) +[![Maintainability](https://api.codeclimate.com/v1/badges/e7ec3c08fe42ef4b5e19/maintainability)](https://codeclimate.com/github/sahitono/geosardine/maintainability) + +![PyPI - Python Version](https://img.shields.io/pypi/pyversions/geosardine) +![PyPI](https://img.shields.io/pypi/v/geosardine) +![Conda](https://img.shields.io/conda/v/sahitono/geosardine) + +Spatial operations extend fiona and rasterio. +Collection of spatial operation which i occasionally use written in python: + - Interpolation with IDW (Inverse Distance Weighting) Shepard + - Drape vector to raster + - Spatial join between two vector + - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample + +:blue_book: documentation: https://sahitono.github.io/geosardine +## Setup +install with pip +```pip install geosardine``` + +or anaconda +```conda install -c sahitono geosardine``` + +## How to use it + +#### Drape and spatial join +```python +import geosardine as dine +import rasterio +import fiona + +with rasterio.open("/home/user/data.tif") as raster, fiona.open("/home/user/data.shp") as vector: + draped = dine.drape_geojson(vector, raster) + joined = dine.spatial_join(vector, raster) +``` +#### IDW Interpolation +```python +import numpy as np +import geosardine as dine +xy = np.array([ + [106.8358, -6.585 ], + [106.6039, -6.7226], + [106.7589, -6.4053], + [106.9674, -6.7092], + [106.7956, -6.5988] +]) +values = np.array([132., 127., 37., 90., 182.]) + +""" +if epsg not provided, it will assume that coordinate is in wgs84 geographic +Find your epsg here https://epsg.io/ +""" +interpolated = dine.interpolate.idw(xy, values, spatial_res=(0.01,0.01), epsg=4326) + +# Save interpolation result to tiff +interpolated.save('idw.tif') + +# shapefile or geojson can be used too +interp_file = dine.interpolate.idw("points.shp", spatial_res=(0.01,0.01), column_name="value") +interp_file.save("idw.tif") + +# The result array can be accessed like this +print(interpolated.array) +""" +[[ 88.63769859 86.24219616 83.60463194 ... 101.98185127 103.37001289 + 104.54621272] + [ 90.12053232 87.79279317 85.22030848 ... 103.77118852 105.01425289 + 106.05302554] + [ 91.82987695 89.60855271 87.14722258 ... 105.70090081 106.76928067 + 107.64635337] + ... + [127.21214817 127.33208302 127.53878268 ... 97.80436475 94.96247196 + 93.12113458] + [127.11315081 127.18465002 127.33444124 ... 95.86455668 93.19212577 + 91.51135399] + [127.0435062 127.0827023 127.19214624 ... 94.80175756 92.30685734 + 90.75707134]] +""" + + +``` + + +## Raster Wrapper +Geosardine include wrapper for raster data. The benefit are: +1. math operation (addition, subtraction, division, multiplication) between rasters of different size, resolution and reference system. + The data type result is equal to the first raster data type + + for example: + ``` + raster1 = float32 and raster2 = int32 + raster3 = raster1 - raster2 + raster3 will be float32 + ``` + + +2. resample with opencv +3. resize with opencv +4. split into tiled + + +```python +from geosardine import Raster + + +""" +minimum parameter needed to create raster are +1. 2D numpy array, example: np.ones(18, dtype=np.float32).reshape(3, 3, 2) +2. spatial resolution, example: 0.4 or ( 0.4, 0.4) +3. left coordinate / x minimum +4. bottom coordinate / y minimum +""" +raster1 = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7) + +## resample +resampled = raster.resample((0.2,0.2)) +## resize +resized = raster.resize(height=16, width=16) + +## math operation between raster +raster_2 = raster + resampled +raster_2 = raster - resampled +raster_2 = raster * resampled +raster_2 = raster / resampled + +## math operation raster to number +raster_3 = raster + 2 +raster_3 = raster - 2 +raster_3 = raster * 2 +raster_3 = raster / 2 + +### plot it using raster.array +import matplotlib.pyplot as plt +plt.imshow(raster_3) +plt.show() + +``` + + + +## Geosardine CLI +You can use it through terminal or command prompt by calling **dine** + +``` +$ dine --help +Usage: dine [OPTIONS] COMMAND [ARGS]... + + GeoSardine CLI + +Options: + --help Show this message and exit. + +Commands: + drape Drape vector to raster to obtain height value + info Get supported format + join-spatial Join attribute by location + idw Create raster with Inverse Distance Weighting interpolation +``` + +### License +[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) diff --git a/conda.recipe/meta.yaml b/conda.recipe/meta.yaml index 46b27e4..e6c0e50 100644 --- a/conda.recipe/meta.yaml +++ b/conda.recipe/meta.yaml @@ -1,59 +1,59 @@ -{% set name = "geosardine" %} -{% set version = "0.13.1" %} - -package: - name: {{ name|lower }} - version: {{ version }} - -source: - url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz - sha256: a3737c9dad7d52b41f6cebb18d6c085c5a0ad14a9dc2c23f977c42be305db1b5 - -build: - noarch: python - number: 0 - entry_points: - - dine = geosardine.__main__:main -# script: {{ PYTHON }} -m pip install . -vv - -requirements: - host: - - python >=3.6,<3.10 - - pip - - pytest-runner -# - poetry - - run: - - affine >=2.3.0,<3.0.0 - - click >=7.1.2,<8.0.0 - - fiona >=1.8.13,<2.0.0 - - gdal >=3.0.4 - - numba >=0.51.2 - - numpy >=1.18,<2.0 - - python >=3.6,<3.10 - - rasterio >=1.1.4,<2.0.0 - - shapely >=1.6.4,<2.0.0 - - tqdm - - opencv >=4.4.0,<5.0.0 - - -test: - imports: - - geosardine - - geosardine.interpolate - - geosardine.raster - commands: - - dine --help - requires: - - pytest - -about: - home: https://github.com/sahitono/geosardine - summary: Spatial operations extend fiona and rasterio - license: BSD-3-Clause - license_family: BSD - license_file: LICENSE.txt - -extra: - recipe-maintainers: - - sahitono +{% set name = "geosardine" %} +{% set version = "0.13.1" %} + +package: + name: {{ name|lower }} + version: {{ version }} + +source: + url: https://pypi.io/packages/source/{{ name[0] }}/{{ name }}/{{ name }}-{{ version }}.tar.gz + sha256: a3737c9dad7d52b41f6cebb18d6c085c5a0ad14a9dc2c23f977c42be305db1b5 + +build: + noarch: python + number: 0 + entry_points: + - dine = geosardine.__main__:main +# script: {{ PYTHON }} -m pip install . -vv + +requirements: + host: + - python >=3.6,<3.10 + - pip + - pytest-runner +# - poetry + + run: + - affine >=2.3.0,<3.0.0 + - click >=7.1.2,<8.0.0 + - fiona >=1.8.13,<2.0.0 + - gdal >=3.0.4 + - numba >=0.51.2 + - numpy >=1.18,<2.0 + - python >=3.6,<3.10 + - rasterio >=1.1.4,<2.0.0 + - shapely >=1.6.4,<2.0.0 + - tqdm + - opencv >=4.4.0,<5.0.0 + + +test: + imports: + - geosardine + - geosardine.interpolate + - geosardine.raster + commands: + - dine --help + requires: + - pytest + +about: + home: https://github.com/sahitono/geosardine + summary: Spatial operations extend fiona and rasterio + license: BSD-3-Clause + license_family: BSD + license_file: LICENSE.txt + +extra: + recipe-maintainers: + - sahitono diff --git a/geosardine/__init__.py b/geosardine/__init__.py index 572eb78..dc6eb0c 100644 --- a/geosardine/__init__.py +++ b/geosardine/__init__.py @@ -1,35 +1,35 @@ -""" -Spatial operations extend fiona and rasterio. -Collection of spatial operation which i occasionally use written in python: - - Interpolation with IDW (Inverse Distance Weighting) Shepard - - Drape vector to raster - - Spatial join between two vector - - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample -""" -from . import interpolate -from ._geosardine import ( - drape2raster, - drape_geojson, - drape_shapely, - rowcol2xy, - spatial_join, - xy2rowcol, -) -from ._utility import harvesine_distance, vincenty_distance -from .raster import Raster - -__all__ = [ - "rowcol2xy", - "xy2rowcol", - "drape2raster", - "spatial_join", - "drape_shapely", - "drape_geojson", - "interpolate", - "harvesine_distance", - "vincenty_distance", - "Raster", -] - -__version__ = "0.10.2" -__author__ = "Sahit Tuntas Sadono" +""" +Spatial operations extend fiona and rasterio. +Collection of spatial operation which i occasionally use written in python: + - Interpolation with IDW (Inverse Distance Weighting) Shepard + - Drape vector to raster + - Spatial join between two vector + - Raster wrapper, for better experience. ie: math operation between two raster, resize and resample +""" +from . import interpolate +from ._geosardine import ( + drape2raster, + drape_geojson, + drape_shapely, + rowcol2xy, + spatial_join, + xy2rowcol, +) +from ._utility import harvesine_distance, vincenty_distance +from .raster import Raster + +__all__ = [ + "rowcol2xy", + "xy2rowcol", + "drape2raster", + "spatial_join", + "drape_shapely", + "drape_geojson", + "interpolate", + "harvesine_distance", + "vincenty_distance", + "Raster", +] + +__version__ = "0.13.2" +__author__ = "Sahit Tuntas Sadono" diff --git a/geosardine/_utility.py b/geosardine/_utility.py index 66638b7..5177c04 100644 --- a/geosardine/_utility.py +++ b/geosardine/_utility.py @@ -1,416 +1,416 @@ -import math -from functools import singledispatch -from pathlib import Path -from typing import List, Optional, Tuple, Union - -import numba -import numpy as np -import rasterio -from affine import Affine -from osgeo import osr -from rasterio.crs import CRS - - -def calc_affine(coordinate_array: np.ndarray) -> Affine: - x_res = coordinate_array[0, 1, 0] - coordinate_array[0, 0, 0] - y_res = coordinate_array[1, 0, 1] - coordinate_array[0, 0, 1] - x_min, y_max = coordinate_array[0, 0] - x_min -= x_res / 2 - y_max -= y_res / 2 - affine = Affine.translation(*coordinate_array[0, 0]) * Affine.scale(x_res, y_res) - return affine - - -def get_ellipsoid_par(epsg: int) -> Tuple[float, float, float]: - crs = CRS.from_epsg(epsg) - semi_major = float( - osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 1) - ) - inverse_flattening = float( - osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 2) - ) - semi_minor: float = (1 - (1 / inverse_flattening)) * semi_major - return semi_major, semi_minor, inverse_flattening - - -def save_raster( - file_name: Union[str, Path], - value_array: np.ndarray, - crs: Union[CRS, int], - coordinate_array: Optional[np.ndarray] = None, - affine: Optional[Affine] = None, - nodata: Union[None, float, int] = None, - compress: bool = False, -) -> None: - - if len(value_array.shape) == 3: - height, width, layers = value_array.shape - else: - height, width = value_array.shape - layers = 1 - - value_array = value_array.reshape(height, width, layers) - - _compress = None - if compress: - _compress = "lzw" - - if affine is None: - if coordinate_array is None: - raise ValueError("please, provide array of coordinate per pixel") - affine = calc_affine(coordinate_array) - - if type(crs) == int: - crs = CRS.from_epsg(crs) - if nodata is not None: - with rasterio.open( - file_name, - "w", - driver="GTiff", - height=height, - width=width, - count=layers, - dtype=value_array.dtype, - crs=crs, - transform=affine, - nodata=nodata, - compress=_compress, - ) as raster: - for layer in range(layers): - raster.write(value_array[:, :, layer], layer + 1) - else: - with rasterio.open( - file_name, - "w", - driver="GTiff", - height=height, - width=width, - count=layers, - dtype=value_array.dtype, - crs=crs, - transform=affine, - compress=_compress, - ) as raster: - for layer in range(layers): - raster.write(value_array[:, :, layer], layer + 1) - print(f"{file_name} saved") - - -def harvesine_distance( - long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], - long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], - epsg: int = 4326, -) -> Optional[float]: - - """Calculate distance in ellipsoid by harvesine method - faster, less accurate - - Parameters - ---------- - long_lat1 : tuple, list - first point coordinate in longitude, latitude - long_lat2 : tuple, list - second point coordinate in longitude, latitude - epsg : int, optional - epsg code of the spatial reference system, by default 4326 - - Returns - ------- - Optional[float] - distance, if None then input is not np.ndarray, tuple or list - - Notes - ------- - https://rafatieppo.github.io/post/2018_07_27_idw2pyr/ - """ - - semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) - - return _harvesine_distance_dispatch( - long_lat1, - long_lat2, - semi_major=semi_major, - semi_minor=semi_minor, - i_flattening=i_flattening, - ) - - -@singledispatch -def _harvesine_distance_dispatch( - long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], - long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], - semi_major: float, - semi_minor: float, - i_flattening: float, -) -> Optional[float]: - """ - Calculate distance in ellipsoid by harvesine method - faster, less accurate - - Parameters - ---------- - long_lat1 : tuple, list, numpy array - first point coordinate in longitude, latitude - long_lat2 : tuple, list, numpy array - second point coordinate in longitude, latitude - semi_major : float - ellipsoid's semi major axes - semi_minor : float - ellipsoid's semi minor axes - i_flattening : float - ellipsoid's inverse flattening - - Returns - ------- - Optional[float] - distance, if None then input is not np.ndarray, tuple or list - - Notes - ------- - https://rafatieppo.github.io/post/2018_07_27_idw2pyr/ - """ - - print("only accept numpy array, list and tuple") - return None - - -@_harvesine_distance_dispatch.register(np.ndarray) -@numba.njit() -def _harvesine_distance( - long_lat1: np.ndarray, - long_lat2: np.ndarray, - semi_major: float = 6378137.0, - semi_minor: float = 6356752.314245179, - i_flattening=298.257223563, -) -> float: - long1, lat1 = np.radians(long_lat1) - long2, lat2 = np.radians(long_lat2) - - long_diff = long2 - long1 - lat_diff = lat2 - lat1 - a = ( - math.sin(lat_diff / 2) ** 2 - + math.cos(lat1) * math.cos(lat2) * math.sin(long_diff / 2) ** 2 - ) - c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) - return np.abs(semi_major * c) - - -@_harvesine_distance_dispatch.register(list) -def __harvesine_distance( - long_lat1: List[float], - long_lat2: List[float], - semi_major: float, - semi_minor: float, - i_flattening: float, -): - return _harvesine_distance( - np.array(long_lat1), - np.array(long_lat2), - semi_major, - semi_minor, - i_flattening, - ) - - -@_harvesine_distance_dispatch.register(tuple) -def __harvesine_distance( - long_lat1: Tuple[float, float], - long_lat2: Tuple[float, float], - semi_major: float, - semi_minor: float, - i_flattening: float, -): - return _harvesine_distance( - np.array(long_lat1), - np.array(long_lat2), - semi_major, - semi_minor, - i_flattening, - ) - - -def vincenty_distance( - long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], - long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], - epsg: int = 4326, -) -> float: - """Calculate distance in ellipsoid by vincenty method - slower, more accurate - - Parameters - ---------- - long_lat1 : tuple, list - first point coordinate in longitude, latitude - long_lat2 : tuple, list - second point coordinate in longitude, latitude - epsg : int, optional - epsg code of the spatial reference system, by default 4326 - - Returns - ------- - float - distance - - Notes - ------- - https://www.johndcook.com/blog/2018/11/24/spheroid-distance/ - """ - - semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) - - return _vincenty_distance_dispatch( - long_lat1, - long_lat2, - semi_major=semi_major, - semi_minor=semi_minor, - i_flattening=i_flattening, - ) - - -@singledispatch -def _vincenty_distance_dispatch( - long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], - long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], - epsg: int, - semi_major: float, - semi_minor: float, - i_flattening: float, -) -> Optional[float]: - """ - Calculate distance in ellipsoid by vincenty method - slower, more accurate - - Parameters - ---------- - long_lat1 : tuple, list - first point coordinate in longitude, latitude - long_lat2 : tuple, list - second point coordinate in longitude, latitude - semi_major : float - ellipsoid's semi major axes - semi_minor : float - ellipsoid's semi minor axes - i_flattening : float - ellipsoid's inverse flattening - - Returns - ------- - distance - - Notes - ------- - https://www.johndcook.com/blog/2018/11/24/spheroid-distance/ - """ - - print("only accept numpy array, list and tuple") - return None - - -@_vincenty_distance_dispatch.register(np.ndarray) -@numba.njit() -def _vincenty_distance( - long_lat1: np.ndarray, - long_lat2: np.ndarray, - semi_major: float = 6378137.0, - semi_minor: float = 6356752.314245179, - i_flattening=298.257223563, -) -> float: - # WGS 1984 - flattening = 1 / i_flattening - tolerance = 1e-11 # to stop iteration - - radians = math.pi / 180 - long1, lat1 = np.radians(long_lat1) - long2, lat2 = np.radians(long_lat2) - - distance = 0.0 - - if long1 != long2 and lat1 != lat2: - phi1, phi2 = lat1, lat2 - u1 = math.atan((1 - flattening) * math.tan(phi1)) - u2 = math.atan((1 - flattening) * math.tan(phi2)) - long_diff = long2 - long1 - - lambda_old = long_diff + 0 - - while True: - t = (math.cos(u2) * math.sin(lambda_old)) ** 2 - t += ( - math.cos(u1) * math.sin(u2) - - math.sin(u1) * math.cos(u2) * math.cos(lambda_old) - ) ** 2 - sin_sigma = t ** 0.5 - cos_sigma = math.sin(u1) * math.sin(u2) + math.cos(u1) * math.cos( - u2 - ) * math.cos(lambda_old) - sigma = math.atan2(sin_sigma, cos_sigma) - - sin_alpha = math.cos(u1) * math.cos(u2) * math.sin(lambda_old) / sin_sigma - cos_sq_alpha = 1 - sin_alpha ** 2 - cos_2sigma_m = cos_sigma - 2 * math.sin(u1) * math.sin(u2) / cos_sq_alpha - c = ( - flattening - * cos_sq_alpha - * (4 + flattening * (4 - 3 * cos_sq_alpha)) - / 16 - ) - - t = sigma + c * sin_sigma * ( - cos_2sigma_m + c * cos_sigma * (-1 + 2 * cos_2sigma_m ** 2) - ) - lambda_new = long_diff + (1 - c) * flattening * sin_alpha * t - if abs(lambda_new - lambda_old) <= tolerance: - break - else: - lambda_old = lambda_new - - u2 = cos_sq_alpha * ((semi_major ** 2 - semi_minor ** 2) / semi_minor ** 2) - A = 1 + (u2 / 16384) * (4096 + u2 * (-768 + u2 * (320 - 175 * u2))) - B = (u2 / 1024) * (256 + u2 * (-128 + u2 * (74 - 47 * u2))) - t = cos_2sigma_m + 0.25 * B * (cos_sigma * (-1 + 2 * cos_2sigma_m ** 2)) - t -= ( - (B / 6) - * cos_2sigma_m - * (-3 + 4 * sin_sigma ** 2) - * (-3 + 4 * cos_2sigma_m ** 2) - ) - delta_sigma = B * sin_sigma * t - distance = semi_minor * A * (sigma - delta_sigma) - - return np.abs(distance) - - -@_vincenty_distance_dispatch.register(list) -def __vincenty_distance( - long_lat1: List[float], long_lat2: List[float], *args, **kwargs -): - return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs) - - -@_vincenty_distance_dispatch.register(tuple) -def __vincenty_distance( - long_lat1: Tuple[float, float], long_lat2: Tuple[float, float], *args, **kwargs -): - return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs) - - -@numba.njit() -def projected_distance( - xy1: Union[Tuple[float, float], List[float]], - xy2: Union[Tuple[float, float], List[float]], -) -> float: - return math.sqrt((xy1[0] - xy2[0]) ** 2 + (xy1[1] - xy2[1]) ** 2) - - -def calc_extent(points: np.ndarray) -> Tuple[float, float, float, float]: - x_max, y_max = points[:, 0].max(), points[:, 1].max() - x_min, y_min = points[:, 0].min(), points[:, 1].min() - return x_min, y_min, x_max, y_max - - -calc_distance = { - "harvesine": _harvesine_distance, - "vincenty": _vincenty_distance, - "projected": projected_distance, -} +import math +from functools import singledispatch +from pathlib import Path +from typing import List, Optional, Tuple, Union + +import numba +import numpy as np +import rasterio +from affine import Affine +from osgeo import osr +from rasterio.crs import CRS + + +def calc_affine(coordinate_array: np.ndarray) -> Affine: + x_res = coordinate_array[0, 1, 0] - coordinate_array[0, 0, 0] + y_res = coordinate_array[1, 0, 1] - coordinate_array[0, 0, 1] + x_min, y_max = coordinate_array[0, 0] + x_min -= x_res / 2 + y_max -= y_res / 2 + affine = Affine.translation(*coordinate_array[0, 0]) * Affine.scale(x_res, y_res) + return affine + + +def get_ellipsoid_par(epsg: int) -> Tuple[float, float, float]: + crs = CRS.from_epsg(epsg) + semi_major = float( + osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 1) + ) + inverse_flattening = float( + osr.SpatialReference(wkt=crs.to_wkt()).GetAttrValue("SPHEROID", 2) + ) + semi_minor: float = (1 - (1 / inverse_flattening)) * semi_major + return semi_major, semi_minor, inverse_flattening + + +def save_raster( + file_name: Union[str, Path], + value_array: np.ndarray, + crs: Union[CRS, int], + coordinate_array: Optional[np.ndarray] = None, + affine: Optional[Affine] = None, + nodata: Union[None, float, int] = None, + compress: bool = False, +) -> None: + + if len(value_array.shape) == 3: + height, width, layers = value_array.shape + else: + height, width = value_array.shape + layers = 1 + + value_array = value_array.reshape(height, width, layers) + + _compress = None + if compress: + _compress = "lzw" + + if affine is None: + if coordinate_array is None: + raise ValueError("please, provide array of coordinate per pixel") + affine = calc_affine(coordinate_array) + + if type(crs) == int: + crs = CRS.from_epsg(crs) + if nodata is not None: + with rasterio.open( + file_name, + "w", + driver="GTiff", + height=height, + width=width, + count=layers, + dtype=value_array.dtype, + crs=crs, + transform=affine, + nodata=nodata, + compress=_compress, + ) as raster: + for layer in range(layers): + raster.write(value_array[:, :, layer], layer + 1) + else: + with rasterio.open( + file_name, + "w", + driver="GTiff", + height=height, + width=width, + count=layers, + dtype=value_array.dtype, + crs=crs, + transform=affine, + compress=_compress, + ) as raster: + for layer in range(layers): + raster.write(value_array[:, :, layer], layer + 1) + print(f"{file_name} saved") + + +def harvesine_distance( + long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], + long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + epsg: int = 4326, +) -> Optional[float]: + + """Calculate distance in ellipsoid by harvesine method + faster, less accurate + + Parameters + ---------- + long_lat1 : tuple, list + first point coordinate in longitude, latitude + long_lat2 : tuple, list + second point coordinate in longitude, latitude + epsg : int, optional + epsg code of the spatial reference system, by default 4326 + + Returns + ------- + Optional[float] + distance, if None then input is not np.ndarray, tuple or list + + Notes + ------- + https://rafatieppo.github.io/post/2018_07_27_idw2pyr/ + """ + + semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) + + return _harvesine_distance_dispatch( + long_lat1, + long_lat2, + semi_major=semi_major, + semi_minor=semi_minor, + i_flattening=i_flattening, + ) + + +@singledispatch +def _harvesine_distance_dispatch( + long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], + long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + semi_major: float, + semi_minor: float, + i_flattening: float, +) -> Optional[float]: + """ + Calculate distance in ellipsoid by harvesine method + faster, less accurate + + Parameters + ---------- + long_lat1 : tuple, list, numpy array + first point coordinate in longitude, latitude + long_lat2 : tuple, list, numpy array + second point coordinate in longitude, latitude + semi_major : float + ellipsoid's semi major axes + semi_minor : float + ellipsoid's semi minor axes + i_flattening : float + ellipsoid's inverse flattening + + Returns + ------- + Optional[float] + distance, if None then input is not np.ndarray, tuple or list + + Notes + ------- + https://rafatieppo.github.io/post/2018_07_27_idw2pyr/ + """ + + print("only accept numpy array, list and tuple") + return None + + +@_harvesine_distance_dispatch.register(np.ndarray) +@numba.njit() +def _harvesine_distance( + long_lat1: np.ndarray, + long_lat2: np.ndarray, + semi_major: float = 6378137.0, + semi_minor: float = 6356752.314245179, + i_flattening=298.257223563, +) -> float: + long1, lat1 = np.radians(long_lat1) + long2, lat2 = np.radians(long_lat2) + + long_diff = long2 - long1 + lat_diff = lat2 - lat1 + a = ( + math.sin(lat_diff / 2) ** 2 + + math.cos(lat1) * math.cos(lat2) * math.sin(long_diff / 2) ** 2 + ) + c = 2 * math.atan2(math.sqrt(a), math.sqrt(1 - a)) + return np.abs(semi_major * c) + + +@_harvesine_distance_dispatch.register(list) +def __harvesine_distance( + long_lat1: List[float], + long_lat2: List[float], + semi_major: float, + semi_minor: float, + i_flattening: float, +): + return _harvesine_distance( + np.array(long_lat1), + np.array(long_lat2), + semi_major, + semi_minor, + i_flattening, + ) + + +@_harvesine_distance_dispatch.register(tuple) +def __harvesine_distance( + long_lat1: Tuple[float, float], + long_lat2: Tuple[float, float], + semi_major: float, + semi_minor: float, + i_flattening: float, +): + return _harvesine_distance( + np.array(long_lat1), + np.array(long_lat2), + semi_major, + semi_minor, + i_flattening, + ) + + +def vincenty_distance( + long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], + long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + epsg: int = 4326, +) -> float: + """Calculate distance in ellipsoid by vincenty method + slower, more accurate + + Parameters + ---------- + long_lat1 : tuple, list + first point coordinate in longitude, latitude + long_lat2 : tuple, list + second point coordinate in longitude, latitude + epsg : int, optional + epsg code of the spatial reference system, by default 4326 + + Returns + ------- + float + distance + + Notes + ------- + https://www.johndcook.com/blog/2018/11/24/spheroid-distance/ + """ + + semi_major, semi_minor, i_flattening = get_ellipsoid_par(epsg) + + return _vincenty_distance_dispatch( + long_lat1, + long_lat2, + semi_major=semi_major, + semi_minor=semi_minor, + i_flattening=i_flattening, + ) + + +@singledispatch +def _vincenty_distance_dispatch( + long_lat1: Union[np.ndarray, Tuple[float, float], List[float]], + long_lat2: Union[np.ndarray, Tuple[float, float], List[float]], + epsg: int, + semi_major: float, + semi_minor: float, + i_flattening: float, +) -> Optional[float]: + """ + Calculate distance in ellipsoid by vincenty method + slower, more accurate + + Parameters + ---------- + long_lat1 : tuple, list + first point coordinate in longitude, latitude + long_lat2 : tuple, list + second point coordinate in longitude, latitude + semi_major : float + ellipsoid's semi major axes + semi_minor : float + ellipsoid's semi minor axes + i_flattening : float + ellipsoid's inverse flattening + + Returns + ------- + distance + + Notes + ------- + https://www.johndcook.com/blog/2018/11/24/spheroid-distance/ + """ + + print("only accept numpy array, list and tuple") + return None + + +@_vincenty_distance_dispatch.register(np.ndarray) +@numba.njit() +def _vincenty_distance( + long_lat1: np.ndarray, + long_lat2: np.ndarray, + semi_major: float = 6378137.0, + semi_minor: float = 6356752.314245179, + i_flattening=298.257223563, +) -> float: + # WGS 1984 + flattening = 1 / i_flattening + tolerance = 1e-11 # to stop iteration + + radians = math.pi / 180 + long1, lat1 = np.radians(long_lat1) + long2, lat2 = np.radians(long_lat2) + + distance = 0.0 + + if long1 != long2 and lat1 != lat2: + phi1, phi2 = lat1, lat2 + u1 = math.atan((1 - flattening) * math.tan(phi1)) + u2 = math.atan((1 - flattening) * math.tan(phi2)) + long_diff = long2 - long1 + + lambda_old = long_diff + 0 + + while True: + t = (math.cos(u2) * math.sin(lambda_old)) ** 2 + t += ( + math.cos(u1) * math.sin(u2) + - math.sin(u1) * math.cos(u2) * math.cos(lambda_old) + ) ** 2 + sin_sigma = t ** 0.5 + cos_sigma = math.sin(u1) * math.sin(u2) + math.cos(u1) * math.cos( + u2 + ) * math.cos(lambda_old) + sigma = math.atan2(sin_sigma, cos_sigma) + + sin_alpha = math.cos(u1) * math.cos(u2) * math.sin(lambda_old) / sin_sigma + cos_sq_alpha = 1 - sin_alpha ** 2 + cos_2sigma_m = cos_sigma - 2 * math.sin(u1) * math.sin(u2) / cos_sq_alpha + c = ( + flattening + * cos_sq_alpha + * (4 + flattening * (4 - 3 * cos_sq_alpha)) + / 16 + ) + + t = sigma + c * sin_sigma * ( + cos_2sigma_m + c * cos_sigma * (-1 + 2 * cos_2sigma_m ** 2) + ) + lambda_new = long_diff + (1 - c) * flattening * sin_alpha * t + if abs(lambda_new - lambda_old) <= tolerance: + break + else: + lambda_old = lambda_new + + u2 = cos_sq_alpha * ((semi_major ** 2 - semi_minor ** 2) / semi_minor ** 2) + A = 1 + (u2 / 16384) * (4096 + u2 * (-768 + u2 * (320 - 175 * u2))) + B = (u2 / 1024) * (256 + u2 * (-128 + u2 * (74 - 47 * u2))) + t = cos_2sigma_m + 0.25 * B * (cos_sigma * (-1 + 2 * cos_2sigma_m ** 2)) + t -= ( + (B / 6) + * cos_2sigma_m + * (-3 + 4 * sin_sigma ** 2) + * (-3 + 4 * cos_2sigma_m ** 2) + ) + delta_sigma = B * sin_sigma * t + distance = semi_minor * A * (sigma - delta_sigma) + + return np.abs(distance) + + +@_vincenty_distance_dispatch.register(list) +def __vincenty_distance( + long_lat1: List[float], long_lat2: List[float], *args, **kwargs +): + return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs) + + +@_vincenty_distance_dispatch.register(tuple) +def __vincenty_distance( + long_lat1: Tuple[float, float], long_lat2: Tuple[float, float], *args, **kwargs +): + return _vincenty_distance(np.array(long_lat1), np.array(long_lat2), *args, **kwargs) + + +@numba.njit() +def projected_distance( + xy1: Union[Tuple[float, float], List[float]], + xy2: Union[Tuple[float, float], List[float]], +) -> float: + return math.sqrt((xy1[0] - xy2[0]) ** 2 + (xy1[1] - xy2[1]) ** 2) + + +def calc_extent(points: np.ndarray) -> Tuple[float, float, float, float]: + x_max, y_max = points[:, 0].max(), points[:, 1].max() + x_min, y_min = points[:, 0].min(), points[:, 1].min() + return x_min, y_min, x_max, y_max + + +calc_distance = { + "harvesine": _harvesine_distance, + "vincenty": _vincenty_distance, + "projected": projected_distance, +} diff --git a/geosardine/raster.py b/geosardine/raster.py index 7bdbce1..fab9cf9 100644 --- a/geosardine/raster.py +++ b/geosardine/raster.py @@ -1,1009 +1,1009 @@ -import itertools -import warnings -from operator import ( - add, - floordiv, - iadd, - ifloordiv, - imul, - ipow, - isub, - itruediv, - mul, - pow, - sub, - truediv, -) -from typing import ( - Any, - Callable, - Dict, - Generator, - Iterable, - List, - Optional, - Tuple, - Union, -) - -import cv2 -import numpy as np -import rasterio -from affine import Affine -from rasterio import features -from rasterio.crs import CRS -from rasterio.plot import reshape_as_image -from shapely.geometry import mapping, shape -from shapely.ops import unary_union - -from geosardine._geosardine import rowcol2xy, xy2rowcol -from geosardine._raster_numba import __nb_raster_calc__, nb_raster_ops -from geosardine._utility import save_raster - - -def polygonize( - array: np.ndarray, - transform: Affine, - mask: Optional[np.ndarray] = None, - groupby_func: Optional[Callable] = None, -) -> List[Dict[str, Any]]: - """Polygonize raster - - Parameters - ---------- - array : np.ndarray - raster as numpy array - transform : Affine - affine trasformation parameter - mask : Optional[np.ndarray], optional - filter used pixel area, by default None - groupby_func : Optional[Callable], optional - dissolve by function, by default None - - Returns - ------- - List[Dict[str, Any]] - vector as geojson - """ - feats: Generator[Dict[str, Any], None, None] = ( - {"properties": {"raster_val": value}, "geometry": shape} - for shape, value in features.shapes(array, mask=mask, transform=transform) - ) - if groupby_func is not None: - union_features: List[Dict[str, Any]] = [] - for _, group in itertools.groupby( - feats, key=lambda x: x["properties"]["raster_val"] - ): - properties, geom = zip( - *[ - (feature["properties"], shape(feature["geometry"])) - for feature in group - ] - ) - union_features.append( - {"geometry": mapping(unary_union(geom)), "properties": properties[0]} - ) - return union_features - return list(feats) - - -class Raster(np.ndarray): - """ - Construct Raster from numpy array with spatial information. - Support calculation between different raster - - Parameters - ---------- - array : numpy array - array of raster - resolution : tuple, list, default None - spatial resolution - x_min : float, defaults to None - left boundary of x-axis coordinate - y_max : float, defaults to None - top boundary of y-axis coordinate - x_max : float, defaults to None - right boundary of x-axis coordinate - y_min : float, defaults to None - bottom boundary of y-axis coordinate - epsg : int, defaults to 4326 - EPSG code of reference system - no_data : int or float, default None - no data value - - Examples - -------- - >>> from geosardine import Raster - >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7) - >>> print(raster) - [[[1. 1.] - [1. 1.] - [1. 1.]] - [[1. 1.] - [1. 1.] - [1. 1.]] - [[1. 1.] - [1. 1.] - [1. 1.]]] - Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution - >>> resampled = raster.resample((0.2,0.2)) - >>> print(resampled.shape, resampled.resolution) - (6, 6, 2) (0.2, 0.2) - Raster can be resized - >>> resized = raster.resize(height=16, width=16) - >>> print(resized.shape, resized.resolution) - (16, 16, 2) (0.07500000000000018, 0.07500000000000001) - """ - - __cv2_resize_method = { - "nearest": cv2.INTER_NEAREST, - "bicubic": cv2.INTER_CUBIC, - "bilinear": cv2.INTER_LINEAR, - "area": cv2.INTER_AREA, - "lanczos": cv2.INTER_LANCZOS4, - } - - def __init__( - self, - array: np.ndarray, - resolution: Union[ - None, Tuple[float, float], List[float], Tuple[float, ...], float - ] = None, - x_min: Optional[float] = None, - y_max: Optional[float] = None, - x_max: Optional[float] = None, - y_min: Optional[float] = None, - epsg: int = 4326, - no_data: Union[float, int] = -32767.0, - transform: Optional[Affine] = None, - source: Optional[str] = None, - ): - if transform is None: - if resolution is None and x_min is None and y_min is None: - raise ValueError( - "Please define resolution and at least x minimum and y minimum" - ) - - if resolution is not None and x_min is None and y_max is None: - raise ValueError("Please define x_min and y_max") - - if isinstance(resolution, float): - self.resolution: Tuple[float, float] = ( - resolution, - resolution, - ) - elif isinstance(resolution, Iterable): - self.resolution = (resolution[0], resolution[1]) - - if ( - resolution is None - and x_min is not None - and y_min is not None - and x_max is not None - and y_max is not None - ): - self.resolution = ( - (x_max - x_min) / array.shape[1], - (y_max - y_min) / array.shape[0], - ) - - self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale( - self.resolution[0], -self.resolution[1] - ) - elif isinstance(transform, Affine): - self.transform = transform - self.resolution = (transform[0], abs(transform[4])) - else: - raise ValueError( - "Please define affine parameter or resolution and xmin ymax" - ) - - self.epsg = epsg - - self.crs = CRS.from_epsg(epsg) - self.no_data = no_data - self.source = source - self.__check_validity() - - def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster": - return array.view(cls) - - @staticmethod - def parse_slicer(key: Union[int, slice, None], length: int) -> int: - if key is None: - start = 0 - elif isinstance(key, int): - start = key if key > 0 else length + key - elif isinstance(key, slice): - if key.start is None: - start = 0 - elif key.start < 0: - start = length + slice.start - elif key.start > 0: - start = key.start - else: - raise ValueError - else: - raise ValueError - return start - - def __getitem__(self, keys: Union[int, Tuple[Any, ...], slice]) -> np.ndarray: - if isinstance(keys, slice) or isinstance(keys, int): - row_col_min: List[int] = [ - self.parse_slicer(keys, self.__array__().shape[0]), - 0, - ] - elif len(keys) == 2: - row_col_min = [ - self.parse_slicer(key, self.__array__().shape[i]) - for i, key in enumerate(keys) - ] - elif len(keys) == 3: - row_col_min = [ - self.parse_slicer(key, self.__array__().shape[i]) - for i, key in enumerate(keys[:2]) - ] - - if row_col_min == [0, 0]: - return self.array.__get__item(keys) - else: - sliced_array = self.array.__getitem__(keys) - x_min, y_max = self.rowcol2xy(row_col_min[0], row_col_min[1], offset="ul") - - return Raster( - sliced_array, - self.resolution, - x_min, - y_max, - epsg=self.epsg, - no_data=self.no_data, - ) - - @classmethod - def from_binary( - cls, - binary_file: str, - shape: Tuple[int, ...], - resolution: Union[Tuple[float, float], List[float], float], - x_min: float, - y_max: float, - epsg: int = 4326, - no_data: Union[float, int] = -32767.0, - dtype: np.dtype = np.float32, - shape_order: str = "hwc", - *args, - **kwargs, - ) -> "Raster": - """Convert binary grid into Raster - - Parameters - ------- - binary_file : str - location of binary grid file - shape : tuple of int - shape of binary grid. - resolution : tuple of float, list of float or float - pixel / grid spatial resolution - x_min : float, defaults to None - left boundary of x-axis coordinate - y_max : float, defaults to None - top boundary of y-axis coordinate - epsg : int, defaults to 4326 - EPSG code of reference system - no_data : int or float, default None - no data value - dtype : numpy.dtype, default numpy.float32 - data type of raster - shape_order : str, default hwc - shape ordering, - * if default, height x width x channel - - - Returns - ------- - Raster - raster shape will be in format height x width x channel / layer - - """ - - _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape( - shape - ) - - if shape_order not in ("hwc", "hw"): - c_index = shape_order.index("c") - h_index = shape_order.index("h") - w_index = shape_order.index("w") - - _bin_array = np.transpose(_bin_array, (h_index, w_index, c_index)) - - return cls( - _bin_array, - resolution, - x_min, - y_max, - epsg=epsg, - no_data=no_data, - source=binary_file, - ) - - @classmethod - def from_rasterfile(cls, raster_file: str) -> "Raster": - """Get raster from supported gdal raster file - - Parameters - ------- - raster_file : str - location of raser file - - Returns - ------- - Raster - """ - with rasterio.open(raster_file) as file: - _raster = reshape_as_image(file.read()) - - return cls( - _raster, - transform=file.transform, - epsg=file.crs.to_epsg(), - no_data=file.nodatavals[0], - source=raster_file, - ) - - @property - def array(self) -> np.ndarray: - """the numpy array of raster""" - return self.__array__() - - @property - def __transform(self) -> Tuple[float, ...]: - return tuple(self.transform) - - @property - def x_min(self) -> float: - """minimum x-axis coordinate""" - return self.__transform[2] - - @property - def y_max(self) -> float: - """maximum y-axis coordinate""" - return self.__transform[5] - - @property - def x_max(self) -> float: - """maximum x-axis coordinate""" - return self.__transform[2] + (self.resolution[0] * self.cols) - - @property - def y_min(self) -> float: - """minimum y-axis coordinate""" - return self.__transform[5] - (self.resolution[1] * self.rows) - - @property - def top(self) -> float: - """top y-axis coordinate""" - return self.y_max - - @property - def left(self) -> float: - """left x-axis coordinate""" - return self.x_min - - @property - def right(self) -> float: - """right x-axis coordinate""" - return self.x_max - - @property - def bottom(self) -> float: - """bottom y-axis coordinate""" - return self.y_min - - @property - def rows(self) -> int: - """number of row, height""" - return int(self.array.shape[0]) - - @property - def cols(self) -> int: - """number of column, width""" - return int(self.array.shape[1]) - - @property - def layers(self) -> int: - """number of layer / channel""" - _layers: int = 1 - if len(self.array.shape) > 2: - _layers = self.array.shape[2] - return _layers - - @property - def x_extent(self) -> float: - """width of raster in the map unit (degree decimal or meters)""" - return self.x_max - self.x_min - - @property - def y_extent(self) -> float: - """height of raster in the map unit (degree decimal or meters)""" - return self.y_max - self.y_min - - @property - def is_projected(self) -> bool: - """check crs is projected or not""" - return self.crs.is_projected - - @property - def is_geographic(self) -> bool: - """check crs is geographic or not""" - return self.crs.is_geographic - - @property - def coordinate_array(self) -> np.ndarray: - x_dist, y_dist = np.meshgrid( - np.arange(self.shape[1], dtype=np.float32), - np.arange(self.shape[0], dtype=np.float32), - ) - - x_dist *= self.resolution[0] - x_dist += self.x_min - - y_dist *= self.resolution[1] - y_dist += self.y_max - - return np.stack([x_dist, y_dist], axis=2) - - def __check_validity(self) -> None: - """Check geometry validity - - Raises - ------ - ValueError - x min, y min is greater than x max, y max - ValueError - x min is greater than x max - ValueError - y min is greater than y max - """ - if self.x_extent < 0 and self.y_extent < 0: - raise ValueError( - "x min should be less than x max and y min should be less than y max" - ) - elif self.x_extent < 0 and self.y_extent > 0: - raise ValueError("x min should be less than x max") - elif self.x_extent > 0 and self.y_extent < 0: - raise ValueError("y min should be less than y max") - - def xy_value( - self, x: float, y: float, offset="center" - ) -> Union[float, int, np.ndarray]: - """Obtain pixel value by geodetic or projected coordinate - - Parameters - ---------- - x : float - x-axis coordinate - y : float - y-axis coordinate - - Returns - ------- - Union[float, int, np.ndarray] - pixel value - """ - try: - row, col = self.xy2rowcol(x, y) - if row < 0 or col < 0: - raise IndexError - return self.array[row, col] - except IndexError: - raise IndexError( - f""" - {x},{y} is out of bound. - x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max} - """ - ) - - def rowcol2xy( - self, row: int, col: int, offset: str = "center" - ) -> Tuple[float, float]: - """Convert image coordinate (row, col) to real world coordinate - - Parameters - ---------- - row : int - col : int - offset : str - - Returns - ------- - Tuple[float, float] - X,Y coordinate in real world - """ - return rowcol2xy((row, col), self.transform, offset=offset) - - def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]: - """Convert real world coordinate to image coordinate (row, col) - - Parameters - ---------- - x : float - y : float - - Returns - ------- - Tuple[int, int] - row, column - """ - _row, _col = xy2rowcol((x, y), self.transform) - return int(_row), int(_col) - - def __raster_calc_by_pixel__( - self, - raster: "Raster", - operator: Callable[[Any, Any], Any], - ) -> np.ndarray: - _raster = np.zeros(self.array.shape, dtype=self.array.dtype) - for row in range(self.rows): - for col in range(self.cols): - try: - pixel_source = self.array[row, col] - pixel_target = raster.xy_value(*self.rowcol2xy(row, col)) - if pixel_source != self.no_data and pixel_target != raster.no_data: - _raster[row, col] = operator( - pixel_source, - pixel_target, - ) - else: - _raster[row, col] = self.no_data - except IndexError: - _raster[row, col] = self.no_data - return _raster - - def __nb_raster_calc( - self, raster_a: "Raster", raster_b: "Raster", operator: str - ) -> np.ndarray: - """Wrapper for Raster calculation per pixel using numba jit. - - Parameters - ---------- - raster_a : Raster - first raster - raster_b : Raster - second raster - operator : str - operator name - - Returns - ------- - np.ndarray - calculated raster - """ - if raster_b.layers != raster_a.layers: - raise ValueError( - f""" - Cant calculate between different layer shape. - first raster layer = {raster_a.layers} - second raster layer = {raster_b.layers} - """ - ) - - _a = raster_a.array - if self.layers == 1 and len(raster_a.shape) != 3: - _a = raster_a.array.reshape(raster_a.rows, raster_a.cols, 1) - - _b = raster_b.array - if self.layers == 1 and len(raster_b.shape) != 3: - _b = raster_b.array.reshape(raster_b.rows, raster_b.cols, 1) - - out = __nb_raster_calc__( - _a, - _b, - tuple(raster_a.transform), - tuple(~raster_b.transform), - raster_a.no_data, - raster_b.no_data, - nb_raster_ops[operator], - ) - if out.shape != raster_a.shape: - out = out.reshape(raster_a.shape) - return out - - def __raster_calculation__( - self, - raster: Union[int, float, "Raster", np.ndarray], - operator: Callable[[Any, Any], Any], - ) -> "Raster": - if not isinstance(raster, (int, float, Raster, np.ndarray)): - raise ValueError(f"{type(raster)} unsupported data format") - - if isinstance(raster, Raster): - if ( - raster.epsg == self.epsg - and raster.resolution == self.resolution - and raster.x_min == self.x_min - and raster.y_min == self.y_min - and raster.shape == self.shape - ): - _raster = operator(self.array, raster.array) - else: - # _raster = self.__raster_calc_by_pixel__(raster, operator) - - _raster = self.__nb_raster_calc( - self, - raster, - operator.__name__, - ) - elif isinstance(raster, np.ndarray): - _raster = operator(self.array, raster) - else: - _raster = operator(self.array, raster) - - return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg) - - def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, sub) - - def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, add) - - def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, mul) - - def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, truediv) - - def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, floordiv) - - def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, pow) - - def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, iadd) - - def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, itruediv) - - def __ifloordiv__( - self, raster: Union[int, float, "Raster", np.ndarray] - ) -> "Raster": - return self.__raster_calculation__(raster, ifloordiv) - - def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, imul) - - def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, isub) - - def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": - return self.__raster_calculation__(raster, ipow) - - def __iter__(self) -> Generator[Any, None, None]: - _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers) - if self.layers == 1: - _iter_shape = self.rows * self.cols - _iter = self.array.reshape(_iter_shape) - for i in range(self.rows * self.cols): - yield _iter[i] - - def save(self, file_name: str, compress: bool = False) -> None: - """Save raster as geotiff - - Parameters - ---------- - file_name : str - output filename - """ - save_raster( - file_name, - self.array, - self.crs, - affine=self.transform, - nodata=self.no_data, - compress=compress, - ) - - def resize( - self, height: int, width: int, method: str = "bilinear", backend: str = "opencv" - ) -> "Raster": - """Resize raster into defined height and width - - Parameters - ------- - height: int - height defined - width: int - width defined - method: str nearest or bicubic or bilinear or area or lanczos, default bilinear - resampling method for opencv
- * if nearest, a nearest-neighbor interpolation
- * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
- * if bilinear, a bilinear interpolation
- * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood - backend: str opencv or python, default opencv - resampling backend
- * if opencv, image will be resampled using opencv
- * if python, image will be resampled using pure python. slower and nearest neighbor only - - - Returns - ------- - Raster - Resized - """ - if backend == "opencv": - return self.__cv_resize(height, width, method) - elif backend == "python": - return self.__py_resize(height, width) - else: - raise ValueError("Please choose between python or opencv for backend") - - def resample( - self, - resolution: Union[Tuple[float, float], List[float], float], - method: str = "bilinear", - backend: str = "opencv", - ) -> "Raster": - """Resample image into defined resolution - - Parameters - ------- - resolution: tuple, list, float - spatial resolution target - method: str nearest or bicubic or bilinear or area or lanczos, default bilinear - resampling method for opencv
- * if nearest, a nearest-neighbor interpolation
- * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
- * if bilinear, a bilinear interpolation
- * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
- * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood - backend: str opencv or python, default opencv - resampling backend
- * if opencv, image will be resampled using opencv
- * if python, image will be resampled using pure python. slower and nearest neighbor only - - - Returns - ------- - Raster - Resampled - """ - if backend == "opencv": - if self.resolution[0] != self.resolution[1]: - warnings.warn( - "non square pixel resolution, use rasterio instead", UserWarning - ) - return self.__cv_resample(resolution, method) - elif backend == "python": - return self.__py_resample(resolution) - else: - raise ValueError("Please choose between python or opencv for backend") - - def __cv_resize(self, height: int, width: int, method: str) -> "Raster": - resized_y_resolution = self.y_extent / height - resized_x_resolution = self.x_extent / width - resized = cv2.resize( - self.array, (width, height), interpolation=self.__cv2_resize_method[method] - ) - return Raster( - resized, - (resized_x_resolution, resized_y_resolution), - self.x_min, - self.y_max, - epsg=self.epsg, - ) - - def __cv_resample( - self, resolution: Union[Tuple[float, float], List[float], float], method: str - ) -> "Raster": - if isinstance(resolution, (float, int)): - resampled_x_resolution = float(resolution) - resampled_y_resolution = float(resolution) - else: - resampled_x_resolution = resolution[0] - resampled_y_resolution = resolution[1] - - resampled_rows = round(self.y_extent / resampled_y_resolution) - resampled_cols = round(self.x_extent / resampled_x_resolution) - - resampled = self.__cv_resize(resampled_rows, resampled_cols, method) - return resampled - - def __py_resample( - self, resolution: Union[Tuple[float, float], List[float], float] - ) -> "Raster": - """ - Resample raster using nearest neighbor - Parameters - ------- - resolution: tuple, list - spatial resolution target - - Returns - ------- - Raster - Resampled - """ - warnings.warn("this function will be removed in v1.0", DeprecationWarning) - - if isinstance(resolution, (float, int)): - resampled_x_resolution = float(resolution) - resampled_y_resolution = float(resolution) - else: - resampled_x_resolution = resolution[0] - resampled_y_resolution = resolution[1] - - resampled_rows = round(self.y_extent / resampled_y_resolution) - resampled_cols = round(self.x_extent / resampled_x_resolution) - - resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers) - if self.layers == 1: - resampled_shape = (resampled_rows, resampled_cols) - - resampled_array = np.zeros( - resampled_rows * resampled_cols * self.layers, dtype=self.dtype - ).reshape(resampled_shape) - - resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale( - resampled_x_resolution, -resampled_y_resolution - ) - - for row in range(resampled_rows): - for col in range(resampled_cols): - x, y = rowcol2xy((row, col), resampled_affine) - resampled_array[row, col] = self.xy_value( - x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2) - ) - - return Raster( - resampled_array, - (resampled_x_resolution, resampled_y_resolution), - self.x_min, - self.y_max, - epsg=self.epsg, - ) - - def __py_resize(self, height: int, width: int) -> "Raster": - """ - Resize raster using nearest neighbor - Parameters - ------- - height: int - raster height - width: int - raster width - - Returns - ------- - Raster - Resampled - """ - warnings.warn("this function will be removed in v1.0", DeprecationWarning) - - resized_y_resolution = self.y_extent / height - resized_x_resolution = self.x_extent / width - - resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale( - resized_x_resolution, -resized_y_resolution - ) - - resized_shape: Tuple[int, ...] = (height, width, self.layers) - if self.layers == 1: - resized_shape = (height, width) - - resized_array = np.zeros( - height * width * self.layers, dtype=self.dtype - ).reshape(resized_shape) - - for row in range(height): - for col in range(width): - x, y = rowcol2xy((row, col), resized_affine) - resized_array[row, col] = self.xy_value( - x + (resized_x_resolution / 2), y + (resized_y_resolution / 2) - ) - - return Raster( - resized_array, - (resized_x_resolution, resized_y_resolution), - self.x_min, - self.y_max, - epsg=self.epsg, - ) - - def clip2bbox( - self, x_min: float, y_min: float, x_max: float, y_max: float - ) -> "Raster": - """Clipping into bounding boxes - - Returns - ------- - Raster - Clipped raster - """ - if x_min < self.x_min: - raise ValueError( - f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} - but input is {x_min},{y_min},{x_max},{y_max}""" - ) - - if y_min < self.y_min: - raise ValueError( - f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} - but input is {x_min},{y_min},{x_max},{y_max}""" - ) - - if x_max > self.x_max: - raise ValueError( - f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} - but input is {x_min},{y_min},{x_max},{y_max}""" - ) - - if y_max > self.y_max: - raise ValueError( - f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} - but input is {x_min},{y_min},{x_max},{y_max}""" - ) - - row_min, col_min = self.xy2rowcol(x_min, y_max) - row_max, col_max = self.xy2rowcol(x_max, y_min) - - clipped = self.array[row_min:row_max, col_min:col_max] - return Raster(clipped, self.resolution, x_min, y_max) - - def split2tiles( - self, tile_size: Union[int, Tuple[int, int], List[int]] - ) -> Generator[Tuple[int, int, "Raster"], None, None]: - """ - Split raster into smaller tiles, excessive will be padded and have no data value - - Parameters - ------- - tile_size: int, list of int, tuple of int - dimension of tiles - - Yields - ------- - int, int, Raster - row, column, tiled raster - """ - - tile_width: int = 0 - tile_height: int = 0 - if isinstance(tile_size, int): - tile_height = tile_size - tile_width = tile_size - elif isinstance(tile_size, tuple) or isinstance(tile_size, list): - if isinstance(tile_size[0], int) or isinstance(tile_size[1], int): - tile_height, tile_width = tile_size - - new_height = self.shape[0] - if self.shape[0] % tile_height != 0: - new_height += tile_height - (new_height % tile_height) - - new_width = self.shape[1] - if self.shape[1] % tile_width != 0: - new_width += tile_width - (new_width % tile_width) - - padded_array = np.zeros((new_height, new_height, self.layers), dtype=self.dtype) - padded_array[:] = self.no_data - padded_array[: self.shape[0], : self.shape[1]] = self.array - - for r in range(0, new_height, tile_height): - for c in range(0, new_width, tile_width): - yield r, c, Raster( - padded_array[r : r + tile_height, c : c + tile_width], - self.resolution, - *self.rowcol2xy(r, c, offset="ul"), - epsg=self.epsg, - no_data=self.no_data, - ) - - -class Layer(Raster): - pass - - -class Pixel(Raster): - pass +import itertools +import warnings +from operator import ( + add, + floordiv, + iadd, + ifloordiv, + imul, + ipow, + isub, + itruediv, + mul, + pow, + sub, + truediv, +) +from typing import ( + Any, + Callable, + Dict, + Generator, + Iterable, + List, + Optional, + Tuple, + Union, +) + +import cv2 +import numpy as np +import rasterio +from affine import Affine +from rasterio import features +from rasterio.crs import CRS +from rasterio.plot import reshape_as_image +from shapely.geometry import mapping, shape +from shapely.ops import unary_union + +from geosardine._geosardine import rowcol2xy, xy2rowcol +from geosardine._raster_numba import __nb_raster_calc__, nb_raster_ops +from geosardine._utility import save_raster + + +def polygonize( + array: np.ndarray, + transform: Affine, + mask: Optional[np.ndarray] = None, + groupby_func: Optional[Callable] = None, +) -> List[Dict[str, Any]]: + """Polygonize raster + + Parameters + ---------- + array : np.ndarray + raster as numpy array + transform : Affine + affine trasformation parameter + mask : Optional[np.ndarray], optional + filter used pixel area, by default None + groupby_func : Optional[Callable], optional + dissolve by function, by default None + + Returns + ------- + List[Dict[str, Any]] + vector as geojson + """ + feats: Generator[Dict[str, Any], None, None] = ( + {"properties": {"raster_val": value}, "geometry": shape} + for shape, value in features.shapes(array, mask=mask, transform=transform) + ) + if groupby_func is not None: + union_features: List[Dict[str, Any]] = [] + for _, group in itertools.groupby( + feats, key=lambda x: x["properties"]["raster_val"] + ): + properties, geom = zip( + *[ + (feature["properties"], shape(feature["geometry"])) + for feature in group + ] + ) + union_features.append( + {"geometry": mapping(unary_union(geom)), "properties": properties[0]} + ) + return union_features + return list(feats) + + +class Raster(np.ndarray): + """ + Construct Raster from numpy array with spatial information. + Support calculation between different raster + + Parameters + ---------- + array : numpy array + array of raster + resolution : tuple, list, default None + spatial resolution + x_min : float, defaults to None + left boundary of x-axis coordinate + y_max : float, defaults to None + top boundary of y-axis coordinate + x_max : float, defaults to None + right boundary of x-axis coordinate + y_min : float, defaults to None + bottom boundary of y-axis coordinate + epsg : int, defaults to 4326 + EPSG code of reference system + no_data : int or float, default None + no data value + + Examples + -------- + >>> from geosardine import Raster + >>> raster = Raster(np.ones(18, dtype=np.float32).reshape(3, 3, 2), resolution=0.4, x_min=120, y_max=0.7) + >>> print(raster) + [[[1. 1.] + [1. 1.] + [1. 1.]] + [[1. 1.] + [1. 1.] + [1. 1.]] + [[1. 1.] + [1. 1.] + [1. 1.]]] + Raster can be resampled like this. (0.2,0.2) is the result's spatial resolution + >>> resampled = raster.resample((0.2,0.2)) + >>> print(resampled.shape, resampled.resolution) + (6, 6, 2) (0.2, 0.2) + Raster can be resized + >>> resized = raster.resize(height=16, width=16) + >>> print(resized.shape, resized.resolution) + (16, 16, 2) (0.07500000000000018, 0.07500000000000001) + """ + + __cv2_resize_method = { + "nearest": cv2.INTER_NEAREST, + "bicubic": cv2.INTER_CUBIC, + "bilinear": cv2.INTER_LINEAR, + "area": cv2.INTER_AREA, + "lanczos": cv2.INTER_LANCZOS4, + } + + def __init__( + self, + array: np.ndarray, + resolution: Union[ + None, Tuple[float, float], List[float], Tuple[float, ...], float + ] = None, + x_min: Optional[float] = None, + y_max: Optional[float] = None, + x_max: Optional[float] = None, + y_min: Optional[float] = None, + epsg: int = 4326, + no_data: Union[float, int] = -32767.0, + transform: Optional[Affine] = None, + source: Optional[str] = None, + ): + if transform is None: + if resolution is None and x_min is None and y_min is None: + raise ValueError( + "Please define resolution and at least x minimum and y minimum" + ) + + if resolution is not None and x_min is None and y_max is None: + raise ValueError("Please define x_min and y_max") + + if isinstance(resolution, float): + self.resolution: Tuple[float, float] = ( + resolution, + -resolution, + ) + elif isinstance(resolution, Iterable): + self.resolution = (resolution[0], resolution[1]) + + if ( + resolution is None + and x_min is not None + and y_min is not None + and x_max is not None + and y_max is not None + ): + self.resolution = ( + (x_max - x_min) / array.shape[1], + -(y_max - y_min) / array.shape[0], + ) + + if self.resolution[0] > 0 and self.resolution[1] > 0: + print(self.resolution) + warnings.warn("both resolution are positive") + + self.transform: Affine = Affine.translation(x_min, y_max) * Affine.scale( + self.resolution[0], self.resolution[1] + ) + elif isinstance(transform, Affine): + self.transform = transform + self.resolution = (transform[0], transform[4]) + else: + raise ValueError( + "Please define affine parameter or resolution and xmin ymax" + ) + + self.epsg = epsg + + self.crs = CRS.from_epsg(epsg) + self.no_data = no_data + self.source = source + self.__check_validity() + + def __new__(cls, array: np.ndarray, *args, **kwargs) -> "Raster": + return array.view(cls) + + @staticmethod + def parse_slicer(key: Union[int, slice, None], length: int) -> int: + if key is None: + start = 0 + elif isinstance(key, int): + start = key if key > 0 else length + key + elif isinstance(key, slice): + if key.start is None: + start = 0 + elif key.start < 0: + start = length + slice.start + elif key.start > 0: + start = key.start + else: + raise ValueError + else: + raise ValueError + return start + + def __getitem__(self, keys: Union[int, Tuple[Any, ...], slice]) -> np.ndarray: + if isinstance(keys, slice) or isinstance(keys, int): + row_col_min: List[int] = [ + self.parse_slicer(keys, self.__array__().shape[0]), + 0, + ] + elif len(keys) == 2: + row_col_min = [ + self.parse_slicer(key, self.__array__().shape[i]) + for i, key in enumerate(keys) + ] + elif len(keys) == 3: + row_col_min = [ + self.parse_slicer(key, self.__array__().shape[i]) + for i, key in enumerate(keys[:2]) + ] + + if row_col_min == [0, 0]: + return self.array.__get__item(keys) + else: + sliced_array = self.array.__getitem__(keys) + x_min, y_max = self.rowcol2xy(row_col_min[0], row_col_min[1], offset="ul") + + return Raster( + sliced_array, + self.resolution, + x_min, + y_max, + epsg=self.epsg, + no_data=self.no_data, + ) + + @classmethod + def from_binary( + cls, + binary_file: str, + shape: Tuple[int, ...], + resolution: Union[Tuple[float, float], List[float], float], + x_min: float, + y_max: float, + epsg: int = 4326, + no_data: Union[float, int] = -32767.0, + dtype: np.dtype = np.float32, + shape_order: str = "hwc", + *args, + **kwargs, + ) -> "Raster": + """Convert binary grid into Raster + + Parameters + ------- + binary_file : str + location of binary grid file + shape : tuple of int + shape of binary grid. + resolution : tuple of float, list of float or float + pixel / grid spatial resolution + x_min : float, defaults to None + left boundary of x-axis coordinate + y_max : float, defaults to None + top boundary of y-axis coordinate + epsg : int, defaults to 4326 + EPSG code of reference system + no_data : int or float, default None + no data value + dtype : numpy.dtype, default numpy.float32 + data type of raster + shape_order : str, default hwc + shape ordering, + * if default, height x width x channel + + + Returns + ------- + Raster + raster shape will be in format height x width x channel / layer + + """ + + _bin_array = np.fromfile(binary_file, dtype=dtype, *args, **kwargs).reshape( + shape + ) + + if shape_order not in ("hwc", "hw"): + c_index = shape_order.index("c") + h_index = shape_order.index("h") + w_index = shape_order.index("w") + + _bin_array = np.transpose(_bin_array, (h_index, w_index, c_index)) + + return cls( + _bin_array, + resolution, + x_min, + y_max, + epsg=epsg, + no_data=no_data, + source=binary_file, + ) + + @classmethod + def from_rasterfile(cls, raster_file: str) -> "Raster": + """Get raster from supported gdal raster file + + Parameters + ------- + raster_file : str + location of raser file + + Returns + ------- + Raster + """ + with rasterio.open(raster_file) as file: + _raster = reshape_as_image(file.read()) + + return cls( + _raster, + transform=file.transform, + epsg=file.crs.to_epsg(), + no_data=file.nodatavals[0], + source=raster_file, + ) + + @property + def array(self) -> np.ndarray: + """the numpy array of raster""" + return self.__array__() + + @property + def __transform(self) -> Tuple[float, ...]: + return tuple(self.transform) + + @property + def x_min(self) -> float: + """minimum x-axis coordinate""" + return self.__transform[2] + + @property + def y_max(self) -> float: + """maximum y-axis coordinate""" + return self.__transform[5] + + @property + def x_max(self) -> float: + """maximum x-axis coordinate""" + return self.__transform[2] + (self.resolution[0] * self.cols) + + @property + def y_min(self) -> float: + """minimum y-axis coordinate""" + return self.__transform[5] + (self.resolution[1] * self.rows) + + @property + def extent(self) -> Tuple[float, float, float, float]: + return self.x_min, self.y_min, self.x_max, self.y_max + + @property + def top(self) -> float: + """top y-axis coordinate""" + return self.y_max + + @property + def left(self) -> float: + """left x-axis coordinate""" + return self.x_min + + @property + def right(self) -> float: + """right x-axis coordinate""" + return self.x_max + + @property + def bottom(self) -> float: + """bottom y-axis coordinate""" + return self.y_min + + @property + def rows(self) -> int: + """number of row, height""" + return int(self.array.shape[0]) + + @property + def cols(self) -> int: + """number of column, width""" + return int(self.array.shape[1]) + + @property + def layers(self) -> int: + """number of layer / channel""" + _layers: int = 1 + if len(self.array.shape) > 2: + _layers = self.array.shape[2] + return _layers + + @property + def x_extent(self) -> float: + """width of raster in the map unit (degree decimal or meters)""" + return self.x_max - self.x_min + + @property + def y_extent(self) -> float: + """height of raster in the map unit (degree decimal or meters)""" + return self.y_max - self.y_min + + @property + def is_projected(self) -> bool: + """check crs is projected or not""" + return self.crs.is_projected + + @property + def is_geographic(self) -> bool: + """check crs is geographic or not""" + return self.crs.is_geographic + + @property + def coordinate_array(self) -> np.ndarray: + x_dist, y_dist = np.meshgrid( + np.arange(self.shape[1], dtype=np.float32), + np.arange(self.shape[0], dtype=np.float32), + ) + + x_dist *= self.resolution[0] + x_dist += self.x_min + + y_dist *= self.resolution[1] + y_dist += self.y_max + + return np.stack([x_dist, y_dist], axis=2) + + def __check_validity(self) -> None: + """Check geometry validity + + Raises + ------ + ValueError + x min, y min is greater than x max, y max + ValueError + x min is greater than x max + ValueError + y min is greater than y max + """ + if self.x_extent < 0 and self.y_extent < 0: + raise ValueError( + "x min should be less than x max and y min should be less than y max" + ) + elif self.x_extent < 0 and self.y_extent > 0: + raise ValueError("x min should be less than x max") + elif self.x_extent > 0 and self.y_extent < 0: + print(self.resolution) + print(self.y_max, self.y_min, self.y_extent) + raise ValueError("y min should be less than y max") + + def xy_value( + self, x: float, y: float, offset="center" + ) -> Union[float, int, np.ndarray]: + """Obtain pixel value by geodetic or projected coordinate + + Parameters + ---------- + x : float + x-axis coordinate + y : float + y-axis coordinate + + Returns + ------- + Union[float, int, np.ndarray] + pixel value + """ + try: + row, col = self.xy2rowcol(x, y) + if row < 0 or col < 0: + raise IndexError + return self.array[row, col] + except IndexError: + raise IndexError( + f""" + {x},{y} is out of bound. + x_min={self.x_min} y_min={self.y_min} x_max={self.x_max} y_max={self.y_max} + """ + ) + + def rowcol2xy( + self, row: int, col: int, offset: str = "center" + ) -> Tuple[float, float]: + """Convert image coordinate (row, col) to real world coordinate + + Parameters + ---------- + row : int + col : int + offset : str + + Returns + ------- + Tuple[float, float] + X,Y coordinate in real world + """ + return rowcol2xy((row, col), self.transform, offset=offset) + + def xy2rowcol(self, x: float, y: float) -> Tuple[int, int]: + """Convert real world coordinate to image coordinate (row, col) + + Parameters + ---------- + x : float + y : float + + Returns + ------- + Tuple[int, int] + row, column + """ + _row, _col = xy2rowcol((x, y), self.transform) + return int(_row), int(_col) + + def __raster_calc_by_pixel__( + self, + raster: "Raster", + operator: Callable[[Any, Any], Any], + ) -> np.ndarray: + _raster = np.zeros(self.array.shape, dtype=self.array.dtype) + for row in range(self.rows): + for col in range(self.cols): + try: + pixel_source = self.array[row, col] + pixel_target = raster.xy_value(*self.rowcol2xy(row, col)) + if pixel_source != self.no_data and pixel_target != raster.no_data: + _raster[row, col] = operator( + pixel_source, + pixel_target, + ) + else: + _raster[row, col] = self.no_data + except IndexError: + _raster[row, col] = self.no_data + return _raster + + def __nb_raster_calc( + self, raster_a: "Raster", raster_b: "Raster", operator: str + ) -> np.ndarray: + """Wrapper for Raster calculation per pixel using numba jit. + + Parameters + ---------- + raster_a : Raster + first raster + raster_b : Raster + second raster + operator : str + operator name + + Returns + ------- + np.ndarray + calculated raster + """ + if raster_b.layers != raster_a.layers: + raise ValueError( + f""" + Cant calculate between different layer shape. + first raster layer = {raster_a.layers} + second raster layer = {raster_b.layers} + """ + ) + + _a = raster_a.array + if self.layers == 1 and len(raster_a.shape) != 3: + _a = raster_a.array.reshape(raster_a.rows, raster_a.cols, 1) + + _b = raster_b.array + if self.layers == 1 and len(raster_b.shape) != 3: + _b = raster_b.array.reshape(raster_b.rows, raster_b.cols, 1) + + out = __nb_raster_calc__( + _a, + _b, + tuple(raster_a.transform), + tuple(~raster_b.transform), + raster_a.no_data, + raster_b.no_data, + nb_raster_ops[operator], + ) + if out.shape != raster_a.shape: + out = out.reshape(raster_a.shape) + return out + + def __raster_calculation__( + self, + raster: Union[int, float, "Raster", np.ndarray], + operator: Callable[[Any, Any], Any], + ) -> "Raster": + if not isinstance(raster, (int, float, Raster, np.ndarray)): + raise ValueError(f"{type(raster)} unsupported data format") + + if isinstance(raster, Raster): + if ( + raster.epsg == self.epsg + and raster.resolution == self.resolution + and raster.x_min == self.x_min + and raster.y_min == self.y_min + and raster.shape == self.shape + ): + _raster = operator(self.array, raster.array) + else: + # _raster = self.__raster_calc_by_pixel__(raster, operator) + + _raster = self.__nb_raster_calc( + self, + raster, + operator.__name__, + ) + elif isinstance(raster, np.ndarray): + _raster = operator(self.array, raster) + else: + _raster = operator(self.array, raster) + return Raster(_raster, self.resolution, self.x_min, self.y_max, epsg=self.epsg) + + def __sub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, sub) + + def __add__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, add) + + def __mul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, mul) + + def __truediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, truediv) + + def __floordiv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, floordiv) + + def __pow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, pow) + + def __iadd__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, iadd) + + def __itruediv__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, itruediv) + + def __ifloordiv__( + self, raster: Union[int, float, "Raster", np.ndarray] + ) -> "Raster": + return self.__raster_calculation__(raster, ifloordiv) + + def __imul__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, imul) + + def __isub__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, isub) + + def __ipow__(self, raster: Union[int, float, "Raster", np.ndarray]) -> "Raster": + return self.__raster_calculation__(raster, ipow) + + def __iter__(self) -> Generator[Any, None, None]: + _iter_shape: Union[Tuple[int, int], int] = (self.rows * self.cols, self.layers) + if self.layers == 1: + _iter_shape = self.rows * self.cols + _iter = self.array.reshape(_iter_shape) + for i in range(self.rows * self.cols): + yield _iter[i] + + def save(self, file_name: str, compress: bool = False) -> None: + """Save raster as geotiff + + Parameters + ---------- + file_name : str + output filename + """ + save_raster( + file_name, + self.array, + self.crs, + affine=self.transform, + nodata=self.no_data, + compress=compress, + ) + + def resize( + self, height: int, width: int, method: str = "bilinear", backend: str = "opencv" + ) -> "Raster": + """Resize raster into defined height and width + + Parameters + ------- + height: int + height defined + width: int + width defined + method: str nearest or bicubic or bilinear or area or lanczos, default bilinear + resampling method for opencv
+ * if nearest, a nearest-neighbor interpolation
+ * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
+ * if bilinear, a bilinear interpolation
+ * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
+ * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood + backend: str opencv or python, default opencv + resampling backend
+ * if opencv, image will be resampled using opencv
+ * if python, image will be resampled using pure python. slower and nearest neighbor only + + + Returns + ------- + Raster + Resized + """ + if backend == "opencv": + return self.__cv_resize(height, width, method) + elif backend == "python": + return self.__py_resize(height, width) + else: + raise ValueError("Please choose between python or opencv for backend") + + def resample( + self, + resolution: Union[Tuple[float, float], List[float], float], + method: str = "bilinear", + backend: str = "opencv", + ) -> "Raster": + """Resample image into defined resolution + + Parameters + ------- + resolution: tuple, list, float + spatial resolution target + method: str nearest or bicubic or bilinear or area or lanczos, default bilinear + resampling method for opencv
+ * if nearest, a nearest-neighbor interpolation
+ * if bicubic, a bicubic interpolation over 4×4 pixel neighborhood
+ * if bilinear, a bilinear interpolation
+ * if area, resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire’-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
+ * if lanczos, a Lanczos interpolation over 8×8 pixel neighborhood + backend: str opencv or python, default opencv + resampling backend
+ * if opencv, image will be resampled using opencv
+ * if python, image will be resampled using pure python. slower and nearest neighbor only + + + Returns + ------- + Raster + Resampled + """ + if backend == "opencv": + if abs(self.resolution[0]) != abs(self.resolution[1]): + warnings.warn( + "non square pixel resolution, use rasterio instead", UserWarning + ) + return self.__cv_resample(resolution, method) + elif backend == "python": + return self.__py_resample(resolution) + else: + raise ValueError("Please choose between python or opencv for backend") + + def __cv_resize(self, height: int, width: int, method: str) -> "Raster": + resized_y_resolution = self.y_extent / height + resized_x_resolution = self.x_extent / width + resized = cv2.resize( + self.array, (width, height), interpolation=self.__cv2_resize_method[method] + ) + return Raster( + resized, + (resized_x_resolution, resized_y_resolution), + self.x_min, + self.y_max, + epsg=self.epsg, + ) + + def __cv_resample( + self, resolution: Union[Tuple[float, float], List[float], float], method: str + ) -> "Raster": + if isinstance(resolution, (float, int)): + resampled_x_resolution = float(resolution) + resampled_y_resolution = float(resolution) + else: + resampled_x_resolution = resolution[0] + resampled_y_resolution = resolution[1] + + resampled_rows = round(self.y_extent / resampled_y_resolution) + resampled_cols = round(self.x_extent / resampled_x_resolution) + + resampled = self.__cv_resize(resampled_rows, resampled_cols, method) + return resampled + + def __py_resample( + self, resolution: Union[Tuple[float, float], List[float], float] + ) -> "Raster": + """ + Resample raster using nearest neighbor + Parameters + ------- + resolution: tuple, list + spatial resolution target + + Returns + ------- + Raster + Resampled + """ + warnings.warn("this function will be removed in v1.0", DeprecationWarning) + + if isinstance(resolution, (float, int)): + resampled_x_resolution = float(resolution) + resampled_y_resolution = float(resolution) + else: + resampled_x_resolution = resolution[0] + resampled_y_resolution = resolution[1] + + resampled_rows = round(self.y_extent / resampled_y_resolution) + resampled_cols = round(self.x_extent / resampled_x_resolution) + + resampled_shape: Tuple[int, ...] = (resampled_rows, resampled_cols, self.layers) + if self.layers == 1: + resampled_shape = (resampled_rows, resampled_cols) + + resampled_array = np.zeros( + resampled_rows * resampled_cols * self.layers, dtype=self.dtype + ).reshape(resampled_shape) + + resampled_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale( + resampled_x_resolution, -resampled_y_resolution + ) + + for row in range(resampled_rows): + for col in range(resampled_cols): + x, y = rowcol2xy((row, col), resampled_affine) + resampled_array[row, col] = self.xy_value( + x + (resampled_x_resolution / 2), y + (resampled_y_resolution / 2) + ) + + return Raster( + resampled_array, + (resampled_x_resolution, resampled_y_resolution), + self.x_min, + self.y_max, + epsg=self.epsg, + ) + + def __py_resize(self, height: int, width: int) -> "Raster": + """ + Resize raster using nearest neighbor + Parameters + ------- + height: int + raster height + width: int + raster width + + Returns + ------- + Raster + Resampled + """ + warnings.warn("this function will be removed in v1.0", DeprecationWarning) + + resized_y_resolution = self.y_extent / height + resized_x_resolution = self.x_extent / width + + resized_affine = Affine.translation(self.x_min, self.y_min) * Affine.scale( + resized_x_resolution, -resized_y_resolution + ) + + resized_shape: Tuple[int, ...] = (height, width, self.layers) + if self.layers == 1: + resized_shape = (height, width) + + resized_array = np.zeros( + height * width * self.layers, dtype=self.dtype + ).reshape(resized_shape) + + for row in range(height): + for col in range(width): + x, y = rowcol2xy((row, col), resized_affine) + resized_array[row, col] = self.xy_value( + x + (resized_x_resolution / 2), y + (resized_y_resolution / 2) + ) + + return Raster( + resized_array, + (resized_x_resolution, resized_y_resolution), + self.x_min, + self.y_max, + epsg=self.epsg, + ) + + def clip2bbox( + self, x_min: float, y_min: float, x_max: float, y_max: float + ) -> "Raster": + """Clipping into bounding boxes + + Returns + ------- + Raster + Clipped raster + """ + if ( + x_min < self.x_min + or y_min < self.y_min + or x_max > self.x_max + or y_max > self.y_max + ): + raise ValueError( + f"""Out of extent. extent is {self.x_min,self.y_min, self.x_max,self.y_max} + but input is {x_min},{y_min},{x_max},{y_max}""" + ) + + row_min, col_min = self.xy2rowcol(x_min, y_max) + row_max, col_max = self.xy2rowcol(x_max, y_min) + + clipped = self.array[row_min:row_max, col_min:col_max] + return Raster(clipped, self.resolution, x_min, y_max) + + def split2tiles( + self, tile_size: Union[int, Tuple[int, int], List[int]] + ) -> Generator[Tuple[int, int, "Raster"], None, None]: + """ + Split raster into smaller tiles, excessive will be padded and have no data value + + Parameters + ------- + tile_size: int, list of int, tuple of int + dimension of tiles + + Yields + ------- + int, int, Raster + row, column, tiled raster + """ + + tile_width: int = 0 + tile_height: int = 0 + if isinstance(tile_size, int): + tile_height = tile_size + tile_width = tile_size + elif isinstance(tile_size, tuple) or isinstance(tile_size, list): + if isinstance(tile_size[0], int) or isinstance(tile_size[1], int): + tile_height, tile_width = tile_size + + new_height = self.shape[0] + if self.shape[0] % tile_height != 0: + new_height += tile_height - (new_height % tile_height) + + new_width = self.shape[1] + if self.shape[1] % tile_width != 0: + new_width += tile_width - (new_width % tile_width) + + padded_array = np.zeros((new_height, new_height, self.layers), dtype=self.dtype) + padded_array[:] = self.no_data + padded_array[: self.shape[0], : self.shape[1]] = self.array + + for r in range(0, new_height, tile_height): + for c in range(0, new_width, tile_width): + yield r, c, Raster( + padded_array[r : r + tile_height, c : c + tile_width], + self.resolution, + *self.rowcol2xy(r, c, offset="ul"), + epsg=self.epsg, + no_data=self.no_data, + ) + + +class Layer(Raster): + """placeholder for future development""" + + pass + + +class Pixel(Raster): + """placeholder for future development""" + + pass diff --git a/poetry.lock b/poetry.lock index c214859..6e83e7e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,1033 +1,1083 @@ -[[package]] -name = "affine" -version = "2.3.0" -description = "Matrices describing affine transformation of the plane." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -test = ["pytest (>=3.0)", "pytest-cov", "pydocstyle", "coveralls"] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "attrs" -version = "21.2.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] - -[[package]] -name = "black" -version = "20.8b1" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -name = "certifi" -version = "2021.5.30" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "click-plugins" -version = "1.1.1" -description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -click = ">=4.0" - -[package.extras] -dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"] - -[[package]] -name = "cligj" -version = "0.7.2" -description = "Click params for commmand line interfaces to GeoJSON" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" - -[package.dependencies] -click = ">=4.0" - -[package.extras] -test = ["pytest-cov"] - -[[package]] -name = "colorama" -version = "0.4.4" -description = "Cross-platform colored terminal text." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "coverage" -version = "5.5" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -toml = ["toml"] - -[[package]] -name = "fiona" -version = "1.8.20" -description = "Fiona reads and writes spatial data files" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -attrs = ">=17" -certifi = "*" -click = ">=4.0" -click-plugins = ">=1.0" -cligj = ">=0.5" -munch = "*" -six = ">=1.7" - -[package.extras] -all = ["pytest (>=3)", "boto3 (>=1.2.4)", "pytest-cov", "shapely", "mock"] -calc = ["shapely"] -s3 = ["boto3 (>=1.2.4)"] -test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"] - -[[package]] -name = "gdal" -version = "3.3.0" -description = "GDAL: Geospatial Data Abstraction Library" -category = "main" -optional = false -python-versions = ">=3.6.0" - -[package.extras] -numpy = ["numpy (>1.0.0)"] - -[[package]] -name = "importlib-metadata" -version = "4.5.0" -description = "Read metadata from Python packages" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] - -[[package]] -name = "isort" -version = "5.9.1" -description = "A Python utility / library to sort Python imports." -category = "dev" -optional = false -python-versions = ">=3.6.1,<4.0" - -[package.extras] -pipfile_deprecated_finder = ["pipreqs", "requirementslib"] -requirements_deprecated_finder = ["pipreqs", "pip-api"] -colors = ["colorama (>=0.4.3,<0.5.0)"] -plugins = ["setuptools"] - -[[package]] -name = "llvmlite" -version = "0.36.0" -description = "lightweight wrapper around basic LLVM functionality" -category = "main" -optional = false -python-versions = ">=3.6,<3.10" - -[[package]] -name = "mako" -version = "1.1.4" -description = "A super-fast templating language that borrows the best ideas from the existing templating languages." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -MarkupSafe = ">=0.9.2" - -[package.extras] -babel = ["babel"] -lingua = ["lingua"] - -[[package]] -name = "markdown" -version = "3.3.4" -description = "Python implementation of Markdown." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} - -[package.extras] -testing = ["coverage", "pyyaml"] - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "more-itertools" -version = "8.8.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "munch" -version = "2.5.0" -description = "A dot-accessible dictionary (a la JavaScript objects)" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -six = "*" - -[package.extras] -testing = ["pytest", "coverage", "astroid (>=1.5.3,<1.6.0)", "pylint (>=1.7.2,<1.8.0)", "astroid (>=2.0)", "pylint (>=2.3.1,<2.4.0)"] -yaml = ["PyYAML (>=5.1.0)"] - -[[package]] -name = "mypy" -version = "0.790" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -typed-ast = ">=1.4.0,<1.5.0" -typing-extensions = ">=3.7.4" - -[package.extras] -dmypy = ["psutil (>=4.0)"] - -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "numba" -version = "0.53.1" -description = "compiling Python code using LLVM" -category = "main" -optional = false -python-versions = ">=3.6,<3.10" - -[package.dependencies] -llvmlite = ">=0.36.0rc1,<0.37" -numpy = ">=1.15" - -[[package]] -name = "numpy" -version = "1.21.0" -description = "NumPy is the fundamental package for array computing with Python." -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "opencv-python" -version = "4.5.2.54" -description = "Wrapper package for OpenCV python bindings." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -numpy = ">=1.13.3" - -[[package]] -name = "packaging" -version = "20.9" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -pyparsing = ">=2.0.2" - -[[package]] -name = "pathspec" -version = "0.8.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pdoc3" -version = "0.9.2" -description = "Auto-generate API documentation for Python projects." -category = "dev" -optional = false -python-versions = ">= 3.5" - -[package.dependencies] -mako = "*" -markdown = ">=3.0" - -[[package]] -name = "pluggy" -version = "0.13.1" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -name = "py" -version = "1.10.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "pyproj" -version = "3.1.0" -description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -certifi = "*" - -[[package]] -name = "pytest" -version = "5.4.3" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=17.4.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} -more-itertools = ">=4.0.0" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -wcwidth = "*" - -[package.extras] -checkqa-mypy = ["mypy (==v0.761)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-cov" -version = "2.12.1" -description = "Pytest plugin for measuring coverage." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -coverage = ">=5.2.1" -pytest = ">=4.6" -toml = "*" - -[package.extras] -testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] - -[[package]] -name = "rasterio" -version = "1.2.6" -description = "Fast and direct raster I/O for use with Numpy and SciPy" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -affine = "*" -attrs = "*" -certifi = "*" -click = ">=4.0" -click-plugins = "*" -cligj = ">=0.5" -numpy = "*" -snuggs = ">=1.4.1" - -[package.extras] -all = ["boto3 (>=1.2.4)", "pytest-cov (>=2.2.0)", "hypothesis", "shapely", "numpydoc", "ghp-import", "pytest (>=2.8.2)", "matplotlib", "packaging", "ipython (>=2.0)", "sphinx-rtd-theme", "sphinx"] -docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"] -ipython = ["ipython (>=2.0)"] -plot = ["matplotlib"] -s3 = ["boto3 (>=1.2.4)"] -test = ["boto3 (>=1.2.4)", "hypothesis", "packaging", "pytest-cov (>=2.2.0)", "pytest (>=2.8.2)", "shapely"] - -[[package]] -name = "regex" -version = "2021.4.4" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "shapely" -version = "1.7.1" -description = "Geometric objects, predicates, and operations" -category = "main" -optional = false -python-versions = "*" - -[package.extras] -all = ["numpy", "pytest", "pytest-cov"] -test = ["pytest", "pytest-cov"] -vectorized = ["numpy"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "snuggs" -version = "1.4.7" -description = "Snuggs are s-expressions for Numpy" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -numpy = "*" -pyparsing = ">=2.1.6" - -[package.extras] -test = ["pytest", "hypothesis"] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "dev" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tqdm" -version = "4.61.1" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -telegram = ["requests"] - -[[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "typing-extensions" -version = "3.10.0.0" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "zipp" -version = "3.4.1" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] - -[metadata] -lock-version = "1.1" -python-versions = ">=3.7,<3.10" -content-hash = "785517b4c8485cd29bc100fc84d28a56262e1e0821866146f074b54ef1034811" - -[metadata.files] -affine = [ - {file = "affine-2.3.0-py2.py3-none-any.whl", hash = "sha256:34b05b070d954c382e56f02c207a372d8a32621a87653cc30cdd31cd7f65799f"}, - {file = "affine-2.3.0.tar.gz", hash = "sha256:2e045def1aa29e613c42e801a7e10e0b9bacfed1a7c6af0cadf8843530a15102"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, - {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, -] -black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] -certifi = [ - {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, - {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -click-plugins = [ - {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, - {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, -] -cligj = [ - {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, - {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -coverage = [ - {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, - {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, - {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, - {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, - {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, - {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, - {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, - {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, - {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, - {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, - {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, - {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, - {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, - {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, - {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, - {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, - {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, - {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, - {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, - {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, - {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, - {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, - {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, - {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, - {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, - {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, - {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, - {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, - {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, - {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, - {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, - {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, - {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, - {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, - {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, - {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, - {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, -] -fiona = [ - {file = "Fiona-1.8.20-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:02880556540e36ad6aac97687799d9b3093c354787a47bc0e73026c7fc15f1b3"}, - {file = "Fiona-1.8.20-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3f668c471fa2f8c9c0a9ca83639cb2c8dcc93edc3d93d43dba2f9e8da38ad53e"}, - {file = "Fiona-1.8.20-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:54f81039e913d0f88728ef23edf5a69038dec94dea54f4c799f972ba8e2a7d40"}, - {file = "Fiona-1.8.20-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:328340a448bed5c43d119f61f760368a04d13a302c59d2fccb051a3ff021f4b8"}, - {file = "Fiona-1.8.20-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:03f910380dbe684730b59b817aa030e6e9a3ee79211b66c6db2d1c8fe6ea12de"}, - {file = "Fiona-1.8.20-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:bef100ebd82afb9a4d67096216e82611b82ca9341330e4805832d7ff8c9bc1f7"}, - {file = "Fiona-1.8.20-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5e1cef608c6de9039eaa65b395024096e3189ab0559a5a328c68c4690c3302ce"}, - {file = "Fiona-1.8.20-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e72e4a5b84ec410be531d4fe4c1a5c87c6c0e92d01116c145c0f1b33f81c8080"}, - {file = "Fiona-1.8.20.tar.gz", hash = "sha256:a70502d2857b82f749c09cb0dea3726787747933a2a1599b5ab787d74e3c143b"}, -] -gdal = [ - {file = "GDAL-3.3.0.tar.gz", hash = "sha256:ed314a0b3f8b3729a9f6d8ca23f21473c2ff4a946d1a2969e0a1937bf0f4e700"}, -] -importlib-metadata = [ - {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, - {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, -] -isort = [ - {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, - {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, -] -llvmlite = [ - {file = "llvmlite-0.36.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc0f9b9644b4ab0e4a5edb17f1531d791630c88858220d3cc688d6edf10da100"}, - {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f7918dbac02b1ebbfd7302ad8e8307d7877ab57d782d5f04b70ff9696b53c21b"}, - {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7768658646c418b9b3beccb7044277a608bc8c62b82a85e73c7e5c065e4157c2"}, - {file = "llvmlite-0.36.0-cp36-cp36m-win32.whl", hash = "sha256:05f807209a360d39526d98141b6f281b9c7c771c77a4d1fc22002440642c8de2"}, - {file = "llvmlite-0.36.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d1fdd63c371626c25ad834e1c6297eb76cf2f093a40dbb401a87b6476ab4e34e"}, - {file = "llvmlite-0.36.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c4e7066447305d5095d0b0a9cae7b835d2f0fde143456b3124110eab0856426"}, - {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9dad7e4bb042492914292aea3f4172eca84db731f9478250240955aedba95e08"}, - {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1ce5bc0a638d874a08d4222be0a7e48e5df305d094c2ff8dec525ef32b581551"}, - {file = "llvmlite-0.36.0-cp37-cp37m-win32.whl", hash = "sha256:dbedff0f6d417b374253a6bab39aa4b5364f1caab30c06ba8726904776fcf1cb"}, - {file = "llvmlite-0.36.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b17fc4b0dd17bd29d7297d054e2915fad535889907c3f65232ee21f483447c5"}, - {file = "llvmlite-0.36.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3a77e46e6053e2a86e607e87b97651dda81e619febb914824a927bff4e88737"}, - {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:048a7c117641c9be87b90005684e64a6f33ea0897ebab1df8a01214a10d6e79a"}, - {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7db4b0eef93125af1c4092c64a3c73c7dc904101117ef53f8d78a1a499b8d5f4"}, - {file = "llvmlite-0.36.0-cp38-cp38-win32.whl", hash = "sha256:50b1828bde514b31431b2bba1aa20b387f5625b81ad6e12fede430a04645e47a"}, - {file = "llvmlite-0.36.0-cp38-cp38-win_amd64.whl", hash = "sha256:f608bae781b2d343e15e080c546468c5a6f35f57f0446923ea198dd21f23757e"}, - {file = "llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a"}, - {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1"}, - {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1"}, - {file = "llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a"}, - {file = "llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c"}, - {file = "llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9"}, -] -mako = [ - {file = "Mako-1.1.4-py2.py3-none-any.whl", hash = "sha256:aea166356da44b9b830c8023cd9b557fa856bd8b4035d6de771ca027dfc5cc6e"}, - {file = "Mako-1.1.4.tar.gz", hash = "sha256:17831f0b7087c313c0ffae2bcbbd3c1d5ba9eeac9c38f2eb7b50e8c99fe9d5ab"}, -] -markdown = [ - {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, - {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, -] -markupsafe = [ - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] -more-itertools = [ - {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, - {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, -] -munch = [ - {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, - {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, -] -mypy = [ - {file = "mypy-0.790-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669"}, - {file = "mypy-0.790-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802"}, - {file = "mypy-0.790-cp35-cp35m-win_amd64.whl", hash = "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de"}, - {file = "mypy-0.790-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1"}, - {file = "mypy-0.790-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc"}, - {file = "mypy-0.790-cp36-cp36m-win_amd64.whl", hash = "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7"}, - {file = "mypy-0.790-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c"}, - {file = "mypy-0.790-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178"}, - {file = "mypy-0.790-cp37-cp37m-win_amd64.whl", hash = "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324"}, - {file = "mypy-0.790-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01"}, - {file = "mypy-0.790-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666"}, - {file = "mypy-0.790-cp38-cp38-win_amd64.whl", hash = "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea"}, - {file = "mypy-0.790-py3-none-any.whl", hash = "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122"}, - {file = "mypy-0.790.tar.gz", hash = "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -numba = [ - {file = "numba-0.53.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b23de6b6837c132087d06b8b92d343edb54b885873b824a037967fbd5272ebb7"}, - {file = "numba-0.53.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6545b9e9b0c112b81de7f88a3c787469a357eeff8211e90b8f45ee243d521cc2"}, - {file = "numba-0.53.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:8fa5c963a43855050a868106a87cd614f3c3f459951c8fc468aec263ef80d063"}, - {file = "numba-0.53.1-cp36-cp36m-win32.whl", hash = "sha256:aaa6ebf56afb0b6752607b9f3bf39e99b0efe3c1fa6849698373925ee6838fd7"}, - {file = "numba-0.53.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08b3df38aab769df79ed948d70f0a54a3cdda49d58af65369235c204ec5d0f3"}, - {file = "numba-0.53.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:bf5c463b62d013e3f709cc8277adf2f4f4d8cc6757293e29c6db121b77e6b760"}, - {file = "numba-0.53.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:74df02e73155f669e60dcff07c4eef4a03dbf5b388594db74142ab40914fe4f5"}, - {file = "numba-0.53.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5165709bf62f28667e10b9afe6df0ce1037722adab92d620f59cb8bbb8104641"}, - {file = "numba-0.53.1-cp37-cp37m-win32.whl", hash = "sha256:2e96958ed2ca7e6d967b2ce29c8da0ca47117e1de28e7c30b2c8c57386506fa5"}, - {file = "numba-0.53.1-cp37-cp37m-win_amd64.whl", hash = "sha256:276f9d1674fe08d95872d81b97267c6b39dd830f05eb992608cbede50fcf48a9"}, - {file = "numba-0.53.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c4c8d102512ae472af52c76ad9522da718c392cb59f4cd6785d711fa5051a2a"}, - {file = "numba-0.53.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:691adbeac17dbdf6ed7c759e9e33a522351f07d2065fe926b264b6b2c15fd89b"}, - {file = "numba-0.53.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:94aab3e0e9e8754116325ce026e1b29ae72443c706a3104cf7f3368dc3012912"}, - {file = "numba-0.53.1-cp38-cp38-win32.whl", hash = "sha256:aabeec89bb3e3162136eea492cea7ee8882ddcda2201f05caecdece192c40896"}, - {file = "numba-0.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:1895ebd256819ff22256cd6fe24aa8f7470b18acc73e7917e8e93c9ac7f565dc"}, - {file = "numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c"}, - {file = "numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f"}, - {file = "numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744"}, - {file = "numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221"}, - {file = "numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69"}, - {file = "numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0"}, -] -numpy = [ - {file = "numpy-1.21.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d5caa946a9f55511e76446e170bdad1d12d6b54e17a2afe7b189112ed4412bb8"}, - {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ac4fd578322842dbda8d968e3962e9f22e862b6ec6e3378e7415625915e2da4d"}, - {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:598fe100b2948465cf3ed64b1a326424b5e4be2670552066e17dfaa67246011d"}, - {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c55407f739f0bfcec67d0df49103f9333edc870061358ac8a8c9e37ea02fcd2"}, - {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:75579acbadbf74e3afd1153da6177f846212ea2a0cc77de53523ae02c9256513"}, - {file = "numpy-1.21.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cc367c86eb87e5b7c9592935620f22d13b090c609f1b27e49600cd033b529f54"}, - {file = "numpy-1.21.0-cp37-cp37m-win32.whl", hash = "sha256:d89b0dc7f005090e32bb4f9bf796e1dcca6b52243caf1803fdd2b748d8561f63"}, - {file = "numpy-1.21.0-cp37-cp37m-win_amd64.whl", hash = "sha256:eda2829af498946c59d8585a9fd74da3f810866e05f8df03a86f70079c7531dd"}, - {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:1a784e8ff7ea2a32e393cc53eb0003eca1597c7ca628227e34ce34eb11645a0e"}, - {file = "numpy-1.21.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bba474a87496d96e61461f7306fba2ebba127bed7836212c360f144d1e72ac54"}, - {file = "numpy-1.21.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fd0a359c1c17f00cb37de2969984a74320970e0ceef4808c32e00773b06649d9"}, - {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4d5a86a5257843a18fb1220c5f1c199532bc5d24e849ed4b0289fb59fbd4d8f"}, - {file = "numpy-1.21.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:620732f42259eb2c4642761bd324462a01cdd13dd111740ce3d344992dd8492f"}, - {file = "numpy-1.21.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b9205711e5440954f861ceeea8f1b415d7dd15214add2e878b4d1cf2bcb1a914"}, - {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ad09f55cc95ed8d80d8ab2052f78cc21cb231764de73e229140d81ff49d8145e"}, - {file = "numpy-1.21.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:a1f2fb2da242568af0271455b89aee0f71e4e032086ee2b4c5098945d0e11cf6"}, - {file = "numpy-1.21.0-cp38-cp38-win32.whl", hash = "sha256:e58ddb53a7b4959932f5582ac455ff90dcb05fac3f8dcc8079498d43afbbde6c"}, - {file = "numpy-1.21.0-cp38-cp38-win_amd64.whl", hash = "sha256:d2910d0a075caed95de1a605df00ee03b599de5419d0b95d55342e9a33ad1fb3"}, - {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a290989cd671cd0605e9c91a70e6df660f73ae87484218e8285c6522d29f6e38"}, - {file = "numpy-1.21.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3537b967b350ad17633b35c2f4b1a1bbd258c018910b518c30b48c8e41272717"}, - {file = "numpy-1.21.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ccc6c650f8700ce1e3a77668bb7c43e45c20ac06ae00d22bdf6760b38958c883"}, - {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:709884863def34d72b183d074d8ba5cfe042bc3ff8898f1ffad0209161caaa99"}, - {file = "numpy-1.21.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bebab3eaf0641bba26039fb0b2c5bf9b99407924b53b1ea86e03c32c64ef5aef"}, - {file = "numpy-1.21.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cf680682ad0a3bef56dae200dbcbac2d57294a73e5b0f9864955e7dd7c2c2491"}, - {file = "numpy-1.21.0-cp39-cp39-win32.whl", hash = "sha256:d95d16204cd51ff1a1c8d5f9958ce90ae190be81d348b514f9be39f878b8044a"}, - {file = "numpy-1.21.0-cp39-cp39-win_amd64.whl", hash = "sha256:2ba579dde0563f47021dcd652253103d6fd66165b18011dce1a0609215b2791e"}, - {file = "numpy-1.21.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c40e6b860220ed862e8097b8f81c9af6d7405b723f4a7af24a267b46f90e461"}, - {file = "numpy-1.21.0.zip", hash = "sha256:e80fe25cba41c124d04c662f33f6364909b985f2eb5998aaa5ae4b9587242cce"}, -] -opencv-python = [ - {file = "opencv_python-4.5.2.54-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:4e6c2d8320168a4f76822fbb76df3b18688ac5e068d49ac38a4ce39af0f8e1a6"}, - {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9680ab256ab31bdafd74f6cf55eb570e5629b5604d50fd69dd1bd2a8124f0611"}, - {file = "opencv_python-4.5.2.54-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ef3102b70aa59ab3fed69df30465c1b7587d681e963dfff5146de233c75df7ba"}, - {file = "opencv_python-4.5.2.54-cp36-cp36m-win32.whl", hash = "sha256:89a2b45429bf945988a17b0404431d9d8fdc9e04fb2450b56fa01f6f9477101d"}, - {file = "opencv_python-4.5.2.54-cp36-cp36m-win_amd64.whl", hash = "sha256:08327a38564786bf73e387736f080e8ad4c110b394ca4af2ecec8277b305bf44"}, - {file = "opencv_python-4.5.2.54-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:6b2573c6367ec0052b37e375d18638a885dd7a10a5ef8dd726b391969c227f23"}, - {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b724a96eeb88842bd2371b1ffe2da73b6295063ba5c029aa34139d25b8315a3f"}, - {file = "opencv_python-4.5.2.54-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:4b8814d3f0cf01e8b8624125f7dcfb095893abcc04083cb4968fa1629bc81161"}, - {file = "opencv_python-4.5.2.54-cp37-cp37m-win32.whl", hash = "sha256:d9004e2cc90bb2862cdc1d062fac5163d3def55b200081d4520d3e90b4c7197b"}, - {file = "opencv_python-4.5.2.54-cp37-cp37m-win_amd64.whl", hash = "sha256:2436b71346d1eed423577fac8cd3aa9c0832ea97452444dc7f856b2f09600dba"}, - {file = "opencv_python-4.5.2.54-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:0118a086fad8d77acdf46ac68df49d4167fbb85420f8bcf2615d7b74fc03aae0"}, - {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b3bef3f2a2ab3c201784d12ec6b5c9e61c920c15b6854d8d2f62fd019e3df846"}, - {file = "opencv_python-4.5.2.54-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6e2070e35f2aaca3d1259093c786d4e373004b36d89a94e81943247c6ed3d4e1"}, - {file = "opencv_python-4.5.2.54-cp38-cp38-win32.whl", hash = "sha256:f12f39c1e5001e1c00df5873e3eee6f0232b7723a60b7ef438b1e23f1341df0e"}, - {file = "opencv_python-4.5.2.54-cp38-cp38-win_amd64.whl", hash = "sha256:10325c3fd571e33a11eb5f0e5d265d73baef22dbb34c977f28df7e22de47b0bc"}, - {file = "opencv_python-4.5.2.54-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:050227e5728ea8316ec114aca8f43d56253cbb1c50983e3b136a988254a83118"}, - {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:c446555cbbc4f5e809f9c15ac1b6200024032d9859f5ac5a2ca7669d09e4c91c"}, - {file = "opencv_python-4.5.2.54-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8cf81f53ac5ad900ca443a8252c4e0bc1256f1c2cb2d8459df2ba1ac014dfa36"}, - {file = "opencv_python-4.5.2.54-cp39-cp39-win32.whl", hash = "sha256:a8020cc6145c6934192189058743a55189750df6dff894396edb8b35a380cc48"}, - {file = "opencv_python-4.5.2.54-cp39-cp39-win_amd64.whl", hash = "sha256:0a3aef70b7c53bbd22ade86a4318b8a2ad98d3c3ed3d0c315f18bf1a2d868709"}, -] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, -] -pdoc3 = [ - {file = "pdoc3-0.9.2.tar.gz", hash = "sha256:9df5d931f25f353c69c46819a3bd03ef96dd286f2a70bb1b93a23a781f91faa1"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pyproj = [ - {file = "pyproj-3.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8eda240225971b5cd0bac2d399ed6222068f0598ee92d5f6e847bd2019d2c8b0"}, - {file = "pyproj-3.1.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:ae237492767e0225f99b53a0fd7110fde2b7e7cabc105bbc243c151a7497de88"}, - {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b635e7e21fea5af74e90fc9e54d1a4c27078efdce6f214101c98dd93afae599a"}, - {file = "pyproj-3.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa87df0982aa0f4477478899d9c930cc0f97cd6d8a4ce84c43ac88ccf86d1da7"}, - {file = "pyproj-3.1.0-cp37-cp37m-win32.whl", hash = "sha256:10dad599b9f7ce2194996dc25f1000e0aa15754ecef9db46b624713959c67957"}, - {file = "pyproj-3.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:a162ed199cd2ec392cffe20b2fa3381b68e7a166d55f3f060eceb8d517e4f46d"}, - {file = "pyproj-3.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e88ebc4e08e661e9011b5c1ebfb32f0d311963a9824a6effb4168c7e07918b1"}, - {file = "pyproj-3.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:da88abc5e2f6a8fb07533855a57ca2a31845f58901a87f821b68b0db6b023978"}, - {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:911d773da9fa4d4f3f7580173858c391e3ee0b61acaf0be303baab323d2eae78"}, - {file = "pyproj-3.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f8a8d982bde211e65dc2de1f8f36cf162f9cc7fcd8a7625046ea265284e5e65"}, - {file = "pyproj-3.1.0-cp38-cp38-win32.whl", hash = "sha256:c4193e1069d165476b2d0f7d882b7712b3eab6e2e6fe2a0a78ef40de825a1f28"}, - {file = "pyproj-3.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:b6c74bbec679199746a3e02c0e0fad093c3652df96dd63e086a2fbf2afe9dc0e"}, - {file = "pyproj-3.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:04c185102e659439c5bd428ac5473d36ef795fca8e225bbbe78e20643d804ec0"}, - {file = "pyproj-3.1.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ebbba7707fe83a01e54bce8e3e7342feb0b3e0d74ff8c28df12f8bc59b76827c"}, - {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9cc464a1c51baad28ffb7a233116e8d4ce4c560b32039fa986d0f992ac3c431f"}, - {file = "pyproj-3.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f3ad09cf3352bf5664794042b28d98781362ec8d9774ad73f28a1a0101a27f1"}, - {file = "pyproj-3.1.0-cp39-cp39-win32.whl", hash = "sha256:ae5534fa7a3b74f20534694d297fce6f7483890ff6ca404394ecf372f3c589d4"}, - {file = "pyproj-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:808f5992320e9631b2e45444028a65cd6ba3ee40229292934178ef07020a5ffd"}, - {file = "pyproj-3.1.0.tar.gz", hash = "sha256:67b94f4e694ae33fc90dfb7da0e6b5ed5f671dd0acc2f6cf46e9c39d56e16e1a"}, -] -pytest = [ - {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, - {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, -] -pytest-cov = [ - {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, - {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, -] -rasterio = [ - {file = "rasterio-1.2.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fda220ca942ff7446458a1d532121a2a0bebffdcbe064e4719dcca348a2ed541"}, - {file = "rasterio-1.2.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2134587770d258ed97f40e4f910b7250bd3d39cdba76f9dd1617ca73cd481ff5"}, - {file = "rasterio-1.2.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6154622ec5210f5768db6544502b89487cfac10b0be9a321af33cd64e8cbe0fa"}, - {file = "rasterio-1.2.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bd06ed04197eb79b96240dc90354fe15e0fe9b531312830045c849e4db57a42f"}, - {file = "rasterio-1.2.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:87129e50e835e2696c17d19c5e7f5d566d09f8895d9e405e2c7d78adc63ae626"}, - {file = "rasterio-1.2.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:da2ed05c025bbdc1df8bdd9d1237e96ca3030eadabdb67722674620e9732a54a"}, - {file = "rasterio-1.2.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294479e9d7caf64c95a90b2ed2ec13df6eba35f035f0c536a388e0160e9abf03"}, - {file = "rasterio-1.2.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:f55aa86bac58672ca47627a1dfecd56d35581beb49feae1f22818f97ff79abf8"}, - {file = "rasterio-1.2.6.tar.gz", hash = "sha256:24975b97fe2fc3fd282d59640baab19de431448e1b23be6b85b68fecc1362f88"}, -] -regex = [ - {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, - {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, - {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, - {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, - {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, - {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, - {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, - {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, - {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, - {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, - {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, - {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, - {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, - {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, - {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, - {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, - {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, -] -shapely = [ - {file = "Shapely-1.7.1-1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:46da0ea527da9cf9503e66c18bab6981c5556859e518fe71578b47126e54ca93"}, - {file = "Shapely-1.7.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:4c10f317e379cc404f8fc510cd9982d5d3e7ba13a9cfd39aa251d894c6366798"}, - {file = "Shapely-1.7.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:17df66e87d0fe0193910aeaa938c99f0b04f67b430edb8adae01e7be557b141b"}, - {file = "Shapely-1.7.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:da38ed3d65b8091447dc3717e5218cc336d20303b77b0634b261bc5c1aa2bae8"}, - {file = "Shapely-1.7.1-cp35-cp35m-win32.whl", hash = "sha256:8e7659dd994792a0aad8fb80439f59055a21163e236faf2f9823beb63a380e19"}, - {file = "Shapely-1.7.1-cp35-cp35m-win_amd64.whl", hash = "sha256:791477edb422692e7dc351c5ed6530eb0e949a31b45569946619a0d9cd5f53cb"}, - {file = "Shapely-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e3afccf0437edc108eef1e2bb9cc4c7073e7705924eb4cd0bf7715cd1ef0ce1b"}, - {file = "Shapely-1.7.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8f15b6ce67dcc05b61f19c689b60f3fe58550ba994290ff8332f711f5aaa9840"}, - {file = "Shapely-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:60e5b2282619249dbe8dc5266d781cc7d7fb1b27fa49f8241f2167672ad26719"}, - {file = "Shapely-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:de618e67b64a51a0768d26a9963ecd7d338a2cf6e9e7582d2385f88ad005b3d1"}, - {file = "Shapely-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:182716ffb500d114b5d1b75d7fd9d14b7d3414cef3c38c0490534cc9ce20981a"}, - {file = "Shapely-1.7.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4f3c59f6dbf86a9fc293546de492f5e07344e045f9333f3a753f2dda903c45d1"}, - {file = "Shapely-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:6871acba8fbe744efa4f9f34e726d070bfbf9bffb356a8f6d64557846324232b"}, - {file = "Shapely-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:35be1c5d869966569d3dfd4ec31832d7c780e9df760e1fe52131105685941891"}, - {file = "Shapely-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:052eb5b9ba756808a7825e8a8020fb146ec489dd5c919e7d139014775411e688"}, - {file = "Shapely-1.7.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:90a3e2ae0d6d7d50ff2370ba168fbd416a53e7d8448410758c5d6a5920646c1d"}, - {file = "Shapely-1.7.1-cp38-cp38-win32.whl", hash = "sha256:a3774516c8a83abfd1ddffb8b6ec1b0935d7fe6ea0ff5c31a18bfdae567b4eba"}, - {file = "Shapely-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:6593026cd3f5daaea12bcc51ae5c979318070fefee210e7990cb8ac2364e79a1"}, - {file = "Shapely-1.7.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:b40cc7bb089ae4aa9ddba1db900b4cd1bce3925d2a4b5837b639e49de054784f"}, - {file = "Shapely-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2df5260d0f2983309776cb41bfa85c464ec07018d88c0ecfca23d40bfadae2f1"}, - {file = "Shapely-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:a5c3a50d823c192f32615a2a6920e8c046b09e07a58eba220407335a9cd2e8ea"}, - {file = "Shapely-1.7.1.tar.gz", hash = "sha256:1641724c1055459a7e2b8bbe47ba25bdc89554582e62aec23cb3f3ca25f9b129"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -snuggs = [ - {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"}, - {file = "snuggs-1.4.7.tar.gz", hash = "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -tqdm = [ - {file = "tqdm-4.61.1-py2.py3-none-any.whl", hash = "sha256:aa0c29f03f298951ac6318f7c8ce584e48fa22ec26396e6411e43d038243bdb2"}, - {file = "tqdm-4.61.1.tar.gz", hash = "sha256:24be966933e942be5f074c29755a95b315c69a91f839a29139bf26ffffe2d3fd"}, -] -typed-ast = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] -typing-extensions = [ - {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, - {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, - {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, -] -wcwidth = [ - {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, - {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, -] -zipp = [ - {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, - {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, -] +[[package]] +name = "affine" +version = "2.3.0" +description = "Matrices describing affine transformation of the plane." +category = "main" +optional = false +python-versions = "*" + +[package.extras] +test = ["pytest (>=3.0)", "pytest-cov", "pydocstyle", "coveralls"] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "certifi" +version = "2021.10.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "click-plugins" +version = "1.1.1" +description = "An extension module for click to enable registering CLI commands via setuptools entry-points." +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +click = ">=4.0" + +[package.extras] +dev = ["pytest (>=3.6)", "pytest-cov", "wheel", "coveralls"] + +[[package]] +name = "cligj" +version = "0.7.2" +description = "Click params for commmand line interfaces to GeoJSON" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, <4" + +[package.dependencies] +click = ">=4.0" + +[package.extras] +test = ["pytest-cov"] + +[[package]] +name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "coverage" +version = "5.5" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +toml = ["toml"] + +[[package]] +name = "Fiona" +version = "1.8.20" +description = "Fiona reads and writes spatial data files" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +attrs = ">=17" +certifi = "*" +click = ">=4.0" +click-plugins = ">=1.0" +cligj = ">=0.5" +gdal = ">=3.3.0,<3.4.0" +munch = "*" +six = ">=1.7" + +[package.extras] +all = ["shapely", "pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"] +calc = ["shapely"] +s3 = ["boto3 (>=1.2.4)"] +test = ["pytest (>=3)", "pytest-cov", "boto3 (>=1.2.4)", "mock"] + +[package.source] +type = "file" +url = "../../../.pypkg/Fiona-1.8.20-cp39-cp39-win_amd64.whl" + +[[package]] +name = "GDAL" +version = "3.3.2" +description = "GDAL: Geospatial Data Abstraction Library" +category = "main" +optional = false +python-versions = ">=3.6.0" + +[package.extras] +numpy = ["numpy (>1.19.0)"] + +[package.source] +type = "file" +url = "../../../.pypkg/GDAL-3.3.2-cp39-cp39-win_amd64.whl" + +[[package]] +name = "importlib-metadata" +version = "4.8.1" +description = "Read metadata from Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +perf = ["ipython"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] + +[[package]] +name = "isort" +version = "5.9.3" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "llvmlite" +version = "0.36.0" +description = "lightweight wrapper around basic LLVM functionality" +category = "main" +optional = false +python-versions = ">=3.6,<3.10" + +[[package]] +name = "mako" +version = "1.1.5" +description = "A super-fast templating language that borrows the best ideas from the existing templating languages." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +MarkupSafe = ">=0.9.2" + +[package.extras] +babel = ["babel"] +lingua = ["lingua"] + +[[package]] +name = "markdown" +version = "3.3.4" +description = "Python implementation of Markdown." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[package.extras] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" +optional = false +python-versions = ">=3.6" + +[[package]] +name = "more-itertools" +version = "8.10.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "munch" +version = "2.5.0" +description = "A dot-accessible dictionary (a la JavaScript objects)" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +six = "*" + +[package.extras] +testing = ["pytest", "coverage", "astroid (>=1.5.3,<1.6.0)", "pylint (>=1.7.2,<1.8.0)", "astroid (>=2.0)", "pylint (>=2.3.1,<2.4.0)"] +yaml = ["PyYAML (>=5.1.0)"] + +[[package]] +name = "mypy" +version = "0.790" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +mypy-extensions = ">=0.4.3,<0.5.0" +typed-ast = ">=1.4.0,<1.5.0" +typing-extensions = ">=3.7.4" + +[package.extras] +dmypy = ["psutil (>=4.0)"] + +[[package]] +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "numba" +version = "0.53.1" +description = "compiling Python code using LLVM" +category = "main" +optional = false +python-versions = ">=3.6,<3.10" + +[package.dependencies] +llvmlite = ">=0.36.0rc1,<0.37" +numpy = ">=1.15" + +[[package]] +name = "numpy" +version = "1.21.3" +description = "NumPy is the fundamental package for array computing with Python." +category = "main" +optional = false +python-versions = ">=3.7,<3.11" + +[[package]] +name = "opencv-python" +version = "4.5.4.58" +description = "Wrapper package for OpenCV python bindings." +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +numpy = ">=1.21.2" + +[[package]] +name = "packaging" +version = "21.0" +description = "Core utilities for Python packages" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +pyparsing = ">=2.0.2" + +[[package]] +name = "pathspec" +version = "0.9.0" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" + +[[package]] +name = "pdoc3" +version = "0.9.2" +description = "Auto-generate API documentation for Python projects." +category = "dev" +optional = false +python-versions = ">= 3.5" + +[package.dependencies] +mako = "*" +markdown = ">=3.0" + +[[package]] +name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[package.dependencies] +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] +name = "pyparsing" +version = "3.0.1" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +diagrams = ["jinja2", "railroad-diagrams"] + +[[package]] +name = "pyproj" +version = "3.2.1" +description = "Python interface to PROJ (cartographic projections and coordinate transformations library)" +category = "main" +optional = false +python-versions = ">=3.7" + +[package.dependencies] +certifi = "*" + +[[package]] +name = "pytest" +version = "5.4.3" +description = "pytest: simple powerful testing with Python" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +more-itertools = ">=4.0.0" +packaging = "*" +pluggy = ">=0.12,<1.0" +py = ">=1.5.0" +wcwidth = "*" + +[package.extras] +checkqa-mypy = ["mypy (==v0.761)"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "2.12.1" +description = "Pytest plugin for measuring coverage." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +coverage = ">=5.2.1" +pytest = ">=4.6" +toml = "*" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] + +[[package]] +name = "rasterio" +version = "1.2.9" +description = "Fast and direct raster I/O for use with Numpy and SciPy" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +affine = "*" +attrs = "*" +certifi = "*" +click = ">=4.0" +click-plugins = "*" +cligj = ">=0.5" +gdal = ">=3.3.2,<3.4.0" +numpy = "*" +snuggs = ">=1.4.1" + +[package.extras] +all = ["hypothesis", "pytest-cov (>=2.2.0)", "ghp-import", "sphinx-rtd-theme", "matplotlib", "shapely", "boto3 (>=1.2.4)", "pytest (>=2.8.2)", "sphinx", "packaging", "numpydoc", "ipython (>=2.0)"] +docs = ["ghp-import", "numpydoc", "sphinx", "sphinx-rtd-theme"] +ipython = ["ipython (>=2.0)"] +plot = ["matplotlib"] +s3 = ["boto3 (>=1.2.4)"] +test = ["boto3 (>=1.2.4)", "hypothesis", "packaging", "pytest-cov (>=2.2.0)", "pytest (>=2.8.2)", "shapely"] + +[package.source] +type = "file" +url = "../../../.pypkg/rasterio-1.2.9-cp39-cp39-win_amd64.whl" + +[[package]] +name = "regex" +version = "2021.10.23" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "shapely" +version = "1.8.0" +description = "Geometric objects, predicates, and operations" +category = "main" +optional = false +python-versions = ">=3.6" + +[package.extras] +all = ["pytest", "pytest-cov", "numpy"] +test = ["pytest", "pytest-cov"] +vectorized = ["numpy"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "snuggs" +version = "1.4.7" +description = "Snuggs are s-expressions for Numpy" +category = "main" +optional = false +python-versions = "*" + +[package.dependencies] +numpy = "*" +pyparsing = ">=2.1.6" + +[package.extras] +test = ["pytest", "hypothesis"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "tqdm" +version = "4.62.3" +description = "Fast, Extensible Progress Meter" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +telegram = ["requests"] + +[[package]] +name = "typed-ast" +version = "1.4.3" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "zipp" +version = "3.6.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] + +[metadata] +lock-version = "1.1" +python-versions = ">=3.7,<3.10" +content-hash = "5d6ce83e1ec350b84780984730c3c6f8bea2f66fdbe1cc33594a7de06a901096" + +[metadata.files] +affine = [ + {file = "affine-2.3.0-py2.py3-none-any.whl", hash = "sha256:34b05b070d954c382e56f02c207a372d8a32621a87653cc30cdd31cd7f65799f"}, + {file = "affine-2.3.0.tar.gz", hash = "sha256:2e045def1aa29e613c42e801a7e10e0b9bacfed1a7c6af0cadf8843530a15102"}, +] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +black = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] +certifi = [ + {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, + {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, +] +click = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] +click-plugins = [ + {file = "click-plugins-1.1.1.tar.gz", hash = "sha256:46ab999744a9d831159c3411bb0c79346d94a444df9a3a3742e9ed63645f264b"}, + {file = "click_plugins-1.1.1-py2.py3-none-any.whl", hash = "sha256:5d262006d3222f5057fd81e1623d4443e41dcda5dc815c06b442aa3c02889fc8"}, +] +cligj = [ + {file = "cligj-0.7.2-py3-none-any.whl", hash = "sha256:c1ca117dbce1fe20a5809dc96f01e1c2840f6dcc939b3ddbb1111bf330ba82df"}, + {file = "cligj-0.7.2.tar.gz", hash = "sha256:a4bc13d623356b373c2c27c53dbd9c68cae5d526270bfa71f6c6fa69669c6b27"}, +] +colorama = [ + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +coverage = [ + {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, + {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, + {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, + {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, + {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, + {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, + {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, + {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, + {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, + {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, + {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, + {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, + {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, + {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, + {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, + {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, + {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, + {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, + {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, + {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, + {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, + {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, + {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, + {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, +] +Fiona = [ + {file = "Fiona-1.8.20-cp39-cp39-win_amd64.whl", hash = "sha256:a5d1742c49879cc81cf34e124d1aba1891529472d32987b4ce79509b4332eb9a"}, +] +GDAL = [ + {file = "GDAL-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:ff961a2abe57974df71337a99367b460a5faeec17fc5fdbdd4e13e4cb229899d"}, +] +importlib-metadata = [ + {file = "importlib_metadata-4.8.1-py3-none-any.whl", hash = "sha256:b618b6d2d5ffa2f16add5697cf57a46c76a56229b0ed1c438322e4e95645bd15"}, + {file = "importlib_metadata-4.8.1.tar.gz", hash = "sha256:f284b3e11256ad1e5d03ab86bb2ccd6f5339688ff17a4d797a0fe7df326f23b1"}, +] +isort = [ + {file = "isort-5.9.3-py3-none-any.whl", hash = "sha256:e17d6e2b81095c9db0a03a8025a957f334d6ea30b26f9ec70805411e5c7c81f2"}, + {file = "isort-5.9.3.tar.gz", hash = "sha256:9c2ea1e62d871267b78307fe511c0838ba0da28698c5732d54e2790bf3ba9899"}, +] +llvmlite = [ + {file = "llvmlite-0.36.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cc0f9b9644b4ab0e4a5edb17f1531d791630c88858220d3cc688d6edf10da100"}, + {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f7918dbac02b1ebbfd7302ad8e8307d7877ab57d782d5f04b70ff9696b53c21b"}, + {file = "llvmlite-0.36.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7768658646c418b9b3beccb7044277a608bc8c62b82a85e73c7e5c065e4157c2"}, + {file = "llvmlite-0.36.0-cp36-cp36m-win32.whl", hash = "sha256:05f807209a360d39526d98141b6f281b9c7c771c77a4d1fc22002440642c8de2"}, + {file = "llvmlite-0.36.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d1fdd63c371626c25ad834e1c6297eb76cf2f093a40dbb401a87b6476ab4e34e"}, + {file = "llvmlite-0.36.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7c4e7066447305d5095d0b0a9cae7b835d2f0fde143456b3124110eab0856426"}, + {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9dad7e4bb042492914292aea3f4172eca84db731f9478250240955aedba95e08"}, + {file = "llvmlite-0.36.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:1ce5bc0a638d874a08d4222be0a7e48e5df305d094c2ff8dec525ef32b581551"}, + {file = "llvmlite-0.36.0-cp37-cp37m-win32.whl", hash = "sha256:dbedff0f6d417b374253a6bab39aa4b5364f1caab30c06ba8726904776fcf1cb"}, + {file = "llvmlite-0.36.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3b17fc4b0dd17bd29d7297d054e2915fad535889907c3f65232ee21f483447c5"}, + {file = "llvmlite-0.36.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b3a77e46e6053e2a86e607e87b97651dda81e619febb914824a927bff4e88737"}, + {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:048a7c117641c9be87b90005684e64a6f33ea0897ebab1df8a01214a10d6e79a"}, + {file = "llvmlite-0.36.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:7db4b0eef93125af1c4092c64a3c73c7dc904101117ef53f8d78a1a499b8d5f4"}, + {file = "llvmlite-0.36.0-cp38-cp38-win32.whl", hash = "sha256:50b1828bde514b31431b2bba1aa20b387f5625b81ad6e12fede430a04645e47a"}, + {file = "llvmlite-0.36.0-cp38-cp38-win_amd64.whl", hash = "sha256:f608bae781b2d343e15e080c546468c5a6f35f57f0446923ea198dd21f23757e"}, + {file = "llvmlite-0.36.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a3abc8a8889aeb06bf9c4a7e5df5bc7bb1aa0aedd91a599813809abeec80b5a"}, + {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:705f0323d931684428bb3451549603299bb5e17dd60fb979d67c3807de0debc1"}, + {file = "llvmlite-0.36.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:5a6548b4899facb182145147185e9166c69826fb424895f227e6b7cf924a8da1"}, + {file = "llvmlite-0.36.0-cp39-cp39-win32.whl", hash = "sha256:ff52fb9c2be66b95b0e67d56fce11038397e5be1ea410ee53f5f1175fdbb107a"}, + {file = "llvmlite-0.36.0-cp39-cp39-win_amd64.whl", hash = "sha256:1dee416ea49fd338c74ec15c0c013e5273b0961528169af06ff90772614f7f6c"}, + {file = "llvmlite-0.36.0.tar.gz", hash = "sha256:765128fdf5f149ed0b889ffbe2b05eb1717f8e20a5c87fa2b4018fbcce0fcfc9"}, +] +mako = [ + {file = "Mako-1.1.5-py2.py3-none-any.whl", hash = "sha256:6804ee66a7f6a6416910463b00d76a7b25194cd27f1918500c5bd7be2a088a23"}, + {file = "Mako-1.1.5.tar.gz", hash = "sha256:169fa52af22a91900d852e937400e79f535496191c63712e3b9fda5a9bed6fc3"}, +] +markdown = [ + {file = "Markdown-3.3.4-py3-none-any.whl", hash = "sha256:96c3ba1261de2f7547b46a00ea8463832c921d3f9d6aba3f255a6f71386db20c"}, + {file = "Markdown-3.3.4.tar.gz", hash = "sha256:31b5b491868dcc87d6c24b7e3d19a0d730d59d3e46f4eea6430a321bed387a49"}, +] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] +more-itertools = [ + {file = "more-itertools-8.10.0.tar.gz", hash = "sha256:1debcabeb1df793814859d64a81ad7cb10504c24349368ccf214c664c474f41f"}, + {file = "more_itertools-8.10.0-py3-none-any.whl", hash = "sha256:56ddac45541718ba332db05f464bebfb0768110111affd27f66e0051f276fa43"}, +] +munch = [ + {file = "munch-2.5.0-py2.py3-none-any.whl", hash = "sha256:6f44af89a2ce4ed04ff8de41f70b226b984db10a91dcc7b9ac2efc1c77022fdd"}, + {file = "munch-2.5.0.tar.gz", hash = "sha256:2d735f6f24d4dba3417fa448cae40c6e896ec1fdab6cdb5e6510999758a4dbd2"}, +] +mypy = [ + {file = "mypy-0.790-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:bd03b3cf666bff8d710d633d1c56ab7facbdc204d567715cb3b9f85c6e94f669"}, + {file = "mypy-0.790-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:2170492030f6faa537647d29945786d297e4862765f0b4ac5930ff62e300d802"}, + {file = "mypy-0.790-cp35-cp35m-win_amd64.whl", hash = "sha256:e86bdace26c5fe9cf8cb735e7cedfe7850ad92b327ac5d797c656717d2ca66de"}, + {file = "mypy-0.790-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e97e9c13d67fbe524be17e4d8025d51a7dca38f90de2e462243ab8ed8a9178d1"}, + {file = "mypy-0.790-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0d34d6b122597d48a36d6c59e35341f410d4abfa771d96d04ae2c468dd201abc"}, + {file = "mypy-0.790-cp36-cp36m-win_amd64.whl", hash = "sha256:72060bf64f290fb629bd4a67c707a66fd88ca26e413a91384b18db3876e57ed7"}, + {file = "mypy-0.790-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:eea260feb1830a627fb526d22fbb426b750d9f5a47b624e8d5e7e004359b219c"}, + {file = "mypy-0.790-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c614194e01c85bb2e551c421397e49afb2872c88b5830e3554f0519f9fb1c178"}, + {file = "mypy-0.790-cp37-cp37m-win_amd64.whl", hash = "sha256:0a0d102247c16ce93c97066443d11e2d36e6cc2a32d8ccc1f705268970479324"}, + {file = "mypy-0.790-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cf4e7bf7f1214826cf7333627cb2547c0db7e3078723227820d0a2490f117a01"}, + {file = "mypy-0.790-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:af4e9ff1834e565f1baa74ccf7ae2564ae38c8df2a85b057af1dbbc958eb6666"}, + {file = "mypy-0.790-cp38-cp38-win_amd64.whl", hash = "sha256:da56dedcd7cd502ccd3c5dddc656cb36113dd793ad466e894574125945653cea"}, + {file = "mypy-0.790-py3-none-any.whl", hash = "sha256:2842d4fbd1b12ab422346376aad03ff5d0805b706102e475e962370f874a5122"}, + {file = "mypy-0.790.tar.gz", hash = "sha256:2b21ba45ad9ef2e2eb88ce4aeadd0112d0f5026418324176fd494a6824b74975"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +numba = [ + {file = "numba-0.53.1-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:b23de6b6837c132087d06b8b92d343edb54b885873b824a037967fbd5272ebb7"}, + {file = "numba-0.53.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:6545b9e9b0c112b81de7f88a3c787469a357eeff8211e90b8f45ee243d521cc2"}, + {file = "numba-0.53.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:8fa5c963a43855050a868106a87cd614f3c3f459951c8fc468aec263ef80d063"}, + {file = "numba-0.53.1-cp36-cp36m-win32.whl", hash = "sha256:aaa6ebf56afb0b6752607b9f3bf39e99b0efe3c1fa6849698373925ee6838fd7"}, + {file = "numba-0.53.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b08b3df38aab769df79ed948d70f0a54a3cdda49d58af65369235c204ec5d0f3"}, + {file = "numba-0.53.1-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:bf5c463b62d013e3f709cc8277adf2f4f4d8cc6757293e29c6db121b77e6b760"}, + {file = "numba-0.53.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:74df02e73155f669e60dcff07c4eef4a03dbf5b388594db74142ab40914fe4f5"}, + {file = "numba-0.53.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:5165709bf62f28667e10b9afe6df0ce1037722adab92d620f59cb8bbb8104641"}, + {file = "numba-0.53.1-cp37-cp37m-win32.whl", hash = "sha256:2e96958ed2ca7e6d967b2ce29c8da0ca47117e1de28e7c30b2c8c57386506fa5"}, + {file = "numba-0.53.1-cp37-cp37m-win_amd64.whl", hash = "sha256:276f9d1674fe08d95872d81b97267c6b39dd830f05eb992608cbede50fcf48a9"}, + {file = "numba-0.53.1-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c4c8d102512ae472af52c76ad9522da718c392cb59f4cd6785d711fa5051a2a"}, + {file = "numba-0.53.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:691adbeac17dbdf6ed7c759e9e33a522351f07d2065fe926b264b6b2c15fd89b"}, + {file = "numba-0.53.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:94aab3e0e9e8754116325ce026e1b29ae72443c706a3104cf7f3368dc3012912"}, + {file = "numba-0.53.1-cp38-cp38-win32.whl", hash = "sha256:aabeec89bb3e3162136eea492cea7ee8882ddcda2201f05caecdece192c40896"}, + {file = "numba-0.53.1-cp38-cp38-win_amd64.whl", hash = "sha256:1895ebd256819ff22256cd6fe24aa8f7470b18acc73e7917e8e93c9ac7f565dc"}, + {file = "numba-0.53.1-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:224d197a46a9e602a16780d87636e199e2cdef528caef084a4d8fd8909c2455c"}, + {file = "numba-0.53.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:aba7acb247a09d7f12bd17a8e28bbb04e8adef9fc20ca29835d03b7894e1b49f"}, + {file = "numba-0.53.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:bd126f1f49da6fc4b3169cf1d96f1c3b3f84a7badd11fe22da344b923a00e744"}, + {file = "numba-0.53.1-cp39-cp39-win32.whl", hash = "sha256:0ef9d1f347b251282ae46e5a5033600aa2d0dfa1ee8c16cb8137b8cd6f79e221"}, + {file = "numba-0.53.1-cp39-cp39-win_amd64.whl", hash = "sha256:17146885cbe4e89c9d4abd4fcb8886dee06d4591943dc4343500c36ce2fcfa69"}, + {file = "numba-0.53.1.tar.gz", hash = "sha256:9cd4e5216acdc66c4e9dab2dfd22ddb5bef151185c070d4a3cd8e78638aff5b0"}, +] +numpy = [ + {file = "numpy-1.21.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:508b0b513fa1266875524ba8a9ecc27b02ad771fe1704a16314dc1a816a68737"}, + {file = "numpy-1.21.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:5dfe9d6a4c39b8b6edd7990091fea4f852888e41919d0e6722fe78dd421db0eb"}, + {file = "numpy-1.21.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a10968963640e75cc0193e1847616ab4c718e83b6938ae74dea44953950f6b7"}, + {file = "numpy-1.21.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49c6249260890e05b8111ebfc391ed58b3cb4b33e63197b2ec7f776e45330721"}, + {file = "numpy-1.21.3-cp310-cp310-win_amd64.whl", hash = "sha256:f8f4625536926a155b80ad2bbff44f8cc59e9f2ad14cdda7acf4c135b4dc8ff2"}, + {file = "numpy-1.21.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e54af82d68ef8255535a6cdb353f55d6b8cf418a83e2be3569243787a4f4866f"}, + {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f41b018f126aac18583956c54544db437f25c7ee4794bcb23eb38bef8e5e192a"}, + {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:50cd26b0cf6664cb3b3dd161ba0a09c9c1343db064e7c69f9f8b551f5104d654"}, + {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cc9b512e9fb590797474f58b7f6d1f1b654b3a94f4fa8558b48ca8b3cfc97cf"}, + {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:88a5d6b268e9ad18f3533e184744acdaa2e913b13148160b1152300c949bbb5f"}, + {file = "numpy-1.21.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c09418a14471c7ae69ba682e2428cae5b4420a766659605566c0fa6987f6b7e"}, + {file = "numpy-1.21.3-cp37-cp37m-win32.whl", hash = "sha256:90bec6a86b348b4559b6482e2b684db4a9a7eed1fa054b86115a48d58fbbf62a"}, + {file = "numpy-1.21.3-cp37-cp37m-win_amd64.whl", hash = "sha256:043e83bfc274649c82a6f09836943e4a4aebe5e33656271c7dbf9621dd58b8ec"}, + {file = "numpy-1.21.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:75621882d2230ab77fb6a03d4cbccd2038511491076e7964ef87306623aa5272"}, + {file = "numpy-1.21.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:188031f833bbb623637e66006cf75e933e00e7231f67e2b45cf8189612bb5dc3"}, + {file = "numpy-1.21.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:160ccc1bed3a8371bf0d760971f09bfe80a3e18646620e9ded0ad159d9749baa"}, + {file = "numpy-1.21.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:29fb3dcd0468b7715f8ce2c0c2d9bbbaf5ae686334951343a41bd8d155c6ea27"}, + {file = "numpy-1.21.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:32437f0b275c1d09d9c3add782516413e98cd7c09e6baf4715cbce781fc29912"}, + {file = "numpy-1.21.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e606e6316911471c8d9b4618e082635cfe98876007556e89ce03d52ff5e8fcf0"}, + {file = "numpy-1.21.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a99a6b067e5190ac6d12005a4d85aa6227c5606fa93211f86b1dafb16233e57d"}, + {file = "numpy-1.21.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:dde972a1e11bb7b702ed0e447953e7617723760f420decb97305e66fb4afc54f"}, + {file = "numpy-1.21.3-cp38-cp38-win32.whl", hash = "sha256:fe52dbe47d9deb69b05084abd4b0df7abb39a3c51957c09f635520abd49b29dd"}, + {file = "numpy-1.21.3-cp38-cp38-win_amd64.whl", hash = "sha256:75eb7cadc8da49302f5b659d40ba4f6d94d5045fbd9569c9d058e77b0514c9e4"}, + {file = "numpy-1.21.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2a6ee9620061b2a722749b391c0d80a0e2ae97290f1b32e28d5a362e21941ee4"}, + {file = "numpy-1.21.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c4193f70f8069550a1788bd0cd3268ab7d3a2b70583dfe3b2e7f421e9aace06"}, + {file = "numpy-1.21.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28f15209fb535dd4c504a7762d3bc440779b0e37d50ed810ced209e5cea60d96"}, + {file = "numpy-1.21.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c6c2d535a7beb1f8790aaa98fd089ceab2e3dd7ca48aca0af7dc60e6ef93ffe1"}, + {file = "numpy-1.21.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:bffa2eee3b87376cc6b31eee36d05349571c236d1de1175b804b348dc0941e3f"}, + {file = "numpy-1.21.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14e7519fab2a4ed87d31f99c31a3796e4e1fe63a86ebdd1c5a1ea78ebd5896"}, + {file = "numpy-1.21.3-cp39-cp39-win32.whl", hash = "sha256:dd0482f3fc547f1b1b5d6a8b8e08f63fdc250c58ce688dedd8851e6e26cff0f3"}, + {file = "numpy-1.21.3-cp39-cp39-win_amd64.whl", hash = "sha256:300321e3985c968e3ae7fbda187237b225f3ffe6528395a5b7a5407f73cf093e"}, + {file = "numpy-1.21.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98339aa9911853f131de11010f6dd94c8cec254d3d1f7261528c3b3e3219f139"}, + {file = "numpy-1.21.3.zip", hash = "sha256:63571bb7897a584ca3249c86dd01c10bcb5fe4296e3568b2e9c1a55356b6410e"}, +] +opencv-python = [ + {file = "opencv-python-4.5.4.58.tar.gz", hash = "sha256:48288428f407bacba5f73d460feb4a1ecafe87db3d7cfc0730a49fb32f589bbf"}, + {file = "opencv_python-4.5.4.58-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0eba0bfe62c48a02a5af3a0944e872c99f57f98653bed14d51c6991a58f9e1d1"}, + {file = "opencv_python-4.5.4.58-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:9bcca50c5444b5cfb01624666b69f91ba8f2d2bf4ef37b111697aafdeb81c99f"}, + {file = "opencv_python-4.5.4.58-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:8f7886acabaebf0361bd3dbccaa0d08e3f65ab13b7c739eb11e028f01ad13582"}, + {file = "opencv_python-4.5.4.58-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:d4b1d0b98ee72ba5dd720166790fc93ce459281e138ee79b0d41420b3da52b2e"}, + {file = "opencv_python-4.5.4.58-cp310-cp310-win32.whl", hash = "sha256:69a78e40a374ac14e4bf15a13dbb6c30fd2fbd5fcd3674d020a31b88861d5aaf"}, + {file = "opencv_python-4.5.4.58-cp310-cp310-win_amd64.whl", hash = "sha256:315c357522b6310ef7a0718d9f0c5d3110e59c19140705499a3c29bdd8c0124f"}, + {file = "opencv_python-4.5.4.58-cp36-cp36m-macosx_10_15_x86_64.whl", hash = "sha256:887a61097092dc0bf23fa24646dbc8cfeeb753649cb28a3782a93a6879e3b7d2"}, + {file = "opencv_python-4.5.4.58-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:22bcc3153a7d4f95aff79457eef81ef5e40ab1851b189e014412b5e9fbee2573"}, + {file = "opencv_python-4.5.4.58-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:92e9b2261ec764229c948d77fe0d922ee033348ca6519939b87861016c1614b3"}, + {file = "opencv_python-4.5.4.58-cp36-cp36m-win32.whl", hash = "sha256:0d6249a49122a78afc6685ddb1377a87e46414ae61c84535c4c6024397f1f3e8"}, + {file = "opencv_python-4.5.4.58-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa144013b597e4dcabc8d8230edfe810319de01b5609556d415a20e2b707547"}, + {file = "opencv_python-4.5.4.58-cp37-cp37m-macosx_10_15_x86_64.whl", hash = "sha256:26feeeb280de179f5dbb8976ebf7ceb836bd263973cb5daec8ca36e8ef7b5773"}, + {file = "opencv_python-4.5.4.58-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:4a13381bdfc0fb4b080efcc27c46561d0bd752f126226e9f19aa9cbcf6677f40"}, + {file = "opencv_python-4.5.4.58-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:ac852fcaac93439f2f7116ddffdc23fd366c872200ade2272446f9898180cecb"}, + {file = "opencv_python-4.5.4.58-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02872e0a9358526646d691f390143e9c21109c210095314abaa0641211cda077"}, + {file = "opencv_python-4.5.4.58-cp37-cp37m-win32.whl", hash = "sha256:6b87bab220d17e03eeedbcc6652d9d7e7bb09886dbd0f810310697a948b4c6fd"}, + {file = "opencv_python-4.5.4.58-cp37-cp37m-win_amd64.whl", hash = "sha256:a2a7f09b8843b85f3e1b02c5ea3ddc0cb9f5ad9698380109b37069ee8db7746d"}, + {file = "opencv_python-4.5.4.58-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:c44f5c51e92322ed832607204249c190764dec6cf29e8ba6d679b10326be1c1b"}, + {file = "opencv_python-4.5.4.58-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9b2c198af083a693d42a82bddc4d1f7e6bb02c64192ff7fac1fd1d43a8cf1be6"}, + {file = "opencv_python-4.5.4.58-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:637f4d3ad81bd27f273ede4c5fa6c26afb85c097c9715baf107cc270e37f5fea"}, + {file = "opencv_python-4.5.4.58-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:2fff48a641a74d1def31c1e88f9e5ce50ba4d0f87d085dfbf8bc844e12f6cd54"}, + {file = "opencv_python-4.5.4.58-cp38-cp38-win32.whl", hash = "sha256:8ddf4dcd8199209e33f21deb0c6d8ab62b21802816bba895fefc346b6d2e522d"}, + {file = "opencv_python-4.5.4.58-cp38-cp38-win_amd64.whl", hash = "sha256:085c5fcf5a6479c34aca3fd0f59055e704083d6a44009d6583c675ff1a5a0625"}, + {file = "opencv_python-4.5.4.58-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:4abe9c4fb6fe16daa9fcdd68b5357d3530431341aa655203f8e84f394e1fe6d4"}, + {file = "opencv_python-4.5.4.58-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4b614fbd81aeda53ce28e645aaee18fda7c7f2a48eb7f1a70a7c6c3427946342"}, + {file = "opencv_python-4.5.4.58-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:215bdf069847d4e3b0447a34e9eb4046dd4ca523d41fe4381c1c55f6704fd0dc"}, + {file = "opencv_python-4.5.4.58-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc34cdbfbab463750713118c8259a5d364547adab8ed91e94ba888349f33590a"}, + {file = "opencv_python-4.5.4.58-cp39-cp39-win32.whl", hash = "sha256:9998ce60884f3cda074f02b56d2b57ee6bd863e2ddba132da2b0af3b9487d584"}, + {file = "opencv_python-4.5.4.58-cp39-cp39-win_amd64.whl", hash = "sha256:5370a11757fbe94b176771269aff599f4da8676c2a672b13bcbca043f2e3eea8"}, +] +packaging = [ + {file = "packaging-21.0-py3-none-any.whl", hash = "sha256:c86254f9220d55e31cc94d69bade760f0847da8000def4dfe1c6b872fd14ff14"}, + {file = "packaging-21.0.tar.gz", hash = "sha256:7dc96269f53a4ccec5c0670940a4281106dd0bb343f47b7471f779df49c2fbe7"}, +] +pathspec = [ + {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, + {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, +] +pdoc3 = [ + {file = "pdoc3-0.9.2.tar.gz", hash = "sha256:9df5d931f25f353c69c46819a3bd03ef96dd286f2a70bb1b93a23a781f91faa1"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +py = [ + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pyparsing = [ + {file = "pyparsing-3.0.1-py3-none-any.whl", hash = "sha256:fd93fc45c47893c300bd98f5dd1b41c0e783eaeb727e7cea210dcc09d64ce7c3"}, + {file = "pyparsing-3.0.1.tar.gz", hash = "sha256:84196357aa3566d64ad123d7a3c67b0e597a115c4934b097580e5ce220b91531"}, +] +pyproj = [ + {file = "pyproj-3.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:ce554616880ab59110af9baa2948b4442d2961e20390df00cea49782b7c779fe"}, + {file = "pyproj-3.2.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:40ed2a66d93af811abac9fd2581685a2aade22a6753501f2f9760893ee6b0828"}, + {file = "pyproj-3.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8e6821a472f03e3604413b562536e05cb7926c3bd85bfc423c88c4909871f692"}, + {file = "pyproj-3.2.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a732342136fa57112de717109c2b853a4df3e4e2de56e42da7a2b61e67f0b29"}, + {file = "pyproj-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:b87eda8647d71f27ed81c43da9d8e0b841a403378b645e8dc1d015e9f5133ed1"}, + {file = "pyproj-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f2eb0ee7e4183c1c4e2f450cccff09734b59ff929619bad3a4df97a87e3a3d1f"}, + {file = "pyproj-3.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:76dd8a9dbd67a42e5ab8afe0e4a4167f0dfcd8f07e12541852c5289abf49e28f"}, + {file = "pyproj-3.2.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b73973908688a0845ebd78871ed2edcca35d1fad8e90983a416a49aadb350f28"}, + {file = "pyproj-3.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:00ec0cdd218cc8e7c823a9fe7c705b1e55926fe3a9460ef2048403757f9897ec"}, + {file = "pyproj-3.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7d7097b969c7a3f114fcce379021e59c843c1c7b1b9b3f1bb2aa65019793800"}, + {file = "pyproj-3.2.1-cp38-cp38-win32.whl", hash = "sha256:e61c34b1b5a6b8df2ecf5abdbf8dd69322001ebc1971d0897919e4004512c476"}, + {file = "pyproj-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:50d312cb7610f93f02f07b7da5b96469c52645717bebe6530ac7214cc69c068e"}, + {file = "pyproj-3.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:faadb5795e99321b5135263080348e184b927352c6331a06c2fcfe77a07ad215"}, + {file = "pyproj-3.2.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:d355ddf4cb29e77cb38e152354fb6ef6796d699d37e1a67a2427890ce2341162"}, + {file = "pyproj-3.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:28026ddf4d779e6bcbbd45954a0ca017348d819f27deb503e860be4eb88f5218"}, + {file = "pyproj-3.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5fb6283da84be5dc909f3f681490fd43de1b3694e9b5bed1ca7bc875130cb93"}, + {file = "pyproj-3.2.1-cp39-cp39-win32.whl", hash = "sha256:604e8041ee0a17eec0fac4e7e10b2f11f45ab49676a4f26eb63753ebb9ba38b0"}, + {file = "pyproj-3.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:8cf6f7c62a7c4144771a330381198e53bff782c0345af623b8989b1913acb919"}, + {file = "pyproj-3.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:19e6a7c6d31624b9971639036679fad35460045fd99c0c484899134b6bbf84cc"}, + {file = "pyproj-3.2.1.tar.gz", hash = "sha256:4a936093825ff55b24c1fc6cc093541fcf6d0f6d406589ed699e62048ebf3877"}, +] +pytest = [ + {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, + {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, +] +pytest-cov = [ + {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, + {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, +] +rasterio = [ + {file = "rasterio-1.2.9-cp39-cp39-win_amd64.whl", hash = "sha256:524bfb1ddae9394eb761721febdb9a85a458673146c66cc2c1f2a5cff678ae53"}, +] +regex = [ + {file = "regex-2021.10.23-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:45b65d6a275a478ac2cbd7fdbf7cc93c1982d613de4574b56fd6972ceadb8395"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74d071dbe4b53c602edd87a7476ab23015a991374ddb228d941929ad7c8c922e"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34d870f9f27f2161709054d73646fc9aca49480617a65533fc2b4611c518e455"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fb698037c35109d3c2e30f2beb499e5ebae6e4bb8ff2e60c50b9a805a716f79"}, + {file = "regex-2021.10.23-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb46b542133999580ffb691baf67410306833ee1e4f58ed06b6a7aaf4e046952"}, + {file = "regex-2021.10.23-cp310-cp310-win32.whl", hash = "sha256:5e9c9e0ce92f27cef79e28e877c6b6988c48b16942258f3bc55d39b5f911df4f"}, + {file = "regex-2021.10.23-cp310-cp310-win_amd64.whl", hash = "sha256:ab7c5684ff3538b67df3f93d66bd3369b749087871ae3786e70ef39e601345b0"}, + {file = "regex-2021.10.23-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de557502c3bec8e634246588a94e82f1ee1b9dfcfdc453267c4fb652ff531570"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ee684f139c91e69fe09b8e83d18b4d63bf87d9440c1eb2eeb52ee851883b1b29"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5095a411c8479e715784a0c9236568ae72509450ee2226b649083730f3fadfc6"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b568809dca44cb75c8ebb260844ea98252c8c88396f9d203f5094e50a70355f"}, + {file = "regex-2021.10.23-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:eb672217f7bd640411cfc69756ce721d00ae600814708d35c930930f18e8029f"}, + {file = "regex-2021.10.23-cp36-cp36m-win32.whl", hash = "sha256:a7a986c45d1099a5de766a15de7bee3840b1e0e1a344430926af08e5297cf666"}, + {file = "regex-2021.10.23-cp36-cp36m-win_amd64.whl", hash = "sha256:6d7722136c6ed75caf84e1788df36397efdc5dbadab95e59c2bba82d4d808a4c"}, + {file = "regex-2021.10.23-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f665677e46c5a4d288ece12fdedf4f4204a422bb28ff05f0e6b08b7447796d1"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:450dc27483548214314640c89a0f275dbc557968ed088da40bde7ef8fb52829e"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:129472cd06062fb13e7b4670a102951a3e655e9b91634432cfbdb7810af9d710"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a940ca7e7189d23da2bfbb38973832813eab6bd83f3bf89a977668c2f813deae"}, + {file = "regex-2021.10.23-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:530fc2bbb3dc1ebb17f70f7b234f90a1dd43b1b489ea38cea7be95fb21cdb5c7"}, + {file = "regex-2021.10.23-cp37-cp37m-win32.whl", hash = "sha256:ded0c4a3eee56b57fcb2315e40812b173cafe79d2f992d50015f4387445737fa"}, + {file = "regex-2021.10.23-cp37-cp37m-win_amd64.whl", hash = "sha256:391703a2abf8013d95bae39145d26b4e21531ab82e22f26cd3a181ee2644c234"}, + {file = "regex-2021.10.23-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be04739a27be55631069b348dda0c81d8ea9822b5da10b8019b789e42d1fe452"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13ec99df95003f56edcd307db44f06fbeb708c4ccdcf940478067dd62353181e"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8d1cdcda6bd16268316d5db1038965acf948f2a6f43acc2e0b1641ceab443623"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c186691a7995ef1db61205e00545bf161fb7b59cdb8c1201c89b333141c438a"}, + {file = "regex-2021.10.23-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2b20f544cbbeffe171911f6ce90388ad36fe3fad26b7c7a35d4762817e9ea69c"}, + {file = "regex-2021.10.23-cp38-cp38-win32.whl", hash = "sha256:c0938ddd60cc04e8f1faf7a14a166ac939aac703745bfcd8e8f20322a7373019"}, + {file = "regex-2021.10.23-cp38-cp38-win_amd64.whl", hash = "sha256:56f0c81c44638dfd0e2367df1a331b4ddf2e771366c4b9c5d9a473de75e3e1c7"}, + {file = "regex-2021.10.23-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80bb5d2e92b2258188e7dcae5b188c7bf868eafdf800ea6edd0fbfc029984a88"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1dae12321b31059a1a72aaa0e6ba30156fe7e633355e445451e4021b8e122b6"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1f2b59c28afc53973d22e7bc18428721ee8ca6079becf1b36571c42627321c65"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d134757a37d8640f3c0abb41f5e68b7cf66c644f54ef1cb0573b7ea1c63e1509"}, + {file = "regex-2021.10.23-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0dcc0e71118be8c69252c207630faf13ca5e1b8583d57012aae191e7d6d28b84"}, + {file = "regex-2021.10.23-cp39-cp39-win32.whl", hash = "sha256:a30513828180264294953cecd942202dfda64e85195ae36c265daf4052af0464"}, + {file = "regex-2021.10.23-cp39-cp39-win_amd64.whl", hash = "sha256:0f7552429dd39f70057ac5d0e897e5bfe211629652399a21671e53f2a9693a4e"}, + {file = "regex-2021.10.23.tar.gz", hash = "sha256:f3f9a91d3cc5e5b0ddf1043c0ae5fa4852f18a1c0050318baf5fc7930ecc1f9c"}, +] +shapely = [ + {file = "Shapely-1.8.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c5632cedea6d815b61eb4c264da1c3f24a8ce2ceba2f74e30fba340ca230563"}, + {file = "Shapely-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4ce1f18a0c9bb6b483c73bd7a0eb3a5e90676bcc29b9c27120236e662195c9d"}, + {file = "Shapely-1.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4e8cdffeec6d0c47ed1eb215ec4e80c024ac05be6ded982061c1e1188034f22f"}, + {file = "Shapely-1.8.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83d10f8b47a7568fc90063f72da62cda201dc92ecadf80cc00c015babc48e11f"}, + {file = "Shapely-1.8.0-cp36-cp36m-win32.whl", hash = "sha256:78b3a46dadd47c27e658d5e8d9006b4b1eb9b7ab947b450059225dcee799a18f"}, + {file = "Shapely-1.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0e640d6da59172d679270f0dfd88128b6ae7c57df864a030dd858ff924c307fc"}, + {file = "Shapely-1.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:68bdf463f7a609fbed42bbded18fa74c82a5741251984a5597d070060f4286f4"}, + {file = "Shapely-1.8.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:2c3cc87e66cbffd00ce0457c03969b64935752824bf43a1cd61f21cf606997d6"}, + {file = "Shapely-1.8.0-cp37-cp37m-win32.whl", hash = "sha256:bd84d993a0e8e07f5ebb4c67794d5392fdd23ce59a7ccc121900f2080f57989a"}, + {file = "Shapely-1.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:796b15a483ac37c2dc757654186d0e064a42fb6f43cb9d1ff65d81cd0c92a84e"}, + {file = "Shapely-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:622f62d2b2da81dd40841a56db0f78bcf9f9af7a83c7d5f5dc9bcb234aa650ba"}, + {file = "Shapely-1.8.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26b43b69dfeb8a8cb27aacf5597134baf12337845c2bacb01809540c20d3d904"}, + {file = "Shapely-1.8.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cfb9d72d255af1a484e3859f4c9bb737950faf1d16c21d2b949ffc4ba5f46147"}, + {file = "Shapely-1.8.0-cp38-cp38-win32.whl", hash = "sha256:f304243b1f4d7bca9b3c9fdeec6565171e1b611fb4a3d6c93efc870c8a75958c"}, + {file = "Shapely-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:8917a91430126165cfa4bc2b4cf168121e37ff0c8657134e7398c597ca1fe934"}, + {file = "Shapely-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:19b54cd840883fd71cce98fd94916d1731eed8a32c115eb082b3ed24e631be02"}, + {file = "Shapely-1.8.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:13cbb959863cec32d48e2cffdc4bb81828bc3b0fa4256c9b2b32edac5021a0e4"}, + {file = "Shapely-1.8.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7e1aebf4f1b2fbef40152fd531216387fcf6fe4ff2d777268381979b63c7c779"}, + {file = "Shapely-1.8.0-cp39-cp39-win32.whl", hash = "sha256:83145eda2e582c2046d1ecc6a0d7dbfe97f492434311124f65ea60f4e87a6b65"}, + {file = "Shapely-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:9b54ebd8fa4b78320f6d87032fe91363c7c1bf0f8d4a30eb93bca6413f787fd5"}, + {file = "Shapely-1.8.0.tar.gz", hash = "sha256:f5307ee14ba4199f8bbcf6532ca33064661c1433960c432c84f0daa73b47ef9c"}, +] +six = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snuggs = [ + {file = "snuggs-1.4.7-py3-none-any.whl", hash = "sha256:988dde5d4db88e9d71c99457404773dabcc7a1c45971bfbe81900999942d9f07"}, + {file = "snuggs-1.4.7.tar.gz", hash = "sha256:501cf113fe3892e14e2fee76da5cd0606b7e149c411c271898e6259ebde2617b"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +tqdm = [ + {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"}, + {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"}, +] +typed-ast = [ + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, +] +typing-extensions = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] +wcwidth = [ + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, +] +zipp = [ + {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, + {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, +] diff --git a/pyproject.toml b/pyproject.toml index b61ced3..81bdad9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,56 +1,56 @@ -[tool.poetry] -name = "geosardine" -version = "0.13.1" -license = "BSD-3-Clause" -description = "Spatial operations extend fiona and rasterio" -authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"] -homepage = "https://github.com/sahitono/geosardine" -repository = "https://github.com/sahitono/geosardine" -readme = "README.md" -include = ["CHANGELOG.md"] -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Programming Language :: Python :: 3", - "Intended Audience :: Science/Research", - "Topic :: Scientific/Engineering :: GIS", - "License :: OSI Approved :: BSD License", - "Typing :: Typed", -] - -[tool.poetry.dependencies] -python = ">=3.7,<3.10" -numpy = ">=1.18" -affine = "^2.3.0" -shapely = ">=1.6.4,<2.0.0" -tqdm = ">=4.48.2,<5.0.0" -numba = ">=0.51.2" -click = "^7.1.2" -gdal = ">=3.0.4" -fiona = ">=1.8.13" -rasterio = ">=1.1.2" -opencv-python = ">=4.4.0,<=5.0.0" -pyproj = ">=2.6.1" -# pyproj = { path="../../../.pypkg/pyproj-3.1.0-cp38-cp38-win_amd64.whl" } - -[tool.poetry.dev-dependencies] -# gdal = { path="../../../.pypkg/GDAL-3.3.0-cp38-cp38-win_amd64.whl" } -# fiona = { path="../../../.pypkg/Fiona-1.8.20-cp38-cp38-win_amd64.whl" } -# rasterio = { path="../../../.pypkg/rasterio-1.2.6-cp38-cp38-win_amd64.whl" } -pip = ">=20.0.0" -pytest = "^5.2" -black = "^20.8b1" -isort = "^5.5.3" -coverage = "^5.3" -pytest-cov = "^2.10.1" -mypy = "^0.790" -pdoc3 = "^0.9.2" - -[tool.poetry.scripts] -dine = 'geosardine.__main__:main' - -[tool.pytest.ini_options] -filterwarnings = ["error::UserWarning"] - -[build-system] -requires = ["poetry>=1.0.3", "pip>=20.0.0"] -build-backend = "poetry.masonry.api" +[tool.poetry] +name = "geosardine" +version = "0.13.1" +license = "BSD-3-Clause" +description = "Spatial operations extend fiona and rasterio" +authors = ["Sahit Tuntas Sadono <26474008+sahitono@users.noreply.github.com>"] +homepage = "https://github.com/sahitono/geosardine" +repository = "https://github.com/sahitono/geosardine" +readme = "README.md" +include = ["CHANGELOG.md"] +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Programming Language :: Python :: 3", + "Intended Audience :: Science/Research", + "Topic :: Scientific/Engineering :: GIS", + "License :: OSI Approved :: BSD License", + "Typing :: Typed", +] + +[tool.poetry.dependencies] +python = ">=3.7,<3.10" +numpy = ">=1.18" +affine = "^2.3.0" +shapely = ">=1.6.4,<2.0.0" +tqdm = ">=4.48.2,<5.0.0" +numba = ">=0.51.2" +click = "^7.1.2" +gdal = ">=3.0.4" +fiona = ">=1.8.13" +rasterio = ">=1.1.2" +opencv-python = ">=4.4.0,<=5.0.0" +pyproj = ">=2.6.1" +# pyproj = { path="../../../.pypkg/pyproj-3.1.0-cp38-cp38-win_amd64.whl" } + +[tool.poetry.dev-dependencies] +gdal = { path="../../../.pypkg/GDAL-3.3.2-cp39-cp39-win_amd64.whl", develop=true } +fiona = { path="../../../.pypkg/Fiona-1.8.20-cp39-cp39-win_amd64.whl", develop=true } +rasterio = { path="../../../.pypkg/rasterio-1.2.9-cp39-cp39-win_amd64.whl", develop=true } +pip = ">=20.0.0" +pytest = "^5.2" +black = "^20.8b1" +isort = "^5.5.3" +coverage = "^5.3" +pytest-cov = "^2.10.1" +mypy = "^0.790" +pdoc3 = "^0.9.2" + +[tool.poetry.scripts] +dine = 'geosardine.__main__:main' + +[tool.pytest.ini_options] +filterwarnings = ["error::UserWarning"] + +[build-system] +requires = ["poetry>=1.0.3", "pip>=20.0.0"] +build-backend = "poetry.masonry.api" diff --git a/tests/idw/test_idw_file_8327.geojson b/tests/idw/test_idw_file_8327.geojson index 8c2d166..0c14f3a 100644 --- a/tests/idw/test_idw_file_8327.geojson +++ b/tests/idw/test_idw_file_8327.geojson @@ -1,12 +1,12 @@ -{ -"type": "FeatureCollection", -"name": "test_idw_file_8327", -"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::8327" } }, -"features": [ -{ "type": "Feature", "properties": { "week1": 132.0 }, "geometry": { "type": "Point", "coordinates": [ -12640945.517973877489567, 7544888.72555083874613 ] } }, -{ "type": "Feature", "properties": { "week1": 127.0 }, "geometry": { "type": "Point", "coordinates": [ -12657914.629812294617295, 7585525.831693620420992 ] } }, -{ "type": "Feature", "properties": { "week1": 37.0 }, "geometry": { "type": "Point", "coordinates": [ -12610826.411705931648612, 7554815.991225138306618 ] } }, -{ "type": "Feature", "properties": { "week1": 90.0 }, "geometry": { "type": "Point", "coordinates": [ -12662277.310977136716247, 7525923.692236887291074 ] } }, -{ "type": "Feature", "properties": { "week1": 182.0 }, "geometry": { "type": "Point", "coordinates": [ -12641908.127680582925677, 7551465.73191989492625 ] } } -] -} +{ +"type": "FeatureCollection", +"name": "test_idw_file_8327", +"crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:EPSG::8327" } }, +"features": [ +{ "type": "Feature", "properties": { "week1": 132.0 }, "geometry": { "type": "Point", "coordinates": [ -12640945.517973877489567, 7544888.72555083874613 ] } }, +{ "type": "Feature", "properties": { "week1": 127.0 }, "geometry": { "type": "Point", "coordinates": [ -12657914.629812294617295, 7585525.831693620420992 ] } }, +{ "type": "Feature", "properties": { "week1": 37.0 }, "geometry": { "type": "Point", "coordinates": [ -12610826.411705931648612, 7554815.991225138306618 ] } }, +{ "type": "Feature", "properties": { "week1": 90.0 }, "geometry": { "type": "Point", "coordinates": [ -12662277.310977136716247, 7525923.692236887291074 ] } }, +{ "type": "Feature", "properties": { "week1": 182.0 }, "geometry": { "type": "Point", "coordinates": [ -12641908.127680582925677, 7551465.73191989492625 ] } } +] +} diff --git a/tests/test_geosardine_interpolate.py b/tests/test_geosardine_interpolate.py index eab3608..b2e134f 100644 --- a/tests/test_geosardine_interpolate.py +++ b/tests/test_geosardine_interpolate.py @@ -1,52 +1,52 @@ -import os - -import numpy as np -import pytest -from geosardine import interpolate -from geosardine._utility import calc_extent - - -def test_idw(): - xy = np.load("tests/idw/test_idw_xy.npy") - - values = np.load("tests/idw/test_idw_val.npy") - - # assert ( - # np.load("tests/idw/test_idw_array.npy") - # == interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array - # ).all() - - assert ( - interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array - is not None - ) - - with pytest.warns(UserWarning): - interp = interpolate.idw("tests/idw/test_idw_file.geojson", (0.01, 0.01)) - # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all() - assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2 - assert interp.save("tes.tif") is None - os.remove("tes.tif") - - with pytest.warns(UserWarning): - interp = interpolate.idw("tests/idw/test_idw_file_8327.geojson", (10000, 10000)) - # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all() - assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2 - assert interp.save("tes.tif") is None - os.remove("tes.tif") - - assert interpolate.idw(1, np.array([0, 1]), (0.1, 0.1)) is None - assert interpolate.idw_single([101, -7], xy, values) == 113.8992997794633 - - assert ( - round( - interpolate.idw_single( - [860209.0, 9295740.0], - np.array([[767984.0, 9261620.0], [838926.0, 9234594.0]]), - np.array([[101.1, 102.2]]), - epsg=32748, - ), - 8, - ) - == round(101.86735169471324, 8) - ) +import os + +import numpy as np +import pytest +from geosardine import interpolate +from geosardine._utility import calc_extent + + +def test_idw(): + xy = np.load("tests/idw/test_idw_xy.npy") + + values = np.load("tests/idw/test_idw_val.npy") + + # assert ( + # np.load("tests/idw/test_idw_array.npy") + # == interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array + # ).all() + + assert ( + interpolate.idw(xy, values, (0.01, 0.01), extent=calc_extent(xy)).array + is not None + ) + + with pytest.warns(UserWarning): + interp = interpolate.idw("tests/idw/test_idw_file.geojson", (0.01, 0.01)) + # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all() + assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2 + assert interp.save("tes.tif") is None + os.remove("tes.tif") + + with pytest.warns(UserWarning): + interp = interpolate.idw("tests/idw/test_idw_file_8327.geojson", (10000, 10000)) + # assert (np.load("tests/idw/test_idw_file_array.npy") == interp.array).all() + assert type(interp.array) == np.ndarray and len(interp.array.shape) == 2 + assert interp.save("tes.tif") is None + os.remove("tes.tif") + + assert interpolate.idw(1, np.array([0, 1]), (0.1, 0.1)) is None + assert interpolate.idw_single([101, -7], xy, values) == 113.8992997794633 + + assert ( + round( + interpolate.idw_single( + [860209.0, 9295740.0], + np.array([[767984.0, 9261620.0], [838926.0, 9234594.0]]), + np.array([[101.1, 102.2]]), + epsg=32748, + ), + 8, + ) + == round(101.86735169471324, 8) + ) diff --git a/tests/test_geosardine_raster.py b/tests/test_geosardine_raster.py index 0838b8b..634273e 100644 --- a/tests/test_geosardine_raster.py +++ b/tests/test_geosardine_raster.py @@ -1,45 +1,45 @@ -import numpy as np -from geosardine import Raster - - -def test_raster() -> None: - raster = Raster(np.arange(32).reshape(4, 4, 2), 0.3, 120, 20) - - assert (raster.array == np.arange(32).reshape(4, 4, 2)).all() - assert raster.resolution == (0.3, 0.3) - assert raster.x_max == 120 + (0.3 * 4) - assert raster.y_min == 20 - (0.3 * 4) - assert isinstance(raster[1:3, 1:3], np.ndarray) - assert raster[1:3, 1:3].shape == (2, 2, 2) - - -def test_raster_operator() -> None: - raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.3, 120, 0.7) - arr = np.ones(32, dtype=np.float32).reshape(4, 4, 2) - assert ((raster * 2).array == arr * 2).all() - assert ((raster + 2).array == arr + 2).all() - assert ((raster - 2).array == arr - 2).all() - assert ((raster / 2).array == arr / 2).all() - assert ((raster ** 2).array == arr ** 2).all() - - -def test_raster_manipulation() -> None: - raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.4, 120, 0.7) - resized = raster.resize(16, 16) - resampled = raster.resample((0.1, 0.1)) - - assert ( - resized.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2) - ).all() - assert (round(resized.resolution[0], 2), round(resized.resolution[1], 2)) == ( - 0.1, - 0.1, - ) - assert ( - resampled.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2) - ).all() - assert resampled.rows == 16 - assert resampled.cols == 16 - assert resampled.layers == 2 - assert raster.transform[5] == resampled.transform[5] - assert raster.transform[2] == resampled.transform[2] +import numpy as np +from geosardine import Raster + + +def test_raster() -> None: + raster = Raster(np.arange(32).reshape(4, 4, 2), 0.3, 120, 20) + + assert (raster.array == np.arange(32).reshape(4, 4, 2)).all() + assert raster.resolution == (0.3, -0.3) + assert raster.x_max == 120 + (0.3 * 4) + assert raster.y_min == 20 - (0.3 * 4) + assert isinstance(raster[1:3, 1:3], np.ndarray) + assert raster[1:3, 1:3].shape == (2, 2, 2) + + +def test_raster_operator() -> None: + raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.3, 120, 0.7) + arr = np.ones(32, dtype=np.float32).reshape(4, 4, 2) + assert ((raster * 2).array == arr * 2).all() + assert ((raster + 2).array == arr + 2).all() + assert ((raster - 2).array == arr - 2).all() + assert ((raster / 2).array == arr / 2).all() + assert ((raster ** 2).array == arr ** 2).all() + + +def test_raster_manipulation() -> None: + raster = Raster(np.ones(32, dtype=np.float32).reshape(4, 4, 2), 0.4, 120, 0.7) + resized = raster.resize(16, 16) + resampled = raster.resample((0.1, 0.1)) + + assert ( + resized.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2) + ).all() + assert (round(resized.resolution[0], 2), round(resized.resolution[1], 2)) == ( + 0.1, + -0.1, + ) + assert ( + resampled.array == np.ones(16 * 16 * 2, dtype=np.float32).reshape(16, 16, 2) + ).all() + assert resampled.rows == 16 + assert resampled.cols == 16 + assert resampled.layers == 2 + assert raster.transform[5] == resampled.transform[5] + assert raster.transform[2] == resampled.transform[2]