Python tools for geographic data


GeoPandas Actions Status Coverage Status Join the chat at Binder DOI

Python tools for geographic data


GeoPandas is a project to add support for geographic data to pandas objects. It currently implements GeoSeries and GeoDataFrame types which are subclasses of pandas.Series and pandas.DataFrame respectively. GeoPandas objects can act on shapely geometry objects and perform geometric operations.

GeoPandas geometry operations are cartesian. The coordinate reference system (crs) can be stored as an attribute on an object, and is automatically set when loading from a file. Objects may be transformed to new coordinate systems with the to_crs() method. There is currently no enforcement of like coordinates for operations, but that may change in the future.

Documentation is available at (current release) and Read the Docs (release and development versions).


See the installation docs for all details. GeoPandas depends on the following packages:

  • pandas
  • shapely
  • fiona
  • pyproj

Further, matplotlib is an optional dependency, required for plotting, and rtree is an optional dependency, required for spatial joins. rtree requires the C library libspatialindex.

Those packages depend on several low-level libraries for geospatial analysis, which can be a challenge to install. Therefore, we recommend to install GeoPandas using the conda package manager. See the installation docs for more details.

Get in touch

  • Ask usage questions ("How do I?") on StackOverflow or GIS StackExchange.
  • Report bugs, suggest features or view the source code on GitHub.
  • For a quick question about a bug report or feature request, or Pull Request, head over to the gitter channel.
  • For less well defined questions or ideas, or to announce other projects of interest to GeoPandas users, ... use the mailing list.


>>> import geopandas
>>> from shapely.geometry import Polygon
>>> p1 = Polygon([(0, 0), (1, 0), (1, 1)])
>>> p2 = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])
>>> p3 = Polygon([(2, 0), (3, 0), (3, 1), (2, 1)])
>>> g = geopandas.GeoSeries([p1, p2, p3])
>>> g
0         POLYGON ((0 0, 1 0, 1 1, 0 0))
1    POLYGON ((0 0, 1 0, 1 1, 0 1, 0 0))
2    POLYGON ((2 0, 3 0, 3 1, 2 1, 2 0))
dtype: geometry

Example 1

Some geographic operations return normal pandas object. The area property of a GeoSeries will return a pandas.Series containing the area of each item in the GeoSeries:

>>> print(g.area)
0    0.5
1    1.0
2    1.0
dtype: float64

Other operations return GeoPandas objects:

