Releases: geopandas/geopandas
v0.12.1
Small bug-fix release removing the shapely<2 pin in the installation requirements.
v0.12.0
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:
- Added
normalize()
method from shapely to GeoSeries/GeoDataframe (#2537). - Added
make_valid()
method from shapely to GeoSeries/GeoDataframe (#2539). - Added
where
filter toread_file
(#2552). - Updated the distributed natural earth datasets (naturalearth_lowres and naturalearth_cities) to version 5.1 (#2555).
Deprecations and compatibility notes:
- Accessing the
crs
of aGeoDataFrame
without active geometry column was deprecated and this now raises an AttributeError (#2578). - Resolved colormap-related warning in
.explore()
for recent Matplotlib versions (#2596).
Bug fixes:
- Fix cryptic error message in
geopandas.clip()
when clipping with an empty geometry (#2589). - Accessing
gdf.geometry
where the active geometry column is missing, and a column named"geometry"
is present will now raise anAttributeError
, rather than returninggdf["geometry"]
(#2575). - Combining GeoSeries/GeoDataFrames with
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.
- Alan D. Snow
- Alberto González Rosales +
- Brendan Ward
- Chris Arderne +
- Clemens Korner +
- Ewout ter Hoeven
- Fred Bunt +
- Giacomo Caria
- James Gaboardi
- Joris Van den Bossche
- Martin Fleischmann
- Matt Richards
- Ray Bell
- Shogo Hida +
- Simone Parmeggiani +
- keirayuki310 +
- rraymondgh
v0.11.1
Small bug-fix release:
- Fix regression (RecursionError) in reshape methods such as
unstack()
andpivot()
involving MultiIndex, or GeoDataFrame construction with MultiIndex (#2486). - Fix regression in
GeoDataFrame.explode()
with non-default geometry column name. - Fix regression in
apply()
causing row-wise all nan float columns to be casted to GeometryDtype (#2482). - Fix a crash in datetime column reading where the file contains mixed timezone offsets (#2479). These will be read as UTC localized values.
- Fix a crash in datetime column reading where the file contains datetimes outside the range supported by [ns] precision (#2505).
- Fix regression in passing the Parquet or Feather format
version
into_parquet
andto_feather
. As a result, theversion
parameter for theto_parquet
andto_feather
methods has been replaced withschema_version
.version
will be passed directly to underlying feather or parquet writer.version
will only be used to setschema_version
ifversion
is one of 0.1.0 or 0.4.0 (#2496).
v0.11.0
Highlights of this release:
- The
geopandas.read_file()
andGeoDataFrame.to_file()
methods to read and write GIS file formats can now optionally use the pyogrio package under the hood through theengine="pyogrio"
keyword. The pyogrio package implements vectorized IO for GDAL/OGR vector data sources, and is faster compared to thefiona
-based engine (#2225). - GeoParquet support updated to implement v0.4.0 of the OpenGeospatial/GeoParquet specification (#2441). Backwards compatibility with v0.1.0 of the metadata spec (implemented in the previous releases of GeoPandas) is guaranteed, and reading and writing Parquet and Feather files will no longer produce a
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):- If operations produce a
DataFrame
containing the active geometry column, a GeoDataFrame is returned - If operations produce a
DataFrame
containingGeometryDtype
columns, but not the active geometry column, aGeoDataFrame
is returned, where the active geometry column is set toNone
(set the new geometry column withset_geometry()
) - If operations produce a
DataFrame
containing noGeometryDtype
columns, aDataFrame
is returned (this can be upcast again by callingset_geometry()
or theGeoDataFrame
constructor) - If operations produce a
Series
ofGeometryDtype
, aGeoSeries
is returned, otherwiseSeries
is returned. - Error messages for having an invalid geometry column have been improved, indicating the name of the last valid active geometry column set and whether other geometry columns can be promoted to the active geometry column (#2329).
- If operations produce a
-
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 themap_kwds
argument toGeoDataFrame.explore()
method (#2315). -
Add a new parameter
style_function
toGeoDataFrame.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 aUserWarning
instead of aValueError
. -
Fast rectangle clipping has been exposed as
GeoSeries/GeoDataFrame.clip_by_rect()
(#1928). -
The
mask
parameter ofGeoSeries/GeoDataFrame.clip()
now accepts a rectangular mask as a list-like to perform fast rectangle clipping using the newGeoSeries/GeoDataFrame.clip_by_rect()
(#2414). -
Bundled demo dataset
naturalearth_lowres
has been updated to version 5.0.1 of the source, with fieldISO_A3
manually corrected for some cases (#2418).
Deprecations and compatibility notes:
- The active development branch of geopandas on GitHub has been renamed from master to main (#2277).
- Deprecated methods
GeometryArray.equals_exact()
andGeometryArray.almost_equals()
have been removed. They should
be replaced withGeometryArray.geom_equals_exact()
andGeometryArray.geom_almost_equals()
respectively (#2267). - Deprecated CRS functions
explicit_crs_from_epsg()
,epsg_from_crs()
andget_epsg_file_contents()
were removed (#2340). - Warning about the behaviour change to
GeoSeries.isna()
with empty geometries present has been removed (#2349). - Specifying a CRS in the
GeoDataFrame/GeoSeries
constructor which contradicted the underlyingGeometryArray
now raises aValueError
(#2100). - Specifying a CRS in the
GeoDataFrame
constructor when no geometry column is provided and callingGeoDataFrame. set_crs
on aGeoDataFrame
without an active geometry column now raise aValueError
(#2100) - Passing non-geometry data to the
GeoSeries
constructor is now fully deprecated and will raise aTypeError
(#2314). Previously, apandas.Series
was returned for non-geometry data. - Deprecated
GeoSeries/GeoDataFrame
set operations__xor__()
,__or__()
,__and__()
and__sub__()
,geopandas.io.file.read_file
/to_file
andgeopandas.io.sql.read_postgis
now emitFutureWarning
instead ofDeprecationWarning
and will be completely removed in a future release. - Accessing the
crs
of aGeoDataFrame
without active geometry column is deprecated and will be removed in GeoPandas 0.12 (#2373).
Bug fixes:
GeoSeries.to_frame
now creates aGeoDataFrame
with the geometry column name set correctly (#2296)- Fix pickle files created with pygeos installed can not being readable when pygeos is not installed (#2237).
- Fixed
UnboundLocalError
inGeoDataFrame.plot()
usinglegend=True
andmissing_kwds
(#2281). - Fix
explode()
incorrectly relating index to columns, including where the input index is not unique (#2292) - Fix
GeoSeries.[xyz]
raising anIndexError
when the underlying GeoSeries contains empty points (#2335). Rows corresponding to empty points now containnp.nan
. - Fix
GeoDataFrame.iloc
raising aTypeError
when indexing aGeoDataFrame
with only a single column ofGeometryDtype
(#1970). - Fix
GeoDataFrame.iterfeatures()
not returning features with the same field order asGeoDataFrame.columns
(#2396). - Fix
GeoDataFrame.from_features()
to support reading GeoJSON with null properties (#2243). - Fix
GeoDataFrame.to_parquet()
not interceptingengine
keyword argument, breaking consistency with pandas (#2227) - Fix
GeoDataFrame.explore()
producing an error whencolumn
is of boolean dtype (#2403). - Fix an issue where
GeoDataFrame.to_postgis()
output the wrong SRID for ESRI authority CRS (#2414). - Fix
GeoDataFrame.from_dict/from_features
classmethods usingGeoDataFrame
rather thancls
as the constructor. - Fix
GeoDataFrame.plot()
producing incorrect colors with mixed geometry types whencolors
keyword is provided. (#2420)
Notes on (optional) dependencies:
- GeoPandas 0.11 drops support for Python 3.7 and pandas 0.25 (the minimum supported pandas version is now 1.0.5). Further, the minimum required versions for the listed dependencies have now changed to shapely 1.7, fiona 1.8.13.post1, pyproj 2.6.1.post1, matplotlib 3.2, mapclassify 2.4.0 (#2358, #2391)
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.
- Akylzhan Sauranbay +
- Alan D. Snow
- Alyssa Ross +
- Andreas Meier +
- Andrii Oriekhov +
- Brendan Ward
- Ewout ter Hoeven +
- Guillaume Lostis +
- James McBride
- Joris Van den Bossche
- Karol Zlot +
- Koshy Thomas +
- Martin Fleischmann
- Martina Oefelein +
- Matt Richards
- Mike Taves
- Mjumbe Poe +
- Nathan Lis +
- Nicolò Lucchesi +
- RadMagnus +
- Ray Bell
- Ryan +
- Will Schlitzer
- bstadlbauer +
- clausmichele +
- froast +
- joooeey +
- readthedocs-assistant +
- rraymondgh +
- ryanward-io +
- simberaj
v0.10.2
Small bug-fix release:
- Fix regression in
overlay()
in case no geometries are intersecting (but have overlapping total bounds) (#2172). - Fix regression in
overlay()
withkeep_geom_type=True
in case the overlay of two geometries in a GeometryCollection with other geometry types (#2177). - Fix
overlay()
to honor thekeep_geom_type
keyword for theop="differnce"
case (#2164). - Fix regression in
plot()
with a mapclassifyscheme
in case the formatted legend labels have duplicates (#2166). - Fix a bug in the
explore()
method ignoring thevmin
andvmax
keywords in case they are set to 0 (#2175). - Fix
unary_union
to correctly handle a GeoSeries with missing values (#2181). - Avoid internal deprecation warning in
clip()
(#2179).
v0.10.1
v0.10.0
Highlights of this release:
- A new
sjoin_nearest()
method to join based on proximity, with the
ability to set a maximum search radius (#1865). In addition, thesindex
attribute gained a new method for a "nearest" spatial index query (#1865,
#2053). - A new
explore()
method on GeoDataFrame and GeoSeries with native support
for interactive visualization based on folium / leaflet.js (#1953) - The
geopandas.sjoin()
/overlay()
/clip()
functions are now also
available as methods on the GeoDataFrame (#2141, #1984, #2150).
New features and improvements:
- Add support for pandas'
value_counts()
method for geometry dtype (#2047). - The
explode()
method has a newignore_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 methodfrom_xy
(#1936).- The
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). - Support for the
storage_options
keyword inread_parquet()
for
specifying filesystem-specific options (e.g. for S3) based on fsspec (#2107). - The read/write functions now support
~
(user home directory) expansion (#1876). - Support the
convert_dtypes()
method from pandas to preserve the
GeoDataFrame class (#2115). - Support WKB values in the hex format in
GeoSeries.from_wkb()
(#2106). - Update the
estimate_utm_crs()
method to handle crossing the antimeridian
with pyproj 3.1+ (#2049). - Improved heuristic to decide how many decimals to show in the repr based on
whether the CRS is projected or geographic (#1895). - Switched the default for
geocode()
from GeoCode.Farm to the Photon
geocoding API (https://photon.komoot.io) (#2007).
Deprecations and compatibility notes:
- The
op=
keyword ofsjoin()
to indicate which spatial predicate to use
for joining is being deprecated and renamed in favor of a newpredicate=
keyword (#1626). - The
cascaded_union
attribute is deprecated, useunary_union
instead (#2074). - Constructing a GeoDataFrame with a duplicated "geometry" column is now
disallowed. This can also raise an error in thepd.concat(.., axis=1)
function if this results in duplicated active geometry columns (#2046). - The
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 newindex_parts
keyword is added to control this.
Bug fixes:
- Fix in the
clip()
function to correctly clip MultiPoints instead of
leaving them intact when partly outside of the clip bounds (#2148). - Fix
GeoSeries.isna()
to correctly return a boolean Series in case of an
empty GeoSeries (#2073). - Fix the GeoDataFrame constructor to preserve the geometry name when the
argument is already a GeoDataFrame object (i.e.GeoDataFrame(gdf)
) (#2138). - Fix loss of the values' CRS when setting those values as a column
(GeoDataFrame.__setitem__
) (#1963) - Fix in
GeoDataFrame.apply()
to preserve the active geometry column name
(#1955). - Fix in
sjoin()
to not ignore the suffixes in case of a right-join
(how="right
) (#2065). - Fix
GeoDataFrame.explode()
with a MultiIndex (#1945). - Fix the handling of missing values in
to/from_wkb
andto_from_wkt
(#1891). - Fix
to_file()
andto_json()
when DataFrame has duplicate columns to
raise an error (#1900). - Fix bug in the colors shown with user-defined classification scheme (#2019).
- Fix handling of the
path_effects
keyword inplot()
(#2127). - Fix
GeoDataFrame.explode()
to preserveattrs
(#1935)
Notes on (optional) dependencies:
- GeoPandas 0.9.0 dropped support for Python 3.6 and pandas 0.24. Further,
the minimum required versions are numpy 1.18, shapely 1.6, fiona 1.8,
matplotlib 3.1 and pyproj 2.2. - Plotting with a classification schema now requires mapclassify version >=
2.4 (#1737). - Compatibility fixes for the latest numpy in combination with Shapely 1.7 (#2072)
- Compatibility fixes for the upcoming Shapely 1.8 (#2087).
- Compatibility fixes for the latest PyGEOS (#1872, #2014) and matplotlib
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.
- Adrian Garcia Badaracco
- Alan D. Snow
- Alison Hopkin +
- Andreas Eliasson +
- Ariel Núñez +
- Brendan Ward
- Daniel Mesejo-León +
- Flavin
- Imanol
- James A. Bednar +
- James McBride
- James Myatt +
- John Flavin +
- Joris Van den Bossche
- Martin Fleischmann
- Matt Richards +
- Matthew Law +
- Mike Taves
- Murat Can Üste +
- Qiusheng Wu +
- Ray Bell +
- TLouf +
- Tom Augspurger +
- Tom Russell +
- Zero +
- danielpallen +
- m-richards +
- simberaj +
- standakozak +
v0.9.0
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:
- The
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). - The
GeoDataFrame.plot()
method now provides access to the pandas plotting functionality for the non-geometry columns, either using thekind
keyword or the accessor method (e.g.gdf.plot(kind="bar")
orgdf.plot.bar()
) (#1465). - New
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). - New
GeoSeries.z
attribute to access the z-coordinates of Point geometries (similar to the existing.x
and.y
attributes) (#1773). - The
to_crs()
method now handles missing values (#1618). - Support for pandas' new
.attrs
functionality (#1658). - The
dissolve()
method now allows dissolving by no column (by=None
) to create a union of all geometries (single-row GeoDataFrame) (#1568). - New
estimate_utm_crs()
method on GeoSeries/GeoDataFrame to determine the UTM CRS based on the bounds (#1646). GeoDataFrame.from_dict()
now acceptsgeometry
andcrs
keywords (#1619).GeoDataFrame.to_postgis()
andgeopandas.read_postgis()
now supports both sqlalchemy engine and connection objects (#1638).- The
GeoDataFrame.explode()
method now allows exploding based on a non-geometry column, using the pandas implementation (#1720). - Performance improvement in
GeoDataFrame/GeoSeries.explode()
when using the PyGEOS backend (#1693). - The binary operation and predicate methods (eg
intersection()
,intersects()
) have a newalign
keyword which allows optionally not aligning on the index before performing the operation withalign=False
(#1668). - The
GeoDataFrame.dissolve()
method now supports all relevant keywords ofgroupby()
, i.e. thelevel
,sort
,observed
anddropna
keywords (#1845). - The
geopandas.overlay()
function now acceptsmake_valid=False
to skip the step to ensure the input geometries are valid usingbuffer(0)
(#1802). - The
GeoDataFrame.to_json()
method gained adrop_id
keyword to optionally not write the GeoDataFrame's index as the "id" field in the resulting JSON (#1637). - A new
aspect
keyword in the plotting methods to optionally allow retaining the original aspect (#1512) - A new
interval
keyword in thelegend_kwds
group of theplot()
method to control the appearance of the legend labels when using a classification scheme (#1605). - The spatial index of a GeoSeries (accessed with the
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). - Addition of a
has_sindex
attribute on the GeoSeries/GeoDataFrame to check if a spatial index has already been initialized (#1627). - The
geopandas.testing.assert_geoseries_equal()
andassert_geodataframe_equal()
testing utilities now have anormalize
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:
- The
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). - The deprecated
objects
keyword in theintersection()
method of theGeoDataFrame/GeoSeries.sindex
spatial index object has been removed (#1444).
Bug fixes:
- Fix regression in the
plot()
method raising an error with empty geometries (#1702, #1828). - Fix
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). - Fix the repr of an empty GeoSeries to not show spurious warnings (#1673).
- Fix the
.crs
for empty GeoDataFrames (#1560). - Fix
geopandas.clip
to preserve the correct geometry column name (#1566). - Fix bug in
plot()
method when usinglegend_kwds
with multiple subplots (#1583) - Fix spurious warning with
missing_kwds
keyword of theplot()
method when there are no areas with missing data (#1600). - Fix the
plot()
method to correctly align values passed to thecolumn
keyword as a pandas Series (#1670). - Fix bug in plotting MultiPoints when passing values to determine the color (#1694)
- The
rename_geometry()
method now raises a more informative error message when a duplicate column name is used (#1602). - Fix
explode()
method to preserve the CRS (#1655) - Fix the
GeoSeries.apply()
method to again accept theconvert_dtype
keyword to be consistent with pandas (#1636). - Fix
GeoDataFrame.apply()
to preserve the CRS when possible (#1848). - Fix bug in containment test as
geom in geoseries
(#1753). - The
shift()
method of a GeoSeries/GeoDataFrame now preserves the CRS (#1744). - The PostGIS IO functionality now quotes table names to ensure it works with case-sensitive names (#1825).
- Fix the
GeoSeries
constructor without passing data but only an index (#1798).
Notes on (optional) dependencies:
- GeoPandas 0.9.0 dropped support for Python 3.5. Further, the minimum required versions are pandas 0.24, numpy 1.15 and shapely 1.6 and fiona 1.8.
- The
descartes
package is no longer required for plotting polygons. This functionality is now included by default in GeoPandas itself, when matplotlib is available (#1677). - Fiona is now only imported when used in
read_file
/to_file
. This means you can now force geopandas to install without fiona installed (although it is still a default requirement) (#1775). - Compatibility with the upcoming Shapely 1.8 (#1659, #1662, #1819).
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.
- Adam J. Stewart +
- Adrian Garcia Badaracco
- Alan D. Snow
- Brendan Ward
- Charlie +
- Dave Rench McCauley +
- Flavin +
- Giacomo Caria +
- Ian Rose
- Imanol +
- Isaac Boates +
- Jacob Hayes +
- Jake Clarke +
- James McBride
- Joris Van den Bossche
- Martijn Visser +
- Martin Fleischmann
- Nick Hand +
- Rowan Molony
- Sergio Rey
- Sönke Schmachtel +
- Tim Gates +
- WANG Aiyong +
- Will Schlitzer +
- abonte
- bretttully +
- donlo
- sangarshanan
- vangorade +
v0.8.2
Small bug-fix release for compatibility with PyGEOS 0.9
v0.8.1
Small bug-fix release:
- Fix a regression in the
plot()
method when visualizing with a
JenksCaspallSampled or FisherJenksSampled scheme (#1486). - Fix spurious warning in
GeoDataFrame.to_postgis
(#1497). - Fix the un-pickling with
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!