Files
aws-lambda-container/billinglayer/python/shapely/vectorized/__init__.py
2023-08-24 17:49:47 -05:00

76 lines
2.2 KiB
Python

"""Provides multi-point element-wise operations such as ``contains``."""
import numpy as np
import shapely
from shapely.prepared import PreparedGeometry
def _construct_points(x, y):
x, y = np.asanyarray(x), np.asanyarray(y)
if x.shape != y.shape:
raise ValueError("X and Y shapes must be equivalent.")
if x.dtype != np.float64:
x = x.astype(np.float64)
if y.dtype != np.float64:
y = y.astype(np.float64)
return shapely.points(x, y)
def contains(geometry, x, y):
"""
Vectorized (element-wise) version of `contains` which checks whether
multiple points are contained by a single geometry.
Parameters
----------
geometry : PreparedGeometry or subclass of BaseGeometry
The geometry which is to be checked to see whether each point is
contained within. The geometry will be "prepared" if it is not already
a PreparedGeometry instance.
x : array
The x coordinates of the points to check.
y : array
The y coordinates of the points to check.
Returns
-------
Mask of points contained by the given `geometry`.
"""
if isinstance(geometry, PreparedGeometry):
geometry = geometry.context
shapely.prepare(geometry)
return shapely.contains_xy(geometry, x, y)
def touches(geometry, x, y):
"""
Vectorized (element-wise) version of `touches` which checks whether
multiple points touch the exterior of a single geometry.
Parameters
----------
geometry : PreparedGeometry or subclass of BaseGeometry
The geometry which is to be checked to see whether each point is
contained within. The geometry will be "prepared" if it is not already
a PreparedGeometry instance.
x : array
The x coordinates of the points to check.
y : array
The y coordinates of the points to check.
Returns
-------
Mask of points which touch the exterior of the given `geometry`.
"""
if isinstance(geometry, PreparedGeometry):
geometry = geometry.context
# Touches(geom, point) == Intersects(Boundary(geom), point)
boundary = geometry.boundary
shapely.prepare(boundary)
return shapely.intersects_xy(boundary, x, y)