def __new__(cls, data=None, index=None, crs=None, **kwargs): # we need to use __new__ because we want to return Series instance # instead of GeoSeries instance in case of non-geometry data if hasattr(data, "crs") and crs: if not data.crs: # make a copy to avoid setting CRS to passed GeometryArray data = data.copy() else: if not data.crs == crs: warnings.warn( "CRS mismatch between CRS of the passed geometries " "and 'crs'. Use 'GeoDataFrame.set_crs(crs, " "allow_override=True)' to overwrite CRS or " "'GeoSeries.to_crs(crs)' to reproject geometries. " "CRS mismatch will raise an error in the future versions " "of GeoPandas.", FutureWarning, stacklevel=2, ) # TODO: raise error in 0.9 or 0.10. if isinstance(data, SingleBlockManager): if isinstance(data.blocks[0].dtype, GeometryDtype): if data.blocks[0].ndim == 2: # bug in pandas 0.23 where in certain indexing operations # (such as .loc) a 2D ExtensionBlock (still with 1D values # is created) which results in other failures # bug in pandas <= 0.25.0 when len(values) == 1 # (https://github.com/pandas-dev/pandas/issues/27785) from pandas.core.internals import ExtensionBlock values = data.blocks[0].values block = ExtensionBlock(values, slice(0, len(values), 1), ndim=1) data = SingleBlockManager([block], data.axes[0], fastpath=True) self = super(GeoSeries, cls).__new__(cls) super(GeoSeries, self).__init__(data, index=index, **kwargs) self.crs = getattr(self.values, "crs", crs) return self warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2) return Series(data, index=index, **kwargs) if isinstance(data, BaseGeometry): # fix problem for scalar geometries passed, ensure the list of # scalars is of correct length if index is specified n = len(index) if index is not None else 1 data = [data] * n name = kwargs.pop("name", None) if not is_geometry_type(data): # if data is None and dtype is specified (eg from empty overlay # test), specifying dtype raises an error: # https://github.com/pandas-dev/pandas/issues/26469 kwargs.pop("dtype", None) # Use Series constructor to handle input data with compat.ignore_shapely2_warnings(): # suppress additional warning from pandas for empty data # (will always give object dtype instead of float dtype in the future, # making the `if s.empty: s = s.astype(object)` below unnecessary) warnings.filterwarnings("ignore", "The default dtype for empty Series", FutureWarning) s = pd.Series(data, index=index, name=name, **kwargs) # prevent trying to convert non-geometry objects if s.dtype != object: if (s.empty and s.dtype == "float64") or data is None: # pd.Series with empty data gives float64 for older pandas versions s = s.astype(object) else: warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2) return s # try to convert to GeometryArray, if fails return plain Series try: data = from_shapely(s.values, crs) except TypeError: warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2) return s index = s.index name = s.name self = super(GeoSeries, cls).__new__(cls) super(GeoSeries, self).__init__(data, index=index, name=name, **kwargs) if not self.crs: self.crs = crs return self
def __new__(cls, data=None, index=None, crs=None, **kwargs): # we need to use __new__ because we want to return Series instance # instead of GeoSeries instance in case of non-geometry data if isinstance(data, SingleBlockManager): if isinstance(data.blocks[0].dtype, GeometryDtype): if data.blocks[0].ndim == 2: # bug in pandas 0.23 where in certain indexing operations # (such as .loc) a 2D ExtensionBlock (still with 1D values # is created) which results in other failures # bug in pandas <= 0.25.0 when len(values) == 1 # (https://github.com/pandas-dev/pandas/issues/27785) from pandas.core.internals import ExtensionBlock values = data.blocks[0].values block = ExtensionBlock(values, slice(0, len(values), 1), ndim=1) data = SingleBlockManager([block], data.axes[0], fastpath=True) self = super(GeoSeries, cls).__new__(cls) super(GeoSeries, self).__init__(data, index=index, **kwargs) self.crs = crs return self warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2) return Series(data, index=index, **kwargs) if isinstance(data, BaseGeometry): # fix problem for scalar geometries passed, ensure the list of # scalars is of correct length if index is specified n = len(index) if index is not None else 1 data = [data] * n name = kwargs.pop('name', None) if not is_geometry_type(data): # if data is None and dtype is specified (eg from empty overlay # test), specifying dtype raises an error: # https://github.com/pandas-dev/pandas/issues/26469 kwargs.pop('dtype', None) # Use Series constructor to handle input data s = pd.Series(data, index=index, name=name, **kwargs) # prevent trying to convert non-geometry objects if s.dtype != object: if s.empty: s = s.astype(object) else: warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2) return s # try to convert to GeometryArray, if fails return plain Series try: data = from_shapely(s.values) except TypeError: warnings.warn(_SERIES_WARNING_MSG, FutureWarning, stacklevel=2) return s index = s.index name = s.name self = super(GeoSeries, cls).__new__(cls) super(GeoSeries, self).__init__(data, index=index, name=name, **kwargs) self.crs = crs self._invalidate_sindex() return self