>>> g.buffer(0.5)
0    POLYGON ((-0.3535533905932737 0.35355339059327...
1    POLYGON ((-0.5 0, -0.5 1, -0.4975923633360985 ...
2    POLYGON ((1.5 0, 1.5 1, 1.502407636663901 1.04...
dtype: geometry

Example 2

GeoPandas objects also know how to plot themselves. GeoPandas uses matplotlib for plotting. To generate a plot of our GeoSeries, use:

>>> g.plot()

GeoPandas also implements alternate constructors that can read any data format recognized by fiona. To read a zip file containing an ESRI shapefile with the boroughs boundaries of New York City (GeoPandas includes this as an example dataset):

>>> nybb_path = geopandas.datasets.get_path('nybb')
>>> boros = geopandas.read_file(nybb_path)
>>> boros.set_index('BoroCode', inplace=True)
>>> boros.sort_index(inplace=True)
>>> boros
               BoroName     Shape_Leng    Shape_Area  \
1             Manhattan  359299.096471  6.364715e+08
2                 Bronx  464392.991824  1.186925e+09
3              Brooklyn  741080.523166  1.937479e+09
4                Queens  896344.047763  3.045213e+09
5         Staten Island  330470.010332  1.623820e+09

1         MULTIPOLYGON (((981219.0557861328 188655.31579...
2         MULTIPOLYGON (((1012821.805786133 229228.26458...
3         MULTIPOLYGON (((1021176.479003906 151374.79699...
4         MULTIPOLYGON (((1029606.076599121 156073.81420...
5         MULTIPOLYGON (((970217.0223999023 145643.33221...

New York City boroughs

>>> boros['geometry'].convex_hull
1    POLYGON ((977855.4451904297 188082.3223876953,...
2    POLYGON ((1017949.977600098 225426.8845825195,...
3    POLYGON ((988872.8212280273 146772.0317993164,...
4    POLYGON ((1000721.531799316 136681.776184082, ...
5    POLYGON ((915517.6877458114 120121.8812543372,...
dtype: geometry

Convex hulls of New York City boroughs

  • WIP - Cythonize geometry series operations

    WIP - Cythonize geometry series operations

    This cythonizes a class of geometry operations within geoseries. It builds off of @jorisvandenbossche notebook in #430 by extending the set of operations and setting up a proper build environment.

    Some things to note

    1. There is a Cython build setup provided by @eriknw
    2. Cython code is only used if available, falling back on the previous Python solution
    3. @wmay has another attempt at
    4. I get around a 50-100x speedup on a simple comparison
    5. There are some inconsistencies between this and what shapely does that I haven't yet tracked won
    6. There are still plenty of operations to do. This just expands on @jorisvandenbossche 's work
    opened by mrocklin 103
  • FYI: Installing geopandas with conda

    FYI: Installing geopandas with conda

    Command for installing geopandas in conda is: conda install -c geopandas

    Copied from comment below: there is some extra complexity due to a broken fiona package. The below is a working recipe to get geopandas installed on Windows:

    # need fiona with gdal < 2 (it's not yet compatible, although conda tries to install gdal 2)
    conda install fiona "libgdal<2.0"
    # basic dependencies -> this possibly needs to reinstall numpy to ensure it's the correct version that pandas needs (fiona downgrades numpy, leaving an already install pandas possibly broken)
    conda install pandas matplotlib
    # install shapely and pyproj from ioos + its dependecies
    conda install -c ioos shapely pyproj
    # install geopandas and descarted from ioos without updating its dependencies -> tries to update fiona/pyproj -> see problems above
    conda install -c ioos geopandas descartes --no-deps
    opened by BKJackson 86
  • Overlay performance

    Overlay performance

    This PR addresses #338, #400 and #343 (related also to #330, #233, #404)

    I changed the overlay function, but kept the old one as overlay_slow. Additionally, I added test_overlay2 and some qgis generated files in datasets for testing. There is an issue with union and ident, which fail in the tests in test_overlay, which uses the Borrows shapefile, while it passes the same tests in test_overlay2 when creating basic polygons. It seems the qgis generated union for the borrows data is not too clean (e.g., missing geometries), so test_overlay2 seems to be correct and shows the function performing correctly.

    Closes #338, closes #400, closes #666

    opened by ozak 70
  • Follow-up -  Refactor cythonize geometry series operations

    Follow-up - Refactor cythonize geometry series operations

    UPDATE: the cython effort has been shifted to the PyGEOS package (to be integrated into Shapely), and a PR has recently landed in master with optional support for that (will be released as GeoPandas 0.8). See and for some docs.

    I merged in

    Status: an initial implementation of the refactor ( has been merged in the geopandas-cython branch, leaving master currently as the 'stable' branch. Further improvements can be done by PR, but targeting this geopandas-cython branch (when you open a PR, you can choose the base branch).

    A bit more background on the new implementation we are trying out: we made a vectorized geometry object GeometryArray (array-like with vectorized operations) in cython in geopandas. This vectorized geometry object only holds the integer pointers as its data, and only boxes it to shapely objects when the user accesses eg a single element, or iterates over it, ... This makes it fast and cheaper to construct.

    To integrate this in the GeoDataFrame and GeoSeries, we implemented a new GeometryBlock ('blocks' are the internal building block of pandas for the different columns). The reason we need a custom GeometryBlock, is because we need to have a way to let pandas know the data are not just normal integers we store in the dataframe (it are pointers to geometry objects), and cannot be manipulated as it were integers.

    Some known to do items:

    • [ ] fix remaining failings tests
    • [x] make installation / building easier (eg automatically finding geos location ->
    • [ ] some changes will be needed to pandas (eg to support concat)
    • [ ] implement cythonized/vectorized io functionality (shapefiles, geojson, x/y from csv/df)
    • [x] create an asv benchmark suite to track progress / improvement over master (this should first be merged in master) ->
    • [ ] update conda recipe (maybe we can use conda-forge to provide 'beta' builds)
    • [ ] get appveyor working to test on windows
    • [ ] add a GeometryArray.unique method (then GeoSeries.unique will work automatically)

    cc @mrocklin @sgillies @kjordahl @jdmcbr @kuanb @eriknw

    opened by jorisvandenbossche 68
  • ENH: Add clip module

    ENH: Add clip module

    Hi Again @jorisvandenbossche


    This PR is the beginning of adding the clip module to geopandas. As i began to copy things over, i noticed that the data used in our vignette uses data downloaded with an earthpy function. So I will need to refactor it to work here. @nkorinek is actually working on that here:

    So this is also a WIP PR. so far tests for this module are working just fine but I want to see what CI has to say as well. I noticed some of the other tests are failing locally but they have nothing to do with what i am adding here. Excited to see this functionality in GeoPandas!! This pr complements #1127 where i'm updating docs as I contribute.

    please say the word if something needs to be changed, fixed, etc!!

    Closes #956, closes #821

    opened by lwasser 59
  • DOC: add sphinx gallery for examples

    DOC: add sphinx gallery for examples

    This PR converts some of the documentation to examples using the sphinx-gallery plugin. This does a couple of things:

    1. Converts many of the examples in .rst files (that were using .. ipython:: blocks) into proper python files with rst embedded as comments
    2. Generates a gallery of images showing off example outputs
    3. Converts python files with embedded rST into a rendered HTML output
    4. Creates jupyter notebooks for each example as well, to go along with the python file
    5. Embeds examples in documentation stub pages
    6. Makes (some) methods/classes/etc clickable links in the rendered examples.

    This PR is still somewhat WIP, but this is a general idea of what it'd look like:

    And here's an example of the examples listed in an API stub page:

    Let me know what folks think and/or if this is worth me spending more time to refine. I think it'd be a nice step towards making the documentation more user-friendly! Comments welcome!

    Note: In general this does not change the content of any examples, it only converts them to python. I think that changing the example content itself should be done in another PR if folks want this.

    opened by choldgraf 55
  • ENH: Add parquet IO support

    ENH: Add parquet IO support

    This PR adds support for reading and writing GeoDataFrames to parquet files, based in part on initial development by @darcy-r (

    In summary, any geometry columns present are converted to WKB format for serialization in parquet. We retain their original column names throughout.

    We use metadata in the parquet file to store the CRS (JSONified dict), primary geometry column name, and a list of all geometry column names. This functionality supports GeoDataFrames with multiple geometry columns.

    This metadata is stored in a geo key in the metadata, and should support interoperability with R.

    This approach leverages the existing parquet support from pandas but overrides the read / write functions so that we can handle the geospatial specific stuff.

    Note: I only provided an implementation using pyarrow, as it does not appear that fastparquet provides an API that allows us to read / write metadata. However, I used the same overall approach as is used in pandas to make it easier to add fastparquet support at a later time, if such functionality becomes available.

    We may completely remove feather support from this PR and wait for better support from pyarrow for writing metadata with CRS and geometry column names, per comment in #651

    (for now please ignore the feather implementation, it has not yet been standardized with the parquet approach)

    I'd like to run some benchmarks comparing parquet to feather before we decide to keep / remove feather support.

    resolves #651

    opened by brendan-ward 51
  • ENH: sjoin_nearest

    ENH: sjoin_nearest

    This is a really rough pass for now, not much in the way of tests or docs, just trying to get some general feedback on the shape of the implementation as well as timelines to incorporate it (eg. wait for a PyGEOS release).

    This addresses the following:

    • Closes #1096
    • Closes #1271 (replaces)

    Some questions I have:

    • Do we want to support the max_distance parameter via nearest_all? I think @brendan-ward can best weigh in on this.
    • Do we want to cook up a "reasonable" implementation for rtree, like we did with query_bulk? I'd say no, in that case we mainly did it because that logic already existed in sjoin so really we were reshuffling things to get a cleaner implementation, not inventing anything new. This relates to #1509
    • Is there any particular way we want to choose which is the index and which is the input geometries? I went with the simplest I could think of, but there's probably better choices for performance. Again, I think @brendan-ward is probably the best person for this.
    • How much testing do we want for this feature? My sense is that not much should be needed since _basic_checks and _frame_join are already extensively tested, and the actual nearest logic is tested in PyGEOS.
    opened by adriangb 48
  • DRAFT: add 'nearest' option to sjoin

    DRAFT: add 'nearest' option to sjoin

    This PR is based on the discussion in issue #1096. The conversation seemed to die without a real consensus, so I tried to take a general idea and package it into something concrete.

    The main things I think should be discussed are:

    1. API. I'm not dead set on this one. It's simple (only the report_dist parameter is added, compatibility is preserved) but @martinfleis had proposed making nearest a pseudo-option when using op="intersection".
    2. Using the rtree spatial index to pre-determine intersecting geometries. From my testing, this is not worth it, but I only tested with small datasets.
    3. Use of how="right" in conjunction with op="nearest". Since nearest isn't as clean mathematically as intersection or within/contains, how="right" doesn't make as much sense as it does with those. I'm not a fan of having to add that warning/check during the final join operation.
    4. Integration into sjoin. The way I structured things, it's basically saying:
      if op=="nearest":
          # do new stuff
         # do all of the old stuff

      While nearest is a departure from the existing op (which map directly to binary predicates), it doesn't feel nicely integrated to have to split the logic up like this.

    Thank you all for your patience on this PR, it's my first one for this project.

    opened by adriangb 48
  • More on overlay performance

    More on overlay performance

    This is just a follow up to #338, but wanted to make sure someone sees my posts. I was trying to use overlay and noticed it is impossibly slow. So I ended up coding some functions to take care of this. Using the example in #338 I tested and the new functions are much faster, so I am wondering if there is interest and I could create a pull that improves performance. Here's the function (for now it only implements intersection and difference, but I could generalize it):

    def spatial_overlays(df1, df2, how='intersection'):
        '''Compute overlay intersection of two 
            GeoPandasDataFrames df1 and df2
        df1 = df1.copy()
        df2 = df2.copy()
        df1['geometry'] = df1.geometry.buffer(0)
        df2['geometry'] = df2.geometry.buffer(0)
        if how=='intersection':
            # Spatial Index to create intersections
            spatial_index = df2.sindex
            df1['bbox'] = df1.geometry.apply(lambda x: x.bounds)
            df1['histreg']=df1.bbox.apply(lambda x:list(spatial_index.intersection(x)))
            pairs = df1['histreg'].to_dict()
            nei = []
            for i,j in pairs.items():
                for k in j:
            pairs = gp.GeoDataFrame(nei, columns=['idx1','idx2'],
            pairs = pairs.merge(df1, left_on='idx1', right_index=True)
            pairs = pairs.merge(df2, left_on='idx2', right_index=True, suffixes=['_1','_2'])
            pairs['Intersection'] = pairs.apply(lambda x: (x['geometry_1'].intersection(x['geometry_2'])).buffer(0), axis=1)
            pairs = gp.GeoDataFrame(pairs, columns=pairs.columns,
            cols = pairs.columns.tolist()
            dfinter = pairs[cols+['Intersection']].copy()
            dfinter.rename(columns={'Intersection':'geometry'}, inplace=True)
            dfinter = gp.GeoDataFrame(dfinter, columns=dfinter.columns,
            dfinter = dfinter.loc[dfinter.geometry.is_empty==False]
            return dfinter
        elif how=='difference':
            spatial_index = df2.sindex
            df1['bbox'] = df1.geometry.apply(lambda x: x.bounds)
            df1['histreg']=df1.bbox.apply(lambda x:list(spatial_index.intersection(x)))
            df1['new_g'] = df1.apply(lambda x: reduce(lambda x, y: x.difference(y).buffer(0), [x.geometry]+list(df2.iloc[x.histreg].geometry)) , axis=1)
            df1.geometry = df1.new_g
            df1 = df1.loc[df1.geometry.is_empty==False].copy()
            df1.drop(['bbox', 'histreg', new_g], axis=1, inplace=True)
            return df1

    and the example

    import geopandas as gpd
    world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
    capitals = gpd.read_file(gpd.datasets.get_path('naturalearth_cities'))
    countries = world[['geometry', 'name']]
    countries = countries.to_crs('+init=epsg:3395')[!="Antarctica"]
    capitals = capitals.to_crs('+init=epsg:3395')
    capitals['geometry']= capitals.buffer(500000)
    %time gpd.overlay(countries, capitals, how='intersection')
    CPU times: user 36.5 s, sys: 357 ms, total: 36.8 s
    Wall time: 38.8 s
    %time spatial_overlays(countries, capitals, how='intersection')
    CPU times: user 1.53 s, sys: 11.3 ms, total: 1.54 s
    Wall time: 1.59 s

    As you can see an major improvement in performance due to the use of the spatial index.

    opened by ozak 46
  • Implement plotting using matplotlib Collections

    Implement plotting using matplotlib Collections

    ~~This doesn't use Collection.set_array() because I can't find a way to share the same colorscale across different collection types (i.e. geometry types). To keep different collections in sync with the same colorbar, we must resolve every geometry's colors globally.~~ (Fixed below in 17313dc) But we still gain the performance benefit from using collections.

    ~~This also adds a legend for noncategorical dataframes. However I deprecated facecolor kwarg because it conflicts with color; discussion for this is at #204.~~

    Given that TestImageComparisons caused us so much trouble in Travis, and the new plotting mechanism requires re-generating these plots, I dropped this method of testing. If there are objections, let's discuss the options.

    • [x] ~~Fix plotting Polygon holes. (I've no idea how to do this in a PolygonPatch...)~~ (broken on master too, so deferring to a different PR)
    • [x] Replace a test for plot(figsize=(...)), which I removed when removing TestImageComparisons.
    • [x] Smoketest PySAL support
    • [x] Add tests for heterogeneous geometry types in a single GeoSeries.
    • [x] Compatibility with mpl < 1.5

    Fixes #172 (except for #266 which existed even before this PR) Fixes #259 Fixes #204

    opened by IamJeffG 43
  • ENH: Markersize Legend

    ENH: Markersize Legend

    It would be nice to have a marker size legend function like below, image see plotly example

    The legend mark size will be scaled according to the real value.

    Some related questions can be found, here

    opened by wybert 0
  • DOC/MAINT: GeoPandas roadmap draft

    DOC/MAINT: GeoPandas roadmap draft

    This is a proposal of a roadmap for the GeoPandas project (not covering sub-projects) resulting from the discussions during the GeoPandas community calls.

    Feel free to open a discussion on a removal of individual goals or moving them between the milestones. If you have another suggestion on what would you like to see on a roadmap, feel free to suggest it here or open a separate issue for a discussion (not everything needs to be included in the first version but we need one for NumFocus in about 2 weeks).

    I would like to merge the first version in relatively soon, ideally during the first week of October or sooner.

    cc @geopandas/collaborators

    opened by martinfleis 0
  • ENH: Improve error message for attempting to write multiple geometry columns using `to_file`

    ENH: Improve error message for attempting to write multiple geometry columns using `to_file`

    xref #2565

    In [16]: gdf = gpd.GeoDataFrame({"a":[1,2]}, geometry=[Point(1,1), Point(1,2)])
    In [17]: gdf['geom2'] = gdf.geometry
    In [18]: gdf.to_file("tmp.gpkg")
    File ...\venv\lib\site-packages\geopandas\io\, in infer_schema.<locals>.convert_type(column, in_type)
        594     out_type = types[str(in_type)]
        595 else:
    --> 596     out_type = type(np.zeros(1, in_type).item()).__name__
        597 if out_type == "long":
        598     out_type = "int"
    TypeError: Cannot interpret '<geopandas.array.GeometryDtype object at 0x0000025FA88908E0>' as a data type
    enhancement good first issue 
    opened by m-richards 0
  • explore with marker_kwds  radius sequence support

    explore with marker_kwds radius sequence support

    I wish I could use geopandas to plot some point data, mapping one of the columns as the maker radius. The function is similar as the .plot function with the makersize parameter. It would be nice if we can use the .explore function to do the same.

    For example, with .plot

    gdf.plot(column="cool ",markersize=gdf["size"]);

    I want the same with .explore ,

    gdf.plot(column="cool ", marker_kwds={"radius":   gdf["size"] })

    For now, the first one will work but the second one is not working. I can only set the radius as a float number.

    opened by wybert 2
  • Minor typo in docs

    Minor typo in docs

    "Returns a GeoSeries of lower dimensional objects representing each geometries’s set-theoretic boundary."

    "geometries’s" ought to be "geometry's"

    good first issue documentation 
    opened by william-chu-github 0
  • CRSError: Invalid projection: EPSG:4326 :

    CRSError: Invalid projection: EPSG:4326 :

    Re closed issue #1887

    #### Problem description
    I have a clean new virtual environment, everything installed with conda forge,  except geojson was pip installed ) still getting this error
    CRSError: Invalid projection: EPSG:4326 (Internal Proj Error: proj_create: no database context specified)
    pyproj 3.3.0
    geopandas 0.11.1
    the virtual enviornment also has folium, shapely, pandas, branca, ipykernel
     nbh_geo_df = gpd.read_file('inputs/airbnb_neighbourhoods.geojson', driver='GeoJSON')[['neighbourhood', 'geometry']]
    bug needs triage 
    opened by numeric-lee 3
  • v0.11.1(Jul 24, 2022)

    Small bug-fix release:

    • Fix regression (RecursionError) in reshape methods such as unstack() and pivot() 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 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).
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.11.1.tar.gz(1018.98 KB)
  • v0.11.0(Jun 21, 2022)

    Highlights of this release:

    • The 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).
    • 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 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())
      • If operations produce a DataFrame containing no GeometryDtype columns, a DataFrame is returned (this can be upcast again by calling set_geometry() or the GeoDataFrame constructor)
      • If operations produce a Series of GeometryDtype, a GeoSeries is returned, otherwise Series 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).
    • 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:

    • The active development branch of geopandas on GitHub has been renamed from master to main (#2277).
    • Deprecated methods 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).
    • Deprecated CRS functions explicit_crs_from_epsg(), epsg_from_crs() and get_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 underlying GeometryArray now raises a ValueError (#2100).
    • Specifying a CRS in the 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)
    • Passing non-geometry data to theGeoSeries constructor is now fully deprecated and will raise a TypeError (#2314). Previously, a pandas.Series was returned for non-geometry data.
    • Deprecated GeoSeries/GeoDataFrame set operations __xor__(), __or__(), __and__() and __sub__(), and now emit FutureWarning instead of DeprecationWarning and will be completely removed in a future release.
    • Accessing the 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)
    • Fix pickle files created with pygeos installed can not being readable when pygeos is not installed (#2237).
    • Fixed UnboundLocalError in GeoDataFrame.plot() using legend=True and missing_kwds (#2281).
    • Fix explode() incorrectly relating index to columns, including where the input index is not unique (#2292)
    • Fix GeoSeries.[xyz] raising an IndexError when the underlying GeoSeries contains empty points (#2335). Rows corresponding to empty points now contain np.nan.
    • Fix GeoDataFrame.iloc raising a TypeError when indexing a GeoDataFrame with only a single column of GeometryDtype (#1970).
    • Fix GeoDataFrame.iterfeatures() not returning features with the same field order as GeoDataFrame.columns (#2396).
    • Fix GeoDataFrame.from_features() to support reading GeoJSON with null properties (#2243).
    • Fix GeoDataFrame.to_parquet() not intercepting engine keyword argument, breaking consistency with pandas (#2227)
    • Fix GeoDataFrame.explore() producing an error when column 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 using GeoDataFrame rather than cls as the constructor.
    • Fix GeoDataFrame.plot() producing incorrect colors with mixed geometry types when colors 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)


    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
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.11.0.tar.gz(1018.12 KB)
  • v0.10.2(Oct 16, 2021)

    Small bug-fix release:

    • Fix regression in overlay() in case no geometries are intersecting (but have overlapping total bounds) (#2172).
    • Fix regression in overlay() with keep_geom_type=True in case the overlay of two geometries in a GeometryCollection with other geometry types (#2177).
    • Fix overlay() to honor the keep_geom_type keyword for the op="differnce" case (#2164).
    • Fix regression in plot() with a mapclassify scheme in case the formatted legend labels have duplicates (#2166).
    • Fix a bug in the explore() method ignoring the vmin and vmax 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).
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.10.2.tar.gz(1003.68 KB)
  • v0.10.1(Oct 8, 2021)

  • v0.10.0(Oct 3, 2021)

    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, the sindex 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 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).
    • 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 in read_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 ( (#2007).

    Deprecations and compatibility notes:

    • The 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).
    • The cascaded_union attribute is deprecated, use unary_union instead (#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 new index_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 and to_from_wkt (#1891).
    • Fix to_file() and to_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 in plot() (#2127).
    • Fix GeoDataFrame.explode() to preserve attrs (#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


    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 +
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.10.0.tar.gz(1002.67 KB)
  • v0.9.0(Feb 28, 2021)

    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 the kind keyword or the accessor method (e.g. gdf.plot(kind="bar") or (#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 accepts geometry and crs keywords (#1619).
    • GeoDataFrame.to_postgis() and geopandas.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 new align keyword which allows optionally not aligning on the index before performing the operation with align=False (#1668).
    • The GeoDataFrame.dissolve() method now supports all relevant keywords of groupby(), i.e. the level, sort, observed and dropna keywords (#1845).
    • The geopandas.overlay() function now accepts make_valid=False to skip the step to ensure the input geometries are valid using buffer(0) (#1802).
    • The 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).
    • A new aspect keyword in the plotting methods to optionally allow retaining the original aspect (#1512)
    • A new 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).
    • 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() 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:

    • 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 the intersection() method of the GeoDataFrame/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 using legend_kwds with multiple subplots (#1583)
    • Fix spurious warning with missing_kwds keyword of the plot() method when there are no areas with missing data (#1600).
    • Fix the plot() method to correctly align values passed to the column 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 the convert_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).


    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 +
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.9.0.tar.gz(968.49 KB)
  • v0.8.2(Jan 25, 2021)

  • v0.8.1(Jul 15, 2020)

    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!

    Source code(tar.gz)
    Source code(zip)
    geopandas-0.8.1.tar.gz(938.98 KB)
  • v0.8.0(Jun 24, 2020)

    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_geometry keyword in read_file to only read the attribute data. If set to True, a pandas DataFrame without geometry is returned (#1383).
      • geopandas.read_file now supports reading from file-like objects (#1329).
      • GeoDataFrame.to_file now supports specifying the CRS to write to the file (#802). By default it still uses the CRS of the GeoDataFrame.
      • New chunksize keyword in geopandas.read_postgis to read a query in chunks (#1123).
    • 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 attribute continues to returns the CRS of the "active" geometry column. The CRS of other geometry columns can be accessed from the column itself (eg gdf["other_geom_column"].crs) (#1339).
      • New set_crs() method on GeoDataFrame/GeoSeries to set the CRS of naive geometries (#747).
    • 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 GeoDataFrame plot(), we now honor all categories and its order (#1483). In addition, a new categories keyword allows to specify all categories and their order otherwise (#1173).
      • For choropleths using a classification scheme (using scheme=), the legend_kwds accept two new keywords to control the formatting of the legend: fmt with a format string for the bin edges (#1253), and labels to pass fully custom class labels (#1302).
    • New covers() and covered_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).


    • 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_crs method to override an existing CRS. See the docs.
    • The helper functions in the geopandas.plotting module are deprecated for public usage (#656).
    • The functions are deprecated, use the top-level read_file and to_file instead (#1407).
    • The set operators (&, |, ^, -) are deprecated, use the intersection(), union(), symmetric_difference(), difference() methods instead (#1255).
    • The sindex for empty dataframe will in the future return an empty spatial index instead of None (#1438).
    • The objects keyword in the intersection method of the spatial index returned by the sindex attribute 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.clip when masking with non-overlapping area resulting in an empty GeoDataFrame (#1309, #1365).
    • Fix error in geopandas.sjoin when joining on an empty geometry column (#1318).
    • CRS related fixes: pandas.concat preserves CRS when concatenating GeoSeries objects (#1340), preserve the CRS in geopandas.clip (#1362) and in GeoDataFrame.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.


    Thanks to everyone who contributed to this release! A total of 28 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
    • Bhavika Tekwani +
    • Bo-Deng +
    • Brendan Ward
    • Christopher Yeh +
    • Geir Arne Hjelle
    • Henrikki Tenkanen +
    • Ian Rose
    • James McBride
    • Joris Van den Bossche
    • Julia Signell +
    • Kyle Barron +
    • Martin Fleischmann
    • Martin Jul +
    • Mateusz Konieczny +
    • Mike Taves
    • Oliver Schillinger +
    • Rowan Molony +
    • Sergio Rey
    • SylvainLan +
    • TimothyLucas +
    • abonte +
    • harryposner +
    • pietro +
    • raphacosta27 +
    • rwijtvliet +
    • sangarshanan
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.8.0.tar.gz(938.47 KB)
  • v0.7.0(Feb 17, 2020)

    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_file method will now also write the GeoDataFrame index to the file, if the index is named and/or non-integer. You can use the index=True/False keyword to overwrite this default inference (#1059).

    New features and improvements:

    • A new geopandas.clip function to clip a GeoDataFrame to the spatial extent of another shape (#1128).
    • The geopandas.overlay function 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 new missing_kwds argument 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.sjoin function to handle MultiIndex correctly (#1159).
    • Fixed the geopandas.sjoin function to preserve the index name of the left GeoDataFrame (#1150).


    Thanks to everyone who contributed to this release! A total of 12 people contributed patches to this release. People with a "+" by their names contributed a patch for the first time.

    • Alan D. Snow
    • Aleksey Bilogur
    • Ardie Orden +
    • Brendan Ward +
    • Brett Naul
    • James McBride
    • Joris Van den Bossche
    • Leah Wasser
    • Martin Fleischmann
    • Mike Taves
    • jess +
    • sangarshanan +
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.7.0.tar.gz(905.59 KB)
  • v0.6.3(Feb 6, 2020)

    Small bug-fix release:

    • Compatibility with Shapely 1.7 and pandas 1.0 (#1244).
    • Fix GeoDataFrame.fillna to 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).
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.6.3.tar.gz(899.08 KB)
  • v0.6.2(Nov 18, 2019)

    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 bounds and total_bounds attributes 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).
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.6.2.tar.gz(898.70 KB)
  • v0.6.1(Oct 12, 2019)

  • v0.6.0(Sep 27, 2019)

    GeoPandas 0.6.0 features a refactor of the internals based on the new pandas ExtensionArray interface, for better integration with pandas. Although this change should keep the user interface mostly stable, there are a few changes summarized below. Further, this release includes a nice set of other improvements and bug fixes.

    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). Read more on that in this blogpost, and the main user visible changes are:
      • The .dtype of a GeoSeries is now a 'geometry' dtype (and no longer a numpy object dtype).
      • The .values of a GeoSeries now returns a custom GeometryArray, and no longer a numpy array. To get back a numpy array of Shapely scalars, you can convert explicitly using np.asarray(..).
    • The GeoSeries constructor now raises a warning when passed non-geometry data. Currently the constructor falls back to return a pandas Series, 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.isna now considers only missing values, and if you want to check for empty geometries, you can use GeoSeries.is_empty (GeoDataFrame.isna already only looked at missing values).
      • GeoSeries.dropna now actually drops missing values (before it didn't drop either missing or empty geometries)
      • GeoSeries.fillna only fills missing values (behaviour unchanged).
      • GeoSeries.align uses missing values instead of empty geometries by default to fill non-matching index entries.

    New features and improvements:

    • Addition of a GeoSeries.affine_transform method, equivalent of Shapely's function (#1008).
    • Addition of a GeoDataFrame.rename_geometry method 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_kwds keyword of the plot() method can now also be used to specify keywords for the color bar (#1102).
    • Performance improvement in the sjoin() operation by re-using 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.options configuration, 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 pysal instead of mapclassify if available (#1082).
    • The GeoDataFrame.astype() method now correctly returns a GeoDataFrame if the geometry column is preserved (#1009).
    • The to_crs method now uses always_xy=True to 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 norm in the plot() method (#1091, #1089).
    • Fixed GeoDataFrame.to_file to preserve VFS file paths (e.g. when a "s3://" path is specified) (#1124).
    • Fixed failing case in geopandas.sjoin with 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).


    Thanks to everyone who contributed to this release! A total of 20 people contributed patches to this release. People with a "+" by their names contributed a patch for the first time.

    • Alan D. Snow +
    • Aleksey Bilogur
    • Archana Alva +
    • François Leblanc
    • Geir Arne Hjelle
    • Ian Rose +
    • James Gaboardi +
    • James McBride
    • Joris Van den Bossche
    • Joshua Wilson
    • Kushal Borkar +
    • Leah Wasser
    • Martin Fleischmann
    • Mike Taves +
    • René Buffat +
    • Sergio Rey +
    • Thomas Pinder +
    • awa5114 +
    • donlo +
    • jbrockmendel +
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.6.0.tar.gz(896.99 KB)
  • v0.5.1(Jul 11, 2019)

  • v0.5.0(Apr 25, 2019)

    GeoPandas 0.5.0 includes some improvements for writing files with fiona (better performance, better support for data types and mixed geometry types), along with many other new features and bug fixes, see the full list below.


    • Significant performance improvement (around 10x) for GeoDataFrame.iterfeatures, which also improves GeoDataFrame.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 buffer and interpolate methods now accept an array-like to specify a variable distance for each geometry (#781).
    • Addition of a relate method, 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 mapclassify classification schemes and addition of the classification_kwds keyword in the plot method to specify options for the scheme (#876).
      • Ability to specify a matplotlib axes object on which to plot the color bar with the cax keyword, in order to have more control over the color bar placement (#894).
    • Changed the default provider in from Google (now requires an API key) to Geocode.Farm (#907, #975).

    Bug fixes:

    • Remove the edge in the legend marker (#807).
    • Fix the align method to preserve the CRS (#829).
    • Fix geopandas.testing.assert_geodataframe_equal to correctly compare left and right dataframes (#810).
    • Fix in choropleth mapping when the values contain missing values (#877).
    • Better error message in sjoin if the input is not a GeoDataFrame (#842).
    • Fix in read_postgis to handle nullable (missing) geometries (#856).
    • Correctly passing through the parse_dates keyword in read_postgis to the underlying pandas method (#860).
    • Fixed the shape of Antarctica in the included demo dataset 'naturalearth_lowres' (by updating to the latest version) (#804).


    Thanks to everyone who contributed to this release! A total of 33 people contributed to this release. People with a "+" by their names contributed a patch for the first time.

    • Andy Garfield +
    • Benjamin Goldenberg +
    • Brett Naul +
    • Brian Lewis +
    • Dmitry Nikolaev +
    • Dr Martin Black +
    • Filipe
    • Geir Arne Hjelle
    • Géraud +
    • Henry Walshaw +
    • James McBride
    • Jesse Pisel +
    • Joris Van den Bossche
    • Joshua Wilson
    • Justin Shenk +
    • Kris Vanhoof +
    • Leah Wasser +
    • Levi John Wolf
    • Martin Fleischmann +
    • Matthieu Viry +
    • Philipp Kats +
    • Pratap Vardhan +
    • Pulkit Maloo +
    • Raphael Delhome +
    • Sean Gillies
    • Simon Andersson +
    • TimoRoth +
    • Yohann Rebattu +
    • YuichiNotoya +
    • byrman +
    • lmmarsano +
    • Émile Nadeau +
    • Ömer Özak
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.5.0.tar.gz(876.09 KB)
  • v0.4.1(Mar 6, 2019)

    Small bug-fix release for compatibility with the latest Fiona and PySAL releases:

    • Compatibility with Fiona 1.8: fix deprecation warning (#854 and #916).
    • Compatibility with PySAL 2.0: switched to mapclassify instead of PySAL as dependency for choropleth mapping with the scheme keyword (#872).
    • Fix for new overlay implementation in case the intersection is empty (#800).


    A total of 7 people contributed to this release. People with a "+" by their names contributed a patch for the first time.

    • Filipe
    • Joris Van den Bossche
    • Kris Vanhoof +
    • Martin Fleischmann +
    • Simon Andersson +
    • TimoRoth +
    • Ömer Özak
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.4.1.tar.gz(884.17 KB)
  • v0.4.0(Jul 16, 2018)

    GeoPandas 0.4.0 improves the overlay functionality (much better performance, and fixed behaviour for certain cases). This can possibly change results you obtained before, but likely more correct now. But given this change, please test and feedback welcome! Further, there is a long list of other new features and bug fixes, see below.

    GeoPandas can be installed with conda from the conda-forge channel (conda install -c conda-forge geopandas) or with pip assuming the dependencies are available for your platform (pip install geopandas).


    • Improved overlay function (better performance, several incorrect behaviours fixed) (#429)
    • Pass keywords to control legend behavior (legend_kwds) to plot (#434)
    • Add basic support for reading remote datasets in read_file (#531)
    • Pass kwargs for buffer operation on GeoSeries (#535)
    • Expose all geopy services as options in geocoding (#550)
    • Faster write speeds to GeoPackage (#605)
    • Permit read_file filtering 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 functionalty (e.g. assert_geodataframe_equal) is now publicly exposed (#707)
    • Add explode method 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 sjoin handling for pandas>=0.23 (#762)


    Thanks to everyone who contributed to this release! A total of 26 people contributed to this release. People with a "+" by their names contributed a patch for the first time.

    • Aleksey Bilogur
    • Andrew Feierman +
    • Benjamin Root +
    • Chris Holdgraf
    • Christopher Ren +
    • Dani Arribas-Bel
    • Dmitri Lebedev +
    • Edward Betts +
    • Elliott Sales de Andrade +
    • Fabien Maussion +
    • Filipe +
    • François Leblanc +
    • Geir Arne Hjelle +
    • James McBride
    • Joris Van den Bossche
    • Joshua Wilson +
    • Levi John Wolf +
    • Ramiro Gómez +
    • Robert Gieseke +
    • Rutger Hofste +
    • Tim Tröndle
    • balmandhunter +
    • mrahim +
    • pinto531 +
    • robochat +
    • Ömer Özak +
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.4.0.tar.gz(883.83 KB)
  • v0.3.0(Aug 28, 2017)


    • 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 sjoin on non-integer-index GeoDataFrames (#422)
    • Add cx indexer to GeoDataFrame (#482)
    • GeoDataFrame.from_features now also accepts a Feature Collection (#225, #507)
    • Use index label instead of integer id in output of iterfeatures and to_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.filter results when bbox is not None (#372)
    • Fix dissolve to retain CRS (#389)
    • Fix cx behavior when using index of 0 (#478)
    • Fix display of lower bin in legend label of choropleth plots using a PySAL scheme (#450)
    Source code(tar.gz)
    Source code(zip)
    geopandas-0.3.0.tar.gz(870.79 KB)
Blender addons to make the bridge between Blender and geographic data

Blender GIS Blender minimal version : 2.8 Mac users warning : currently the addon does not work on Mac with Blender 2.80 to 2.82. Please do not report

null 5.6k Sep 29, 2022
Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

django-rest-framework-gis Geographic add-ons for Django Rest Framework - Mailing List. Install last stable version from pypi pip install djangorestfra

OpenWISP 960 Sep 23, 2022
Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

Geographic add-ons for Django REST Framework. Maintained by the OpenWISP Project.

OpenWISP 960 Sep 23, 2022
Mmdb-server - An open source fast API server to lookup IP addresses for their geographic location

mmdb-server mmdb-server is an open source fast API server to lookup IP addresses

Alexandre Dulaunoy 50 Sep 16, 2022
Tools for the extraction of OpenStreetMap street network data

OSMnet Tools for the extraction of OpenStreetMap (OSM) street network data. Intended to be used in tandem with Pandana and UrbanAccess libraries to ex

Urban Data Science Toolkit 47 Sep 21, 2022
Digital Earth Australia notebooks and tools repository

Repository for Digital Earth Australia Jupyter Notebooks: tools and workflows for geospatial analysis with Open Data Cube and xarray

Geoscience Australia 322 Sep 16, 2022
Record railway train route profile with GNSS tools

Train route profile recording with GNSS technology based on ARDUINO platform Project target Develop GNSS recording tools based on the ARDUINO platform

tomcom 1 Jan 1, 2022
Open Data Cube analyses continental scale Earth Observation data through time

Open Data Cube Core Overview The Open Data Cube Core provides an integrated gridded data analysis environment for decades of analysis ready earth obse

Open Data Cube 398 Sep 25, 2022
A public data repository for datasets created from TransLink GTFS data.

TransLink Spatial Data What: TransLink is the statutory public transit authority for the Metro Vancouver region. This GitHub repository is a collectio

Henry Tang 3 Jan 14, 2022
Using Global fishing watch's data to build a machine learning model that can identify illegal fishing and poaching activities through satellite and geo-location data.

Using Global fishing watch's data to build a machine learning model that can identify illegal fishing and poaching activities through satellite and geo-location data.

Ayush Mishra 3 May 6, 2022
Python Data. Leaflet.js Maps.

folium Python Data, Leaflet.js Maps folium builds on the data wrangling strengths of the Python ecosystem and the mapping strengths of the Leaflet.js

null 5.9k Sep 29, 2022
A package built to support working with spatial data using open source python

EarthPy EarthPy makes it easier to plot and manipulate spatial data in Python. Why EarthPy? Python is a generic programming language designed to suppo

Earth Lab 390 Sep 10, 2022
Python package for earth-observing satellite data processing

Satpy The Satpy package is a python library for reading and manipulating meteorological remote sensing data and writing it to various image and data f

PyTroll 853 Sep 23, 2022
Use Mapbox GL JS to visualize data in a Python Jupyter notebook

Location Data Visualization library for Jupyter Notebooks Library documentation at

Mapbox 618 Sep 9, 2022
python toolbox for visualizing geographical data and making maps

geoplotlib is a python toolbox for visualizing geographical data and making maps data = read_csv('data/bus.csv')

Andrea Cuttone 974 Sep 20, 2022
OSMnx: Python for street networks. Retrieve, model, analyze, and visualize street networks and other spatial data from OpenStreetMap.

OSMnx OSMnx is a Python package that lets you download geospatial data from OpenStreetMap and model, project, visualize, and analyze real-world street

Geoff Boeing 3.8k Sep 26, 2022
A toolbox for processing earth observation data with Python.

eo-box eobox is a Python package with a small collection of tools for working with Remote Sensing / Earth Observation data. Package Overview So far, t

null 13 Jan 6, 2022
A Python package for delineating nested surface depressions from digital elevation data.

Welcome to the lidar package lidar is Python package for delineating the nested hierarchy of surface depressions in digital elevation models (DEMs). I

Qiusheng Wu 151 Sep 28, 2022
prettymaps - A minimal Python library to draw customized maps from OpenStreetMap data.

A small set of Python functions to draw pretty maps from OpenStreetMap data. Based on osmnx, matplotlib and shapely libraries.

Marcelo de Oliveira Rosa Prates 8.8k Sep 21, 2022