Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
- symmetric_difference
- intersection
- union
Parameters
----------
op: string
right: GeometryArray or single shapely BaseGeoemtry
"""
if isinstance(right, BaseGeometry):
# intersection can return empty GeometryCollections, and if the
# result are only those, numpy will coerce it to empty 2D array
data = np.empty(len(left), dtype=object)
data[:] = [getattr(s, op)(right) if s and right else None for s in left.data]
return GeometryArray(data)
elif isinstance(right, GeometryArray):
if len(left) != len(right):
msg = "Lengths of inputs do not match. Left: {0}, Right: {1}".format(
len(left), len(right)
)
raise ValueError(msg)
data = np.empty(len(left), dtype=object)
data[:] = [
getattr(this_elem, op)(other_elem) if this_elem and other_elem else None
for this_elem, other_elem in zip(left.data, right.data)
]
return GeometryArray(data)
else:
raise TypeError("Type not known: {0} vs {1}".format(type(left), type(right)))
for idx in range(n):
geom = data[idx]
if isinstance(geom, BaseGeometry):
out.append(geom)
elif hasattr(geom, "__geo_interface__"):
geom = shapely.geometry.asShape(geom)
out.append(geom)
elif _isna(geom):
out.append(None)
else:
raise TypeError("Input must be valid geometry objects: {0}".format(geom))
aout = np.empty(n, dtype=object)
aout[:] = out
return GeometryArray(aout)
# type: (str, GeometryArray, ...) -> GeometryArray
# not all shapely.affinity methods can handle empty geometries:
# affine_transform itself works (as well as translate), but rotate, scale
# and skew fail (they try to unpack the bounds).
# Here: consistently returning empty geom for input empty geom
out = []
for geom in left.data:
if geom is None or geom.is_empty:
res = geom
else:
res = getattr(shapely.affinity, op)(geom, *args, **kwargs)
out.append(res)
data = np.empty(len(left), dtype=object)
data[:] = out
return GeometryArray(data)
def _concat_same_type(cls, to_concat):
"""
Concatenate multiple array
Parameters
----------
to_concat : sequence of this type
Returns
-------
ExtensionArray
"""
data = np.concatenate([ga.data for ga in to_concat])
return GeometryArray(data)
def _delegate_binary_method(op, this, other, *args, **kwargs):
# type: (str, GeoSeries, GeoSeries) -> GeoSeries/Series
this = this.geometry
if isinstance(other, GeoPandasBase):
this, other = this.align(other.geometry)
# TODO reenable for all operations once we use pyproj > 2
# if this.crs != other.crs:
# warn('GeoSeries crs mismatch: {0} and {1}'.format(this.crs,
# other.crs))
a_this = GeometryArray(this.values)
other = GeometryArray(other.values)
elif isinstance(other, BaseGeometry):
a_this = GeometryArray(this.values)
else:
raise TypeError(type(this), type(other))
data = getattr(a_this, op)(other, *args, **kwargs)
return data, this.index
# result are only those, numpy will coerce it to empty 2D array
data = np.empty(len(left), dtype=object)
data[:] = [getattr(s, op)(right) if s and right else None for s in left.data]
return GeometryArray(data)
elif isinstance(right, GeometryArray):
if len(left) != len(right):
msg = "Lengths of inputs do not match. Left: {0}, Right: {1}".format(
len(left), len(right)
)
raise ValueError(msg)
data = np.empty(len(left), dtype=object)
data[:] = [
getattr(this_elem, op)(other_elem) if this_elem and other_elem else None
for this_elem, other_elem in zip(left.data, right.data)
]
return GeometryArray(data)
else:
raise TypeError("Type not known: {0} vs {1}".format(type(left), type(right)))
def copy(self, *args, **kwargs):
# still taking args/kwargs for compat with pandas 0.24
return GeometryArray(self.data.copy())
n = len(data)
out = []
for idx in range(n):
geom = data[idx]
if geom is not None and len(geom):
geom = shapely.wkb.loads(geom)
else:
geom = None
out.append(geom)
aout = np.empty(n, dtype=object)
aout[:] = out
return GeometryArray(aout)
def total_bounds(self):
"""Returns a tuple containing ``minx``, ``miny``, ``maxx``, ``maxy``
values for the bounds of the series as a whole.
See ``GeoSeries.bounds`` for the bounds of the geometries contained in
the series.
"""
return GeometryArray(self.geometry.values).total_bounds