Python tools for geographic data
Small bug-fix release removing the shapely<2 pin in the installation requirements.
The highlight of this release is the support for Shapely 2.0. This makes it possible to test Shapely 2.0 (currently 2.0b1) alongside GeoPandas.
Note that if you also have PyGEOS installed, you need to set an environment variable (USE_PYGEOS=0
) before importing geopandas to actually test Shapely 2.0 features instead of PyGEOS. See https://geopandas.org/en/latest/getting_started/install.html#using-the-optional-pygeos-dependency for more details.
New features and improvements:
normalize()
method from shapely to GeoSeries/GeoDataframe (#2537).make_valid()
method from shapely to GeoSeries/GeoDataframe (#2539).where
filter to read_file
(#2552).Deprecations and compatibility notes:
crs
of a GeoDataFrame
without active geometry column was deprecated and this now raises an AttributeError (#2578)..explore()
for recent Matplotlib versions (#2596).Bug fixes:
geopandas.clip()
when clipping with an empty geometry (#2589).gdf.geometry
where the active geometry column is missing, and a column named "geometry"
is present will now raise an AttributeError
, rather than returning gdf["geometry"]
(#2575).pandas.concat
will no longer silently override CRS information if not all inputs have the same CRS (#2056).Acknowledgments
Thanks to everyone who contributed to this release! A total of 17 people contributed patches to this release. People with a "+" by their names contributed a patch for the first time.
Small bug-fix release:
unstack()
and pivot()
involving MultiIndex, or GeoDataFrame construction with MultiIndex (#2486).GeoDataFrame.explode()
with non-default geometry column name.apply()
causing row-wise all nan float columns to be casted to GeometryDtype (#2482).version
in to_parquet
and to_feather
. As a result, the version
parameter for the to_parquet
and to_feather
methods has been replaced with schema_version
. version
will be passed directly to underlying feather or parquet writer. version
will only be used to set schema_version
if version
is one of 0.1.0 or 0.4.0 (#2496).Highlights of this release:
geopandas.read_file()
and GeoDataFrame.to_file()
methods to read and write GIS file formats can now optionally use the pyogrio package under the hood through the engine="pyogrio"
keyword. The pyogrio package implements vectorized IO for GDAL/OGR vector data sources, and is faster compared to the fiona
-based engine (#2225).UserWarning
(#2327).New features and improvements:
Improved handling of GeoDataFrame when the active geometry column is lost from the GeoDataFrame. Previously, square bracket indexing gdf[[...]]
returned a GeoDataFrame when the active geometry column was retained and a DataFrame was returned otherwise. Other pandas indexing methods (loc
, iloc
, etc) did not follow the same rules. The new behaviour for all indexing/reshaping operations is now as follows (#2329, #2060):
DataFrame
containing the active geometry column, a GeoDataFrame is returnedDataFrame
containing GeometryDtype
columns, but not the active geometry column, a GeoDataFrame
is returned, where the active geometry column is set to None
(set the new geometry column with set_geometry()
)DataFrame
containing no GeometryDtype
columns, a DataFrame
is returned (this can be upcast again by calling set_geometry()
or the GeoDataFrame
constructor)Series
of GeometryDtype
, a GeoSeries
is returned, otherwise Series
is returned.Datetime fields are now read and written correctly for GIS formats which support them (e.g. GPKG, GeoJSON) with fiona 1.8.14 or higher. Previously, datetimes were read as strings (#2202).
folium.Map
keyword arguments can now be specified as the map_kwds
argument to GeoDataFrame.explore()
method (#2315).
Add a new parameter style_function
to GeoDataFrame.explore()
to enable plot styling based on GeoJSON properties (#2377).
It is now possible to write an empty GeoDataFrame
to a file for supported formats (#2240). Attempting to do so will now emit a UserWarning
instead of a ValueError
.
Fast rectangle clipping has been exposed as GeoSeries/GeoDataFrame.clip_by_rect()
(#1928).
The mask
parameter of GeoSeries/GeoDataFrame.clip()
now accepts a rectangular mask as a list-like to perform fast rectangle clipping using the new GeoSeries/GeoDataFrame.clip_by_rect()
(#2414).
Bundled demo dataset naturalearth_lowres
has been updated to version 5.0.1 of the source, with field ISO_A3
manually corrected for some cases (#2418).
Deprecations and compatibility notes:
GeometryArray.equals_exact()
and GeometryArray.almost_equals()
have been removed. They should
be replaced with GeometryArray.geom_equals_exact()
and GeometryArray.geom_almost_equals()
respectively (#2267).explicit_crs_from_epsg()
, epsg_from_crs()
and get_epsg_file_contents()
were removed (#2340).GeoSeries.isna()
with empty geometries present has been removed (#2349).GeoDataFrame/GeoSeries
constructor which contradicted the underlying GeometryArray
now raises a ValueError
(#2100).GeoDataFrame
constructor when no geometry column is provided and calling GeoDataFrame. set_crs
on a GeoDataFrame
without an active geometry column now raise a ValueError
(#2100)GeoSeries
constructor is now fully deprecated and will raise a TypeError
(#2314). Previously, a pandas.Series
was returned for non-geometry data.GeoSeries/GeoDataFrame
set operations __xor__()
, __or__()
, __and__()
and __sub__()
, geopandas.io.file.read_file
/to_file
and geopandas.io.sql.read_postgis
now emit FutureWarning
instead of DeprecationWarning
and will be completely removed in a future release.crs
of a GeoDataFrame
without active geometry column is deprecated and will be removed in GeoPandas 0.12 (#2373).Bug fixes:
GeoSeries.to_frame
now creates a GeoDataFrame
with the geometry column name set correctly (#2296)UnboundLocalError
in GeoDataFrame.plot()
using legend=True
and missing_kwds
(#2281).explode()
incorrectly relating index to columns, including where the input index is not unique (#2292)GeoSeries.[xyz]
raising an IndexError
when the underlying GeoSeries contains empty points (#2335). Rows corresponding to empty points now contain np.nan
.GeoDataFrame.iloc
raising a TypeError
when indexing a GeoDataFrame
with only a single column of GeometryDtype
(#1970).GeoDataFrame.iterfeatures()
not returning features with the same field order as GeoDataFrame.columns
(#2396).GeoDataFrame.from_features()
to support reading GeoJSON with null properties (#2243).GeoDataFrame.to_parquet()
not intercepting engine
keyword argument, breaking consistency with pandas (#2227)GeoDataFrame.explore()
producing an error when column
is of boolean dtype (#2403).GeoDataFrame.to_postgis()
output the wrong SRID for ESRI authority CRS (#2414).GeoDataFrame.from_dict/from_features
classmethods using GeoDataFrame
rather than cls
as the constructor.GeoDataFrame.plot()
producing incorrect colors with mixed geometry types when colors
keyword is provided. (#2420)Notes on (optional) dependencies:
Acknowledgments
Thanks to everyone who contributed to this release! A total of 31 people contributed patches to this release. People with a "+" by their names contributed a patch for the first time.
Small bug-fix release:
overlay()
in case no geometries are intersecting (but have overlapping total bounds) (#2172).overlay()
with keep_geom_type=True
in case the overlay of two geometries in a GeometryCollection with other geometry types (#2177).overlay()
to honor the keep_geom_type
keyword for the op="differnce"
case (#2164).plot()
with a mapclassify scheme
in case the formatted legend labels have duplicates (#2166).explore()
method ignoring the vmin
and vmax
keywords in case they are set to 0 (#2175).unary_union
to correctly handle a GeoSeries with missing values (#2181).clip()
(#2179).Small bug-fix release:
overlay()
with non-overlapping geometries and a non-default how (i.e. not "intersection") (#2157).Highlights of this release:
sjoin_nearest()
method to join based on proximity, with the
ability to set a maximum search radius (#1865). In addition, the sindex
attribute gained a new method for a "nearest" spatial index query (#1865,
#2053).explore()
method on GeoDataFrame and GeoSeries with native support
for interactive visualization based on folium / leaflet.js (#1953)geopandas.sjoin()
/overlay()
/clip()
functions are now also
available as methods on the GeoDataFrame (#2141, #1984, #2150).New features and improvements:
value_counts()
method for geometry dtype (#2047).explode()
method has a new ignore_index
keyword (consistent with
pandas' explode method) to reset the index in the result, and a new
index_parts
keywords to control whether a cumulative count indexing the
parts of the exploded multi-geometries should be added (#1871).points_from_xy()
is now available as a GeoSeries method from_xy
(#1936).to_file()
method will now attempt to detect the driver (if not
specified) based on the extension of the provided filename, instead of
defaulting to ESRI Shapefile (#1609).storage_options
keyword in read_parquet()
for
specifying filesystem-specific options (e.g. for S3) based on fsspec (#2107).~
(user home directory) expansion (#1876).convert_dtypes()
method from pandas to preserve the
GeoDataFrame class (#2115).GeoSeries.from_wkb()
(#2106).estimate_utm_crs()
method to handle crossing the antimeridian
with pyproj 3.1+ (#2049).geocode()
from GeoCode.Farm to the Photon
geocoding API (https://photon.komoot.io) (#2007).Deprecations and compatibility notes:
op=
keyword of sjoin()
to indicate which spatial predicate to use
for joining is being deprecated and renamed in favor of a new predicate=
keyword (#1626).cascaded_union
attribute is deprecated, use unary_union
instead (#2074).pd.concat(.., axis=1)
function if this results in duplicated active geometry columns (#2046).explode()
method currently returns a GeoSeries/GeoDataFrame with a
MultiIndex, with an additional level with indices of the parts of the
exploded multi-geometries. For consistency with pandas, this will change in
the future and the new index_parts
keyword is added to control this.Bug fixes:
clip()
function to correctly clip MultiPoints instead of
leaving them intact when partly outside of the clip bounds (#2148).GeoSeries.isna()
to correctly return a boolean Series in case of an
empty GeoSeries (#2073).GeoDataFrame(gdf)
) (#2138).GeoDataFrame.__setitem__
) (#1963)GeoDataFrame.apply()
to preserve the active geometry column name
(#1955).sjoin()
to not ignore the suffixes in case of a right-join
(how="right
) (#2065).GeoDataFrame.explode()
with a MultiIndex (#1945).to/from_wkb
and to_from_wkt
(#1891).to_file()
and to_json()
when DataFrame has duplicate columns to
raise an error (#1900).path_effects
keyword in plot()
(#2127).GeoDataFrame.explode()
to preserve attrs
(#1935)Notes on (optional) dependencies:
Acknowledgments
Thanks to everyone who contributed to this release! A total of 29 people contributed patches to this release. People with a "+" by their names contributed a patch for the first time.
GeoPandas 0.9.0 features a long list of new features, enhancements and bug fixes, see the full list below. In addition, there are many documentation improvements and a restyled and restructured website with a new logo (#1564, #1579, #1617, #1668, #1731, #1750, #1757, #1759).
New features and improvements:
geopandas.read_file
function now accepts more general file-like objects (e.g. fsspec
open file objects). It will now also automatically recognize zipped files (#1535).GeoDataFrame.plot()
method now provides access to the pandas plotting functionality for the non-geometry columns, either using the kind
keyword or the accessor method (e.g. gdf.plot(kind="bar")
or gdf.plot.bar()
) (#1465).from_wkt()
, from_wkb()
, to_wkt()
, to_wkb()
methods for GeoSeries to construct a GeoSeries from geometries in WKT or WKB representation, or to convert a GeoSeries to a pandas Seriew with WKT or WKB values (#1710).GeoSeries.z
attribute to access the z-coordinates of Point geometries (similar to the existing .x
and .y
attributes) (#1773).to_crs()
method now handles missing values (#1618)..attrs
functionality (#1658).dissolve()
method now allows dissolving by no column (by=None
) to create a union of all geometries (single-row GeoDataFrame) (#1568).estimate_utm_crs()
method on GeoSeries/GeoDataFrame to determine the UTM CRS based on the bounds (#1646).GeoDataFrame.from_dict()
now accepts geometry
and crs
keywords (#1619).GeoDataFrame.to_postgis()
and geopandas.read_postgis()
now supports both sqlalchemy engine and connection objects (#1638).GeoDataFrame.explode()
method now allows exploding based on a non-geometry column, using the pandas implementation (#1720).GeoDataFrame/GeoSeries.explode()
when using the PyGEOS backend (#1693).intersection()
, intersects()
) have a new align
keyword which allows optionally not aligning on the index before performing the operation with align=False
(#1668).GeoDataFrame.dissolve()
method now supports all relevant keywords of groupby()
, i.e. the level
, sort
, observed
and dropna
keywords (#1845).geopandas.overlay()
function now accepts make_valid=False
to skip the step to ensure the input geometries are valid using buffer(0)
(#1802).GeoDataFrame.to_json()
method gained a drop_id
keyword to optionally not write the GeoDataFrame's index as the "id" field in the resulting JSON (#1637).aspect
keyword in the plotting methods to optionally allow retaining the original aspect (#1512)interval
keyword in the legend_kwds
group of the plot()
method to control the appearance of the legend labels when using a classification scheme (#1605).sindex
attribute) is now stored on the underlying array. This ensures that the spatial index is preserved in more operations where possible, and that multiple geometry columns of a GeoDataFrame can each have a spatial index (#1444).has_sindex
attribute on the GeoSeries/GeoDataFrame to check if a spatial index has already been initialized (#1627).geopandas.testing.assert_geoseries_equal()
and assert_geodataframe_equal()
testing utilities now have a normalize
keyword (False by default) to normalize geometries before comparing for equality (#1826). Those functions now also give a more informative error message when failing (#1808).Deprecations and compatibility notes:
is_ring
attribute currently returns True for Polygons. In the future, this will be False (#1631). In addition, start to check it for LineStrings and LinearRings (instead of always returning False).objects
keyword in the intersection()
method of the GeoDataFrame/GeoSeries.sindex
spatial index object has been removed (#1444).Bug fixes:
plot()
method raising an error with empty geometries (#1702, #1828).geopandas.overlay()
to preserve geometries of the correct type which are nested within a GeometryCollection as a result of the overlay operation (#1582). In addition, a warning will now be raised if geometries of different type are dropped from the result (#1554)..crs
for empty GeoDataFrames (#1560).geopandas.clip
to preserve the correct geometry column name (#1566).plot()
method when using legend_kwds
with multiple subplots (#1583)missing_kwds
keyword of the plot()
method when there are no areas with missing data (#1600).plot()
method to correctly align values passed to the column
keyword as a pandas Series (#1670).rename_geometry()
method now raises a more informative error message when a duplicate column name is used (#1602).explode()
method to preserve the CRS (#1655)GeoSeries.apply()
method to again accept the convert_dtype
keyword to be consistent with pandas (#1636).GeoDataFrame.apply()
to preserve the CRS when possible (#1848).geom in geoseries
(#1753).shift()
method of a GeoSeries/GeoDataFrame now preserves the CRS (#1744).GeoSeries
constructor without passing data but only an index (#1798).Notes on (optional) dependencies:
descartes
package is no longer required for plotting polygons. This functionality is now included by default in GeoPandas itself, when matplotlib is available (#1677).read_file
/to_file
. This means you can now force geopandas to install without fiona installed (although it is still a default requirement) (#1775).Acknowledgments
Thanks to everyone who contributed to this release! A total of 29 people contributed patches to this release. People with a "+" by their names contributed a patch for the first time.
Small bug-fix release for compatibility with PyGEOS 0.9
Small bug-fix release:
plot()
method when visualizing with a
JenksCaspallSampled or FisherJenksSampled scheme (#1486).GeoDataFrame.to_postgis
(#1497).pd.read_pickle
of files written with older
GeoPandas versions (#1511).Thanks to Ian Rose, Joris Van den Bossche and Martin Fleischmann for their contributions!