venv
This commit is contained in:
@@ -1,15 +1,11 @@
|
||||
import contextlib
|
||||
from packaging.version import Version
|
||||
import importlib
|
||||
import os
|
||||
import warnings
|
||||
from packaging.version import Version
|
||||
|
||||
import numpy as np
|
||||
import pandas as pd
|
||||
|
||||
import shapely
|
||||
import shapely.geos
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# pandas compat
|
||||
# -----------------------------------------------------------------------------
|
||||
@@ -17,182 +13,20 @@ import shapely.geos
|
||||
PANDAS_GE_14 = Version(pd.__version__) >= Version("1.4.0rc0")
|
||||
PANDAS_GE_15 = Version(pd.__version__) >= Version("1.5.0")
|
||||
PANDAS_GE_20 = Version(pd.__version__) >= Version("2.0.0")
|
||||
PANDAS_GE_202 = Version(pd.__version__) >= Version("2.0.2")
|
||||
PANDAS_GE_21 = Version(pd.__version__) >= Version("2.1.0")
|
||||
PANDAS_GE_22 = Version(pd.__version__) >= Version("2.2.0.dev0")
|
||||
PANDAS_GE_22 = Version(pd.__version__) >= Version("2.2.0")
|
||||
PANDAS_GE_30 = Version(pd.__version__) >= Version("3.0.0.dev0")
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# Shapely / PyGEOS compat
|
||||
# Shapely / GEOS compat
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
|
||||
SHAPELY_GE_182 = Version(shapely.__version__) >= Version("1.8.2")
|
||||
SHAPELY_GE_20 = Version(shapely.__version__) >= Version("2.0.0.dev0")
|
||||
SHAPELY_G_20a1 = Version(shapely.__version__) > Version("2.0a1")
|
||||
SHAPELY_GE_204 = Version(shapely.__version__) >= Version("2.0.4")
|
||||
|
||||
GEOS_GE_390 = shapely.geos.geos_version >= (3, 9, 0)
|
||||
|
||||
|
||||
HAS_PYGEOS = None
|
||||
USE_PYGEOS = None
|
||||
USE_SHAPELY_20 = None
|
||||
PYGEOS_SHAPELY_COMPAT = None
|
||||
|
||||
PYGEOS_GE_09 = None
|
||||
PYGEOS_GE_010 = None
|
||||
|
||||
INSTALL_PYGEOS_ERROR = "To use PyGEOS within GeoPandas, you need to install PyGEOS: \
|
||||
'conda install pygeos' or 'pip install pygeos'"
|
||||
|
||||
try:
|
||||
import pygeos
|
||||
|
||||
# only automatically use pygeos if version is high enough
|
||||
if Version(pygeos.__version__) >= Version("0.8"):
|
||||
HAS_PYGEOS = True
|
||||
PYGEOS_GE_09 = Version(pygeos.__version__) >= Version("0.9")
|
||||
PYGEOS_GE_010 = Version(pygeos.__version__) >= Version("0.10")
|
||||
else:
|
||||
warnings.warn(
|
||||
"The installed version of PyGEOS is too old ({0} installed, 0.8 required),"
|
||||
" and thus GeoPandas will not use PyGEOS.".format(pygeos.__version__),
|
||||
UserWarning,
|
||||
stacklevel=2,
|
||||
)
|
||||
HAS_PYGEOS = False
|
||||
except ImportError:
|
||||
HAS_PYGEOS = False
|
||||
|
||||
|
||||
def set_use_pygeos(val=None):
|
||||
"""
|
||||
Set the global configuration on whether to use PyGEOS or not.
|
||||
|
||||
The default is use PyGEOS if it is installed. This can be overridden
|
||||
with an environment variable USE_PYGEOS (this is only checked at
|
||||
first import, cannot be changed during interactive session).
|
||||
|
||||
Alternatively, pass a value here to force a True/False value.
|
||||
"""
|
||||
global USE_PYGEOS
|
||||
global USE_SHAPELY_20
|
||||
global PYGEOS_SHAPELY_COMPAT
|
||||
|
||||
env_use_pygeos = os.getenv("USE_PYGEOS", None)
|
||||
|
||||
if val is not None:
|
||||
USE_PYGEOS = bool(val)
|
||||
else:
|
||||
if USE_PYGEOS is None:
|
||||
if SHAPELY_GE_20:
|
||||
USE_PYGEOS = False
|
||||
else:
|
||||
USE_PYGEOS = HAS_PYGEOS
|
||||
|
||||
if env_use_pygeos is not None:
|
||||
USE_PYGEOS = bool(int(env_use_pygeos))
|
||||
|
||||
# validate the pygeos version
|
||||
if USE_PYGEOS:
|
||||
try:
|
||||
import pygeos
|
||||
|
||||
# validate the pygeos version
|
||||
if not Version(pygeos.__version__) >= Version("0.8"):
|
||||
if SHAPELY_GE_20:
|
||||
USE_PYGEOS = False
|
||||
warnings.warn(
|
||||
"The PyGEOS version is too old, and Shapely >= 2 is installed, "
|
||||
"thus using Shapely by default and not PyGEOS.",
|
||||
stacklevel=2,
|
||||
)
|
||||
else:
|
||||
raise ImportError(
|
||||
"PyGEOS >= 0.8 is required, version {0} is installed".format(
|
||||
pygeos.__version__
|
||||
)
|
||||
)
|
||||
|
||||
# Check whether Shapely and PyGEOS use the same GEOS version.
|
||||
# Based on PyGEOS from_shapely implementation.
|
||||
|
||||
from shapely.geos import geos_version_string as shapely_geos_version
|
||||
from pygeos import geos_capi_version_string
|
||||
|
||||
# shapely has something like: "3.6.2-CAPI-1.10.2 4d2925d6"
|
||||
# pygeos has something like: "3.6.2-CAPI-1.10.2"
|
||||
if not shapely_geos_version.startswith(geos_capi_version_string):
|
||||
warnings.warn(
|
||||
"The Shapely GEOS version ({}) is incompatible with the GEOS "
|
||||
"version PyGEOS was compiled with ({}). Conversions between both "
|
||||
"will be slow.".format(
|
||||
shapely_geos_version, geos_capi_version_string
|
||||
),
|
||||
stacklevel=2,
|
||||
)
|
||||
PYGEOS_SHAPELY_COMPAT = False
|
||||
else:
|
||||
PYGEOS_SHAPELY_COMPAT = True
|
||||
|
||||
except ImportError:
|
||||
raise ImportError(INSTALL_PYGEOS_ERROR)
|
||||
|
||||
if USE_PYGEOS:
|
||||
warnings.warn(
|
||||
"GeoPandas is set to use PyGEOS over Shapely. PyGEOS support is deprecated"
|
||||
"and will be removed in GeoPandas 1.0, released in the Q1 of 2024. "
|
||||
"Please migrate to Shapely 2.0 "
|
||||
"(https://geopandas.org/en/stable/docs/user_guide/pygeos_to_shapely.html).",
|
||||
DeprecationWarning,
|
||||
stacklevel=6,
|
||||
)
|
||||
|
||||
USE_SHAPELY_20 = (not USE_PYGEOS) and SHAPELY_GE_20
|
||||
|
||||
|
||||
set_use_pygeos()
|
||||
|
||||
|
||||
# compat related to deprecation warnings introduced in Shapely 1.8
|
||||
# -> creating a numpy array from a list-like of Multi-part geometries,
|
||||
# although doing the correct thing (not expanding in its parts), still raises
|
||||
# the warning about iteration being deprecated
|
||||
# This adds a context manager to explicitly ignore this warning
|
||||
|
||||
|
||||
try:
|
||||
from shapely.errors import ShapelyDeprecationWarning as shapely_warning
|
||||
except ImportError:
|
||||
shapely_warning = None
|
||||
|
||||
|
||||
if shapely_warning is not None and not SHAPELY_GE_20:
|
||||
|
||||
@contextlib.contextmanager
|
||||
def ignore_shapely2_warnings():
|
||||
with warnings.catch_warnings():
|
||||
warnings.filterwarnings(
|
||||
"ignore", "Iteration|The array interface|__len__", shapely_warning
|
||||
)
|
||||
yield
|
||||
|
||||
elif (Version(np.__version__) >= Version("1.21")) and not SHAPELY_GE_20:
|
||||
|
||||
@contextlib.contextmanager
|
||||
def ignore_shapely2_warnings():
|
||||
with warnings.catch_warnings():
|
||||
# warning from numpy for existing Shapely releases (this is fixed
|
||||
# with Shapely 1.8)
|
||||
warnings.filterwarnings(
|
||||
"ignore", "An exception was ignored while fetching", DeprecationWarning
|
||||
)
|
||||
yield
|
||||
|
||||
else:
|
||||
|
||||
@contextlib.contextmanager
|
||||
def ignore_shapely2_warnings():
|
||||
yield
|
||||
GEOS_GE_310 = shapely.geos.geos_version >= (3, 10, 0)
|
||||
|
||||
|
||||
def import_optional_dependency(name: str, extra: str = ""):
|
||||
@@ -232,20 +66,27 @@ def import_optional_dependency(name: str, extra: str = ""):
|
||||
return module
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# RTree compat
|
||||
# -----------------------------------------------------------------------------
|
||||
|
||||
HAS_RTREE = None
|
||||
RTREE_GE_094 = False
|
||||
try:
|
||||
import rtree # noqa: F401
|
||||
|
||||
HAS_RTREE = True
|
||||
except ImportError:
|
||||
HAS_RTREE = False
|
||||
|
||||
|
||||
# -----------------------------------------------------------------------------
|
||||
# pyproj compat
|
||||
# -----------------------------------------------------------------------------
|
||||
try:
|
||||
import pyproj # noqa: F401
|
||||
|
||||
HAS_PYPROJ = True
|
||||
|
||||
except ImportError as err:
|
||||
HAS_PYPROJ = False
|
||||
pyproj_import_error = str(err)
|
||||
|
||||
|
||||
def requires_pyproj(func):
|
||||
def wrapper(*args, **kwargs):
|
||||
if not HAS_PYPROJ:
|
||||
raise ImportError(
|
||||
f"The 'pyproj' package is required for {func.__name__} to work. "
|
||||
"Install it and initialize the object with a CRS before using it."
|
||||
f"\nImporting pyproj resulted in: {pyproj_import_error}"
|
||||
)
|
||||
return func(*args, **kwargs)
|
||||
|
||||
return wrapper
|
||||
|
||||
Reference in New Issue
Block a user