New features and improvements:
GeoDataFrame.to_parquetandread_parquetwill now write and readattrsrespectively (#3597)- Add
grid_sizeparameter tounion,difference,symmetric_differenceandintersection(#3593). read_parquetnow support direct reading from HTTP/HTTPS protocols (#3699)- Improved compatibility with pandas 3.0 Copy-on-Write feature, making use of deferred copies where possible (#3298).
Deprecations and compatibility notes:
- The
resolutionkeyword tobufferhas been deprecated to align with the convention in shapely,quad_segsshould be used instead (#3600). - Expired deprecations; option
use_pygeoswhich had no functionality,seedkeyword in sample_points (replaced byrng) (#3613)
Bug fixes:
- Fix
GeoSeries.sample_pointsnot accepting list-likesizewhen generating points usingpointpaterns(#3710).
Community:
- GeoPandas now uses the NumFOCUS Code of Conduct.
Notes on dependencies:
- GeoPandas 1.2 now requires Python 3.11 or greater and pandas 2.2, numpy 2.0, pyproj 3.7, and shapely 2.1, are now the minimum required version for these dependencies. Furthermore, the minimum tested version for optional dependencies has been updated to fiona 1.8.21, scipy 1.9, matplotlib 3.9, mapclassify 2.7 folium 0.15, pyarrow 15.0 and SQLAlchemy 2.0. Older versions of these libraries may continue to work, but are no longer considered supported (#3371, #3581).
Bug fixes:
- Fix an issue that caused an error in
GeoDataFrame.from_featureswhen there is nopropertiesfield (#3599). - Fix
read_fileandto_fileerrors (#3682) - Fix
read_parquetwithto_pandas_kwargsfor complex (list/struct) arrow types (#3640) value_countson GeoSeries now preserves CRS in index (#3669)- Fix f-string placeholders appearing in error messages when
pyogriocannot be imported (#3682). - Fix
read_parquetwithto_pandas_kwargsfor complex (list/struct) arrow types (#3640). .to_jsonnow provides a clearer error message when called on a GeoDataFrame without an active geometry column (#3648).- Calling
del gdf["geometry"]now will downcast to apd.DataFrameif there are no geometry columns left in the dataframe (#3648). - Fix SQL injection in
to_postgisvia geometry column name (#3681).
Bug fixes:
- Fix regression in the GeoDataFrame constructor when np.nan is given as an only geometry (#3591).
- Fix regression in
overlaywithhow="identity"when input dataframes have column names that are equal (#3596).
Notes on dependencies:
- GeoPandas 1.1 now requires Python 3.10 or greater and pandas 2.0, numpy 1.24, pyproj 3.5, are now the minimum required version for these dependencies. Furthermore, the minimum tested version for optional dependencies has been updated to fiona 1.8.21, scipy 1.9, matplotlib 3.7, mapclassify 2.5, folium 0.12 and SQLAlchemy 2.0. Older versions of these libraries may continue to work, but are no longer considered supported (#3371).
New features and improvements:
- Added options to return the result of
SpatialIndex.queryin a form of a dense or a sparse boolean array. This adds optional dependency onscipyfor the sparse output. Note that this also changes the previously undocumented behaviour of theoutput_formatkeyword (#1674). - Add
grid_sizeparameter tounion_allanddissolve(#3445). GeoDataFrame.plotnow supportspd.Indexas an input for thecolumnkeyword (#3463).- Added
disjoint_subsetunion algorithm forunion_allanddissolve(#3534). - Added
constrained_delaunay_trianglesmethod to GeoSeries/GeoDataFrame (#3552). - Added
to_pandas_kwargsargument tofrom_arrow,read_parquetandread_featherto allow better control of conversion of non-geometric Arrow data to DataFrames (#3466). - Added
is_valid_coverageandinvalid_coverage_edgesto GeoSeries/GeoDataFrame to allow validation of polygonal coverage (#3545). - Added
maximum_inscribed_circlemethod from shapely to GeoSeries/GeoDataFrame (#3544). - Added
minimum_clearance_linemethod from shapely to GeoSeries/GeoDataFrame (#3543). - Added
orient_polygonsmethod from shapely to GeoSeries/GeoDataFrame (#3559). - Added
methodandkeep_collapsedargument tomake_valid(#3548). - Added
simplify_coveragemethod for topological simplification of polygonal coverages to GeoSeries/GeoDataFrame (#3541). - Added initial support of M coordinates (
mandhas_mproperties,include_minget_coordinates) (#3561). - Added
geom_equals_identicalmethod exposingequals_identicalfrom shapely to GeoSeries/GeoDataFrame (#3560). - GeoPandas now attempts to use a range request when reading from an URL even if the header does not directly indicate its support (#3572).
- Added
geopandas.accessorsmodule. Import this module to register apandas.Series.geoaccessor, which exposes GeoSeries methods via pandas's extension mechanism (#3272). - Improve performance of
overlaywithhow=identity(#3504). - A warning message is raised in
read_filewhen a GeoDataFrame or GeoSeries mask and/or the source dataset is missing a defined CRS (#3464). - GeoDataFrame no longer hard-codes the class internally, allowing easier subclassing (#3505).
Bug fixes:
- Fix an issue that showed numpy dtypes in bbox in
to_geo_dictand__geo_interface__. (#3436). - Fix an issue in
sample_pointsthat could occasionally result in non-uniform distribution (#3470). - Fix unspecified layer warning being emitted while reading multilayer datasets, even when layer is specified when using the mask or bbox keywords (#3378).
- Properly support named aggregations over a geometry column in
GroupBy.agg(#3368). - Support GeoDataFrame constructor receiving arguments to
geometrywhich are not (Geo)Series, but instead should be interpreted as column names, like Enums (#3384). - Fix regression where constructing a GeoSeries from a pd.Series with GeometryDtype values
failed when
crswas provided (#3383). - Fix regression where
overlaywithkeep_geom_typereturns wrong results if the input contains invalid geometries (#3395). - Fix the dtype of the GeometryArray backing data being incorrect for zero length
GeoDataFrames causing errors in
overlay(#3424). - Fix regression where constructing a GeoSeries from a pd.Series with GeometryDtype values
failed when
crswas provided (#3383). - Fix plotting of polygons with holes by normalizing the coordinate order prior to plotting (#3483).
- Fix an issue in plotting when polygon patches were not closed (#3576).
- Fix ambiguous error when GeoDataFrame is initialised with a column called "crs" (#3502).
- Avoid change of the plot aspect when plotting missing values (#3438).
Deprecations and compatibility notes:
- The
GeoSeries.selectmethod wrapping the pandasSeries.selectmethod has been removed. The upstream method no longer exists in all supported version of pandas (#3394). - The deprecated
geom_almost_equalsmethod has been removed. Usegeom_equals_exactinstead (#3522).
Bug fixes:
- Support a named datetime or object dtype index in
explore()(#3360, #3364). - Fix a regression preventing a Series as an argument for geometric methods (#3363).
Notes on dependencies:
- GeoPandas 1.0 drops support for shapely<2 and PyGEOS. The only geometry engine that is currently supported is shapely >= 2. As a consequence, spatial indexing based on the rtree package has also been removed (#3035).
- The I/O engine now defaults to Pyogrio which is now installed with GeoPandas instead of Fiona (#3223).
New methods:
- Added
count_geometriesmethod from shapely to GeoSeries/GeoDataFrame (#3154). - Added
count_interior_ringsmethod from shapely to GeoSeries/GeoDataFrame (#3154). - Added
relate_patternmethod from shapely to GeoSeries/GeoDataFrame (#3211). - Added
intersection_allmethod from shapely to GeoSeries/GeoDataFrame (#3228). - Added
line_mergemethod from shapely to GeoSeries/GeoDataFrame (#3214). - Added
set_precisionandget_precisionmethods from shapely to GeoSeries/GeoDataFrame (#3175). - Added
count_coordinatesmethod from shapely to GeoSeries/GeoDataFrame (#3026). - Added
minimum_clearancemethod from shapely to GeoSeries/GeoDataFrame (#2989). - Added
shared_pathsmethod from shapely to GeoSeries/GeoDataFrame (#3215). - Added
is_ccwmethod from shapely to GeoSeries/GeoDataFrame (#3027). - Added
is_closedattribute from shapely to GeoSeries/GeoDataFrame (#3092). - Added
force_2dandforce_3dmethods from shapely to GeoSeries/GeoDataFrame (#3090). - Added
voronoi_polygonsmethod from shapely to GeoSeries/GeoDataFrame (#3177). - Added
contains_properlymethod from shapely to GeoSeries/GeoDataFrame (#3105). - Added
build_areamethod exposingbuild_areashapely to GeoSeries/GeoDataFrame (#3202). - Added
snapmethod from shapely to GeoSeries/GeoDataFrame (#3086). - Added
transformmethod from shapely to GeoSeries/GeoDataFrame (#3075). - Added
get_geometrymethod from shapely to GeoSeries/GeoDataFrame (#3287). - Added
dwithinmethod to check for a "distance within" predicate on GeoSeries/GeoDataFrame (#3153). - Added
to_geo_dictmethod to generate GeoJSON-like dictionary from a GeoDataFrame (#3132). - Added
polygonizemethod exposing bothpolygonizeandpolygonize_fullfrom shapely to GeoSeries/GeoDataFrame (#2963). - Added
is_valid_reasonmethod from shapely to GeoSeries/GeoDataFrame (#3176). - Added
to_arrowmethod andfrom_arrowclass method to GeoSeries/GeoDataFrame to export and import to/from Arrow data with GeoArrow extension types (#3219, #3301).
New features and improvements:
- Added
predicate="dwithin"option anddistanceargument to thesindex.query()method andsjoin(#2882). - GeoSeries and GeoDataFrame
__repr__now trims trailing zeros for a more readable output (#3087). - Add
on_invalidparameter tofrom_wktandfrom_wkb(#3110). make_validoption inoverlaynow uses themake_validmethod instead ofbuffer(0)(#3113).- Passing
"geometry"asdtypetopd.read_csvwill now return a GeoSeries for the specified columns (#3101). - Added support to
read_filefor themaskkeyword for the pyogrio engine (#3062). - Added support to
read_filefor thecolumnskeyword for the fiona engine (#3133). - Added support to
to_parquetandread_parquetfor writing and reading files using the GeoArrow-based native geometry encoding of GeoParquet 1.1 (#3253, #3275). - Add
sortkeyword toclipmethod for GeoSeries and GeoDataFrame to allow optional preservation of the original order of observations (#3233). - Added
show_bbox,drop_idandto_wgs84arguments to allow further customization ofGeoSeries.to_json(#3226). explorenow supportsGeoDataFrames with additional columns containing datetimes, uuids and other non JSON serializable objects (#3261).- The
GeoSeries.fillnamethod now supports thelimitkeyword (#3290). - Added
on_attributeoption argument to thesjoin()method, allowing to restrict joins to the observations with matching attributes (#3231). - Added support for
bboxcovering encoding in geoparquet. Can filter reading of parquet files based on a bounding box, and write out a bounding box column to parquet files (#3282). alignkeyword in binary methods now defaults toNone, treated as True. Explicit True will silence the warning about mismatched indices (#3212).GeoSeries.set_crscan now be used to remove CRS information by passingcrs=None, allow_override=True(#3316).- Added
autolimkeyword argument toGeoSeries.plot()andGeoDataFrame.plot()(#2817). - Added
metadataparameter toGeoDataFrame.to_file(#2850). - Updated documentation to clarify that passing a named (Geo)Series as the
geometryargument to the GeoDataFrame constructor will not use the name but will always produce a GeoDataFrame with an active geometry column named "geometry" (#3337). read_postgiswill query the spatial_ref_sys table to determine the CRS authority instead of its current behaviour of assuming EPSG. In the event the spiatal_ref_sys table is not present, or the SRID is not present,read_postgiswill fallback on assuming EPSG CRS authority (#3329).- Added
GeoDataFrame.active_geometry_nameproperty returning the active geometry column's name or None if no active geometry column is set (#2943).
Backwards incompatible API changes:
- The
sjoinmethod will now preserve the name of the index of the right GeoDataFrame, if it has one, instead of always using"index_right"as the name for the resulting column in the return value (#846, #2144). - GeoPandas now raises a ValueError when an unaligned Series is passed as a method argument to avoid confusion of whether the automatic alignment happens or not (#3271).
- The deprecated default value of GeoDataFrame/ GeoSeries
explode(.., index_parts=True)is now set to false for consistency with pandas (#3174). - The behaviour of
set_geometryhas been changed when passed a (Geo)Seriesserwith a name. The new active geometry column name in this case will beser.name, if not None, rather than the previous active geometry column name. This means that if the new and old names are different, then both columns will be preserved in the GeoDataFrame. To replicate the previous behaviour, you can instead callgdf.set_geometry(ser.rename(gdf.active_geometry_name))(#3237). Note that this behaviour change does not affect theGeoDataFrameconstructor, passing a named GeoSeriessertoGeoDataFrame(df, geometry=ser)will always produce a GeoDataFrame with a geometry column named "geometry" to preserve backwards compatibility. If you would like to instead propagate the name ofserwhen constructing a GeoDataFrame, you can instead calldf.set_geometry(ser)orGeoDataFrame(df, geometry=ser).rename_geometry(ser.name)(#3337). delaunay_trianglesnow considers all geometries together when creating the Delaunay triangulation instead of performing the operation element-wise. If you want to generate Delaunay triangles for each geometry separately, useshapely.delaunay_trianglesinstead. (#3273)- Reading a data source that does not have a geometry field using
read_filenow returns a Pandas DataFrame instead of a GeoDataFrame with an emptygeometrycolumn.
Enforced deprecations:
- The deprecation of
geopandas.datasetshas been enforced and the module has been removed. New sample datasets are now available in the geodatasets package (#3084). - Many longstanding deprecated functions, methods and properties have been removed (#3174), (#3190)
- Removed deprecated functions
geopandas.io.read_file,geopandas.io.to_fileandgeopandas.io.sql.read_postgis.geopandas.read_file,geopandas.read_postgisand the GeoDataFrame/GeoSeriesto_file(..)method should be used instead. - Removed deprecated
GeometryArray.dataproperty,np.asarray(..)or theto_numpy()method should be used instead. - Removed deprecated
sindex.query_bulkmethod, usingsindex.queryinstead. - Removed deprecated
sjoinparameterop,predicateshould be supplied instead. - Removed deprecated GeoSeries/ GeoDataFrame methods
__xor__,__or__,__and__and__sub__. Instead use methodssymmetric_difference,union,intersectionanddifferencerespectively. - Removed deprecated plotting functions
plot_polygon_collection,plot_linestring_collectionandplot_point_collection, use the GeoSeries/GeoDataFrame.plotmethod directly instead. - Removed deprecated GeoSeries/GeoDataFrame
.plotparametersaxesandcolormap, instead useaxandcmaprespectively. - Removed compatibility for specifying the
versionkeyword into_parquetandto_feather. This keyword will now be passed through to pyarrow and useschema_versionto specify the GeoParquet specification version (#3334).
- Removed deprecated functions
New deprecations:
-
unary_unionattribute is now deprecated and replaced by theunion_all()method (#3007) allowing opting for a faster union algorithm for coverages (#3151). -
The
include_fieldsandignore_fieldskeywords inread_file()are deprecated for the default pyogrio engine. Currently those are translated to thecolumnskeyword for backwards compatibility, but you should directly use thecolumnskeyword instead to select which columns to read (#3133). -
The
dropkeyword inset_geometryhas been deprecated, and in future thedrop=Truebehaviour will be removed (#3237). To prepare for this change, you should remove any explicitdrop=Falsecalls in your code (the default behaviour already is the same asdrop=False). To replicate the previousdrop=Truebehaviour you should replacegdf.set_geometry(new_geo_col, drop=True)withgeo_col_name = gdf.active_geometry_name gdf.set_geometry(new_geo_col).drop(columns=geo_col_name).rename_geometry(geo_col_name)
-
The
geopandas.use_pygeosoption has been deprecated and will be removed in GeoPandas 1.1 (#3283) -
Manual overriding of an existing CRS of a GeoSeries or GeoDataFrame by setting the
crsproperty has been deprecated and will be disabled in future. Use theset_crs()method instead (#3085).
Bug fixes:
- Fix
GeoDataFrame.merge()incorrectly returning aDataFrameinstead of aGeoDataFramewhen thesuffixesargument is applied to the active geometry column (#2933). - Fix bug in
GeoDataFrameconstructor where ifgeometryis given a namedGeoSeriesthe name was not used as the active geometry column name (#3237). - Fix bug in
GeoSeriesconstructor when passing a Series and specifying acrsto not change the original input data (#2492). - Fix regression preventing reading from file paths containing hashes in
read_filewith the fiona engine (#3280). An analogous fix for pyogrio is included in pyogrio 0.8.1. - Fix
to_parquetto write correct metadata in case of 3D geometries (#2824). - Fixes for compatibility with psycopg (#3167).
- Fix to allow appending dataframes with no CRS to PostGIS tables with no CRS (#3328)
- Fix plotting of all-empty GeoSeries using
explore(#3316).
- Several fixes for compatibility with the upcoming pandas 3.0, numpy 2.0 and fiona 1.10 releases.
- Several fixes for compatibility with the latest pandas 2.2 release.
- Fix bug in
pandas.concatCRS consistency checking where CRS differing by WKT whitespace only were treated as incompatible (#3023).
- Fix regression in
overlaywhere usingbuffer(0)instead ofmake_validinternally produced invalid results (#3074). - Fix
explore()method when the active geometry contains missing and empty geometries (#3094).
- The Parquet and Feather IO functions now support the latest 1.0.0 version of the GeoParquet specification (geoparquet.org) (#2663).
- Fix
read_parquetandread_featherfor CVE-2023-47248 (#3070).
GeoPandas will use Shapely 2.0 by default instead of PyGEOS when both Shapely >= 2.0 and PyGEOS are installed. PyGEOS will continue to be used by default when PyGEOS is installed alongside Shapely < 2.0. Support for PyGEOS and Shapely < 2.0 will be removed in GeoPandas 1.0. (#2999)
API changes:
seedkeyword insample_pointsis deprecated. Usernginstead. (#2913).
New methods:
- Added
concave_hullmethod from shapely to GeoSeries/GeoDataFrame (#2903). - Added
delaunay_trianglesmethod from shapely to GeoSeries/GeoDataFrame (#2907). - Added
extract_unique_pointsmethod from shapely to GeoSeries/GeoDataFrame (#2915). - Added
frechet_distance()method from shapely to GeoSeries/GeoDataFrame (#2929). - Added
hausdorff_distancemethod from shapely to GeoSeries/GeoDataFrame (#2909). - Added
minimum_rotated_rectanglemethod from shapely to GeoSeries/GeoDataFrame (#2541). - Added
offset_curvemethod from shapely to GeoSeries/GeoDataFrame (#2902). - Added
remove_repeated_pointsmethod from shapely to GeoSeries/GeoDataFrame (#2940). - Added
reversemethod from shapely to GeoSeries/GeoDataFrame (#2988). - Added
segmentizemethod from shapely to GeoSeries/GeoDataFrame (#2910). - Added
shortest_linemethod from shapely to GeoSeries/GeoDataFrame (#2960).
New features and improvements:
- Added
exclusiveparameter tosjoin_nearestmethod for Shapely >= 2.0 (#2877) - The
to_file()method will now automatically detect the FlatGeoBuf driver for files with the.fgbextension (#2958)
Bug fixes:
- Fix ambiguous error when GeoDataFrame is initialized with a column called
"crs"(#2944) - Fix a color assignment in
explorewhen usingUserDefinedbins (#2923) - Fix bug in
applywithaxis=1where the given user defined function returns nested data in the geometry column (#2959) - Properly infer schema for
np.int32andpd.Int32Dtypecolumns (#2950) assert_geodataframe_equalnow handles GeoDataFrames with no active geometry (#2498)
Notes on (optional) dependencies:
- GeoPandas 0.14 drops support for Python 3.8 and pandas 1.3 and below (the minimum supported pandas version is now 1.4). Further, the minimum required versions for the listed dependencies have now changed to shapely 1.8.0, fiona 1.8.21, pyproj 3.3.0 and matplotlib 3.5.0 (#3001)
Deprecations and compatibility notes:
geom_almost_equals()methods have been deprecated andgeom_equals_exact()should be used instead (#2604).
Bug fix:
- Fix a regression in reading from local file URIs (
file://..) usinggeopandas.read_file(#2948).
Bug fix:
- Fix a regression in reading from URLs using
geopandas.read_file(#2908). This restores the behaviour to download all data up-front before passing it to the underlying engine (fiona or pyogrio), except if the server supports partial requests (to support reading a subset of a large file).
New methods:
- Added
sample_pointsmethod to sample random points from Polygon or LineString geometries (#2860). - New
hilbert_distance()method that calculates the distance along a Hilbert curve for each geometry in a GeoSeries/GeoDataFrame (#2297). - Support for sorting geometries (for example, using
sort_values()) based on the distance along the Hilbert curve (#2070). - Added
get_coordinates()method from shapely to GeoSeries/GeoDataFrame (#2624). - Added
minimum_bounding_circle()method from shapely to GeoSeries/GeoDataFrame (#2621). - Added
minimum_bounding_radius()as GeoSeries method (#2827).
Other new features and improvements:
- The Parquet and Feather IO functions now support the latest 1.0.0-beta.1 version of the GeoParquet specification (<geoparquet.org>) (#2663).
- Added support to fill missing values in
GeoSeries.fillnavia anotherGeoSeries(#2535). - Support specifying
min_zoomandmax_zoominside themap_kwdsargument for.explore()(#2599). - Added support for append (
mode="a"orappend=True) into_file()usingengine="pyogrio"(#2788). - Added a
to_wgs84keyword toto_jsonallowing automatic re-projecting to follow the 2016 GeoJSON specification (#416). to_jsonoutput now includes a"crs"field if the CRS is not the default WGS84 (#1774).- Improve error messages when accessing the
geometryattribute of GeoDataFrame without an active geometry column related to the default name"geometry"being provided in the constructor (#2577)
Deprecations and compatibility notes:
- Added warning that
unary_unionwill return'GEOMETRYCOLLECTION EMPTY'instead of None for all-None GeoSeries. (#2618) - The
query_bulk()method of the spatial index.sindexproperty is deprecated in favor ofquery()(#2823).
Bug fixes:
- Ensure that GeoDataFrame created from DataFrame is a copy, not a view (#2667)
- Fix mismatch between geometries and colors in
plot()if an empty or missing geometry is present (#2224) - Escape special characters to avoid TemplateSyntaxError in
explore()(#2657) - Fix
to_parquet/to_featherto not write an invalid bbox (with NaNs) in the metadata in case of an empty GeoDataFrame (#2653) - Fix
to_parquet/to_featherto use correct WKB flavor for 3D geometries (#2654) - Fix
read_fileto avoid reading all file bytes prior to calling Fiona or Pyogrio if provided a URL as input (#2796) - Fix
copy()downcasting GeoDataFrames without an active geometry column to a DataFrame (#2775) - Fix geometry column name propagation when GeoDataFrame columns are a multiindex (#2088)
- Fix
iterfeatures()method of GeoDataFrame to correctly handle non-scalar values whenna='drop'is specified (#2811) - Fix issue with passing custom legend labels to
plot(#2886)
Notes on (optional) dependencies:
- GeoPandas 0.13 drops support pandas 1.0.5 (the minimum supported pandas version is now 1.1). Further, the minimum required versions for the listed dependencies have now changed to shapely 1.7.1, fiona 1.8.19, pyproj 3.0.1 and matplotlib 3.3.4 (#2655)
Bug fixes:
- Correctly handle geometries with Z dimension in
to_crs()when using PyGEOS or Shapely >= 2.0 (previously the z coordinates were lost) (#1345). - Assign Crimea to Ukraine in the
naturalearth_lowresbuilt-in dataset (#2670)
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:
- Added
normalize()method from shapely to GeoSeries/GeoDataFrame (#2537). - Added
make_valid()method from shapely to GeoSeries/GeoDataFrame (#2539). - Added
wherefilter 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
crsof aGeoDataFramewithout 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.geometrywhere 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.concatwill no longer silently override CRS information if not all inputs have the same CRS (#2056).
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
versioninto_parquetandto_feather. As a result, theversionparameter for theto_parquetandto_feathermethods has been replaced withschema_version.versionwill be passed directly to underlying feather or parquet writer.versionwill only be used to setschema_versionifversionis one of 0.1.0 or 0.4.0 (#2496).
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
DataFramecontaining the active geometry column, a GeoDataFrame is returned - If operations produce a
DataFramecontainingGeometryDtypecolumns, but not the active geometry column, aGeoDataFrameis returned, where the active geometry column is set toNone(set the new geometry column withset_geometry()) - If operations produce a
DataFramecontaining noGeometryDtypecolumns, aDataFrameis returned (this can be upcast again by callingset_geometry()or theGeoDataFrameconstructor) - If operations produce a
SeriesofGeometryDtype, aGeoSeriesis returned, otherwiseSeriesis 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.Mapkeyword arguments can now be specified as themap_kwdsargument toGeoDataFrame.explore()method (#2315). -
Add a new parameter
style_functiontoGeoDataFrame.explore()to enable plot styling based on GeoJSON properties (#2377). -
It is now possible to write an empty
GeoDataFrameto a file for supported formats (#2240). Attempting to do so will now emit aUserWarninginstead of aValueError. -
Fast rectangle clipping has been exposed as
GeoSeries/GeoDataFrame.clip_by_rect()(#1928). -
The
maskparameter 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_lowreshas been updated to version 5.0.1 of the source, with fieldISO_A3manually 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/GeoSeriesconstructor which contradicted the underlyingGeometryArraynow raises aValueError(#2100). - Specifying a CRS in the
GeoDataFrameconstructor when no geometry column is provided and callingGeoDataFrame. set_crson aGeoDataFramewithout an active geometry column now raise aValueError(#2100) - Passing non-geometry data to the
GeoSeriesconstructor is now fully deprecated and will raise aTypeError(#2314). Previously, apandas.Serieswas returned for non-geometry data. - Deprecated
GeoSeries/GeoDataFrameset operations__xor__(),__or__(),__and__()and__sub__(),geopandas.io.file.read_file/to_fileandgeopandas.io.sql.read_postgisnow emitFutureWarninginstead ofDeprecationWarningand will be completely removed in a future release. - Accessing the
crsof aGeoDataFramewithout active geometry column is deprecated and will be removed in GeoPandas 0.12 (#2373).
Bug fixes:
GeoSeries.to_framenow creates aGeoDataFramewith 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
UnboundLocalErrorinGeoDataFrame.plot()usinglegend=Trueandmissing_kwds(#2281). - Fix
explode()incorrectly relating index to columns, including where the input index is not unique (#2292) - Fix
GeoSeries.[xyz]raising anIndexErrorwhen the underlying GeoSeries contains empty points (#2335). Rows corresponding to empty points now containnp.nan. - Fix
GeoDataFrame.ilocraising aTypeErrorwhen indexing aGeoDataFramewith 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 interceptingenginekeyword argument, breaking consistency with pandas (#2227) - Fix
GeoDataFrame.explore()producing an error whencolumnis 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_featuresclassmethods usingGeoDataFramerather thanclsas the constructor. - Fix
GeoDataFrame.plot()producing incorrect colors with mixed geometry types whencolorskeyword 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)
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=Truein case the overlay of two geometries in a GeometryCollection with other geometry types (#2177). - Fix
overlay()to honor thekeep_geom_typekeyword for theop="difference"case (#2164). - Fix regression in
plot()with a mapclassifyschemein case the formatted legend labels have duplicates (#2166). - Fix a bug in the
explore()method ignoring thevminandvmaxkeywords in case they are set to 0 (#2175). - Fix
unary_unionto correctly handle a GeoSeries with missing values (#2181). - Avoid internal deprecation warning in
clip()(#2179).
Small bug-fix release:
- Fix regression in
overlay()with non-overlapping geometries and a non-defaulthow(i.e. not "intersection") (#2157).
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, thesindexattribute 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_indexkeyword (consistent with pandas' explode method) to reset the index in the result, and a newindex_partskeywords 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_optionskeyword 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_unionattribute is deprecated, useunary_unioninstead (#2074). - Constructing a GeoDataFrame with a duplicated "geometry" column is now
disallowed. This can also raise an error in the
pd.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_partskeyword 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_wkbandto_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_effectskeyword inplot()(#2127). - Fix
GeoDataFrame.explode()to preserveattrs(#1935)
Notes on (optional) dependencies:
- GeoPandas 0.10.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 (colorbar issue, #2066).
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_filefunction now accepts more general file-like objects (e.g.fsspecopen 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 thekindkeyword 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.zattribute to access the z-coordinates of Point geometries (similar to the existing.xand.yattributes) (#1773). - The
to_crs()method now handles missing values (#1618). - Support for pandas' new
.attrsfunctionality (#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 acceptsgeometryandcrskeywords (#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 newalignkeyword 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,observedanddropnakeywords (#1845). - The
geopandas.overlay()function now acceptsmake_valid=Falseto skip the step to ensure the input geometries are valid usingbuffer(0)(#1802). - The
GeoDataFrame.to_json()method gained adrop_idkeyword to optionally not write the GeoDataFrame's index as the "id" field in the resulting JSON (#1637). - A new
aspectkeyword in the plotting methods to optionally allow retaining the original aspect (#1512) - A new
intervalkeyword in thelegend_kwdsgroup 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
sindexattribute) 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_sindexattribute 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 anormalizekeyword (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_ringattribute 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
objectskeyword in theintersection()method of theGeoDataFrame/GeoSeries.sindexspatial 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
.crsfor empty GeoDataFrames (#1560). - Fix
geopandas.clipto preserve the correct geometry column name (#1566). - Fix bug in
plot()method when usinglegend_kwdswith multiple subplots (#1583) - Fix spurious warning with
missing_kwdskeyword of theplot()method when there are no areas with missing data (#1600). - Fix the
plot()method to correctly align values passed to thecolumnkeyword 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_dtypekeyword 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
GeoSeriesconstructor 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
descartespackage 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).
Small bug-fix release for compatibility with PyGEOS 0.9.
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_pickleof files written with older GeoPandas versions (#1511).
Experimental: optional use of PyGEOS to speed up spatial operations (#1155).
PyGEOS is a faster alternative for Shapely (being contributed back to a future
version of Shapely), and is used in element-wise spatial operations and for
spatial index in e.g. sjoin (#1343, #1401, #1421, #1427, #1428). See the
installation docs
for more info and how to enable it.
New features and improvements:
-
IO enhancements:
- New
GeoDataFrame.to_postgis()method to write to PostGIS database (#1248). - New Apache Parquet and Feather file format support (#1180, #1435)
- Allow appending to files with
GeoDataFrame.to_file(#1229). - Add support for the
ignore_geometrykeyword inread_fileto only read the attribute data. If set to True, a pandas DataFrame without geometry is returned (#1383). geopandas.read_filenow supports reading from file-like objects (#1329).GeoDataFrame.to_filenow supports specifying the CRS to write to the file (#802). By default it still uses the CRS of the GeoDataFrame.- New
chunksizekeyword ingeopandas.read_postgisto read a query in chunks (#1123).
- New
-
Improvements related to geometry columns and CRS:
- Any column of the GeoDataFrame that has a "geometry" dtype is now returned
as a GeoSeries. This means that when having multiple geometry columns, not
only the "active" geometry column is returned as a GeoSeries, but also
accessing another geometry column (
gdf["other_geom_column"]) gives a GeoSeries (#1336). - Multiple geometry columns in a GeoDataFrame can now each have a different
CRS. The global
gdf.crsattribute continues to returns the CRS of the "active" geometry column. The CRS of other geometry columns can be accessed from the column itself (eggdf["other_geom_column"].crs) (#1339). - New
set_crs()method on GeoDataFrame/GeoSeries to set the CRS of naive geometries (#747).
- Any column of the GeoDataFrame that has a "geometry" dtype is now returned
as a GeoSeries. This means that when having multiple geometry columns, not
only the "active" geometry column is returned as a GeoSeries, but also
accessing another geometry column (
-
Improvements related to plotting:
- The y-axis is now scaled depending on the center of the plot when using a geographic CRS, instead of using an equal aspect ratio (#1290).
- When passing a column of categorical dtype to the
column=keyword of the GeoDataFrameplot(), we now honor all categories and its order (#1483). In addition, a newcategorieskeyword allows to specify all categories and their order otherwise (#1173). - For choropleths using a classification scheme (using
scheme=), thelegend_kwdsaccept two new keywords to control the formatting of the legend:fmtwith a format string for the bin edges (#1253), andlabelsto pass fully custom class labels (#1302).
-
New
covers()andcovered_by()methods on GeoSeries/GeoDataFrame for the equivalent spatial predicates (#1460, #1462). -
GeoPandas now warns when using distance-based methods with data in a geographic projection (#1378).
Deprecations:
- When constructing a GeoSeries or GeoDataFrame from data that already has a
CRS, a deprecation warning is raised when both CRS don't match, and in the
future an error will be raised in such a case. You can use the new
set_crsmethod to override an existing CRS. See the docs. - The helper functions in the
geopandas.plottingmodule are deprecated for public usage (#656). - The
geopandas.iofunctions are deprecated, use the top-levelread_fileandto_fileinstead (#1407). - The set operators (
&,|,^,-) are deprecated, use theintersection(),union(),symmetric_difference(),difference()methods instead (#1255). - The
sindexfor empty dataframe will in the future return an empty spatial index instead ofNone(#1438). - The
objectskeyword in theintersectionmethod of the spatial index returned by thesindexattribute is deprecated and will be removed in the future (#1440).
Bug fixes:
- Fix the
total_bounds()method to ignore missing and empty geometries (#1312). - Fix
geopandas.clipwhen masking with non-overlapping area resulting in an empty GeoDataFrame (#1309, #1365). - Fix error in
geopandas.sjoinwhen joining on an empty geometry column (#1318). - CRS related fixes:
pandas.concatpreserves CRS when concatenating GeoSeries objects (#1340), preserve the CRS ingeopandas.clip(#1362) and inGeoDataFrame.astype(#1366). - Fix bug in
GeoDataFrame.explode()when 'level_1' is one of the column names (#1445). - Better error message when rtree is not installed (#1425).
- Fix bug in
GeoSeries.equals()(#1451). - Fix plotting of multi-part geometries with additional style keywords (#1385).
And we now have a Code of Conduct!
GeoPandas 0.8.0 is the last release to support Python 3.5. The next release will require Python 3.6, pandas 0.24, numpy 1.15 and shapely 1.6 or higher.
Support for Python 2.7 has been dropped. GeoPandas now works with Python >= 3.5.
The important API change of this release is that GeoPandas now requires
PROJ > 6 and pyproj > 2.2, and that the .crs attribute of a GeoSeries and
GeoDataFrame no longer stores the CRS information as a proj4 string or dict,
but as a pyproj.CRS object (#1101).
This gives a better user interface and integrates improvements from pyproj and PROJ 6, but might also require some changes in your code. Check the migration guide in the documentation.
Other API changes;
- The
GeoDataFrame.to_filemethod will now also write the GeoDataFrame index to the file, if the index is named and/or non-integer. You can use theindex=True/Falsekeyword to overwrite this default inference (#1059).
New features and improvements:
- A new
geopandas.clipfunction to clip a GeoDataFrame to the spatial extent of another shape (#1128). - The
geopandas.overlayfunction now works for all geometry types, including points and linestrings in addition to polygons (#1110). - The
plot()method gained support for missing values (in the column that determines the colors). By default it doesn't plot the corresponding geometries, but using the newmissing_kwdsargument you can specify how to style those geometries (#1156). - The
plot()method now also supports plotting GeometryCollection and LinearRing objects (#1225). - Added support for filtering with a geometry or reading a subset of the rows in
geopandas.read_file(#1160). - Added support for the new nullable integer data type of pandas in
GeoDataFrame.to_file(#1220).
Bug fixes:
GeoSeries.reset_index()now correctly results in a GeoDataFrame instead of DataFrame (#1252).- Fixed the
geopandas.sjoinfunction to handle MultiIndex correctly (#1159). - Fixed the
geopandas.sjoinfunction to preserve the index name of the left GeoDataFrame (#1150).
Small bug-fix release:
- Compatibility with Shapely 1.7 and pandas 1.0 (#1244).
- Fix
GeoDataFrame.fillnato accept non-geometry values again when there are no missing values in the geometry column. This should make it easier to fill the numerical columns of the GeoDataFrame (#1279).
Small bug-fix release fixing a few regressions:
- Fix a regression in passing an array of RRB(A) tuples to the
.plot()method (#1178, #1211). - Fix the
boundsandtotal_boundsattributes for empty GeoSeries, which also fixes the repr of an empty or all-NA GeoSeries (#1184, #1195). - Fix filtering of a GeoDataFrame to preserve the index type when ending up with an empty result (#1190).
Small bug-fix release fixing a few regressions:
- Fix
astypewhen converting to string with Multi geometries (#1145) or when converting a dataframe without geometries (#1144). - Fix
GeoSeries.fillnato acceptnp.nanagain (#1149).
Important note! This will be the last release to support Python 2.7 (#1031)
API changes:
-
A refactor of the internals based on the pandas ExtensionArray interface (#1000). The main user visible changes are:
- The
.dtypeof a GeoSeries is now a'geometry'dtype (and no longer a numpyobjectdtype). - The
.valuesof a GeoSeries now returns a customGeometryArray, and no longer a numpy array. To get back a numpy array of Shapely scalars, you can convert explicitly usingnp.asarray(..).
- The
-
The
GeoSeriesconstructor now raises a warning when passed non-geometry data. Currently the constructor falls back to return a pandasSeries, but in the future this will raise an error (#1085). -
The missing value handling has been changed to now separate the concepts of missing geometries and empty geometries (#601, 1062). In practice this means that (see the docs for more details):
GeoSeries.isnanow considers only missing values, and if you want to check for empty geometries, you can useGeoSeries.is_empty(GeoDataFrame.isnaalready only looked at missing values).GeoSeries.dropnanow actually drops missing values (before it didn't drop either missing or empty geometries)GeoSeries.fillnaonly fills missing values (behaviour unchanged).GeoSeries.alignuses missing values instead of empty geometries by default to fill non-matching index entries.
New features and improvements:
- Addition of a
GeoSeries.affine_transformmethod, equivalent of Shapely's function (#1008). - Addition of a
GeoDataFrame.rename_geometrymethod to easily rename the active geometry column (#1053). - Addition of
geopandas.show_versions()function, which can be used to give an overview of the installed libraries in bug reports (#899). - The
legend_kwdskeyword of theplot()method can now also be used to specify keywords for the color bar (#1102). - Performance improvement in the
sjoin()operation by reusing existing spatial index of the input dataframes, if available (#789). - Updated documentation to work with latest version of geoplot and contextily (#1044, #1088).
- A new
geopandas.optionsconfiguration, with currently a single option to control the display precision of the coordinates (options.display_precision). The default is now to show less coordinates (3 for projected and 5 for geographic coordinates), but the default can be overridden with the option.
Bug fixes:
- Also try to use
pysalinstead ofmapclassifyif available (#1082). - The
GeoDataFrame.astype()method now correctly returns aGeoDataFrameif the geometry column is preserved (#1009). - The
to_crsmethod now usesalways_xy=Trueto ensure correct lon/lat order handling for pyproj>=2.2.0 (#1122). - Fixed passing list-like colors in the
plot()method in case of "multi" geometries (#1119). - Fixed the coloring of shapes and colorbar when passing a custom
normin theplot()method (#1091, #1089). - Fixed
GeoDataFrame.to_fileto preserve VFS file paths (e.g. when a "s3://" path is specified) (#1124). - Fixed failing case in
geopandas.sjoinwith empty geometries (#1138).
In addition, the minimum required versions of some dependencies have been increased: GeoPandas now requires pandas >=0.23.4 and matplotlib >=2.0.1 (#1002).
- Compatibility with latest mapclassify version 2.1.0 (#1025).
Improvements:
-
Significant performance improvement (around 10x) for
GeoDataFrame.iterfeatures, which also improvesGeoDataFrame.to_file(#864). -
File IO enhancements based on Fiona 1.8:
- Support for writing bool dtype (#855) and datetime dtype, if the file format supports it (#728).
- Support for writing dataframes with multiple geometry types, if the file format allows it (e.g. GeoJSON for all types, or ESRI Shapefile for Polygon+MultiPolygon) (#827, #867, #870).
-
Compatibility with pyproj >= 2 (#962).
-
A new
geopandas.points_from_xy()helper function to convert x and y coordinates to Point objects (#896). -
The
bufferandinterpolatemethods now accept an array-like to specify a variable distance for each geometry (#781). -
Addition of a
relatemethod, corresponding to the shapely method that returns the DE-9IM matrix (#853). -
Plotting improvements:
- Performance improvement in plotting by only flattening the geometries if there are actually 'Multi' geometries (#785).
- Choropleths: access to all
mapclassifyclassification schemes and addition of theclassification_kwdskeyword in theplotmethod to specify options for the scheme (#876). - Ability to specify a matplotlib axes object on which to plot the color bar with the
caxkeyword, in order to have more control over the color bar placement (#894).
-
Changed the default provider in
geopandas.tools.geocodefrom Google (now requires an API key) to Geocode.Farm (#907, #975).
Bug fixes:
- Remove the edge in the legend marker (#807).
- Fix the
alignmethod to preserve the CRS (#829). - Fix
geopandas.testing.assert_geodataframe_equalto correctly compare left and right dataframes (#810). - Fix in choropleth mapping when the values contain missing values (#877).
- Better error message in
sjoinif the input is not a GeoDataFrame (#842). - Fix in
read_postgisto handle nullable (missing) geometries (#856). - Correctly passing through the
parse_dateskeyword inread_postgisto the underlying pandas method (#860). - Fixed the shape of Antarctica in the included demo dataset 'naturalearth_lowres' (by updating to the latest version) (#804).
Small bug-fix release for compatibility with the latest Fiona and PySAL releases:
- Compatibility with Fiona 1.8: fix deprecation warning (#854).
- Compatibility with PySAL 2.0: switched to
mapclassifyinstead ofPySALas dependency for choropleth mapping with theschemekeyword (#872). - Fix for new
overlayimplementation in case the intersection is empty (#800).
Improvements:
- Improved
overlayfunction (better performance, several incorrect behaviours fixed) (#429) - Pass keywords to control legend behavior (
legend_kwds) toplot(#434) - Add basic support for reading remote datasets in
read_file(#531) - Pass kwargs for
bufferoperation on GeoSeries (#535) - Expose all geopy services as options in geocoding (#550)
- Faster write speeds to GeoPackage (#605)
- Permit
read_filefiltering with a bounding box from a GeoDataFrame (#613) - Set CRS on GeoDataFrame returned by
read_postgis(#627) - Permit setting markersize for Point GeoSeries plots with column values (#633)
- Started an example gallery (#463, #690, #717)
- Support for plotting MultiPoints (#683)
- Testing functionality (e.g.
assert_geodataframe_equal) is now publicly exposed (#707) - Add
explodemethod to GeoDataFrame (similar to the GeoSeries method) (#671) - Set equal aspect on active axis on multi-axis figures (#718)
- Pass array of values to column argument in
plot(#770)
Bug fixes:
- Ensure that colorbars are plotted on the correct axis (#523)
- Handle plotting empty GeoDataFrame (#571)
- Save z-dimension when writing files (#652)
- Handle reading empty shapefiles (#653)
- Correct dtype for empty result of spatial operations (#685)
- Fix empty
sjoinhandling for pandas>=0.23 (#762)
Improvements:
- Improve plotting performance using
matplotlib.collections(#267) - Improve default plotting appearance. The defaults now follow the new matplotlib defaults (#318, #502, #510)
- Provide access to x/y coordinates as attributes for Point GeoSeries (#383)
- Make the NYBB dataset available through
geopandas.datasets(#384) - Enable
sjoinon non-integer-index GeoDataFrames (#422) - Add
cxindexer to GeoDataFrame (#482) GeoDataFrame.from_featuresnow also accepts a Feature Collection (#225, #507)- Use index label instead of integer id in output of
iterfeaturesandto_json(#421) - Return empty data frame rather than raising an error when performing a spatial join with non overlapping geodataframes (#335)
Bug fixes:
- Compatibility with shapely 1.6.0 (#512)
- Fix
fiona.filterresults when bbox is not None (#372) - Fix
dissolveto retain CRS (#389) - Fix
cxbehavior when using index of 0 (#478) - Fix display of lower bin in legend label of choropleth plots using a PySAL scheme (#450)
Improvements:
- Complete overhaul of the documentation
- Addition of
overlayto perform spatial overlays with polygons (#142) - Addition of
sjointo perform spatial joins (#115, #145, #188) - Addition of
__geo_interface__that returns a python data structure to represent theGeoSeriesas a GeoJSON-likeFeatureCollection(#116) anditerfeaturesmethod (#178) - Addition of the
explode(#146) anddissolve(#310, #311) methods. - Addition of the
sindexattribute, a Spatial Index using the optional dependencyrtree(libspatialindex) that can be used to speed up certain operations such as overlays (#140, #141). - Addition of the
GeoSeries.cxcoordinate indexer to slice a GeoSeries based on a bounding box of the coordinates (#55). - Improvements to plotting: ability to specify edge colors (#173), support for
the
vmin,vmax,figsize,linewidthkeywords (#207), legends for chloropleth plots (#210), color points by specifying a colormap (#186) or a single color (#238). - Larger flexibility of
to_crs, accepting both dicts and proj strings (#289) - Addition of embedded example data, accessible through
geopandas.datasets.get_path.
API changes:
- In the
plotmethod, theaxeskeyword is renamed toaxfor consistency with pandas, and thecolormapkeyword is renamed tocmapfor consistency with matplotlib (#208, #228, #240).
Bug fixes:
- Properly handle rows with missing geometries (#139, #193).
- Fix
GeoSeries.to_json(#263). - Correctly serialize metadata when pickling (#199, #206).
- Fix
mergeandconcatto return correct GeoDataFrame (#247, #320, #322).