Reading and Writing Files

Reading Spatial Data

geopandas can read almost any vector-based spatial data format including ESRI shapefile, GeoJSON files and more using the command:


which returns a GeoDataFrame object. (This is possible because geopandas makes use of the great fiona library, which in turn makes use of a massive open-source program called GDAL/OGR designed to facilitate spatial data transformations).

Any arguments passed to geopandas.read_file() after the file name will be passed directly to, which does the actual data importation. In general, geopandas.read_file() is pretty smart and should do what you want without extra arguments, but for more help, type:

import fiona; help(

Among other things, one can explicitly set the driver (shapefile, GeoJSON) with the driver keyword, or pick a single layer from a multi-layered file with the layer keyword:

countries_gdf = geopandas.read_file("package.gpkg", layer='countries')

Where supported in fiona, geopandas can also load resources directly from a web URL, for example for GeoJSON files from

url = ""
df = geopandas.read_file(url)

You can also load ZIP files that contain your data:

zipfile = "zip:///Users/name/Downloads/"
states = geopandas.read_file(zipfile)

If the dataset is in a folder in the ZIP file, you have to append its name:

zipfile = "zip:///Users/name/Downloads/!data"

If there are multiple datasets in a folder in the ZIP file, you also have to specify the filename:

zipfile = "zip:///Users/name/Downloads/!data/gadm36_AFG_1.shp"

geopandas can also get data from a PostGIS database using the geopandas.read_postgis() command.

Reading subsets of the data

Since geopandas is powered by Fiona, which is powered by GDAL, you can take advantage of pre-filtering when loading in larger datasets. This can be done geospatially with a geometry or bounding box. You can also filter rows loaded with a slice. Read more at geopandas.read_file().

Geometry Filter

New in version 0.7.0.

The geometry filter only loads data that intersects with the geometry.

gdf_mask = geopandas.read_file(
gdf = geopandas.read_file(

Bounding Box Filter

New in version 0.1.0.

The bounding box filter only loads data that intersects with the bounding box.

bbox = (
    1031051.7879884212, 224272.49231459625, 1047224.3104931959, 244317.30894023244
gdf = geopandas.read_file(

Row Filter

New in version 0.7.0.

Filter the rows loaded in from the file using an integer (for the first n rows) or a slice object.

gdf = geopandas.read_file(
gdf = geopandas.read_file(
    rows=slice(10, 20),

Writing Spatial Data

GeoDataFrames can be exported to many different standard formats using the geopandas.GeoDataFrame.to_file() method. For a full list of supported formats, type import fiona; fiona.supported_drivers.

Writing to Shapefile:


Writing to GeoJSON:

countries_gdf.to_file("countries.geojson", driver='GeoJSON')

Writing to GeoPackage:

countries_gdf.to_file("package.gpkg", layer='countries', driver="GPKG")
cities_gdf.to_file("package.gpkg", layer='cities', driver="GPKG")